diff --git a/designer/src/com/fr/design/actions/edit/DeleteAction.java b/designer/src/com/fr/design/actions/edit/DeleteAction.java index 01e07a75bc..0fe1f7817c 100644 --- a/designer/src/com/fr/design/actions/edit/DeleteAction.java +++ b/designer/src/com/fr/design/actions/edit/DeleteAction.java @@ -8,6 +8,9 @@ import com.fr.design.actions.ElementCaseAction; import com.fr.general.Inter; import com.fr.design.mainframe.ElementCasePane; +import javax.swing.*; +import java.awt.event.KeyEvent; + /** * Delete Row, Column or FloatElement.. */ @@ -18,10 +21,11 @@ public class DeleteAction extends ElementCaseAction { public DeleteAction(ElementCasePane t) { super(t); - this.setName(Inter.getLocText("M_Edit-Delete") + "..."); + this.setName(Inter.getLocText("M_Edit-Delete")); this.setMnemonic('D'); //Richie:删除菜单图标 this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_report/delete.png")); + this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0)); } @Override diff --git a/designer/src/com/fr/design/actions/edit/order/BringFloatElementForwardAction.java b/designer/src/com/fr/design/actions/edit/order/BringFloatElementForwardAction.java index c1ffd413ab..2259388d45 100644 --- a/designer/src/com/fr/design/actions/edit/order/BringFloatElementForwardAction.java +++ b/designer/src/com/fr/design/actions/edit/order/BringFloatElementForwardAction.java @@ -9,6 +9,11 @@ import com.fr.design.mainframe.ElementCasePane; import com.fr.report.cell.FloatElement; import com.fr.report.elementcase.ElementCase; +import javax.swing.*; +import java.awt.event.KeyEvent; + +import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; + /** * Bring FloatElement forward. */ @@ -21,8 +26,9 @@ public class BringFloatElementForwardAction extends AbstractFloatElementOrderAct this.setName(Inter.getLocText("M_Edit-Bring_Forward")); this.setMnemonic('F'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/bringForward.png")); - } + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/up.png")); + this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_CLOSE_BRACKET, DEFAULT_MODIFIER)); + } @Override public void orderWithSelectedFloatElement(ElementCase report, diff --git a/designer/src/com/fr/design/actions/edit/order/BringFloatElementToFrontAction.java b/designer/src/com/fr/design/actions/edit/order/BringFloatElementToFrontAction.java index 880abaeecc..b50d683060 100644 --- a/designer/src/com/fr/design/actions/edit/order/BringFloatElementToFrontAction.java +++ b/designer/src/com/fr/design/actions/edit/order/BringFloatElementToFrontAction.java @@ -9,6 +9,12 @@ import com.fr.design.mainframe.ElementCasePane; import com.fr.report.cell.FloatElement; import com.fr.report.elementcase.ElementCase; +import javax.swing.*; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; + +import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; + /** * Bring FloatElement to front. */ @@ -20,9 +26,10 @@ public class BringFloatElementToFrontAction extends AbstractFloatElementOrderAct super(t); this.setName(Inter.getLocText("M_Edit-Bring_to_Front")); - this.setMnemonic('t'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/bringToFront.png")); - } + this.setMnemonic('T'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/to_top.png")); + this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_CLOSE_BRACKET, DEFAULT_MODIFIER + InputEvent.ALT_MASK)); + } @Override public void orderWithSelectedFloatElement(ElementCase report, diff --git a/designer/src/com/fr/design/actions/edit/order/SendFloatElementBackwardAction.java b/designer/src/com/fr/design/actions/edit/order/SendFloatElementBackwardAction.java index 166a2f79b6..e1eedc3550 100644 --- a/designer/src/com/fr/design/actions/edit/order/SendFloatElementBackwardAction.java +++ b/designer/src/com/fr/design/actions/edit/order/SendFloatElementBackwardAction.java @@ -9,6 +9,11 @@ import com.fr.design.mainframe.ElementCasePane; import com.fr.report.cell.FloatElement; import com.fr.report.elementcase.ElementCase; +import javax.swing.*; +import java.awt.event.KeyEvent; + +import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; + /** * Send FloatElement backward. */ @@ -21,8 +26,9 @@ public class SendFloatElementBackwardAction extends AbstractFloatElementOrderAct this.setName(Inter.getLocText("M_Edit-Send_Backward")); this.setMnemonic('B'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/sendBackward.png")); - } + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/down.png")); + this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_OPEN_BRACKET, DEFAULT_MODIFIER)); + } @Override public void orderWithSelectedFloatElement(ElementCase report, diff --git a/designer/src/com/fr/design/actions/edit/order/SendFloatElementToBackAction.java b/designer/src/com/fr/design/actions/edit/order/SendFloatElementToBackAction.java index a97ea3fb92..ee8fa31d4e 100644 --- a/designer/src/com/fr/design/actions/edit/order/SendFloatElementToBackAction.java +++ b/designer/src/com/fr/design/actions/edit/order/SendFloatElementToBackAction.java @@ -9,6 +9,12 @@ import com.fr.design.mainframe.ElementCasePane; import com.fr.report.cell.FloatElement; import com.fr.report.elementcase.ElementCase; +import javax.swing.*; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; + +import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; + /** * Send FloatElement to back. */ @@ -21,8 +27,9 @@ public class SendFloatElementToBackAction extends AbstractFloatElementOrderActio this.setName(Inter.getLocText("M_Edit-Send_to_Back")); this.setMnemonic('K'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/sendToBack.png")); - } + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/to_bottom.png")); + this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_OPEN_BRACKET, DEFAULT_MODIFIER + InputEvent.ALT_MASK)); + } @Override public void orderWithSelectedFloatElement(ElementCase report, diff --git a/designer/src/com/fr/design/actions/utils/DeprecatedActionManager.java b/designer/src/com/fr/design/actions/utils/DeprecatedActionManager.java index 89bbd82bfb..da9054afc6 100644 --- a/designer/src/com/fr/design/actions/utils/DeprecatedActionManager.java +++ b/designer/src/com/fr/design/actions/utils/DeprecatedActionManager.java @@ -49,7 +49,7 @@ public class DeprecatedActionManager { */ public static UIMenu getClearMenu(ElementCasePane ePane) { UIMenu clearMenu = new UIMenu(Inter.getLocText("M_Edit-Clear")); - clearMenu.setIcon(UIConstants.BLACK_ICON); + clearMenu.setIcon(BaseUtils.readIcon("/com/fr/design/images/control/clear.png")); clearMenu.setMnemonic('a'); ClearAction ReportComponentAction = new ClearAllAction(ePane); @@ -68,23 +68,6 @@ public class DeprecatedActionManager { return clearMenu; } - /** - * Order menu - */ - public static JMenu getOrderMenu(ElementCasePane ePane) { - JMenu orderMenu = new JMenu(Inter.getLocText("M_Edit-Order")); - orderMenu.setIcon(UIConstants.BLACK_ICON); - orderMenu.setMnemonic('O'); - orderMenu.setBackground(UIConstants.NORMAL_BACKGROUND); - - orderMenu.add(new BringFloatElementToFrontAction(ePane).createMenuItem()); - orderMenu.add(new SendFloatElementToBackAction(ePane).createMenuItem()); - orderMenu.add(new BringFloatElementForwardAction(ePane).createMenuItem()); - orderMenu.add(new SendFloatElementBackwardAction(ePane).createMenuItem()); - - return orderMenu; - } - /** * Cell Style. */ diff --git a/designer/src/com/fr/design/mainframe/ElementCasePaneDelegate.java b/designer/src/com/fr/design/mainframe/ElementCasePaneDelegate.java index 8d25463ab8..cc57b7a852 100644 --- a/designer/src/com/fr/design/mainframe/ElementCasePaneDelegate.java +++ b/designer/src/com/fr/design/mainframe/ElementCasePaneDelegate.java @@ -75,9 +75,7 @@ public class ElementCasePaneDelegate extends ElementCasePane { EastRegionContainerPane.getInstance().replaceConfiguredRolesPane(RolesAlreadyEditedPane.getInstance()); return; } - if (DesignerContext.getDesignerFrame().getSelectedJTemplate() != null) { - CellWidgetPropertyPane.getInstance().populate(ElementCasePaneDelegate.this); - } + CellWidgetPropertyPane.getInstance().populate(ElementCasePaneDelegate.this); CellElementPropertyPane.getInstance().populate(ElementCasePaneDelegate.this); QuickEditorRegion.getInstance().populate(getCurrentEditor()); JTemplate editingTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); diff --git a/designer/src/com/fr/design/mainframe/alphafine/AlphaFineConstants.java b/designer/src/com/fr/design/mainframe/alphafine/AlphaFineConstants.java index 67db552a5e..18ae549110 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/AlphaFineConstants.java +++ b/designer/src/com/fr/design/mainframe/alphafine/AlphaFineConstants.java @@ -70,9 +70,10 @@ public class AlphaFineConstants { public static final String PLUGIN_SEARCH_URL = SiteCenter.getInstance().acquireUrlByKind("plugin.searchAPI"); - public static final String PLUGIN_URL = SiteCenter.getInstance().acquireUrlByKind("af.plugin"); + public static final String PLUGIN_URL = SiteCenter.getInstance().acquireUrlByKind("af.pluginInfo"); + + public static final String REUSE_URL = SiteCenter.getInstance().acquireUrlByKind("af.reuseInfo"); - public static final String REUSE_URL = SiteCenter.getInstance().acquireUrlByKind("af.reuse"); public static final String DOCUMENT_DOC_URL = SiteCenter.getInstance().acquireUrlByKind("af.doc_view"); @@ -87,4 +88,6 @@ public class AlphaFineConstants { public static final String SEARCH_API = SiteCenter.getInstance().acquireUrlByKind("af.cloud_search"); + + } diff --git a/designer/src/com/fr/design/mainframe/alphafine/AlphaFineHelper.java b/designer/src/com/fr/design/mainframe/alphafine/AlphaFineHelper.java index d09a5749a6..d17c3b5012 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/AlphaFineHelper.java +++ b/designer/src/com/fr/design/mainframe/alphafine/AlphaFineHelper.java @@ -7,8 +7,8 @@ import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; import com.fr.design.mainframe.alphafine.cell.model.NoResultModel; import com.fr.design.mainframe.alphafine.component.AlphaFineDialog; import com.fr.design.mainframe.alphafine.model.SearchResult; -import com.fr.design.mainframe.alphafine.search.manager.RecentSearchManager; -import com.fr.design.mainframe.alphafine.search.manager.RecommendSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.RecentSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.RecommendSearchManager; import com.fr.general.Inter; import com.fr.general.ProcessCanceledException; import com.fr.stable.StringUtils; @@ -89,8 +89,8 @@ public class AlphaFineHelper { } public static List getFilterResult() { - List recentList = RecentSearchManager.getRecentSearchManger().getRecentModelList(); - List recommendList = RecommendSearchManager.getRecommendSearchManager().getRecommendModelList(); + List recentList = RecentSearchManager.getInstance().getRecentModelList(); + List recommendList = RecommendSearchManager.getInstance().getRecommendModelList(); SearchResult filterResult = new SearchResult(); filterResult.addAll(recentList); filterResult.addAll(recommendList); diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/CellModelHelper.java b/designer/src/com/fr/design/mainframe/alphafine/cell/CellModelHelper.java index ae86cab4d4..d838f50a9d 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/cell/CellModelHelper.java +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/CellModelHelper.java @@ -2,10 +2,10 @@ package com.fr.design.mainframe.alphafine.cell; import com.fr.design.mainframe.alphafine.CellType; import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; -import com.fr.design.mainframe.alphafine.search.manager.ActionSearchManager; -import com.fr.design.mainframe.alphafine.search.manager.DocumentSearchManager; -import com.fr.design.mainframe.alphafine.search.manager.FileSearchManager; -import com.fr.design.mainframe.alphafine.search.manager.PluginSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.ActionSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.DocumentSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.FileSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.PluginSearchManager; import com.fr.json.JSONObject; /** diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/model/PluginModel.java b/designer/src/com/fr/design/mainframe/alphafine/cell/model/PluginModel.java index 44f1bae056..44c6ae6608 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/cell/model/PluginModel.java +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/model/PluginModel.java @@ -1,53 +1,48 @@ package com.fr.design.mainframe.alphafine.cell.model; +import com.fr.base.FRContext; +import com.fr.design.extra.WebViewDlgHelper; import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.CellType; +import com.fr.env.RemoteEnv; import com.fr.general.FRLogger; import com.fr.json.JSONException; import com.fr.json.JSONObject; - -import java.awt.*; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; +import com.fr.stable.StringUtils; /** * Created by XiaXiang on 2017/4/20. */ public class PluginModel extends AlphaCellModel { - private static final String PLUGIN_INFORMATION_URL = "http://shop.finereport.com/ShopServer?pg=plugin&pid="; - private static final String REUSE_INFORMATION_URL = "http://shop.finereport.com/reuses/"; - private String pluginUrl; private String imageUrl; private String version; private String jartime; private String link; private String informationUrl; - private int pluginId; + private String pluginId; + private int id; private int price; - public PluginModel(String name, String content, String imageUrl, String version, String jartime, String link, CellType type, int price, int pluginId, int serchCount) { - this(name, content, imageUrl, version, jartime, link, type, price, pluginId); + public PluginModel(String name, String content, String imageUrl, String version, String jartime, String link, String pluginId, CellType type, int price, int id, int serchCount) { + this(name, content, imageUrl, version, jartime, link, pluginId, type, price, id); setSearchCount(serchCount); } - public PluginModel(String name, String content, String imageUrl, String version, String jartime, String link, CellType type, int price, int pluginId) { + public PluginModel(String name, String content, String imageUrl, String version, String jartime, String link, String pluginId, CellType type, int price, int id) { super(name, content); this.link = link; setType(type); - this.pluginId = pluginId; - if (getType() == CellType.PLUGIN) { - this.pluginUrl = AlphaFineConstants.PLUGIN_URL + pluginId; - this.informationUrl = PLUGIN_INFORMATION_URL + this.pluginId; - } else { - this.pluginUrl = AlphaFineConstants.REUSE_URL + pluginId; - this.informationUrl = REUSE_INFORMATION_URL + this.pluginId; - - } + this.id = id; this.imageUrl = imageUrl; this.jartime = jartime; this.version = version; this.price = price; + this.pluginId = pluginId; + if (getType() == CellType.PLUGIN) { + this.informationUrl = AlphaFineConstants.PLUGIN_URL + id; + } else { + this.informationUrl = AlphaFineConstants.REUSE_URL + id; + } } public String getImageUrl() { @@ -58,14 +53,6 @@ public class PluginModel extends AlphaCellModel { this.imageUrl = imageUrl; } - public String getPluginUrl() { - return pluginUrl; - } - - public void setPluginUrl(String pluginUrl) { - this.pluginUrl = pluginUrl; - } - public String getVersion() { return version; } @@ -103,7 +90,7 @@ public class PluginModel extends AlphaCellModel { JSONObject object = JSONObject.create(); try { JSONObject modelObject = JSONObject.create(); - modelObject.put("name", getName()).put("description", getContent()).put("pic", getImageUrl()).put("version", getVersion()).put("jartime", getJartime()).put("type", getType().getTypeValue()).put("price", getPrice()).put("id", getPluginId()).put("link", getLink()).put("searchCount", getSearchCount()); + modelObject.put("name", getName()).put("description", getContent()).put("pic", getImageUrl()).put("version", getVersion()).put("jartime", getJartime()).put("id", getId()).put("pluginid", getPluginId()).put("type", getType().getTypeValue()).put("price", getPrice()).put("link", getLink()).put("searchCount", getSearchCount()); object.put("result", modelObject).put("cellType", getType().getTypeValue()); } catch (JSONException e) { FRLogger.getLogger().error(e.getMessage()); @@ -119,16 +106,12 @@ public class PluginModel extends AlphaCellModel { @Override public void doAction() { - try { - Desktop.getDesktop().browse(new URI(getPluginUrl())); - } catch (IOException e) { - FRLogger.getLogger().error(e.getMessage()); - } catch (URISyntaxException e) { - FRLogger.getLogger().error(e.getMessage()); + if (StringUtils.isBlank(this.pluginId) || FRContext.getCurrentEnv() instanceof RemoteEnv) { + return; } + WebViewDlgHelper.showPluginInStore(getName(), "[" + ModelToJson().optString("result") + "]"); } - @Override public boolean equals(Object o) { if (this == o) { @@ -139,21 +122,21 @@ public class PluginModel extends AlphaCellModel { } PluginModel that = (PluginModel) o; - return pluginUrl != null ? pluginUrl.equals(that.pluginUrl) : that.pluginUrl == null; + return pluginId != null ? pluginId.equals(that.pluginId) : that.pluginId == null; } @Override public int hashCode() { - return pluginUrl != null ? pluginUrl.hashCode() : 0; + return pluginId != null ? pluginId.hashCode() : 0; } - public int getPluginId() { - return pluginId; + public int getId() { + return id; } - public void setPluginId(int pluginId) { - this.pluginId = pluginId; + public void setId(int id) { + this.id = id; } public String getInformationUrl() { @@ -163,4 +146,12 @@ public class PluginModel extends AlphaCellModel { public void setInformationUrl(String informationUrl) { this.informationUrl = informationUrl; } + + public String getPluginId() { + return pluginId; + } + + public void setPluginId(String pluginId) { + this.pluginId = pluginId; + } } diff --git a/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java index 995d2d3366..fe7b66aeca 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java +++ b/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -23,12 +23,12 @@ import com.fr.design.mainframe.alphafine.preview.DocumentPreviewPane; import com.fr.design.mainframe.alphafine.preview.FilePreviewPane; import com.fr.design.mainframe.alphafine.preview.NoResultPane; import com.fr.design.mainframe.alphafine.preview.PluginPreviewPane; -import com.fr.design.mainframe.alphafine.search.manager.ActionSearchManager; -import com.fr.design.mainframe.alphafine.search.manager.DocumentSearchManager; -import com.fr.design.mainframe.alphafine.search.manager.FileSearchManager; -import com.fr.design.mainframe.alphafine.search.manager.PluginSearchManager; -import com.fr.design.mainframe.alphafine.search.manager.RecentSearchManager; -import com.fr.design.mainframe.alphafine.search.manager.RecommendSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.ActionSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.DocumentSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.FileSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.PluginSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.RecentSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.RecommendSearchManager; import com.fr.form.main.Form; import com.fr.form.main.FormIO; import com.fr.general.ComparatorUtils; @@ -445,47 +445,35 @@ public class AlphaFineDialog extends UIDialog { } private void buildDocumentList(final String searchText) { - SearchResult documentModelList = DocumentSearchManager.getDocumentSearchManager().getLessSearchResult(searchText); - for (AlphaCellModel object : documentModelList) { - searchListModel.addElement(object); - } + addSearchResult(DocumentSearchManager.getInstance().getLessSearchResult(searchText)); } private void buildFileList(final String searchText) { - SearchResult fileModelList = FileSearchManager.getFileSearchManager().getLessSearchResult(searchText); - for (AlphaCellModel object : fileModelList) { - AlphaFineHelper.checkCancel(); - searchListModel.addElement(object); - } + addSearchResult(FileSearchManager.getInstance().getLessSearchResult(searchText)); } private void buildActionList(final String searchText) { - SearchResult actionModelList = ActionSearchManager.getActionSearchManager().getLessSearchResult(searchText); - for (AlphaCellModel object : actionModelList) { - searchListModel.addElement(object); - } + addSearchResult(ActionSearchManager.getInstance().getLessSearchResult(searchText)); } private void buildPluginList(final String searchText) { - SearchResult pluginModelList = PluginSearchManager.getPluginSearchManager().getLessSearchResult(searchText); - for (AlphaCellModel object : pluginModelList) { - searchListModel.addElement(object); - } + addSearchResult(PluginSearchManager.getInstance().getLessSearchResult(searchText)); } private void buildRecommendList(final String searchText) { - SearchResult recommendModelList = RecommendSearchManager.getRecommendSearchManager().getLessSearchResult(searchText); - for (AlphaCellModel object : recommendModelList) { - searchListModel.addElement(object); - } + addSearchResult(RecommendSearchManager.getInstance().getLessSearchResult(searchText)); } private void buildRecentList(final String searchText) { - SearchResult recentModelList = RecentSearchManager.getRecentSearchManger().getLessSearchResult(searchText); - for (AlphaCellModel object : recentModelList) { + addSearchResult(RecentSearchManager.getInstance().getLessSearchResult(searchText)); + + } + + private synchronized void addSearchResult(SearchResult searchResult) { + for (AlphaCellModel object : searchResult) { + AlphaFineHelper.checkCancel(); searchListModel.addElement(object); } - } /** @@ -758,7 +746,7 @@ public class AlphaFineDialog extends UIDialog { * @param cellModel */ private void saveLocalHistory(AlphaCellModel cellModel) { - RecentSearchManager recentSearchManager = RecentSearchManager.getRecentSearchManger(); + RecentSearchManager recentSearchManager = RecentSearchManager.getInstance(); recentSearchManager.addRecentModel(storeText, cellModel); recentSearchManager.saveXMLFile(); sendDataToServer(storeText, cellModel); @@ -824,16 +812,16 @@ public class AlphaFineDialog extends UIDialog { SearchResult moreResult; switch (selectedValue.getContentType()) { case PLUGIN: - moreResult = PluginSearchManager.getPluginSearchManager().getMoreSearchResult(); + moreResult = PluginSearchManager.getInstance().getMoreSearchResult(searchTextField.getText()); break; case DOCUMENT: - moreResult = DocumentSearchManager.getDocumentSearchManager().getMoreSearchResult(); + moreResult = DocumentSearchManager.getInstance().getMoreSearchResult(searchTextField.getText()); break; case FILE: - moreResult = FileSearchManager.getFileSearchManager().getMoreSearchResult(); + moreResult = FileSearchManager.getInstance().getMoreSearchResult(searchTextField.getText()); break; case ACTION: - moreResult = ActionSearchManager.getActionSearchManager().getMoreSearchResult(); + moreResult = ActionSearchManager.getInstance().getMoreSearchResult(searchTextField.getText()); break; default: moreResult = new SearchResult(); diff --git a/designer/src/com/fr/design/mainframe/alphafine/search/manager/AlphaFineSearchProcessor.java b/designer/src/com/fr/design/mainframe/alphafine/search/manager/fun/AlphaFineSearchProvider.java similarity index 66% rename from designer/src/com/fr/design/mainframe/alphafine/search/manager/AlphaFineSearchProcessor.java rename to designer/src/com/fr/design/mainframe/alphafine/search/manager/fun/AlphaFineSearchProvider.java index df5b36c09f..9d29433a23 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/search/manager/AlphaFineSearchProcessor.java +++ b/designer/src/com/fr/design/mainframe/alphafine/search/manager/fun/AlphaFineSearchProvider.java @@ -1,11 +1,11 @@ -package com.fr.design.mainframe.alphafine.search.manager; +package com.fr.design.mainframe.alphafine.search.manager.fun; import com.fr.design.mainframe.alphafine.model.SearchResult; /** * Created by XiaXiang on 2017/3/27. */ -public interface AlphaFineSearchProcessor { +public interface AlphaFineSearchProvider { /** * 获取默认显示条数 * @@ -19,5 +19,5 @@ public interface AlphaFineSearchProcessor { * * @return */ - SearchResult getMoreSearchResult(); + SearchResult getMoreSearchResult(String searchText); } diff --git a/designer/src/com/fr/design/mainframe/alphafine/search/manager/ActionSearchManager.java b/designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java similarity index 90% rename from designer/src/com/fr/design/mainframe/alphafine/search/manager/ActionSearchManager.java rename to designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java index 185938ab81..0956fbc185 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/search/manager/ActionSearchManager.java +++ b/designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java @@ -1,4 +1,4 @@ -package com.fr.design.mainframe.alphafine.search.manager; +package com.fr.design.mainframe.alphafine.search.manager.impl; import com.fr.design.DesignerEnvManager; import com.fr.design.mainframe.alphafine.AlphaFineConstants; @@ -8,6 +8,7 @@ import com.fr.design.mainframe.alphafine.cell.model.ActionModel; import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.model.SearchResult; +import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; import com.fr.design.mainframe.toolbar.UpdateActionManager; import com.fr.design.mainframe.toolbar.UpdateActionModel; import com.fr.general.ComparatorUtils; @@ -20,13 +21,13 @@ import java.util.List; /** * Created by XiaXiang on 2017/3/27. */ -public class ActionSearchManager implements AlphaFineSearchProcessor { +public class ActionSearchManager implements AlphaFineSearchProvider { private static ActionSearchManager actionSearchManager = null; private SearchResult filterModelList; private SearchResult lessModelList; private SearchResult moreModelList; - public synchronized static ActionSearchManager getActionSearchManager() { + public synchronized static ActionSearchManager getInstance() { if (actionSearchManager == null) { actionSearchManager = new ActionSearchManager(); } @@ -63,6 +64,7 @@ public class ActionSearchManager implements AlphaFineSearchProcessor { if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainAction()) { List updateActions = UpdateActionManager.getUpdateActionManager().getUpdateActions(); for (UpdateActionModel updateActionModel : updateActions) { + AlphaFineHelper.checkCancel(); if (StringUtils.isNotBlank(updateActionModel.getSearchKey())) { if (updateActionModel.getSearchKey().contains(searchText) && updateActionModel.getAction().isEnabled()) { filterModelList.add(new ActionModel(updateActionModel.getActionName(), updateActionModel.getParentName(), updateActionModel.getAction())); @@ -91,7 +93,7 @@ public class ActionSearchManager implements AlphaFineSearchProcessor { } @Override - public SearchResult getMoreSearchResult() { + public SearchResult getMoreSearchResult(String searchText) { return moreModelList; } } \ No newline at end of file diff --git a/designer/src/com/fr/design/mainframe/alphafine/search/manager/DocumentSearchManager.java b/designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java similarity index 93% rename from designer/src/com/fr/design/mainframe/alphafine/search/manager/DocumentSearchManager.java rename to designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java index 11df762762..d4611256c6 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/search/manager/DocumentSearchManager.java +++ b/designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java @@ -1,4 +1,4 @@ -package com.fr.design.mainframe.alphafine.search.manager; +package com.fr.design.mainframe.alphafine.search.manager.impl; import com.fr.design.DesignerEnvManager; import com.fr.design.mainframe.alphafine.AlphaFineConstants; @@ -7,6 +7,7 @@ import com.fr.design.mainframe.alphafine.CellType; import com.fr.design.mainframe.alphafine.cell.model.DocumentModel; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.model.SearchResult; +import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; import com.fr.general.FRLogger; import com.fr.general.Inter; import com.fr.general.http.HttpClient; @@ -18,12 +19,12 @@ import com.fr.stable.StringUtils; /** * Created by XiaXiang on 2017/3/27. */ -public class DocumentSearchManager implements AlphaFineSearchProcessor { +public class DocumentSearchManager implements AlphaFineSearchProvider { private static DocumentSearchManager documentSearchManager = null; private SearchResult lessModelList; private SearchResult moreModelList; - public synchronized static DocumentSearchManager getDocumentSearchManager() { + public synchronized static DocumentSearchManager getInstance() { if (documentSearchManager == null) { documentSearchManager = new DocumentSearchManager(); @@ -106,7 +107,7 @@ public class DocumentSearchManager implements AlphaFineSearchProcessor { } @Override - public SearchResult getMoreSearchResult() { + public SearchResult getMoreSearchResult(String searchText) { return moreModelList; } diff --git a/designer/src/com/fr/design/mainframe/alphafine/search/manager/FileSearchManager.java b/designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java similarity index 76% rename from designer/src/com/fr/design/mainframe/alphafine/search/manager/FileSearchManager.java rename to designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java index 8704e17767..22f4424c9f 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/search/manager/FileSearchManager.java +++ b/designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java @@ -1,4 +1,4 @@ -package com.fr.design.mainframe.alphafine.search.manager; +package com.fr.design.mainframe.alphafine.search.manager.impl; import com.fr.base.Env; import com.fr.base.FRContext; @@ -6,10 +6,10 @@ import com.fr.design.DesignerEnvManager; import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.CellType; -import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; import com.fr.design.mainframe.alphafine.cell.model.FileModel; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.model.SearchResult; +import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; import com.fr.file.filetree.FileNode; import com.fr.general.ComparatorUtils; import com.fr.general.FRLogger; @@ -31,7 +31,7 @@ import java.util.List; /** * Created by XiaXiang on 2017/3/27. */ -public class FileSearchManager implements AlphaFineSearchProcessor { +public class FileSearchManager implements AlphaFineSearchProvider { private static final int MARK_LENGTH = 6; private static final String DS_NAME = "dsname=\""; private static final String FRM_PREFIX = "k:frm "; @@ -39,13 +39,14 @@ public class FileSearchManager implements AlphaFineSearchProcessor { private static FileSearchManager fileSearchManager = null; private SearchResult filterModelList; private SearchResult lessModelList; - private SearchResult moreModelList; private List fileNodes = null; + //停止搜索 + private boolean stopSearch = false; //隐藏的搜索功能,可根据特殊的字符标记判断搜索分类 private boolean isContainCpt = true; private boolean isContainFrm = true; - public synchronized static FileSearchManager getFileSearchManager() { + public synchronized static FileSearchManager getInstance() { init(); return fileSearchManager; } @@ -72,52 +73,66 @@ public class FileSearchManager implements AlphaFineSearchProcessor { public synchronized SearchResult getLessSearchResult(String searchText) { this.filterModelList = new SearchResult(); this.lessModelList = new SearchResult(); - this.moreModelList = new SearchResult(); - if (searchText.startsWith(FRM_PREFIX)) { - isContainCpt = false; - searchText = searchText.substring(MARK_LENGTH, searchText.length()); - } else if (searchText.startsWith(CPT_PREFIX)) { - isContainFrm = false; - searchText = searchText.substring(MARK_LENGTH, searchText.length()); - } + searchText = dealWithSearchText(searchText); if (StringUtils.isBlank(searchText) || ComparatorUtils.equals(searchText, DS_NAME)) { lessModelList.add(new MoreModel(Inter.getLocText("FR-Designer_Templates"))); return lessModelList; } - Env env = FRContext.getCurrentEnv(); fileNodes = new ArrayList<>(); fileNodes = listTpl(env, ProjectConstants.REPORTLETS_NAME, true); AlphaFineHelper.checkCancel(); isContainCpt = true; isContainFrm = true; + doSearch(searchText, true, env); + if (stopSearch) { + lessModelList.add(0, new MoreModel(Inter.getLocText("FR-Designer_Templates"), Inter.getLocText("FR-Designer_AlphaFine_ShowAll"), true, CellType.FILE)); + lessModelList.addAll(filterModelList.subList(0, AlphaFineConstants.SHOW_SIZE)); + stopSearch = false; + return this.lessModelList; + } + if (filterModelList.isEmpty()) { + return new SearchResult(); + } + lessModelList.add(0, new MoreModel(Inter.getLocText("FR-Designer_Templates"), Inter.getLocText("FR-Designer_AlphaFine_ShowAll"), false, CellType.FILE)); + lessModelList.addAll(filterModelList); + return lessModelList; + } + + @Override + public SearchResult getMoreSearchResult(String searchText) { + this.filterModelList = new SearchResult(); + this.lessModelList = new SearchResult(); + searchText = dealWithSearchText(searchText); + Env env = FRContext.getCurrentEnv(); + AlphaFineHelper.checkCancel(); + isContainCpt = true; + isContainFrm = true; + doSearch(searchText, false, env); + lessModelList.addAll(filterModelList.subList(AlphaFineConstants.SHOW_SIZE, filterModelList.size())); + return lessModelList; + } + + private void doSearch(String searchText, boolean needMore, Env env) { for (FileNode node : fileNodes) { boolean isAlreadyContain = false; String fileEnvPath = node.getEnvPath(); String filePath = StableUtils.pathJoin(env.getPath(), fileEnvPath); - isAlreadyContain = searchFile(searchText, node, isAlreadyContain); - searchFileContent(searchText, node, isAlreadyContain, filePath); + isAlreadyContain = searchFile(searchText, node, isAlreadyContain, needMore); + searchFileContent(searchText, node, isAlreadyContain, filePath, needMore); } - SearchResult result = new SearchResult(); - for (AlphaCellModel object : filterModelList) { - if (!AlphaFineHelper.getFilterResult().contains(object)) { - result.add(object); - } + } + private String dealWithSearchText(String searchText) { + if (searchText.startsWith(FRM_PREFIX)) { + isContainCpt = false; + searchText = searchText.substring(MARK_LENGTH, searchText.length()); + } else if (searchText.startsWith(CPT_PREFIX)) { + isContainFrm = false; + searchText = searchText.substring(MARK_LENGTH, searchText.length()); } - if (result.isEmpty()) { - return lessModelList; - } else if (result.size() < AlphaFineConstants.SHOW_SIZE + 1) { - lessModelList.add(0, new MoreModel(Inter.getLocText("FR-Designer_Templates"))); - lessModelList.addAll(result); - } else { - lessModelList.add(0, new MoreModel(Inter.getLocText("FR-Designer_Templates"), Inter.getLocText("FR-Designer_AlphaFine_ShowAll"), true, CellType.FILE)); - lessModelList.addAll(result.subList(0, AlphaFineConstants.SHOW_SIZE)); - moreModelList.addAll(result.subList(AlphaFineConstants.SHOW_SIZE, result.size())); - } - - return this.lessModelList; + return searchText; } /** @@ -128,7 +143,7 @@ public class FileSearchManager implements AlphaFineSearchProcessor { * @param isAlreadyContain * @param filePath */ - private void searchFileContent(String searchText, FileNode node, boolean isAlreadyContain, String filePath) { + private void searchFileContent(String searchText, FileNode node, boolean isAlreadyContain, String filePath, boolean needMore) { if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainFileContent()) { try { @@ -146,7 +161,12 @@ public class FileSearchManager implements AlphaFineSearchProcessor { } if (isFoundInContent && !isAlreadyContain) { FileModel model = new FileModel(node.getName(), node.getEnvPath()); - this.filterModelList.add(model); + if (!AlphaFineHelper.getFilterResult().contains(model)) { + filterModelList.add(model); + } + if (this.filterModelList.size() > AlphaFineConstants.SHOW_SIZE && needMore) { + stopSearch = true; + } } isr.close(); reader.close(); @@ -166,22 +186,22 @@ public class FileSearchManager implements AlphaFineSearchProcessor { * @param isAlreadyContain * @return */ - private boolean searchFile(String searchText, FileNode node, boolean isAlreadyContain) { + private boolean searchFile(String searchText, FileNode node, boolean isAlreadyContain, boolean needMore) { if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainTemplate()) { if (node.getName().toLowerCase().contains(searchText)) { FileModel model = new FileModel(node.getName(), node.getEnvPath()); - this.filterModelList.add(model); + if (!AlphaFineHelper.getFilterResult().contains(model)) { + filterModelList.add(model); + } + if (filterModelList.size() > AlphaFineConstants.SHOW_SIZE && needMore) { + stopSearch = true; + } isAlreadyContain = true; } } return isAlreadyContain; } - @Override - public SearchResult getMoreSearchResult() { - return moreModelList; - } - /** * 获取工作目录下所有符合要求的模板 * diff --git a/designer/src/com/fr/design/mainframe/alphafine/search/manager/PluginSearchManager.java b/designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java similarity index 90% rename from designer/src/com/fr/design/mainframe/alphafine/search/manager/PluginSearchManager.java rename to designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java index 2ea8ba0e84..2978eee40e 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/search/manager/PluginSearchManager.java +++ b/designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java @@ -1,4 +1,4 @@ -package com.fr.design.mainframe.alphafine.search.manager; +package com.fr.design.mainframe.alphafine.search.manager.impl; import com.fr.design.DesignerEnvManager; import com.fr.design.mainframe.alphafine.AlphaFineConstants; @@ -7,6 +7,7 @@ import com.fr.design.mainframe.alphafine.CellType; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.cell.model.PluginModel; import com.fr.design.mainframe.alphafine.model.SearchResult; +import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; import com.fr.general.ComparatorUtils; import com.fr.general.FRLogger; import com.fr.general.Inter; @@ -22,13 +23,13 @@ import java.net.URLEncoder; /** * Created by XiaXiang on 2017/3/27. */ -public class PluginSearchManager implements AlphaFineSearchProcessor { +public class PluginSearchManager implements AlphaFineSearchProvider { private static PluginSearchManager pluginSearchManager = null; private SearchResult lessModelList; private SearchResult moreModelList; - public synchronized static PluginSearchManager getPluginSearchManager() { + public synchronized static PluginSearchManager getInstance() { if (pluginSearchManager == null) { pluginSearchManager = new PluginSearchManager(); } @@ -39,13 +40,14 @@ public class PluginSearchManager implements AlphaFineSearchProcessor { private static PluginModel getPluginModel(JSONObject object, boolean isFromCloud) { String name = object.optString("name"); String content = object.optString("description"); - int pluginId = object.optInt("id"); + String pluginId = object.optString("pluginid"); + int id = object.optInt("id"); int searchCount = object.optInt("searchCount"); String imageUrl = null; try { imageUrl = isFromCloud ? AlphaFineConstants.PLUGIN_IMAGE_URL + URLEncoder.encode(object.optString("pic").toString().substring(AlphaFineConstants.PLUGIN_IMAGE_URL.length()), "utf8") : object.optString("pic"); } catch (UnsupportedEncodingException e) { - FRLogger.getLogger().error(e.getMessage()); + FRLogger.getLogger().error("plugin icon error: " + e.getMessage()); } String version = null; String jartime = null; @@ -59,7 +61,7 @@ public class PluginSearchManager implements AlphaFineSearchProcessor { type = CellType.REUSE; } int price = object.optInt("price"); - return new PluginModel(name, content, imageUrl, version, jartime, link, type, price, pluginId, searchCount); + return new PluginModel(name, content, imageUrl, version, jartime, link, pluginId, type, price, id, searchCount); } /** @@ -137,7 +139,7 @@ public class PluginSearchManager implements AlphaFineSearchProcessor { } @Override - public SearchResult getMoreSearchResult() { + public SearchResult getMoreSearchResult(String searchText) { return this.moreModelList; } } \ No newline at end of file diff --git a/designer/src/com/fr/design/mainframe/alphafine/search/manager/RecentSearchManager.java b/designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java similarity index 89% rename from designer/src/com/fr/design/mainframe/alphafine/search/manager/RecentSearchManager.java rename to designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java index c191c0c11e..e46fafd852 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/search/manager/RecentSearchManager.java +++ b/designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java @@ -1,7 +1,8 @@ -package com.fr.design.mainframe.alphafine.search.manager; +package com.fr.design.mainframe.alphafine.search.manager.impl; import com.fr.base.FRContext; import com.fr.base.Utils; +import com.fr.design.actions.UpdateAction; import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.CellType; @@ -10,6 +11,7 @@ import com.fr.design.mainframe.alphafine.cell.model.ActionModel; import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.model.SearchResult; +import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; import com.fr.design.mainframe.toolbar.UpdateActionManager; import com.fr.file.XMLFileManager; import com.fr.general.ComparatorUtils; @@ -42,9 +44,9 @@ import java.util.Map; /** * Created by XiaXiang on 2017/5/15. */ -public class RecentSearchManager extends XMLFileManager implements AlphaFineSearchProcessor { +public class RecentSearchManager extends XMLFileManager implements AlphaFineSearchProvider { - private static final String XML_TAG = "AlphaFineRecent"; + private static final String XML_TAG = "AFSearch_Recent"; private static final int MAX_SIZE = 3; private static RecentSearchManager recentSearchManager = null; private static File recentFile = null; @@ -52,7 +54,7 @@ public class RecentSearchManager extends XMLFileManager implements AlphaFineSear private SearchResult recentModelList; private Map recentKVModelMap = new HashMap<>(); - public synchronized static RecentSearchManager getRecentSearchManger() { + public synchronized static RecentSearchManager getInstance() { if (recentSearchManager == null) { recentSearchManager = new RecentSearchManager(); try { @@ -140,7 +142,7 @@ public class RecentSearchManager extends XMLFileManager implements AlphaFineSear @Override public String fileName() { - return "AlphaFine_Recent.xml"; + return "AFSearch_Recent.xml"; } @@ -156,8 +158,16 @@ public class RecentSearchManager extends XMLFileManager implements AlphaFineSear return recentFile; } + private File getOldFile() { + return new File(ProductConstants.getEnvHome() + File.separator + "AlphaFine_Recent.xml"); + } + private File getRecentEnvFile() { File envFile = getRecentFile(); + File oldFile = getOldFile(); + if (oldFile.exists()) { + StableUtils.deleteFile(oldFile); + } if (!envFile.exists()) { createRecentFile(envFile); } @@ -172,7 +182,7 @@ public class RecentSearchManager extends XMLFileManager implements AlphaFineSear private void createRecentFile(File envFile) { try { FileWriter fileWriter = new FileWriter(envFile); - StringReader stringReader = new StringReader(""); + StringReader stringReader = new StringReader(""); Utils.copyCharTo(stringReader, fileWriter); stringReader.close(); fileWriter.close(); @@ -233,8 +243,12 @@ public class RecentSearchManager extends XMLFileManager implements AlphaFineSear SearchResult searchResult = new SearchResult(); while (modelIterator.hasNext()) { AlphaCellModel model = modelIterator.next(); - if (model.getType() == CellType.ACTION && !UpdateActionManager.getUpdateActionManager().isEnable(((ActionModel) model).getAction())) { - continue; + if (model.getType() == CellType.ACTION) { + UpdateAction action = UpdateActionManager.getUpdateActionManager().getActionByName(model.getName()); + if (action != null) { + ((ActionModel) model).setAction(action); + searchResult.add(model); + } } else { searchResult.add(model); } @@ -296,7 +310,7 @@ public class RecentSearchManager extends XMLFileManager implements AlphaFineSear } @Override - public SearchResult getMoreSearchResult() { + public SearchResult getMoreSearchResult(String searchText) { return new SearchResult(); } diff --git a/designer/src/com/fr/design/mainframe/alphafine/search/manager/RecommendSearchManager.java b/designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java similarity index 85% rename from designer/src/com/fr/design/mainframe/alphafine/search/manager/RecommendSearchManager.java rename to designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java index 552b0e0268..9bc485287c 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/search/manager/RecommendSearchManager.java +++ b/designer/src/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java @@ -1,7 +1,6 @@ -package com.fr.design.mainframe.alphafine.search.manager; +package com.fr.design.mainframe.alphafine.search.manager.impl; import com.fr.design.DesignerEnvManager; -import com.fr.design.mainframe.SiteCenterToken; import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.CellType; @@ -10,6 +9,7 @@ import com.fr.design.mainframe.alphafine.cell.model.ActionModel; import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.model.SearchResult; +import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; import com.fr.general.FRLogger; import com.fr.general.Inter; import com.fr.general.http.HttpClient; @@ -25,12 +25,12 @@ import java.util.List; /** * Created by XiaXiang on 2017/3/31. */ -public class RecommendSearchManager implements AlphaFineSearchProcessor { +public class RecommendSearchManager implements AlphaFineSearchProvider { private static RecommendSearchManager recommendSearchManager = null; private SearchResult modelList; private SearchResult recommendModelList; - public synchronized static RecommendSearchManager getRecommendSearchManager() { + public synchronized static RecommendSearchManager getInstance() { if (recommendSearchManager == null) { recommendSearchManager = new RecommendSearchManager(); } @@ -44,14 +44,12 @@ public class RecommendSearchManager implements AlphaFineSearchProcessor { this.recommendModelList = new SearchResult(); if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainRecommend()) { String result; - String url = AlphaFineConstants.SEARCH_API + CodeUtils.cjkEncode(searchText); - url = String.format("%s?token=%s", url, SiteCenterToken.generateToken()); - HttpClient httpClient = new HttpClient(url); + HttpClient httpClient = new HttpClient(AlphaFineConstants.SEARCH_API + CodeUtils.cjkEncode(searchText)); httpClient.asGet(); if (!httpClient.isServerAlive()) { return getNoConnectList(); } - httpClient.setTimeout(5000); + httpClient.setTimeout(3000); result = httpClient.getResponseText(); AlphaFineHelper.checkCancel(); try { @@ -93,7 +91,7 @@ public class RecommendSearchManager implements AlphaFineSearchProcessor { * @return */ private boolean alreadyContain(AlphaCellModel cellModel) { - return RecentSearchManager.getRecentSearchManger().getRecentModelList().contains(cellModel) || this.recommendModelList.contains(cellModel); + return RecentSearchManager.getInstance().getRecentModelList().contains(cellModel) || this.recommendModelList.contains(cellModel); } private SearchResult getNoConnectList() { @@ -104,7 +102,7 @@ public class RecommendSearchManager implements AlphaFineSearchProcessor { } @Override - public SearchResult getMoreSearchResult() { + public SearchResult getMoreSearchResult(String searchText) { return new SearchResult(); } diff --git a/designer/src/com/fr/design/widget/WidgetEventPane.java b/designer/src/com/fr/design/widget/WidgetEventPane.java index f1342f9dea..f1139210cb 100644 --- a/designer/src/com/fr/design/widget/WidgetEventPane.java +++ b/designer/src/com/fr/design/widget/WidgetEventPane.java @@ -91,7 +91,7 @@ public class WidgetEventPane extends ObjectUIControlPane { @Override protected DBManipulationPane createDBManipulationPane() { - if(epane == null) { + if(epane == null && DesignerContext.getDesignerFrame().getSelectedJTemplate() != null) { return autoCreateDBManipulationInWidgetEventPane(); } diff --git a/designer/src/com/fr/grid/selection/FloatSelection.java b/designer/src/com/fr/grid/selection/FloatSelection.java index de44152f77..0d441a1f7a 100644 --- a/designer/src/com/fr/grid/selection/FloatSelection.java +++ b/designer/src/com/fr/grid/selection/FloatSelection.java @@ -1,32 +1,35 @@ package com.fr.grid.selection; -import java.awt.Toolkit; - -import javax.swing.JPopupMenu; - import com.fr.base.BaseUtils; import com.fr.base.FRContext; import com.fr.design.actions.cell.CleanAuthorityAction; import com.fr.design.actions.cell.FloatStyleAction; import com.fr.design.actions.core.ActionFactory; import com.fr.design.actions.edit.*; -import com.fr.design.actions.utils.DeprecatedActionManager; +import com.fr.design.actions.edit.order.BringFloatElementForwardAction; +import com.fr.design.actions.edit.order.BringFloatElementToFrontAction; +import com.fr.design.actions.edit.order.SendFloatElementBackwardAction; +import com.fr.design.actions.edit.order.SendFloatElementToBackAction; import com.fr.design.cell.clipboard.CellElementsClip; import com.fr.design.cell.clipboard.ElementsTransferable; import com.fr.design.cell.clipboard.FloatElementsClip; import com.fr.design.designer.TargetComponent; +import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.mainframe.CellElementPropertyPane; -import com.fr.general.ComparatorUtils; -import com.fr.general.Inter; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.mainframe.ElementCasePane.Clear; +import com.fr.design.selection.QuickEditor; +import com.fr.design.utils.DesignUtils; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; import com.fr.report.cell.FloatElement; import com.fr.report.elementcase.TemplateElementCase; -import com.fr.design.selection.QuickEditor; import com.fr.stable.ColumnRow; import com.fr.stable.unit.FU; import com.fr.stable.unit.OLDPIX; -import com.fr.design.utils.DesignUtils; + +import javax.swing.*; +import java.awt.*; /** * the float selection * @editor zhou @@ -114,24 +117,28 @@ public class FloatSelection extends Selection { @Override public JPopupMenu createPopupMenu(ElementCasePane ePane) { - JPopupMenu popup = new JPopupMenu(); + UIPopupMenu popup = new UIPopupMenu(); if (BaseUtils.isAuthorityEditing()) { popup.add(new CleanAuthorityAction(ePane).createMenuItem()); return popup; } - popup.add(DeprecatedActionManager.getCellMenu(ePane).createJMenu()); popup.add(new FloatStyleAction(ePane).createMenuItem()); popup.add(new HyperlinkAction().createMenuItem()); - // cut, copy and paste popup.addSeparator(); + popup.add(new CutAction(ePane).createMenuItem()); popup.add(new CopyAction(ePane).createMenuItem()); popup.add(new PasteAction(ePane).createMenuItem()); popup.add(new DeleteAction(ePane).createMenuItem()); + popup.addSeparator(); + popup.add(new BringFloatElementToFrontAction(ePane).createMenuItem()); + popup.add(new SendFloatElementToBackAction(ePane).createMenuItem()); + popup.add(new BringFloatElementForwardAction(ePane).createMenuItem()); + popup.add(new SendFloatElementBackwardAction(ePane).createMenuItem()); popup.addSeparator(); - popup.add(DeprecatedActionManager.getOrderMenu(ePane)); + popup.add(new EditFloatElementNameAction(ePane).createMenuItem()); return popup; diff --git a/designer_base/src/com/fr/design/DesignerEnvManager.java b/designer_base/src/com/fr/design/DesignerEnvManager.java index 1cd613785a..1eedded95c 100644 --- a/designer_base/src/com/fr/design/DesignerEnvManager.java +++ b/designer_base/src/com/fr/design/DesignerEnvManager.java @@ -61,6 +61,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { private static final int MAX_SHOW_NUM = 10; private static final String VERSION_80 = "80"; + private static final int CACHINGTEMPLATE_LIMIT = 5; private static DesignerEnvManager designerEnvManager; // gui. private String activationKey = null; @@ -99,6 +100,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { private int language; //2014-8-26默认显示全部, 因为以前的版本, 虽然是false, 实际上是显示所有表, 因此这边要兼容 private boolean useOracleSystemSpace = true; + private int cachingTemplateLimit = CACHINGTEMPLATE_LIMIT; private boolean autoBackUp = true; private int undoLimit = 5; private short pageLengthUnit = Constants.UNIT_MM; @@ -244,7 +246,8 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { // 写文件的LogLocation String logLocation = DesignerEnvManager.getEnvManager().getLogLocation(); - if (logLocation != null) { + //Mac下8.0,9.0 选项-日志设置为空时在根目录下检测文件存在会抛无权限,这里应该设个默认值比较好吧 + if (StringUtils.isNotEmpty(logLocation)) { try { Calendar calender = GregorianCalendar.getInstance(); calender.setTimeInMillis(System.currentTimeMillis()); @@ -631,6 +634,21 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { this.useOracleSystemSpace = displayOracleSystem; } + /** + * 配置最大缓存模板个数 + */ + public void setCachingTemplateLimit(int cachingTemplateLimit) { + this.cachingTemplateLimit = cachingTemplateLimit; + } + + + /** + * 获取最大缓存模板个数 + */ + public int getCachingTemplateLimit() { + return this.cachingTemplateLimit; + } + /** * 是否加入产品改良 * @@ -1394,6 +1412,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { this.setMaxNumberOrPreviewRow(reader.getAttrAsInt("maxNumberOrPreviewRow", 200)); this.setOracleSystemSpace(reader.getAttrAsBoolean("useOracleSystemSpace", true)); + this.setCachingTemplateLimit(reader.getAttrAsInt("cachingTemplateLimit", CACHINGTEMPLATE_LIMIT)); this.setJoinProductImprove(reader.getAttrAsBoolean("joinProductImprove", true)); this.setAutoBackUp(reader.getAttrAsBoolean("autoBackUp", true)); this.setTemplateTreePaneExpanded(reader.getAttrAsBoolean("templateTreePaneExpanded", false)); @@ -1614,6 +1633,9 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { if (!this.isOracleSystemSpace()) { writer.attr("useOracleSystemSpace", this.isOracleSystemSpace()); } + if (this.getCachingTemplateLimit() >= 0) { + writer.attr("cachingTemplateLimit", this.getCachingTemplateLimit()); + } if (!this.isJoinProductImprove()) { writer.attr("joinProductImprove", this.isJoinProductImprove()); } diff --git a/designer_base/src/com/fr/design/actions/file/PreferencePane.java b/designer_base/src/com/fr/design/actions/file/PreferencePane.java index d32b110d16..4d72a5f8a5 100644 --- a/designer_base/src/com/fr/design/actions/file/PreferencePane.java +++ b/designer_base/src/com/fr/design/actions/file/PreferencePane.java @@ -16,6 +16,7 @@ import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; @@ -32,6 +33,7 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; +import javax.swing.BorderFactory; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; @@ -64,6 +66,9 @@ public class PreferencePane extends BasicPane { private static final int MAX_UNDO_LIMIT_50 = 50; private static final int SELECTED_INDEX_4 = 4; private static final int SELECTED_INDEX_5 = 5; + private static final int CACHING_MAX = 10; + private static final int CACHING_DEFAULT = 5; + private static final int CACHING_GAP = 5; private static final String TYPE = "pressed"; private static final String DISPLAY_TYPE = "+"; @@ -122,6 +127,7 @@ public class PreferencePane extends BasicPane { private IntegerEditor portEditor; private UITextField jdkHomeTextField; private UICheckBox oracleSpace; + private UISpinner cachingTemplateSpinner; private UICheckBox joinProductImprove; public PreferencePane() { @@ -182,6 +188,7 @@ public class PreferencePane extends BasicPane { JPanel spaceUpPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); spaceUpPane.add(oraclePane, BorderLayout.NORTH); + spaceUpPane.add(createMemoryPane(), BorderLayout.CENTER); spaceUpPane.add(improvePane, BorderLayout.SOUTH); advancePane.add(spaceUpPane); } @@ -505,6 +512,20 @@ public class PreferencePane extends BasicPane { serverPortPane.add(choosePortPane, BorderLayout.CENTER); } + private JPanel createMemoryPane() { + JPanel memoryPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("FR-Designer_Preference_CachingTemplate")); + UILabel memoryLabel = new UILabel(Inter.getLocText("FR-Designer_Preference_MaxCachingTemplate")); + UILabel memoryTipLabel = new UILabel(Inter.getLocText("FR-Designer_Preference_CachingTemplateTip")); + memoryTipLabel.setBorder(BorderFactory.createEmptyBorder( 0, CACHING_GAP, 0, 0)); + cachingTemplateSpinner = new UISpinner(0, CACHING_MAX, 1, CACHING_DEFAULT); + JPanel memorySpace = new JPanel(FRGUIPaneFactory.createLeftZeroLayout()); + memorySpace.add(memoryLabel); + memorySpace.add(cachingTemplateSpinner); + memorySpace.add(memoryTipLabel); + memoryPane.add(memorySpace); + return memoryPane; + } + @Override protected String title4PopupWindow() { return Inter.getLocText("M_Window-Preference"); @@ -563,6 +584,7 @@ public class PreferencePane extends BasicPane { this.jdkHomeTextField.setText(designerEnvManager.getJdkHome()); this.oracleSpace.setSelected(designerEnvManager.isOracleSystemSpace()); + this.cachingTemplateSpinner.setValue(designerEnvManager.getCachingTemplateLimit()); this.joinProductImprove.setSelected(designerEnvManager.isJoinProductImprove()); } @@ -623,6 +645,7 @@ public class PreferencePane extends BasicPane { designerEnvManager.setJdkHome(jdkHomeTextField.getText()); designerEnvManager.setOracleSystemSpace(this.oracleSpace.isSelected()); + designerEnvManager.setCachingTemplateLimit((int) this.cachingTemplateSpinner.getValue()); designerEnvManager.setJoinProductImprove(this.joinProductImprove.isSelected()); // designerEnvManager.setAutoBackUp(this.autoBackUp.isSelected()); diff --git a/designer_base/src/com/fr/design/constants/UIConstants.java b/designer_base/src/com/fr/design/constants/UIConstants.java index 5a35c98d44..c1aacd7c99 100644 --- a/designer_base/src/com/fr/design/constants/UIConstants.java +++ b/designer_base/src/com/fr/design/constants/UIConstants.java @@ -79,6 +79,8 @@ public interface UIConstants { public static final Color COMBOBOX_BTN_NORMAL = new Color(0xD9DADD); public static final Color COMBOBOX_BTN_ROLLOVER = new Color(0xC8C9CD); public static final Color COMBOBOX_BTN_PRESS = new Color(0xD8F2FD); + public static final Color UIPOPUPMENU_LINE_COLOR = new Color(0xC8C9CD); + public static final Color UIPOPUPMENU_BACKGROUND = new Color(0xEDEDEE); public static final Color LINE_COLOR = new Color(153, 153, 153); public static final Color FONT_COLOR = new Color(51, 51, 51); public static final Color LIGHT_BLUE = new Color(182, 217, 253); diff --git a/designer_base/src/com/fr/design/extra/LoginWebBridge.java b/designer_base/src/com/fr/design/extra/LoginWebBridge.java index 330b9fc033..3fb83f5faf 100644 --- a/designer_base/src/com/fr/design/extra/LoginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/LoginWebBridge.java @@ -20,7 +20,7 @@ import netscape.javascript.JSObject; import javax.swing.JDialog; import javax.swing.SwingUtilities; -import java.awt.Desktop; +import java.awt.*; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URLEncoder; @@ -57,6 +57,7 @@ public class LoginWebBridge { private static final int TIME_OUT = 10000; private static final String LOGIN_SUCCESS = "ok"; private static final String LOGIN_FAILED = "failed"; + private static final Color LOGIN_BACKGROUND = new Color(184, 220, 242); private static LoginWebBridge helper; private UIDialog uiDialog; @@ -250,6 +251,7 @@ public class LoginWebBridge { private void loginSuccess(String username) { closeWindow(); uiLabel.setText(username); + uiLabel.setBackground(LOGIN_BACKGROUND); } /** diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer_base/src/com/fr/design/extra/PluginWebBridge.java index fed3c6855d..afdcd448f6 100644 --- a/designer_base/src/com/fr/design/extra/PluginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/PluginWebBridge.java @@ -54,6 +54,7 @@ public class PluginWebBridge { private static final String THREAD_NAME_TEMPLATE = "pluginbridge-thread-%s"; private static final String ACTION = "action"; private static final String KEYWORD = "keyword"; + private static final String PLUGIN_INFO = "pluginInfo"; private static final int COREPOOLSIZE = 3; private static final int MAXPOOLSIZE = 5; @@ -72,20 +73,7 @@ public class PluginWebBridge { new LinkedBlockingQueue(COREPOOLSIZE), new ThreadFactoryBuilder().setNameFormat(THREAD_NAME_TEMPLATE).build()); - /** - * 动作枚举 - */ - public enum ACTIONS { - SEARCH("search"); - private String context; - - ACTIONS(String context) { - this.context = context; - } - - public String getContext() { - return context; - } + private PluginWebBridge() { } public static PluginWebBridge getHelper() { @@ -106,9 +94,6 @@ public class PluginWebBridge { return helper; } - private PluginWebBridge() { - } - /** * 获取打开动作配置 * @@ -155,12 +140,26 @@ public class PluginWebBridge { * * @param keyword 关键词 */ + public void openWithSearch(String keyword) { HashMap map = new HashMap(2); map.put(KEYWORD, keyword); setRunConfig(ACTIONS.SEARCH, map); } + /** + * 根据插件信息跳转到应用中心 + * + * @param keyword + * @param pluginInfo + */ + public void showResultInStore(String keyword, String pluginInfo) { + HashMap map = new HashMap<>(); + map.put(KEYWORD, keyword); + map.put(PLUGIN_INFO, pluginInfo); + setRunConfig(ACTIONS.SHOW_RESULT, map); + } + public void setEngine(WebEngine webEngine) { this.webEngine = webEngine; } @@ -182,7 +181,6 @@ public class PluginWebBridge { PluginOperateUtils.installPluginOnline(pluginMarker, jsCallback); } - /** * 从磁盘上选择插件安装包进行安装 * @@ -204,7 +202,6 @@ public class PluginWebBridge { PluginOperateUtils.uninstallPlugin(pluginInfo, isForce, jsCallback); } - /** * 从插件服务器上更新选中的插件 * @@ -346,13 +343,11 @@ public class PluginWebBridge { threadPoolExecutor.submit(task); } - public void getPluginPrefix(final JSObject callback) { Task task = new PluginTask<>(webEngine, callback, new GetPluginPrefixExecutor()); threadPoolExecutor.submit(task); } - /** * 在线获取插件分类 * @@ -487,9 +482,6 @@ public class PluginWebBridge { } } - - /*-------------------------------登录部分的处理----------------------------------*/ - /** * 注册页面 */ @@ -501,6 +493,9 @@ public class PluginWebBridge { } } + + /*-------------------------------登录部分的处理----------------------------------*/ + /** * 忘记密码 */ @@ -577,4 +572,20 @@ public class PluginWebBridge { return true; } + /** + * 动作枚举 + */ + public enum ACTIONS { + SEARCH("search"), SHOW_RESULT("showResult"); + private String context; + + ACTIONS(String context) { + this.context = context; + } + + public String getContext() { + return context; + } + } + } diff --git a/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java b/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java index 16eb611921..a00f460ed8 100644 --- a/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java +++ b/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java @@ -129,6 +129,16 @@ public class WebViewDlgHelper { createPluginDialog(); } + /** + * 以关键词打开设计器商店显示搜索结果 + * @param keyword + * @param data + */ + public static void showPluginInStore(String keyword, String data) { + PluginWebBridge.getHelper().showResultInStore(keyword, data); + createPluginDialog(); + } + public static void createLoginDialog() { if (StableUtils.getMajorJavaVersion() == VERSION_8) { File file = new File(StableUtils.pathJoin(installHome, "scripts")); diff --git a/designer_base/src/com/fr/design/file/HistoryTemplateListPane.java b/designer_base/src/com/fr/design/file/HistoryTemplateListPane.java index 1e9ae4e522..7d8cb464a7 100644 --- a/designer_base/src/com/fr/design/file/HistoryTemplateListPane.java +++ b/designer_base/src/com/fr/design/file/HistoryTemplateListPane.java @@ -38,7 +38,7 @@ import com.fr.design.utils.gui.GUIPaintUtils; public class HistoryTemplateListPane extends JPanel implements FileOperations, CallbackEvent { //最大保存内存中面板数,为0时关闭优化内存 - private static final int DEAD_LINE = 5; + private static final int DEAD_LINE = DesignerEnvManager.getEnvManager().getCachingTemplateLimit(); private static final int LIST_BORDER = 4; private List> historyList; private JTemplate editingTemplate; diff --git a/designer_base/src/com/fr/design/file/MutilTempalteTabPane.java b/designer_base/src/com/fr/design/file/MutilTempalteTabPane.java index f3d62601d9..eb93f09fd3 100644 --- a/designer_base/src/com/fr/design/file/MutilTempalteTabPane.java +++ b/designer_base/src/com/fr/design/file/MutilTempalteTabPane.java @@ -17,6 +17,7 @@ import com.fr.general.ComparatorUtils; import com.fr.general.FRLogger; import com.fr.general.Inter; import com.fr.stable.Constants; +import com.fr.stable.OperatingSystem; import com.fr.stable.ProductConstants; import com.fr.stable.project.ProjectConstants; @@ -706,8 +707,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M if (filename.startsWith(ProjectConstants.REPORTLETS_NAME)) { filename = ((FileNodeFILE) openedTemplate.get(selectedIndex).getEditingFILE()).getEnvPath() + File.separator + filename; } - - filename = filename.replaceAll("/", "\\\\"); + filename = OperatingSystem.isWindows() ? filename.replaceAll("/", "\\\\") : filename.replaceAll("\\\\", "/"); if (!specifiedTemplate.isALLSaved()) { specifiedTemplate.stopEditing(); diff --git a/designer_base/src/com/fr/design/gui/controlpane/UIListControlPane.java b/designer_base/src/com/fr/design/gui/controlpane/UIListControlPane.java index d6c1a34324..b1a226150c 100644 --- a/designer_base/src/com/fr/design/gui/controlpane/UIListControlPane.java +++ b/designer_base/src/com/fr/design/gui/controlpane/UIListControlPane.java @@ -219,10 +219,10 @@ public abstract class UIListControlPane extends UIControlPane { return; } - for (Nameable aNameableArray : nameableArray) { - listModel.addElement(new ListModelElement(aNameableArray)); + listModel.setSize(nameableArray.length); + for (int i = 0; i < nameableArray.length; i++) { + listModel.set(i, new ListModelElement(nameableArray[i])); } - if (listModel.size() > 0 || this.nameableList.getSelectedIndex() != 0) { this.nameableList.setSelectedIndex(0); } diff --git a/designer_base/src/com/fr/design/gui/imenu/UIHeadMenu.java b/designer_base/src/com/fr/design/gui/imenu/UIHeadMenu.java new file mode 100644 index 0000000000..627982ffe5 --- /dev/null +++ b/designer_base/src/com/fr/design/gui/imenu/UIHeadMenu.java @@ -0,0 +1,274 @@ +package com.fr.design.gui.imenu; + +import com.fr.design.constants.UIConstants; +import com.fr.design.utils.gui.GUIPaintUtils; + +import javax.swing.*; +import javax.swing.border.Border; +import java.awt.*; + +public class UIHeadMenu extends UIMenu { + private static final float REC = 8f; + private JPopupMenu popupMenu; + + public UIHeadMenu(String name) { + super(name); + } + + public JPopupMenu getPopupMenu() { + ensurePopupMenuCreated(); + popupMenu.setBackground(UIConstants.NORMAL_BACKGROUND); + popupMenu.setBorder(new Border() { + + @Override + public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { + Graphics2D g2d = (Graphics2D) g; + int rec = (int) REC; + GUIPaintUtils.paintShapeBorder(g2d, x, y, width, height, rec); + if (!(UIHeadMenu.this.getParent() instanceof JPopupMenu)) { + g.setColor(UIConstants.NORMAL_BACKGROUND); + g.drawLine(1, 0, UIHeadMenu.this.getWidth() - 2, 0); + } + } + + @Override + public boolean isBorderOpaque() { + return false; + } + + @Override + public Insets getBorderInsets(Component c) { + return new Insets(5, 2, 10, 10); + } + }); + return popupMenu; + } + + protected void ensurePopupMenuCreated() { + if (popupMenu == null) { + this.popupMenu = new JPopupMenu() { + @Override + protected void paintComponent(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + float wdith = getWidth(); + float heigth = getHeight(); + + Shape shape = GUIPaintUtils.paintShape(g2d, wdith, heigth, REC); + g2d.setClip(shape); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + super.paintComponent(g2d); + } + }; + popupMenu.setInvoker(this); + popupListener = createWinListener(popupMenu); + } + } + + /** + *画界面 + */ + @Override + public void updateUI() { + setUI(new UIMenuUI()); + } + + /** + * 判断popupmeu是否隐藏 + * @return 如果隐藏 返回true + */ + public boolean isPopupMenuVisible() { + ensurePopupMenuCreated(); + return popupMenu.isVisible(); + } + + + /** + * 设置popupmenu位置 + * @param x + * @param y + */ + public void setMenuLocation(int x, int y) { + super.setMenuLocation(x, y); + if (popupMenu != null) { + popupMenu.setLocation(x, y); + } + } + + /** + * 向popupmenu添加 JMenuItem + * @param menuItem 菜单项 + * @return 菜单项 + */ + public JMenuItem add(JMenuItem menuItem) { + ensurePopupMenuCreated(); + return popupMenu.add(menuItem); + } + + /** + * 添加组件 + * @param c 组件 + * @return 组件 + */ + public Component add(Component c) { + ensurePopupMenuCreated(); + popupMenu.add(c); + return c; + } + + /** + * 向指定位置添加组件 + * @param c 组件 + * @param index 位置 + * @return 组件 + */ + public Component add(Component c, int index) { + ensurePopupMenuCreated(); + popupMenu.add(c, index); + return c; + } + + + /** + * 添加分隔符 + */ + public void addSeparator() { + ensurePopupMenuCreated(); + popupMenu.addSeparator(); + } + + /** + * 添加menuitem到指定位置 + * @param s 字符 + * @param pos 位置 + */ + public void insert(String s, int pos) { + if (pos < 0) { + throw new IllegalArgumentException("index less than zero."); + } + + ensurePopupMenuCreated(); + popupMenu.insert(new JMenuItem(s), pos); + } + + /** + * 添加么会特么到指定位置 + * @param mi 菜单项 + * @param pos 位置 + * @return 菜单项 + */ + public JMenuItem insert(JMenuItem mi, int pos) { + if (pos < 0) { + throw new IllegalArgumentException("index less than zero."); + } + ensurePopupMenuCreated(); + popupMenu.insert(mi, pos); + return mi; + } + + /** + * 添加到指定位置 + * @param a 事件 + * @param pos 位置 + * @return 菜单项 + */ + public JMenuItem insert(Action a, int pos) { + if (pos < 0) { + throw new IllegalArgumentException("index less than zero."); + } + + ensurePopupMenuCreated(); + JMenuItem mi = new JMenuItem(a); + mi.setHorizontalTextPosition(JButton.TRAILING); + mi.setVerticalTextPosition(JButton.CENTER); + popupMenu.insert(mi, pos); + return mi; + } + + /** + * 添加分隔符到指定位置 + * @param index 指定位置 + */ + public void insertSeparator(int index) { + if (index < 0) { + throw new IllegalArgumentException("index less than zero."); + } + + ensurePopupMenuCreated(); + popupMenu.insert(new JPopupMenu.Separator(), index); + } + + + /** + * 移除 + * @param item 菜单项 + */ + public void remove(JMenuItem item) { + if (popupMenu != null) { + popupMenu.remove(item); + } + } + + /** + * 移除指定位置菜单项 + * @param pos 指定位置 + */ + public void remove(int pos) { + if (pos < 0) { + throw new IllegalArgumentException("index less than zero."); + } + if (pos > getItemCount()) { + throw new IllegalArgumentException("index greater than the number of items."); + } + if (popupMenu != null) { + popupMenu.remove(pos); + } + } + + /** + * 移除组件 + * @param c 组件 + */ + public void remove(Component c) { + if (popupMenu != null) { + popupMenu.remove(c); + } + } + + /** + * 移除所有 + */ + public void removeAll() { + if (popupMenu != null) { + popupMenu.removeAll(); + } + } + + /** + * 组件总数 + * @return 组件总数 + */ + public int getMenuComponentCount() { + return (popupMenu == null) ? 0 : popupMenu.getComponentCount(); + } + + /** + * 指定位置组件 + * @param n 指定位置 + * @return 组件 + */ + public Component getMenuComponent(int n) { + return (popupMenu == null) ? null : popupMenu.getComponent(n); + } + + /** + * 所有组件 + * @return 所有组件 + */ + public Component[] getMenuComponents() { + return (popupMenu == null) ? new Component[0] : popupMenu.getComponents(); + } + + + + +} diff --git a/designer_base/src/com/fr/design/gui/imenu/UIMenu.java b/designer_base/src/com/fr/design/gui/imenu/UIMenu.java index 9c905a83f4..bcdf2ab9f4 100644 --- a/designer_base/src/com/fr/design/gui/imenu/UIMenu.java +++ b/designer_base/src/com/fr/design/gui/imenu/UIMenu.java @@ -6,8 +6,12 @@ import com.fr.stable.StringUtils; import javax.swing.*; import javax.swing.border.Border; import java.awt.*; +import java.awt.geom.RoundRectangle2D; public class UIMenu extends JMenu { + private static final float REC = 8f; + private JPopupMenu popupMenu; + public UIMenu(String name) { super(name); setName(name); @@ -24,14 +28,17 @@ public class UIMenu extends JMenu { } public JPopupMenu getPopupMenu() { - JPopupMenu popupMenu = super.getPopupMenu(); - popupMenu.setBackground(UIConstants.NORMAL_BACKGROUND); + ensurePopupMenuCreated(); + popupMenu.setOpaque(false); popupMenu.setBorder(new Border() { @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { - g.setColor(UIConstants.LINE_COLOR); - g.drawRect(x, y, width - 1, height - 1); + Graphics2D g2d = (Graphics2D) g; + int rec = (int) REC; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + g2d.setColor(UIConstants.UIPOPUPMENU_LINE_COLOR); + g2d.drawRoundRect(x, y, width - 1, height - 1,rec, rec); if (!(UIMenu.this.getParent() instanceof JPopupMenu)) { g.setColor(UIConstants.NORMAL_BACKGROUND); g.drawLine(1, 0, UIMenu.this.getWidth() - 2, 0); @@ -51,8 +58,230 @@ public class UIMenu extends JMenu { return popupMenu; } + protected void ensurePopupMenuCreated() { + if (popupMenu == null) { + this.popupMenu = new JPopupMenu() { + @Override + protected void paintComponent(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + int rec = (int) REC; + Shape shape = new RoundRectangle2D.Double(0, 0, getWidth(), getHeight(), REC, REC); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setColor(UIConstants.NORMAL_BACKGROUND); + g2d.fillRoundRect(0, 0, getWidth(), getHeight(), rec, rec); + g2d.setClip(shape); + super.paintComponent(g2d); + } + + }; + popupMenu.setInvoker(this); + + popupListener = createWinListener(popupMenu); + } + } + + /** + *画界面 + */ @Override public void updateUI() { setUI(new UIMenuUI()); } + + /** + * 判断popupmeu是否隐藏 + * @return 如果隐藏 返回true + */ + public boolean isPopupMenuVisible() { + ensurePopupMenuCreated(); + return popupMenu.isVisible(); + } + + + /** + * 设置popupmenu位置 + * @param x + * @param y + */ + public void setMenuLocation(int x, int y) { + super.setMenuLocation(x, y); + if (popupMenu != null) { + popupMenu.setLocation(x, y); + } + } + + /** + * 向popupmenu添加 JMenuItem + * @param menuItem 菜单项 + * @return 菜单项 + */ + public JMenuItem add(JMenuItem menuItem) { + ensurePopupMenuCreated(); + return popupMenu.add(menuItem); + } + + /** + * 添加组件 + * @param c 组件 + * @return 组件 + */ + public Component add(Component c) { + ensurePopupMenuCreated(); + popupMenu.add(c); + return c; + } + + /** + * 向指定位置添加组件 + * @param c 组件 + * @param index 位置 + * @return 组件 + */ + public Component add(Component c, int index) { + ensurePopupMenuCreated(); + popupMenu.add(c, index); + return c; + } + + + /** + * 添加分隔符 + */ + public void addSeparator() { + ensurePopupMenuCreated(); + popupMenu.addSeparator(); + } + + /** + * 添加menuitem到指定位置 + * @param s 字符 + * @param pos 位置 + */ + public void insert(String s, int pos) { + if (pos < 0) { + throw new IllegalArgumentException("index less than zero."); + } + + ensurePopupMenuCreated(); + popupMenu.insert(new JMenuItem(s), pos); + } + + /** + * 添加么会特么到指定位置 + * @param mi 菜单项 + * @param pos 位置 + * @return 菜单项 + */ + public JMenuItem insert(JMenuItem mi, int pos) { + if (pos < 0) { + throw new IllegalArgumentException("index less than zero."); + } + ensurePopupMenuCreated(); + popupMenu.insert(mi, pos); + return mi; + } + + /** + * 添加到指定位置 + * @param a 事件 + * @param pos 位置 + * @return 菜单项 + */ + public JMenuItem insert(Action a, int pos) { + if (pos < 0) { + throw new IllegalArgumentException("index less than zero."); + } + + ensurePopupMenuCreated(); + JMenuItem mi = new JMenuItem(a); + mi.setHorizontalTextPosition(JButton.TRAILING); + mi.setVerticalTextPosition(JButton.CENTER); + popupMenu.insert(mi, pos); + return mi; + } + + /** + * 添加分隔符到指定位置 + * @param index 指定位置 + */ + public void insertSeparator(int index) { + if (index < 0) { + throw new IllegalArgumentException("index less than zero."); + } + + ensurePopupMenuCreated(); + popupMenu.insert(new JPopupMenu.Separator(), index); + } + + + /** + * 移除 + * @param item 菜单项 + */ + public void remove(JMenuItem item) { + if (popupMenu != null) { + popupMenu.remove(item); + } + } + + /** + * 移除指定位置菜单项 + * @param pos 指定位置 + */ + public void remove(int pos) { + if (pos < 0) { + throw new IllegalArgumentException("index less than zero."); + } + if (pos > getItemCount()) { + throw new IllegalArgumentException("index greater than the number of items."); + } + if (popupMenu != null) { + popupMenu.remove(pos); + } + } + + /** + * 移除组件 + * @param c 组件 + */ + public void remove(Component c) { + if (popupMenu != null) { + popupMenu.remove(c); + } + } + + /** + * 移除所有 + */ + public void removeAll() { + if (popupMenu != null) { + popupMenu.removeAll(); + } + } + + /** + * 组件总数 + * @return 组件总数 + */ + public int getMenuComponentCount() { + return (popupMenu == null) ? 0 : popupMenu.getComponentCount(); + } + + /** + * 指定位置组件 + * @param n 指定位置 + * @return 组件 + */ + public Component getMenuComponent(int n) { + return (popupMenu == null) ? null : popupMenu.getComponent(n); + } + + /** + * 所有组件 + * @return 所有组件 + */ + public Component[] getMenuComponents() { + return (popupMenu == null) ? new Component[0] : popupMenu.getComponents(); + } + } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/imenu/UIMenuItem.java b/designer_base/src/com/fr/design/gui/imenu/UIMenuItem.java index e35f440a13..a0f1643612 100644 --- a/designer_base/src/com/fr/design/gui/imenu/UIMenuItem.java +++ b/designer_base/src/com/fr/design/gui/imenu/UIMenuItem.java @@ -95,7 +95,7 @@ public class UIMenuItem extends JMenuItem{ } else { // *** paint the text normally if (model.isArmed()|| (menuItem instanceof JMenu && model.isSelected())) { - g.setColor(selectionForeground); // Uses protected field. + g.setColor(Color.WHITE); // Uses protected field. } SwingUtilities2.drawStringUnderlineCharAt(menuItem, g,text, -1, textRect.x, textRect.y + fm.getAscent()); diff --git a/designer_base/src/com/fr/design/gui/imenu/UIMenuUI.java b/designer_base/src/com/fr/design/gui/imenu/UIMenuUI.java index 9e79ecd659..33f86582f5 100644 --- a/designer_base/src/com/fr/design/gui/imenu/UIMenuUI.java +++ b/designer_base/src/com/fr/design/gui/imenu/UIMenuUI.java @@ -72,8 +72,8 @@ public class UIMenuUI extends BasicMenuUI { } } else { // *** paint the text normally - if (model.isArmed() || (menuItem instanceof JMenu && model.isSelected())) { - g.setColor(selectionForeground); // Uses protected field. + if (model.isArmed() || (menuItem instanceof JMenu && menuItem.isSelected() && menuItem.getIcon() != null)) { + g.setColor(Color.WHITE); // Uses protected field. } SwingUtilities2.drawStringUnderlineCharAt(menuItem, g, text, mnemIndex, textRect.x, textRect.y + fm.getAscent()); diff --git a/designer_base/src/com/fr/design/gui/imenu/UIPopupMenu.java b/designer_base/src/com/fr/design/gui/imenu/UIPopupMenu.java index 44b36ae115..9fcf821e0c 100644 --- a/designer_base/src/com/fr/design/gui/imenu/UIPopupMenu.java +++ b/designer_base/src/com/fr/design/gui/imenu/UIPopupMenu.java @@ -1,23 +1,37 @@ package com.fr.design.gui.imenu; -import java.awt.Graphics; -import java.awt.Insets; +import java.awt.*; +import java.awt.geom.RoundRectangle2D; -import javax.swing.JPopupMenu; +import javax.swing.*; import com.fr.design.constants.UIConstants; public class UIPopupMenu extends JPopupMenu{ + private static final float REC = 8f; private boolean onlyText = false; public UIPopupMenu() { super(); setBackground(UIConstants.NORMAL_BACKGROUND); } + @Override + protected void paintComponent(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + Shape shape = null; + shape = new RoundRectangle2D.Double(0, 0, getWidth(), getHeight(), REC, REC); + g2d.setClip(shape); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + super.paintComponent(g2d); + } + @Override protected void paintBorder(Graphics g) { - g.setColor(UIConstants.LINE_COLOR); - g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); + Graphics2D g2d = (Graphics2D) g; + int rec = (int) REC; + g2d.setColor(UIConstants.UIPOPUPMENU_LINE_COLOR); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, rec, rec); } @Override diff --git a/designer_base/src/com/fr/design/gui/imenu/UIPopupMenuSeparatorUI.java b/designer_base/src/com/fr/design/gui/imenu/UIPopupMenuSeparatorUI.java index df90a1bbe2..b9497dcd15 100644 --- a/designer_base/src/com/fr/design/gui/imenu/UIPopupMenuSeparatorUI.java +++ b/designer_base/src/com/fr/design/gui/imenu/UIPopupMenuSeparatorUI.java @@ -23,7 +23,7 @@ public class UIPopupMenuSeparatorUI extends MetalSeparatorUI { public void paint(Graphics g, JComponent c) { Dimension s = c.getSize(); - g.setColor(UIConstants.FONT_COLOR); + g.setColor(UIConstants.UIPOPUPMENU_LINE_COLOR); g.drawLine(2, 1, s.width - 3, 1); } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/imenu/UIScrollPopUpMenu.java b/designer_base/src/com/fr/design/gui/imenu/UIScrollPopUpMenu.java index 3f8fd6a423..c2713fc26a 100644 --- a/designer_base/src/com/fr/design/gui/imenu/UIScrollPopUpMenu.java +++ b/designer_base/src/com/fr/design/gui/imenu/UIScrollPopUpMenu.java @@ -1,6 +1,7 @@ package com.fr.design.gui.imenu; +import com.fr.design.constants.UIConstants; import com.fr.design.gui.iscrollbar.UIScrollBar; import java.awt.*; @@ -16,12 +17,13 @@ import java.awt.event.MouseWheelListener; */ public class UIScrollPopUpMenu extends UIPopupMenu { private static final int MAX_SHOW_NUM = 27; - + private static final float REC = 8f; private UIScrollBar scrollBar; public UIScrollPopUpMenu() { super(); + setOpaque(false); setLayout(new ScrollPopupMenuLayout()); super.add(getScrollBar()); addMouseWheelListener(new MouseWheelListener() { @@ -39,6 +41,11 @@ public class UIScrollPopUpMenu extends UIPopupMenu { public void paintChildren(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + int rec = (int) REC; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setColor(UIConstants.NORMAL_BACKGROUND); + g2d.fillRoundRect(1, 1, getWidth() - 2, getHeight() - 2, rec, rec); Insets insets = getInsets(); g.clipRect(insets.left, insets.top, getWidth(), getHeight() - insets.top - insets.bottom); super.paintChildren(g); diff --git a/designer_base/src/com/fr/design/images/control/clear.png b/designer_base/src/com/fr/design/images/control/clear.png new file mode 100644 index 0000000000..6e6282a3f3 Binary files /dev/null and b/designer_base/src/com/fr/design/images/control/clear.png differ diff --git a/designer_base/src/com/fr/design/images/control/icon_thumb_normal.png b/designer_base/src/com/fr/design/images/control/icon_thumb_normal.png new file mode 100644 index 0000000000..7fea2e6572 Binary files /dev/null and b/designer_base/src/com/fr/design/images/control/icon_thumb_normal.png differ diff --git a/designer_base/src/com/fr/design/images/control/remove.png b/designer_base/src/com/fr/design/images/control/remove.png index 5c889b8bac..6fb2baac51 100644 Binary files a/designer_base/src/com/fr/design/images/control/remove.png and b/designer_base/src/com/fr/design/images/control/remove.png differ diff --git a/designer_base/src/com/fr/design/images/control/to_bottom.png b/designer_base/src/com/fr/design/images/control/to_bottom.png new file mode 100755 index 0000000000..b69dbf03f3 Binary files /dev/null and b/designer_base/src/com/fr/design/images/control/to_bottom.png differ diff --git a/designer_base/src/com/fr/design/images/control/to_top.png b/designer_base/src/com/fr/design/images/control/to_top.png new file mode 100755 index 0000000000..cb1dda6de7 Binary files /dev/null and b/designer_base/src/com/fr/design/images/control/to_top.png differ diff --git a/designer_base/src/com/fr/design/locale/designer.properties b/designer_base/src/com/fr/design/locale/designer.properties index db4c469eec..9fb56799ca 100644 --- a/designer_base/src/com/fr/design/locale/designer.properties +++ b/designer_base/src/com/fr/design/locale/designer.properties @@ -2150,3 +2150,18 @@ FR-Designer_Decimal_Places= FR-Designer_Env_Des_Https=If HTTPS is enabled or the HTTPS configuration (certificate path, HTTPS key) is modified, you must restart the designer to take effect. FR-Designer_Format_JavaScript=Format Code FR-Designer-Vcs_tab_click=Please exit the version management status and then switch the template +FR-Designer_Preference_CachingTemplate=Template memory optimization +FR-Designer_Preference_MaxCachingTemplate=The designer maximum cache template number: +FR-Designer_Preference_CachingTemplateTip=Set to 0 to close the function; restart the designer and take effect +FR-Designer_Move_Up=Move up(F) +FR-Designer_Move_Down=Move down(B) +FR-Designer_Move_To_Top=Move to top(T) +FR-Designer_Move_To_Bottom=Move to bottom(K) +FR-Designer_Tab_Style_Template=Style Template +FR-Designer_Tab_Template_One=Template One +FR-Designer_Tab_Template_Two=Template Two +FR-Designer_Tab_Template_Three=Template Three +FR-Designer_Tab_Template_Four=Template Four +FR-Designer_Tab_Template_Five=Template Five +FR-Designer_Tab_Template_Six=Template Six +FR-Designer_Tab_Display_Position=Display Position diff --git a/designer_base/src/com/fr/design/locale/designer_en_US.properties b/designer_base/src/com/fr/design/locale/designer_en_US.properties index 4f8e68c121..5246c0c1b7 100644 --- a/designer_base/src/com/fr/design/locale/designer_en_US.properties +++ b/designer_base/src/com/fr/design/locale/designer_en_US.properties @@ -2149,3 +2149,18 @@ FR-Designer_Decimal_Places= FR-Designer_Env_Des_Https=If HTTPS is enabled or the HTTPS configuration (certificate path, HTTPS key) is modified, you must restart the designer to take effect. FR-Designer_Format_JavaScript=Format Code FR-Designer-Vcs_tab_click=Please exit the version management status and then switch the template +FR-Designer_Preference_CachingTemplate=Template memory optimization +FR-Designer_Preference_MaxCachingTemplate=The designer maximum cache template number: +FR-Designer_Preference_CachingTemplateTip=Set to 0 to close the function; restart the designer and take effect +FR-Designer_Move_Up=Move up(F) +FR-Designer_Move_Down=Move down(B) +FR-Designer_Move_To_Top=Move to top(T) +FR-Designer_Move_To_Bottom=Move to bottom(K) +FR-Designer_Tab_Style_Template=Style Template +FR-Designer_Tab_Template_One=Template One +FR-Designer_Tab_Template_Two=Template Two +FR-Designer_Tab_Template_Three=Template Three +FR-Designer_Tab_Template_Four=Template Four +FR-Designer_Tab_Template_Five=Template Five +FR-Designer_Tab_Template_Six=Template Six +FR-Designer_Tab_Display_Position=Display Position diff --git a/designer_base/src/com/fr/design/locale/designer_ja_JP.properties b/designer_base/src/com/fr/design/locale/designer_ja_JP.properties index 4814712b69..62871a21a4 100644 --- a/designer_base/src/com/fr/design/locale/designer_ja_JP.properties +++ b/designer_base/src/com/fr/design/locale/designer_ja_JP.properties @@ -2150,3 +2150,18 @@ FR-Base-Load_Resource_File=\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB\u30ED\u30FC\u30C FR-Designer_Env_Des_Https= FR-Designer_Format_JavaScript=Format Code FR-Designer-Vcs_tab_click= +FR-Designer_Move_Up= +FR-Designer_Move_Down= +FR-Designer_Move_To_Top= +FR-Designer_Move_To_Bottom= +FR-Designer_Preference_CachingTemplate=\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u30E1\u30E2\u30EA\u6700\u9069\u5316 +FR-Designer_Preference_MaxCachingTemplate=\u8BBE\u8BA1\u5668\u6700\u5927\u30AD\u30E3\u30C3\u30B7\u30E5\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306E\u6570\uFF1A +FR-Designer_Preference_CachingTemplateTip=\u8A2D\u7F6E\u30920\u8868\u793A\u6A5F\u80FD\u8BBE\u8BA1\u5668\u9589\u9396;\u518D\u958B\u5F8C\u767A\u52B9\u3059\u308B +FR-Designer_Tab_Style_Template= +FR-Designer_Tab_Template_One= +FR-Designer_Tab_Template_Two= +FR-Designer_Tab_Template_Three= +FR-Designer_Tab_Template_Four= +FR-Designer_Tab_Template_Five= +FR-Designer_Tab_Template_Six= +FR-Designer_Tab_Display_Position= diff --git a/designer_base/src/com/fr/design/locale/designer_ko_KR.properties b/designer_base/src/com/fr/design/locale/designer_ko_KR.properties index a159de118c..f177b3f081 100644 --- a/designer_base/src/com/fr/design/locale/designer_ko_KR.properties +++ b/designer_base/src/com/fr/design/locale/designer_ko_KR.properties @@ -2150,3 +2150,18 @@ FR-Designer_Print_Background= FR-Designer_Env_Des_Https= FR-Designer_Format_JavaScript=Format Code FR-Designer-Vcs_tab_click= +FR-Designer_Move_Up= +FR-Designer_Move_Down= +FR-Designer_Move_To_Top= +FR-Designer_Move_To_Bottom= +FR-Designer_Preference_CachingTemplate=\uD15C\uD50C\uB9BF \uBA54\uBAA8\uB9AC \uCD5C\uC801\uD654 +FR-Designer_Preference_MaxCachingTemplate=\uB514\uC790\uC774\uB108 \uCD5C\uB300 \uCE90\uC2DC \uD15C\uD50C\uB9BF \uAC1C\uC218: +FR-Designer_Preference_CachingTemplateTip=\uC124\uC815 \uC744 0 \uD45C\uC2DC \uB2EB\uAE30 \uC774 \uAE30\uB2A5; \uB2E4\uC2DC \uB514\uC790\uC774\uB108 \uD6C4 \uBC1C\uD6A8\uB41C\uB2E4 +FR-Designer_Tab_Style_Template= +FR-Designer_Tab_Template_One= +FR-Designer_Tab_Template_Two= +FR-Designer_Tab_Template_Three= +FR-Designer_Tab_Template_Four= +FR-Designer_Tab_Template_Five= +FR-Designer_Tab_Template_Six= +FR-Designer_Tab_Display_Position= diff --git a/designer_base/src/com/fr/design/locale/designer_zh_CN.properties b/designer_base/src/com/fr/design/locale/designer_zh_CN.properties index 67a7b7ec5f..ec2887ab1c 100644 --- a/designer_base/src/com/fr/design/locale/designer_zh_CN.properties +++ b/designer_base/src/com/fr/design/locale/designer_zh_CN.properties @@ -2149,4 +2149,19 @@ FR-Designer_Provide_Choose_All= FR-Designer_Decimal_Places= FR-Designer_Env_Des_Https=\u82E5\u542F\u7528https\u6216\u4FEE\u6539https\u914D\u7F6E\uFF08\u8BC1\u4E66\u8DEF\u5F84\u3001https\u79D8\u94A5\uFF09\uFF0C\u5FC5\u987B\u91CD\u542F\u8BBE\u8BA1\u5668\u624D\u80FD\u751F\u6548\u3002 FR-Designer_Format_JavaScript=\u683C\u5F0F\u5316\u4EE3\u7801 -FR-Designer-Vcs_tab_click=\u8BF7\u5148\u9000\u51FA\u7248\u672C\u7BA1\u7406\u72B6\u6001\u518D\u5207\u6362\u6A21\u677F \ No newline at end of file +FR-Designer-Vcs_tab_click=\u8BF7\u5148\u9000\u51FA\u7248\u672C\u7BA1\u7406\u72B6\u6001\u518D\u5207\u6362\u6A21\u677F +FR-Designer_Preference_CachingTemplate=\u6A21\u677F\u5185\u5B58\u4F18\u5316 +FR-Designer_Preference_MaxCachingTemplate=\u8BBE\u8BA1\u5668\u6700\u5927\u7F13\u5B58\u6A21\u677F\u4E2A\u6570\uFF1A +FR-Designer_Preference_CachingTemplateTip=\u8BBE\u7F6E\u4E3A0\u8868\u793A\u5173\u95ED\u8BE5\u529F\u80FD\uFF1B\u91CD\u542F\u8BBE\u8BA1\u5668\u540E\u751F\u6548 +FR-Designer_Move_Up=\u4E0A\u79FB\u4E00\u5C42(F) +FR-Designer_Move_Down=\u4E0B\u79FB\u4E00\u5C42(B) +FR-Designer_Move_To_Top=\u7F6E\u4E8E\u9876\u5C42(T) +FR-Designer_Move_To_Bottom=\u7F6E\u4E8E\u5E95\u5C42(K) +FR-Designer_Tab_Style_Template=\u6837\u5F0F\u6A21\u677F +FR-Designer_Tab_Template_One=\u6A21\u677F\u4E00 +FR-Designer_Tab_Template_Two=\u6A21\u677F\u4E8C +FR-Designer_Tab_Template_Three=\u6A21\u677F\u4E09 +FR-Designer_Tab_Template_Four=\u6A21\u677F\u56DB +FR-Designer_Tab_Template_Five=\u6A21\u677F\u4E94 +FR-Designer_Tab_Template_Six=\u6A21\u677F\u516D +FR-Designer_Tab_Display_Position=\u663E\u793A\u4F4D\u7F6E diff --git a/designer_base/src/com/fr/design/locale/designer_zh_TW.properties b/designer_base/src/com/fr/design/locale/designer_zh_TW.properties index c83ca01dba..f3653ed691 100644 --- a/designer_base/src/com/fr/design/locale/designer_zh_TW.properties +++ b/designer_base/src/com/fr/design/locale/designer_zh_TW.properties @@ -2149,3 +2149,18 @@ FR-Designer_Decimal_Places= FR-Designer_Env_Des_Https=\u82E5\u555F\u7528https\u6216\u4FEE\u6539https\u914D\u7F6E\uFF08\u8B49\u66F8\u8DEF\u5F91\u3001https\u7955\u9470\uFF09\uFF0C\u5FC5\u9808\u91CD\u555F\u8A2D\u8A08\u5668\u624D\u80FD\u751F\u6548\u3002 FR-Designer_Format_JavaScript=Format Code FR-Designer-Vcs_tab_click= +FR-Designer_Preference_CachingTemplate=\u7BC4\u672C\u8A18\u61B6\u9AD4\u512A\u5316 +FR-Designer_Preference_MaxCachingTemplate=\u8A2D\u8A08\u5668\u6700\u5927\u7DE9\u5B58\u7BC4\u672C\u500B\u6578\uFF1A +FR-Designer_Preference_CachingTemplateTip=\u8A2D\u5B9A\u70BA0\u8868\u793A\u95DC\u9589\u8A72\u529F\u80FD\uFF1B\u91CD\u5553\u8A2D\u8A08\u5668\u5F8C\u751F\u6548 +FR-Designer_Move_Up=\u4E0A\u79FB\u4E00\u5C64(F) +FR-Designer_Move_Down=\u4E0B\u79FB\u4E00\u5C64(B) +FR-Designer_Move_To_Top=\u7F6E\u65BC\u9802\u5C64(T) +FR-Designer_Move_To_Bottom=\u7F6E\u65BC\u5E95\u5C64(K) +FR-Designer_Tab_Style_Template=\u6A23\u5F0F\u6A21\u677F +FR-Designer_Tab_Template_One=\u6A21\u677F\u4E00 +FR-Designer_Tab_Template_Two=\u6A21\u677F\u4E8C +FR-Designer_Tab_Template_Three=\u6A21\u677F\u4E09 +FR-Designer_Tab_Template_Four=\u6A21\u677F\u56DB +FR-Designer_Tab_Template_Five=\u6A21\u677F\u4E94 +FR-Designer_Tab_Template_Six=\u6A21\u677F\u516D +FR-Designer_Tab_Display_Position=\u986F\u793A\u4F4D\u7F6E diff --git a/designer_base/src/com/fr/design/mainframe/DesignerFrame.java b/designer_base/src/com/fr/design/mainframe/DesignerFrame.java index e990470ee0..ce330d0261 100644 --- a/designer_base/src/com/fr/design/mainframe/DesignerFrame.java +++ b/designer_base/src/com/fr/design/mainframe/DesignerFrame.java @@ -911,8 +911,6 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta } else { this.addAndActivateJTemplate(jt); } - //REPORT-5084:激活后刷新一下右側面板 - jt.refreshEastPropertiesPane(); } /** diff --git a/designer_base/src/com/fr/design/mainframe/JSliderPane.java b/designer_base/src/com/fr/design/mainframe/JSliderPane.java index d056551399..ff30054b45 100644 --- a/designer_base/src/com/fr/design/mainframe/JSliderPane.java +++ b/designer_base/src/com/fr/design/mainframe/JSliderPane.java @@ -6,6 +6,7 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ibutton.UISliderButton; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.gui.islider.UISlider; import com.fr.design.gui.ispinner.UIBasicSpinner; import com.fr.design.gui.ispinner.UISpinnerUI; @@ -19,11 +20,14 @@ import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.plaf.basic.BasicSliderUI; -import javax.swing.text.BadLocationException; import javax.swing.text.DefaultFormatterFactory; import javax.swing.text.NumberFormatter; import java.awt.*; -import java.awt.event.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.awt.event.MouseEvent; import java.math.BigDecimal; /** @@ -31,25 +35,19 @@ import java.math.BigDecimal; */ public class JSliderPane extends JPanel { + public static final Image APPFIT_V0 = BaseUtils.readImage("com/fr/design/images/control/icon_thumb_normal.png"); private static final double ONEPOINTEIGHT = 1.8; private static final int SIX = 6; private static final int TEN = 10; - private static final int ONE_EIGHT = 18; private static final int FONT_SIZE = 12; private static final int SPINNER_WIDTH = 45; private static final int SPINNER_HEIGHT = 20; private static final int HALF_HUNDRED = 50; private static final int HUNDRED = 100; private static final int TWO_HUNDRED = 200; - private static final int THREE_HUNDRED = 300; private static final int FOUR_HUNDRED = 400; - private static final int DIALOG_WIDTH = 157; - private static final int DIALOG_HEIGHT = 192; - private static final int SLIDER_WIDTH = 220; - private static final int SLIDER_HEIGHT = 20; private static final int SHOWVALBUTTON_WIDTH = 40; private static final int SHOWVALBUTTON_HEIGHTH = 20; - private static final int SLIDER_GAP = 5; private static final int TOOLTIP_Y = 30; private static final Color BACK_COLOR = new Color(245, 245, 247); @@ -405,14 +403,14 @@ public class JSliderPane extends JPanel { dialog = new PopupPane(upButton, dialogContentPanel); if (upButtonX == 0) { upButtonX = btnCoords.x; - GUICoreUtils.showPopupMenu(dialog, upButton, -DIALOG_WIDTH + upButton.getWidth() + SHOWVALBUTTON_WIDTH, -DIALOG_HEIGHT); + GUICoreUtils.showPopupMenu(dialog, upButton, -dialog.getPreferredSize().width + upButton.getWidth() + SHOWVALBUTTON_WIDTH, -dialog.getPreferredSize().height); } } else { if (upButtonX == 0) { upButtonX = btnCoords.x; - GUICoreUtils.showPopupMenu(dialog, upButton, -DIALOG_WIDTH + upButton.getWidth() + SHOWVALBUTTON_WIDTH, -DIALOG_HEIGHT); + GUICoreUtils.showPopupMenu(dialog, upButton, -dialog.getPreferredSize().width + upButton.getWidth() + SHOWVALBUTTON_WIDTH, -dialog.getPreferredSize().height); } else { - GUICoreUtils.showPopupMenu(dialog, upButton, -DIALOG_WIDTH + upButton.getWidth() + SHOWVALBUTTON_WIDTH, -DIALOG_HEIGHT); + GUICoreUtils.showPopupMenu(dialog, upButton, -dialog.getPreferredSize().width + upButton.getWidth() + SHOWVALBUTTON_WIDTH, -dialog.getPreferredSize().height); } } } @@ -433,8 +431,8 @@ public class JSliderPane extends JPanel { class JSliderPaneUI extends BasicSliderUI { private static final Color BACK_COLOR = new Color(245, 245, 247); - private static final int VERTICAL_WIDTH = 11; - private static final int VERTICAL_HEIGHT = 16; + private static final int THUMB_XOFFSET = 8; + private static final int THUMB_YOFFSET = 3; private static final int FOUR = 4; private static final int FIVE = 5; private static final int SIX = 6; @@ -451,13 +449,9 @@ class JSliderPaneUI extends BasicSliderUI { public void paintThumb(Graphics g) { Rectangle knobBounds = thumbRect; - int w = knobBounds.width; - int h = knobBounds.height; Graphics2D g2d = (Graphics2D) g; - - g2d.translate(knobBounds.x, knobBounds.y); - g2d.setColor(new Color(51, 51, 52)); - g2d.fillRoundRect(0, SIX, FOUR, 9, 2, 2); + g2d.drawImage(JSliderPane.APPFIT_V0, knobBounds.x - THUMB_XOFFSET, knobBounds.y + THUMB_YOFFSET, null); + g2d.dispose(); } /** */ @@ -481,11 +475,19 @@ class JSliderPaneUI extends BasicSliderUI { } } + public void setThumbLocation(int x, int y) { + super.setThumbLocation(x, y); + slider.repaint(); + } + } -class PopupPane extends JPopupMenu { +class PopupPane extends UIPopupMenu { + private static final float REC = 8f; + private static final int INSERT_TOPBOTTOM = 10; + private static final int INSERT_LEFTRIGHT = 2; private static final int DIALOG_WIDTH = 157; - private static final int DIALOG_HEIGHT = 192; + private static final int DIALOG_HEIGHT = 205; PopupPane(JButton b, JPanel dialogContentPanel) { this.add(dialogContentPanel, BorderLayout.CENTER); @@ -493,5 +495,7 @@ class PopupPane extends JPopupMenu { this.setBackground(new Color(245, 245, 247)); } - + public Insets getInsets() { + return new Insets(INSERT_TOPBOTTOM, INSERT_LEFTRIGHT, INSERT_TOPBOTTOM, INSERT_LEFTRIGHT); + } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/mainframe/JVirtualTemplate.java b/designer_base/src/com/fr/design/mainframe/JVirtualTemplate.java index 897991a916..4c798d6597 100644 --- a/designer_base/src/com/fr/design/mainframe/JVirtualTemplate.java +++ b/designer_base/src/com/fr/design/mainframe/JVirtualTemplate.java @@ -12,9 +12,8 @@ import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; import com.fr.file.FILE; -import com.fr.file.FileFILE; import com.fr.file.FileNodeFILE; -import com.fr.stable.StableUtils; +import com.fr.stable.OperatingSystem; import com.fr.stable.project.ProjectConstants; import javax.swing.*; @@ -40,7 +39,8 @@ public class JVirtualTemplate extends JTemplate { if (editingFileName.startsWith(ProjectConstants.REPORTLETS_NAME)) { editingFileName = ((FileNodeFILE) getEditingFILE()).getEnvPath() + File.separator + editingFileName; } - return editingFileName.replaceAll("/", "\\\\"); + editingFileName = OperatingSystem.isWindows() ? editingFileName.replaceAll("/", "\\\\") : editingFileName.replaceAll("\\\\", "/"); + return editingFileName; } /** diff --git a/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index 4ad6b67fac..4aee3a024e 100644 --- a/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -180,6 +180,7 @@ public abstract class ToolBarMenuDock { this.menus = menus(plus); for (int i = 0; i < menus.length; i++) { + menus[i].setHasRecMenu(true); UIMenu subMenu = menus[i].createJMenu(); jMenuBar.add(subMenu); menus[i].updateMenu(); diff --git a/designer_base/src/com/fr/design/mainframe/toolbar/UpdateActionManager.java b/designer_base/src/com/fr/design/mainframe/toolbar/UpdateActionManager.java index 845eb3660e..a5651cfbeb 100644 --- a/designer_base/src/com/fr/design/mainframe/toolbar/UpdateActionManager.java +++ b/designer_base/src/com/fr/design/mainframe/toolbar/UpdateActionManager.java @@ -27,12 +27,18 @@ public class UpdateActionManager { this.updateActions = updateActions; } - public boolean isEnable(UpdateAction updateAction) { + /** + * 根据action name获取action对象 + * + * @param name + * @return + */ + public UpdateAction getActionByName(String name) { for (UpdateActionModel action : updateActions) { - if (ComparatorUtils.equals(updateAction.getName(), action.getActionName()) && action.getAction().isEnabled()) { - return true; + if (ComparatorUtils.equals(name, action.getActionName()) && action.getAction().isEnabled()) { + return action.getAction(); } } - return false; + return null; } -} +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/mainframe/widget/accessibles/AccessibleTemplateStyleEditor.java b/designer_base/src/com/fr/design/mainframe/widget/accessibles/AccessibleTemplateStyleEditor.java new file mode 100644 index 0000000000..9e32a4d46a --- /dev/null +++ b/designer_base/src/com/fr/design/mainframe/widget/accessibles/AccessibleTemplateStyleEditor.java @@ -0,0 +1,42 @@ +package com.fr.design.mainframe.widget.accessibles; + +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.general.cardtag.TemplateStyle; +import com.fr.design.mainframe.widget.wrappers.TemplateStyleWrapper; + +import javax.swing.SwingUtilities; +import java.awt.Dimension; + +/** + * Created by kerry on 2017/11/23. + */ +public class AccessibleTemplateStyleEditor extends UneditableAccessibleEditor { + + private static final Dimension DEFAULT_DIMENSION = new Dimension(600, 400); + + private TemplateStylePane stylePane; + + public AccessibleTemplateStyleEditor() { + super(new TemplateStyleWrapper()); + } + + @Override + protected void showEditorPane() { + if (stylePane == null) { + stylePane = new TemplateStylePane(); + stylePane.setPreferredSize(DEFAULT_DIMENSION); + } + BasicDialog dlg = stylePane.showWindow(SwingUtilities.getWindowAncestor(this)); + dlg.addDialogActionListener(new DialogActionAdapter() { + + @Override + public void doOk() { + setValue(stylePane.update()); + fireStateChanged(); + } + }); + stylePane.populate((TemplateStyle) getValue()); + dlg.setVisible(true); + } +} diff --git a/designer_base/src/com/fr/design/mainframe/widget/accessibles/TemplateStylePane.java b/designer_base/src/com/fr/design/mainframe/widget/accessibles/TemplateStylePane.java new file mode 100644 index 0000000000..890e5dc5cf --- /dev/null +++ b/designer_base/src/com/fr/design/mainframe/widget/accessibles/TemplateStylePane.java @@ -0,0 +1,99 @@ +package com.fr.design.mainframe.widget.accessibles; + +import com.fr.general.cardtag.BannerTemplateStyle; +import com.fr.general.cardtag.BookMarkTemplateStyle; +import com.fr.general.cardtag.CardTemplateStyle; +import com.fr.general.cardtag.DefaultTemplateStyle; +import com.fr.general.cardtag.MenuTemplateStyle; +import com.fr.general.cardtag.PentagonTemplateStyle; +import com.fr.general.cardtag.TrapezoidTemplateStyle; +import com.fr.design.dialog.BasicPane; +import com.fr.general.cardtag.TemplateStyle; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.Inter; + +import javax.swing.DefaultListCellRenderer; +import javax.swing.DefaultListModel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.ListCellRenderer; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +/** + * Created by kerry on 2017/11/23. + */ +public class TemplateStylePane extends BasicPane { + private DefaultListModel listModel; + private JList styleList; + private TemplateStylePreviewPane previewPane = new TemplateStylePreviewPane(new DefaultTemplateStyle()); + + public TemplateStylePane(){ + init(); + } + + public void init(){ + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + listModel = new DefaultListModel(); + listModel.addElement(new DefaultTemplateStyle()); + listModel.addElement(new CardTemplateStyle()); + listModel.addElement(new BookMarkTemplateStyle()); + listModel.addElement(new PentagonTemplateStyle()); + listModel.addElement(new MenuTemplateStyle()); + listModel.addElement(new TrapezoidTemplateStyle()); + listModel.addElement(new BannerTemplateStyle()); + styleList = new JList(listModel); + styleList.setCellRenderer(render); + + JPanel westPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); + westPane.add(styleList, BorderLayout.CENTER); + JPanel centerPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); + westPane.setPreferredSize(new Dimension(100, 500)); + centerPane.setPreferredSize(new Dimension(300, 500)); + centerPane.setBorder(GUICoreUtils.createTitledBorder(Inter.getLocText("Preview"), null)); + centerPane.add(previewPane); + styleList.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + previewPane.repaint((TemplateStyle) styleList.getSelectedValue()); + } + }); + this.add(westPane, BorderLayout.WEST); + this.add(centerPane, BorderLayout.CENTER); + } + public static ListCellRenderer render = new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + if (value instanceof TemplateStyle) { + TemplateStyle l = (TemplateStyle) value; + this.setText(l.toString()); + } + return this; + } + }; + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("FR-Designer_Tab_Style_Template"); + } + + public void populate(TemplateStyle templateStyle) { + previewPane.repaint(templateStyle); + for(int i = 0; i< listModel.getSize(); i++){ + if((listModel.getElementAt(i).toString()).equals(templateStyle.toString())){ + styleList.setSelectedIndex(i); + return; + } + } + styleList.setSelectedIndex(0); + } + + public TemplateStyle update() { + return (TemplateStyle) styleList.getSelectedValue(); + } +} diff --git a/designer_base/src/com/fr/design/mainframe/widget/accessibles/TemplateStylePreviewPane.java b/designer_base/src/com/fr/design/mainframe/widget/accessibles/TemplateStylePreviewPane.java new file mode 100644 index 0000000000..4871bfd1d4 --- /dev/null +++ b/designer_base/src/com/fr/design/mainframe/widget/accessibles/TemplateStylePreviewPane.java @@ -0,0 +1,37 @@ +package com.fr.design.mainframe.widget.accessibles; + +import com.fr.base.BaseUtils; +import com.fr.general.cardtag.TemplateStyle; + +import javax.swing.JPanel; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; + +/** + * Created by kerry on 2017/12/11. + */ +public class TemplateStylePreviewPane extends JPanel { + + private static final int WIDTH = 540; + private static final int HEIGHT = 500; + + private TemplateStyle templateStyle; + + public TemplateStylePreviewPane(TemplateStyle templateStyle){ + this.templateStyle = templateStyle; + } + + public void repaint (TemplateStyle templateStyle){ + this.templateStyle = templateStyle; + super.repaint(); + } + + @Override + public void paint(Graphics g) { + super.paint(g); + Graphics2D g2d = (Graphics2D) g.create(); + Image image = BaseUtils.readImage(templateStyle.getPreview()); + g2d.drawImage(image, 0, 0, WIDTH, HEIGHT, null); + } +} diff --git a/designer_base/src/com/fr/design/mainframe/widget/wrappers/TemplateStyleWrapper.java b/designer_base/src/com/fr/design/mainframe/widget/wrappers/TemplateStyleWrapper.java new file mode 100644 index 0000000000..bcdf195f0b --- /dev/null +++ b/designer_base/src/com/fr/design/mainframe/widget/wrappers/TemplateStyleWrapper.java @@ -0,0 +1,29 @@ +package com.fr.design.mainframe.widget.wrappers; + +import com.fr.design.Exception.ValidationException; +import com.fr.design.designer.properties.Decoder; +import com.fr.design.designer.properties.Encoder; +import com.fr.stable.StringUtils; + +/** + * Created by kerry on 2017/11/23. + */ +public class TemplateStyleWrapper implements Encoder, Decoder { + @Override + public String encode(Object v) { + if (v == null) { + return StringUtils.EMPTY; + } + return v.toString(); + } + + @Override + public Object decode(String txt) { + return null; + } + + @Override + public void validate(String txt) throws ValidationException { + + } +} diff --git a/designer_base/src/com/fr/design/menu/MenuDef.java b/designer_base/src/com/fr/design/menu/MenuDef.java index 00dd2ff3ae..bc5e3a8b71 100644 --- a/designer_base/src/com/fr/design/menu/MenuDef.java +++ b/designer_base/src/com/fr/design/menu/MenuDef.java @@ -2,10 +2,7 @@ package com.fr.design.menu; import com.fr.base.BaseUtils; import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.imenu.UIMenu; -import com.fr.design.gui.imenu.UIPopupEastAttrMenu; -import com.fr.design.gui.imenu.UIPopupMenu; -import com.fr.design.gui.imenu.UIScrollMenu; +import com.fr.design.gui.imenu.*; import com.fr.design.gui.iscrollbar.UIScrollBar; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.StringUtils; @@ -41,6 +38,7 @@ public class MenuDef extends ShortCut { protected UIButton createdButton; protected JPopupMenu popupMenu; private boolean hasScrollSubMenu; + private boolean isHeadMenu; private String anchor; @@ -88,6 +86,10 @@ public class MenuDef extends ShortCut { this.hasScrollSubMenu = scrollSubMenu; } + public void setHasRecMenu(boolean headMenu) { + this.isHeadMenu = headMenu; + } + public String getIconPath() { return iconPath; } @@ -186,6 +188,8 @@ public class MenuDef extends ShortCut { if (createdJMenu == null) { if (hasScrollSubMenu) { createdJMenu = new UIScrollMenu(this.getName()); + } else if (isHeadMenu){ + createdJMenu = new UIHeadMenu(this.getName()); } else { createdJMenu = new UIMenu(this.getName()); } diff --git a/designer_base/src/com/fr/design/utils/ThemeUtils.java b/designer_base/src/com/fr/design/utils/ThemeUtils.java index 9f012f2ee2..56060edb65 100644 --- a/designer_base/src/com/fr/design/utils/ThemeUtils.java +++ b/designer_base/src/com/fr/design/utils/ThemeUtils.java @@ -13,7 +13,7 @@ import java.awt.*; */ public class ThemeUtils { public static final ColorUIResource NORMAL_FOREGROUND = new ColorUIResource(0, 0, 0); - public static final ColorUIResource TEXT_SELECTED_BG_COLOR = new ColorUIResource(43, 107, 197); + public static final ColorUIResource TEXT_SELECTED_BG_COLOR = new ColorUIResource(65, 155, 249); public static final ColorUIResource TEXT_SELECTED_TEXT_COLOR = new ColorUIResource(255, 255, 255); public static final ColorUIResource NORMAL_BG = new ColorUIResource(212, 212, 216); public static final ColorUIResource DISABLE_TEXT = new ColorUIResource(143, 142, 139); diff --git a/designer_base/src/com/fr/design/utils/gui/GUIPaintUtils.java b/designer_base/src/com/fr/design/utils/gui/GUIPaintUtils.java index 286e44cd69..fcff66e07f 100644 --- a/designer_base/src/com/fr/design/utils/gui/GUIPaintUtils.java +++ b/designer_base/src/com/fr/design/utils/gui/GUIPaintUtils.java @@ -5,6 +5,7 @@ import com.fr.design.constants.UIConstants; import com.fr.stable.Constants; import java.awt.*; +import java.awt.geom.GeneralPath; import java.awt.geom.RoundRectangle2D; public class GUIPaintUtils { @@ -202,4 +203,40 @@ public class GUIPaintUtils { g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); } + /** + * 自定义popMenu画法,一种下面两圆角矩形 + * + */ + public static final Shape paintShape(Graphics2D g2, float width, float height, float REC) { + REC = REC / 2; + float recdir = (float) (REC - (REC / Math.sqrt(2))); + GeneralPath gp1 = new GeneralPath(); + gp1.moveTo(0f, 0f); + gp1.lineTo(width, 0f); + gp1.lineTo(width, height - REC); + gp1.quadTo(width - recdir, height - recdir, width - REC, height); + gp1.lineTo(REC, height); + gp1.quadTo(recdir, height - recdir, 0, height - REC); + gp1.closePath(); + return gp1; + } + + /** + * 自定义popMenu边框画法,一种下面两圆角矩形 + * + */ + public static final void paintShapeBorder(Graphics2D g2, int x, int y, int width, int height, int rec) { + g2.setColor(UIConstants.UIPOPUPMENU_LINE_COLOR); + width = width - 1; + height = height - 1; + rec = rec / 2; + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + g2.drawLine(x, y, x + width, y); + g2.drawLine(x + width, y, x + width, y + height - rec); + g2.drawArc(x + width - (rec / 2), y + height - (rec / 2), rec / 2, rec / 2, 0, 90); + g2.drawLine(x + width - rec, y + height, x + rec, y + height); + g2.drawArc(x - (rec / 2), y + height - (rec / 2), rec / 2, rec / 2, 0, 90); + g2.drawLine(x, y + height - rec, x, y); + } + } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/widget/WidgetBoundsPaneFactory.java b/designer_base/src/com/fr/design/widget/WidgetBoundsPaneFactory.java index 8092fc5e84..2d0fe314b0 100644 --- a/designer_base/src/com/fr/design/widget/WidgetBoundsPaneFactory.java +++ b/designer_base/src/com/fr/design/widget/WidgetBoundsPaneFactory.java @@ -9,8 +9,11 @@ import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.general.Inter; -import javax.swing.*; -import java.awt.*; +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import java.awt.BorderLayout; +import java.awt.Component; /** * Created by plough on 2017/8/7. @@ -69,4 +72,21 @@ public class WidgetBoundsPaneFactory { boundsPane.add(centerPanel, BorderLayout.CENTER); return new UIExpandablePane(Inter.getLocText("FR-Designer_Coords_And_Size"), 230, 24, boundsPane); } + + + public static UIExpandablePane createCardTagBoundPane(UISpinner width) { + JPanel boundsPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + double f = TableLayout.FILL; + double p = TableLayout.PREFERRED; + Component[][] components = new Component[][]{ + new Component[]{new UILabel(Inter.getLocText("FR-Designer-Widget_Size")), width}, + }; + double[] rowSize = {p}; + double[] columnSize = {p, f}; + int[][] rowCount = {{1, 1}}; + final JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L6); + panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); + boundsPane.add(panel); + return new UIExpandablePane(Inter.getLocText("FR-Designer_Coords_And_Size"), 280, 24, boundsPane); + } } diff --git a/designer_form/src/com/fr/design/designer/beans/actions/FormDeleteAction.java b/designer_form/src/com/fr/design/designer/beans/actions/FormDeleteAction.java index 58c30543c7..6678200cfd 100644 --- a/designer_form/src/com/fr/design/designer/beans/actions/FormDeleteAction.java +++ b/designer_form/src/com/fr/design/designer/beans/actions/FormDeleteAction.java @@ -5,7 +5,7 @@ package com.fr.design.designer.beans.actions; import java.awt.event.KeyEvent; -import javax.swing.KeyStroke; +import javax.swing.*; import com.fr.base.BaseUtils; import com.fr.general.Inter; @@ -19,44 +19,45 @@ import com.fr.design.mainframe.FormSelection; */ public class FormDeleteAction extends FormUndoableAction { - public FormDeleteAction(FormDesigner t) { - super(t); - - this.setName(Inter.getLocText("M_Edit-Delete")); - this.setMnemonic('D'); - // Richie:删除菜单图标 - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_report/delete.png")); - this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0)); - } - - /** - * 删除 - * - * @return 是否删除成功 - */ - @Override - public boolean executeActionReturnUndoRecordNeeded() { - FormDesigner designer = getEditingComponent(); - if (designer == null) { - return false; - } - FormSelection selection = designer.getSelectionModel().getSelection(); - XCreator creator = selection.getSelectedCreator(); - designer.getSelectionModel().deleteSelection(); - - creator.deleteRelatedComponent(creator, designer); - return false; - } - - @Override - public void update() { -// FormDesigner f = this.getEditingComponent(); -// if (f == null) { -// this.setEnabled(false); -// return; -// } -// SelectionModel selection = f.getSelectionModel(); -// this.setEnabled(selection.hasSelectionComponent()); - this.setEnabled(true); - } + public FormDeleteAction(FormDesigner t) { + super(t); + + this.setName(Inter.getLocText("M_Edit-Delete")); + this.setMnemonic('D'); + // Richie:删除菜单图标 + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_report/delete.png")); + this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0)); + } + + @Override + public JComponent createToolBarComponent() { + JComponent comp = super.createToolBarComponent(); + // 除了 BACKSPACE 之外,DELETE 键也要能删除(直接在此处添加绑定,没有按钮提示) + comp.registerKeyboardAction(this, KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW); + return comp; + } + + /** + * 删除 + * + * @return 是否删除成功 + */ + @Override + public boolean executeActionReturnUndoRecordNeeded() { + FormDesigner designer = getEditingComponent(); + if (designer == null) { + return false; + } + FormSelection selection = designer.getSelectionModel().getSelection(); + XCreator creator = selection.getSelectedCreator(); + designer.getSelectionModel().deleteSelection(); + + creator.deleteRelatedComponent(creator, designer); + return false; + } + + @Override + public void update() { + this.setEnabled(true); + } } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/beans/actions/MoveDownAction.java b/designer_form/src/com/fr/design/designer/beans/actions/MoveDownAction.java new file mode 100644 index 0000000000..95cde265df --- /dev/null +++ b/designer_form/src/com/fr/design/designer/beans/actions/MoveDownAction.java @@ -0,0 +1,59 @@ +package com.fr.design.designer.beans.actions; + +import com.fr.base.BaseUtils; +import com.fr.design.designer.beans.events.DesignerEvent; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.FormSelection; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; + +import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; + +/** + * 下移一层(控件树内) + * Created by plough on 2017/12/4. + */ + +public class MoveDownAction extends FormEditAction { + + public MoveDownAction(FormDesigner t) { + super(t); + this.setName(Inter.getLocText("FR-Designer_Move_Down")); + this.setMnemonic('B'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/down.png")); + this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_OPEN_BRACKET, DEFAULT_MODIFIER)); + } + + @Override + public boolean executeActionReturnUndoRecordNeeded() { + FormDesigner designer = getEditingComponent(); + if (designer == null) { + return false; + } + FormSelection selection = designer.getSelectionModel().getSelection(); + XCreator creator = selection.getSelectedCreator(); + Container container = creator.getParent(); + int targetIndex = container.getComponentZOrder(creator) + 1; + if (targetIndex >= container.getComponentCount()) { + return false; + } + container.setComponentZOrder(creator, targetIndex); + designer.getEditListenerTable().fireCreatorModified(creator, DesignerEvent.CREATOR_DELETED); + return true; + } + + @Override + public void update() { + FormDesigner designer = getEditingComponent(); + if (designer == null) { + this.setEnabled(false); + return; + } + this.setEnabled(designer.isCurrentComponentMovableDown()); + } +} \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/beans/actions/MoveToBottomAction.java b/designer_form/src/com/fr/design/designer/beans/actions/MoveToBottomAction.java new file mode 100644 index 0000000000..9fc69953b8 --- /dev/null +++ b/designer_form/src/com/fr/design/designer/beans/actions/MoveToBottomAction.java @@ -0,0 +1,60 @@ +package com.fr.design.designer.beans.actions; + +import com.fr.base.BaseUtils; +import com.fr.design.designer.beans.events.DesignerEvent; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.FormSelection; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; + +import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; + +/** + * 置于底层(控件树内) + * Created by plough on 2017/12/4. + */ + +public class MoveToBottomAction extends FormEditAction { + + public MoveToBottomAction(FormDesigner t) { + super(t); + this.setName(Inter.getLocText("FR-Designer_Move_To_Bottom")); + this.setMnemonic('K'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/to_bottom.png")); + this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_OPEN_BRACKET, DEFAULT_MODIFIER + InputEvent.ALT_MASK)); + } + + @Override + public boolean executeActionReturnUndoRecordNeeded() { + FormDesigner designer = getEditingComponent(); + if (designer == null) { + return false; + } + FormSelection selection = designer.getSelectionModel().getSelection(); + XCreator creator = selection.getSelectedCreator(); + Container container = creator.getParent(); + int targetIndex = container.getComponentCount() - 1; + if (container.getComponentZOrder(creator) >= targetIndex) { + return false; + } + container.setComponentZOrder(creator, targetIndex); + designer.getEditListenerTable().fireCreatorModified(creator, DesignerEvent.CREATOR_DELETED); + return true; + } + + + @Override + public void update() { + FormDesigner designer = getEditingComponent(); + if (designer == null) { + this.setEnabled(false); + return; + } + this.setEnabled(designer.isCurrentComponentMovableDown()); + } +} \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/beans/actions/MoveToTopAction.java b/designer_form/src/com/fr/design/designer/beans/actions/MoveToTopAction.java new file mode 100644 index 0000000000..47be1b9f2a --- /dev/null +++ b/designer_form/src/com/fr/design/designer/beans/actions/MoveToTopAction.java @@ -0,0 +1,59 @@ +package com.fr.design.designer.beans.actions; + +import com.fr.base.BaseUtils; +import com.fr.design.designer.beans.events.DesignerEvent; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.FormSelection; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; + +import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; + +/** + * 置于顶层(控件树内) + * Created by plough on 2017/12/4. + */ + +public class MoveToTopAction extends FormEditAction { + + public MoveToTopAction(FormDesigner t) { + super(t); + this.setName(Inter.getLocText("FR-Designer_Move_To_Top")); + this.setMnemonic('T'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/to_top.png")); + this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_CLOSE_BRACKET, DEFAULT_MODIFIER + InputEvent.ALT_MASK)); + } + + @Override + public boolean executeActionReturnUndoRecordNeeded() { + FormDesigner designer = getEditingComponent(); + if (designer == null) { + return false; + } + FormSelection selection = designer.getSelectionModel().getSelection(); + XCreator creator = selection.getSelectedCreator(); + Container container = creator.getParent(); + if (container.getComponentZOrder(creator) == 0) { + return false; + } + container.setComponentZOrder(creator, 0); + designer.getEditListenerTable().fireCreatorModified(creator, DesignerEvent.CREATOR_DELETED); + return true; + } + + @Override + public void update() { + FormDesigner designer = getEditingComponent(); + if (designer == null) { + this.setEnabled(false); + return; + } + this.setEnabled(designer.isCurrentComponentMovableUp()); + } + +} \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/beans/actions/MoveUpAction.java b/designer_form/src/com/fr/design/designer/beans/actions/MoveUpAction.java new file mode 100644 index 0000000000..512b075d9b --- /dev/null +++ b/designer_form/src/com/fr/design/designer/beans/actions/MoveUpAction.java @@ -0,0 +1,59 @@ +package com.fr.design.designer.beans.actions; + +import com.fr.base.BaseUtils; +import com.fr.design.designer.beans.events.DesignerEvent; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.FormSelection; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.KeyEvent; + +import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; + +/** + * 同级上移一层(控件树内) + * Created by plough on 2017/12/4. + */ + +public class MoveUpAction extends FormEditAction { + + public MoveUpAction(FormDesigner t) { + super(t); + this.setName(Inter.getLocText("FR-Designer_Move_Up")); + this.setMnemonic('F'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/up.png")); + this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_CLOSE_BRACKET, DEFAULT_MODIFIER)); + } + + @Override + public boolean executeActionReturnUndoRecordNeeded() { + FormDesigner designer = getEditingComponent(); + if (designer == null) { + return false; + } + FormSelection selection = designer.getSelectionModel().getSelection(); + XCreator creator = selection.getSelectedCreator(); + Container container = creator.getParent(); + int targetIndex = container.getComponentZOrder(creator) - 1; + if (targetIndex < 0) { + return false; + } + container.setComponentZOrder(creator, targetIndex); + designer.getEditListenerTable().fireCreatorModified(creator, DesignerEvent.CREATOR_DELETED); + return true; + } + + @Override + public void update() { + FormDesigner designer = getEditingComponent(); + if (designer == null) { + this.setEnabled(false); + return; + } + this.setEnabled(designer.isCurrentComponentMovableUp()); + } + +} \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRBorderLayoutAdapter.java b/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRBorderLayoutAdapter.java index a819090ff2..7ebc872025 100644 --- a/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRBorderLayoutAdapter.java +++ b/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRBorderLayoutAdapter.java @@ -4,6 +4,7 @@ import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; +import com.fr.design.designer.creator.cardlayout.XWCardTagLayout; import com.fr.general.ComparatorUtils; import com.fr.design.designer.beans.ConstraintsGroupModel; import com.fr.design.designer.beans.HoverPainter; @@ -35,6 +36,9 @@ public class FRBorderLayoutAdapter extends AbstractLayoutAdapter { * @param creator 组件 */ public void fix(XCreator creator) { + if(creator.acceptType(XWCardTagLayout.class)){ + creator = (XCreator) creator.getParent(); + } FRBorderLayout layout = (FRBorderLayout)container.getFRLayout(); Object constraints = layout.getConstraints(creator); if (ComparatorUtils.equals(constraints, BorderLayout.NORTH)) { diff --git a/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java b/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java index c293042927..f818c1ee1d 100644 --- a/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java +++ b/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java @@ -13,6 +13,7 @@ import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.designer.creator.cardlayout.XWCardLayout; import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; +import com.fr.design.designer.creator.cardlayout.XWCardTitleLayout; import com.fr.design.designer.creator.cardlayout.XWTabFitLayout; import com.fr.design.designer.properties.FRFitLayoutConstraints; import com.fr.design.designer.properties.FRFitLayoutPropertiesGroupModel; @@ -20,10 +21,13 @@ import com.fr.design.utils.ComponentUtils; import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.container.WAbsoluteLayout; import com.fr.form.ui.container.WLayout; +import com.fr.form.ui.container.WTabDisplayPosition; import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; import com.fr.general.ComparatorUtils; -import java.awt.*; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Rectangle; import java.util.ArrayList; import java.util.List; @@ -281,9 +285,22 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter { backupBound.y -= rec.y; XWCardLayout cardLayout = mainLayout.getCardPart(); LayoutBorderStyle style = cardLayout.toData().getBorderStyle(); + XWCardTitleLayout xwCardTitleLayout = mainLayout.getTitlePart(); + Dimension titleDimension = xwCardTitleLayout.getSize(); + // 当tab布局为标题样式时,才需要处理标题栏高度产生的影响 if (ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)) { - backupBound.y -= WCardMainBorderLayout.TAB_HEIGHT; + WTabDisplayPosition wTabDisplayPosition = xwCardTitleLayout.getDisplayPosition(); + switch (wTabDisplayPosition){ + case TOP_POSITION: + backupBound.y -= titleDimension.height; + break; + case LEFT_POSITION: + backupBound.x -= titleDimension.width; + break; + default: + return backupBound; + } } return backupBound; } diff --git a/designer_form/src/com/fr/design/designer/beans/events/DesignerEvent.java b/designer_form/src/com/fr/design/designer/beans/events/DesignerEvent.java index 715f6e3e7b..d9b32b360c 100644 --- a/designer_form/src/com/fr/design/designer/beans/events/DesignerEvent.java +++ b/designer_form/src/com/fr/design/designer/beans/events/DesignerEvent.java @@ -23,6 +23,8 @@ public class DesignerEvent { public static final int CREATOR_RENAMED = 8; + public static final int CREATOR_ORDER_CHANGED = 9; + private int eventID; private XComponent affectedXCreator; diff --git a/designer_form/src/com/fr/design/designer/beans/models/SelectionModel.java b/designer_form/src/com/fr/design/designer/beans/models/SelectionModel.java index e805ced3ca..850b737a36 100644 --- a/designer_form/src/com/fr/design/designer/beans/models/SelectionModel.java +++ b/designer_form/src/com/fr/design/designer/beans/models/SelectionModel.java @@ -62,13 +62,16 @@ public class SelectionModel { * @param e 鼠标事件 */ public void selectACreatorAtMouseEvent(MouseEvent e) { - if (!InputEventBaseOnOS.isControlDown(e) && !e.isShiftDown()) { + if (e.getButton() == MouseEvent.BUTTON3 || (!InputEventBaseOnOS.isControlDown(e) && !e.isShiftDown())) { // 如果Ctrl或者Shift键盘没有按下,则清除已经选择的组件 selection.reset(); } // 获取e所在的组件 XCreator comp = designer.getComponentAt(e); + selectACreator(comp); + } + public void selectACreator(XCreator comp) { //布局组件的顶层布局如不可编辑,要获取其顶层布局 XLayoutContainer topLayout = XCreatorUtils.getHotspotContainer(comp).getTopLayout(); if (topLayout != null && !topLayout.isEditable()) { @@ -78,7 +81,9 @@ public class SelectionModel { // 如果父层是scale和title两个专属容器,返回其父层,组件本身是不让被选中的 if (comp != designer.getRootComponent() && comp != designer.getParaComponent()) { XCreator parentContainer = (XCreator) comp.getParent(); - comp = parentContainer.isDedicateContainer() ? parentContainer : comp; + if (parentContainer != null) { + comp = parentContainer.isDedicateContainer() ? parentContainer : comp; + } } if (selection.removeSelectedCreator(comp) || selection.addSelectedCreator(comp)) { designer.getEditListenerTable().fireCreatorModified(comp, DesignerEvent.CREATOR_SELECTED); diff --git a/designer_form/src/com/fr/design/designer/beans/painters/FRBorderLayoutPainter.java b/designer_form/src/com/fr/design/designer/beans/painters/FRBorderLayoutPainter.java index eeac7593f6..2fb2f10f2b 100644 --- a/designer_form/src/com/fr/design/designer/beans/painters/FRBorderLayoutPainter.java +++ b/designer_form/src/com/fr/design/designer/beans/painters/FRBorderLayoutPainter.java @@ -18,6 +18,9 @@ public class FRBorderLayoutPainter extends AbstractPainter { @Override public void paint(Graphics g, int startX, int startY) { + if(hotspot_bounds == null){ + return; + } super.paint(g, startX, startY); int x = hotspot.x; int y = hotspot.y; diff --git a/designer_form/src/com/fr/design/designer/creator/XChartEditor.java b/designer_form/src/com/fr/design/designer/creator/XChartEditor.java index 8e108ec945..260697355d 100644 --- a/designer_form/src/com/fr/design/designer/creator/XChartEditor.java +++ b/designer_form/src/com/fr/design/designer/creator/XChartEditor.java @@ -76,6 +76,11 @@ public class XChartEditor extends XBorderStyleWidgetCreator { return true; } + @Override + public void stopEditing() { + isEditing = false; + } + /** * 得到属性名 * @return 属性名 @@ -201,7 +206,8 @@ public class XChartEditor extends XBorderStyleWidgetCreator { public void respondClick(EditingMouseListener editingMouseListener,MouseEvent e){ FormDesigner designer = editingMouseListener.getDesigner(); SelectionModel selectionModel = editingMouseListener.getSelectionModel(); - isEditing = e.getClickCount() == 2 || designer.getCursor().getType() == Cursor.HAND_CURSOR; + isEditing = e.getButton() == MouseEvent.BUTTON1 && + (e.getClickCount() == 2 || designer.getCursor().getType() == Cursor.HAND_CURSOR); displayCoverPane(!isEditing); selectionModel.selectACreatorAtMouseEvent(e); diff --git a/designer_form/src/com/fr/design/designer/creator/XCreator.java b/designer_form/src/com/fr/design/designer/creator/XCreator.java index b46d9d2335..ed234b62ab 100644 --- a/designer_form/src/com/fr/design/designer/creator/XCreator.java +++ b/designer_form/src/com/fr/design/designer/creator/XCreator.java @@ -4,11 +4,13 @@ package com.fr.design.designer.creator; import com.fr.base.BaseUtils; +import com.fr.design.actions.UpdateAction; import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.ComponentAdapter; import com.fr.design.designer.beans.events.DesignerEditor; import com.fr.design.designer.beans.models.SelectionModel; import com.fr.design.fun.WidgetPropertyUIProvider; +import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.*; import com.fr.design.utils.gui.LayoutUtils; @@ -47,8 +49,9 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo private Rectangle backupBound; private String shareId = StringUtils.EMPTY;//如果组件是共享的会有这个属性 private boolean isHelpBtnOnFocus = false;//焦点是否在帮助按钮上 + private static final int SHORTS_SEPARATOR_POS = 4; // 弹出菜单分割的位置 - public XCreator(Widget ob, Dimension initSize) { + public XCreator(Widget ob, Dimension initSize) { this.data = ob; this.initEditor(); @@ -653,7 +656,39 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo * */ public void firePropertyChange(){ + // do nothing + } + + /** + * 有的控件是有编辑状态的,给一个退出编辑的接口 + * + */ + public void stopEditing() { + // do nothing + } + /** + * 创建右击弹出菜单 + * + */ + public JPopupMenu createPopupMenu(FormDesigner formDesigner) { + UpdateAction[] actions = formDesigner.getActions(); + JPopupMenu popup = new UIPopupMenu(); + for (int i = 0; i < actions.length; i++) { + if (i == SHORTS_SEPARATOR_POS) { + popup.addSeparator(); + } + popup.add(actions[i].createMenuItem()); + } + return popup; } + /** + * 是否支持上移一层、下移一层等操作 + * + */ + public boolean isMovable() { + return true; + } + } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java b/designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java index 7a041ef4f0..3d289a009c 100644 --- a/designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java +++ b/designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java @@ -237,6 +237,9 @@ public class XCreatorUtils { Container c = creator.getParent(); while (c != null) { XCreator crea = (XCreator) c; + if(crea.acceptType(XWCardTitleLayout.class)){ + return (XLayoutContainer) c.getParent(); + } if (crea.isDedicateContainer()) { return (XLayoutContainer) c.getParent(); } diff --git a/designer_form/src/com/fr/design/designer/creator/XElementCase.java b/designer_form/src/com/fr/design/designer/creator/XElementCase.java index 75c2bb80d0..8ecb2b62ab 100644 --- a/designer_form/src/com/fr/design/designer/creator/XElementCase.java +++ b/designer_form/src/com/fr/design/designer/creator/XElementCase.java @@ -122,7 +122,11 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme if (editor.getFitStateInPC() == 0) { editor.setReportFitAttr(null); } - ReportFitAttrProvider reportFitAttr = editor.getReportFitAttr() == null ? fitAttr : editor.getReportFitAttr(); + ReportFitAttrProvider reportFit = editor.getReportFitAttr(); + if(fitAttr != null){ + reportFit = fitAttr.fitInBrowser() ? editor.getReportFitAttr() : fitAttr; + } + ReportFitAttrProvider reportFitAttr = editor.getReportFitAttr() == null ? fitAttr : reportFit; PropertyDescriptor[] extraEditor = processor.createPropertyDescriptor(this.data.getClass(), reportFitAttr); if (editor.getReportFitAttr() == null) { editor.setReportFitInPc(processor.getFitStateInPC(fitAttr)); @@ -302,7 +306,8 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme private void switchTab(MouseEvent e,EditingMouseListener editingMouseListener){ FormDesigner designer = editingMouseListener.getDesigner(); - if (e.getClickCount() == 2 || designer.getCursor().getType() == Cursor.HAND_CURSOR){ + if (e.getButton() == MouseEvent.BUTTON1 && + (e.getClickCount() == 2 || designer.getCursor().getType() == Cursor.HAND_CURSOR)){ FormElementCaseContainerProvider component = (FormElementCaseContainerProvider) designer.getComponentAt(e); //切换设计器 designer.switchTab(component); diff --git a/designer_form/src/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java b/designer_form/src/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java index 895eaf0310..1c389230b6 100644 --- a/designer_form/src/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java @@ -107,5 +107,9 @@ public class XWAbsoluteBodyLayout extends XWAbsoluteLayout { initStyle(); } + @Override + public boolean isMovable() { + return false; + } } diff --git a/designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java b/designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java index 852cdf1220..58c5f74dda 100644 --- a/designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java @@ -467,7 +467,8 @@ public class XWAbsoluteLayout extends XLayoutContainer { public void respondClick(EditingMouseListener editingMouseListener, MouseEvent e) { FormDesigner designer = editingMouseListener.getDesigner(); SelectionModel selectionModel = editingMouseListener.getSelectionModel(); - boolean isEditing = isEditable() || designer.getCursor().getType() == Cursor.HAND_CURSOR || e.getClickCount() == 2; + boolean isEditing = isEditable() || + e.getButton() == MouseEvent.BUTTON1 && (designer.getCursor().getType() == Cursor.HAND_CURSOR || e.getClickCount() == 2); setEditable(isEditing); selectionModel.selectACreatorAtMouseEvent(e); diff --git a/designer_form/src/com/fr/design/designer/creator/XWFitLayout.java b/designer_form/src/com/fr/design/designer/creator/XWFitLayout.java index 7e0600ba44..712a8588d1 100644 --- a/designer_form/src/com/fr/design/designer/creator/XWFitLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/XWFitLayout.java @@ -1180,5 +1180,9 @@ public class XWFitLayout extends XLayoutContainer { public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() { return new WidgetPropertyUIProvider[]{ new BodyMobilePropertyUI(this)}; } - + + @Override + public boolean isMovable() { + return false; + } } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/creator/XWHorizontalBoxLayout.java b/designer_form/src/com/fr/design/designer/creator/XWHorizontalBoxLayout.java index 5844c9abda..215f11325b 100644 --- a/designer_form/src/com/fr/design/designer/creator/XWHorizontalBoxLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/XWHorizontalBoxLayout.java @@ -8,8 +8,7 @@ import java.awt.Dimension; import java.awt.event.ContainerEvent; import com.fr.design.designer.beans.LayoutAdapter; -import com.fr.design.designer.beans.adapters.layout.FRHorizontalLayoutAdapter; -import com.fr.design.designer.beans.location.Direction; +import com.fr.design.form.layout.FRFlowLayout; import com.fr.design.form.layout.FRHorizontalLayout; import com.fr.form.ui.Widget; import com.fr.form.ui.container.WHorizontalBoxLayout; @@ -20,6 +19,16 @@ import com.fr.form.ui.container.WHorizontalBoxLayout; */ public class XWHorizontalBoxLayout extends XLayoutContainer { + public FRFlowLayout getFrFlowLayout() { + return frFlowLayout; + } + + public void setFrFlowLayout(FRFlowLayout frFlowLayout) { + this.frFlowLayout = frFlowLayout; + } + + private FRFlowLayout frFlowLayout ; + public XWHorizontalBoxLayout(WHorizontalBoxLayout widget, Dimension initSize) { super(widget, initSize); } @@ -46,7 +55,8 @@ public class XWHorizontalBoxLayout extends XLayoutContainer { @Override protected void initLayoutManager() { - this.setLayout(new FRHorizontalLayout(toData().getAlignment(), toData().getHgap(), toData().getVgap())); + this.frFlowLayout = new FRHorizontalLayout(toData().getAlignment(), toData().getHgap(), toData().getVgap()); + this.setLayout(frFlowLayout); } @Override @@ -60,7 +70,7 @@ public class XWHorizontalBoxLayout extends XLayoutContainer { for (int i = 0, count = this.getComponentCount(); i < count; i++) { if (creator == this.getComponent(i)) { wlayout.addWidget(wgt, i); - wlayout.setWidthAtWidget(wgt, creator.getWidth()); + frFlowLayout.componentAdded(e, wlayout); } } this.recalculateChildrenPreferredSize(); @@ -70,7 +80,7 @@ public class XWHorizontalBoxLayout extends XLayoutContainer { protected Dimension calculatePreferredSize(Widget wgt) { // 注意这里计算PreferredSize的时候需要取当前容器的实际大小 // 高度是自适应的,直接就写成0了 - return new Dimension(this.toData().getWidthAtWidget(wgt), 0); + return frFlowLayout.calculatePreferredSize(this.toData(), wgt); } // 在添加的时候需要把可拉伸的方向确定,所以重写了add方法 @@ -80,13 +90,12 @@ public class XWHorizontalBoxLayout extends XLayoutContainer { if (comp == null) { return null; } - XCreator creator = (XCreator) comp; - creator.setDirections(new int[]{Direction.LEFT, Direction.RIGHT}); + frFlowLayout.setDirections(comp); return comp; } @Override public LayoutAdapter getLayoutAdapter() { - return new FRHorizontalLayoutAdapter(this); + return frFlowLayout.getLayoutAdapter(this); } } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/creator/XWParameterLayout.java b/designer_form/src/com/fr/design/designer/creator/XWParameterLayout.java index a158dc753d..84011c9c41 100644 --- a/designer_form/src/com/fr/design/designer/creator/XWParameterLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/XWParameterLayout.java @@ -227,4 +227,9 @@ public class XWParameterLayout extends XWAbsoluteLayout { } + @Override + public boolean isMovable() { + return false; + } + } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/creator/cardlayout/XCardAddButton.java b/designer_form/src/com/fr/design/designer/creator/cardlayout/XCardAddButton.java index 85e26e877c..2de9bbac4c 100644 --- a/designer_form/src/com/fr/design/designer/creator/cardlayout/XCardAddButton.java +++ b/designer_form/src/com/fr/design/designer/creator/cardlayout/XCardAddButton.java @@ -1,6 +1,9 @@ package com.fr.design.designer.creator.cardlayout; -import java.awt.*; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; import java.awt.event.MouseEvent; import javax.swing.Icon; @@ -106,7 +109,7 @@ public class XCardAddButton extends XButton{ FormHierarchyTreePane.getInstance().refreshRoot(); //将焦点切换到新增的tab对应的tabfitLayout上 showNewTab(editingMouseListener,index); - + tagLayout.setTabsAndAdjust(); LayoutUtils.layoutRootContainer(designer.getRootComponent()); } @@ -151,7 +154,6 @@ public class XCardAddButton extends XButton{ titleButton.setCustomStyle(true); titleButton.setShowButton(true); showButton.setBackupParent(tagLayout); - this.tagLayout.setCurrentCard(titleButton); this.tagLayout.setTabFitIndex(index); this.tagLayout.add(showButton); diff --git a/designer_form/src/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java b/designer_form/src/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java index 04e678029c..294ff0ab15 100644 --- a/designer_form/src/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java +++ b/designer_form/src/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java @@ -4,13 +4,12 @@ package com.fr.design.designer.creator.cardlayout; import com.fr.base.BaseUtils; -import com.fr.base.GraphHelper; -import com.fr.base.ScreenResolution; import com.fr.base.background.ColorBackground; import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.ComponentAdapter; import com.fr.design.designer.beans.models.SelectionModel; import com.fr.design.designer.creator.XButton; +import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.gui.ilable.UILabel; @@ -23,17 +22,26 @@ import com.fr.design.utils.gui.LayoutUtils; import com.fr.form.ui.CardSwitchButton; import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.WidgetTitle; +import com.fr.form.ui.container.WTabTextDirection; +import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.form.ui.container.cardlayout.WTabFitLayout; import com.fr.general.Background; +import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; import com.fr.general.Inter; -import javax.swing.*; -import java.awt.*; +import javax.swing.Action; +import javax.swing.Icon; +import javax.swing.JOptionPane; +import javax.swing.JPopupMenu; +import javax.swing.SwingUtilities; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.geom.Rectangle2D; -import java.util.HashMap; -import java.util.Map; /** * @@ -65,8 +73,6 @@ public class XCardSwitchButton extends XButton { // tab按钮里的字体因为按钮内部的布局看起来比正常的要小,加个调整量 private static final int FONT_SIZE_ADJUST = 2; - private static final int SIDE_OFFSET = 57; - private XWCardLayout cardLayout; private XWCardTagLayout tagLayout; @@ -118,6 +124,7 @@ public class XCardSwitchButton extends XButton { public XCardSwitchButton(CardSwitchButton widget, Dimension initSize) { super(widget, initSize); + } public XCardSwitchButton(CardSwitchButton widget, Dimension initSize, @@ -180,7 +187,6 @@ public class XCardSwitchButton extends XButton { ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, this); editingMouseListener.startEditing(this, adapter.getDesignerEditor(), adapter); } - setTabsAndAdjust(); if(SwingUtilities.isRightMouseButton(e)){ showPopupMenu(editingMouseListener, e, index, maxIndex); } @@ -211,7 +217,7 @@ public class XCardSwitchButton extends XButton { private void deleteCard(XCardSwitchButton button,int index){ String titleName = button.getContentLabel().getText(); int value = JOptionPane.showConfirmDialog(null, Inter.getLocText("FR-Designer_ConfirmDialog_Content") + "“" + titleName + "”", - Inter.getLocText("FR-Designer_ConfirmDialog_Title"),JOptionPane.YES_NO_OPTION); + Inter.getLocText("FR-Designer_ConfirmDialog_Title"), JOptionPane.YES_NO_OPTION); if (value != JOptionPane.OK_OPTION) { return; } @@ -296,7 +302,6 @@ public class XCardSwitchButton extends XButton { public void paintComponent(Graphics g) { super.paintComponent(g); - setTabsAndAdjust(); Graphics2D g2d = (Graphics2D) g; drawBackground(); drawTitle(); @@ -334,7 +339,22 @@ public class XCardSwitchButton extends XButton { //画标题 private void drawTitle() { CardSwitchButton button = (CardSwitchButton) this.toData(); - this.setButtonText(button.getText()); + String titleText = button.getText(); + if(tagLayout != null){ + WCardTagLayout wCardTagLayout = (WCardTagLayout) tagLayout.toData(); + StringBuilder titleString = new StringBuilder(); + //竖向处理 + if(ComparatorUtils.equals(wCardTagLayout.getTextDirection(), WTabTextDirection.TEXT_VER_DIRECTION)){ + titleString.append(""); + for(int i = 0; i < titleText.length(); i++){ + titleString.append(titleText.charAt(i)).append("
"); + } + titleString.append(""); + titleText = titleString.toString(); + } + } + + this.setButtonText(titleText); if (this.cardLayout == null) { initRelateLayout(this); } @@ -383,64 +403,37 @@ public class XCardSwitchButton extends XButton { public XLayoutContainer getTopLayout() { return this.getBackupParent().getTopLayout(); } - - public void setTabsAndAdjust() { - if (this.tagLayout == null) { - return; - } - int tabLength = this.tagLayout.getComponentCount(); - Map cardWidth = new HashMap<>(); - Map cardHeight = new HashMap<>(); - for (int i = 0; i < tabLength; i++) { - XCardSwitchButton temp = (XCardSwitchButton) this.tagLayout.getComponent(i); - CardSwitchButton tempCard = (CardSwitchButton) temp.toData(); - String tempText = tempCard.getText(); - Font f = tempCard.getFont(); - FontMetrics fm = GraphHelper.getFontMetrics(f); - cardWidth.put(i,fm.stringWidth(tempText)); - cardHeight.put(i,fm.getHeight()); - } - adjustTabs(tabLength, cardWidth, cardHeight); - } - - public void adjustTabs(int tabLength, Map width, Map height) { - if (width == null) { - return; - } - int tempX = 0; - for (int i = 0; i < tabLength; i++) { - Rectangle rectangle = this.tagLayout.getComponent(i).getBounds(); - Integer cardWidth = width.get(i) + SIDE_OFFSET; - //先用这边的固定高度 - Integer cardHeight = DEFAULT_BUTTON_HEIGHT; - rectangle.setSize(cardWidth, cardHeight); - rectangle.setBounds(tempX, 0, cardWidth, cardHeight); - tempX += cardWidth; - this.tagLayout.getComponent(i).setBounds(rectangle); - Dimension dimension = new Dimension(); - dimension.setSize(cardWidth, cardHeight); - XCardSwitchButton temp = (XCardSwitchButton) this.tagLayout.getComponent(i); - CardSwitchButton cardSwitchButton = (CardSwitchButton) temp.toData(); - FRFont frFont = cardSwitchButton.getFont(); - UILabel label = temp.getContentLabel(); - label.setSize(dimension); - label.setFont(frFont.applyResolutionNP(ScreenResolution.getScreenResolution())); - label.setForeground(frFont.getForeground()); - temp.setContentLabel(label); - temp.setSize(dimension); - temp.setPreferredSize(new Dimension(cardWidth, cardHeight)); - } - } - + + @Override public void doLayout() { super.doLayout(); - setTabsAndAdjust(); } + + /** + * 控件树里需要隐藏xwcardmainLayout,返回其子组件xwcardLayout; + * 标题样式下,this.getComponent(1)==xwcardLayout + * 标准样式下,this.getComponent(0)==xwcardLayout + * @return 子组件xwcardLayout + */ + @Override + public XCreator getXCreator() { + //根据index获取对应的tabFitLayout + int index = ((CardSwitchButton) this.toData()).getIndex(); + return (XCreator) cardLayout.getComponent(index); + } + + @Override protected void initXCreatorProperties() { super.initXCreatorProperties(); label = this.getContentLabel(); } + + public void firePropertyChange() { + super.firePropertyChange(); + tagLayout.setTabsAndAdjust(); + repaint(); + } } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardLayout.java b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardLayout.java index 4c54efd4aa..6beadc2920 100644 --- a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardLayout.java @@ -8,7 +8,11 @@ import com.fr.design.designer.beans.LayoutAdapter; import com.fr.design.designer.beans.adapters.layout.FRCardLayoutAdapter; import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.beans.models.SelectionModel; -import com.fr.design.designer.creator.*; +import com.fr.design.designer.creator.CRPropertyDescriptor; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XCreatorUtils; +import com.fr.design.designer.creator.XLayoutContainer; +import com.fr.design.designer.creator.XWidgetCreator; import com.fr.design.form.layout.FRCardLayout; import com.fr.design.form.util.XCreatorConstants; import com.fr.design.mainframe.FormDesigner; @@ -16,7 +20,11 @@ import com.fr.design.mainframe.WidgetPropertyPane; import com.fr.design.mainframe.widget.editors.BooleanEditor; import com.fr.design.mainframe.widget.editors.CardTagWLayoutBorderStyleEditor; import com.fr.design.mainframe.widget.editors.DoubleEditor; -import com.fr.form.ui.*; +import com.fr.form.ui.CardAddButton; +import com.fr.form.ui.CardSwitchButton; +import com.fr.form.ui.LayoutBorderStyle; +import com.fr.form.ui.Widget; +import com.fr.form.ui.WidgetTitle; import com.fr.form.ui.container.WBorderLayout; import com.fr.form.ui.container.WCardLayout; import com.fr.form.ui.container.WLayout; @@ -30,7 +38,9 @@ import com.fr.stable.Constants; import com.fr.stable.core.PropertyChangeAdapter; import javax.swing.border.Border; -import java.awt.*; +import java.awt.CardLayout; +import java.awt.Color; +import java.awt.Dimension; import java.awt.event.ContainerEvent; import java.beans.IntrospectionException; @@ -67,7 +77,7 @@ public class XWCardLayout extends XLayoutContainer { * */ public String createDefaultName() { - return "tabpane"; + return "cardlayout"; } /** @@ -146,10 +156,12 @@ public class XWCardLayout extends XLayoutContainer { //主结构是一个borderlayout, 标签部分是north, card部分为center WCardMainBorderLayout border = new WCardMainBorderLayout(); XWCardMainBorderLayout xMainBorder = new XWCardMainBorderLayout(border, dimension); + //将子WCardBorder的style设置到父容器上 + LayoutBorderStyle style = (this.toData()).getBorderStyle(); + border.setBorderStyle(style); this.setBackupParent(xMainBorder); - XWCardTitleLayout titlePart = this.initTitlePart(widgetName, xMainBorder); - xMainBorder.addTitlePart(titlePart); + xMainBorder.addTitlePart(titlePart, WBorderLayout.NORTH); return xMainBorder; } @@ -188,7 +200,7 @@ public class XWCardLayout extends XLayoutContainer { private XWCardTagLayout initTagPart(String widgetName, XWCardTitleLayout xTitle){ Dimension dimension = new Dimension(); //放置标题的tab流式布局 - WCardTagLayout tagLayout = new WCardTagLayout(); + WCardTagLayout tagLayout = new WCardTagLayout("tabpane" + widgetName.replaceAll(createDefaultName(), "")); XWCardTagLayout xTag = new XWCardTagLayout(tagLayout, dimension, this); xTag.setBackupParent(xTitle); diff --git a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java index 8f60672eca..70ed5984d5 100644 --- a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java @@ -1,5 +1,5 @@ /** - * + * */ package com.fr.design.designer.creator.cardlayout; @@ -15,25 +15,31 @@ import com.fr.design.mainframe.EditingMouseListener; import com.fr.design.mainframe.FormDesigner; import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget; import com.fr.form.ui.container.WBorderLayout; +import com.fr.form.ui.container.WTabDisplayPosition; import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; import com.fr.general.IOUtils; -import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget; import com.fr.general.Inter; - -import java.awt.*; +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Component; +import java.awt.Composite; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.ArrayList; /** * card布局主体框架 - * + * * * * @date: 2014-12-9-下午9:59:31 */ public class XWCardMainBorderLayout extends XWBorderLayout{ - + private static final int CENTER = 1; private static final int NORTH = 0; public static final Color DEFAULT_BORDER_COLOR = new Color(210,210,210); @@ -43,7 +49,7 @@ public class XWCardMainBorderLayout extends XWBorderLayout{ private static final int EDIT_BTN_WIDTH = 60; private static final int EDIT_BTN_HEIGHT = 24; - + /** * 构造函数 */ @@ -53,38 +59,54 @@ public class XWCardMainBorderLayout extends XWBorderLayout{ /** * 获取当前组件里的控件 - * + * * @return 控件 - * + * * * @date 2014-12-10-下午1:46:33 - * + * */ public WCardMainBorderLayout toData() { return (WCardMainBorderLayout) super.toData(); } - + /** * 添加标题区域 - * + * * @param title 标题区域 - * + * * * @date 2014-12-10-下午1:50:56 - * + * */ - public void addTitlePart(XWCardTitleLayout title){ - this.add(title, WBorderLayout.NORTH); + public void addTitlePart(XWCardTitleLayout title, String position){ + toData().setTabPosition(position); + this.add(title, position); } - + + public void add(Component comp, String position) { + super.add(comp, position); + } + + /** + * 切换到非添加状态 + * + * @return designer 表单设计器 + */ + public void stopAddingState(FormDesigner designer){ + designer.stopAddingState(); + return; + } + + /** * 添加card区域 - * + * * @param card card区域 - * + * * * @date 2014-12-10-下午1:50:37 - * + * */ public void addCardPart(XWCardLayout card){ this.add(card, WBorderLayout.CENTER); @@ -93,11 +115,17 @@ public class XWCardMainBorderLayout extends XWBorderLayout{ public XWCardLayout getCardPart(){ return this.getComponentCount() == TITLE_STYLE ? (XWCardLayout)this.getComponent(CENTER) : (XWCardLayout)this.getComponent(NORTH); } - + public XWCardTitleLayout getTitlePart(){ + Component[] components = this.getComponents(); + for(Component component : components){ + if(component instanceof XWCardTitleLayout){ + return (XWCardTitleLayout)component; + } + } return (XWCardTitleLayout)this.getComponent(NORTH); } - + /** * 控件树里需要隐藏xwcardmainLayout,返回其子组件xwcardLayout; * 标题样式下,this.getComponent(1)==xwcardLayout @@ -106,15 +134,9 @@ public class XWCardMainBorderLayout extends XWBorderLayout{ */ @Override public XCreator getXCreator() { - switch(this.getComponentCount()){ - case TITLE_STYLE: - return (XCreator)this.getComponent(TITLE_STYLE-1); - case NORMAL_STYLE: - return (XCreator)this.getComponent(NORMAL_STYLE-1); - default: - return this; - } + return this; } + /** * 控件树不显示此组件 * @param path 控件树list @@ -122,7 +144,7 @@ public class XWCardMainBorderLayout extends XWBorderLayout{ public void notShowInComponentTree(ArrayList path) { path.remove(LAYOUT_INDEX); } - + @Override public ArrayList getTargetChildrenList() { ArrayList tabLayoutList = new ArrayList(); @@ -133,7 +155,7 @@ public class XWCardMainBorderLayout extends XWBorderLayout{ } return tabLayoutList; } - + /** * 重新调整子组件的宽度 * @param width 宽度 @@ -164,7 +186,7 @@ public class XWCardMainBorderLayout extends XWBorderLayout{ } } } - + /** * 重新调整子组件的高度 * @param height 高度 @@ -198,7 +220,7 @@ public class XWCardMainBorderLayout extends XWBorderLayout{ tabLayout.adjustCreatorsHeight(percent); } } - + } public void paint(Graphics g) { @@ -246,7 +268,8 @@ public class XWCardMainBorderLayout extends XWBorderLayout{ public void respondClick(EditingMouseListener editingMouseListener,MouseEvent e){ FormDesigner designer = editingMouseListener.getDesigner(); SelectionModel selectionModel = editingMouseListener.getSelectionModel(); - boolean isEditing = designer.getCursor().getType() == Cursor.HAND_CURSOR || e.getClickCount() == 2; + boolean isEditing = e.getButton() == MouseEvent.BUTTON1 && + (designer.getCursor().getType() == Cursor.HAND_CURSOR || e.getClickCount() == 2); setEditable(isEditing); selectionModel.selectACreatorAtMouseEvent(e); @@ -274,4 +297,35 @@ public class XWCardMainBorderLayout extends XWBorderLayout{ return this; } } + + /** + * data属性改变触发其他操作 + * + */ + public void firePropertyChange(){ + getCardPart().initStyle(); + } + + + public void resetTabDisplayPosition(WTabDisplayPosition wTabDisplayPosition){ + XWCardTitleLayout xwCardTitleLayout = getTitlePart(); + xwCardTitleLayout.resetNewBtnPosition(wTabDisplayPosition); + switch (wTabDisplayPosition){ + case TOP_POSITION: + this.addTitlePart(getTitlePart(),WBorderLayout.NORTH); + break; + case LEFT_POSITION: + this.addTitlePart(getTitlePart(),WBorderLayout.WEST); + break; + case BOTTOM_POSITION: + this.addTitlePart(getTitlePart(),WBorderLayout.SOUTH); + break; + case RIGHT_POSITION: + this.addTitlePart(getTitlePart(),WBorderLayout.EAST); + break; + default: + break; + } + this.addCardPart((XWCardLayout)this.getComponent(0)); + } } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java index 114ce3240c..b91953e11f 100644 --- a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java @@ -3,26 +3,47 @@ */ package com.fr.design.designer.creator.cardlayout; +import java.awt.Component; import java.awt.Dimension; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Rectangle; import java.awt.event.ContainerEvent; import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import javax.swing.border.Border; +import com.fr.base.GraphHelper; +import com.fr.base.ScreenResolution; import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.ComponentAdapter; +import com.fr.design.designer.beans.LayoutAdapter; +import com.fr.design.designer.beans.adapters.layout.FRHorizontalLayoutAdapter; +import com.fr.design.designer.beans.adapters.layout.FRVerticalLayoutAdapter; import com.fr.design.designer.beans.models.SelectionModel; +import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XWHorizontalBoxLayout; import com.fr.design.designer.creator.XWidgetCreator; +import com.fr.design.form.layout.FRFlowLayout; +import com.fr.design.form.layout.FRHorizontalLayout; +import com.fr.design.form.layout.FRVerticalLayout; +import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.EditingMouseListener; import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.WidgetPropertyPane; import com.fr.form.ui.CardSwitchButton; import com.fr.form.ui.Widget; import com.fr.form.ui.container.WCardLayout; +import com.fr.form.ui.container.WTabDisplayPosition; import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.form.ui.container.cardlayout.WTabFitLayout; +import com.fr.general.ComparatorUtils; +import com.fr.general.FRFont; /** * @date: 2014-11-25-下午3:11:14 @@ -39,6 +60,12 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { private int tabFitIndex = 0; private CardSwitchButton currentCard; + private static final int WIDTH_SIDE_OFFSET = 57; + + private static final int HEIGHT_SIDE_OFFSET = 20; + + private static final int DEFAULT_BUTTON_HEIGHT = 40; + public CardSwitchButton getCurrentCard() { return currentCard; } @@ -75,14 +102,14 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { public XWCardTagLayout(WCardTagLayout widget, Dimension initSize) { super(widget, initSize); + initLayoutManager(); } /** * 构造函数 */ public XWCardTagLayout(WCardTagLayout widget, Dimension initSize, XWCardLayout cardLayout) { - super(widget, initSize); - + this(widget, initSize); this.cardLayout = cardLayout; } @@ -109,19 +136,20 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { WTabFitLayout fitLayout = new WTabFitLayout(widgetName, tabFitIndex, currentCard); fitLayout.setTabNameIndex(getTabNameIndex()); XWTabFitLayout tabFitLayout = new XWTabFitLayout(fitLayout, new Dimension()); + tabFitLayout.setxCardSwitchButton((XCardSwitchButton)this.getComponent(0)); tabFitLayout.setBackupParent(cardLayout); cardLayout.add(tabFitLayout, widgetName); this.cardLayout.toData().setShowIndex(index); cardLayout.showCard(); } + private void initCardLayout() { XWCardTitleLayout titleLayout = (XWCardTitleLayout) this.getBackupParent(); XWCardMainBorderLayout borderLayout = (XWCardMainBorderLayout) titleLayout.getBackupParent(); this.cardLayout = borderLayout.getCardPart(); } - /** * 将WLayout转换为XLayoutContainer */ @@ -132,6 +160,7 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { for (int i = 0; i < layout.getWidgetCount(); i++) { Widget wgt = layout.getWidget(i); if (wgt != null) { + initLayoutManager(); XWidgetCreator comp = (XWidgetCreator) XCreatorUtils.createXCreator(wgt, calculatePreferredSize(wgt)); this.add(comp, i); comp.setBackupParent(this); @@ -140,6 +169,10 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { isRefreshing = false; } + public String createDefaultName() { + return "tabpane"; + } + /** * 切换到非添加状态 * @@ -195,15 +228,9 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { FormDesigner designer = editingMouseListener.getDesigner(); SelectionModel selectionModel = editingMouseListener.getSelectionModel(); - XWCardTitleLayout titleLayout = (XWCardTitleLayout) this.getBackupParent(); - if (titleLayout != null) { - XWCardMainBorderLayout mainLayout = (XWCardMainBorderLayout) titleLayout.getBackupParent(); - if (mainLayout != null) { - XWCardLayout cardLayout = mainLayout.getCardPart(); - selectionModel.setSelectedCreator(cardLayout); - } + if (e.getClickCount() <= 1) { + selectionModel.selectACreatorAtMouseEvent(e); } - if (editingMouseListener.stopEditing()) { if (this != designer.getRootComponent()) { ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, this); @@ -212,8 +239,198 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { } } + public int[] getDirections() { + return ((XCreator)getParent()).getDirections(); + } + + public Rectangle getBounds() { + return this.getParent().getBounds(); + } + @Override public XLayoutContainer getTopLayout() { return this.getBackupParent().getTopLayout(); } + + public void notShowInComponentTree(ArrayList path) { + path.remove(0); + } + + + @Override + public void doLayout() { + //设置布局 + super.doLayout(); + } + + @Override + protected void initLayoutManager() { + FRFlowLayout frFlowLayout; + if (isHori()) { + frFlowLayout = new FRHorizontalLayout(((WCardTagLayout)toData()).getAlignment(), toData().getHgap(), toData().getVgap()); + }else{ + frFlowLayout = new FRVerticalLayout(((WCardTagLayout)toData()).getAlignment(), toData().getHgap(), toData().getVgap()); + } + this.setFrFlowLayout(frFlowLayout); + this.setLayout(frFlowLayout); + } + + + @Override + public LayoutAdapter getLayoutAdapter() { + if (isHori()) { + return new FRHorizontalLayoutAdapter(this); + }else{ + return new FRVerticalLayoutAdapter(this); + } + + } + + private boolean isHori(){ + WTabDisplayPosition displayPosition = ((WCardTagLayout)this.toData()).getDisplayPosition(); + if(displayPosition == null){ + displayPosition = WTabDisplayPosition.TOP_POSITION; + } + return ComparatorUtils.equals(displayPosition, WTabDisplayPosition.TOP_POSITION) || ComparatorUtils.equals(displayPosition, WTabDisplayPosition.BOTTOM_POSITION); + } + + + /** + * data属性改变触发其他操作 + * + */ + public void firePropertyChange() { + WCardTagLayout wCardTagLayout = (WCardTagLayout) this.toData(); + ((XWCardMainBorderLayout) getTopLayout()).resetTabDisplayPosition(wCardTagLayout.getDisplayPosition()); + //重置内部组件的大小和位置 + initLayoutManager(); + setTabsAndAdjust(); + repaint(); + } + + + public void setTabsAndAdjust() { + WCardTagLayout wCardTagLayout = (WCardTagLayout)this.toData(); + int tabLength = this.getComponentCount(); + Map cardWidth = new HashMap<>(); + Map cardHeight = new HashMap<>(); + for (int i = 0; i < tabLength; i++) { + XCardSwitchButton temp = (XCardSwitchButton) this.getComponent(i); + CardSwitchButton tempCard = (CardSwitchButton) temp.toData(); + String tempText = tempCard.getText(); + Font f = tempCard.getFont(); + FontMetrics fm = GraphHelper.getFontMetrics(f); + + switch (wCardTagLayout.getTextDirection()){ + case TEXT_HORI_DERECTION: + cardWidth.put(i,fm.stringWidth(tempText)); + cardHeight.put(i,fm.getHeight()); + break; + case TEXT_VER_DIRECTION: + int perHeight = fm.getHeight(); + int wordCount = tempText.length(); + if(tempText.length() !=0 ){ + cardWidth.put(i,fm.stringWidth(tempText)/tempText.length()); + }else { + cardWidth.put(i, 0); + } + cardHeight.put(i,(perHeight+3)*wordCount); + break; + default: + break; + } + } + if(isHori()){ + adjustTabsH(tabLength, cardWidth, cardHeight); + }else { + adjustTabsV(tabLength, cardWidth, cardHeight); + } + } + + public void adjustTabsH(int tabLength, Map width, Map height) { + if (width == null) { + return; + } + //调整XWCardTagLayout的高度 + int tempX = 0; + int maxHeight = DEFAULT_BUTTON_HEIGHT; + for (int i = 0; i < tabLength; i++) { + + Rectangle rectangle = this.getComponent(i).getBounds(); + Integer cardWidth = width.get(i) + WIDTH_SIDE_OFFSET; + Integer cardHeight = height.get(i)+ HEIGHT_SIDE_OFFSET ; + if(cardHeight < DEFAULT_BUTTON_HEIGHT){ + cardHeight = DEFAULT_BUTTON_HEIGHT; + } + maxHeight = maxHeight > cardHeight ? maxHeight : cardHeight ; + rectangle.setBounds(tempX, 0, cardWidth, cardHeight); + tempX += cardWidth; + XCardSwitchButton temp = (XCardSwitchButton) this.getComponent(i); + setTabBtnSize(cardWidth, cardHeight, temp); + } + + FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); + XLayoutContainer parent = this.getBackupParent(); + Rectangle parentBounds = new Rectangle(parent.getBounds()); + parentBounds.height = maxHeight; + parent.setBounds(parentBounds); + LayoutAdapter layoutAdapter = AdapterBus.searchLayoutAdapter(formDesigner, parent); + if (layoutAdapter != null) { + parent.setBackupBound(parent.getBounds()); + layoutAdapter.fix(parent); + } + } + + public void setTabBtnSize(int cardWidth, int cardHeight, XCardSwitchButton temp){ + Dimension dimension = new Dimension(); + dimension.setSize(cardWidth, cardHeight); + CardSwitchButton cardSwitchButton = (CardSwitchButton) temp.toData(); + FRFont frFont = cardSwitchButton.getFont(); + UILabel label = temp.getContentLabel(); + label.setSize(dimension); + label.setFont(frFont.applyResolutionNP(ScreenResolution.getScreenResolution())); + label.setForeground(frFont.getForeground()); + temp.setContentLabel(label); + temp.setSize(dimension); + temp.setPreferredSize(new Dimension(cardWidth, cardHeight)); + } + + + public void adjustTabsV(int tabLength, Map width, Map height) { + if (width == null) { + return; + } + int tempY = 0; + int maxWidth = DEFAULT_BUTTON_HEIGHT; + for (int i = 0; i < tabLength; i++) { + Rectangle rectangle = this.getComponent(i).getBounds(); + Integer cardWidth = width.get(i) + WIDTH_SIDE_OFFSET; + maxWidth = maxWidth > cardWidth ? maxWidth : cardWidth; + //先用这边的固定高度 + Integer cardHeight = height.get(i) + HEIGHT_SIDE_OFFSET; + + if(cardWidth < DEFAULT_BUTTON_HEIGHT){ + cardWidth = DEFAULT_BUTTON_HEIGHT; + } + if(cardHeight < DEFAULT_BUTTON_HEIGHT){ + cardHeight = DEFAULT_BUTTON_HEIGHT; + } + rectangle.setBounds(0, tempY, cardWidth, cardHeight); + tempY += cardHeight; + XCardSwitchButton temp = (XCardSwitchButton) this.getComponent(i); + setTabBtnSize(cardWidth, cardHeight, temp); + } + + FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); + XLayoutContainer parent = this.getBackupParent(); + Rectangle parentBounds = new Rectangle(parent.getBounds()); + parentBounds.width = maxWidth; + parent.setBounds(parentBounds); + LayoutAdapter layoutAdapter = AdapterBus.searchLayoutAdapter(formDesigner, parent); + if (layoutAdapter != null) { + parent.setBackupBound(parent.getBounds()); + layoutAdapter.fix(parent); + } + } + } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java index 1514ed4034..d835012038 100644 --- a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java @@ -11,6 +11,7 @@ import javax.swing.border.Border; import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.ComponentAdapter; import com.fr.design.designer.beans.models.SelectionModel; +import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XWBorderLayout; @@ -19,6 +20,8 @@ import com.fr.design.mainframe.EditingMouseListener; import com.fr.design.mainframe.FormDesigner; import com.fr.form.ui.Widget; import com.fr.form.ui.container.WBorderLayout; +import com.fr.form.ui.container.WTabDisplayPosition; +import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.form.ui.container.cardlayout.WCardTitleLayout; /** @@ -43,6 +46,11 @@ public class XWCardTitleLayout extends XWBorderLayout { public XWCardTitleLayout(WCardTitleLayout widget, Dimension initSize) { super(widget, initSize); } + + + public WTabDisplayPosition getDisplayPosition(){ + return ((WCardTagLayout)this.getTagPart().toData()).getDisplayPosition(); + } /** * 将WLayout转换为XLayoutContainer @@ -102,6 +110,29 @@ public class XWCardTitleLayout extends XWBorderLayout { public void addNewButton(XCardAddButton addBtn){ this.add(addBtn, WBorderLayout.EAST); } + + public void resetNewBtnPosition(WTabDisplayPosition wTabDisplayPosition){ + XCardAddButton xCardAddButton = (XCardAddButton) this.getComponent(0); + switch (wTabDisplayPosition){ + case TOP_POSITION: + this.add(xCardAddButton, WBorderLayout.EAST); + break; + case LEFT_POSITION: + this.add(xCardAddButton, WBorderLayout.SOUTH); + break; + case BOTTOM_POSITION: + this.add(xCardAddButton, WBorderLayout.EAST); + break; + case RIGHT_POSITION: + this.add(xCardAddButton, WBorderLayout.SOUTH); + break; + default: + break; + } + //需要重新添加一次保证组件顺序不变(重新初始化CardTagLayout改变内部布局) + XWCardTagLayout xwCardTagLayout = (XWCardTagLayout) this.getComponent(0); + this.addTagPart(xwCardTagLayout); + } /** * 切换到非添加状态 @@ -134,10 +165,8 @@ public class XWCardTitleLayout extends XWBorderLayout { FormDesigner designer = editingMouseListener.getDesigner(); SelectionModel selectionModel = editingMouseListener.getSelectionModel(); - XWCardMainBorderLayout mainLayout = (XWCardMainBorderLayout) this.getBackupParent(); - if(mainLayout != null){ - XWCardLayout cardLayout = mainLayout.getCardPart(); - selectionModel.setSelectedCreator(cardLayout); + if (e.getClickCount() <= 1) { + selectionModel.selectACreatorAtMouseEvent(e); } if (editingMouseListener.stopEditing()) { @@ -152,4 +181,15 @@ public class XWCardTitleLayout extends XWBorderLayout { public XLayoutContainer getTopLayout() { return this.getBackupParent().getTopLayout(); } + + public String createDefaultName() { + return "tabpane"; + } + + + @Override + public XCreator getXCreator() { + return (XCreator)this.getComponent(1); + } + } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java index 42011c3063..415d1637ad 100644 --- a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java @@ -1,5 +1,6 @@ package com.fr.design.designer.creator.cardlayout; +import com.fr.base.GraphHelper; import com.fr.base.background.ColorBackground; import com.fr.design.designer.beans.LayoutAdapter; import com.fr.design.designer.beans.adapters.layout.FRTabFitLayoutAdapter; @@ -37,6 +38,9 @@ import java.beans.IntrospectionException; public class XWTabFitLayout extends XWFitLayout { private static final int MIN_SIZE = 1; + + private static final int WIDTH_SIDE_OFFSET = 57; + // tab布局在拖拽导致的缩放里(含间隔时),如果拖拽宽高大于组件宽高,会导致调整的时候找不到原来的组件 // 这里先将拖拽之前的宽高先做备份 private static final Color NORMAL_GRAL = new Color(236,236,236); @@ -539,6 +543,15 @@ public class XWTabFitLayout extends XWFitLayout { public void firePropertyChange(){ checkButonType(); + //根据字体长度设置tab宽度 + setCardSwitchBtnSize(); + XWCardLayout cardLayout = (XWCardLayout) this.getBackupParent(); + XWCardMainBorderLayout mainLayout = (XWCardMainBorderLayout) cardLayout.getBackupParent(); + XWCardTitleLayout titleLayout = mainLayout.getTitlePart(); +// //放置tab按钮的tagLayout + XWCardTagLayout tagLayout = titleLayout.getTagPart(); + tagLayout.setTabsAndAdjust(); + initialBackground = ((WTabFitLayout) data).getInitialBackground(); overBackground = ((WTabFitLayout) data).getOverBackground(); clickBackground = ((WTabFitLayout)data).getClickBackground(); @@ -554,4 +567,14 @@ public class XWTabFitLayout extends XWFitLayout { cardSwitchButton.setClickBackground(clickBackground); } } + + public void setCardSwitchBtnSize(){ + CardSwitchButton cardSwitchButton = (CardSwitchButton) xCardSwitchButton.toData(); + Font f = cardSwitchButton.getFont(); + FontMetrics fm = GraphHelper.getFontMetrics(f); + int width = fm.stringWidth(cardSwitchButton.getText())+ WIDTH_SIDE_OFFSET; + xCardSwitchButton.setPreferredSize(new Dimension(width, xCardSwitchButton.getHeight())); + } + + } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java b/designer_form/src/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java index 103b372bc0..8ba77b8168 100644 --- a/designer_form/src/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java +++ b/designer_form/src/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java @@ -6,6 +6,7 @@ import java.awt.Dimension; import javax.swing.Icon; import com.fr.design.constants.UIConstants; +import com.fr.design.designer.creator.cardlayout.XWCardLayout; import com.fr.design.gui.ilable.UILabel; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellRenderer; @@ -23,7 +24,14 @@ public class ComponentTreeCellRenderer extends DefaultTreeCellRenderer { boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); if (value instanceof XCreator) { - setText(((XCreator) value).toData().getWidgetName()); + String name = ((XCreator) value).toData().getWidgetName(); + //树节点上不显示此控件 + if(value instanceof XWCardLayout){ + this.setSize(new Dimension(0, 0)); + this.setPreferredSize(new Dimension(0, 0)); + return this; + } + setText(name); Icon icon = XCreatorUtils.getCreatorIcon((XCreator) value); if (icon != null) { setIcon(icon); @@ -36,7 +44,7 @@ public class ComponentTreeCellRenderer extends DefaultTreeCellRenderer { dim.height += 2; this.setSize(dim); this.setPreferredSize(dim); - this.setBackgroundNonSelectionColor(UIConstants.NORMAL_BACKGROUND); + this.setBackgroundNonSelectionColor(UIConstants.TREE_BACKGROUND); return this; } diff --git a/designer_form/src/com/fr/design/form/layout/FRFlowLayout.java b/designer_form/src/com/fr/design/form/layout/FRFlowLayout.java index 8c048f8d56..b06a6d6eb5 100644 --- a/designer_form/src/com/fr/design/form/layout/FRFlowLayout.java +++ b/designer_form/src/com/fr/design/form/layout/FRFlowLayout.java @@ -1,10 +1,16 @@ package com.fr.design.form.layout; +import com.fr.design.designer.beans.LayoutAdapter; +import com.fr.design.designer.creator.XWHorizontalBoxLayout; +import com.fr.form.ui.Widget; +import com.fr.form.ui.container.WHorizontalBoxLayout; + import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Insets; import java.awt.LayoutManager; +import java.awt.event.ContainerEvent; public abstract class FRFlowLayout implements LayoutManager, FRLayoutManager, java.io.Serializable { @@ -52,6 +58,24 @@ public abstract class FRFlowLayout implements LayoutManager, FRLayoutManager, ja protected abstract void moveComponents(Container target, Insets insets, int total); + public void componentAdded(ContainerEvent e, WHorizontalBoxLayout wlayout){ + + } + + public Dimension calculatePreferredSize(WHorizontalBoxLayout wlayout, Widget widget){ + return new Dimension(); + } + + public void setDirections(Component component){ + + } + + public abstract LayoutAdapter getLayoutAdapter(XWHorizontalBoxLayout xwHorizontalBoxLayout) ; + + public void adjustComponents(Component component){ + + } + @Override public void addLayoutComponent(String name, Component comp) { diff --git a/designer_form/src/com/fr/design/form/layout/FRHorizontalLayout.java b/designer_form/src/com/fr/design/form/layout/FRHorizontalLayout.java index f5795d35d3..7f6a24ae16 100644 --- a/designer_form/src/com/fr/design/form/layout/FRHorizontalLayout.java +++ b/designer_form/src/com/fr/design/form/layout/FRHorizontalLayout.java @@ -3,9 +3,20 @@ */ package com.fr.design.form.layout; +import com.fr.design.designer.beans.LayoutAdapter; +import com.fr.design.designer.beans.adapters.layout.FRHorizontalLayoutAdapter; +import com.fr.design.designer.beans.location.Direction; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XWHorizontalBoxLayout; +import com.fr.design.designer.creator.XWidgetCreator; +import com.fr.form.ui.Widget; +import com.fr.form.ui.container.WHorizontalBoxLayout; + import java.awt.Component; import java.awt.Container; +import java.awt.Dimension; import java.awt.Insets; +import java.awt.event.ContainerEvent; /** * @author richer @@ -70,4 +81,29 @@ public class FRHorizontalLayout extends FRFlowLayout { } return total; } + + public void componentAdded(ContainerEvent e, WHorizontalBoxLayout wlayout){ + XWidgetCreator creator = (XWidgetCreator) e.getChild(); + Widget wgt = creator.toData(); + wlayout.setWidthAtWidget(wgt, creator.getWidth()); + } + + public Dimension calculatePreferredSize(WHorizontalBoxLayout wlayout, Widget widget){ + return new Dimension(wlayout.getWidthAtWidget(widget), 0); + } + + + public void setDirections(Component component){ + XCreator creator = (XCreator) component; + creator.setDirections(new int[]{Direction.LEFT, Direction.RIGHT}); + } + + public LayoutAdapter getLayoutAdapter(XWHorizontalBoxLayout xwHorizontalBoxLayout){ + return new FRHorizontalLayoutAdapter(xwHorizontalBoxLayout); + } + + public void adjustComponents(Component component){ + + } + } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/form/layout/FRVerticalLayout.java b/designer_form/src/com/fr/design/form/layout/FRVerticalLayout.java index 9201773817..3783a0e413 100644 --- a/designer_form/src/com/fr/design/form/layout/FRVerticalLayout.java +++ b/designer_form/src/com/fr/design/form/layout/FRVerticalLayout.java @@ -3,9 +3,20 @@ */ package com.fr.design.form.layout; +import com.fr.design.designer.beans.LayoutAdapter; +import com.fr.design.designer.beans.adapters.layout.FRVerticalLayoutAdapter; +import com.fr.design.designer.beans.location.Direction; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XWHorizontalBoxLayout; +import com.fr.design.designer.creator.XWidgetCreator; +import com.fr.form.ui.Widget; +import com.fr.form.ui.container.WHorizontalBoxLayout; + import java.awt.Component; import java.awt.Container; +import java.awt.Dimension; import java.awt.Insets; +import java.awt.event.ContainerEvent; /** @@ -73,4 +84,27 @@ public class FRVerticalLayout extends FRFlowLayout { } return total; } + + + public void componentAdded(ContainerEvent e, WHorizontalBoxLayout wlayout){ + XWidgetCreator creator = (XWidgetCreator) e.getChild(); + Widget wgt = creator.toData(); + wlayout.setWidthAtWidget(wgt, creator.getHeight()); + } + + public Dimension calculatePreferredSize(WHorizontalBoxLayout wlayout, Widget widget){ + return new Dimension(0, wlayout.getWidthAtWidget(widget)); + } + + + public void setDirections(Component component){ + XCreator creator = (XCreator) component; + creator.setDirections(new int[]{Direction.TOP, Direction.BOTTOM}); + } + + public LayoutAdapter getLayoutAdapter(XWHorizontalBoxLayout xwHorizontalBoxLayout){ + return new FRVerticalLayoutAdapter(xwHorizontalBoxLayout); + } + + } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/form/parameter/FormParaDesigner.java b/designer_form/src/com/fr/design/form/parameter/FormParaDesigner.java index b9d24b2cd8..0b39f987d2 100644 --- a/designer_form/src/com/fr/design/form/parameter/FormParaDesigner.java +++ b/designer_form/src/com/fr/design/form/parameter/FormParaDesigner.java @@ -22,6 +22,7 @@ import com.fr.base.BaseUtils; import com.fr.base.Parameter; import com.fr.base.parameter.ParameterUI; import com.fr.design.DesignModelAdapter; +import com.fr.design.actions.UpdateAction; import com.fr.design.designer.beans.actions.CopyAction; import com.fr.design.designer.beans.actions.CutAction; import com.fr.design.designer.beans.actions.FormDeleteAction; @@ -322,9 +323,9 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP * * @return 同上 */ - public Action[] getActions() { + public UpdateAction[] getActions() { if (designerActions == null) { - designerActions = new Action[]{new CutAction(this), new CopyAction(this), new PasteAction(this), + designerActions = new UpdateAction[]{new CutAction(this), new CopyAction(this), new PasteAction(this), new FormDeleteAction(this)}; } return designerActions; diff --git a/designer_form/src/com/fr/design/gui/xpane/CardTagLayoutBorderPane.java b/designer_form/src/com/fr/design/gui/xpane/CardTagLayoutBorderPane.java index a797f84cd3..e49416356e 100644 --- a/designer_form/src/com/fr/design/gui/xpane/CardTagLayoutBorderPane.java +++ b/designer_form/src/com/fr/design/gui/xpane/CardTagLayoutBorderPane.java @@ -4,19 +4,11 @@ package com.fr.design.gui.xpane; import java.awt.BorderLayout; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JPanel; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - import com.fr.base.Utils; -import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; @@ -25,14 +17,9 @@ import com.fr.design.gui.style.FRFontPane; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.mainframe.JForm; -import com.fr.design.mainframe.JTemplate; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.form.ui.LayoutBorderStyle; -import com.fr.form.ui.WidgetTitle; -import com.fr.general.FRFont; import com.fr.general.Inter; -import com.fr.stable.Constants; /** * CardTagLayoutBorderPane Pane. @@ -41,7 +28,8 @@ public class CardTagLayoutBorderPane extends LayoutBorderPane { public CardTagLayoutBorderPane(){ initComponents(); } - + + protected UIScrollPane initRightBottomPane(){ this.setFontSizeComboBox(new UIComboBox(FRFontPane.FONT_SIZES)); this.setFontNameComboBox(new UIComboBox(Utils.getAvailableFontFamilyNames4Report())); @@ -90,66 +78,35 @@ public class CardTagLayoutBorderPane extends LayoutBorderPane { JPanel rightPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); defaultPane.add(rightPane, BorderLayout.EAST); - rightPane.add(initRightBottomPane(), BorderLayout.CENTER); - JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); - if (!jTemplate.isJWorkBook() && ((JForm)jTemplate).isSelectRootPane()){ - //界面上表单主体只有背景和透明度可以设置 - rightPane.add(initBodyRightTopPane(), BorderLayout.NORTH); - } else { - rightPane.add(initRightTopPane(), BorderLayout.NORTH); - } + rightPane.add(initRightTopPane(), BorderLayout.NORTH); } - - + + protected JComponent[] getBorderTypeComp(){ + return new JComponent[]{null, null}; + } + protected JComponent[] getBorderCornerSpinnerComp(){ + return new JComponent[]{null, null}; + } + + protected void switchBorderType(){ + return; + } + public LayoutBorderStyle update() { LayoutBorderStyle style = new LayoutBorderStyle(); - style.setType(this.getBorderTypeCombo().getSelectedIndex()); style.setBorderStyle(this.getBorderStyleCombo().getSelectedIndex()); style.setBorder(this.getCurrentLineCombo().getSelectedLineStyle()); style.setColor(this.getCurrentLineColorPane().getColor()); style.setBackground(this.getBackgroundPane().update()); style.setAlpha((float)(this.getNumberDragPane().updateBean()/this.getMaxNumber())); - - WidgetTitle title = style.getTitle() == null ? new WidgetTitle() : style.getTitle(); - title.setTextObject("title"); - FRFont frFont = title.getFrFont(); - frFont = frFont.applySize((Integer)this.getFontSizeComboBox().getSelectedItem()); - frFont = frFont.applyName(this.getFontNameComboBox().getSelectedItem().toString()); - frFont = frFont.applyForeground(this.getColorSelectPane().getColor()); - frFont = updateItalicBold(frFont); - int line = this.getUnderline().isSelected() ? this.getUnderlineCombo().getSelectedLineStyle() : Constants.LINE_NONE; - frFont = frFont.applyUnderline(line); - title.setFrFont(frFont); - title.setBackground(this.getTitleBackgroundPane().update()); - style.setTitle(title); return style; } + + protected void populateBorderType(){ + return; + } - - protected void populateTitle(){ - WidgetTitle widgetTitle = this.getBorderStyle() == null ? new WidgetTitle() : this.getBorderStyle().getTitle(); - widgetTitle = widgetTitle == null ? new WidgetTitle() : widgetTitle; - populateFont(widgetTitle); - this.getUnderline().addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - paintPreviewPane(); - } - }); - this.getUnderlineCombo().addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - paintPreviewPane(); - } - }); - - this.getTitleBackgroundPane().populateBean(widgetTitle.getBackground()); - this.getTitleBackgroundPane().addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - paintPreviewPane(); - } - }); - paintPreviewPane(); + protected void populateTitle(){ + return; } } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/gui/xpane/LayoutBorderPane.java b/designer_form/src/com/fr/design/gui/xpane/LayoutBorderPane.java index 4c7c1d959e..aee64ec2bd 100644 --- a/designer_form/src/com/fr/design/gui/xpane/LayoutBorderPane.java +++ b/designer_form/src/com/fr/design/gui/xpane/LayoutBorderPane.java @@ -14,7 +14,11 @@ import com.fr.design.dialog.BasicPane; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.frpane.UINumberDragPane; -import com.fr.design.gui.ibutton.*; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.design.gui.ibutton.UIButtonUI; +import com.fr.design.gui.ibutton.UIColorButton; +import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.icombobox.LineComboBox; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icontainer.UIScrollPane; @@ -37,15 +41,35 @@ import com.fr.general.FRFont; import com.fr.general.Inter; import com.fr.stable.Constants; -import javax.swing.*; +import javax.swing.AbstractButton; +import javax.swing.BorderFactory; +import javax.swing.ButtonGroup; +import javax.swing.ButtonModel; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JToggleButton; import javax.swing.border.Border; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.plaf.basic.BasicToggleButtonUI; -import java.awt.*; -import java.awt.event.*; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.awt.geom.RoundRectangle2D; /** @@ -97,47 +121,47 @@ public class LayoutBorderPane extends BasicPane { private int minNumber = 0; private double maxNumber = 100; private int iconWidth = 32; - + public LayoutBorderStyle getBorderStyle() { - return borderStyle; - } + return borderStyle; + } - public void setBorderStyle(LayoutBorderStyle borderStyle) { - this.borderStyle = borderStyle; - } + public void setBorderStyle(LayoutBorderStyle borderStyle) { + this.borderStyle = borderStyle; + } - public LayoutBorderPreviewPane getLayoutBorderPreviewPane() { - return layoutBorderPreviewPane; - } + public LayoutBorderPreviewPane getLayoutBorderPreviewPane() { + return layoutBorderPreviewPane; + } - public void setLayoutBorderPreviewPane( - LayoutBorderPreviewPane layoutBorderPreviewPane) { - this.layoutBorderPreviewPane = layoutBorderPreviewPane; - } + public void setLayoutBorderPreviewPane( + LayoutBorderPreviewPane layoutBorderPreviewPane) { + this.layoutBorderPreviewPane = layoutBorderPreviewPane; + } - public UIComboBox getBorderTypeCombo() { - return borderTypeCombo; - } + public UIComboBox getBorderTypeCombo() { + return borderTypeCombo; + } - public void setBorderTypeCombo(UIComboBox borderTypeCombo) { - this.borderTypeCombo = borderTypeCombo; - } + public void setBorderTypeCombo(UIComboBox borderTypeCombo) { + this.borderTypeCombo = borderTypeCombo; + } - public UIComboBox getBorderStyleCombo() { - return borderStyleCombo; - } + public UIComboBox getBorderStyleCombo() { + return borderStyleCombo; + } - public void setBorderStyleCombo(UIComboBox borderStyleCombo) { - this.borderStyleCombo = borderStyleCombo; - } + public void setBorderStyleCombo(UIComboBox borderStyleCombo) { + this.borderStyleCombo = borderStyleCombo; + } - public LineComboBox getCurrentLineCombo() { - return currentLineCombo; - } + public LineComboBox getCurrentLineCombo() { + return currentLineCombo; + } - public void setCurrentLineCombo(LineComboBox currentLineCombo) { - this.currentLineCombo = currentLineCombo; - } + public void setCurrentLineCombo(LineComboBox currentLineCombo) { + this.currentLineCombo = currentLineCombo; + } public UISpinner getBorderCornerSpinner() { @@ -150,162 +174,162 @@ public class LayoutBorderPane extends BasicPane { public UIColorButton getCurrentLineColorPane() { - return currentLineColorPane; - } + return currentLineColorPane; + } - public void setCurrentLineColorPane(UIColorButton currentLineColorPane) { - this.currentLineColorPane = currentLineColorPane; - } + public void setCurrentLineColorPane(UIColorButton currentLineColorPane) { + this.currentLineColorPane = currentLineColorPane; + } - public BackgroundSpecialPane getBackgroundPane() { - return backgroundPane; - } + public BackgroundSpecialPane getBackgroundPane() { + return backgroundPane; + } - public void setBackgroundPane(BackgroundSpecialPane backgroundPane) { - this.backgroundPane = backgroundPane; - } + public void setBackgroundPane(BackgroundSpecialPane backgroundPane) { + this.backgroundPane = backgroundPane; + } - public UINumberDragPane getNumberDragPane() { - return numberDragPane; - } + public UINumberDragPane getNumberDragPane() { + return numberDragPane; + } - public void setNumberDragPane(UINumberDragPane numberDragPane) { - this.numberDragPane = numberDragPane; - } + public void setNumberDragPane(UINumberDragPane numberDragPane) { + this.numberDragPane = numberDragPane; + } - public TinyFormulaPane getFormulaPane() { - return formulaPane; - } + public TinyFormulaPane getFormulaPane() { + return formulaPane; + } - public void setFormulaPane(TinyFormulaPane formulaPane) { - this.formulaPane = formulaPane; - } + public void setFormulaPane(TinyFormulaPane formulaPane) { + this.formulaPane = formulaPane; + } - public UIComboBox getFontNameComboBox() { - return fontNameComboBox; - } + public UIComboBox getFontNameComboBox() { + return fontNameComboBox; + } - public void setFontNameComboBox(UIComboBox fontNameComboBox) { - this.fontNameComboBox = fontNameComboBox; - } + public void setFontNameComboBox(UIComboBox fontNameComboBox) { + this.fontNameComboBox = fontNameComboBox; + } - public UIComboBox getFontSizeComboBox() { - return fontSizeComboBox; - } + public UIComboBox getFontSizeComboBox() { + return fontSizeComboBox; + } - public void setFontSizeComboBox(UIComboBox fontSizeComboBox) { - this.fontSizeComboBox = fontSizeComboBox; - } + public void setFontSizeComboBox(UIComboBox fontSizeComboBox) { + this.fontSizeComboBox = fontSizeComboBox; + } - public UIColorButton getColorSelectPane() { - return colorSelectPane; - } + public UIColorButton getColorSelectPane() { + return colorSelectPane; + } - public void setColorSelectPane(UIColorButton colorSelectPane) { - this.colorSelectPane = colorSelectPane; - } + public void setColorSelectPane(UIColorButton colorSelectPane) { + this.colorSelectPane = colorSelectPane; + } - public UIToggleButton getBold() { - return bold; - } + public UIToggleButton getBold() { + return bold; + } - public void setBold(UIToggleButton bold) { - this.bold = bold; - } + public void setBold(UIToggleButton bold) { + this.bold = bold; + } - public UIToggleButton getItalic() { - return italic; - } + public UIToggleButton getItalic() { + return italic; + } - public void setItalic(UIToggleButton italic) { - this.italic = italic; - } + public void setItalic(UIToggleButton italic) { + this.italic = italic; + } - public UIToggleButton getUnderline() { - return underline; - } + public UIToggleButton getUnderline() { + return underline; + } - public void setUnderline(UIToggleButton underline) { - this.underline = underline; - } + public void setUnderline(UIToggleButton underline) { + this.underline = underline; + } - public LineComboBox getUnderlineCombo() { - return underlineCombo; - } + public LineComboBox getUnderlineCombo() { + return underlineCombo; + } - public void setUnderlineCombo(LineComboBox underlineCombo) { - this.underlineCombo = underlineCombo; - } + public void setUnderlineCombo(LineComboBox underlineCombo) { + this.underlineCombo = underlineCombo; + } - public UIButtonGroup gethAlignmentPane() { - return hAlignmentPane; - } + public UIButtonGroup gethAlignmentPane() { + return hAlignmentPane; + } - public void sethAlignmentPane(UIButtonGroup hAlignmentPane) { - this.hAlignmentPane = hAlignmentPane; - } + public void sethAlignmentPane(UIButtonGroup hAlignmentPane) { + this.hAlignmentPane = hAlignmentPane; + } - public BackgroundNoImagePane getTitleBackgroundPane() { - return titleBackgroundPane; - } + public BackgroundNoImagePane getTitleBackgroundPane() { + return titleBackgroundPane; + } - public void setTitleBackgroundPane(BackgroundNoImagePane titleBackgroundPane) { - this.titleBackgroundPane = titleBackgroundPane; - } + public void setTitleBackgroundPane(BackgroundNoImagePane titleBackgroundPane) { + this.titleBackgroundPane = titleBackgroundPane; + } - public UIScrollPane getTitlePane() { - return titlePane; - } + public UIScrollPane getTitlePane() { + return titlePane; + } - public void setTitlePane(UIScrollPane titlePane) { - this.titlePane = titlePane; - } + public void setTitlePane(UIScrollPane titlePane) { + this.titlePane = titlePane; + } - public int getMinNumber() { - return minNumber; - } + public int getMinNumber() { + return minNumber; + } - public void setMinNumber(int minNumber) { - this.minNumber = minNumber; - } + public void setMinNumber(int minNumber) { + this.minNumber = minNumber; + } - public double getMaxNumber() { - return maxNumber; - } + public double getMaxNumber() { + return maxNumber; + } - public void setMaxNumber(double maxNumber) { - this.maxNumber = maxNumber; - } + public void setMaxNumber(double maxNumber) { + this.maxNumber = maxNumber; + } - public int getIconWidth() { - return iconWidth; - } + public int getIconWidth() { + return iconWidth; + } - public void setIconWidth(int iconWidth) { - this.iconWidth = iconWidth; - } + public void setIconWidth(int iconWidth) { + this.iconWidth = iconWidth; + } - public final static int[] BORDER_LINE_STYLE_ARRAY = new int[]{ + public final static int[] BORDER_LINE_STYLE_ARRAY = new int[]{ Constants.LINE_NONE, Constants.LINE_THIN, //1px Constants.LINE_MEDIUM, //2px Constants.LINE_THICK, //3px - }; + }; public final static String[] BORDER_TYPE = new String[]{Inter.getLocText("FR-Designer-Widget-Style_Standard"), Inter.getLocText("FR-Designer-Widget-Style_Custom")}; public final static String[] BORDER_STYLE= new String[]{Inter.getLocText("FR-Designer-Widget-Style_Common"), Inter.getLocText("FR-Designer-Widget-Style_Shadow")}; private final static Dimension BUTTON_SIZE = new Dimension(24, 20); - + public LayoutBorderPane() { this.initComponents(); } - + protected void initComponents() { - this.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); + this.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); this.setLayout(FRGUIPaneFactory.createBorderLayout()); - + JPanel defaultPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); this.add(defaultPane, BorderLayout.CENTER); @@ -318,7 +342,7 @@ public class LayoutBorderPane extends BasicPane { borderPane.setBorder(BorderFactory.createEmptyBorder(10, 4, 10, 4)); layoutBorderPreviewPane = new LayoutBorderPreviewPane(borderStyle); - + borderPane.add(layoutBorderPreviewPane, BorderLayout.CENTER); JPanel rightPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); @@ -336,17 +360,7 @@ public class LayoutBorderPane extends BasicPane { } protected UIScrollPane initRightTopPane(){ - this.borderTypeCombo = new UIComboBox(BORDER_TYPE); - this.borderTypeCombo.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - if(borderTypeCombo.getSelectedIndex() == 0){ - titlePane.setVisible(false); - } else { - titlePane.setVisible(true); - currentLineCombo.setSelectedItem(Constants.LINE_THIN); - } - } - }); + switchBorderType(); this.borderStyleCombo = new UIComboBox(BORDER_STYLE); this.currentLineCombo = new LineComboBox(BORDER_LINE_STYLE_ARRAY); this.currentLineColorPane = new UIColorButton(null); @@ -366,22 +380,43 @@ public class LayoutBorderPane extends BasicPane { double[] rowSize = {p,p,p,p,p,p,p,p}; double[] columnSize = { p, MAX_WIDTH}; JPanel rightTopContentPane = TableLayoutHelper.createCommonTableLayoutPane(new JComponent[][]{ - {new UILabel(Inter.getLocText("FR-Designer-Widget-Style_Frame_Style")), borderTypeCombo}, + getBorderTypeComp(), {new UILabel(Inter.getLocText("FR-Designer-Widget-Style_Render_Style")), borderStyleCombo}, {new UILabel(Inter.getLocText("FR-Designer-Widget-Style_Border_Line")), currentLineCombo}, {new UILabel(Inter.getLocText("FR-Designer-Widget-Style_Border_Color")), buttonPane}, - {new UILabel(Inter.getLocText("plugin-ChartF_Radius")+":"),borderCornerSpinner}, + getBorderCornerSpinnerComp(), {new UILabel(Inter.getLocText("FR-Designer-Widget-Style_Body_Background")), backgroundPane}, {new UILabel(""),new UILabel(Inter.getLocText("FR-Designer-Widget-Style_Alpha"))}, {new UILabel(""),transparencyPane}, - }, rowSize, columnSize, 10); + }, rowSize, columnSize, 10); rightTopContentPane.setBorder(BorderFactory.createEmptyBorder(15, 12, 10, 12)); UIScrollPane rightTopPane = new UIScrollPane(rightTopContentPane); rightTopPane.setBorder(GUICoreUtils.createTitledBorder(Inter.getLocText("FR-Designer-Widget-Style_Frame"),null)); rightTopPane.setPreferredSize(rightTopPane.getPreferredSize()); return rightTopPane; } - + + protected JComponent[] getBorderTypeComp(){ + return new JComponent[]{new UILabel(Inter.getLocText("FR-Designer-Widget-Style_Frame_Style")), borderTypeCombo}; + } + + protected JComponent[] getBorderCornerSpinnerComp(){ + return new JComponent[]{new UILabel(Inter.getLocText("plugin-ChartF_Radius")+":"),borderCornerSpinner}; + } + + protected void switchBorderType(){ + this.borderTypeCombo = new UIComboBox(BORDER_TYPE); + this.borderTypeCombo.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + if(borderTypeCombo.getSelectedIndex() == 0){ + titlePane.setVisible(false); + } else { + titlePane.setVisible(true); + currentLineCombo.setSelectedItem(Constants.LINE_THIN); + } + } + }); + } @@ -452,8 +487,8 @@ public class LayoutBorderPane extends BasicPane { titlePane.setVisible(false); return titlePane; } - - + + protected JPanel initFontButtonPane(){ colorSelectPane = new UIColorButton(); @@ -524,8 +559,8 @@ public class LayoutBorderPane extends BasicPane { title.setPosition((Integer)hAlignmentPane.getSelectedItem()); title.setBackground(titleBackgroundPane.update()); style.setTitle(title); - return style; - } + return style; + } protected FRFont updateItalicBold(FRFont frFont) { int italic_bold = frFont.getStyle(); @@ -547,10 +582,10 @@ public class LayoutBorderPane extends BasicPane { } public void populate(LayoutBorderStyle style) { - if(this.borderStyle == null) { - borderStyle = new LayoutBorderStyle(); - } - this.borderStyle.setStyle(style); + if(this.borderStyle == null) { + borderStyle = new LayoutBorderStyle(); + } + this.borderStyle.setStyle(style); populateBorder(); @@ -558,7 +593,7 @@ public class LayoutBorderPane extends BasicPane { } - protected void populateBorder(){ + protected void populateBorderType(){ this.borderTypeCombo.setSelectedIndex(borderStyle.getType()); this.borderTypeCombo.addItemListener(new ItemListener() { @Override @@ -566,6 +601,10 @@ public class LayoutBorderPane extends BasicPane { paintPreviewPane(); } }); + } + + protected void populateBorder(){ + populateBorderType(); this.borderStyleCombo.setSelectedIndex(borderStyle.getBorderStyle()); this.borderStyleCombo.addItemListener(new ItemListener() { @Override @@ -610,7 +649,7 @@ public class LayoutBorderPane extends BasicPane { populateFourmula(widgetTitle); populateFont(widgetTitle); - + underline.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { @@ -631,10 +670,10 @@ public class LayoutBorderPane extends BasicPane { paintPreviewPane(); } }); - - titleBackgroundPane.populateBean(widgetTitle.getBackground()); + + titleBackgroundPane.populateBean(widgetTitle.getBackground()); this.titleBackgroundPane.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { @@ -716,27 +755,27 @@ public class LayoutBorderPane extends BasicPane { }; } - - private void populateFourmula(WidgetTitle widgetTitle) { - this.formulaPane.populateBean(widgetTitle.getTextObject().toString()); - this.formulaPane.getUITextField().getDocument() - .addDocumentListener(new DocumentListener() { - @Override - public void insertUpdate(DocumentEvent e) { - paintPreviewPane(); - } - @Override - public void removeUpdate(DocumentEvent e) { - paintPreviewPane(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - paintPreviewPane(); - } - }); - } + private void populateFourmula(WidgetTitle widgetTitle) { + this.formulaPane.populateBean(widgetTitle.getTextObject().toString()); + this.formulaPane.getUITextField().getDocument() + .addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + paintPreviewPane(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + paintPreviewPane(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + paintPreviewPane(); + } + }); + } protected JPanel createVerButtonPane(JToggleButton noBorder, String text) { @@ -747,119 +786,119 @@ public class LayoutBorderPane extends BasicPane { return verPane; } - + protected class VerButtonPane extends JPanel { - - JToggleButton noBorder; - BorderButton normalBorder; - BorderButton RoundedBorder; - ButtonGroup group; - - private VerButtonPane () { - setLayout(new FlowLayout(FlowLayout.CENTER)); - setBorder(BorderFactory.createEmptyBorder(0, 0, 4, 0)); - group = new ButtonGroup(); - noBorder = new BorderButton(NO_BORDERS); - normalBorder = new BorderButton(RIGHTANGLE_BORDERS); - RoundedBorder = new BorderButton(ROUNDED_BORDERS); - group.add(noBorder); - group.add(normalBorder); - group.add(RoundedBorder); - + + JToggleButton noBorder; + BorderButton normalBorder; + BorderButton RoundedBorder; + ButtonGroup group; + + private VerButtonPane () { + setLayout(new FlowLayout(FlowLayout.CENTER)); + setBorder(BorderFactory.createEmptyBorder(0, 0, 4, 0)); + group = new ButtonGroup(); + noBorder = new BorderButton(NO_BORDERS); + normalBorder = new BorderButton(RIGHTANGLE_BORDERS); + RoundedBorder = new BorderButton(ROUNDED_BORDERS); + group.add(noBorder); + group.add(normalBorder); + group.add(RoundedBorder); + // add(createVerButtonPane(noBorder, Inter.getLocText("None"))); // add(createVerButtonPane(normalBorder, Inter.getLocText("Border-Style-Normal"))); // add(createVerButtonPane(RoundedBorder, Inter.getLocText("Border-Style-Radius"))); - } - - public void populate(LayoutBorderStyle style) { - if(style.getBorder() == Constants.LINE_NONE) { - group.setSelected(noBorder.getModel(), true); - } else if(style.getBorderRadius() != NO_RADIUS) { + } + + public void populate(LayoutBorderStyle style) { + if(style.getBorder() == Constants.LINE_NONE) { + group.setSelected(noBorder.getModel(), true); + } else if(style.getBorderRadius() != NO_RADIUS) { group.setSelected(RoundedBorder.getModel(), true); } else { - group.setSelected(normalBorder.getModel(), true); - } - } - } - - private class BorderButton extends JToggleButton { - private BorderButton(int border) { - super(); - this.setIcon(new BorderButtonIcon(border)); - addBorderActionListener(border); - setPreferredSize(new Dimension(32, 32)); - this.setBorder(new UIRoundedBorder(new Color(220, 220, 220), 1, 5)); - this.setRolloverEnabled(true); - } - - @Override - public Border getBorder() { - ButtonModel model = getModel(); - if (this.isSelected()) { - return null; - } - if (isRolloverEnabled() && model.isRollover()) { - return new UIRoundedBorder(new Color(148, 148, 148), 1, 5); - } - return super.getBorder(); - } - - @Override - public void updateUI() { - setUI(new BorderToggleButtonUI()); - } - - private void addBorderActionListener(final int border) { - addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ae) { - if (border == 0) { - borderStyle.reset(); - } else { - borderStyle.setColor(currentLineColorPane.getColor()); - borderStyle.setBorder(currentLineCombo.getSelectedLineStyle()); - borderStyle.setBorderRadius((int)borderCornerSpinner.getValue()); - } + group.setSelected(normalBorder.getModel(), true); + } + } + } + + private class BorderButton extends JToggleButton { + private BorderButton(int border) { + super(); + this.setIcon(new BorderButtonIcon(border)); + addBorderActionListener(border); + setPreferredSize(new Dimension(32, 32)); + this.setBorder(new UIRoundedBorder(new Color(220, 220, 220), 1, 5)); + this.setRolloverEnabled(true); + } + + @Override + public Border getBorder() { + ButtonModel model = getModel(); + if (this.isSelected()) { + return null; + } + if (isRolloverEnabled() && model.isRollover()) { + return new UIRoundedBorder(new Color(148, 148, 148), 1, 5); + } + return super.getBorder(); + } + + @Override + public void updateUI() { + setUI(new BorderToggleButtonUI()); + } + + private void addBorderActionListener(final int border) { + addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + if (border == 0) { + borderStyle.reset(); + } else { + borderStyle.setColor(currentLineColorPane.getColor()); + borderStyle.setBorder(currentLineCombo.getSelectedLineStyle()); + borderStyle.setBorderRadius((int)borderCornerSpinner.getValue()); + } layoutBorderPreviewPane.repaint(); - } - }); - - } - } - - private class BorderToggleButtonUI extends BasicToggleButtonUI { - - @Override - public void paint(Graphics g, JComponent c) { - paintBackground(g, (AbstractButton) c); - super.paint(g, c); - } - - private void paintBackground(Graphics g, AbstractButton b) { - if (b.isContentAreaFilled()) { - Dimension size = b.getSize(); - Background background = new GradientBackground(new Color(247, 247, 247), new Color(228, 228, 228), - GradientBackground.TOP2BOTTOM); - background.paint(g, new RoundRectangle2D.Double(2, 2, size.width - 4, size.height - 4, 5, 5)); - } - } - - private void paintBorder(Graphics g, Color lineColor, int width, int height) { - Graphics2D g2d = (Graphics2D) g; - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2d.setColor(lineColor); - g2d.drawRoundRect(0, 0, width - 1, height - 1, 5, 5); - g2d.setColor(Color.WHITE); - g2d.drawRoundRect(1, 1, width - 3, height - 3, 5, 5); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); - } - - @Override - protected void paintButtonPressed(Graphics g, AbstractButton b) { - Dimension size = b.getSize(); - paintBorder(g, new Color(78,143,203), size.height, size.width); - } - } + } + }); + + } + } + + private class BorderToggleButtonUI extends BasicToggleButtonUI { + + @Override + public void paint(Graphics g, JComponent c) { + paintBackground(g, (AbstractButton) c); + super.paint(g, c); + } + + private void paintBackground(Graphics g, AbstractButton b) { + if (b.isContentAreaFilled()) { + Dimension size = b.getSize(); + Background background = new GradientBackground(new Color(247, 247, 247), new Color(228, 228, 228), + GradientBackground.TOP2BOTTOM); + background.paint(g, new RoundRectangle2D.Double(2, 2, size.width - 4, size.height - 4, 5, 5)); + } + } + + private void paintBorder(Graphics g, Color lineColor, int width, int height) { + Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setColor(lineColor); + g2d.drawRoundRect(0, 0, width - 1, height - 1, 5, 5); + g2d.setColor(Color.WHITE); + g2d.drawRoundRect(1, 1, width - 3, height - 3, 5, 5); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + } + + @Override + protected void paintButtonPressed(Graphics g, AbstractButton b) { + Dimension size = b.getSize(); + paintBorder(g, new Color(78,143,203), size.height, size.width); + } + } // Icon to display in shortcut setting buttons private class BorderButtonIcon implements Icon { @@ -883,13 +922,13 @@ public class LayoutBorderPane extends BasicPane { g.drawRect(3, 3, this.getIconWidth() - 7, this.getIconHeight() - 7); } else if (display == LayoutBorderPane.ROUNDED_BORDERS) { g.setColor(Color.black); - g.drawRoundRect(3, 3, this.getIconWidth() - 7, this.getIconHeight() - 7, 6, 6); + g.drawRoundRect(3, 3, this.getIconWidth() - 7, this.getIconHeight() - 7, 6, 6); } } } - @Override - protected String title4PopupWindow() { - return Inter.getLocText("FR-Designer-Widget_Style"); - } + @Override + protected String title4PopupWindow() { + return Inter.getLocText("FR-Designer-Widget_Style"); + } } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/mainframe/ComponentTree.java b/designer_form/src/com/fr/design/mainframe/ComponentTree.java index 1ceab13c0a..c676ff8c56 100644 --- a/designer_form/src/com/fr/design/mainframe/ComponentTree.java +++ b/designer_form/src/com/fr/design/mainframe/ComponentTree.java @@ -1,27 +1,39 @@ package com.fr.design.mainframe; -import java.awt.Component; -import java.util.ArrayList; - -import javax.swing.DropMode; -import javax.swing.JTree; -import javax.swing.tree.TreePath; -import javax.swing.tree.TreeSelectionModel; - import com.fr.design.constants.UIConstants; -import com.fr.design.designer.creator.*; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XLayoutContainer; +import com.fr.design.designer.creator.XWAbsoluteBodyLayout; +import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.designer.treeview.ComponentTreeCellRenderer; import com.fr.design.designer.treeview.ComponentTreeModel; +import com.fr.design.gui.itree.UITreeUI; +import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.StringUtils; +import javax.swing.*; +import javax.swing.tree.TreeCellRenderer; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeSelectionModel; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.ArrayList; + public class ComponentTree extends JTree { private FormDesigner designer; private ComponentTreeModel model; + private UITreeUI uiTreeUI = new UITreeUI(); + private PopupPreviewPane previewPane; + private static final int PADDING_LEFT = 5; + private static final int PADDING_TOP = 5; public ComponentTree(FormDesigner designer) { this.designer = designer; - this.setBackground(UIConstants.NORMAL_BACKGROUND); + this.setBackground(UIConstants.TREE_BACKGROUND); setRootVisible(true); setCellRenderer(new ComponentTreeCellRenderer()); getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); @@ -29,8 +41,17 @@ public class ComponentTree extends JTree { this.setDropMode(DropMode.ON_OR_INSERT); this.setTransferHandler(new TreeTransferHandler()); this.refreshTreeRoot(); - addTreeSelectionListener(designer); + initListeners(); setEditable(true); + setUI(uiTreeUI); + setBorder(BorderFactory.createEmptyBorder(PADDING_TOP, PADDING_LEFT, 0, 0)); + } + + private void initListeners() { + this.addTreeSelectionListener(designer); + ComponetTreeMouseListener componetTreeMouseListener = new ComponetTreeMouseListener(this); + this.addMouseMotionListener(componetTreeMouseListener); + this.addMouseListener(componetTreeMouseListener); } public FormDesigner getDesigner() { @@ -41,39 +62,49 @@ public class ComponentTree extends JTree { * 构造函数 * * @param designer 设计界面组件 - * @param model 构造JTree的model + * @param model 构造JTree的model */ - public ComponentTree(FormDesigner designer,ComponentTreeModel model) { + public ComponentTree(FormDesigner designer, ComponentTreeModel model) { this(designer); this.setModel(model); } + public void setSelectionPath(TreePath path) { + // 不管点击哪一项,都要先退出编辑状态(图表、报表块、绝对布局、tab块) + designer.stopEditing(path); + super.setSelectionPath(path); + } + @Override + public void removeAll() { + if (previewPane != null) { + previewPane.setVisible(false); + previewPane.removeAll(); + } + super.removeAll(); + } /** * 是否可编辑 + * * @param path 树路径 * @return 是则返回true */ @Override public boolean isPathEditable(TreePath path) { - Object object = path.getLastPathComponent(); - if (object == designer.getRootComponent()) { - return false; - } - return super.isPathEditable(path); + return false; } /** * 将值转换为文本 - * @param value 值 + * + * @param value 值 * @param selected 是否选中 * @param expanded 扩展 - * @param leaf 是否叶子 - * @param row 行 + * @param leaf 是否叶子 + * @param row 行 * @param hasFocus 是否焦点 - * * @return 返回文本 */ @Override @@ -96,12 +127,10 @@ public class ComponentTree extends JTree { */ public void refreshUI() { updateUI(); + setUI(uiTreeUI); } - - - public TreePath[] getSelectedTreePath() { XCreator[] creators = designer.getSelectionModel().getSelection().getSelectedCreators(); TreePath[] paths = new TreePath[creators.length]; @@ -112,10 +141,8 @@ public class ComponentTree extends JTree { } - - /** - *搜索指定名称的路径 + * 搜索指定名称的路径 * * @param text 名称 * @return 树路径 @@ -132,7 +159,7 @@ public class ComponentTree extends JTree { for (int i = 0; i < paths.length; i++) { paths[i] = buildTreePath(searchList.get(i)); } - if(paths.length > 0) { + if (paths.length > 0) { setAndScrollSelectionPath(paths); } else { setSelectionPath(); @@ -141,7 +168,7 @@ public class ComponentTree extends JTree { } - private void setSelectionPath(){ + private void setSelectionPath() { /** * 不让传null参数,所以只有自己定义 @@ -192,13 +219,13 @@ public class ComponentTree extends JTree { while (parent != null) { XCreator creator = (XCreator) parent; path.add(0, parent); - if (creator != comp ) { + if (creator != comp) { creator.notShowInComponentTree(path); } //绝对布局作为body的时候不显示自适应布局父层 if (((XCreator) parent).acceptType(XWAbsoluteBodyLayout.class)) { if ((parent.getParent() != null) - && ((XCreator)parent.getParent()).acceptType(XWFitLayout.class)){ + && ((XCreator) parent.getParent()).acceptType(XWFitLayout.class)) { parent = parent.getParent().getParent(); continue; } @@ -210,4 +237,123 @@ public class ComponentTree extends JTree { return new TreePath(components); } + private void popupPreviewPane(int popupPosYOnScreen, XCreator comp) { + if (previewPane == null) { + previewPane = new PopupPreviewPane(); + } + if (previewPane.isVisible() && previewPane.getLocationOnScreen().y != popupPosYOnScreen) { + previewPane.setVisible(false); + } + + if (!previewPane.isVisible()) { + previewPane.setComp(comp); + int popupPosY = popupPosYOnScreen - FormHierarchyTreePane.getInstance().getLocationOnScreen().y; + GUICoreUtils.showPopupMenu(previewPane, FormHierarchyTreePane.getInstance(), -previewPane.getPreferredSize().width, popupPosY); + } + } + + private void hidePreviewPane() { + if (previewPane != null && previewPane.isVisible()) { + previewPane.setVisible(false); + } + } + + private final class ComponetTreeMouseListener extends MouseAdapter { + private final JTree tree; + + private ComponetTreeMouseListener(JTree tree) { + this.tree = tree; + } + + @Override + public void mouseMoved(MouseEvent e) { + + Point p = e.getPoint(); + int selRow = tree.getRowForLocation(p.x, p.y); + TreeCellRenderer r = tree.getCellRenderer(); + if (selRow != -1 && r != null) { + TreePath path = tree.getPathForRow(selRow); + Point point = tree.getPathBounds(path).getLocation(); + SwingUtilities.convertPointToScreen(point, tree); + XCreator comp = (XCreator) path.getLastPathComponent(); + popupPreviewPane(point.y, comp); + } else { + hidePreviewPane(); + } + } + + @Override + public void mouseExited(MouseEvent e) { + hidePreviewPane(); + } + } + + private class PopupPreviewPane extends JPopupMenu { + private Container contentPane; + private BufferedImage compImage; + private static final int MAX_WIDTH = 360; + private static final int MAX_HEIGHT = 280; + + PopupPreviewPane() { + contentPane = new JPanel(); + contentPane.setBackground(Color.white); + this.setLayout(new BorderLayout()); + this.add(contentPane, BorderLayout.CENTER); + this.setOpaque(false); + setPreferredSize(new Dimension(MAX_WIDTH, MAX_HEIGHT)); + setBorder(BorderFactory.createLineBorder(UIConstants.LINE_COLOR)); + } + + public void setComp(XCreator comp) { + try { + this.compImage = componentToImage(comp); + this.updateSize(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void paint(Graphics g) { + super.paint(g); + if (compImage != null) { + g.drawImage(compImage, 0, 0, getWidth(), getHeight(), null); + } + } + + @Override + public void setVisible(boolean visible) { + super.setVisible(visible); + } + + public void menuSelectionChanged(boolean isIncluded) { + } + + public Container getContentPane() { + return contentPane; + } + + private BufferedImage componentToImage(Component comp) throws IOException + { + BufferedImage im = new BufferedImage(comp.getWidth(), comp.getHeight(), BufferedImage.TYPE_INT_ARGB); + comp.paint(im.getGraphics()); + return im; + } + + // 根据控件内容,更新弹出框大小 + private void updateSize() { + int width = compImage.getWidth(); + int height = compImage.getHeight(); + double aspectRatio = (double)width / height; + if (width > MAX_WIDTH) { + width = MAX_WIDTH; + height = (int)(width / aspectRatio); + } + if (height > MAX_HEIGHT) { + height = MAX_HEIGHT; + width = (int)(height * aspectRatio); + } + this.setPreferredSize(new Dimension(width, height)); + } + } } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/mainframe/EditingMouseListener.java b/designer_form/src/com/fr/design/mainframe/EditingMouseListener.java index 61323f4b7e..a6dbc913cd 100644 --- a/designer_form/src/com/fr/design/mainframe/EditingMouseListener.java +++ b/designer_form/src/com/fr/design/mainframe/EditingMouseListener.java @@ -11,11 +11,13 @@ import com.fr.design.designer.beans.models.SelectionModel; import com.fr.design.designer.beans.models.StateModel; import com.fr.design.designer.creator.*; import com.fr.design.designer.creator.cardlayout.XCardSwitchButton; +import com.fr.design.designer.creator.cardlayout.XWCardLayout; import com.fr.design.form.util.XCreatorConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.xpane.ToolTipEditor; import com.fr.design.icon.IconPathConstants; import com.fr.design.utils.ComponentUtils; +import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.LayoutUtils; import com.fr.general.Inter; import com.fr.stable.Constants; @@ -489,7 +491,16 @@ public class EditingMouseListener extends MouseInputAdapter { return false; } - private XCreator processTopLayoutMouseClick(XCreator creator) { + // 点击控件树,会触发此方法。如果在设计器中选中组件,则直接走 processTopLayoutMouseClick + public void stopEditTopLayout(XCreator creator) { + boolean isTabpaneSelected = creator instanceof XWCardLayout && creator.getParent().equals(clickTopLayout); + if (clickTopLayout != null && (isTabpaneSelected || clickTopLayout.equals(creator))) { + clickTopLayout.setEditable(false); + } + processTopLayoutMouseClick(creator); + } + + public XCreator processTopLayoutMouseClick(XCreator creator) { XLayoutContainer topLayout = XCreatorUtils.getHotspotContainer(creator).getTopLayout(); if (topLayout != null) { if (clickTopLayout != null && !clickTopLayout.equals(topLayout) && !isCreatorInLayout(clickTopLayout, @@ -518,8 +529,9 @@ public class EditingMouseListener extends MouseInputAdapter { */ public void mouseClicked(MouseEvent e) { XCreator creator = designer.getComponentAt(e); + boolean isValidButton = e.getButton() == MouseEvent.BUTTON1 || e.getButton() == MouseEvent.BUTTON3; - if (e.getButton() != MouseEvent.BUTTON1 && !creator.acceptType(XCardSwitchButton.class)) { + if (!isValidButton && !creator.acceptType(XCardSwitchButton.class)) { return; } @@ -527,6 +539,12 @@ public class EditingMouseListener extends MouseInputAdapter { if (creator != null) { creator.respondClick(this, e); + if (e.getButton() == MouseEvent.BUTTON3) { + JPopupMenu cellPopupMenu = creator.createPopupMenu(designer); + if (cellPopupMenu != null) { + GUICoreUtils.showPopupMenu(cellPopupMenu, designer, e.getX(), e.getY()); + } + } } creator.doLayout(); LayoutUtils.layoutRootContainer(designer.getRootComponent()); @@ -589,6 +607,7 @@ public class EditingMouseListener extends MouseInputAdapter { } designer.invalidate(); designer.repaint(); + currentXCreator.stopEditing(); currentXCreator = null; currentEditor = null; return true; diff --git a/designer_form/src/com/fr/design/mainframe/FormDesigner.java b/designer_form/src/com/fr/design/mainframe/FormDesigner.java index aa2d4db1af..851a2cdee6 100644 --- a/designer_form/src/com/fr/design/mainframe/FormDesigner.java +++ b/designer_form/src/com/fr/design/mainframe/FormDesigner.java @@ -4,13 +4,11 @@ import com.fr.base.BaseUtils; import com.fr.base.Parameter; import com.fr.base.ScreenResolution; import com.fr.design.DesignState; +import com.fr.design.actions.UpdateAction; import com.fr.design.designer.TargetComponent; import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.Painter; -import com.fr.design.designer.beans.actions.CopyAction; -import com.fr.design.designer.beans.actions.CutAction; -import com.fr.design.designer.beans.actions.FormDeleteAction; -import com.fr.design.designer.beans.actions.PasteAction; +import com.fr.design.designer.beans.actions.*; import com.fr.design.designer.beans.adapters.layout.FRParameterLayoutAdapter; import com.fr.design.designer.beans.events.CreatorEventListenerTable; import com.fr.design.designer.beans.events.DesignerEditListener; @@ -108,7 +106,7 @@ public class FormDesigner extends TargetComponent
implements TreeSelection private int resolution = ScreenResolution.getScreenResolution(); // 编辑状态的事件表 private CreatorEventListenerTable edit; - protected Action[] designerActions; + protected UpdateAction[] designerActions; private FormDesignerModeForSpecial desigerMode; private Action switchAction; private FormElementCaseContainerProvider elementCaseContainer; @@ -216,7 +214,6 @@ public class FormDesigner extends TargetComponent implements TreeSelection } } - /** * 是否有查询按钮 * @@ -672,6 +669,10 @@ public class FormDesigner extends TargetComponent implements TreeSelection setParameterArray(getNoRepeatParas(getTarget().getParameters())); refreshParameter(); } + } else { + for( UpdateAction action : getActions()) { + action.update(); + } } } @@ -1126,14 +1127,35 @@ public class FormDesigner extends TargetComponent implements TreeSelection * * @return 同上 */ - public Action[] getActions() { + public UpdateAction[] getActions() { if (designerActions == null) { - designerActions = new Action[]{new CutAction(this), new CopyAction(this), new PasteAction(this), - new FormDeleteAction(this)}; + designerActions = new UpdateAction[]{new CutAction(this), new CopyAction(this), new PasteAction(this), + new FormDeleteAction(this), new MoveToTopAction(this), new MoveToBottomAction(this), + new MoveUpAction(this), new MoveDownAction(this)}; } return designerActions; } + // 当前选中控件可以上移一层吗? + public boolean isCurrentComponentMovableUp() { + XCreator creator = getSelectionModel().getSelection().getSelectedCreator(); + Container container = creator.getParent(); + if (container == null) { + return false; + } + return creator.isMovable() && container.getComponentZOrder(creator) > 0; + } + + // 当前选中控件可以下移一层吗? + public boolean isCurrentComponentMovableDown() { + XCreator creator = getSelectionModel().getSelection().getSelectedCreator(); + Container container = creator.getParent(); + if (container == null) { + return false; + } + return creator.isMovable() && container.getComponentZOrder(creator) < container.getComponentCount() - 1; + } + protected Border getOuterBorder() { return XCreatorConstants.AREA_BORDER; } @@ -1238,6 +1260,16 @@ public class FormDesigner extends TargetComponent implements TreeSelection // do nothing } + public void stopEditing(TreePath path) { + // do nothing + XCreator comp = (XCreator) path.getLastPathComponent(); + editingMouseListener.stopEditing(); + editingMouseListener.stopEditTopLayout(comp); + + editingMouseListener.getSelectionModel().reset(); + editingMouseListener.getSelectionModel().selectACreator(comp); + } + /** * 返回表单控件权限编辑pane * diff --git a/designer_form/src/com/fr/design/mainframe/FormDesignerUI.java b/designer_form/src/com/fr/design/mainframe/FormDesignerUI.java index dfbcfbb2fe..8a40928c36 100644 --- a/designer_form/src/com/fr/design/mainframe/FormDesignerUI.java +++ b/designer_form/src/com/fr/design/mainframe/FormDesignerUI.java @@ -219,7 +219,7 @@ public class FormDesignerUI extends ComponentUI { if (subCreator instanceof XLayoutContainer) { paintAuthorityDetails(g, subCreator); } else { - if (subCreator.toData().isDirtyWidget(selectedRoles)) { + if (subCreator.toData().isDirtyWidget(selectedRoles)) { Rectangle creatorBounds = ComponentUtils.getRelativeBounds(subCreator); creatorBounds.x -= designer.getArea().getHorizontalValue(); creatorBounds.y -= designer.getArea().getVerticalValue(); @@ -273,43 +273,43 @@ public class FormDesignerUI extends ComponentUI { creatorBounds.x -= designer.getArea().getHorizontalValue(); creatorBounds.y -= designer.getArea().getVerticalValue(); if (creator.acceptType(XWFitLayout.class)) { - resetFitlayoutBounds(creatorBounds); + resetFitlayoutBounds(creatorBounds); } else if (designer.getRootComponent().acceptType(XWFitLayout.class)) { - resetCreatorBounds(creatorBounds); + resetCreatorBounds(creatorBounds); } GraphHelper.draw(g, creatorBounds, Constants.LINE_MEDIUM); } } - + /** * 初始为自适应时,处理选中的范围 * @param bound */ private void resetFitlayoutBounds( Rectangle bound) { - bound.x ++; - bound.width -= 2; - bound.y ++; - bound.height -= 2; + bound.x ++; + bound.width -= 2; + bound.y ++; + bound.height -= 2; } - + private void resetCreatorBounds( Rectangle bound) { - Rectangle rec = bound; - if (rec.x == 0) { - bound.x ++; - bound.width --; - } - if (rec.y == 0) { - bound.y ++; - bound.height --; - } - if (rec.x+rec.width == designer.getWidth()) { - bound.width --; - } - if (rec.y+rec.height == designer.getHeight()) { - bound.height --; - } + Rectangle rec = bound; + if (rec.x == 0) { + bound.x ++; + bound.width --; + } + if (rec.y == 0) { + bound.y ++; + bound.height --; + } + if (rec.x+rec.width == designer.getWidth()) { + bound.width --; + } + if (rec.y+rec.height == designer.getHeight()) { + bound.height --; + } } - + /** * 画出八个拖拽框 @@ -397,7 +397,7 @@ public class FormDesignerUI extends ComponentUI { ComponentUtils.resetBuffer(dbcomponents); designer.resetEditorComponentBounds(); } - + /** * 画参数面板 */ @@ -421,5 +421,5 @@ public class FormDesignerUI extends ComponentUI { // 恢复双缓冲 ComponentUtils.resetBuffer(dbcomponents); } - + } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/mainframe/FormHierarchyTreePane.java b/designer_form/src/com/fr/design/mainframe/FormHierarchyTreePane.java index 3d7a3ec50f..212fe33897 100644 --- a/designer_form/src/com/fr/design/mainframe/FormHierarchyTreePane.java +++ b/designer_form/src/com/fr/design/mainframe/FormHierarchyTreePane.java @@ -1,35 +1,28 @@ package com.fr.design.mainframe; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.util.ArrayList; - -import javax.swing.*; - +import com.fr.base.BaseUtils; import com.fr.design.actions.UndoableAction; -import com.fr.design.actions.UpdateAction; -import com.fr.design.designer.beans.actions.ChangeNameAction; -import com.fr.design.designer.beans.actions.FormUndoableAction; +import com.fr.design.constants.UIConstants; +import com.fr.design.designer.beans.events.DesignerEditListener; +import com.fr.design.designer.beans.events.DesignerEvent; +import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XWAbsoluteBodyLayout; +import com.fr.design.designer.creator.XWParameterLayout; +import com.fr.design.designer.treeview.ComponentTreeModel; import com.fr.design.gui.controlpane.ShortCut4JControlPane; -import com.fr.design.gui.controlpane.UIListControlPane; +import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.itoolbar.UIToolBarUI; import com.fr.design.gui.itoolbar.UIToolbar; -import com.fr.design.mainframe.widget.UITreeComboBox; - +import com.fr.design.gui.style.BorderPane; +import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; import com.fr.design.parameter.HierarchyTreePane; -import com.fr.design.designer.creator.XCreator; -import com.fr.design.designer.creator.XWParameterLayout; -import com.fr.design.designer.treeview.ComponentTreeModel; - -import com.fr.design.gui.ilable.UILabel; - - -import com.fr.base.BaseUtils; import com.fr.general.Inter; -import com.fr.design.layout.FRGUIPaneFactory; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; /** @@ -37,14 +30,14 @@ import com.fr.design.layout.FRGUIPaneFactory; */ public class FormHierarchyTreePane extends FormDockView implements HierarchyTreePane { - public static final int NODE_LENGTH = 2; - public static final int PARA = 0; - public static final int BODY = 1; + private static final int NODE_LENGTH = 2; + private static final int PARA = 0; + private static final int BODY = 1; + private static final int SHORTS_SEPARATOR_POS = 4; + private static final int TOOLBAR_PADDING_RIGHT = 10; private ShortCut4JControlPane[] shorts; private ComponentTree componentTree; - private UITreeComboBox treeComboBox; - private ChangeNameAction changeVarNameAction; public static FormHierarchyTreePane getInstance() { return HOLDER.singleton; @@ -92,18 +85,21 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree public void refreshDockingView() { FormDesigner formDesigner = this.getEditingFormDesigner(); removeAll(); - changeVarNameAction = null; if(this.componentTree != null) { this.componentTree.removeAll(); } - if(this.treeComboBox != null) { - this.treeComboBox.removeAll(); - } if (formDesigner == null) { clearDockingView(); return; } componentTree = new ComponentTree(formDesigner); + formDesigner.addDesignerEditListener(new DesignerEditListener() { + @Override + public void fireCreatorModified(DesignerEvent evt) { + componentTree.setAndScrollSelectionPath(componentTree.getSelectedTreePath()); + componentTree.refreshUI(); + } + }); ComponentTreeModel treeModel = (ComponentTreeModel) componentTree.getModel(); XCreator root = (XCreator)treeModel.getRoot(); @@ -120,25 +116,17 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree shorts = createShortcuts(); JPanel widgetPane = new JPanel(); - widgetPane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); widgetPane.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel headPane = new JPanel(new BorderLayout()); - headPane.add(new UILabel(Inter.getLocText("FR-Designer-Selected_Widget") + " ", - SwingConstants.HORIZONTAL), BorderLayout.WEST); - headPane.add(getToolBarPane(), BorderLayout.EAST); - - widgetPane.add(headPane, BorderLayout.CENTER); - treeComboBox = new UITreeComboBox(componentTree); - widgetPane.add(treeComboBox, BorderLayout.SOUTH); + widgetPane.add(getToolBarPane(), BorderLayout.CENTER); + UIScrollPane scrollPane = new UIScrollPane(componentTree); + scrollPane.setBorder(BorderFactory.createEmptyBorder()); + scrollPane.setPreferredSize(new Dimension(210, 170)); + widgetPane.add(scrollPane, BorderLayout.SOUTH); return widgetPane; } private JPanel getToolBarPane() { - ToolBarDef toolbarDef = new ToolBarDef(); - for (ShortCut4JControlPane sj : shorts) { - toolbarDef.addShortCut(sj.getShortCut()); - } UIToolbar toolBar = ToolBarDef.createJToolBar(); toolBar.setUI(new UIToolBarUI(){ @Override @@ -148,19 +136,26 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree g2.fillRect(0, 0, c.getWidth(), c.getHeight()); } }); - toolbarDef.updateToolBar(toolBar); + for (int i = 0; i < shorts.length; i++) { + if (i == SHORTS_SEPARATOR_POS) { + toolBar.addSeparator(new Dimension(2, 16)); + } + shorts[i].getShortCut().intoJToolBar(toolBar); + } + JPanel toolBarPane = new JPanel(new BorderLayout()); toolBarPane.add(toolBar, BorderLayout.CENTER); - return toolBarPane; + toolBarPane.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIConstants.BARNOMAL)); + JPanel toolBarPaneWrapper = new JPanel(new BorderLayout()); + toolBarPaneWrapper.add(toolBarPane, BorderLayout.CENTER); + toolBarPaneWrapper.setBorder(BorderFactory.createEmptyBorder(1, 0, 2, TOOLBAR_PADDING_RIGHT)); + return toolBarPaneWrapper; } protected ShortCut4JControlPane[] createShortcuts() { ArrayList shortCutList = new ArrayList<>(); FormDesigner designer = getEditingFormDesigner(); - if (changeVarNameAction == null) { - changeVarNameAction = new ChangeNameAction(designer); - } - shortCutList.add(new WidgetEnableShortCut(changeVarNameAction)); + for (Action action : designer.getActions()) { shortCutList.add(new WidgetEnableShortCut((UndoableAction)action)); } diff --git a/designer_form/src/com/fr/design/mainframe/FormSelection.java b/designer_form/src/com/fr/design/mainframe/FormSelection.java index ff809371c5..8f2fc67378 100644 --- a/designer_form/src/com/fr/design/mainframe/FormSelection.java +++ b/designer_form/src/com/fr/design/mainframe/FormSelection.java @@ -8,7 +8,14 @@ import com.fr.base.FRContext; import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.LayoutAdapter; import com.fr.design.designer.beans.location.Direction; -import com.fr.design.designer.creator.*; +import com.fr.design.designer.creator.XComponent; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XCreatorUtils; +import com.fr.design.designer.creator.XLayoutContainer; +import com.fr.design.designer.creator.XWAbsoluteLayout; +import com.fr.design.designer.creator.XWFitLayout; +import com.fr.design.designer.creator.XWParameterLayout; +import com.fr.design.designer.creator.cardlayout.XWCardTagLayout; import com.fr.form.ui.Widget; import com.fr.design.utils.ComponentUtils; import com.fr.design.utils.gui.LayoutUtils; @@ -224,6 +231,9 @@ public class FormSelection { int size = selection.size(); if (size == 1) { XCreator creator = selection.get(0); + if(creator.acceptType(XWCardTagLayout.class)){ + creator = (XCreator)selection.get(0).getParent(); + } creator.setBounds(rec); if (creator.acceptType(XWParameterLayout.class)) { designer.setParaHeight((int) rec.getHeight()); diff --git a/designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java b/designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java index e76c041414..75a1bed357 100644 --- a/designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java +++ b/designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java @@ -395,7 +395,7 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetPrope */ public void fireCreatorModified(DesignerEvent evt) { int[] validEventIds = {DesignerEvent.CREATOR_RESIZED, DesignerEvent.CREATOR_EDITED, - DesignerEvent.CREATOR_SELECTED, DesignerEvent.CREATOR_ADDED}; + DesignerEvent.CREATOR_SELECTED, DesignerEvent.CREATOR_ADDED, DesignerEvent.CREATOR_ORDER_CHANGED}; boolean isValid = false; for (int validEventId : validEventIds) { if (evt.getCreatorEventID() == validEventId) { diff --git a/designer_form/src/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java b/designer_form/src/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java index 963caf8a3d..841e9c2908 100644 --- a/designer_form/src/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java +++ b/designer_form/src/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java @@ -10,6 +10,7 @@ import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.designer.creator.XWParameterLayout; import com.fr.design.designer.creator.XWScaleLayout; import com.fr.design.designer.creator.XWTitleLayout; +import com.fr.design.designer.creator.cardlayout.XWCardTagLayout; import com.fr.design.dialog.AttrScrollPane; import com.fr.design.dialog.BasicScrollPane; import com.fr.design.foldablepane.UIExpandablePane; @@ -22,6 +23,7 @@ import com.fr.design.widget.FormWidgetDefinePaneFactoryBase; import com.fr.design.widget.Operator; import com.fr.design.widget.ui.designer.component.WidgetAbsoluteBoundPane; import com.fr.design.widget.ui.designer.component.WidgetBoundPane; +import com.fr.design.widget.ui.designer.component.WidgetCardTagBoundPane; import com.fr.form.ui.Widget; import com.fr.form.ui.container.WScaleLayout; import com.fr.form.ui.container.WTitleLayout; @@ -73,10 +75,12 @@ public class FormWidgetCardPane extends AbstractAttrNoScrollPane { public WidgetBoundPane createWidgetBoundPane(XCreator xCreator) { XLayoutContainer xLayoutContainer = getParent(xCreator); - if (xLayoutContainer == null || xCreator instanceof XWParameterLayout || xCreator instanceof XWAbsoluteLayout) { + if (xLayoutContainer == null || xCreator.acceptType(XWParameterLayout.class) || xCreator.acceptType(XWAbsoluteLayout.class)) { return null; - } else if (xLayoutContainer instanceof XWAbsoluteLayout) { + } else if (xLayoutContainer.acceptType(XWAbsoluteLayout.class)) { return new WidgetAbsoluteBoundPane(xCreator); + } else if(xCreator.acceptType(XWCardTagLayout.class)){ + return new WidgetCardTagBoundPane(xCreator); } return new WidgetBoundPane(xCreator); } diff --git a/designer_form/src/com/fr/design/parameter/ParameterPropertyPane.java b/designer_form/src/com/fr/design/parameter/ParameterPropertyPane.java index c749333444..6ce5a2ff9e 100644 --- a/designer_form/src/com/fr/design/parameter/ParameterPropertyPane.java +++ b/designer_form/src/com/fr/design/parameter/ParameterPropertyPane.java @@ -118,7 +118,7 @@ public class ParameterPropertyPane extends JPanel{ private void setEditor(FormDesigner editor) { if (formHierarchyTreePaneWrapper == null) { formHierarchyTreePaneWrapper = new JPanel(new BorderLayout()); - formHierarchyTreePaneWrapper.setBorder(BorderFactory.createEmptyBorder(0, PADDING_MIDDLE, 0, PADDING_LARGE)); + formHierarchyTreePaneWrapper.setBorder(BorderFactory.createEmptyBorder(0, PADDING_MIDDLE, 0, 0)); this.add(formHierarchyTreePaneWrapper, BorderLayout.SOUTH); } formHierarchyTreePaneWrapper.remove(FormHierarchyTreePane.getInstance()); diff --git a/designer_form/src/com/fr/design/widget/FormWidgetDefinePaneFactoryBase.java b/designer_form/src/com/fr/design/widget/FormWidgetDefinePaneFactoryBase.java index 47efd40fe8..0de1e2bdaf 100644 --- a/designer_form/src/com/fr/design/widget/FormWidgetDefinePaneFactoryBase.java +++ b/designer_form/src/com/fr/design/widget/FormWidgetDefinePaneFactoryBase.java @@ -12,6 +12,7 @@ import com.fr.form.parameter.FormSubmitButton; import com.fr.form.ui.*; import com.fr.form.ui.container.*; import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; +import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.form.ui.container.cardlayout.WTabFitLayout; import com.fr.stable.bridge.BridgeMark; import com.fr.stable.bridge.StableFactory; @@ -64,6 +65,7 @@ public class FormWidgetDefinePaneFactoryBase { defineMap.put(WAbsoluteBodyLayout.class, new Appearance(FRAbsoluteBodyLayoutDefinePane.class, "wAbsoluteBodyLayout")); defineMap.put(WParameterLayout.class, new Appearance(RootDesignDefinePane.class, "wParameterLayout")); defineMap.put(WCardMainBorderLayout.class, new Appearance(WCardMainLayoutDefinePane.class, "wCardMainBorderLayout")); + defineMap.put(WCardTagLayout.class, new Appearance(WCardTagLayoutDefinePane.class, "wCardMainBorderLayout")); defineMap.put(WCardLayout.class, new Appearance(WCardLayoutDefinePane.class, "wCardLayout")); defineMap.put(Label.class, new Appearance(LabelDefinePane.class, "label")); defineMap.put(WTabFitLayout.class, new Appearance(WTabFitLayoutDefinePane.class, "wTabFitLayout")); diff --git a/designer_form/src/com/fr/design/widget/ui/designer/component/WidgetBoundPane.java b/designer_form/src/com/fr/design/widget/ui/designer/component/WidgetBoundPane.java index db2f634e93..a046b2d18f 100644 --- a/designer_form/src/com/fr/design/widget/ui/designer/component/WidgetBoundPane.java +++ b/designer_form/src/com/fr/design/widget/ui/designer/component/WidgetBoundPane.java @@ -8,6 +8,7 @@ import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.designer.creator.XWParameterLayout; import com.fr.design.designer.creator.cardlayout.XWCardLayout; +import com.fr.design.designer.creator.cardlayout.XWCardTagLayout; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.layout.FRGUIPaneFactory; @@ -44,6 +45,9 @@ public class WidgetBoundPane extends BasicPane { } public XLayoutContainer getParent(XCreator source) { + if(source.acceptType(XWCardTagLayout.class)){ + return (XLayoutContainer)source.getParent(); + } XLayoutContainer container = XCreatorUtils.getParentXLayoutContainer(source); if (source.acceptType(XWFitLayout.class) || source.acceptType(XWParameterLayout.class)) { container = null; @@ -122,7 +126,6 @@ public class WidgetBoundPane extends BasicPane { difference = bounds.width - w; bounds.width = w; } - width.setValue(bounds.width); wabs.setBounds(creator.toData(), bounds); adjustComponents(bounds, difference, 0); } @@ -144,7 +147,6 @@ public class WidgetBoundPane extends BasicPane { difference = bounds.height - h; bounds.height = h; } - height.setValue(bounds.height); wabs.setBounds(creator.toData(), bounds); adjustComponents(bounds, difference, 1); } diff --git a/designer_form/src/com/fr/design/widget/ui/designer/component/WidgetCardTagBoundPane.java b/designer_form/src/com/fr/design/widget/ui/designer/component/WidgetCardTagBoundPane.java new file mode 100644 index 0000000000..92fb9b9652 --- /dev/null +++ b/designer_form/src/com/fr/design/widget/ui/designer/component/WidgetCardTagBoundPane.java @@ -0,0 +1,76 @@ +package com.fr.design.widget.ui.designer.component; + +import com.fr.design.designer.beans.AdapterBus; +import com.fr.design.designer.beans.LayoutAdapter; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.gui.ispinner.UISpinner; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.WidgetPropertyPane; +import com.fr.design.widget.WidgetBoundsPaneFactory; +import com.fr.form.ui.container.WTabDisplayPosition; +import com.fr.form.ui.container.cardlayout.WCardTagLayout; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; + +import java.awt.Rectangle; + +/** + * Created by kerry on 2017/12/4. + */ +public class WidgetCardTagBoundPane extends WidgetBoundPane { + private UISpinner cardTagWidth ; + + public WidgetCardTagBoundPane(XCreator source) { + super(source); + } + + @Override + public void initBoundPane() { + cardTagWidth = new UIBoundSpinner(0, Integer.MAX_VALUE, 1); + cardTagWidth.setGlobalName(Inter.getLocText("FR-Designer_Coords_And_Size")); + this.add(WidgetBoundsPaneFactory.createCardTagBoundPane(cardTagWidth)); + } + + @Override + public void update() { + if (parent == null) { + return; + } + FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); + Rectangle parentBounds = new Rectangle(parent.getBounds()); + + WCardTagLayout tagLayout = (WCardTagLayout)creator.toData(); + WTabDisplayPosition displayPosition = tagLayout.getDisplayPosition(); + if( ComparatorUtils.equals(displayPosition, WTabDisplayPosition.TOP_POSITION) || ComparatorUtils.equals(displayPosition, WTabDisplayPosition.BOTTOM_POSITION)){ + parentBounds.height = (int)cardTagWidth.getValue(); + }else{ + parentBounds.width = (int)cardTagWidth.getValue(); + } + + parent.setBounds(parentBounds); + LayoutAdapter layoutAdapter = AdapterBus.searchLayoutAdapter(formDesigner, parent); + if (layoutAdapter != null) { + parent.setBackupBound(parent.getBounds()); + layoutAdapter.fix(parent); + } + } + + @Override + protected String title4PopupWindow() { + return "absoluteBound"; + } + + @Override + public void populate() { + WCardTagLayout tagLayout = (WCardTagLayout)creator.toData(); + Rectangle bounds = new Rectangle(creator.getBounds()); + WTabDisplayPosition displayPosition = tagLayout.getDisplayPosition(); + if( ComparatorUtils.equals(displayPosition, WTabDisplayPosition.TOP_POSITION) || ComparatorUtils.equals(displayPosition, WTabDisplayPosition.BOTTOM_POSITION)){ + cardTagWidth.setValue(bounds.height); + }else{ + cardTagWidth.setValue(bounds.width); + } + + } + +} diff --git a/designer_form/src/com/fr/design/widget/ui/designer/layout/FRFitLayoutDefinePane.java b/designer_form/src/com/fr/design/widget/ui/designer/layout/FRFitLayoutDefinePane.java index b429ff84b4..4f75209108 100644 --- a/designer_form/src/com/fr/design/widget/ui/designer/layout/FRFitLayoutDefinePane.java +++ b/designer_form/src/com/fr/design/widget/ui/designer/layout/FRFitLayoutDefinePane.java @@ -29,6 +29,7 @@ import com.fr.form.ui.container.WAbsoluteBodyLayout; import com.fr.form.ui.container.WAbsoluteLayout; import com.fr.form.ui.container.WBodyLayoutType; import com.fr.form.ui.container.WFitLayout; +import com.fr.general.ComparatorUtils; import com.fr.general.FRLogger; import com.fr.general.Inter; @@ -144,7 +145,9 @@ public class FRFitLayoutDefinePane extends AbstractDataModify { @Override public WFitLayout updateBean() { WFitLayout layout = (WFitLayout) creator.toData(); - paddingBound.update(layout); + if (ComparatorUtils.equals(getGlobalName(), Inter.getLocText("FR-Designer_Layout-Padding"))) { + paddingBound.update(layout); + } LayoutBorderStyle borderStyle = (LayoutBorderStyle) stylePane.getValue(); if(borderStyle != null){ layout.setBorderStyle(borderStyle); diff --git a/designer_form/src/com/fr/design/widget/ui/designer/layout/WCardLayoutDefinePane.java b/designer_form/src/com/fr/design/widget/ui/designer/layout/WCardLayoutDefinePane.java index a1d8347f5e..177a184cc0 100644 --- a/designer_form/src/com/fr/design/widget/ui/designer/layout/WCardLayoutDefinePane.java +++ b/designer_form/src/com/fr/design/widget/ui/designer/layout/WCardLayoutDefinePane.java @@ -1,32 +1,15 @@ package com.fr.design.widget.ui.designer.layout; -import com.fr.design.designer.IntervalConstants; import com.fr.design.designer.creator.XCreator; -import com.fr.design.foldablepane.UIExpandablePane; -import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.mainframe.widget.accessibles.AccessibleCardTagWLayoutBorderStyleEditor; import com.fr.design.widget.ui.designer.AbstractDataModify; -import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.container.WCardLayout; -import com.fr.general.Inter; -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; /** * Created by ibm on 2017/8/7. */ public class WCardLayoutDefinePane extends AbstractDataModify { - private AccessibleCardTagWLayoutBorderStyleEditor accessibleCardTagWLayoutBorderStyleEditor; - private UICheckBox setCarousel; - private UISpinner carouselInterval; - private JPanel IntervalPane; public WCardLayoutDefinePane(XCreator xCreator) { super(xCreator); @@ -35,31 +18,6 @@ public class WCardLayoutDefinePane extends AbstractDataModify { public void initComponent() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - carouselInterval = new UISpinner(0, 20, 1, 0); - accessibleCardTagWLayoutBorderStyleEditor = new AccessibleCardTagWLayoutBorderStyleEditor(); - JPanel accessibleCardlayout = FRGUIPaneFactory.createBorderLayout_S_Pane(); - JPanel stylePane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ - new Component[]{new UILabel(Inter.getLocText("FR-Designer-Widget_Style")), accessibleCardTagWLayoutBorderStyleEditor}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W3, IntervalConstants.INTERVAL_L1); - stylePane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); - accessibleCardlayout.add(stylePane, BorderLayout.CENTER); - UIExpandablePane advanceExpandablePane = new UIExpandablePane(Inter.getLocText("FR-Designer_Advanced"), 280, 20, accessibleCardlayout); - final JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - jPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - setCarousel = new UICheckBox(Inter.getLocText("FR-Designer_setCarousel")); - IntervalPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{ - new UILabel(Inter.getLocText("FR-Designer_carouselInterval")), carouselInterval}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - IntervalPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - jPanel.add(setCarousel, BorderLayout.NORTH); - jPanel.add(IntervalPane, BorderLayout.CENTER); - setCarousel.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - IntervalPane.setVisible(setCarousel.isSelected()); - } - }); - UIExpandablePane setCarouselPane = new UIExpandablePane(Inter.getLocText("FR-Designer_Tab_carousel"), 280, 20, jPanel); - this.add(advanceExpandablePane, BorderLayout.NORTH); - this.add(setCarouselPane, BorderLayout.CENTER); } @Override @@ -69,19 +27,13 @@ public class WCardLayoutDefinePane extends AbstractDataModify { @Override public void populateBean(WCardLayout ob) { - accessibleCardTagWLayoutBorderStyleEditor.setValue(ob.getBorderStyle()); - setCarousel.setSelected(ob.isCarousel()); - IntervalPane.setVisible(ob.isCarousel()); - carouselInterval.setValue(ob.getCarouselInterval()); + } @Override public WCardLayout updateBean() { WCardLayout layout = (WCardLayout) creator.toData(); - layout.setBorderStyle((LayoutBorderStyle) accessibleCardTagWLayoutBorderStyleEditor.getValue()); - layout.setCarousel(setCarousel.isSelected()); - layout.setCarouselInterval((int)carouselInterval.getValue()); return layout; } } diff --git a/designer_form/src/com/fr/design/widget/ui/designer/layout/WCardMainLayoutDefinePane.java b/designer_form/src/com/fr/design/widget/ui/designer/layout/WCardMainLayoutDefinePane.java index 5eae81e3f1..ff2b139c2a 100644 --- a/designer_form/src/com/fr/design/widget/ui/designer/layout/WCardMainLayoutDefinePane.java +++ b/designer_form/src/com/fr/design/widget/ui/designer/layout/WCardMainLayoutDefinePane.java @@ -1,39 +1,92 @@ package com.fr.design.widget.ui.designer.layout; +import com.fr.design.designer.IntervalConstants; import com.fr.design.designer.creator.XCreator; +import com.fr.design.foldablepane.UIExpandablePane; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.widget.accessibles.AccessibleCardTagWLayoutBorderStyleEditor; import com.fr.design.widget.ui.designer.AbstractDataModify; +import com.fr.form.ui.LayoutBorderStyle; +import com.fr.form.ui.container.WCardLayout; import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; -import java.awt.*; +import com.fr.general.Inter; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; /** * Created by ibm on 2017/8/2. */ public class WCardMainLayoutDefinePane extends AbstractDataModify { + private AccessibleCardTagWLayoutBorderStyleEditor accessibleCardTagWLayoutBorderStyleEditor; + private UICheckBox setCarousel; + private UISpinner carouselInterval; + private JPanel IntervalPane; public WCardMainLayoutDefinePane(XCreator xCreator) { super(xCreator); - this.setPreferredSize(new Dimension(0,0)); + initComponent(); } public void initComponent() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); + carouselInterval = new UISpinner(0, 20, 1, 0); + accessibleCardTagWLayoutBorderStyleEditor = new AccessibleCardTagWLayoutBorderStyleEditor(); + JPanel accessibleCardlayout = FRGUIPaneFactory.createBorderLayout_S_Pane(); + JPanel stylePane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ + new Component[]{new UILabel(Inter.getLocText("FR-Designer-Widget_Style")), accessibleCardTagWLayoutBorderStyleEditor}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W3, IntervalConstants.INTERVAL_L1); + stylePane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); + accessibleCardlayout.add(stylePane, BorderLayout.CENTER); + UIExpandablePane advanceExpandablePane = new UIExpandablePane(Inter.getLocText("FR-Designer_Advanced"), 280, 20, accessibleCardlayout); + final JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + jPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); + setCarousel = new UICheckBox(Inter.getLocText("FR-Designer_setCarousel")); + IntervalPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{ + new UILabel(Inter.getLocText("FR-Designer_carouselInterval")), carouselInterval}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); + IntervalPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); + jPanel.add(setCarousel, BorderLayout.NORTH); + jPanel.add(IntervalPane, BorderLayout.CENTER); + setCarousel.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + IntervalPane.setVisible(setCarousel.isSelected()); + } + }); + UIExpandablePane setCarouselPane = new UIExpandablePane(Inter.getLocText("FR-Designer_Tab_carousel"), 280, 20, jPanel); + this.add(advanceExpandablePane, BorderLayout.NORTH); + this.add(setCarouselPane, BorderLayout.CENTER); } @Override public String title4PopupWindow() { - return "cardMainLayout"; + return "tabFitLayout"; } @Override public void populateBean(WCardMainBorderLayout ob) { - + WCardLayout cardLayout = ob.getCardPart(); + accessibleCardTagWLayoutBorderStyleEditor.setValue(ob.getBorderStyle()); + setCarousel.setSelected(cardLayout.isCarousel()); + IntervalPane.setVisible(ob.isCarousel()); + carouselInterval.setValue(cardLayout.getCarouselInterval()); } @Override public WCardMainBorderLayout updateBean() { - WCardMainBorderLayout layout = (WCardMainBorderLayout)creator.toData(); + WCardMainBorderLayout layout = (WCardMainBorderLayout) creator.toData(); + layout.setBorderStyle((LayoutBorderStyle) accessibleCardTagWLayoutBorderStyleEditor.getValue()); + WCardLayout wCardLayout = layout.getCardPart(); + wCardLayout.setCarousel(setCarousel.isSelected()); + wCardLayout.setCarouselInterval((int)carouselInterval.getValue()); return layout; } } diff --git a/designer_form/src/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java b/designer_form/src/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java new file mode 100644 index 0000000000..3fe62fdacf --- /dev/null +++ b/designer_form/src/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java @@ -0,0 +1,114 @@ +package com.fr.design.widget.ui.designer.layout; + +import com.fr.general.cardtag.TemplateStyle; +import com.fr.design.designer.IntervalConstants; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XLayoutContainer; +import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; +import com.fr.design.foldablepane.UIExpandablePane; +import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.style.FRFontPane; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.widget.accessibles.AccessibleImgBackgroundEditor; +import com.fr.design.mainframe.widget.accessibles.AccessibleTemplateStyleEditor; +import com.fr.design.widget.ui.designer.AbstractDataModify; +import com.fr.form.ui.LayoutBorderStyle; +import com.fr.form.ui.container.WTabDisplayPosition; +import com.fr.form.ui.container.WTabTextDirection; +import com.fr.form.ui.container.cardlayout.WCardTagLayout; +import com.fr.general.Background; +import com.fr.general.FRFont; +import com.fr.general.Inter; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import java.awt.BorderLayout; +import java.awt.Component; + +/** + * Created by kerry on 2017/11/16. + */ +public class WCardTagLayoutDefinePane extends AbstractDataModify { + private AccessibleImgBackgroundEditor backgroundEditor; + private FRFontPane frFontPane; + private UIButtonGroup displayPositionGroup; + private UIButtonGroup textDirectionGroup; + private AccessibleTemplateStyleEditor templateStyleEditor; + + public WCardTagLayoutDefinePane(XCreator xCreator) { + super(xCreator); + initComponent(); + } + + public void initComponent() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + backgroundEditor = new AccessibleImgBackgroundEditor(); + templateStyleEditor = new AccessibleTemplateStyleEditor(); + double f = TableLayout.FILL; + double p = TableLayout.PREFERRED; + double[] rowSize = {p, p, p, p, p}; + double[] columnSize = {p, f}; + int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; + + UILabel fontLabel = new UILabel(Inter.getLocText("FR-Designer_Font")); + fontLabel.setVerticalAlignment(SwingConstants.TOP); + frFontPane = new FRFontPane(); + displayPositionGroup = new UIButtonGroup(WTabDisplayPosition.getStringArray()); + textDirectionGroup = new UIButtonGroup(WTabTextDirection.getStringArray()); + Component[][] components = new Component[][]{ + new Component[]{new UILabel(Inter.getLocText("FR-Designer_Tab_Style_Template")), templateStyleEditor}, + new Component[]{new UILabel(Inter.getLocText("FR-Designer_Tab_Display_Position")), displayPositionGroup}, + new Component[]{new UILabel(Inter.getLocText("FR-Designer_Background")), backgroundEditor}, + new Component[]{fontLabel, frFontPane}, + new Component[]{new UILabel(Inter.getLocText("FR-Designer_StyleAlignment_Text_Rotation")), textDirectionGroup} + }; + JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); + JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); + jPanel.add(panel, BorderLayout.CENTER); + UIExpandablePane advanceExpandablePane = new UIExpandablePane(Inter.getLocText("FR-Designer_Advanced"), 280, 20, jPanel); + this.add(advanceExpandablePane, BorderLayout.CENTER); + } + + @Override + public String title4PopupWindow() { + return "tabFitLayout"; + } + + @Override + public void populateBean(WCardTagLayout ob) { + //标题背景和字体属性设置在WCardLayout上做兼容 + XLayoutContainer topLayout = creator.getTopLayout(); + LayoutBorderStyle layoutBorderStyle = ((XWCardMainBorderLayout)topLayout).getCardPart().toData().getBorderStyle(); + + displayPositionGroup.setSelectedIndex(ob.getDisplayPosition().getType()); + textDirectionGroup.setSelectedIndex(ob.getTextDirection().getType()); + backgroundEditor.setValue(layoutBorderStyle.getTitle().getBackground()); + templateStyleEditor.setValue(ob.getTemplateStyle()); + FRFont frFont = layoutBorderStyle.getTitle().getFrFont(); + if (frFont != null) { + frFontPane.populateBean(frFont); + } + } + + @Override + public WCardTagLayout updateBean() { + //标题背景和字体属性设置在WCardLayout上做兼容 + XLayoutContainer topLayout = creator.getTopLayout(); + LayoutBorderStyle layoutBorderStyle = ((XWCardMainBorderLayout)topLayout).getCardPart().toData().getBorderStyle(); + FRFont frFont = layoutBorderStyle.getTitle().getFrFont() == null ? FRFont.getInstance() : layoutBorderStyle.getTitle().getFrFont(); + layoutBorderStyle.getTitle().setBackground((Background) backgroundEditor.getValue()); + layoutBorderStyle.getTitle().setFrFont(frFontPane.update(frFont)); + WCardTagLayout layout = (WCardTagLayout) creator.toData(); + layout.setDisplayPosition(WTabDisplayPosition.parse(displayPositionGroup.getSelectedIndex())); + layout.setTextDirection(WTabTextDirection.parse(textDirectionGroup.getSelectedIndex())); + layout.setTemplateStyle((TemplateStyle) templateStyleEditor.getValue()); + + return layout; + } +} diff --git a/designer_form/src/com/fr/design/widget/ui/designer/layout/WTabFitLayoutDefinePane.java b/designer_form/src/com/fr/design/widget/ui/designer/layout/WTabFitLayoutDefinePane.java index 85ca8ee977..77452e07b9 100644 --- a/designer_form/src/com/fr/design/widget/ui/designer/layout/WTabFitLayoutDefinePane.java +++ b/designer_form/src/com/fr/design/widget/ui/designer/layout/WTabFitLayoutDefinePane.java @@ -19,6 +19,7 @@ import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.form.ui.container.cardlayout.WCardTitleLayout; import com.fr.form.ui.container.cardlayout.WTabFitLayout; +import com.fr.general.ComparatorUtils; import com.fr.general.Inter; import javax.swing.BorderFactory; @@ -118,7 +119,9 @@ public class WTabFitLayoutDefinePane extends AbstractDataModify { public WTabFitLayout updateBean() { WTabFitLayout layout = (WTabFitLayout) creator.toData(); borderStyle.update(layout); - paddingBoundPane.update(layout); + if (ComparatorUtils.equals(getGlobalName(), Inter.getLocText("FR-Designer_Layout-Padding"))) { + paddingBoundPane.update(layout); + } int gap = (int)componentInterval.getValue(); setLayoutGap(gap, layout, (XWTabFitLayout)creator); layout.getCurrentCard().setText(titleField.getText());