From 2f83213beb1c69861a01cb929d108647d3ec286e Mon Sep 17 00:00:00 2001 From: Hades Date: Tue, 16 Jul 2019 15:04:04 +0800 Subject: [PATCH 01/46] =?UTF-8?q?REPORT-19381=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=20=E5=8F=B3=E5=87=BB-=E5=89=AA=E5=88=87=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=A4=B1=E6=95=88=EF=BC=8C=E6=98=AF=E7=B2=98=E8=B4=B4?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/actions/edit/CutAction.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/edit/CutAction.java b/designer-base/src/main/java/com/fr/design/actions/edit/CutAction.java index 9d8453f1e..c03d5d3de 100644 --- a/designer-base/src/main/java/com/fr/design/actions/edit/CutAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/edit/CutAction.java @@ -7,6 +7,7 @@ import com.fr.base.BaseUtils; import com.fr.design.actions.TemplateComponentAction; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.designer.TargetComponent; +import com.fr.general.IOUtils; import javax.swing.KeyStroke; import java.awt.event.KeyEvent; @@ -25,13 +26,13 @@ public class CutAction extends TemplateComponentAction { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_M_Edit_Cut")); this.setMnemonic('T'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/cut.png")); + this.setSmallIcon(IOUtils.readIcon("/com/fr/design/images/m_edit/cut.png")); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, DEFAULT_MODIFIER)); this.setEnabled(!DesignModeContext.isBanCopyAndCut()); } @Override public boolean executeActionReturnUndoRecordNeeded() { - return DesignModeContext.doPaste(getEditingComponent()); + return DesignModeContext.doCut(getEditingComponent()); } } \ No newline at end of file From fac12f874c3e73d0b8526ae832aa2649cdb5faf6 Mon Sep 17 00:00:00 2001 From: zheng Date: Wed, 17 Jul 2019 21:03:08 +0800 Subject: [PATCH 02/46] =?UTF-8?q?CHART-9445=20=E9=9B=86=E7=BE=A4=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=9C=B0=E5=9B=BE=E8=B5=84=E6=BA=90cacheMap=E5=90=8C?= =?UTF-8?q?=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chart/map/designer/type/VanChartMapSourceChoosePane.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapSourceChoosePane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapSourceChoosePane.java index 10664b340..bbce11d9f 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapSourceChoosePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapSourceChoosePane.java @@ -20,7 +20,6 @@ import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.JTemplate; import com.fr.general.ComparatorUtils; import com.fr.general.http.HttpClient; -import com.fr.geojson.helper.GEOJSONHelper; import com.fr.plugin.chart.base.GisLayer; import com.fr.plugin.chart.base.ViewCenter; import com.fr.plugin.chart.map.VanChartMapPlot; @@ -576,7 +575,7 @@ public class VanChartMapSourceChoosePane extends JPanel implements UIObserver { mapDataTree.changeRootNode(this.getRootNode()); if(samePlotChange) { - String nodePath = GEOJSONHelper.getDefaultJSONURL(); + String nodePath = ChartGEOJSONHelper.getDefaultJSONURL(); mapPlot.setGeoUrl(nodePath); mapDataTree.setSelectNodePath(nodePath); selectTreePath = mapDataTree.getSelectionPath(); From 84dae4884f1fcdefce4351a9b19530e2c237a478 Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Fri, 19 Jul 2019 13:49:53 +0800 Subject: [PATCH 03/46] =?UTF-8?q?=E6=97=A0=E4=BB=BB=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=B0=E5=BB=BA=E6=9C=AC=E5=9C=B0=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=8F=AF=E8=83=BD=E5=87=BA=E7=8E=B0=E7=9A=84npe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/gui/itree/filetree/JFileTree.java | 25 +++++++++++-------- .../main/java/com/fr/env/LocalEnvPane.java | 17 ++++++++----- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/JFileTree.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/JFileTree.java index 69875a97f..3b37f4358 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/JFileTree.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/JFileTree.java @@ -1,10 +1,11 @@ package com.fr.design.gui.itree.filetree; -import com.fr.base.BaseUtils; import com.fr.design.i18n.Toolkit; import com.fr.general.ComparatorUtils; +import com.fr.general.IOUtils; import com.fr.stable.ArrayUtils; import com.fr.stable.project.ProjectConstants; +import org.jetbrains.annotations.Nullable; import javax.swing.Icon; import javax.swing.JTree; @@ -29,7 +30,8 @@ import java.util.Stack; * File Tree. */ public class JFileTree extends AbstractFileTree { - protected FileFilter fileFilter; + + private FileFilter fileFilter; public JFileTree() { this(null); @@ -68,11 +70,11 @@ public class JFileTree extends AbstractFileTree { DefaultMutableTreeNode rootTreeNode = (DefaultMutableTreeNode) defaultTreeModel.getRoot(); rootTreeNode.removeAllChildren(); - for (int k = 0; k < rootFiles.length; k++) { - DefaultMutableTreeNode node = new DefaultMutableTreeNode(new RootFile(rootFiles[k])); + for (File rootFile : rootFiles) { + DefaultMutableTreeNode node = new DefaultMutableTreeNode(new RootFile(rootFile)); rootTreeNode.add(node); - if (rootFiles[k].isDirectory()) { + if (rootFile.isDirectory()) { node.add(new DefaultMutableTreeNode(Boolean.TRUE)); } } @@ -93,6 +95,7 @@ public class JFileTree extends AbstractFileTree { this.fileFilter = fileFilter; } + @Nullable public File getSelectedFile() { TreePath selectedTreePath = this.getSelectionPath(); if (selectedTreePath == null) { @@ -140,7 +143,7 @@ public class JFileTree extends AbstractFileTree { File rootFile = rootLocalFile.getFile(); // 是父子关系,开始找孩子. if (AbstractFileTree.isParentFile(rootFile, currentFile)) { - Stack nameStack = new Stack(); // 将所有的名字加入Stack. + Stack nameStack = new Stack<>(); // 将所有的名字加入Stack. while (true) { if (ComparatorUtils.equals(rootFile, currentFile)) { break; @@ -153,7 +156,7 @@ public class JFileTree extends AbstractFileTree { } DefaultMutableTreeNode curChildTreeNode = rootChildTreeNode; while (!nameStack.isEmpty()) { - String name = (String) nameStack.pop(); + String name = nameStack.pop(); this.expandTreeNode(curChildTreeNode); for (int j = 0; j < curChildTreeNode.getChildCount(); j++) { DefaultMutableTreeNode tmpChildTreeNode = @@ -198,9 +201,8 @@ public class JFileTree extends AbstractFileTree { if (files == null) { return new FileDirectoryNode[0]; } - List fileNodeList = new ArrayList(); - for (int k = 0; k < files.length; k++) { - File tmpFile = files[k]; + List fileNodeList = new ArrayList<>(); + for (File tmpFile : files) { // 文件属性为隐藏的话 不放入列表 if (tmpFile.isHidden()) { continue; @@ -256,7 +258,7 @@ public class JFileTree extends AbstractFileTree { // 得到本地tree图标 Icon tmpIcon = view.getSystemIcon(currentFile); if (currentFile.isDirectory() && fBuf.length() > 0) { - tmpIcon = BaseUtils.readIcon("/com/fr/design/images/gui/folder.png"); + tmpIcon = IOUtils.readIcon("/com/fr/design/images/gui/folder.png"); } this.setIcon(tmpIcon); this.setName(null); @@ -299,6 +301,7 @@ public class JFileTree extends AbstractFileTree { */ @Override public int compare(FileDirectoryNode v1, FileDirectoryNode v2) { + //noinspection Duplicates if (v1.isDirectory()) { if (v2.isDirectory()) { return v1.getName().toLowerCase().compareTo(v2.getName().toLowerCase()); diff --git a/designer-base/src/main/java/com/fr/env/LocalEnvPane.java b/designer-base/src/main/java/com/fr/env/LocalEnvPane.java index eaabd0a9a..6f191dd1e 100644 --- a/designer-base/src/main/java/com/fr/env/LocalEnvPane.java +++ b/designer-base/src/main/java/com/fr/env/LocalEnvPane.java @@ -6,9 +6,9 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.gui.itree.filetree.JFileTree; +import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.file.filter.OnlyShowDirectoryFileFilter; - import com.fr.stable.StringUtils; import javax.swing.JPanel; @@ -33,8 +33,9 @@ public class LocalEnvPane extends BasicBeanPane { JPanel northPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); this.add(northPane, BorderLayout.NORTH); - northPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Location") + ":"), BorderLayout.WEST); - northPane.add(pathTextField = new UITextField(), BorderLayout.CENTER); + northPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Location") + ":"), BorderLayout.WEST); + pathTextField = new UITextField(); + northPane.add(pathTextField, BorderLayout.CENTER); // 删除选择文件按钮 添加JFileTree @@ -54,19 +55,23 @@ public class LocalEnvPane extends BasicBeanPane { @Override public void valueChanged(TreeSelectionEvent e) { - pathTextField.setText(localEnvTree.getSelectedFile().getPath()); + File selectFile = localEnvTree.getSelectedFile(); + if (selectFile == null) { + return; + } + pathTextField.setText(selectFile.getPath()); } }); UITextArea description = new UITextArea(); centerPane.add(description, BorderLayout.SOUTH); - description.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Env_Des1")); + description.setText(Toolkit.i18nText("Fine-Design_Basic_Env_Des1")); description.setEditable(false); } @Override protected String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Location"); + return Toolkit.i18nText("Fine-Design_Basic_Location"); } @Override From f91fbdb59cd74defbefecab7744c86d1f5f5a44e Mon Sep 17 00:00:00 2001 From: Harrison Date: Mon, 22 Jul 2019 14:54:09 +0800 Subject: [PATCH 04/46] =?UTF-8?q?REPORT-17881=20=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E5=9C=A8=E7=BA=BF=E9=A2=84=E8=A7=88=E6=8E=A7=E4=BB=B6=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=97=A0=E6=95=88-=E5=A4=96=E9=83=A8=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E8=80=85=E6=8F=92=E4=BB=B6=E9=97=AE=E9=A2=98=20?= =?UTF-8?q?=E8=BF=99=E9=87=8C=E4=BF=9D=E5=AD=98=E7=9A=84=E4=B8=8D=E6=98=AF?= =?UTF-8?q?=E5=AE=9E=E6=97=B6=E7=9A=84=E4=BF=A1=E6=81=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widget/WidgetDefinePaneFactory.java | 29 +++++--- .../widget/WidgetDefinePaneFactoryTest.java | 66 +++++++++++++++++++ 2 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 designer-realize/src/test/java/com/fr/design/widget/WidgetDefinePaneFactoryTest.java diff --git a/designer-realize/src/main/java/com/fr/design/widget/WidgetDefinePaneFactory.java b/designer-realize/src/main/java/com/fr/design/widget/WidgetDefinePaneFactory.java index 756b36ad2..2df2e9f2a 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/WidgetDefinePaneFactory.java +++ b/designer-realize/src/main/java/com/fr/design/widget/WidgetDefinePaneFactory.java @@ -48,6 +48,7 @@ import com.fr.report.web.button.write.AppendRowButton; import com.fr.report.web.button.write.DeleteRowButton; import com.fr.stable.bridge.BridgeMark; import com.fr.stable.bridge.StableFactory; +import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.Map; @@ -60,7 +61,9 @@ import java.util.Map; * Time : 上午11:17 */ public class WidgetDefinePaneFactory { + private static Map, Appearance> defineMap = new HashMap, Appearance>(); + private static Map, Appearance> pluginDefineMap = ExtraDesignClassManager.getInstance().getCellWidgetOptionsMap(); static { defineMap.put(NumberEditor.class, new Appearance(NumberEditorDefinePane.class, WidgetConstants.NUMBER + "")); @@ -91,24 +94,32 @@ public class WidgetDefinePaneFactory { defineMap.put(AppendRowButton.class, new Appearance(ButtonDefinePane.class, WidgetConstants.BUTTON + "")); defineMap.put(DeleteRowButton.class, new Appearance(ButtonDefinePane.class, WidgetConstants.BUTTON + "")); defineMap.put(TreeNodeToggleButton.class, new Appearance(ButtonDefinePane.class, WidgetConstants.BUTTON + "")); - defineMap.putAll(ExtraDesignClassManager.getInstance().getCellWidgetOptionsMap()); } private WidgetDefinePaneFactory() { } + @Nullable public static RN createWidgetDefinePane(Widget widget, Operator operator) { + Appearance dn = defineMap.get(widget.getClass()); - DataModify definePane = null; - try { - definePane = (DataModify) dn.getDefineClass().newInstance(); - definePane.populateBean(widget); - operator.did(definePane.dataUI(), dn.getDisplayName()); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + // 再走一遍插件。 + if (dn == null) { + dn = pluginDefineMap.get(widget.getClass()); } - return new RN(definePane, dn.getDisplayName()); + if (dn != null) { + DataModify definePane = null; + try { + definePane = (DataModify) dn.getDefineClass().newInstance(); + definePane.populateBean(widget); + operator.did(definePane.dataUI(), dn.getDisplayName()); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return new RN(definePane, dn.getDisplayName()); + } + return null; } public static class RN { diff --git a/designer-realize/src/test/java/com/fr/design/widget/WidgetDefinePaneFactoryTest.java b/designer-realize/src/test/java/com/fr/design/widget/WidgetDefinePaneFactoryTest.java new file mode 100644 index 000000000..a7b0c46b6 --- /dev/null +++ b/designer-realize/src/test/java/com/fr/design/widget/WidgetDefinePaneFactoryTest.java @@ -0,0 +1,66 @@ +package com.fr.design.widget; + +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.data.DataCreatorUI; +import com.fr.design.widget.ui.ButtonDefinePane; +import com.fr.form.ui.Button; +import com.fr.form.ui.Widget; +import org.easymock.EasyMock; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.easymock.PowerMock; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.HashMap; +import java.util.Map; + +@RunWith(PowerMockRunner.class) +@PowerMockIgnore("javax.swing.*") +public class WidgetDefinePaneFactoryTest { + + @Test + @PrepareForTest({ExtraDesignClassManager.class, WidgetDefinePaneFactory.class}) + public void testCreateWidgetDefinePane() throws Exception { + + Map, Appearance> map = new HashMap<>(); + ExtraDesignClassManager mockDesignManager = EasyMock.mock(ExtraDesignClassManager.class); + EasyMock.expect(mockDesignManager.getCellWidgetOptionsMap()).andReturn(map).anyTimes(); + EasyMock.replay(mockDesignManager); + + PowerMock.mockStatic(ExtraDesignClassManager.class); + EasyMock.expect(ExtraDesignClassManager.getInstance()).andReturn(mockDesignManager).anyTimes(); + PowerMock.replayAll(ExtraDesignClassManager.class); + + Button mockWidget = EasyMock.mock(Button.class); + EasyMock.replay(mockWidget); + + ButtonDefinePane mockPane = EasyMock.mock(ButtonDefinePane.class); + mockPane.populateBean(EasyMock.anyObject(Button.class)); + EasyMock.expectLastCall(); + EasyMock.replay(mockPane); + + + Operator mockOperator = EasyMock.mock(Operator.class); + mockOperator.did(EasyMock.anyObject(DataCreatorUI.class), EasyMock.anyString()); + EasyMock.replay(mockOperator); + + WidgetDefinePaneFactory.RN rn1 = WidgetDefinePaneFactory.createWidgetDefinePane(mockWidget, mockOperator); + Assert.assertNull(rn1); + + Appearance appearance = new Appearance(ButtonDefinePane.class, "test"); + map.put(mockWidget.getClass(), appearance); + + WidgetDefinePaneFactory.RN rn2 = WidgetDefinePaneFactory.createWidgetDefinePane(mockWidget, mockOperator); + Assert.assertNotNull(rn2); + + map.clear(); + + WidgetDefinePaneFactory.RN rn3 = WidgetDefinePaneFactory.createWidgetDefinePane(mockWidget, mockOperator); + Assert.assertNull(rn3); + } + + +} \ No newline at end of file From 20d6a888fb653052140b208a64da86522b0d1e23 Mon Sep 17 00:00:00 2001 From: Hades Date: Tue, 23 Jul 2019 15:20:50 +0800 Subject: [PATCH 05/46] =?UTF-8?q?REPORT-19565=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E8=8B=B1=E6=96=87=E7=89=88-=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E5=AD=97=E5=85=B8=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/widget/ui/ButtonGroupDictPane.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/ButtonGroupDictPane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/ButtonGroupDictPane.java index 5d456d9b7..049168da1 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/ButtonGroupDictPane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/ButtonGroupDictPane.java @@ -18,6 +18,7 @@ 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.AccessibleDictionaryEditor; +import com.fr.design.widget.FRWidgetFactory; import com.fr.form.ui.ButtonGroup; @@ -42,23 +43,28 @@ public class ButtonGroupDictPane extends JPanel { adaptiveCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Adaptive"), true); adaptiveCheckbox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); adaptiveCheckbox.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { columnSpinner.setVisible(!adaptiveCheckbox.isSelected()); columnLabel.setVisible(!adaptiveCheckbox.isSelected()); } }); - this.columnLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Button_Group_Display_Columns") + ":"); + UILabel dictLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_DS_Dictionary")); + this.columnLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Button_Group_Display_Columns") + ":", dictLabel.getPreferredSize().width); columnSpinner = new UIBasicSpinner(new SpinnerNumberModel(0, 0, Integer.MAX_VALUE, 1)); double f = TableLayout.FILL; double p = TableLayout.PREFERRED; - double rowSize[] = {p, p}; - double columnSize[] = {p, p, f}; - Component[][] n_components = { - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_DS_Dictionary")), dictPane, null}, - {adaptiveCheckbox, columnLabel, columnSpinner} + double[] rowSize = {p, p, p}; + double[] columnSize = {p, f}; + int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}}; + Component[][] components = { + new Component[] {dictLabel, dictPane}, + new Component[] {adaptiveCheckbox, null}, + new Component[] {columnLabel, columnSpinner} }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(n_components, rowSize, columnSize, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); + JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); + panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); this.add(panel); From 5ee83b07ec87dbfea550a1fddaf1c20301989a7d Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Thu, 25 Jul 2019 09:27:44 +0800 Subject: [PATCH 06/46] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E6=89=A9=E5=B1=95=E7=B1=BB=E5=9E=8B=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/itree/filetree/FileNodeConstants.java | 27 +++++++++++++++++++ .../gui/itree/filetree/TemplateFileTree.java | 2 +- 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java new file mode 100644 index 000000000..3bde026a2 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java @@ -0,0 +1,27 @@ +package com.fr.design.gui.itree.filetree; + +import com.fr.base.FRContext; +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.mainframe.App; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +/** + * Created by alex sung on 2019/7/23. + */ +public class FileNodeConstants { + public static String[] SUPPORT_FILE_TYPES; + + static { + List supportFileType = new ArrayList<>(Arrays.asList(FRContext.getFileNodes().getSupportedTypes())); + //通过插件扩展的 + Set apps = ExtraDesignClassManager.getInstance().getArray(App.MARK_STRING); + for(App app: apps){ + supportFileType.addAll(Arrays.asList(app.defaultExtensions())); + } + SUPPORT_FILE_TYPES = supportFileType.toArray(new String[0]); + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/TemplateFileTree.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/TemplateFileTree.java index 51af636aa..b722cd44a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/TemplateFileTree.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/TemplateFileTree.java @@ -228,7 +228,7 @@ public class TemplateFileTree extends EnvFileTree { if (fileNodes == null) { fileNodes = new FileNode[0]; } - Arrays.sort(fileNodes, new FileNodeComparator(FRContext.getFileNodes().getSupportedTypes())); + Arrays.sort(fileNodes, new FileNodeComparator(FileNodeConstants.SUPPORT_FILE_TYPES)); return fileNodes; } From d5c31126decf371118dc61f590aed3439c042a3c Mon Sep 17 00:00:00 2001 From: Lanlan Date: Thu, 25 Jul 2019 11:28:10 +0800 Subject: [PATCH 07/46] =?UTF-8?q?REPORT-18362=20=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=A0=B9=E6=8D=AElic=E6=98=BE=E7=A4=BA-?= =?UTF-8?q?=E5=89=8D=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/extra/PluginOperateUtils.java | 16 ++++++++++++++++ .../exe/callback/InstallFromDiskCallback.java | 6 ++++-- .../exe/callback/InstallOnlineCallback.java | 5 +++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java b/designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java index 774578630..c7c503ff3 100644 --- a/designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java +++ b/designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java @@ -206,5 +206,21 @@ public class PluginOperateUtils { return pluginInfo.toString(); } + public static String getSwitchedInfo(PluginTaskResult result) { + StringBuilder pluginInfo = new StringBuilder(); + List pluginTaskResults = result.asList(); + for (PluginTaskResult pluginTaskResult : pluginTaskResults) { + PluginTask pluginTask = pluginTaskResult.getCurrentTask(); + if (pluginTask == null) { + continue; + } + PluginMarker pluginMarker = pluginTask.getToMarker(); + PluginContext pluginContext = PluginManager.getContext(pluginMarker); + if (pluginContext != null && pluginContext.getSelfState() == 1) { + pluginInfo.append("\n").append(pluginContext.getSwitchedReason()); + } + } + return pluginInfo.toString(); + } } diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java b/designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java index e8096efbf..59d5d6a08 100644 --- a/designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java +++ b/designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java @@ -36,10 +36,12 @@ public class InstallFromDiskCallback extends AbstractPluginTaskCallback { @Override public void done(PluginTaskResult result) { + String pluginInfo = PluginOperateUtils.getSuccessInfo(result); if (result.isSuccess()) { + String switchedInfo = PluginOperateUtils.getSwitchedInfo(result); jsCallback.execute("success"); - FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Success")); - JOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Success")); + FineLoggerFactory.getLogger().info(pluginInfo + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Success") + switchedInfo); + JOptionPane.showMessageDialog(null, pluginInfo + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Success") + switchedInfo); } else if (result.errorCode() == PluginErrorCode.NeedDealWithPluginDependency) { int rv = JOptionPane.showOptionDialog( null, diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallOnlineCallback.java b/designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallOnlineCallback.java index 23b6679b6..6e72c0478 100644 --- a/designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallOnlineCallback.java +++ b/designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallOnlineCallback.java @@ -35,9 +35,10 @@ public class InstallOnlineCallback extends AbstractDealPreTaskCallback { protected void allDone(PluginTaskResult result) { String pluginInfo = PluginOperateUtils.getSuccessInfo(result); if (result.isSuccess()) { + String switchedInfo = PluginOperateUtils.getSwitchedInfo(result); jsCallback.execute("success"); - FineLoggerFactory.getLogger().info(pluginInfo + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Success")); - JOptionPane.showMessageDialog(null, pluginInfo + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Success")); + FineLoggerFactory.getLogger().info(pluginInfo + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Success") + switchedInfo); + JOptionPane.showMessageDialog(null, pluginInfo + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Success") + switchedInfo); } else if(result.errorCode() == PluginErrorCode.HasLowerPluginWhenInstall){ int rv = JOptionPane.showOptionDialog( null, From 47d7d62edea64d275cadfed132610f73365dba25 Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Thu, 25 Jul 2019 13:55:07 +0800 Subject: [PATCH 08/46] =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../itree/filetree/FileNodeConstantsTest.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 designer-base/src/test/java/com/fr/design/gui/itree/filetree/FileNodeConstantsTest.java diff --git a/designer-base/src/test/java/com/fr/design/gui/itree/filetree/FileNodeConstantsTest.java b/designer-base/src/test/java/com/fr/design/gui/itree/filetree/FileNodeConstantsTest.java new file mode 100644 index 000000000..67f082456 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/gui/itree/filetree/FileNodeConstantsTest.java @@ -0,0 +1,51 @@ +package com.fr.design.gui.itree.filetree; + +import com.fr.base.extension.FileExtension; +import com.fr.base.io.BaseBook; +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.mainframe.AbstractAppProvider; +import com.fr.design.mainframe.App; +import com.fr.design.mainframe.JTemplate; +import com.fr.file.FILE; +import com.fr.stable.fun.mark.Mutable; +import org.easymock.EasyMock; +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashSet; +import java.util.Set; + +/** + * Created by alex sung on 2019/7/25. + */ +public class FileNodeConstantsTest { + @Test + public void supportFileTypesTest(){ + ExtraDesignClassManager extra = EasyMock.mock(ExtraDesignClassManager.class); + Set apps = new HashSet(){{add(new MockCptxApp());}}; + EasyMock.expect(extra.getArray(App.MARK_STRING)).andReturn(apps).anyTimes(); + EasyMock.replay(extra); + + Assert.assertEquals(1, extra.getArray(App.MARK_STRING).size()); + App app = (App) extra.getArray(App.MARK_STRING).iterator().next(); + Assert.assertEquals("cptx", app.defaultExtensions()[0]); + } + + private class MockCptxApp extends AbstractAppProvider{ + @Override + public String[] defaultExtensions() { + return new String[] {FileExtension.CPTX.getExtension()}; + } + + @Override + public JTemplate openTemplate(FILE tplFile) { + return null; + } + + @Override + public BaseBook asIOFile(FILE tplFile) { + return null; + } + } + +} From 007291ce024216ce44587b1e553ba3428810ff29 Mon Sep 17 00:00:00 2001 From: Hades Date: Fri, 26 Jul 2019 11:02:05 +0800 Subject: [PATCH 09/46] =?UTF-8?q?REPORT-19636=20=E5=A1=AB=E6=8A=A5?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E9=87=8C=EF=BC=8C=E6=99=BA=E8=83=BD=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=8D=95=E5=85=83=E6=A0=BC=E7=BB=84=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E9=BC=A0=E6=A0=87=E8=BF=9E=E7=BB=AD=E9=80=89=E4=B8=AD=E4=B8=80?= =?UTF-8?q?=E7=89=87=E5=8D=95=E5=85=83=E6=A0=BC=EF=BC=8C=E5=A6=82=E6=9E=9C?= =?UTF-8?q?=E6=8B=96=E5=8A=A8=E7=A8=8D=E5=BE=AE=E5=BF=AB=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E7=82=B9=EF=BC=8C=E9=80=89=E6=8B=A9=E4=BC=9A=E5=87=BA=E7=8E=B0?= =?UTF-8?q?=E4=B8=A2=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../submit/SmartInsertDBManipulationPane.java | 72 +++++++++++++------ 1 file changed, 49 insertions(+), 23 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java b/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java index 26271037b..682f05068 100644 --- a/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java +++ b/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java @@ -32,11 +32,20 @@ import com.fr.stable.ColumnRowGroup; import com.fr.stable.StringUtils; import com.fr.write.DMLConfigJob; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.JDialog; +import javax.swing.JTable; +import javax.swing.SwingUtilities; +import javax.swing.SwingWorker; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableColumn; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dialog; import java.awt.event.ActionEvent; +import java.util.ArrayList; +import java.util.List; public class SmartInsertDBManipulationPane extends DBManipulationPane { private static final Selection NO_SELECTION = new CellSelection(-1, -1, -1, -1); @@ -115,6 +124,7 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { * * @param evt 事件对象 */ + @Override public void actionPerformed(ActionEvent evt) { BasicPane bPane = new BasicPane() { @Override @@ -131,6 +141,7 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { double f = TableLayout.FILL; bPane.add(TableLayoutHelper.createTableLayoutPane(coms, new double[]{p, p}, new double[]{p, f}), BorderLayout.NORTH); BasicDialog dlg = bPane.showSmallWindow(SwingUtilities.getWindowAncestor(SmartInsertDBManipulationPane.this), new DialogActionAdapter() { + @Override public void doOk() { int row_offset = ((Number) rowSpinner.getValue()).intValue(); int column_offset = ((Number) columnSpinner.getValue()).intValue(); @@ -177,6 +188,7 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { * * @param evt 事件s */ + @Override public void actionPerformed(ActionEvent evt) { showCellWindow(false); } @@ -192,6 +204,7 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { * * @param e 事件s */ + @Override public void actionPerformed(ActionEvent e) { showCellWindow(true); } @@ -268,6 +281,7 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { * * @throws Exception */ + @Override public void checkValid() throws Exception { KeyColumnTableModel model = (KeyColumnTableModel) keyColumnValuesTable.getModel(); int cnt = model.getRowCount(); @@ -294,6 +308,10 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { // 单元格组要记录下之前的选中情况 private CellSelection oriCellSelection = null; + private List newAdd = new ArrayList(); + + private List oldAdd = new ArrayList(); + public SmartJTablePane4DB(KeyColumnTableModel model, ElementCasePane actionReportPane) { this(model, actionReportPane, false); } @@ -347,6 +365,7 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { * * @throws Exception */ + @Override public void checkValid() throws Exception { SmartInsertDBManipulationPane.this.checkValid(); } @@ -402,19 +421,21 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { // 要考虑多选的情况 要结合之前的看看 可能是增加 也可能需要减少 ColumnRowGroup add = new ColumnRowGroup(); - int removeCount = 0; if (oriCellSelection != null && isSameStartPoint(cellselection, oriCellSelection)) { - removeCount = dealDragSelection(add, cellselection); + dealDragSelection(add, cellselection, newValue); } else if (cellselection.getSelectedType() == CellSelection.CHOOSE_ROW || cellselection.getSelectedType() == CellSelection.CHOOSE_COLUMN) { dealSelectColRow(add, cellselection); } else { - add.addColumnRow(ColumnRow.valueOf(cellselection.getColumn(), cellselection.getRow())); + ColumnRow columnRow = ColumnRow.valueOf(cellselection.getColumn(), cellselection.getRow()); + String allColumnRow = columnRow.toString(); + if (!allColumnRow.contains(columnRow.toString())) { + add.addColumnRow(columnRow); + } + } if (add.getSize() > 0) { newValue.addAll(add); - } else if (removeCount > 0) { - newValue.splice(newValue.getSize() - removeCount, removeCount); } kcv.cv.obj = newValue; @@ -438,24 +459,29 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { return cs1.getColumn() == cs2.getColumn() && cs1.getRow() == cs2.getRow(); } - private int dealDragSelection(ColumnRowGroup add, CellSelection cellselection) { - int removeCount = 0; - if (cellselection.getRowSpan() == oriCellSelection.getRowSpan() + 1) { - for (int i = 0; i < cellselection.getColumnSpan(); i++) { - add.addColumnRow(ColumnRow.valueOf( - cellselection.getColumn() + i, cellselection.getRow() + cellselection.getRowSpan() - 1)); - } - } else if (cellselection.getRowSpan() == oriCellSelection.getRowSpan() - 1) { - removeCount = cellselection.getColumnSpan(); - } else if (cellselection.getColumnSpan() == oriCellSelection.getColumnSpan() + 1) { - for (int i = 0; i < cellselection.getRowSpan(); i++) { - add.addColumnRow(ColumnRow.valueOf( - cellselection.getColumn() + cellselection.getColumnSpan() - 1, cellselection.getRow() + i)); + private void dealDragSelection(ColumnRowGroup add, CellSelection cellselection, ColumnRowGroup newValue) { + int c = cellselection.getColumn(); + int cs = cellselection.getColumnSpan(); + int r = cellselection.getRow();int rs = cellselection.getRowSpan(); + String allColumnRow = newValue.toString(); + newAdd.clear(); + for (int i = 0; i < cs; i++) { + for (int j = 0; j < rs; j++) { + ColumnRow columnRow = ColumnRow.valueOf(c + i, r + j); + if (!allColumnRow.contains(columnRow.toString())) { + add.addColumnRow(columnRow); + } + newAdd.add(columnRow.toString()); } - } else if (cellselection.getColumnSpan() == oriCellSelection.getColumnSpan() - 1) { - removeCount = cellselection.getRowSpan(); } - return removeCount; + int oldSize = oldAdd.size(); + int newSize = newAdd.size(); + if (oldSize > newSize && oldAdd.containsAll(newAdd)) { + int diff = oldSize - newSize; + newValue.splice(newValue.getSize() - diff, diff); + } + oldAdd.clear(); + oldAdd.addAll(newAdd); } private void dealSelectColRow(ColumnRowGroup add, CellSelection se) { From c5e1ffbce08e1b7cb6f56c20a3ea656250a9ed81 Mon Sep 17 00:00:00 2001 From: Hades Date: Fri, 26 Jul 2019 11:09:49 +0800 Subject: [PATCH 10/46] update --- .../submit/SmartInsertDBManipulationPane.java | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java b/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java index 682f05068..693722812 100644 --- a/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java +++ b/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java @@ -445,24 +445,11 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { oriCellSelection = cellselection; } - private ColumnRowGroup getColumnRowGroupValue(Object oriValue) { - ColumnRowGroup newValue = new ColumnRowGroup(); - if (oriValue instanceof ColumnRowGroup) { - newValue.addAll((ColumnRowGroup) oriValue); - } else if (oriValue instanceof ColumnRow) { - newValue.addColumnRow((ColumnRow) oriValue); - } - return newValue; - } - - private boolean isSameStartPoint(CellSelection cs1, CellSelection cs2) { - return cs1.getColumn() == cs2.getColumn() && cs1.getRow() == cs2.getRow(); - } - private void dealDragSelection(ColumnRowGroup add, CellSelection cellselection, ColumnRowGroup newValue) { int c = cellselection.getColumn(); int cs = cellselection.getColumnSpan(); - int r = cellselection.getRow();int rs = cellselection.getRowSpan(); + int r = cellselection.getRow(); + int rs = cellselection.getRowSpan(); String allColumnRow = newValue.toString(); newAdd.clear(); for (int i = 0; i < cs; i++) { @@ -484,6 +471,20 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { oldAdd.addAll(newAdd); } + private ColumnRowGroup getColumnRowGroupValue(Object oriValue) { + ColumnRowGroup newValue = new ColumnRowGroup(); + if (oriValue instanceof ColumnRowGroup) { + newValue.addAll((ColumnRowGroup) oriValue); + } else if (oriValue instanceof ColumnRow) { + newValue.addColumnRow((ColumnRow) oriValue); + } + return newValue; + } + + private boolean isSameStartPoint(CellSelection cs1, CellSelection cs2) { + return cs1.getColumn() == cs2.getColumn() && cs1.getRow() == cs2.getRow(); + } + private void dealSelectColRow(ColumnRowGroup add, CellSelection se) { int c = se.getColumn(), cs = se.getColumnSpan(), r = se.getRow(), rs = se.getRowSpan(); From eaa4de18931a875d2460e12ad073b1f12aa2d21f Mon Sep 17 00:00:00 2001 From: Hades Date: Fri, 26 Jul 2019 14:00:45 +0800 Subject: [PATCH 11/46] =?UTF-8?q?REPORT-19733=20=E6=9C=AA=E8=A3=85?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=8F=92=E4=BB=B6=E7=9A=84=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E8=BF=9C=E7=A8=8B=E8=AE=BE=E8=AE=A1=E6=97=B6?= =?UTF-8?q?=20=E7=BC=96=E8=BE=91=E6=9C=8D=E5=8A=A1=E5=99=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=20=20=E7=82=B9=E5=87=BB=E7=A1=AE=E5=AE=9A?= =?UTF-8?q?=E4=BC=9A=E8=A6=86=E7=9B=96=E6=89=80=E6=9C=89=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E4=B8=AD=E7=9A=84=E6=8F=92=E4=BB=B6=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datapane/TableDataPaneListPane.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java index 59880cc4e..963238d22 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -211,15 +210,19 @@ public class TableDataPaneListPane extends JListControlPane implements TableData @Override public void update(TableDataConfig tableDataConfig) { - tableDataConfig.removeAllTableData(); - ProcedureConfig.getInstance().removeAllProcedure(); + Iterator tableDataNames = tableDataConfig.getTableDatas().keySet().iterator(); + while (tableDataNames.hasNext()) { + tableDataConfig.removeTableData(tableDataNames.next()); + } + Iterator procedureName = ProcedureConfig.getInstance().getProcedures().keySet().iterator(); + while (procedureName.hasNext()) { + ProcedureConfig.getInstance().removeProcedure(procedureName.next()); + } Nameable[] tableDataArray = this.update(); - Map tableDataMap = new LinkedHashMap(); for (int i = 0; i < tableDataArray.length; i++) { NameObject nameObject = (NameObject) tableDataArray[i]; - tableDataMap.put(nameObject.getName(), (TableData) nameObject.getObject()); + tableDataConfig.addTableData(nameObject.getName(), (TableData) nameObject.getObject()); } - tableDataConfig.setTableDatas(tableDataMap); } @Override From 65e07d5e0e2f023ec985fb5b45110a8138801eb6 Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Mon, 29 Jul 2019 15:44:46 +0800 Subject: [PATCH 12/46] =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=A4=A9=E7=94=9F?= =?UTF-8?q?=E5=8F=AF=E6=8B=94=E6=8F=92=EF=BC=8C=E8=BF=99=E9=87=8C=E4=B8=8D?= =?UTF-8?q?=E8=83=BD=E7=94=A8static=EF=BC=8C=E5=BA=94=E6=AF=8F=E6=AC=A1?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E6=97=B6=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/gui/itree/filetree/FileNodeConstants.java | 7 ++++--- .../com/fr/design/gui/itree/filetree/TemplateFileTree.java | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java index 3bde026a2..b997b21d0 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java @@ -13,15 +13,16 @@ import java.util.Set; * Created by alex sung on 2019/7/23. */ public class FileNodeConstants { - public static String[] SUPPORT_FILE_TYPES; - static { + private FileNodeConstants(){} + + public static String[] getSupportFileTypes(){ List supportFileType = new ArrayList<>(Arrays.asList(FRContext.getFileNodes().getSupportedTypes())); //通过插件扩展的 Set apps = ExtraDesignClassManager.getInstance().getArray(App.MARK_STRING); for(App app: apps){ supportFileType.addAll(Arrays.asList(app.defaultExtensions())); } - SUPPORT_FILE_TYPES = supportFileType.toArray(new String[0]); + return supportFileType.toArray(new String[0]); } } diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/TemplateFileTree.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/TemplateFileTree.java index b722cd44a..b1f641b3b 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/TemplateFileTree.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/TemplateFileTree.java @@ -228,7 +228,7 @@ public class TemplateFileTree extends EnvFileTree { if (fileNodes == null) { fileNodes = new FileNode[0]; } - Arrays.sort(fileNodes, new FileNodeComparator(FileNodeConstants.SUPPORT_FILE_TYPES)); + Arrays.sort(fileNodes, new FileNodeComparator(FileNodeConstants.getSupportFileTypes())); return fileNodes; } From ea59aee64ebcaac751b0e2cd9dc9cc230d00a4da Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Mon, 29 Jul 2019 17:28:22 +0800 Subject: [PATCH 13/46] =?UTF-8?q?=E9=80=9A=E8=BF=87=E7=9B=91=E5=90=AC?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/itree/filetree/FileNodeConstants.java | 41 +++++++++++++++---- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java index b997b21d0..a6757ee2b 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java @@ -3,6 +3,12 @@ package com.fr.design.gui.itree.filetree; import com.fr.base.FRContext; import com.fr.design.ExtraDesignClassManager; import com.fr.design.mainframe.App; +import com.fr.general.GeneralContext; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.injectable.PluginModule; +import com.fr.plugin.manage.PluginFilter; +import com.fr.plugin.observer.PluginEvent; +import com.fr.plugin.observer.PluginEventListener; import java.util.ArrayList; import java.util.Arrays; @@ -14,15 +20,36 @@ import java.util.Set; */ public class FileNodeConstants { - private FileNodeConstants(){} + private static List supportFileType = new ArrayList(Arrays.asList(FRContext.getFileNodes().getSupportedTypes())); - public static String[] getSupportFileTypes(){ - List supportFileType = new ArrayList<>(Arrays.asList(FRContext.getFileNodes().getSupportedTypes())); - //通过插件扩展的 - Set apps = ExtraDesignClassManager.getInstance().getArray(App.MARK_STRING); - for(App app: apps){ - supportFileType.addAll(Arrays.asList(app.defaultExtensions())); + static { + GeneralContext.listenPluginRunningChanged(new PluginEventListener() { + @Override + public void on(PluginEvent pluginEvent) { + supportFileType = new ArrayList(Arrays.asList(FRContext.getFileNodes().getSupportedTypes())); + //通过插件扩展的 + Set apps = ExtraDesignClassManager.getInstance().getArray(App.MARK_STRING); + for (App app : apps) { + addAppExtensions(app.defaultExtensions()); + } + } + }, new PluginFilter() { + @Override + public boolean accept(PluginContext pluginContext) { + return pluginContext.contain(PluginModule.ExtraDesign); + } + }); + } + + private static void addAppExtensions(String[] extensions) { + for (int i = 0, size = extensions.length; i < size; i++) { + if (!supportFileType.contains(extensions[i])) { + supportFileType.add(extensions[i]); + } } + } + + public static String[] getSupportFileTypes() { return supportFileType.toArray(new String[0]); } } From 58eea3a9e866b8027d158fb001068f22851fd75a Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Mon, 29 Jul 2019 18:11:47 +0800 Subject: [PATCH 14/46] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=97=B6?= =?UTF-8?q?=E4=BB=8E=E6=8F=92=E4=BB=B6=E9=87=8C=E6=8D=9E=E4=B8=80=E6=8A=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/itree/filetree/FileNodeConstants.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java index a6757ee2b..f9870e3c3 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java @@ -20,9 +20,13 @@ import java.util.Set; */ public class FileNodeConstants { - private static List supportFileType = new ArrayList(Arrays.asList(FRContext.getFileNodes().getSupportedTypes())); + private static List supportFileType; + + private FileNodeConstants(){} static { + initSupportedTypes(); + GeneralContext.listenPluginRunningChanged(new PluginEventListener() { @Override public void on(PluginEvent pluginEvent) { @@ -49,6 +53,15 @@ public class FileNodeConstants { } } + private static void initSupportedTypes() { + supportFileType = new ArrayList(Arrays.asList(FRContext.getFileNodes().getSupportedTypes())); + //通过插件扩展的 + Set apps = ExtraDesignClassManager.getInstance().getArray(App.MARK_STRING); + for (App app : apps) { + addAppExtensions(app.defaultExtensions()); + } + } + public static String[] getSupportFileTypes() { return supportFileType.toArray(new String[0]); } From 60303b727245db6017172cc80dfdb8f6f762531e Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Mon, 29 Jul 2019 19:53:23 +0800 Subject: [PATCH 15/46] =?UTF-8?q?=E5=8A=A0=E8=AF=BB=E5=86=99=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/itree/filetree/FileNodeConstants.java | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java index f9870e3c3..88a463440 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java @@ -14,6 +14,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; /** * Created by alex sung on 2019/7/23. @@ -21,8 +23,10 @@ import java.util.Set; public class FileNodeConstants { private static List supportFileType; + private static ReadWriteLock rwl = new ReentrantReadWriteLock(); - private FileNodeConstants(){} + private FileNodeConstants() { + } static { initSupportedTypes(); @@ -30,12 +34,7 @@ public class FileNodeConstants { GeneralContext.listenPluginRunningChanged(new PluginEventListener() { @Override public void on(PluginEvent pluginEvent) { - supportFileType = new ArrayList(Arrays.asList(FRContext.getFileNodes().getSupportedTypes())); - //通过插件扩展的 - Set apps = ExtraDesignClassManager.getInstance().getArray(App.MARK_STRING); - for (App app : apps) { - addAppExtensions(app.defaultExtensions()); - } + initSupportedTypes(); } }, new PluginFilter() { @Override @@ -54,15 +53,30 @@ public class FileNodeConstants { } private static void initSupportedTypes() { - supportFileType = new ArrayList(Arrays.asList(FRContext.getFileNodes().getSupportedTypes())); - //通过插件扩展的 - Set apps = ExtraDesignClassManager.getInstance().getArray(App.MARK_STRING); - for (App app : apps) { - addAppExtensions(app.defaultExtensions()); + try { + rwl.writeLock().lock(); + supportFileType = new ArrayList(Arrays.asList(FRContext.getFileNodes().getSupportedTypes())); + //通过插件扩展的 + Set apps = ExtraDesignClassManager.getInstance().getArray(App.MARK_STRING); + for (App app : apps) { + addAppExtensions(app.defaultExtensions()); + } + } catch (Exception ignored) { + //ignored + } finally { + rwl.writeLock().unlock(); } } public static String[] getSupportFileTypes() { - return supportFileType.toArray(new String[0]); + try { + rwl.readLock().lock(); + return supportFileType.toArray(new String[0]); + } catch (Exception ignored) { + //ignored + } finally { + rwl.readLock().unlock(); + } + return null; } } From ac63ec1c6e8fe573b0eaae38d6e7bc710083b673 Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Mon, 29 Jul 2019 20:33:38 +0800 Subject: [PATCH 16/46] =?UTF-8?q?=E4=B8=8Dignored=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/gui/itree/filetree/FileNodeConstants.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java index 88a463440..8c5f0e154 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileNodeConstants.java @@ -55,14 +55,12 @@ public class FileNodeConstants { private static void initSupportedTypes() { try { rwl.writeLock().lock(); - supportFileType = new ArrayList(Arrays.asList(FRContext.getFileNodes().getSupportedTypes())); + supportFileType = new ArrayList<>(Arrays.asList(FRContext.getFileNodes().getSupportedTypes())); //通过插件扩展的 Set apps = ExtraDesignClassManager.getInstance().getArray(App.MARK_STRING); for (App app : apps) { addAppExtensions(app.defaultExtensions()); } - } catch (Exception ignored) { - //ignored } finally { rwl.writeLock().unlock(); } @@ -72,11 +70,8 @@ public class FileNodeConstants { try { rwl.readLock().lock(); return supportFileType.toArray(new String[0]); - } catch (Exception ignored) { - //ignored } finally { rwl.readLock().unlock(); } - return null; } } From 9200a190d6724f68dfd8975c3fcd2c0a544c1b47 Mon Sep 17 00:00:00 2001 From: Harrison Date: Tue, 30 Jul 2019 11:12:12 +0800 Subject: [PATCH 17/46] =?UTF-8?q?REPORT-19857=20=E8=8B=B1=E6=96=87?= =?UTF-8?q?=E7=89=88alphafine=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98=201.=20?= =?UTF-8?q?=E6=8A=8A=E5=88=A4=E6=96=AD=E5=9B=BD=E9=99=85=E5=8C=96=E7=9A=84?= =?UTF-8?q?=E8=BF=87=E7=A8=8B=E5=92=8C=20=E7=82=B9=E5=87=BB=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E9=A1=B5=E9=9D=A2=E6=89=8D=E8=83=BD=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=20=E7=9A=84=E9=80=BB=E8=BE=91=E8=A7=A3=E8=80=A6=E3=80=82?= =?UTF-8?q?=E6=94=BE=E5=88=B0=E5=90=AF=E5=8A=A8=E7=9A=84=E6=97=B6=E5=80=99?= =?UTF-8?q?=E5=81=9A=E3=80=82=202.=20=E9=85=8D=E7=BD=AE=E4=B8=8D=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E4=BA=8E=20searchOnline=20=E8=80=8C=E6=98=AF=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E4=B8=AD=E8=8B=B1=E6=96=87=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../help/alphafine/AlphaFineAction.java | 6 +----- .../help/alphafine/AlphaFineConfigPane.java | 21 ++++++++++++++----- .../mainframe/alphafine/AlphaFineHelper.java | 20 ++++++++++++++++++ .../fr/start/module/DesignerActivator.java | 4 +++- 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineAction.java b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineAction.java index dda1fb68b..f78d341a5 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineAction.java @@ -1,6 +1,5 @@ package com.fr.design.actions.help.alphafine; -import com.fr.base.FRContext; import com.fr.design.DesignerEnvManager; import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.BasicDialog; @@ -11,7 +10,7 @@ import com.fr.design.mainframe.DesignerFrame; import com.fr.design.menu.MenuKeySet; import com.fr.general.IOUtils; -import javax.swing.*; +import javax.swing.KeyStroke; import java.awt.event.ActionEvent; /** @@ -51,9 +50,6 @@ public class AlphaFineAction extends UpdateAction { final AlphaFineConfigPane alphaFineConfigPane = new AlphaFineConfigPane(); final AlphaFineConfigManager manager = DesignerEnvManager.getEnvManager().getAlphaFineConfigManager(); - if (!FRContext.isChineseEnv()) { - manager.setSearchOnLine(false); - } alphaFineConfigPane.populate(manager); DialogActionListener dialogActionListener = new DialogActionAdapter() { public void doOk() { diff --git a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java index c886e3c93..d261de57c 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java @@ -189,23 +189,34 @@ public class AlphaFineConfigPane extends BasicPane { } public void populate(AlphaFineConfigManager alphaFineConfigManager) { + this.enabledCheckbox.setSelected(alphaFineConfigManager.isEnabled()); - this.searchOnlineCheckbox.setEnabled(FRContext.isChineseEnv()); + + boolean enabled4Locale = FRContext.isChineseEnv(); + + this.searchOnlineCheckbox.setEnabled(enabled4Locale); this.searchOnlineCheckbox.setSelected(alphaFineConfigManager.isSearchOnLine()); + this.containActionCheckbox.setSelected(alphaFineConfigManager.isContainAction()); this.containTemplateCheckbox.setSelected(alphaFineConfigManager.isContainTemplate()); this.containFileContentCheckbox.setSelected(alphaFineConfigManager.isContainFileContent()); + this.containDocumentCheckbox.setSelected(alphaFineConfigManager.isContainDocument() && alphaFineConfigManager.isSearchOnLine()); - this.containDocumentCheckbox.setEnabled(alphaFineConfigManager.isSearchOnLine()); + this.containDocumentCheckbox.setEnabled(enabled4Locale); + this.containPluginCheckbox.setSelected(alphaFineConfigManager.isContainPlugin() && alphaFineConfigManager.isSearchOnLine()); - this.containPluginCheckbox.setEnabled(alphaFineConfigManager.isSearchOnLine()); + this.containPluginCheckbox.setEnabled(enabled4Locale); + this.containRecommendCheckbox.setSelected(alphaFineConfigManager.isContainRecommend() && alphaFineConfigManager.isSearchOnLine()); - this.containRecommendCheckbox.setEnabled(alphaFineConfigManager.isSearchOnLine()); + this.containRecommendCheckbox.setEnabled(enabled4Locale); + this.shortcutsField.setText(getDisplayShortCut(alphaFineConfigManager.getShortcuts())); this.needSegmentationCheckbox.setSelected(alphaFineConfigManager.isNeedSegmentationCheckbox()); + this.needIntelligentCustomerService.setSelected(alphaFineConfigManager.isNeedIntelligentCustomerService() && alphaFineConfigManager.isSearchOnLine()); - this.needIntelligentCustomerService.setEnabled(alphaFineConfigManager.isSearchOnLine()); + this.needIntelligentCustomerService.setEnabled(enabled4Locale); + shortCutKeyStore = convert2KeyStroke(alphaFineConfigManager.getShortcuts()); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineHelper.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineHelper.java index 1057d9286..dd5a01349 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineHelper.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineHelper.java @@ -15,6 +15,7 @@ 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.design.mainframe.alphafine.search.manager.impl.SimilarSearchManager; +import com.fr.general.GeneralContext; import com.fr.general.ProcessCanceledException; import com.fr.general.http.HttpToolbox; import com.fr.json.JSON; @@ -33,6 +34,25 @@ public class AlphaFineHelper { public static final NoResultModel NO_CONNECTION_MODEL = new NoResultModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Connection_Failed")); private static AlphaFineDialog alphaFineDialog; private static final String URL_FOR_TEST_NETWORK = "https://www.baidu.com"; + + private AlphaFineHelper() { + + } + + /** + * 根据国际化调整配置 + */ + public static void switchConfig4Locale() { + + AlphaFineConfigManager manager = DesignerEnvManager.getEnvManager().getAlphaFineConfigManager(); + if (!GeneralContext.isChineseEnv()) { + manager.setSearchOnLine(false); + manager.setContainDocument(false); + manager.setContainPlugin(false); + manager.setContainRecommend(false); + manager.setNeedIntelligentCustomerService(false); + } + } /** * 弹出alphafine搜索面板 diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java index fe423131d..b1a546184 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java @@ -47,6 +47,7 @@ import com.fr.design.mainframe.InformationCollector; import com.fr.design.mainframe.JForm; import com.fr.design.mainframe.WidgetPropertyPane; import com.fr.design.mainframe.WidgetToolBarPane; +import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.bbs.BBSGuestPane; import com.fr.design.mainframe.bbs.UserInfoPane; import com.fr.design.mainframe.form.FormECCompositeProvider; @@ -134,8 +135,9 @@ public class DesignerActivator extends Activator { DesignerSocketIO.update(); UserInfoPane.getInstance().updateBBSUserInfo(); storePassport(); + AlphaFineHelper.switchConfig4Locale(); } - + private void loadLogAppender() { logHandler = new LogHandler() { final DesignerLogAppender logAppender = new DesignerLogAppender(); From 47540321b5829aa21eb03177b32625842a00b626 Mon Sep 17 00:00:00 2001 From: Harrison Date: Tue, 30 Jul 2019 11:35:10 +0800 Subject: [PATCH 18/46] =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alphafine/AlphaFineHelperTest.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 designer-realize/src/test/java/com.fr/design/mainframe/alphafine/AlphaFineHelperTest.java diff --git a/designer-realize/src/test/java/com.fr/design/mainframe/alphafine/AlphaFineHelperTest.java b/designer-realize/src/test/java/com.fr/design/mainframe/alphafine/AlphaFineHelperTest.java new file mode 100644 index 000000000..3c14275b7 --- /dev/null +++ b/designer-realize/src/test/java/com.fr/design/mainframe/alphafine/AlphaFineHelperTest.java @@ -0,0 +1,46 @@ +package com.fr.design.mainframe.alphafine; + +import com.fr.design.DesignerEnvManager; +import com.fr.design.actions.help.alphafine.AlphaFineConfigManager; +import com.fr.general.GeneralContext; +import org.easymock.EasyMock; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.easymock.PowerMock; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; +import org.powermock.modules.junit4.PowerMockRunner; + +import static org.junit.Assert.*; + +@RunWith(PowerMockRunner.class) +public class AlphaFineHelperTest { + + @Test + @PrepareForTest({GeneralContext.class, DesignerEnvManager.class}) + @SuppressStaticInitializationFor("com.fr.design.mainframe.alphafine.AlphaFineHelper") + public void testSwitchConfig4Locale() throws Exception { + + PowerMock.mockStatic(GeneralContext.class); + EasyMock.expect(GeneralContext.isChineseEnv()).andReturn(true).times(1).andReturn(false).times(1); + + DesignerEnvManager manager = EasyMock.mock(DesignerEnvManager.class); + EasyMock.expect(manager.getAlphaFineConfigManager()).andReturn(new AlphaFineConfigManager()).anyTimes(); + EasyMock.replay(manager); + + PowerMock.mockStatic(DesignerEnvManager.class); + EasyMock.expect(DesignerEnvManager.getEnvManager()).andReturn(manager).anyTimes(); + + PowerMock.replayAll(); + + AlphaFineHelper.switchConfig4Locale(); + AlphaFineConfigManager config = manager.getAlphaFineConfigManager(); + Assert.assertEquals(true, config.isSearchOnLine()); + + AlphaFineHelper.switchConfig4Locale(); + Assert.assertEquals(false, config.isSearchOnLine()); + + + } +} \ No newline at end of file From 9c7c9aba6ed0f01d57f56997b9281136c0b40f30 Mon Sep 17 00:00:00 2001 From: Hades Date: Tue, 30 Jul 2019 15:44:57 +0800 Subject: [PATCH 19/46] =?UTF-8?q?REPORT-19873=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E8=8B=B1=E6=96=87=20=E8=A1=A8=E5=8D=95=E8=87=AA?= =?UTF-8?q?=E9=80=82=E5=BA=94=E8=A2=AB=E9=81=AE=E6=8C=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datapane/TableDataPaneListPane.java | 15 ++++------ .../ui/designer/ButtonGroupDictPane.java | 29 +++++++++++++------ 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java index 963238d22..59880cc4e 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -210,19 +211,15 @@ public class TableDataPaneListPane extends JListControlPane implements TableData @Override public void update(TableDataConfig tableDataConfig) { - Iterator tableDataNames = tableDataConfig.getTableDatas().keySet().iterator(); - while (tableDataNames.hasNext()) { - tableDataConfig.removeTableData(tableDataNames.next()); - } - Iterator procedureName = ProcedureConfig.getInstance().getProcedures().keySet().iterator(); - while (procedureName.hasNext()) { - ProcedureConfig.getInstance().removeProcedure(procedureName.next()); - } + tableDataConfig.removeAllTableData(); + ProcedureConfig.getInstance().removeAllProcedure(); Nameable[] tableDataArray = this.update(); + Map tableDataMap = new LinkedHashMap(); for (int i = 0; i < tableDataArray.length; i++) { NameObject nameObject = (NameObject) tableDataArray[i]; - tableDataConfig.addTableData(nameObject.getName(), (TableData) nameObject.getObject()); + tableDataMap.put(nameObject.getName(), (TableData) nameObject.getObject()); } + tableDataConfig.setTableDatas(tableDataMap); } @Override diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/ButtonGroupDictPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/ButtonGroupDictPane.java index 500d42a1c..bc69bbd1a 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/ButtonGroupDictPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/ButtonGroupDictPane.java @@ -1,16 +1,20 @@ package com.fr.design.widget.ui.designer; +import com.fr.design.designer.IntervalConstants; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UIBasicSpinner; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.widget.FRWidgetFactory; import com.fr.form.ui.ButtonGroup; - -import javax.swing.*; -import java.awt.*; +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.SpinnerNumberModel; +import java.awt.Component; public class ButtonGroupDictPane extends JPanel { @@ -26,16 +30,23 @@ public class ButtonGroupDictPane extends JPanel { * */ public void initComponents() { - - - this.setLayout(FRGUIPaneFactory.createBorderLayout()); adaptiveCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Adaptive"), true); adaptiveCheckbox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - this.columnLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Button_Group_Display_Columns") + ":"); + UILabel dictLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_DS_Dictionary")); + this.columnLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Button_Group_Display_Columns") + ":", dictLabel.getPreferredSize().width); columnSpinner = new UIBasicSpinner(new SpinnerNumberModel(0, 0, Integer.MAX_VALUE, 1)); - - JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{adaptiveCheckbox, columnLabel, columnSpinner}}, TableLayoutHelper.FILL_LASTCOLUMN, 18, 7); + double f = TableLayout.FILL; + double p = TableLayout.PREFERRED; + double[] rowSize = {p, p}; + double[] columnSize = {p, f}; + int[][] rowCount = {{1, 1}, {1, 1}}; + Component[][] components = { + new Component[] {adaptiveCheckbox, null}, + new Component[] {columnLabel, columnSpinner}, + }; + JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); + jPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); this.add(jPanel); } From 128da9067ca69e00e7ef2815032cb0d7b5615fc7 Mon Sep 17 00:00:00 2001 From: Hades Date: Thu, 1 Aug 2019 10:20:05 +0800 Subject: [PATCH 20/46] =?UTF-8?q?REPORT-19897=20=E8=8B=B1=E6=96=87?= =?UTF-8?q?=E7=89=88=E8=AE=BE=E8=AE=A1=E5=99=A8=E6=98=BE=E7=A4=BA=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/constants/UIConstants.java | 163 +++++++++--------- .../java/com/fr/design/dialog/BasicPane.java | 2 +- .../fit/menupane/ReportFitAttrAction.java | 10 +- .../watermark/watermark_background_en.png | Bin 0 -> 290989 bytes .../fr/design/images/reportcolumns/col_en.png | Bin 1348 -> 7334 bytes .../fr/design/images/reportcolumns/row_en.png | Bin 3708 -> 6930 bytes .../editor/BiasTextPainterCellEditor.java | 9 +- .../fr/design/report/ReportColumnsPane.java | 24 ++- 8 files changed, 115 insertions(+), 93 deletions(-) create mode 100644 designer-base/src/main/resources/com/fr/design/images/dialog/watermark/watermark_background_en.png diff --git a/designer-base/src/main/java/com/fr/design/constants/UIConstants.java b/designer-base/src/main/java/com/fr/design/constants/UIConstants.java index 22bdc0a73..1e119d27e 100644 --- a/designer-base/src/main/java/com/fr/design/constants/UIConstants.java +++ b/designer-base/src/main/java/com/fr/design/constants/UIConstants.java @@ -3,13 +3,19 @@ */ package com.fr.design.constants; -import com.fr.base.BaseUtils; - +import com.fr.general.IOUtils; import com.fr.stable.Constants; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.Icon; import javax.swing.border.Border; -import java.awt.*; +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Cursor; +import java.awt.Image; +import java.awt.Point; +import java.awt.Stroke; +import java.awt.Toolkit; import java.awt.image.BufferedImage; /** @@ -17,19 +23,19 @@ import java.awt.image.BufferedImage; */ public interface UIConstants { - public static final Icon CPT_ICON = BaseUtils.readIcon("/com/fr/base/images/oem/cpt.png"); - public static final Icon BLACK_ICON = BaseUtils.readIcon("/com/fr/base/images/cell/blank.gif"); + public static final Icon CPT_ICON = IOUtils.readIcon("/com/fr/base/images/oem/cpt.png"); + public static final Icon BLACK_ICON = IOUtils.readIcon("/com/fr/base/images/cell/blank.gif"); - public static final Image APPFIT_V0 = BaseUtils.readImage("/com/fr/design/images/dialog/appfit/V0.png"); - public static final Image APPFIT_V1 = BaseUtils.readImage("/com/fr/design/images/dialog/appfit/V1.png"); - public static final Image APPFIT_V2 = BaseUtils.readImage("/com/fr/design/images/dialog/appfit/V2.png"); - public static final Image APPFIT_V3 = BaseUtils.readImage("/com/fr/design/images/dialog/appfit/V3.png"); - public static final Image APPFIT_V4 = BaseUtils.readImage("/com/fr/design/images/dialog/appfit/V4.png"); - public static final Image APPFIT_H0 = BaseUtils.readImage("/com/fr/design/images/dialog/appfit/H0.png"); - public static final Image APPFIT_H1 = BaseUtils.readImage("/com/fr/design/images/dialog/appfit/H1.png"); - public static final Image APPFIT_H2 = BaseUtils.readImage("/com/fr/design/images/dialog/appfit/H2.png"); - public static final Image APPFIT_H3 = BaseUtils.readImage("/com/fr/design/images/dialog/appfit/H3.png"); - public static final Image APPFIT_H4 = BaseUtils.readImage("/com/fr/design/images/dialog/appfit/H4.png"); + public static final Image APPFIT_V0 = IOUtils.readImage("/com/fr/design/images/dialog/appfit/V0.png"); + public static final Image APPFIT_V1 = IOUtils.readImage("/com/fr/design/images/dialog/appfit/V1.png"); + public static final Image APPFIT_V2 = IOUtils.readImage("/com/fr/design/images/dialog/appfit/V2.png"); + public static final Image APPFIT_V3 = IOUtils.readImage("/com/fr/design/images/dialog/appfit/V3.png"); + public static final Image APPFIT_V4 = IOUtils.readImage("/com/fr/design/images/dialog/appfit/V4.png"); + public static final Image APPFIT_H0 = IOUtils.readImage("/com/fr/design/images/dialog/appfit/H0.png"); + public static final Image APPFIT_H1 = IOUtils.readImage("/com/fr/design/images/dialog/appfit/H1.png"); + public static final Image APPFIT_H2 = IOUtils.readImage("/com/fr/design/images/dialog/appfit/H2.png"); + public static final Image APPFIT_H3 = IOUtils.readImage("/com/fr/design/images/dialog/appfit/H3.png"); + public static final Image APPFIT_H4 = IOUtils.readImage("/com/fr/design/images/dialog/appfit/H4.png"); public static final Border CELL_ATTR_ZEROBORDER = BorderFactory.createEmptyBorder(0, 0, 0, 0); public static final Border CELL_ATTR_EMPTYBORDER = BorderFactory.createEmptyBorder(0, 10, 0, 0); @@ -45,15 +51,15 @@ public interface UIConstants { * Cell default cursor. */ public static final Cursor CELL_DEFAULT_CURSOR = Toolkit.getDefaultToolkit().createCustomCursor( - BaseUtils.readImage("/com/fr/base/images/cell/cursor/cell_default.png"), + IOUtils.readImage("/com/fr/base/images/cell/cursor/cell_default.png"), new Point(16, 16), "CellDefaultCursor"); public static final Cursor DRAW_CURSOR = Toolkit.getDefaultToolkit().createCustomCursor( - BaseUtils.readImage("/com/fr/base/images/cell/cursor/cursor_draw.png"), + IOUtils.readImage("/com/fr/base/images/cell/cursor/cursor_draw.png"), new Point(16, 16), "DrawCursor"); public static final Cursor FORMAT_BRUSH_CURSOR = Toolkit.getDefaultToolkit().createCustomCursor( - BaseUtils.readImage("/com/fr/base/images/cell/cursor/brush_cursor0.png"), + IOUtils.readImage("/com/fr/base/images/cell/cursor/brush_cursor0.png"), new Point(16, 16), "formatBrushCursor"); /** @@ -140,63 +146,64 @@ public interface UIConstants { - public static final BufferedImage DRAG_BAR = BaseUtils.readImage("com/fr/design/images/control/bar.png"); - public static final BufferedImage DRAG_BAR_LIGHT = BaseUtils.readImage("com/fr/design/images/control/bar-light.png"); - public static final BufferedImage ARROW_NORTH = BaseUtils.readImage("com/fr/design/images/control/up_arrow.png"); - public static final BufferedImage ARROW_SOUTH = BaseUtils.readImage("com/fr/design/images/control/down_arrow.png"); - public static final BufferedImage ARROW_EAST = BaseUtils.readImage("com/fr/design/images/control/east_arrow.png"); - public static final BufferedImage ARROW_WEST = BaseUtils.readImage("com/fr/design/images/control/west_arrow.png"); - - public static final BufferedImage DRAG_BAR_RIGHT = BaseUtils.readImage("com/fr/design/images/control/barm.png"); - public static final BufferedImage DRAG_BAR_LEFT = BaseUtils.readImage("com/fr/design/images/control/barl.png"); - public static final BufferedImage DRAG_UP_NORMAL = BaseUtils.readImage("com/fr/design/images/control/upnor.png"); - public static final BufferedImage DRAG_UP_PRESS = BaseUtils.readImage("com/fr/design/images/control/uppre.png"); - public static final BufferedImage DRAG_DOWN_NORMAL = BaseUtils.readImage("com/fr/design/images/control/downnor.png"); - public static final BufferedImage DRAG_DOWN_PRESS = BaseUtils.readImage("com/fr/design/images/control/downpre.png"); - public static final BufferedImage DRAG_RIGHT_NORMAL = BaseUtils.readImage("com/fr/design/images/control/rightnor.png"); - public static final BufferedImage DRAG_RIGHT_PRESS = BaseUtils.readImage("com/fr/design/images/control/rightpre.png"); - public static final BufferedImage DRAG_LEFT_NORMAL = BaseUtils.readImage("com/fr/design/images/control/leftnor.png"); - public static final BufferedImage DRAG_LEFT_PRESS = BaseUtils.readImage("com/fr/design/images/control/leftpre.png"); - public static final BufferedImage DRAG_DOT = BaseUtils.readImage("com/fr/design/images/control/dot.png"); - public static final BufferedImage DRAG_LINE = BaseUtils.readImage("com/fr/design/images/control/dot-line.png"); - public static final BufferedImage ACCESSIBLE_EDITOR_DOT = BaseUtils.readImage("com/fr/design/images/control/dot.png"); - public static final BufferedImage DRAG_DOT_VERTICAL = BaseUtils.readImage("com/fr/design/images/control/dotv.png"); - public static final BufferedImage POP_BUTTON_DOWN = BaseUtils.readImage("com/fr/design/images/buttonicon/popdownarrow.png"); - public static final BufferedImage POP_BUTTON_UP = BaseUtils.readImage("com/fr/design/images/buttonicon/popuparrow.png"); - public static final BufferedImage DRAG_DOWN_SELECTED_SMALL = BaseUtils.readImage("com/fr/design/images/buttonicon/downSelected.png"); - public static final BufferedImage DRAG_LEFT_NORMAL_SMALL = BaseUtils.readImage("com/fr/design/images/buttonicon/leftNormal.png"); - public static final BufferedImage WATERMARK_BACKGROUND = BaseUtils.readImage("/com/fr/design/images/dialog/watermark/watermark_background.png"); + public static final BufferedImage DRAG_BAR = IOUtils.readImage("com/fr/design/images/control/bar.png"); + public static final BufferedImage DRAG_BAR_LIGHT = IOUtils.readImage("com/fr/design/images/control/bar-light.png"); + public static final BufferedImage ARROW_NORTH = IOUtils.readImage("com/fr/design/images/control/up_arrow.png"); + public static final BufferedImage ARROW_SOUTH = IOUtils.readImage("com/fr/design/images/control/down_arrow.png"); + public static final BufferedImage ARROW_EAST = IOUtils.readImage("com/fr/design/images/control/east_arrow.png"); + public static final BufferedImage ARROW_WEST = IOUtils.readImage("com/fr/design/images/control/west_arrow.png"); + + public static final BufferedImage DRAG_BAR_RIGHT = IOUtils.readImage("com/fr/design/images/control/barm.png"); + public static final BufferedImage DRAG_BAR_LEFT = IOUtils.readImage("com/fr/design/images/control/barl.png"); + public static final BufferedImage DRAG_UP_NORMAL = IOUtils.readImage("com/fr/design/images/control/upnor.png"); + public static final BufferedImage DRAG_UP_PRESS = IOUtils.readImage("com/fr/design/images/control/uppre.png"); + public static final BufferedImage DRAG_DOWN_NORMAL = IOUtils.readImage("com/fr/design/images/control/downnor.png"); + public static final BufferedImage DRAG_DOWN_PRESS = IOUtils.readImage("com/fr/design/images/control/downpre.png"); + public static final BufferedImage DRAG_RIGHT_NORMAL = IOUtils.readImage("com/fr/design/images/control/rightnor.png"); + public static final BufferedImage DRAG_RIGHT_PRESS = IOUtils.readImage("com/fr/design/images/control/rightpre.png"); + public static final BufferedImage DRAG_LEFT_NORMAL = IOUtils.readImage("com/fr/design/images/control/leftnor.png"); + public static final BufferedImage DRAG_LEFT_PRESS = IOUtils.readImage("com/fr/design/images/control/leftpre.png"); + public static final BufferedImage DRAG_DOT = IOUtils.readImage("com/fr/design/images/control/dot.png"); + public static final BufferedImage DRAG_LINE = IOUtils.readImage("com/fr/design/images/control/dot-line.png"); + public static final BufferedImage ACCESSIBLE_EDITOR_DOT = IOUtils.readImage("com/fr/design/images/control/dot.png"); + public static final BufferedImage DRAG_DOT_VERTICAL = IOUtils.readImage("com/fr/design/images/control/dotv.png"); + public static final BufferedImage POP_BUTTON_DOWN = IOUtils.readImage("com/fr/design/images/buttonicon/popdownarrow.png"); + public static final BufferedImage POP_BUTTON_UP = IOUtils.readImage("com/fr/design/images/buttonicon/popuparrow.png"); + public static final BufferedImage DRAG_DOWN_SELECTED_SMALL = IOUtils.readImage("com/fr/design/images/buttonicon/downSelected.png"); + public static final BufferedImage DRAG_LEFT_NORMAL_SMALL = IOUtils.readImage("com/fr/design/images/buttonicon/leftNormal.png"); + public static final BufferedImage WATERMARK_BACKGROUND = IOUtils.readImage("/com/fr/design/images/dialog/watermark/" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_WaterMark_Background_Icon_File_Name")); + public static final int MODEL_NORMAL = 0; public static final int MODEL_PRESS = 1; - public static final Icon ARROW_DOWN_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/arrowdown.png"); - public static final Icon ARROW_UP_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/arrowup.png"); - public static final Icon YES_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/yes.png"); - public static final Icon CHOOSEN_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/select_item.png"); - public static final Icon PRE_WIDGET_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/prewidget.png"); - public static final Icon EDIT_NORMAL_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/editn.png"); - public static final Icon EDIT_PRESSED_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/editp.png"); - public static final Icon HIDE_NORMAL_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/hiden.png"); - public static final Icon HIDE_PRESSED_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/hidep.png"); - public static final Icon VIEW_NORMAL_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/viewn.png"); - public static final Icon VIEW_PRESSED_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/viewp.png"); - public static final Icon RUN_BIG_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/run24.png"); - public static final Icon RUN_SMALL_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/runs.png"); - public static final Icon PAGE_BIG_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/pageb24.png"); - public static final Icon WRITE_BIG_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/writeb24.png"); - public static final Icon ANA_BIG_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/anab24.png"); - public static final Icon PAGE_SMALL_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/pages.png"); - public static final Icon WRITE_SMALL_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/writes.png"); - public static final Icon ANA_SMALL_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/anas.png"); - public static final Icon REFRESH_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/refresh.png"); - public static final Icon FONT_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/color/foreground.png"); - public static final Icon HISTORY_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/history.png"); - public static final Icon DELETE_ICON = BaseUtils.readIcon("com/fr/design/images/m_file/close.png"); - public static final Icon EDIT_ICON = BaseUtils.readIcon("com/fr/design/images/m_file/edit.png"); - public static final Icon SEARCH_ICON = BaseUtils.readIcon("/com/fr/design/images/data/search.png"); - public static final Icon BLACK_SEARCH_ICON = BaseUtils.readIcon("/com/fr/design/images/data/black_search.png"); - public static final Icon CLEAR_ICON = BaseUtils.readIcon("/com/fr/design/images/data/source/delete.png"); - public static final Icon LIST_EDIT_ICON = BaseUtils.readIcon("/com/fr/design/images/control/edit.png"); - public static final Icon LIST_EDIT_WHITE_ICON = BaseUtils.readIcon("/com/fr/design/images/control/edit_white.png"); + public static final Icon ARROW_DOWN_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/arrowdown.png"); + public static final Icon ARROW_UP_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/arrowup.png"); + public static final Icon YES_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/yes.png"); + public static final Icon CHOOSEN_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/select_item.png"); + public static final Icon PRE_WIDGET_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/prewidget.png"); + public static final Icon EDIT_NORMAL_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/editn.png"); + public static final Icon EDIT_PRESSED_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/editp.png"); + public static final Icon HIDE_NORMAL_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/hiden.png"); + public static final Icon HIDE_PRESSED_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/hidep.png"); + public static final Icon VIEW_NORMAL_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/viewn.png"); + public static final Icon VIEW_PRESSED_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/viewp.png"); + public static final Icon RUN_BIG_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/run24.png"); + public static final Icon RUN_SMALL_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/runs.png"); + public static final Icon PAGE_BIG_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/pageb24.png"); + public static final Icon WRITE_BIG_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/writeb24.png"); + public static final Icon ANA_BIG_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/anab24.png"); + public static final Icon PAGE_SMALL_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/pages.png"); + public static final Icon WRITE_SMALL_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/writes.png"); + public static final Icon ANA_SMALL_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/anas.png"); + public static final Icon REFRESH_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/refresh.png"); + public static final Icon FONT_ICON = IOUtils.readIcon("/com/fr/design/images/gui/color/foreground.png"); + public static final Icon HISTORY_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/history.png"); + public static final Icon DELETE_ICON = IOUtils.readIcon("com/fr/design/images/m_file/close.png"); + public static final Icon EDIT_ICON = IOUtils.readIcon("com/fr/design/images/m_file/edit.png"); + public static final Icon SEARCH_ICON = IOUtils.readIcon("/com/fr/design/images/data/search.png"); + public static final Icon BLACK_SEARCH_ICON = IOUtils.readIcon("/com/fr/design/images/data/black_search.png"); + public static final Icon CLEAR_ICON = IOUtils.readIcon("/com/fr/design/images/data/source/delete.png"); + public static final Icon LIST_EDIT_ICON = IOUtils.readIcon("/com/fr/design/images/control/edit.png"); + public static final Icon LIST_EDIT_WHITE_ICON = IOUtils.readIcon("/com/fr/design/images/control/edit_white.png"); public static final Color PRESSED_DARK_GRAY = new Color(127, 127, 127); public static final Color GRDIENT_DARK_GRAY = new Color(45, 45, 45); public static final Color BARNOMAL = new Color(232, 232, 233); @@ -205,10 +212,10 @@ public interface UIConstants { public static final int BUTTON_GROUP_ARC = 0; public static final int LARGEARC = 6; public static final Stroke BS = new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 2f, new float[]{3, 1}, 0); - public static final Icon PREVIEW_DOWN = BaseUtils.readIcon("com/fr/design/images/buttonicon/prevew_down_icon.png"); - public static final Icon CLOSE_OF_AUTHORITY = BaseUtils.readIcon("/com/fr/design/images/m_report/close.png"); - public static final Icon CLOSE_OVER_AUTHORITY = BaseUtils.readIcon("/com/fr/design/images/m_report/close_over.png"); - public static final Icon CLOSE_PRESS_AUTHORITY = BaseUtils.readIcon("/com/fr/design/images/m_report/close_press.png"); + public static final Icon PREVIEW_DOWN = IOUtils.readIcon("com/fr/design/images/buttonicon/prevew_down_icon.png"); + public static final Icon CLOSE_OF_AUTHORITY = IOUtils.readIcon("/com/fr/design/images/m_report/close.png"); + public static final Icon CLOSE_OVER_AUTHORITY = IOUtils.readIcon("/com/fr/design/images/m_report/close_over.png"); + public static final Icon CLOSE_PRESS_AUTHORITY = IOUtils.readIcon("/com/fr/design/images/m_report/close_press.png"); public static final int CLOSE_AUTHORITY_HEIGHT_AND_WIDTH = 24; diff --git a/designer-base/src/main/java/com/fr/design/dialog/BasicPane.java b/designer-base/src/main/java/com/fr/design/dialog/BasicPane.java index 4809e536c..d752f58f0 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/BasicPane.java +++ b/designer-base/src/main/java/com/fr/design/dialog/BasicPane.java @@ -129,7 +129,7 @@ public abstract class BasicPane extends JPanel { * @param dimension 自定义尺寸 * @return 对话框 */ - protected BasicDialog showWindowWithCustomSize(Window window, DialogActionListener l, Dimension dimension) { + public BasicDialog showWindowWithCustomSize(Window window, DialogActionListener l, Dimension dimension) { BasicDialog dg; if (window instanceof Frame) { dg = new DIALOG((Frame) window); diff --git a/designer-base/src/main/java/com/fr/design/report/fit/menupane/ReportFitAttrAction.java b/designer-base/src/main/java/com/fr/design/report/fit/menupane/ReportFitAttrAction.java index 57fa7bb33..29a8a7deb 100644 --- a/designer-base/src/main/java/com/fr/design/report/fit/menupane/ReportFitAttrAction.java +++ b/designer-base/src/main/java/com/fr/design/report/fit/menupane/ReportFitAttrAction.java @@ -1,6 +1,5 @@ package com.fr.design.report.fit.menupane; -import com.fr.base.BaseUtils; import com.fr.design.actions.JTemplateAction; import com.fr.design.beans.BasicBeanPane; import com.fr.design.dialog.DialogActionAdapter; @@ -8,18 +7,17 @@ import com.fr.design.dialog.UIDialog; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.design.menu.MenuKeySet; +import com.fr.general.IOUtils; import com.fr.report.fit.FitProvider; import com.fr.report.fit.ReportFitAttr; import javax.swing.KeyStroke; -import java.awt.Dimension; import java.awt.event.ActionEvent; /** * Created by Administrator on 2015/7/6 0006. */ public class ReportFitAttrAction extends JTemplateAction { - private static final Dimension MEDIUM = new Dimension(430, 400); private static final MenuKeySet REPORT_FIT_ATTR = new MenuKeySet() { @Override public char getMnemonic() { @@ -67,7 +65,7 @@ public class ReportFitAttrAction extends JTemplateAction { } this.setName(getMenuKeySet().getMenuKeySetName() + "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/reportfit/fit.png")); + this.setSmallIcon(IOUtils.readIcon("/com/fr/design/images/reportfit/fit.png")); } /** @@ -75,6 +73,7 @@ public class ReportFitAttrAction extends JTemplateAction { * * @param e 事件 */ + @Override public void actionPerformed(ActionEvent e) { final JTemplate jwb = getEditingComponent(); if (jwb == null) { @@ -93,14 +92,13 @@ public class ReportFitAttrAction extends JTemplateAction { private void showReportFitDialog(ReportFitAttr fitAttr, final JTemplate jwb, final FitProvider wbTpl, final BasicBeanPane attrPane) { attrPane.populateBean(fitAttr); - UIDialog dialog = attrPane.showUnsizedWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { + UIDialog dialog = attrPane.showMediumWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { @Override public void doOk() { wbTpl.setReportFitAttr(attrPane.updateBean()); jwb.fireTargetModified(); } }); - dialog.setSize(MEDIUM); dialog.setVisible(true); } diff --git a/designer-base/src/main/resources/com/fr/design/images/dialog/watermark/watermark_background_en.png b/designer-base/src/main/resources/com/fr/design/images/dialog/watermark/watermark_background_en.png new file mode 100644 index 0000000000000000000000000000000000000000..38054513ce09ff0351a8fcb6fdfe11b7e6f8cfef GIT binary patch literal 290989 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

*vlmgix!W>+3ZvDdK9ZB9;w}`X# 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 diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_en.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_en.png index 7c66662a2b71430e6d6503f006b932708febaff1..76328cf7d437a2026fa7330b1400940baaf34130 100644 GIT binary patch literal 6930 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 literal 3708 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 a{tW=pmU1S9{IU7~0000 Date: Fri, 2 Aug 2019 17:37:19 +0800 Subject: [PATCH 21/46] =?UTF-8?q?=E6=97=A0jira=20sonar=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/file/HistoryTemplateListCache.java | 15 +++----- .../design/update/actions/FileDownloader.java | 25 ++++++------ .../factory/DirectoryOperationFactory.java | 15 +++----- .../update/ui/dialog/EncodingDetect.java | 31 +++++++-------- .../update/ui/dialog/UpdateMainDialog.java | 38 +++++++++---------- .../manager/impl/PluginSearchManager.java | 19 +++++----- .../manager/impl/RecommendSearchManager.java | 20 +++++----- .../manager/impl/SegmentationManager.java | 18 ++++----- .../manager/impl/SimilarSearchManager.java | 20 +++++----- 9 files changed, 93 insertions(+), 108 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java index fc46ff59b..cb839c6d7 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java @@ -41,17 +41,12 @@ public class HistoryTemplateListCache implements CallbackEvent { private List> historyList; private JTemplate editingTemplate; - private static volatile HistoryTemplateListCache instacne; - public static HistoryTemplateListCache getInstance() { - if (instacne == null) { - synchronized (HistoryTemplateListCache.class) { - if (instacne == null) { - instacne = new HistoryTemplateListCache(); - } - } - } - return instacne; + return Holder.INSTANCE; + } + + private static class Holder { + private static final HistoryTemplateListCache INSTANCE = new HistoryTemplateListCache(); } private HistoryTemplateListCache() { diff --git a/designer-base/src/main/java/com/fr/design/update/actions/FileDownloader.java b/designer-base/src/main/java/com/fr/design/update/actions/FileDownloader.java index 556fa5113..4da324f29 100644 --- a/designer-base/src/main/java/com/fr/design/update/actions/FileDownloader.java +++ b/designer-base/src/main/java/com/fr/design/update/actions/FileDownloader.java @@ -80,22 +80,21 @@ public abstract class FileDownloader extends SwingWorker URLConnection connection = url.openConnection(); int total = connection.getContentLength(); item.setTotalLength(total); - InputStream reader = connection.getInputStream(); File tempFile = new File(StableUtils.pathJoin(saveDir, item.getName())); StableUtils.makesureFileExist(tempFile); - FileOutputStream writer = new FileOutputStream(tempFile); - byte[] buffer = new byte[UpdateConstants.BYTE]; - int bytesRead = 0; - int totalBytesRead = 0; - while ((bytesRead = reader.read(buffer)) != -1) { - writer.write(buffer, 0, bytesRead); - buffer = new byte[UpdateConstants.BYTE]; - totalBytesRead += bytesRead; - item.setDownloadLength(totalBytesRead); - publish(item); + try ( InputStream reader = connection.getInputStream(); + FileOutputStream writer = new FileOutputStream(tempFile)) { + byte[] buffer = new byte[UpdateConstants.BYTE]; + int bytesRead = 0; + int totalBytesRead = 0; + while ((bytesRead = reader.read(buffer)) != -1) { + writer.write(buffer, 0, bytesRead); + buffer = new byte[UpdateConstants.BYTE]; + totalBytesRead += bytesRead; + item.setDownloadLength(totalBytesRead); + publish(item); + } } - reader.close(); - writer.close(); } /** diff --git a/designer-base/src/main/java/com/fr/design/update/factory/DirectoryOperationFactory.java b/designer-base/src/main/java/com/fr/design/update/factory/DirectoryOperationFactory.java index 906b71412..48c151488 100644 --- a/designer-base/src/main/java/com/fr/design/update/factory/DirectoryOperationFactory.java +++ b/designer-base/src/main/java/com/fr/design/update/factory/DirectoryOperationFactory.java @@ -82,15 +82,12 @@ public class DirectoryOperationFactory { } private static void copy(String path1, String path2) throws IOException { - DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(path1))); - DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(path2))); - byte[] date = new byte[in.available()]; - - in.read(date); - out.write(date); - - in.close(); - out.close(); + try (DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(path1))); + DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(path2)))) { + byte[] date = new byte[in.available()]; + in.read(date); + out.write(date); + } } /** diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/EncodingDetect.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/EncodingDetect.java index 41bba0f4f..e21bb1dcc 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/EncodingDetect.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/EncodingDetect.java @@ -11,12 +11,12 @@ import java.io.FileInputStream; * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * EncodingDetect.java
* 自动获取文件的编码 * @author Mata * @since Create on 2018-08-23 - * @version 1.0 + * @version 1.0 */ public class EncodingDetect { /** @@ -25,11 +25,11 @@ public class EncodingDetect { * @return 文件的编码 */ public static String getJavaEncode(File file){ - BytesEncodingDetect s = new BytesEncodingDetect(); + BytesEncodingDetect s = new BytesEncodingDetect(); String fileCode = BytesEncodingDetect.javaname[s.detectEncoding(file)]; return fileCode; } - + } @@ -75,17 +75,14 @@ class BytesEncodingDetect extends Encoding { * type. The encoding type with the highest probability is returned. */ public int detectEncoding(File testfile) { - FileInputStream chinesefile; - byte[] rawtext; - rawtext = new byte[(int) testfile.length()]; - try { - chinesefile = new FileInputStream(testfile); - chinesefile.read(rawtext); - chinesefile.close(); - } catch (Exception e) { - System.err.println("Error: " + e); - } - return detectEncoding(rawtext); + byte[] rawtext = new byte[(int) testfile.length()]; + try(FileInputStream chinesefile = new FileInputStream(testfile)) { + chinesefile.read(rawtext); + chinesefile.close(); + } catch (Exception e) { + System.err.println("Error: " + e); + } + return detectEncoding(rawtext); } /** @@ -647,7 +644,7 @@ class BytesEncodingDetect extends Encoding { * (byte)0xDF) == rawtext[i]) { // Two bytes if (i+1 < rawtextlen && (rawtext[i+1] & (byte)0xBF) == rawtext[i+1]) { * goodbytes += 2; i++; } } else if ((rawtext[i] & (byte)0xEF) == rawtext[i]) { // Three bytes if (i+2 < rawtextlen && * (rawtext[i+1] & (byte)0xBF) == rawtext[i+1] && (rawtext[i+2] & (byte)0xBF) == rawtext[i+2]) { goodbytes += 3; i+=2; } } } - * + * * score = (int)(100 * ((float)goodbytes/(float)rawtext.length)); // An all ASCII file is also a good UTF8 file, but I'd * rather it // get identified as ASCII. Can delete following 3 lines otherwise if (goodbytes == asciibytes) { score = 0; } // * If not above 90, reduce to zero to prevent coincidental matches if (score > 90) { return score; } else { return 0; } @@ -4551,5 +4548,5 @@ class BytesEncodingDetect extends Encoding { nicename[ASCII] = "ASCII"; nicename[OTHER] = "OTHER"; } - + } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java index e59cc09ff..81239d84b 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java @@ -468,30 +468,28 @@ public class UpdateMainDialog extends UIDialog { return; } if (cacheFile.exists()) { - InputStreamReader streamReader = new InputStreamReader(new FileInputStream(cacheFile), "UTF-8"); - BufferedReader br = new BufferedReader(streamReader); - String readStr, updateTimeStr; - - while ((readStr = br.readLine()) != null) { - String[] updateInfo = readStr.split("\\t"); - if (updateInfo.length == 2) { - updateTimeStr = updateInfo[0]; - Date updateTime = CHANGELOG_FORMAT.parse(updateTimeStr); - //形如 Build#release-2018.07.31.03.03.52.80 - String currentNO = GeneralUtils.readBuildNO(); - Date curJarDate = UPDATE_INFO_TABLE_FORMAT.parse(currentNO, new ParsePosition(currentNO.indexOf("-") + 1)); - if (!ComparatorUtils.equals(keyword, StringUtils.EMPTY)) { - if (!containsKeyword(UPDATE_INFO_TABLE_FORMAT.format(updateTime), keyword) && !containsKeyword(updateInfo[1], keyword)) { - continue; + try (InputStreamReader streamReader = new InputStreamReader(new FileInputStream(cacheFile), "UTF-8"); + BufferedReader br = new BufferedReader(streamReader)) { + String readStr, updateTimeStr; + while ((readStr = br.readLine()) != null) { + String[] updateInfo = readStr.split("\\t"); + if (updateInfo.length == 2) { + updateTimeStr = updateInfo[0]; + Date updateTime = CHANGELOG_FORMAT.parse(updateTimeStr); + //形如 Build#release-2018.07.31.03.03.52.80 + String currentNO = GeneralUtils.readBuildNO(); + Date curJarDate = UPDATE_INFO_TABLE_FORMAT.parse(currentNO, new ParsePosition(currentNO.indexOf("-") + 1)); + if (!ComparatorUtils.equals(keyword, StringUtils.EMPTY)) { + if (!containsKeyword(UPDATE_INFO_TABLE_FORMAT.format(updateTime), keyword) && !containsKeyword(updateInfo[1], keyword)) { + continue; + } + } + if (isValidLogInfo(updateInfo[1])) { + updateInfoList.add(new Object[]{UPDATE_INFO_TABLE_FORMAT.format(updateTime), updateInfo[1], updateTime.after(curJarDate)}); } - } - if (isValidLogInfo(updateInfo[1])) { - updateInfoList.add(new Object[]{UPDATE_INFO_TABLE_FORMAT.format(updateTime), updateInfo[1], updateTime.after(curJarDate)}); } } } - br.close(); - streamReader.close(); } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java index ddd3bc0fc..a902d0e00 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java @@ -27,21 +27,20 @@ import java.net.URLEncoder; * Created by XiaXiang on 2017/3/27. */ public class PluginSearchManager implements AlphaFineSearchProvider { - private static volatile PluginSearchManager instance; private SearchResult lessModelList; private SearchResult moreModelList; + private PluginSearchManager() { + + } public static PluginSearchManager getInstance() { - if (instance == null) { - synchronized (PluginSearchManager.class) { - if (instance == null) { - instance = new PluginSearchManager(); - } - } - } - return instance; + return Holder.INSTANCE; + + } + private static class Holder { + private static final PluginSearchManager INSTANCE = new PluginSearchManager(); } private static boolean isCompatibleCurrentEnv(String envVersion) { @@ -105,7 +104,7 @@ public class PluginSearchManager implements AlphaFineSearchProvider { lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Plugin_Addon"))); return lessModelList; } - SearchResult noConnectList = AlphaFineHelper.getNoConnectList(instance); + SearchResult noConnectList = AlphaFineHelper.getNoConnectList(Holder.INSTANCE); if(noConnectList != null){ return noConnectList; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java index e15c5b966..05267220b 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java @@ -25,22 +25,22 @@ import java.util.List; * Created by XiaXiang on 2017/3/31. */ public class RecommendSearchManager implements AlphaFineSearchProvider { - private static volatile RecommendSearchManager instance; private SearchResult modelList = new SearchResult(); private SearchResult recommendModelList = new SearchResult(); private SearchResult complementAdviceModelList; private SearchResult moreModelList = new SearchResult(); + private RecommendSearchManager() { + + } + public static RecommendSearchManager getInstance() { - if (instance == null) { - synchronized (RecentSearchManager.class) { - if (instance == null) { - instance = new RecommendSearchManager(); - } - } - } - return instance; + return Holder.INSTANCE; + } + + private static class Holder { + private static final RecommendSearchManager INSTANCE = new RecommendSearchManager(); } @Override @@ -51,7 +51,7 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { if (ArrayUtils.isEmpty(searchText)) { return new SearchResult(); } - SearchResult noConnectList = AlphaFineHelper.getNoConnectList(instance); + SearchResult noConnectList = AlphaFineHelper.getNoConnectList(Holder.INSTANCE); if (noConnectList != null) { return noConnectList; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java index 40c37341c..c9622193c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java @@ -13,18 +13,18 @@ import java.util.regex.Pattern; * Created by alex.sung on 2018/8/3. */ public class SegmentationManager { - private static volatile SegmentationManager segmentationManager = null; private static final int MAX_CHINESE_CHARACTERS_NUM = 4; + private SegmentationManager() { + + } + public static SegmentationManager getInstance() { - if (segmentationManager == null) { - synchronized (SegmentationManager.class) { - if (segmentationManager == null) { - segmentationManager = new SegmentationManager(); - } - } - } - return segmentationManager; + return Holder.INSTANCE; + } + + private static class Holder { + private static final SegmentationManager INSTANCE = new SegmentationManager(); } /** diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManager.java index 1754b1284..f353573b4 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManager.java @@ -18,19 +18,19 @@ import com.fr.third.org.apache.commons.codec.digest.DigestUtils; * Created by alex.sung on 2018/8/3. */ public class SimilarSearchManager implements AlphaFineSearchProvider { - private static volatile SimilarSearchManager instance; private SearchResult lessModelList; private SearchResult moreModelList = new SearchResult(); + private SimilarSearchManager() { + + } + public static SimilarSearchManager getInstance() { - if (instance == null) { - synchronized (SimilarSearchManager.class) { - if (instance == null) { - instance = new SimilarSearchManager(); - } - } - } - return instance; + return Holder.INSTANCE; + } + + private static class Holder { + private static final SimilarSearchManager INSTANCE = new SimilarSearchManager(); } @Override @@ -40,7 +40,7 @@ public class SimilarSearchManager implements AlphaFineSearchProvider { if (ArrayUtils.isEmpty(searchText)) { return new SearchResult(); } - SearchResult noConnectList = AlphaFineHelper.getNoConnectList(instance); + SearchResult noConnectList = AlphaFineHelper.getNoConnectList(Holder.INSTANCE); if (noConnectList != null) { return noConnectList; } From 33642afad2d1fd74f4a16806834fe1b61fd6f51a Mon Sep 17 00:00:00 2001 From: Harrison Date: Mon, 5 Aug 2019 09:40:46 +0800 Subject: [PATCH 22/46] =?UTF-8?q?=E6=97=A0=20jira=20=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=EF=BC=8C=20=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/alphafine/AlphaFineHelperTest.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/designer-realize/src/test/java/com.fr/design/mainframe/alphafine/AlphaFineHelperTest.java b/designer-realize/src/test/java/com.fr/design/mainframe/alphafine/AlphaFineHelperTest.java index 3c14275b7..21df0da47 100644 --- a/designer-realize/src/test/java/com.fr/design/mainframe/alphafine/AlphaFineHelperTest.java +++ b/designer-realize/src/test/java/com.fr/design/mainframe/alphafine/AlphaFineHelperTest.java @@ -11,8 +11,7 @@ import org.powermock.api.easymock.PowerMock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.PowerMockRunner; - -import static org.junit.Assert.*; +import org.powermock.reflect.Whitebox; @RunWith(PowerMockRunner.class) public class AlphaFineHelperTest { @@ -25,8 +24,13 @@ public class AlphaFineHelperTest { PowerMock.mockStatic(GeneralContext.class); EasyMock.expect(GeneralContext.isChineseEnv()).andReturn(true).times(1).andReturn(false).times(1); + AlphaFineConfigManager mockConfig = EasyMock.partialMockBuilder(AlphaFineConfigManager.class).createMock(); + Whitebox.setInternalState(mockConfig,"searchOnLine", true); + EasyMock.replay(mockConfig); + DesignerEnvManager manager = EasyMock.mock(DesignerEnvManager.class); - EasyMock.expect(manager.getAlphaFineConfigManager()).andReturn(new AlphaFineConfigManager()).anyTimes(); + EasyMock.expect(manager.getAlphaFineConfigManager()).andReturn(mockConfig).anyTimes(); + EasyMock.replay(manager); PowerMock.mockStatic(DesignerEnvManager.class); From c9958151e0b8426bcec1ec0e2e93c7c35ad0e54e Mon Sep 17 00:00:00 2001 From: Hades Date: Mon, 5 Aug 2019 16:01:02 +0800 Subject: [PATCH 23/46] update --- .../java/com/fr/design/update/ui/dialog/EncodingDetect.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/EncodingDetect.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/EncodingDetect.java index e21bb1dcc..d782428ce 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/EncodingDetect.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/EncodingDetect.java @@ -1,5 +1,6 @@ package com.fr.design.update.ui.dialog; +import com.fr.log.FineLoggerFactory; import java.io.File; import java.io.FileInputStream; @@ -76,11 +77,10 @@ class BytesEncodingDetect extends Encoding { */ public int detectEncoding(File testfile) { byte[] rawtext = new byte[(int) testfile.length()]; - try(FileInputStream chinesefile = new FileInputStream(testfile)) { + try (FileInputStream chinesefile = new FileInputStream(testfile)) { chinesefile.read(rawtext); - chinesefile.close(); } catch (Exception e) { - System.err.println("Error: " + e); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } return detectEncoding(rawtext); } From 2372920230fbf6e880b6732e816558e51e96f86f Mon Sep 17 00:00:00 2001 From: WeiYanglu Date: Sat, 10 Aug 2019 21:09:59 +0800 Subject: [PATCH 24/46] =?UTF-8?q?MOBILE-21673=20&=20MOBILE-21669=20?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E7=AB=AF=E6=8E=A7=E4=BB=B6=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=8C=96=E6=8E=A5=E5=8F=A3=E8=AE=BE=E8=AE=A1=E5=99=A8=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/ExtraDesignClassManager.java | 22 ++- .../design/fun/MobileWidgetStyleProvider.java | 24 ++++ .../AbstractMobileWidgetStyleProvider.java | 20 +++ .../DefaultMobileStyleCustomDefinePane.java | 39 ++++++ .../ui/DefaultMobileWidgetStyleProvider.java | 30 ++++ .../ui/MobileStyleCustomDefinePane.java | 22 +++ .../mobile/ui/MobileStyleDefinePane.java | 115 ++++++++++++++++ .../mainframe/mobile/ui/MobileStylePane.java | 130 ++++++++++++++++++ .../AccessibleMobileStyleEditor.java | 36 +++++ .../widget/wrappers/MobileStyleWrapper.java | 26 ++++ .../design/designer/creator/XChartEditor.java | 5 + .../fr/design/designer/creator/XCreator.java | 9 +- .../design/designer/creator/XElementCase.java | 5 + .../designer/creator/XLayoutContainer.java | 5 + .../designer/creator/XWScaleLayout.java | 5 + .../mobile/MobileStylePropertyUI.java | 31 +++++ .../design/mainframe/WidgetPropertyPane.java | 7 +- .../mobile/MobileWidgetStyleDefinePane.java | 85 ++++++++++++ 18 files changed, 608 insertions(+), 8 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/fun/MobileWidgetStyleProvider.java create mode 100644 designer-base/src/main/java/com/fr/design/fun/impl/AbstractMobileWidgetStyleProvider.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileStyleCustomDefinePane.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileWidgetStyleProvider.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleCustomDefinePane.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleMobileStyleEditor.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/widget/wrappers/MobileStyleWrapper.java create mode 100644 designer-form/src/main/java/com/fr/design/designer/properties/mobile/MobileStylePropertyUI.java create mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/MobileWidgetStyleDefinePane.java diff --git a/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java b/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java index beb62c06e..874a8f8b1 100644 --- a/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java +++ b/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java @@ -6,18 +6,14 @@ package com.fr.design; import com.fr.base.BaseUtils; import com.fr.design.data.datapane.TableDataNameObjectCreator; -import com.fr.design.fun.CellWidgetOptionProvider; -import com.fr.design.fun.FormWidgetOptionProvider; -import com.fr.design.fun.ParameterWidgetOptionProvider; -import com.fr.design.fun.ServerTableDataDefineProvider; -import com.fr.design.fun.TableDataDefineProvider; -import com.fr.design.fun.ToolbarItemProvider; +import com.fr.design.fun.*; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.core.WidgetOptionFactory; import com.fr.design.menu.ShortCut; import com.fr.design.widget.Appearance; import com.fr.design.widget.mobile.WidgetMobilePane; import com.fr.form.ui.Widget; +import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; import com.fr.plugin.AbstractExtraClassManager; import com.fr.plugin.injectable.PluginModule; @@ -207,6 +203,20 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement return map; } + public MobileWidgetStyleProvider[] getMobileStyleOfWidget(String xType) { + Set set = getArray(MobileWidgetStyleProvider.XML_TAG); + if (set.isEmpty()) { + return new MobileWidgetStyleProvider[0]; + } + List providers = new ArrayList<>(); + for (MobileWidgetStyleProvider provider: set) { + if(ComparatorUtils.equalsIgnoreCase(provider.xTypeForWidget(), xType)) { + providers.add(provider); + } + } + return providers.toArray(new MobileWidgetStyleProvider[providers.size()]); + } + @Override protected boolean demountSpecific(PluginSingleInjection injection) { diff --git a/designer-base/src/main/java/com/fr/design/fun/MobileWidgetStyleProvider.java b/designer-base/src/main/java/com/fr/design/fun/MobileWidgetStyleProvider.java new file mode 100644 index 000000000..bc01837ee --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/MobileWidgetStyleProvider.java @@ -0,0 +1,24 @@ +package com.fr.design.fun; + +import com.fr.design.mainframe.mobile.ui.MobileStyleCustomDefinePane; +import com.fr.form.ui.mobile.MobileStyle; +import com.fr.stable.fun.mark.Mutable; + +/** + * 移动端组件样式扩展接口 + */ +public interface MobileWidgetStyleProvider extends Mutable { + + String XML_TAG = "MobileWidgetStyleProvider"; + + int CURRENT_LEVEL = 1; + + Class classForMobileStyle(); + + Class classForWidgetAppearance(); + + String xTypeForWidget(); + + String displayName(); + +} diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractMobileWidgetStyleProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractMobileWidgetStyleProvider.java new file mode 100644 index 000000000..407aa058c --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractMobileWidgetStyleProvider.java @@ -0,0 +1,20 @@ +package com.fr.design.fun.impl; + +import com.fr.design.fun.MobileWidgetStyleProvider; +import com.fr.stable.fun.impl.AbstractProvider; +import com.fr.stable.fun.mark.API; + +@API(level = MobileWidgetStyleProvider.CURRENT_LEVEL) +public abstract class AbstractMobileWidgetStyleProvider extends AbstractProvider implements MobileWidgetStyleProvider { + + @Override + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + @Override + public String mark4Provider() { + return getClass().getName(); + } + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileStyleCustomDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileStyleCustomDefinePane.java new file mode 100644 index 000000000..62257fde5 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileStyleCustomDefinePane.java @@ -0,0 +1,39 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.form.ui.Widget; +import com.fr.form.ui.mobile.MobileStyle; + +import javax.swing.*; + +public class DefaultMobileStyleCustomDefinePane extends MobileStyleCustomDefinePane { + + + public DefaultMobileStyleCustomDefinePane(Widget widget) { + super(widget); + } + + @Override + protected JPanel createPreviewPane() { + return null; + } + + @Override + public void populateBean(MobileStyle ob) { + + } + + @Override + public MobileStyle updateBean() { + return null; + } + + @Override + protected String title4PopupWindow() { + return null; + } + + @Override + protected void init() { + + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileWidgetStyleProvider.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileWidgetStyleProvider.java new file mode 100644 index 000000000..b1710ff14 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileWidgetStyleProvider.java @@ -0,0 +1,30 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.design.fun.impl.AbstractMobileWidgetStyleProvider; +import com.fr.form.ui.mobile.DefaultMobileStyle; +import com.fr.form.ui.mobile.MobileStyle; +import com.fr.locale.InterProviderFactory; + +public class DefaultMobileWidgetStyleProvider extends AbstractMobileWidgetStyleProvider { + + @Override + public Class classForMobileStyle() { + return DefaultMobileStyle.class; + } + + @Override + public Class classForWidgetAppearance() { + return DefaultMobileStyleCustomDefinePane.class; + } + + @Override + public String xTypeForWidget() { + return null; + } + + @Override + public String displayName() { + return InterProviderFactory.getProvider().getLocText("Fine-Engine_Report_DEFAULT"); + } + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleCustomDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleCustomDefinePane.java new file mode 100644 index 000000000..91729eb96 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleCustomDefinePane.java @@ -0,0 +1,22 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.form.ui.Widget; +import com.fr.form.ui.mobile.MobileStyle; + +import javax.swing.*; + +public abstract class MobileStyleCustomDefinePane extends BasicBeanPane { + + protected Widget widget; + + public MobileStyleCustomDefinePane(Widget widget) { + this.widget = widget; + init(); + } + + protected abstract JPanel createPreviewPane(); + + protected abstract void init(); + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java new file mode 100644 index 000000000..ef1327ccf --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java @@ -0,0 +1,115 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.style.color.NewColorSelectBox; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.form.ui.Widget; +import com.fr.form.ui.mobile.MobileStyle; +import com.fr.general.FRFont; +import com.fr.invoke.Reflect; + +import javax.swing.*; +import javax.swing.border.TitledBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; + +public class MobileStyleDefinePane extends BasicBeanPane { + + private Widget widget; + private MobileStyleCustomDefinePane customBeanPane; + private Class mobileStyleClazz; + private NewColorSelectBox colorSelectBox; + + MobileStyleDefinePane(Widget widget, Class customBeanPaneClass, + Class mobileStyleClazz) { + this.widget = widget; + this.customBeanPane = Reflect.on(customBeanPaneClass).create(widget).get(); + this.mobileStyleClazz = mobileStyleClazz; + init(); + } + + @Override + public void populateBean(MobileStyle ob) { + this.customBeanPane.populateBean(ob); + colorSelectBox.setSelectObject(ob.getBackground()); + } + + @Override + public MobileStyle updateBean() { + MobileStyle mobileStyle = Reflect.on(mobileStyleClazz).create().get(); + this.widget.setMobileStyle(mobileStyle); + this.customBeanPane.updateBean(); + mobileStyle.setBackground(colorSelectBox.getBackground()); + return mobileStyle; + } + + @Override + protected String title4PopupWindow() { + return null; + } + + private void init() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + createGeneralPane(); + createCustomPane(); + } + + private void createGeneralPane() { + createPreviewPane(); + createBackgroundPane(); + } + + private void createPreviewPane() { + JPanel mobileStylePreviewPane = this.customBeanPane.createPreviewPane(); + if(mobileStylePreviewPane != null) { + JPanel previewPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + TitledBorder titledBorder = GUICoreUtils.createTitledBorder(Toolkit.i18nText("Fine-Design_Basic_Widget_Style_Preview"), null); + titledBorder.setTitleFont(FRFont.getInstance("PingFangSC-Regular", Font.PLAIN, 12, new Color(0x2f8ef100))); + previewPane.setBorder(titledBorder); + previewPane.setPreferredSize(new Dimension(500, 83)); + previewPane.add(mobileStylePreviewPane, BorderLayout.CENTER); + this.add(previewPane, BorderLayout.NORTH); + } + } + + private void createBackgroundPane() { + + JPanel backgroundPane = new JPanel(); + backgroundPane.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 5)); + backgroundPane.setPreferredSize(new Dimension(500, 65)); + + TitledBorder titledBorder = GUICoreUtils.createTitledBorder(Toolkit.i18nText("Fine-Design_Mobile_Common_Attribute"), null); + titledBorder.setTitleFont(FRFont.getInstance("PingFangSC-Regular", Font.PLAIN, 12, Color.BLUE)); + backgroundPane.setBorder(titledBorder); + + UILabel colorSelectLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Widget_Background"), UILabel.RIGHT); + colorSelectLabel.setPreferredSize(new Dimension(65, 20)); + + colorSelectBox = new NewColorSelectBox(152); + colorSelectBox.addSelectChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + } + }); + + backgroundPane.add(colorSelectLabel); + backgroundPane.add(colorSelectBox); + + this.add(backgroundPane, BorderLayout.NORTH); + } + + private void createCustomPane() { + JPanel configPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + TitledBorder titledBorder = GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set"), null); + titledBorder.setTitleFont(FRFont.getInstance("PingFangSC-Regular", Font.PLAIN, 12, Color.BLUE)); + configPane.setBorder(titledBorder); + + configPane.add(this.customBeanPane, BorderLayout.CENTER); + + this.add(configPane, BorderLayout.CENTER); + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java new file mode 100644 index 000000000..c048c0d21 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java @@ -0,0 +1,130 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.dialog.BasicPane; +import com.fr.design.fun.MobileWidgetStyleProvider; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.form.ui.Widget; +import com.fr.form.ui.mobile.MobileStyle; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.ArrayUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.HashMap; +import java.util.Map; + +public class MobileStylePane extends BasicPane { + + private Widget widget; + private DefaultListModel listModel; + private JPanel right; + private CardLayout card; + private JList styleList; + private Map> map = new HashMap<>(); + + public MobileStylePane(Widget widget) { + this.widget = widget; + init(); + } + + @Override + protected String title4PopupWindow() { + return null; + } + + public void populate(MobileStyle mobileStyle) { + if(mobileStyle != null) { + MobileWidgetStyleProvider[] styleProviders = getMobileWidgetStyleProviders(); + for(int i = 0; i < styleProviders.length; i ++) { + if(mobileStyle.getClass() == styleProviders[i].classForMobileStyle()) { + String displayName = styleProviders[i].displayName(); + styleList.setSelectedIndex(i); + map.get(displayName).populateBean(mobileStyle); + card.show(right, displayName); + return; + } + } + } + styleList.setSelectedIndex(0); + } + + public MobileStyle update() { + return map.get(styleList.getSelectedValue()).updateBean(); + } + + private void init() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + listModel = new DefaultListModel<>(); + card = new CardLayout(); + right = FRGUIPaneFactory.createCardLayout_S_Pane(); + right.setLayout(card); + MobileWidgetStyleProvider[] styleProviders = getMobileWidgetStyleProviders(); + for(MobileWidgetStyleProvider styleProvider: styleProviders) { + this.addProvider2View(styleProvider); + } + this.addWestList(); + this.addCenterConfig(); + } + + private void addWestList() { + styleList = new JList<>(listModel); + styleList.setCellRenderer(render); + styleList.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + String selectedValue = (String)styleList.getSelectedValue(); + card.show(right, selectedValue); + } + }); + JPanel westPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); + westPane.add(styleList, BorderLayout.CENTER); + westPane.setPreferredSize(new Dimension(100, 500)); + this.add(westPane, BorderLayout.WEST); + } + + private void addCenterConfig() { + JPanel centerPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); + JPanel attrConfPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + centerPane.setPreferredSize(new Dimension(500, 500)); + attrConfPane.add(right, BorderLayout.CENTER); + centerPane.add(attrConfPane, BorderLayout.CENTER); + this.add(centerPane, BorderLayout.CENTER); + } + + private void addProvider2View(MobileWidgetStyleProvider styleProvider) { + String displayName = styleProvider.displayName(); + Class appearanceClazz = styleProvider.classForWidgetAppearance(); + Class mobileStyleClazz = styleProvider.classForMobileStyle(); + + listModel.addElement(displayName); + try { + BasicBeanPane mobileStyleBasicBeanPane = new MobileStyleDefinePane(widget, appearanceClazz, mobileStyleClazz); + right.add(displayName, mobileStyleBasicBeanPane); + map.put(displayName, mobileStyleBasicBeanPane); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + + private 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 MobileStyle) { + MobileStyle l = (MobileStyle) value; + this.setText(l.toString()); + } + return this; + } + }; + + private MobileWidgetStyleProvider[] getMobileWidgetStyleProviders() { + DefaultMobileWidgetStyleProvider defaultMobileWidgetStyleProvider = new DefaultMobileWidgetStyleProvider(); + MobileWidgetStyleProvider[] styleProviders = ExtraDesignClassManager.getInstance().getMobileStyleOfWidget(widget.getXType()); + styleProviders = ArrayUtils.insert(0, styleProviders, defaultMobileWidgetStyleProvider); + return styleProviders; + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleMobileStyleEditor.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleMobileStyleEditor.java new file mode 100644 index 000000000..e18e8e49d --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleMobileStyleEditor.java @@ -0,0 +1,36 @@ +package com.fr.design.mainframe.widget.accessibles; + +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.mainframe.mobile.ui.MobileStylePane; +import com.fr.design.mainframe.widget.wrappers.MobileStyleWrapper; +import com.fr.form.ui.mobile.MobileStyle; + +import javax.swing.SwingUtilities; +import java.awt.Dimension; + +public class AccessibleMobileStyleEditor extends UneditableAccessibleEditor { + + private MobileStylePane stylePane; + private static final Dimension DEFAULT_DIMENSION = new Dimension(600, 400); + + public AccessibleMobileStyleEditor(MobileStylePane stylePane) { + super(new MobileStyleWrapper()); + this.stylePane = stylePane; + } + + @Override + protected void showEditorPane() { + 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((MobileStyle) getValue()); + dlg.setVisible(true); + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/wrappers/MobileStyleWrapper.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/wrappers/MobileStyleWrapper.java new file mode 100644 index 000000000..a8ceb7c46 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/wrappers/MobileStyleWrapper.java @@ -0,0 +1,26 @@ +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.locale.InterProviderFactory; + +public class MobileStyleWrapper implements Encoder, Decoder { + @Override + public Object decode(String txt) { + return null; + } + + @Override + public void validate(String txt) throws ValidationException { + + } + + @Override + public String encode(Object v) { + if (v == null) { + return InterProviderFactory.getProvider().getLocText("Fine-Engine_Report_DEFAULT"); + } + return v.toString(); + } +} diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java b/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java index 29ce253f5..14a5e3c96 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java @@ -339,4 +339,9 @@ public class XChartEditor extends XBorderStyleWidgetCreator { public boolean isSupportShared() { return true; } + + @Override + public boolean supportMobileStyle() { + return false; + } } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java b/designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java index b7d7b3a45..bef18f96f 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java @@ -3,7 +3,6 @@ */ package com.fr.design.designer.creator; -import com.fr.base.BaseUtils; import com.fr.base.GraphHelper; import com.fr.base.vcs.DesignerMode; import com.fr.design.actions.UpdateAction; @@ -591,6 +590,14 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo return; } + /** + * 是否支持定义移动端样式,默认true + * @return 是否支持定义移动端样式 + */ + public boolean supportMobileStyle() { + return true; + } + /** * 获取当前组件自定义的属性表tab * diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java b/designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java index 480412287..ec06a1597 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java @@ -121,6 +121,11 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme return ArrayUtils.add(extraTableEditor, reportFitEditor); } + @Override + public boolean supportMobileStyle() { + return false; + } + private CRPropertyDescriptor getReportFitEditor() { this.designer = WidgetPropertyPane.getInstance().getEditingFormDesigner(); FitProvider wbTpl = designer.getTarget(); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XLayoutContainer.java b/designer-form/src/main/java/com/fr/design/designer/creator/XLayoutContainer.java index 45764e746..9044d6c3c 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XLayoutContainer.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XLayoutContainer.java @@ -572,4 +572,9 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme return false; } + @Override + public boolean supportMobileStyle() { + return false; + } + } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWScaleLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWScaleLayout.java index 1db5e4045..5225a3b4f 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWScaleLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWScaleLayout.java @@ -179,4 +179,9 @@ public class XWScaleLayout extends DedicateLayoutContainer { } return super.getWidgetPropertyUIProviders(); } + + @Override + public boolean supportMobileStyle() { + return true; + } } \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/MobileStylePropertyUI.java b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/MobileStylePropertyUI.java new file mode 100644 index 000000000..1f52694b8 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/MobileStylePropertyUI.java @@ -0,0 +1,31 @@ +package com.fr.design.designer.properties.mobile; + +import com.fr.design.designer.creator.XCreator; +import com.fr.design.dialog.BasicPane; +import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; +import com.fr.design.gui.itable.AbstractPropertyTable; +import com.fr.design.widget.ui.designer.mobile.MobileWidgetStyleDefinePane; + +public class MobileStylePropertyUI extends AbstractWidgetPropertyUIProvider { + + private XCreator xCreator; + + public MobileStylePropertyUI(XCreator xCreator) { + this.xCreator = xCreator; + } + + @Override + public AbstractPropertyTable createWidgetAttrTable() { + return null; + } + + @Override + public BasicPane createWidgetAttrPane() { + return new MobileWidgetStyleDefinePane(xCreator); + } + + @Override + public String tableTitle() { + return null; + } +} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/WidgetPropertyPane.java b/designer-form/src/main/java/com/fr/design/mainframe/WidgetPropertyPane.java index af17389be..8195fbb50 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/WidgetPropertyPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/WidgetPropertyPane.java @@ -7,6 +7,7 @@ import com.fr.design.designer.beans.events.DesignerEditListener; import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.creator.*; import com.fr.design.designer.properties.EventPropertyTable; +import com.fr.design.designer.properties.mobile.MobileStylePropertyUI; import com.fr.design.fun.WidgetPropertyUIProvider; import com.fr.design.gui.ibutton.UIHeadGroup; import com.fr.design.gui.icontainer.UIScrollPane; @@ -172,8 +173,12 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper private WidgetPropertyUIProvider[] getExtraPropertyUIProviders() { FormSelection selection = designer.getSelectionModel().getSelection(); WidgetPropertyUIProvider[] embeddedPropertyUIProviders = null; - if (selection != null && selection.getSelectedCreator() != null) { + XCreator xCreator = selection.getSelectedCreator(); + if (selection != null && xCreator != null) { embeddedPropertyUIProviders = selection.getSelectedCreator().getWidgetPropertyUIProviders(); + if(!designer.getDesignerMode().isFormParameterEditor() && xCreator.supportMobileStyle()) { + embeddedPropertyUIProviders = ArrayUtils.insert(0, embeddedPropertyUIProviders, new MobileStylePropertyUI(xCreator)); + } } Set set = ExtraDesignClassManager.getInstance().getArray(WidgetPropertyUIProvider.XML_TAG); return ArrayUtils.addAll(embeddedPropertyUIProviders, set.toArray(new WidgetPropertyUIProvider[set.size()])); diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/MobileWidgetStyleDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/MobileWidgetStyleDefinePane.java new file mode 100644 index 000000000..fb6f81fe5 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/MobileWidgetStyleDefinePane.java @@ -0,0 +1,85 @@ +package com.fr.design.widget.ui.designer.mobile; + +import com.fr.design.constants.LayoutConstants; +import com.fr.design.designer.IntervalConstants; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.widget.accessibles.AccessibleMobileStyleEditor; +import com.fr.design.mainframe.mobile.ui.MobileStylePane; +import com.fr.form.ui.mobile.MobileStyle; + +import javax.swing.*; +import java.awt.*; + +public class MobileWidgetStyleDefinePane extends MobileWidgetDefinePane { + + private XCreator xCreator; + private AccessibleMobileStyleEditor mobileStyleEditor; + private AttributeChangeListener changeListener; + + public MobileWidgetStyleDefinePane(XCreator xCreator) { + this.xCreator = xCreator; + } + + @Override + public void setPreferredSize(Dimension dimension) { + super.setPreferredSize(dimension); + } + + @Override + public void initPropertyGroups(Object source) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Tab_Style_Template")); + mobileStyleEditor = new AccessibleMobileStyleEditor(new MobileStylePane(this.xCreator.toData())); + JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane( + new Component[][]{new Component[]{label, mobileStyleEditor}}, + TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_LARGE + ); + JPanel holder = FRGUIPaneFactory.createBorderLayout_S_Pane(); + holder.add(jPanel, BorderLayout.NORTH); + + this.add(holder, BorderLayout.NORTH); + } + + @Override + public void populate(FormDesigner designer) { + mobileStyleEditor.setValue(xCreator.toData().getMobileStyle()); + this.bindListeners2Widgets(); + this.addAttributeChangeListener(changeListener); + } + + @Override + public void update() { + xCreator.toData().setMobileStyle((MobileStyle) mobileStyleEditor.getValue()); + DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(super.getPreferredSize().width, 30); + } + + @Override + public Dimension getMaximumSize() { + return new Dimension(400, 200); + } + + private void bindListeners2Widgets() { + reInitAllListeners(); + this.changeListener = new AttributeChangeListener() { + @Override + public void attributeChange() { + update(); + } + }; + } + + private void reInitAllListeners() { + initListener(this); + } +} From 2d8fef4603267b7a10e17ebb7ad35f6b7311440e Mon Sep 17 00:00:00 2001 From: WeiYanglu Date: Sun, 11 Aug 2019 02:05:27 +0800 Subject: [PATCH 25/46] =?UTF-8?q?=E6=97=A5=E5=8E=86=E3=80=81=E4=B8=8B?= =?UTF-8?q?=E6=8B=89=E6=A1=86=E7=AD=89=E5=85=A8=E8=A2=ABScale=E5=8C=85?= =?UTF-8?q?=E4=BD=8F=E4=BA=86=EF=BC=8C=E8=AE=BE=E7=BD=AE=E6=88=90=E7=9C=9F?= =?UTF-8?q?=E5=AE=9E=E7=9A=84=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/mobile/ui/MobileStylePane.java | 8 +++++++- .../designer/properties/mobile/MobileStylePropertyUI.java | 7 ++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java index c048c0d21..d0e949fa9 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java @@ -6,7 +6,9 @@ import com.fr.design.dialog.BasicPane; import com.fr.design.fun.MobileWidgetStyleProvider; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.form.ui.Widget; +import com.fr.form.ui.container.WScaleLayout; import com.fr.form.ui.mobile.MobileStyle; +import com.fr.form.ui.widget.CRBoundsWidget; import com.fr.log.FineLoggerFactory; import com.fr.stable.ArrayUtils; @@ -27,7 +29,11 @@ public class MobileStylePane extends BasicPane { private Map> map = new HashMap<>(); public MobileStylePane(Widget widget) { - this.widget = widget; + if(widget instanceof WScaleLayout) { + this.widget = ((CRBoundsWidget)((WScaleLayout) widget).getBoundsWidget()).getWidget(); + } else { + this.widget = widget; + } init(); } diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/MobileStylePropertyUI.java b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/MobileStylePropertyUI.java index 1f52694b8..831f558cb 100644 --- a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/MobileStylePropertyUI.java +++ b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/MobileStylePropertyUI.java @@ -1,6 +1,7 @@ package com.fr.design.designer.properties.mobile; import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XWScaleLayout; import com.fr.design.dialog.BasicPane; import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; import com.fr.design.gui.itable.AbstractPropertyTable; @@ -11,7 +12,11 @@ public class MobileStylePropertyUI extends AbstractWidgetPropertyUIProvider { private XCreator xCreator; public MobileStylePropertyUI(XCreator xCreator) { - this.xCreator = xCreator; + if(xCreator instanceof XWScaleLayout) { + this.xCreator = xCreator.getEditingChildCreator(); + } else { + this.xCreator = xCreator; + } } @Override From 205d3149b26a0494494fc0d223558469472e85df Mon Sep 17 00:00:00 2001 From: WeiYanglu Date: Tue, 13 Aug 2019 00:00:55 +0800 Subject: [PATCH 26/46] =?UTF-8?q?MOBILE-21673=20&=20MOBILE-21669=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E5=A4=84=E9=A2=9C=E8=89=B2=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E6=A1=86=E8=AF=BB=E5=8F=96=E5=80=BC=E6=97=B6=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E4=BD=BF=E7=94=A8=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java index ef1327ccf..82e189943 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java @@ -43,7 +43,7 @@ public class MobileStyleDefinePane extends BasicBeanPane { MobileStyle mobileStyle = Reflect.on(mobileStyleClazz).create().get(); this.widget.setMobileStyle(mobileStyle); this.customBeanPane.updateBean(); - mobileStyle.setBackground(colorSelectBox.getBackground()); + mobileStyle.setBackground(colorSelectBox.getSelectObject()); return mobileStyle; } From bc5f6a6cf3bb4e06ecc2e49aa5f50af57ed5ac1c Mon Sep 17 00:00:00 2001 From: Hades Date: Tue, 13 Aug 2019 11:53:17 +0800 Subject: [PATCH 27/46] =?UTF-8?q?REPORT-19465=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E7=BA=A7=E5=85=A8=E5=B1=80=E6=8E=A7=E5=88=B6=E7=BC=A9=E6=94=BE?= =?UTF-8?q?=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/form/mobile/FormMobileOthersPane.java | 5 +++++ .../java/com/fr/design/report/mobile/MobileOthersPane.java | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/designer-form/src/main/java/com/fr/design/form/mobile/FormMobileOthersPane.java b/designer-form/src/main/java/com/fr/design/form/mobile/FormMobileOthersPane.java index 03499286d..60cc6d21f 100644 --- a/designer-form/src/main/java/com/fr/design/form/mobile/FormMobileOthersPane.java +++ b/designer-form/src/main/java/com/fr/design/form/mobile/FormMobileOthersPane.java @@ -18,6 +18,7 @@ public class FormMobileOthersPane extends BasicBeanPane { private MobileRadioCheckPane appearRefreshCheckPane; // 页面再现时刷新 private MobileRadioCheckPane promptWhenLeaveWithoutSubmitCheckPane; // 数据未提交离开提示 + private MobileRadioCheckPane allowDoubleClickOrZoomCheckPane; // 允许双击/双指缩放 public FormMobileOthersPane() { this.initComponents(); @@ -32,6 +33,8 @@ public class FormMobileOthersPane extends BasicBeanPane { contentPane.add(appearRefreshCheckPane, BorderLayout.WEST); promptWhenLeaveWithoutSubmitCheckPane = new MobileRadioCheckPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Prompt_When_Leave_Without_Submit")); contentPane.add(promptWhenLeaveWithoutSubmitCheckPane, BorderLayout.CENTER); + allowDoubleClickOrZoomCheckPane = new MobileRadioCheckPane(com.fr.design.i18n.Toolkit.i18nText("允许双击/双指缩放")); + contentPane.add(allowDoubleClickOrZoomCheckPane, BorderLayout.EAST); borderPane.add(contentPane); this.add(borderPane); } @@ -43,6 +46,7 @@ public class FormMobileOthersPane extends BasicBeanPane { } this.appearRefreshCheckPane.populateBean(ob.isAppearRefresh()); this.promptWhenLeaveWithoutSubmitCheckPane.populateBean(ob.isPromptWhenLeaveWithoutSubmit()); + this.allowDoubleClickOrZoomCheckPane.populateBean(ob.isAllowDoubleClickOrZoom()); } @Override @@ -55,6 +59,7 @@ public class FormMobileOthersPane extends BasicBeanPane { if(mobileAttr != null) { mobileAttr.setAppearRefresh(this.appearRefreshCheckPane.updateBean()); mobileAttr.setPromptWhenLeaveWithoutSubmit(this.promptWhenLeaveWithoutSubmitCheckPane.updateBean()); + mobileAttr.setAllowDoubleClickOrZoom(this.allowDoubleClickOrZoomCheckPane.updateBean()); } } diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/MobileOthersPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/MobileOthersPane.java index 35c7da06d..4f88dcaef 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/MobileOthersPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/MobileOthersPane.java @@ -18,6 +18,9 @@ public class MobileOthersPane extends BasicBeanPane { private MobileRadioCheckPane appearRefreshCheckPane; // 页面再现时刷新 + // 允许双击/双指缩放 + private MobileRadioCheckPane allowDoubleClickOrZoomCheckPane; + public MobileOthersPane() { this.initComponents(); } @@ -29,6 +32,8 @@ public class MobileOthersPane extends BasicBeanPane { contentPane.setBorder(BorderFactory.createEmptyBorder(0, IntervalConstants.INTERVAL_L1, 0, 0)); appearRefreshCheckPane = new MobileRadioCheckPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Appear_Refresh")); contentPane.add(appearRefreshCheckPane, BorderLayout.WEST); + allowDoubleClickOrZoomCheckPane = new MobileRadioCheckPane(com.fr.design.i18n.Toolkit.i18nText("允许双击/双指缩放")); + contentPane.add(allowDoubleClickOrZoomCheckPane, BorderLayout.CENTER); borderPane.add(contentPane); this.add(borderPane); } @@ -39,6 +44,7 @@ public class MobileOthersPane extends BasicBeanPane { ob = new ElementCaseMobileAttr(); } this.appearRefreshCheckPane.populateBean(ob.isAppearRefresh()); + this.allowDoubleClickOrZoomCheckPane.populateBean(ob.isAllowDoubleClickOrZoom()); } @Override @@ -50,6 +56,7 @@ public class MobileOthersPane extends BasicBeanPane { public void updateBean(ElementCaseMobileAttr mobileAttr) { if(mobileAttr != null) { mobileAttr.setAppearRefresh(this.appearRefreshCheckPane.updateBean()); + mobileAttr.setAllowDoubleClickOrZoom(this.allowDoubleClickOrZoomCheckPane.updateBean()); } } From f5400dd00ac9f03519ba46a563b952435b6fd2ce Mon Sep 17 00:00:00 2001 From: Hades Date: Wed, 14 Aug 2019 10:51:45 +0800 Subject: [PATCH 28/46] =?UTF-8?q?REPORT-19468=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91H5=E8=B6=85?= =?UTF-8?q?=E9=93=BE=E6=A0=87=E9=A2=98=E6=98=BE=E7=A4=BA=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/designer/creator/XWBorderLayout.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWBorderLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWBorderLayout.java index a7b74d0fd..ff67634e4 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWBorderLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWBorderLayout.java @@ -42,6 +42,7 @@ public class XWBorderLayout extends XLayoutContainer { * 默认名称 * @return 名称 */ + @Override public String createDefaultName() { return "border"; } @@ -50,6 +51,7 @@ public class XWBorderLayout extends XLayoutContainer { * 转化成相应 WBorderLayout * @return 相应 WBorderLayout */ + @Override public WBorderLayout toData() { return (WBorderLayout) data; } @@ -62,6 +64,7 @@ public class XWBorderLayout extends XLayoutContainer { * 初始大小 * @return 初始大小 */ + @Override public Dimension initEditorSize() { return new Dimension(WBorderLayout.DEFAULT_WIDTH, WBorderLayout.DEFAULT_HEIGHT); } @@ -71,15 +74,18 @@ public class XWBorderLayout extends XLayoutContainer { * @return 属性名 * @throws java.beans.IntrospectionException 抛错 */ + @Override public CRPropertyDescriptor[] supportedDescriptor() throws IntrospectionException { return new CRPropertyDescriptor[] { - new CRPropertyDescriptor("widgetName", this.data.getClass()).setI18NName(Toolkit.i18nText("Fine-Design_Form_Form_Widget_Name")) + new CRPropertyDescriptor("widgetName", this.data.getClass()).setI18NName(Toolkit.i18nText("Fine-Design_Form_Form_Widget_Name")), + new CRPropertyDescriptor("customTitleName", this.data.getClass()).setI18NName(Toolkit.i18nText("Fine-Design_Form_Title")) }; } /** * 将WLayout转换为XLayoutContainer */ + @Override public void convert() { isRefreshing = true; WBorderLayout wb = this.toData(); @@ -101,6 +107,7 @@ public class XWBorderLayout extends XLayoutContainer { * 设计界面中有组件添加时,要通知WLayout容器重新paint * @param e 事件 */ + @Override public void componentAdded(ContainerEvent e) { if (isRefreshing) { return; @@ -158,6 +165,7 @@ public class XWBorderLayout extends XLayoutContainer { /** * 重新计算大小 */ + @Override public void recalculateChildrenSize() { Dimension d = getSize(); WBorderLayout layout = toData(); @@ -173,6 +181,7 @@ public class XWBorderLayout extends XLayoutContainer { * @param comp 组件 * @param constraints 方位 */ + @Override public void add(Component comp, Object constraints) { super.add(comp, constraints); if (comp == null) { From ca4adb9a4aa5d41b34abcf50e543d1177a7d3354 Mon Sep 17 00:00:00 2001 From: richie Date: Fri, 16 Aug 2019 14:23:50 +0800 Subject: [PATCH 29/46] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E5=BC=80=E6=94=BESDK=E5=AF=B9=E9=9C=80=E8=A6=81=E5=BC=80?= =?UTF-8?q?=E6=94=BE=E7=9A=84=E7=B1=BB=E7=9A=84=E6=A0=87=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../env/DesignerWorkspaceGenerator.java | 26 +-- .../com/fr/sdk/designer/FineDesignUtils.java | 160 +++++++++--------- 2 files changed, 93 insertions(+), 93 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java index 1174a8a73..7494bba25 100644 --- a/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java +++ b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java @@ -11,20 +11,20 @@ public class DesignerWorkspaceGenerator { public static Workspace generate(DesignerWorkspaceInfo config) throws Exception { - if (config == null || config.getType() == null) { - return null; - } + if (config == null || config.getType() == null) { + return null; + } - Workspace workspace = null; - switch (config.getType()) { - case Local: { - workspace = WorkContext.getFactory().build(config.getPath()); - break; - } - case Remote: { - WorkspaceClient client = WorkContext.getConnector().connect(config.getConnection()); - if (client != null) { - workspace = new RemoteWorkspace(client, config.getConnection()); + Workspace workspace = null; + switch (config.getType()) { + case Local: { + workspace = WorkContext.getFactory().build(config.getPath()); + break; + } + case Remote: { + WorkspaceClient client = WorkContext.getConnector().connect(config.getConnection()); + if (client != null) { + workspace = new RemoteWorkspace(client, config.getConnection()); } break; } diff --git a/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java b/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java index ea60edf74..7de2f3c2d 100644 --- a/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java +++ b/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java @@ -1,80 +1,80 @@ -package com.fr.sdk.designer; - -import com.fr.config.activator.ConfigurationActivator; -import com.fr.design.env.DesignerWorkspaceGenerator; -import com.fr.design.env.RemoteDesignerWorkspaceInfo; -import com.fr.log.FineLoggerFactory; -import com.fr.module.Activator; -import com.fr.module.Module; -import com.fr.module.tool.ActivatorToolBox; -import com.fr.report.ReportActivator; -import com.fr.report.RestrictionActivator; -import com.fr.report.module.ReportBaseActivator; -import com.fr.scheduler.SchedulerActivator; -import com.fr.sdk.server.shell.ModuleShell; -import com.fr.serialization.SerializationActivator; -import com.fr.stable.StringUtils; -import com.fr.startup.WorkspaceRegister; -import com.fr.store.StateServerActivator; -import com.fr.workspace.WorkContext; -import com.fr.workspace.connect.WorkspaceConnectionInfo; -import com.fr.workspace.engine.WorkspaceActivator; -import com.fr.workspace.server.ServerWorkspaceRegister; - -/** - * 设计器SDK模块工具类,用来放一些设计器相关插件开发过程中常用的工具函数 - */ -public class FineDesignUtils { - - /** - * 创建一个连接远程服务器的模块 - * @param remoteUrl 远程服务器地址 - * @param username 用户名 - * @param password 密码 - * @return 模块代理对象 使用ModuleShell的start和stop控制模块启停 - */ - public static ModuleShell createRemoteServerModule(String remoteUrl, String username, String password) { - return createRemoteServerModule(remoteUrl, username, password, StringUtils.EMPTY, StringUtils.EMPTY); - } - - /** - * 创建一个连接远程服务器的模块 - * @param remoteUrl 远程服务器地址 - * @param username 用户名 - * @param password 密码 - * @param certPath https证书路径 - * @param certSecretKey 证书秘钥 - * @return 模块代理对象 使用ModuleShell的start和stop控制模块启停 - */ - public static ModuleShell createRemoteServerModule(final String remoteUrl, final String username, final String password, final String certPath, final String certSecretKey) { - Module module = ActivatorToolBox.simpleLink( - new WorkspaceActivator(), - new SerializationActivator(), - new Activator() { - @Override - public void start() { - WorkspaceConnectionInfo connectionInfo = new WorkspaceConnectionInfo(remoteUrl, username, password, certPath, certSecretKey); - try { - WorkContext.switchTo(DesignerWorkspaceGenerator.generate(RemoteDesignerWorkspaceInfo.create(connectionInfo))); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(),e); - } - } - - @Override - public void stop() { - - } - }, - new ConfigurationActivator(), - new StateServerActivator(), - new SchedulerActivator(), - new ReportBaseActivator(), - new RestrictionActivator(), - new ReportActivator(), - new WorkspaceRegister(), - new ServerWorkspaceRegister() - ); - return new ModuleShell(module); - } -} \ No newline at end of file +//package com.fr.sdk.designer; +// +//import com.fr.config.activator.ConfigurationActivator; +//import com.fr.design.env.DesignerWorkspaceGenerator; +//import com.fr.design.env.RemoteDesignerWorkspaceInfo; +//import com.fr.log.FineLoggerFactory; +//import com.fr.module.Activator; +//import com.fr.module.Module; +//import com.fr.module.tool.ActivatorToolBox; +//import com.fr.report.ReportActivator; +//import com.fr.report.RestrictionActivator; +//import com.fr.report.module.ReportBaseActivator; +//import com.fr.scheduler.SchedulerActivator; +//import com.fr.sdk.server.shell.ModuleShell; +//import com.fr.serialization.SerializationActivator; +//import com.fr.stable.StringUtils; +//import com.fr.startup.WorkspaceRegister; +//import com.fr.store.StateServerActivator; +//import com.fr.workspace.WorkContext; +//import com.fr.workspace.connect.WorkspaceConnectionInfo; +//import com.fr.workspace.engine.WorkspaceActivator; +//import com.fr.workspace.server.ServerWorkspaceRegister; +// +///** +// * 设计器SDK模块工具类,用来放一些设计器相关插件开发过程中常用的工具函数 +// */ +//public class FineDesignUtils { +// +// /** +// * 创建一个连接远程服务器的模块 +// * @param remoteUrl 远程服务器地址 +// * @param username 用户名 +// * @param password 密码 +// * @return 模块代理对象 使用ModuleShell的start和stop控制模块启停 +// */ +// public static ModuleShell createRemoteServerModule(String remoteUrl, String username, String password) { +// return createRemoteServerModule(remoteUrl, username, password, StringUtils.EMPTY, StringUtils.EMPTY); +// } +// +// /** +// * 创建一个连接远程服务器的模块 +// * @param remoteUrl 远程服务器地址 +// * @param username 用户名 +// * @param password 密码 +// * @param certPath https证书路径 +// * @param certSecretKey 证书秘钥 +// * @return 模块代理对象 使用ModuleShell的start和stop控制模块启停 +// */ +// public static ModuleShell createRemoteServerModule(final String remoteUrl, final String username, final String password, final String certPath, final String certSecretKey) { +// Module module = ActivatorToolBox.simpleLink( +// new WorkspaceActivator(), +// new SerializationActivator(), +// new Activator() { +// @Override +// public void start() { +// WorkspaceConnectionInfo connectionInfo = new WorkspaceConnectionInfo(remoteUrl, username, password, certPath, certSecretKey); +// try { +// WorkContext.switchTo(DesignerWorkspaceGenerator.generate(RemoteDesignerWorkspaceInfo.create(connectionInfo))); +// } catch (Exception e) { +// FineLoggerFactory.getLogger().error(e.getMessage(),e); +// } +// } +// +// @Override +// public void stop() { +// +// } +// }, +// new ConfigurationActivator(), +// new StateServerActivator(), +// new SchedulerActivator(), +// new ReportBaseActivator(), +// new RestrictionActivator(), +// new ReportActivator(), +// new WorkspaceRegister(), +// new ServerWorkspaceRegister() +// ); +// return new ModuleShell(module); +// } +//} \ No newline at end of file From 9d0ac48c96d511c85fe1c246c47f8a78198916d7 Mon Sep 17 00:00:00 2001 From: richie Date: Fri, 16 Aug 2019 14:25:10 +0800 Subject: [PATCH 30/46] =?UTF-8?q?=E8=AF=AF=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../env/DesignerWorkspaceGenerator.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java index 7494bba25..1174a8a73 100644 --- a/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java +++ b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java @@ -11,20 +11,20 @@ public class DesignerWorkspaceGenerator { public static Workspace generate(DesignerWorkspaceInfo config) throws Exception { - if (config == null || config.getType() == null) { - return null; - } + if (config == null || config.getType() == null) { + return null; + } - Workspace workspace = null; - switch (config.getType()) { - case Local: { - workspace = WorkContext.getFactory().build(config.getPath()); - break; - } - case Remote: { - WorkspaceClient client = WorkContext.getConnector().connect(config.getConnection()); - if (client != null) { - workspace = new RemoteWorkspace(client, config.getConnection()); + Workspace workspace = null; + switch (config.getType()) { + case Local: { + workspace = WorkContext.getFactory().build(config.getPath()); + break; + } + case Remote: { + WorkspaceClient client = WorkContext.getConnector().connect(config.getConnection()); + if (client != null) { + workspace = new RemoteWorkspace(client, config.getConnection()); } break; } From 27de4a0d2926047a4b6b728e36a5c94e86cc2cb9 Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Fri, 16 Aug 2019 16:46:23 +0800 Subject: [PATCH 31/46] =?UTF-8?q?REPORT-19466=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E7=BA=A7=E6=8E=A7=E5=88=B6=E9=80=89=E4=B8=AD=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/designer/mobile/ChartEditorDefinePane.java | 15 ++++++++++++--- .../ui/designer/mobile/ElementCaseDefinePane.java | 8 ++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java index b9ae12e20..258be7d1b 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java @@ -48,6 +48,7 @@ public class ChartEditorDefinePane extends MobileWidgetDefinePane { private AttributeChangeListener changeListener; private UILabel tipLabel; private UICheckBox allowFullCheckBox;//允许全屏 + private UICheckBox functionalWhenUnactivatedCheckBox;//组件未激活时可使用组件内功能 public ChartEditorDefinePane(XCreator xCreator) { this.xCreator = xCreator; @@ -88,6 +89,8 @@ public class ChartEditorDefinePane extends MobileWidgetDefinePane { panel.add(unavailableTipLabel, BorderLayout.NORTH); allowFullCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Allow_Full_Screen")); panel.add(allowFullCheckBox); + functionalWhenUnactivatedCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Functional_When_Unactivated")); + panel.add(functionalWhenUnactivatedCheckBox); return panel; } @@ -98,19 +101,21 @@ public class ChartEditorDefinePane extends MobileWidgetDefinePane { tipLabel.setForeground(Color.gray); updateTipLabel(); allowFullCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Allow_Full_Screen")); + functionalWhenUnactivatedCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Functional_When_Unactivated")); Component[][] components = new Component[][]{ new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Zoom_In_Logic"), SwingConstants.LEFT), new UILabel(ChartMobileFitAttrState.PROPORTION.description())}, new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Zoom_Out_Logic"), SwingConstants.LEFT), zoomOutComboBox}, new Component[] {tipLabel, null}, - new Component[] {allowFullCheckBox} + new Component[] {allowFullCheckBox}, + new Component[] {functionalWhenUnactivatedCheckBox} }; double f = TableLayout.FILL; double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p}; + double[] rowSize = {p, p, p, p, p}; double[] columnSize = {p,f}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}}; + int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; final JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, 30, LayoutConstants.VGAP_LARGE); panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); final JPanel panelWrapper = FRGUIPaneFactory.createBorderLayout_S_Pane(); @@ -154,6 +159,8 @@ public class ChartEditorDefinePane extends MobileWidgetDefinePane { BaseChartEditor chartEditor = (BaseChartEditor)xCreator.toData(); boolean allowFullScreen = chartEditor.getMobileAttr().isAllowFullScreen(); this.allowFullCheckBox.setSelected(allowFullScreen); + boolean isFunctionalWhenUnactivated = chartEditor.getMobileAttr().isFunctionalWhenUnactivated(); + this.functionalWhenUnactivatedCheckBox.setSelected(isFunctionalWhenUnactivated); this.bindListeners2Widgets(); this.addAttributeChangeListener(changeListener); @@ -188,8 +195,10 @@ public class ChartEditorDefinePane extends MobileWidgetDefinePane { mobileAttr.setZoomInAttr(ChartMobileFitAttrState.PROPORTION); mobileAttr.setZoomOutAttr((ChartMobileFitAttrState) ((Item) zoomOutComboBox.getSelectedItem()).getValue()); mobileAttr.setAllowFullScreen(allowFullCheckBox.isSelected()); + mobileAttr.setFunctionalWhenUnactivated(functionalWhenUnactivatedCheckBox.isSelected()); }else { mobileAttr.setAllowFullScreen(allowFullCheckBox.isSelected()); + mobileAttr.setFunctionalWhenUnactivated(functionalWhenUnactivatedCheckBox.isSelected()); } DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); // 触发设计器保存按钮亮起来 } diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java index 9e833f0ae..43f063f4a 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java @@ -50,6 +50,7 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ private UISpinner maxHeightSpinner; // 最大高度Spinner private AttributeChangeListener changeListener; private UICheckBox allowFullCheckBox; + private UICheckBox functionalWhenUnactivatedCheckBox; public ElementCaseDefinePane (XCreator xCreator) { this.xCreator = xCreator; @@ -87,11 +88,14 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ allowFullCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Allow_Full_Screen")); + functionalWhenUnactivatedCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Functional_When_Unactivated")); + Component[][] components = new Component[][]{ new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Horizontal"), SwingConstants.LEFT), hComboBox}, new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Vertical"), SwingConstants.LEFT), vComboBox}, new Component[] {heightRestrictCheckBox, null}, new Component[] {allowFullCheckBox}, + new Component[] {functionalWhenUnactivatedCheckBox}, new Component[] {maxHeightLabel, maxHeightSpinner} }; double f = TableLayout.FILL; @@ -139,6 +143,7 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ this.maxHeightSpinner.setVisible(elementCaseEditor.isHeightRestrict()); this.maxHeightSpinner.setValue(elementCaseEditor.getHeightPercent()); this.allowFullCheckBox.setSelected(elementCaseEditor.isAllowFullScreen()); + this.functionalWhenUnactivatedCheckBox.setSelected(elementCaseEditor.isFunctionalWhenUnactivated()); } @Override @@ -163,6 +168,8 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ break; case "allowFullCheckBox": ((ElementCaseEditor)xCreator.toData()).setAllowFullScreen(allowFullCheckBox.isSelected()); + case "functionalWhenUnactivatedCheckBox": + ((ElementCaseEditor)xCreator.toData()).setAllowFullScreen(functionalWhenUnactivatedCheckBox.isSelected()); } } @@ -172,6 +179,7 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ this.heightRestrictCheckBox.setGlobalName("heightRestrictCheckBox"); this.maxHeightSpinner.setGlobalName("maxHeightSpinner"); this.allowFullCheckBox.setGlobalName("allowFullCheckBox"); + this.functionalWhenUnactivatedCheckBox.setGlobalName("functionalWhenUnactivatedCheckBox"); } } From 603d0d2c8202f327fb630a9afd9f2a8bcd3a9c32 Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Sat, 17 Aug 2019 12:13:09 +0800 Subject: [PATCH 32/46] =?UTF-8?q?REPORT-19466=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E7=BA=A7=E6=8E=A7=E5=88=B6=E9=80=89=E4=B8=AD=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mobile/ChartEditorDefinePane.java | 4 +-- .../mobile/ElementCaseDefinePane.java | 36 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java index 258be7d1b..a91ebd749 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java @@ -107,8 +107,8 @@ public class ChartEditorDefinePane extends MobileWidgetDefinePane { new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Zoom_In_Logic"), SwingConstants.LEFT), new UILabel(ChartMobileFitAttrState.PROPORTION.description())}, new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Zoom_Out_Logic"), SwingConstants.LEFT), zoomOutComboBox}, new Component[] {tipLabel, null}, - new Component[] {allowFullCheckBox}, - new Component[] {functionalWhenUnactivatedCheckBox} + new Component[] {allowFullCheckBox, null}, + new Component[] {functionalWhenUnactivatedCheckBox, null} }; double f = TableLayout.FILL; diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java index 43f063f4a..5f255bb60 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java @@ -29,10 +29,10 @@ import java.awt.Component; /** * 报表块-移动端属性面板 - * + *

* Created by fanglei on 2017/8/8. */ -public class ElementCaseDefinePane extends MobileWidgetDefinePane{ +public class ElementCaseDefinePane extends MobileWidgetDefinePane { private static final double MAX_HEIGHT_LIMIT = 0.8; private static final Item[] ITEMS = { new Item(MobileFitAttrState.HORIZONTAL.description(), MobileFitAttrState.HORIZONTAL), @@ -52,7 +52,7 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ private UICheckBox allowFullCheckBox; private UICheckBox functionalWhenUnactivatedCheckBox; - public ElementCaseDefinePane (XCreator xCreator) { + public ElementCaseDefinePane(XCreator xCreator) { this.xCreator = xCreator; } @@ -94,16 +94,16 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Horizontal"), SwingConstants.LEFT), hComboBox}, new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Vertical"), SwingConstants.LEFT), vComboBox}, new Component[] {heightRestrictCheckBox, null}, - new Component[] {allowFullCheckBox}, - new Component[] {functionalWhenUnactivatedCheckBox}, + new Component[] {allowFullCheckBox, null}, + new Component[] {functionalWhenUnactivatedCheckBox, null}, new Component[] {maxHeightLabel, maxHeightSpinner} }; 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}}; - final JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, 30, LayoutConstants.VGAP_LARGE); + double[] rowSize = {p, p, p, p, p, p}; + double[] columnSize = {p, f}; + int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; + final JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, 30, LayoutConstants.VGAP_LARGE); panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); final JPanel panelWrapper = FRGUIPaneFactory.createBorderLayout_S_Pane(); panelWrapper.add(panel, BorderLayout.NORTH); @@ -135,9 +135,9 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ public void populate(FormDesigner designer) { this.designer = designer; this.addAttributeChangeListener(changeListener); - ElementCaseEditor elementCaseEditor = (ElementCaseEditor)xCreator.toData(); - this.hComboBox.setSelectedItem(new Item (elementCaseEditor.getHorziontalAttr().description(), elementCaseEditor.getHorziontalAttr())); - this.vComboBox.setSelectedItem(new Item (elementCaseEditor.getVerticalAttr().description(), elementCaseEditor.getVerticalAttr())); + ElementCaseEditor elementCaseEditor = (ElementCaseEditor) xCreator.toData(); + this.hComboBox.setSelectedItem(new Item(elementCaseEditor.getHorziontalAttr().description(), elementCaseEditor.getHorziontalAttr())); + this.vComboBox.setSelectedItem(new Item(elementCaseEditor.getVerticalAttr().description(), elementCaseEditor.getVerticalAttr())); this.heightRestrictCheckBox.setSelected(elementCaseEditor.isHeightRestrict()); this.maxHeightLabel.setVisible(elementCaseEditor.isHeightRestrict()); this.maxHeightSpinner.setVisible(elementCaseEditor.isHeightRestrict()); @@ -152,24 +152,24 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ String globalName = this.getGlobalName(); switch (globalName) { case "hComboBox": - ((ElementCaseEditor)xCreator.toData()).setHorziontalAttr(((MobileFitAttrState)((Item)hComboBox.getSelectedItem()).getValue())); + ((ElementCaseEditor) xCreator.toData()).setHorziontalAttr(((MobileFitAttrState) ((Item) hComboBox.getSelectedItem()).getValue())); break; case "vComboBox": - ((ElementCaseEditor)xCreator.toData()).setVerticalAttr(((MobileFitAttrState)((Item)vComboBox.getSelectedItem()).getValue())); + ((ElementCaseEditor) xCreator.toData()).setVerticalAttr(((MobileFitAttrState) ((Item) vComboBox.getSelectedItem()).getValue())); break; case "heightRestrictCheckBox": boolean isHeightRestrict = heightRestrictCheckBox.isSelected(); - ((ElementCaseEditor)xCreator.toData()).setHeightRestrict(isHeightRestrict); + ((ElementCaseEditor) xCreator.toData()).setHeightRestrict(isHeightRestrict); maxHeightSpinner.setVisible(isHeightRestrict); maxHeightLabel.setVisible(isHeightRestrict); break; case "maxHeightSpinner": - ((ElementCaseEditor)xCreator.toData()).setHeightPercent(maxHeightSpinner.getValue()); + ((ElementCaseEditor) xCreator.toData()).setHeightPercent(maxHeightSpinner.getValue()); break; case "allowFullCheckBox": - ((ElementCaseEditor)xCreator.toData()).setAllowFullScreen(allowFullCheckBox.isSelected()); + ((ElementCaseEditor) xCreator.toData()).setAllowFullScreen(allowFullCheckBox.isSelected()); case "functionalWhenUnactivatedCheckBox": - ((ElementCaseEditor)xCreator.toData()).setAllowFullScreen(functionalWhenUnactivatedCheckBox.isSelected()); + ((ElementCaseEditor) xCreator.toData()).setFunctionalWhenUnactivated(functionalWhenUnactivatedCheckBox.isSelected()); } } From 70a4c79a8f8cb38ad0dc8a0d4e6f119a3eb76b85 Mon Sep 17 00:00:00 2001 From: zack Date: Sun, 18 Aug 2019 22:37:04 +0800 Subject: [PATCH 33/46] =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../update/ui/dialog/UpdateMainDialog.java | 23 +-- .../java/com/fr/design/utils/DesignUtils.java | 4 +- .../chart/DownloadOnlineSourcesHelper.java | 31 ++-- .../mainframe/InformationCollector.java | 153 ++++++++---------- 4 files changed, 100 insertions(+), 111 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java index 81239d84b..525077d62 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java @@ -35,6 +35,7 @@ import com.fr.json.JSONArray; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; import com.fr.stable.ArrayUtils; +import com.fr.stable.EncodeConstants; import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; @@ -362,10 +363,10 @@ public class UpdateMainDialog extends UIDialog { add(jarVersionInfoPane, BorderLayout.NORTH); //海外版本不显示更新信息 - if (GeneralContext.getLocale().equals(Locale.CHINA) || GeneralContext.getLocale().equals(Locale.TAIWAN)){ + if (GeneralContext.getLocale().equals(Locale.CHINA) || GeneralContext.getLocale().equals(Locale.TAIWAN)) { add(jarUpdateInfoPane, BorderLayout.CENTER); add(updateActionPane, BorderLayout.SOUTH); - }else { + } else { add(updateActionPane, BorderLayout.CENTER); } @@ -513,16 +514,15 @@ public class UpdateMainDialog extends UIDialog { if (endTime.equals(lastUpdateCacheTime) || jsonArray.length() == 0 || ComparatorUtils.compare(endTime, lastUpdateCacheTime) <= 0) { return; } - OutputStreamWriter writerStream = new OutputStreamWriter(new FileOutputStream(cacheFile), "UTF-8"); - BufferedWriter bufferWriter = new BufferedWriter(writerStream); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject jo = (JSONObject) jsonArray.get(i); - bufferWriter.write((String) jo.get("update") + '\t' + jo.get("title")); - bufferWriter.newLine(); - bufferWriter.flush(); + try (OutputStreamWriter writerStream = new OutputStreamWriter(new FileOutputStream(cacheFile), EncodeConstants.ENCODING_UTF_8); + BufferedWriter bufferWriter = new BufferedWriter(writerStream)) { + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject jo = (JSONObject) jsonArray.get(i); + bufferWriter.write((String) jo.get("update") + '\t' + jo.get("title")); + bufferWriter.newLine(); + bufferWriter.flush(); + } } - bufferWriter.close(); - writerStream.close(); lastUpdateCacheState = UPDATE_CACHE_STATE_SUCCESS; lastUpdateCacheTime = endTime; cacheProperty.updateProperty("updateTime", lastUpdateCacheTime); @@ -634,6 +634,7 @@ public class UpdateMainDialog extends UIDialog { /** * 获取当前jar的md5 + * * @param currentJAR * @return */ diff --git a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java index befe47c55..b31209381 100644 --- a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java @@ -67,8 +67,7 @@ public class DesignUtils { * @return 启动了返回true */ public static boolean isStarted() { - try { - new Socket("localhost", port); + try (Socket socket = new Socket("localhost", port)) { return true; } catch (Exception ignored) { } @@ -116,6 +115,7 @@ public class DesignUtils { * @param startPort 端口 * @param suffixs 文件后缀 */ + @SuppressWarnings("squid:S2095") public static void createListeningServer(final int startPort, final String[] suffixs) { ExecutorService service = Executors.newSingleThreadExecutor(new NamedThreadFactory("DesignClientListener")); service.execute(new Runnable() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/DownloadOnlineSourcesHelper.java b/designer-chart/src/main/java/com/fr/van/chart/DownloadOnlineSourcesHelper.java index bea3beba9..8849cc17c 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/DownloadOnlineSourcesHelper.java +++ b/designer-chart/src/main/java/com/fr/van/chart/DownloadOnlineSourcesHelper.java @@ -64,7 +64,7 @@ public class DownloadOnlineSourcesHelper implements DownloadSourcesEvent { } public void addSiteInfo(String siteKind, String localDir, double megaBits) { - + if (new File(StableUtils.pathJoin(WorkContext.getCurrent().getPath(), localDir)).exists()) { //本地有这个资源,不下载 return; @@ -86,12 +86,14 @@ public class DownloadOnlineSourcesHelper implements DownloadSourcesEvent { initDialog(); dialog.addWindowListener(new WindowAdapter() { + @Override public void windowClosing(WindowEvent e) { //取消下载 result = false; exitDialog(); } + @Override public void windowOpened(WindowEvent e) { downloadAndInstallPluginDependenceFile(); exitDialog(); @@ -119,25 +121,22 @@ public class DownloadOnlineSourcesHelper implements DownloadSourcesEvent { httpClient = new HttpClient(CloudCenter.getInstance().acquireUrlByKind(siteInfo.siteKind)); if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { - InputStream reader = httpClient.getResponseStream(); String temp = StableUtils.pathJoin(PluginConstants.DOWNLOAD_PATH, PluginConstants.TEMP_FILE); File file = new File(temp); StableUtils.makesureFileExist(file); - FileOutputStream writer = new FileOutputStream(temp); - byte[] buffer = new byte[PluginConstants.BYTES_NUM]; - int bytesRead; - while ((bytesRead = reader.read(buffer)) > 0 && result) { - writer.write(buffer, 0, bytesRead); - buffer = new byte[PluginConstants.BYTES_NUM]; - - currentBytesRead += bytesRead; - setProgress(currentBytesRead); + try (InputStream reader = httpClient.getResponseStream(); + FileOutputStream writer = new FileOutputStream(temp)) { + byte[] buffer = new byte[PluginConstants.BYTES_NUM]; + int bytesRead; + while ((bytesRead = reader.read(buffer)) > 0 && result) { + writer.write(buffer, 0, bytesRead); + buffer = new byte[PluginConstants.BYTES_NUM]; + + currentBytesRead += bytesRead; + setProgress(currentBytesRead); + } + writer.flush(); } - reader.close(); - writer.flush(); - writer.close(); - - if (result) { //安装文件 IOUtils.unZipFilesGBK(temp, StableUtils.pathJoin(WorkContext.getCurrent().getPath(), siteInfo.localDir)); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java b/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java index 148929495..25c8a493e 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java @@ -54,7 +54,6 @@ import java.util.concurrent.TimeUnit; /** * @author neil - * * @date: 2015-4-8-下午5:11:46 */ public class InformationCollector implements XMLReadable, XMLWriter { @@ -83,17 +82,17 @@ public class InformationCollector implements XMLReadable, XMLWriter { private String lastTime; private StartStopTime current = new StartStopTime(); - public static InformationCollector getInstance(){ + public static InformationCollector getInstance() { if (collector == null) { collector = new InformationCollector(); - readEncodeXMLFile(collector, collector.getInfoFile()); + readEncodeXMLFile(collector, collector.getInfoFile()); } return collector; } - private static void readEncodeXMLFile(XMLReadable xmlReadable, File xmlFile){ + private static void readEncodeXMLFile(XMLReadable xmlReadable, File xmlFile) { if (xmlFile == null || !xmlFile.exists()) { return; } @@ -110,22 +109,22 @@ public class InformationCollector implements XMLReadable, XMLWriter { } xmlInputStream.close(); } catch (FileNotFoundException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } catch (IOException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } catch (XMLStreamException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } - private static String getDecodeFileContent(File xmlFile) throws FileNotFoundException, UnsupportedEncodingException{ + private static String getDecodeFileContent(File xmlFile) throws FileNotFoundException, UnsupportedEncodingException { InputStream encodeInputStream = new FileInputStream(xmlFile); String encodeContent = IOUtils.inputStream2String(encodeInputStream); return DesUtils.getDecString(encodeContent); } - private long getLastTimeMillis(){ + private long getLastTimeMillis() { if (StringUtils.isEmpty(this.lastTime)) { return 0; } @@ -138,7 +137,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { } - private JSONObject getJSONContentAsByte(){ + private JSONObject getJSONContentAsByte() { JSONObject content = new JSONObject(); JSONArray startStopArray = new JSONArray(); @@ -159,7 +158,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { return content; } - private void sendUserInfo(){ + private void sendUserInfo() { long currentTime = new Date().getTime(); long lastTime = getLastTimeMillis(); @@ -178,7 +177,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } - if (success){ + if (success) { this.reset(); } } @@ -186,13 +185,13 @@ public class InformationCollector implements XMLReadable, XMLWriter { /** * 收集开始使用时间,发送信息 */ - public void collectStartTime(){ + public void collectStartTime() { this.current.setStartDate(dateToString()); sendUserInfoInOtherThread(); } - private void sendUserInfoInOtherThread(){ + private void sendUserInfoInOtherThread() { if (!DesignerEnvManager.getEnvManager().isJoinProductImprove() || !FRContext.isChineseEnv()) { return; } @@ -209,67 +208,57 @@ public class InformationCollector implements XMLReadable, XMLWriter { }, SEND_DELAY, TimeUnit.MILLISECONDS); } - /** - * 收集结束使用时间 - */ - public void collectStopTime(){ + /** + * 收集结束使用时间 + */ + public void collectStopTime() { this.current.setStopDate(dateToString()); } - private String dateToString(){ + private String dateToString() { DateFormat df = FRContext.getDefaultValues().getDateTimeFormat(); return df.format(new Date()); } - private void reset(){ + private void reset() { this.startStop.clear(); this.lastTime = dateToString(); } - private File getInfoFile() { - return new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), FILE_NAME)); - } - - /** - * 保存xml文件 - */ - public void saveXMLFile() { - File xmlFile = this.getInfoFile(); - try{ - ByteArrayOutputStream out = new ByteArrayOutputStream(); + private File getInfoFile() { + return new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), FILE_NAME)); + } + + /** + * 保存xml文件 + */ + public void saveXMLFile() { + File xmlFile = this.getInfoFile(); + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); XMLTools.writeOutputStreamXML(this, out); out.flush(); out.close(); String fileContent = new String(out.toByteArray(), EncodeConstants.ENCODING_UTF_8); String encodeCotent = DesUtils.getEncString(fileContent); writeEncodeContentToFile(encodeCotent, xmlFile); - }catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); } - } + } /** * 将文件内容写到输出流中 */ - private static void writeEncodeContentToFile(String fileContent, File file){ - BufferedWriter bw = null; - try { - FileOutputStream fos = new FileOutputStream(file); - OutputStreamWriter osw = new OutputStreamWriter(fos, EncodeConstants.ENCODING_UTF_8); - bw = new BufferedWriter(osw); + private static void writeEncodeContentToFile(String fileContent, File file) { + try (FileOutputStream fos = new FileOutputStream(file); + OutputStreamWriter osw = new OutputStreamWriter(fos, EncodeConstants.ENCODING_UTF_8); + BufferedWriter bw = new BufferedWriter(osw)) { bw.write(fileContent); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } finally { - if(bw != null){ - try { - bw.close(); - } catch (IOException e) { - } - } + FineLoggerFactory.getLogger().error(e.getMessage(), e); } - } @Override @@ -284,56 +273,56 @@ public class InformationCollector implements XMLReadable, XMLWriter { writer.end(); } - private void writeStartStopList(XMLPrintWriter writer){ + private void writeStartStopList(XMLPrintWriter writer) { //启停 - writer.startTAG(XML_START_STOP_LIST); - for (int i = 0; i < startStop.size(); i++) { - startStop.get(i).writeXML(writer); + writer.startTAG(XML_START_STOP_LIST); + for (int i = 0; i < startStop.size(); i++) { + startStop.get(i).writeXML(writer); } - writer.end(); + writer.end(); } - private void writeTag(String tag, String content, XMLPrintWriter writer){ + private void writeTag(String tag, String content, XMLPrintWriter writer) { if (StringUtils.isEmpty(content)) { return; } - writer.startTAG(tag); - writer.textNode(content); - writer.end(); + writer.startTAG(tag); + writer.textNode(content); + writer.end(); } @Override public void readXML(XMLableReader reader) { - if (reader.isChildNode()) { - String name = reader.getTagName(); - if (XML_START_STOP_LIST.equals(name)) { - readStartStopList(reader); - } else if(XML_LAST_TIME.equals(name)){ - readLastTime(reader); + if (reader.isChildNode()) { + String name = reader.getTagName(); + if (XML_START_STOP_LIST.equals(name)) { + readStartStopList(reader); + } else if (XML_LAST_TIME.equals(name)) { + readLastTime(reader); } - } + } } - private void readLastTime(XMLableReader reader){ + private void readLastTime(XMLableReader reader) { String tmpVal; if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { this.lastTime = tmpVal; } } - private void readStartStopList(XMLableReader reader){ - startStop.clear(); + private void readStartStopList(XMLableReader reader) { + startStop.clear(); reader.readXMLObject(new XMLReadable() { - public void readXML(XMLableReader reader) { - if (XML_START_STOP.equals(reader.getTagName())) { - StartStopTime startStopTime = new StartStopTime(); - reader.readXMLObject(startStopTime); - startStop.add(startStopTime); - } - } - }); + public void readXML(XMLableReader reader) { + if (XML_START_STOP.equals(reader.getTagName())) { + StartStopTime startStopTime = new StartStopTime(); + reader.readXMLObject(startStopTime); + startStop.add(startStopTime); + } + } + }); } private class StartStopTime implements XMLReadable, XMLWriter { @@ -358,14 +347,14 @@ public class InformationCollector implements XMLReadable, XMLWriter { } public void writeXML(XMLPrintWriter writer) { - writer.startTAG(XML_START_STOP); - if (StringUtils.isNotEmpty(startDate)) { - writer.attr(ATTR_START, this.startDate); + writer.startTAG(XML_START_STOP); + if (StringUtils.isNotEmpty(startDate)) { + writer.attr(ATTR_START, this.startDate); } - if (StringUtils.isNotEmpty(stopDate)) { - writer.attr(ATTR_STOP, this.stopDate); + if (StringUtils.isNotEmpty(stopDate)) { + writer.attr(ATTR_STOP, this.stopDate); } - writer.end(); + writer.end(); } public void readXML(XMLableReader reader) { From a5bb0bf8cd3693e0e9bfd4cae579ba01f9b4c625 Mon Sep 17 00:00:00 2001 From: zack Date: Sun, 18 Aug 2019 22:43:27 +0800 Subject: [PATCH 34/46] =?UTF-8?q?=E5=88=A0=E6=8E=89sdk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-sdk/pom.xml | 5 -- .../com/fr/sdk/designer/FineDesignUtils.java | 80 ------------------- .../java/com/fr/sdk/FineDesignUtilsTest.java | 7 -- 3 files changed, 92 deletions(-) delete mode 100644 designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java delete mode 100644 designer-sdk/src/test/java/com/fr/sdk/FineDesignUtilsTest.java diff --git a/designer-sdk/pom.xml b/designer-sdk/pom.xml index 9702536e2..2fb53e1dc 100644 --- a/designer-sdk/pom.xml +++ b/designer-sdk/pom.xml @@ -17,10 +17,5 @@ designer-realize 10.0 - - com.fr.report - sdk-base - 10.0 - \ No newline at end of file diff --git a/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java b/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java deleted file mode 100644 index 7de2f3c2d..000000000 --- a/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java +++ /dev/null @@ -1,80 +0,0 @@ -//package com.fr.sdk.designer; -// -//import com.fr.config.activator.ConfigurationActivator; -//import com.fr.design.env.DesignerWorkspaceGenerator; -//import com.fr.design.env.RemoteDesignerWorkspaceInfo; -//import com.fr.log.FineLoggerFactory; -//import com.fr.module.Activator; -//import com.fr.module.Module; -//import com.fr.module.tool.ActivatorToolBox; -//import com.fr.report.ReportActivator; -//import com.fr.report.RestrictionActivator; -//import com.fr.report.module.ReportBaseActivator; -//import com.fr.scheduler.SchedulerActivator; -//import com.fr.sdk.server.shell.ModuleShell; -//import com.fr.serialization.SerializationActivator; -//import com.fr.stable.StringUtils; -//import com.fr.startup.WorkspaceRegister; -//import com.fr.store.StateServerActivator; -//import com.fr.workspace.WorkContext; -//import com.fr.workspace.connect.WorkspaceConnectionInfo; -//import com.fr.workspace.engine.WorkspaceActivator; -//import com.fr.workspace.server.ServerWorkspaceRegister; -// -///** -// * 设计器SDK模块工具类,用来放一些设计器相关插件开发过程中常用的工具函数 -// */ -//public class FineDesignUtils { -// -// /** -// * 创建一个连接远程服务器的模块 -// * @param remoteUrl 远程服务器地址 -// * @param username 用户名 -// * @param password 密码 -// * @return 模块代理对象 使用ModuleShell的start和stop控制模块启停 -// */ -// public static ModuleShell createRemoteServerModule(String remoteUrl, String username, String password) { -// return createRemoteServerModule(remoteUrl, username, password, StringUtils.EMPTY, StringUtils.EMPTY); -// } -// -// /** -// * 创建一个连接远程服务器的模块 -// * @param remoteUrl 远程服务器地址 -// * @param username 用户名 -// * @param password 密码 -// * @param certPath https证书路径 -// * @param certSecretKey 证书秘钥 -// * @return 模块代理对象 使用ModuleShell的start和stop控制模块启停 -// */ -// public static ModuleShell createRemoteServerModule(final String remoteUrl, final String username, final String password, final String certPath, final String certSecretKey) { -// Module module = ActivatorToolBox.simpleLink( -// new WorkspaceActivator(), -// new SerializationActivator(), -// new Activator() { -// @Override -// public void start() { -// WorkspaceConnectionInfo connectionInfo = new WorkspaceConnectionInfo(remoteUrl, username, password, certPath, certSecretKey); -// try { -// WorkContext.switchTo(DesignerWorkspaceGenerator.generate(RemoteDesignerWorkspaceInfo.create(connectionInfo))); -// } catch (Exception e) { -// FineLoggerFactory.getLogger().error(e.getMessage(),e); -// } -// } -// -// @Override -// public void stop() { -// -// } -// }, -// new ConfigurationActivator(), -// new StateServerActivator(), -// new SchedulerActivator(), -// new ReportBaseActivator(), -// new RestrictionActivator(), -// new ReportActivator(), -// new WorkspaceRegister(), -// new ServerWorkspaceRegister() -// ); -// return new ModuleShell(module); -// } -//} \ No newline at end of file diff --git a/designer-sdk/src/test/java/com/fr/sdk/FineDesignUtilsTest.java b/designer-sdk/src/test/java/com/fr/sdk/FineDesignUtilsTest.java deleted file mode 100644 index ec210321b..000000000 --- a/designer-sdk/src/test/java/com/fr/sdk/FineDesignUtilsTest.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.fr.sdk; - -import junit.framework.TestCase; - -public class FineDesignUtilsTest extends TestCase { - -} \ No newline at end of file From 0e875025d1645230b38e65993b4dbf5a6f4ba376 Mon Sep 17 00:00:00 2001 From: richie Date: Mon, 19 Aug 2019 15:23:24 +0800 Subject: [PATCH 35/46] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=96=E8=AF=91=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapters/layout/FRFitLayoutAdapter.java | 3 ++- .../layout/FRTabFitLayoutAdapter.java | 3 ++- .../creator/XBorderStyleWidgetCreator.java | 13 ++++++------ .../creator/cardlayout/XCardSwitchButton.java | 21 +++++-------------- .../creator/cardlayout/XWCardLayout.java | 9 ++++---- .../cardlayout/XWCardMainBorderLayout.java | 3 ++- .../creator/cardlayout/XWCardTagLayout.java | 12 ++++------- .../layout/WCardTagLayoutDefinePane.java | 4 ++-- 8 files changed, 29 insertions(+), 39 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java index 9aa9e5ab9..f38e44f75 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java @@ -24,6 +24,7 @@ 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 com.fr.general.TextFetcher; import java.awt.Component; import java.awt.Dimension; @@ -284,7 +285,7 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter { backupBound.x -= rec.x; backupBound.y -= rec.y; XWCardLayout cardLayout = mainLayout.getCardPart(); - LayoutBorderStyle style = cardLayout.toData().getBorderStyle(); + TextFetcher style = cardLayout.toData().getBorderStyle(); XWCardTitleLayout xwCardTitleLayout = mainLayout.getTitlePart(); Dimension titleDimension = xwCardTitleLayout.getSize(); diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java index b1ca803c6..b280cb71a 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java @@ -19,6 +19,7 @@ import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.container.WBorderLayout; import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; import com.fr.general.ComparatorUtils; +import com.fr.general.TextFetcher; import java.awt.*; @@ -90,7 +91,7 @@ public class FRTabFitLayoutAdapter extends FRFitLayoutAdapter { // TODO 可以直接在这边将x,y都变成相对坐标,这样在后面判断拖进来的新控件放置方式的时候就不用再判断了 private int adjustY(int y, XWTabFitLayout tabLayout) { XWCardLayout cardLayout = (XWCardLayout) tabLayout.getBackupParent(); - LayoutBorderStyle style = cardLayout.toData().getBorderStyle(); + TextFetcher style = cardLayout.toData().getBorderStyle(); y = y - this.getParaEditorYOffset(); if (ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)) { y = y - WCardMainBorderLayout.TAB_HEIGHT; diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java b/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java index 046663102..05d35c821 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java @@ -11,6 +11,7 @@ import com.fr.form.ui.WidgetTitle; import com.fr.form.ui.WidgetValue; import com.fr.form.ui.container.WTitleLayout; import com.fr.general.ComparatorUtils; +import com.fr.general.TextFetcher; import com.fr.stable.Constants; import com.fr.stable.StringUtils; @@ -41,7 +42,7 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{ } protected void initStyle() { - LayoutBorderStyle style = toData().getBorderStyle(); + TextFetcher style = toData().getBorderStyle(); initBorderStyle(); if (ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)) { initTitleStyle(style); @@ -52,7 +53,7 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{ // 边框默认值设为NONE,不然像scalelayout这种只用默认边框的会不显示边框 protected void initBorderStyle() { - LayoutBorderStyle style = toData().getBorderStyle(); + TextFetcher style = toData().getBorderStyle(); if (style != null && style.getBorder() != Constants.LINE_NONE) { this.setBorder(new UIRoundedBorder(style.getBorder(), style.getColor(), style.getBorderRadius())); } else { @@ -74,8 +75,8 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{ * 设置样式为标题样式时,对应组件加上标题 * @param style 样式 */ - protected void initTitleStyle(LayoutBorderStyle style){ - if (style.getTitle() == null) { + protected void initTitleStyle(TextFetcher style){ + if (style.getTextObject() == null) { return; } XWTitleLayout parent = (XWTitleLayout) this.getParent(); @@ -100,13 +101,13 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{ /** * 更新标题控件所有的样式 */ - private void updateTitleWidgetStyle(Label title, LayoutBorderStyle style) { + private void updateTitleWidgetStyle(Label title, TextFetcher style) { //标题的边框样式目前是取对应的控件的边框样式 title.setBorder(style.getBorder()); title.setColor(style.getColor()); // title.setCorner(style.isCorner()); - WidgetTitle wTitle = style.getTitle(); + WidgetTitle wTitle = WidgetTitle.as(style); //设置成随机不重复的, 不然都用一个名字的话, 联动只能联动一个 title.setWidgetName(wTitle.TITLE_NAME_INDEX + this.toData().getWidgetName()); title.setWidgetValue(getTitleValue(wTitle)); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java index 72d0669c8..615c328aa 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java @@ -22,7 +22,6 @@ import com.fr.design.mainframe.JForm; import com.fr.design.utils.gui.GUICoreUtils; 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; @@ -30,23 +29,13 @@ 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.TextFetcher; import com.fr.general.cardtag.TemplateStyle; import com.fr.stable.unit.PT; -import javax.swing.Action; -import javax.swing.Icon; -import javax.swing.JComponent; -import javax.swing.JOptionPane; -import javax.swing.JPopupMenu; -import javax.swing.SwingUtilities; +import javax.swing.*; import javax.swing.plaf.basic.BasicLabelUI; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Point; +import java.awt.*; import java.awt.event.MouseEvent; import java.awt.geom.Rectangle2D; import java.util.ArrayList; @@ -355,8 +344,8 @@ public class XCardSwitchButton extends XButton { if (this.cardLayout == null) { initRelateLayout(); } - LayoutBorderStyle style = this.cardLayout.toData().getBorderStyle(); - return style.getTitle(); + TextFetcher style = this.cardLayout.toData().getBorderStyle(); + return WidgetTitle.as(style); } //删除tab布局 diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java index 107e31ed1..653416e12 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java @@ -34,6 +34,7 @@ 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.TextFetcher; import com.fr.general.cardtag.DefaultTemplateStyle; import com.fr.general.cardtag.TemplateStyle; import com.fr.stable.ArrayUtils; @@ -165,7 +166,7 @@ public class XWCardLayout extends XLayoutContainer { WCardMainBorderLayout border = new WCardMainBorderLayout(); XWCardMainBorderLayout xMainBorder = new XWCardMainBorderLayout(border, dimension); //将子WCardBorder的style设置到父容器上 - LayoutBorderStyle style = (this.toData()).getBorderStyle(); + TextFetcher style = (this.toData()).getBorderStyle(); border.setBorderStyle(style); this.setBackupParent(xMainBorder); XWCardTitleLayout titlePart = this.initTitlePart(widgetName, xMainBorder); @@ -397,13 +398,13 @@ public class XWCardLayout extends XLayoutContainer { //初始化样式 @Override protected void initStyle() { - LayoutBorderStyle style = toData().getBorderStyle(); + TextFetcher style = toData().getBorderStyle(); initBorderTitleStyle(style); initBorderStyle(); clearOrShowTitleLayout(ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)); } - private void initBorderTitleStyle(LayoutBorderStyle style) { + private void initBorderTitleStyle(TextFetcher style) { //初始化默认标题样式 if (!initFlag) { return; @@ -411,7 +412,7 @@ public class XWCardLayout extends XLayoutContainer { style.setType(LayoutBorderStyle.TITLE); style.setBorder(Constants.LINE_THIN); - WidgetTitle widgetTitle = style.getTitle(); + WidgetTitle widgetTitle = WidgetTitle.as(style); widgetTitle.setBackground(ColorBackground.getInstance(TITLE_COLOR)); initFlag = false; } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java index c7f235154..b0731e152 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java @@ -38,6 +38,7 @@ import com.fr.form.ui.container.cardlayout.WCardTitleLayout; import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; +import com.fr.general.TextFetcher; import com.fr.share.ShareConstants; import com.fr.stable.Constants; @@ -164,7 +165,7 @@ public class XWCardMainBorderLayout extends XWBorderLayout { String tabpaneName = cardLayout.getWidgetName(); if (!wCardTagLayout.isNewTab()) { wCardTagLayout.setWidgetName(tabpaneName); - LayoutBorderStyle borderStyle = cardLayout.getBorderStyle(); + TextFetcher borderStyle = cardLayout.getBorderStyle(); if(borderStyle != null){ //新tab默认都有标题 borderStyle.setType(LayoutBorderStyle.TITLE); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java index 1b9d2690e..cc118001f 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java @@ -27,21 +27,18 @@ 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.LayoutBorderStyle; import com.fr.form.ui.Widget; -import com.fr.form.ui.WidgetTitle; 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; +import com.fr.general.TextFetcher; import com.fr.general.cardtag.DefaultTemplateStyle; import javax.swing.border.Border; -import java.awt.Dimension; -import java.awt.FontMetrics; -import java.awt.Rectangle; +import java.awt.*; import java.awt.event.ContainerEvent; import java.awt.event.MouseEvent; import java.util.HashMap; @@ -363,9 +360,8 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { if (this.cardLayout == null) { initCardLayout(); } - LayoutBorderStyle borderStyle = this.cardLayout.toData().getBorderStyle(); - WidgetTitle title = borderStyle.getTitle(); - FRFont f = title.getFrFont(); + TextFetcher borderStyle = this.cardLayout.toData().getBorderStyle(); + FRFont f = borderStyle.getFrFont(); FontMetrics fm = GraphHelper.getFontMetrics(f); switch (wCardTagLayout.getTextDirection()) { diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java index 41ea1c1c7..06a14c25a 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java @@ -107,7 +107,7 @@ public class WCardTagLayoutDefinePane extends AbstractDataModify public void populateBean(WCardTagLayout ob) { //标题背景和字体属性设置在WCardLayout上做兼容 XLayoutContainer topLayout = creator.getTopLayout(); - LayoutBorderStyle layoutBorderStyle = ((XWCardMainBorderLayout) topLayout).getCardPart().toData().getBorderStyle(); + LayoutBorderStyle layoutBorderStyle = (LayoutBorderStyle) ((XWCardMainBorderLayout) topLayout).getCardPart().toData().getBorderStyle(); displayPositionGroup.setSelectedIndex(ob.getDisplayPosition().getType()); textDirectionGroup.setSelectedIndex(ob.getTextDirection().getType()); @@ -125,7 +125,7 @@ public class WCardTagLayoutDefinePane extends AbstractDataModify //标题背景和字体属性设置在WCardLayout上做兼容 XLayoutContainer topLayout = creator.getTopLayout(); XWCardLayout xCardLayout = ((XWCardMainBorderLayout) topLayout).getCardPart(); - LayoutBorderStyle layoutBorderStyle = xCardLayout.toData().getBorderStyle(); + LayoutBorderStyle layoutBorderStyle = (LayoutBorderStyle) xCardLayout.toData().getBorderStyle(); FRFont frFont = layoutBorderStyle.getTitle().getFrFont() == null ? FRFont.getInstance() : layoutBorderStyle.getTitle().getFrFont(); FRFont titleFont = frFontPane.update(frFont); layoutBorderStyle.getTitle().setFrFont(titleFont); From 84c585ed51c268305085275e08aaf15e95a3fb47 Mon Sep 17 00:00:00 2001 From: richie Date: Mon, 19 Aug 2019 16:32:01 +0800 Subject: [PATCH 36/46] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E6=8A=BD=E8=B1=A1=E5=AE=9E=E4=BD=93=E7=B1=BB=EF=BC=8C=E7=BB=99?= =?UTF-8?q?SDK=E5=81=9A=E5=87=86=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapters/layout/FRFitLayoutAdapter.java | 4 +-- .../layout/FRTabFitLayoutAdapter.java | 7 ++--- .../creator/XBorderStyleWidgetCreator.java | 23 +++++++------- .../creator/cardlayout/XCardSwitchButton.java | 18 +++++------ .../creator/cardlayout/XWCardLayout.java | 12 +++---- .../cardlayout/XWCardMainBorderLayout.java | 4 +-- .../creator/cardlayout/XWCardTagLayout.java | 6 ++-- .../fr/design/gui/xpane/LayoutBorderPane.java | 31 +++++-------------- .../gui/xpane/LayoutBorderPreviewPane.java | 6 ++-- 9 files changed, 47 insertions(+), 64 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java index f38e44f75..f2fc29ad5 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java @@ -24,7 +24,7 @@ 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 com.fr.general.TextFetcher; +import com.fr.general.act.BorderPacker; import java.awt.Component; import java.awt.Dimension; @@ -285,7 +285,7 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter { backupBound.x -= rec.x; backupBound.y -= rec.y; XWCardLayout cardLayout = mainLayout.getCardPart(); - TextFetcher style = cardLayout.toData().getBorderStyle(); + BorderPacker style = cardLayout.toData().getBorderStyle(); XWCardTitleLayout xwCardTitleLayout = mainLayout.getTitlePart(); Dimension titleDimension = xwCardTitleLayout.getSize(); diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java index b280cb71a..9b8effd0a 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java @@ -7,19 +7,16 @@ package com.fr.design.designer.beans.adapters.layout; import com.fr.design.beans.GroupModel; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XLayoutContainer; -import com.fr.design.designer.creator.XWParameterLayout; import com.fr.design.designer.creator.XWidgetCreator; import com.fr.design.designer.creator.cardlayout.XWCardLayout; import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; import com.fr.design.designer.creator.cardlayout.XWTabFitLayout; import com.fr.design.designer.properties.FRTabFitLayoutPropertiesGroupModel; -import com.fr.design.mainframe.widget.editors.ParameterEditor; import com.fr.design.utils.ComponentUtils; import com.fr.form.ui.LayoutBorderStyle; -import com.fr.form.ui.container.WBorderLayout; import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; import com.fr.general.ComparatorUtils; -import com.fr.general.TextFetcher; +import com.fr.general.act.BorderPacker; import java.awt.*; @@ -91,7 +88,7 @@ public class FRTabFitLayoutAdapter extends FRFitLayoutAdapter { // TODO 可以直接在这边将x,y都变成相对坐标,这样在后面判断拖进来的新控件放置方式的时候就不用再判断了 private int adjustY(int y, XWTabFitLayout tabLayout) { XWCardLayout cardLayout = (XWCardLayout) tabLayout.getBackupParent(); - TextFetcher style = cardLayout.toData().getBorderStyle(); + BorderPacker style = cardLayout.toData().getBorderStyle(); y = y - this.getParaEditorYOffset(); if (ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)) { y = y - WCardMainBorderLayout.TAB_HEIGHT; diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java b/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java index 05d35c821..fdefc019a 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java @@ -11,7 +11,8 @@ import com.fr.form.ui.WidgetTitle; import com.fr.form.ui.WidgetValue; import com.fr.form.ui.container.WTitleLayout; import com.fr.general.ComparatorUtils; -import com.fr.general.TextFetcher; +import com.fr.general.act.BorderPacker; +import com.fr.general.act.TitlePacker; import com.fr.stable.Constants; import com.fr.stable.StringUtils; @@ -42,7 +43,7 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{ } protected void initStyle() { - TextFetcher style = toData().getBorderStyle(); + BorderPacker style = toData().getBorderStyle(); initBorderStyle(); if (ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)) { initTitleStyle(style); @@ -53,7 +54,7 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{ // 边框默认值设为NONE,不然像scalelayout这种只用默认边框的会不显示边框 protected void initBorderStyle() { - TextFetcher style = toData().getBorderStyle(); + BorderPacker style = toData().getBorderStyle(); if (style != null && style.getBorder() != Constants.LINE_NONE) { this.setBorder(new UIRoundedBorder(style.getBorder(), style.getColor(), style.getBorderRadius())); } else { @@ -75,8 +76,8 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{ * 设置样式为标题样式时,对应组件加上标题 * @param style 样式 */ - protected void initTitleStyle(TextFetcher style){ - if (style.getTextObject() == null) { + protected void initTitleStyle(BorderPacker style){ + if (style.getTitle() == null || style.getTitle().getTextObject() == null) { return; } XWTitleLayout parent = (XWTitleLayout) this.getParent(); @@ -101,25 +102,25 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{ /** * 更新标题控件所有的样式 */ - private void updateTitleWidgetStyle(Label title, TextFetcher style) { + private void updateTitleWidgetStyle(Label title, BorderPacker style) { //标题的边框样式目前是取对应的控件的边框样式 title.setBorder(style.getBorder()); title.setColor(style.getColor()); // title.setCorner(style.isCorner()); - WidgetTitle wTitle = WidgetTitle.as(style); + TitlePacker wTitle = style.getTitle(); //设置成随机不重复的, 不然都用一个名字的话, 联动只能联动一个 - title.setWidgetName(wTitle.TITLE_NAME_INDEX + this.toData().getWidgetName()); + title.setWidgetName(WidgetTitle.TITLE_NAME_INDEX + this.toData().getWidgetName()); title.setWidgetValue(getTitleValue(wTitle)); title.setFont(wTitle.getFrFont()); title.setTextalign(wTitle.getPosition()); title.setBackground(wTitle.getBackground()); } - private WidgetValue getTitleValue(WidgetTitle wTitle){ + private WidgetValue getTitleValue(TitlePacker wTitle){ String content = String.valueOf(wTitle.getTextObject()); - Object vlaue = content.startsWith("=") ? BaseFormula.createFormulaBuilder().build(content) : content; - return new WidgetValue(vlaue); + Object value = content.startsWith("=") ? BaseFormula.createFormulaBuilder().build(content) : content; + return new WidgetValue(value); } @Override diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java index 615c328aa..dc555e5d1 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java @@ -22,14 +22,14 @@ import com.fr.design.mainframe.JForm; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.LayoutUtils; import com.fr.form.ui.CardSwitchButton; -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.act.BorderPacker; import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; -import com.fr.general.TextFetcher; +import com.fr.general.act.TitlePacker; import com.fr.general.cardtag.TemplateStyle; import com.fr.stable.unit.PT; @@ -297,7 +297,7 @@ public class XCardSwitchButton extends XButton { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; CardSwitchButton button = (CardSwitchButton) this.toData(); - WidgetTitle widgetTitle = getWidgetTitle(); + TitlePacker widgetTitle = getWidgetTitle(); drawBackground(button, widgetTitle); drawTitle(button, widgetTitle); Dimension panelSize = this.getContentLabel().getSize(); @@ -311,7 +311,7 @@ public class XCardSwitchButton extends XButton { } //画背景 - private void drawBackground(CardSwitchButton button, WidgetTitle widgetTitle){ + private void drawBackground(CardSwitchButton button, TitlePacker widgetTitle){ Background background = widgetTitle.getBackground() == null ? ColorBackground.getInstance(NORMAL_GRAL) : widgetTitle.getBackground(); TemplateStyle templateStyle = ((WCardTagLayout) tagLayout.toData()).getTemplateStyle(); //获取当前tab的index @@ -329,7 +329,7 @@ public class XCardSwitchButton extends XButton { } //画标题 - private void drawTitle(CardSwitchButton button, WidgetTitle widgetTitle) { + private void drawTitle(CardSwitchButton button, TitlePacker widgetTitle) { String titleText = button.getText(); this.setButtonText(titleText); FRFont font = widgetTitle.getFrFont(); @@ -340,12 +340,12 @@ public class XCardSwitchButton extends XButton { } - private WidgetTitle getWidgetTitle() { + private TitlePacker getWidgetTitle() { if (this.cardLayout == null) { initRelateLayout(); } - TextFetcher style = this.cardLayout.toData().getBorderStyle(); - return WidgetTitle.as(style); + BorderPacker style = this.cardLayout.toData().getBorderStyle(); + return style.getTitle(); } //删除tab布局 @@ -452,7 +452,7 @@ public class XCardSwitchButton extends XButton { String titleText = button.getText(); java.util.List verticalTextList = new ArrayList(); StringBuilder titleStringBuf = new StringBuilder(); - WidgetTitle title = getWidgetTitle(); + TitlePacker title = getWidgetTitle(); FRFont font = title.getFrFont(); FRFont newFont = FRFont.getInstance(font.getName(), font.getStyle(), font.getSize() + FONT_SIZE_ADJUST); FontMetrics fm = GraphHelper.getFontMetrics(newFont); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java index 653416e12..c91d34654 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java @@ -25,7 +25,6 @@ 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; @@ -33,8 +32,9 @@ 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.act.BorderPacker; import com.fr.general.ComparatorUtils; -import com.fr.general.TextFetcher; +import com.fr.general.act.TitlePacker; import com.fr.general.cardtag.DefaultTemplateStyle; import com.fr.general.cardtag.TemplateStyle; import com.fr.stable.ArrayUtils; @@ -166,7 +166,7 @@ public class XWCardLayout extends XLayoutContainer { WCardMainBorderLayout border = new WCardMainBorderLayout(); XWCardMainBorderLayout xMainBorder = new XWCardMainBorderLayout(border, dimension); //将子WCardBorder的style设置到父容器上 - TextFetcher style = (this.toData()).getBorderStyle(); + BorderPacker style = (this.toData()).getBorderStyle(); border.setBorderStyle(style); this.setBackupParent(xMainBorder); XWCardTitleLayout titlePart = this.initTitlePart(widgetName, xMainBorder); @@ -398,13 +398,13 @@ public class XWCardLayout extends XLayoutContainer { //初始化样式 @Override protected void initStyle() { - TextFetcher style = toData().getBorderStyle(); + BorderPacker style = toData().getBorderStyle(); initBorderTitleStyle(style); initBorderStyle(); clearOrShowTitleLayout(ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)); } - private void initBorderTitleStyle(TextFetcher style) { + private void initBorderTitleStyle(BorderPacker style) { //初始化默认标题样式 if (!initFlag) { return; @@ -412,7 +412,7 @@ public class XWCardLayout extends XLayoutContainer { style.setType(LayoutBorderStyle.TITLE); style.setBorder(Constants.LINE_THIN); - WidgetTitle widgetTitle = WidgetTitle.as(style); + TitlePacker widgetTitle = style.getTitle(); widgetTitle.setBackground(ColorBackground.getInstance(TITLE_COLOR)); initFlag = false; } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java index b0731e152..edbabeadf 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java @@ -38,7 +38,7 @@ import com.fr.form.ui.container.cardlayout.WCardTitleLayout; import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; -import com.fr.general.TextFetcher; +import com.fr.general.act.BorderPacker; import com.fr.share.ShareConstants; import com.fr.stable.Constants; @@ -165,7 +165,7 @@ public class XWCardMainBorderLayout extends XWBorderLayout { String tabpaneName = cardLayout.getWidgetName(); if (!wCardTagLayout.isNewTab()) { wCardTagLayout.setWidgetName(tabpaneName); - TextFetcher borderStyle = cardLayout.getBorderStyle(); + BorderPacker borderStyle = cardLayout.getBorderStyle(); if(borderStyle != null){ //新tab默认都有标题 borderStyle.setType(LayoutBorderStyle.TITLE); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java index cc118001f..77282f63f 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java @@ -32,9 +32,9 @@ 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.act.BorderPacker; import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; -import com.fr.general.TextFetcher; import com.fr.general.cardtag.DefaultTemplateStyle; import javax.swing.border.Border; @@ -360,8 +360,8 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { if (this.cardLayout == null) { initCardLayout(); } - TextFetcher borderStyle = this.cardLayout.toData().getBorderStyle(); - FRFont f = borderStyle.getFrFont(); + BorderPacker borderStyle = this.cardLayout.toData().getBorderStyle(); + FRFont f = borderStyle.getTitle().getFrFont(); FontMetrics fm = GraphHelper.getFontMetrics(f); switch (wCardTagLayout.getTextDirection()) { diff --git a/designer-form/src/main/java/com/fr/design/gui/xpane/LayoutBorderPane.java b/designer-form/src/main/java/com/fr/design/gui/xpane/LayoutBorderPane.java index a70431700..cf460f9ce 100644 --- a/designer-form/src/main/java/com/fr/design/gui/xpane/LayoutBorderPane.java +++ b/designer-form/src/main/java/com/fr/design/gui/xpane/LayoutBorderPane.java @@ -38,32 +38,17 @@ import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.WidgetTitle; import com.fr.general.Background; import com.fr.general.FRFont; - +import com.fr.general.act.TitlePacker; import com.fr.stable.Constants; -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.*; 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.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.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; @@ -546,7 +531,7 @@ public class LayoutBorderPane extends BasicPane { style.setColor(currentLineColorPane.getColor()); style.setBackground(backgroundPane.update()); style.setAlpha((float)(numberDragPane.updateBean()/maxNumber)); - WidgetTitle title = style.getTitle() == null ? new WidgetTitle() : style.getTitle(); + TitlePacker title = style.getTitle() == null ? new WidgetTitle() : style.getTitle(); title.setTextObject(formulaPane.updateBean()); FRFont frFont = title.getFrFont(); frFont = frFont.applySize((Integer)fontSizeComboBox.getSelectedItem()); @@ -644,10 +629,10 @@ public class LayoutBorderPane extends BasicPane { } protected void populateTitle(){ - WidgetTitle widgetTitle = borderStyle == null ? new WidgetTitle() : borderStyle.getTitle(); + TitlePacker widgetTitle = borderStyle == null ? new WidgetTitle() : borderStyle.getTitle(); widgetTitle = widgetTitle == null ? new WidgetTitle() : widgetTitle; - populateFourmula(widgetTitle); + populateFormula(widgetTitle); populateFont(widgetTitle); underline.addMouseListener(new MouseAdapter() { @@ -683,7 +668,7 @@ public class LayoutBorderPane extends BasicPane { paintPreviewPane(); } - protected void populateFont(WidgetTitle widgetTitle){ + protected void populateFont(TitlePacker widgetTitle){ FRFont frFont = widgetTitle.getFrFont(); this.fontSizeComboBox.setSelectedItem(frFont.getSize()); this.fontSizeComboBox.addItemListener(new ItemListener() { @@ -756,7 +741,7 @@ public class LayoutBorderPane extends BasicPane { } - private void populateFourmula(WidgetTitle widgetTitle) { + private void populateFormula(TitlePacker widgetTitle) { this.formulaPane.populateBean(widgetTitle.getTextObject().toString()); this.formulaPane.getUITextField().getDocument() .addDocumentListener(new DocumentListener() { diff --git a/designer-form/src/main/java/com/fr/design/gui/xpane/LayoutBorderPreviewPane.java b/designer-form/src/main/java/com/fr/design/gui/xpane/LayoutBorderPreviewPane.java index 3d649f3b9..33470a33b 100644 --- a/designer-form/src/main/java/com/fr/design/gui/xpane/LayoutBorderPreviewPane.java +++ b/designer-form/src/main/java/com/fr/design/gui/xpane/LayoutBorderPreviewPane.java @@ -7,10 +7,10 @@ import com.fr.base.background.ColorBackground; import com.fr.design.designer.creator.cardlayout.XCardSwitchButton; import com.fr.design.gui.itextarea.UITextArea; import com.fr.form.ui.LayoutBorderStyle; -import com.fr.form.ui.WidgetTitle; import com.fr.general.Background; import com.fr.general.FRFont; +import com.fr.general.act.TitlePacker; import com.fr.stable.Constants; import javax.swing.JPanel; @@ -126,7 +126,7 @@ public class LayoutBorderPreviewPane extends JPanel{ g2d.setColor(new Color(237, 237, 237)); } g2d.setFont(frFont.applyResolutionNP(resolution)); - WidgetTitle title = borderStyle.getTitle(); + TitlePacker title = borderStyle.getTitle(); String paintText = title.getTextObject().toString(); int startX1 = 0; int startY = 0; @@ -158,7 +158,7 @@ public class LayoutBorderPreviewPane extends JPanel{ GraphHelper.draw(g,double2, borderStyle.getBorder()); } - private void drawTabBack(Graphics2D g2d, Graphics g, WidgetTitle title, FontMetrics fm, int startX1, int startY){ + private void drawTabBack(Graphics2D g2d, Graphics g, TitlePacker title, FontMetrics fm, int startX1, int startY){ Dimension d = getSize(); String paintText = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Title")+TAB_ZERO; From 7574a965388df153045fd737a230dd9d2867acf4 Mon Sep 17 00:00:00 2001 From: "Hugh.C" Date: Tue, 20 Aug 2019 09:37:07 +0800 Subject: [PATCH 37/46] =?UTF-8?q?REPORT-20329=20sonar=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/gui/frpane/UINumberSlidePane.java | 3 ++- .../src/main/java/com/fr/design/gui/frpane/UnitInputPane.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/UINumberSlidePane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/UINumberSlidePane.java index 7585c0949..5faa21b3c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/UINumberSlidePane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/UINumberSlidePane.java @@ -14,6 +14,7 @@ import javax.swing.event.ChangeListener; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.itextfield.UINumberField; import com.fr.design.gui.style.NumberDragBar; +import com.fr.stable.AssistUtils; /** * 拖拽的滑条和对应滑条值的数字 @@ -65,7 +66,7 @@ public class UINumberSlidePane extends BasicBeanPane { public void checkValue(double value) { value = Math.max(value, minValue); value = Math.min(value, maxValue); - if (this.value == value) { + if (AssistUtils.equals(this.value, value)) { return; } double diff = Math.abs(value - this.value); diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/UnitInputPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/UnitInputPane.java index ca44c8a22..798b79af0 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/UnitInputPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/UnitInputPane.java @@ -10,6 +10,7 @@ import com.fr.design.gui.ispinner.UIBasicSpinner; import com.fr.design.gui.itextfield.UINumberField; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.stable.AssistUtils; import com.fr.stable.StringUtils; import javax.swing.*; @@ -81,7 +82,7 @@ public abstract class UnitInputPane extends BasicPane { floatValue = de.floatValue(); } //选中多列, 并且列宽不完全一致的话, 就不显示值了. - temp.setText(floatValue == 0 ? StringUtils.EMPTY : Utils.convertNumberStringToString(new Float(floatValue))); + temp.setText(AssistUtils.equals(floatValue, 0) ? StringUtils.EMPTY : Utils.convertNumberStringToString(new Float(floatValue))); // denny:默认应该为选中,方便用户修改 temp.selectAll(); From 61cd191cb10de001c0e1d61e3b60314b003b65c9 Mon Sep 17 00:00:00 2001 From: Bryant Date: Tue, 20 Aug 2019 09:43:37 +0800 Subject: [PATCH 38/46] =?UTF-8?q?REPORT-20868=20sonar=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/gui/columnrow/ColumnRowPane.java | 2 ++ .../fr/design/gui/controlpane/ObjectUIControlPane.java | 4 ++-- .../main/java/com/fr/design/gui/date/UIDatePicker.java | 10 ++++++++-- .../java/com/fr/design/gui/demo/LoadingPaneDemo.java | 1 + .../com/fr/design/gui/frpane/LoadingBasicPaneTest.java | 1 + 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java b/designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java index 615a17bce..e94b18269 100644 --- a/designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java @@ -146,6 +146,8 @@ public class ColumnRowPane extends JPanel implements UIObserver { if (cftf != null) { cftf.setColumns(3); // specify more width than we need cftf.setHorizontalAlignment(UITextField.LEFT); + }else { + throw new IllegalArgumentException("Spinner'Editor can not be null!"); } ((AbstractDocument) cftf.getDocument()).setDocumentFilter(new DocumentFilter() { diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/ObjectUIControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/ObjectUIControlPane.java index c5786b4c6..be169a744 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/ObjectUIControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/ObjectUIControlPane.java @@ -1,8 +1,8 @@ package com.fr.design.gui.controlpane; import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; import com.fr.design.beans.BasicBeanPane; +import com.fr.stable.AssistUtils; /** * Created by plough on 2017/8/1. @@ -48,7 +48,7 @@ public abstract class ObjectUIControlPane extends UIListControlPane { if (constructor != null) { return constructor; } else { - if (cls.getName() == Object.class.getName()) { + if (AssistUtils.equals(cls.getName(),Object.class.getName())) { return null; } return getConstructor(clazz, cls.getSuperclass()); diff --git a/designer-base/src/main/java/com/fr/design/gui/date/UIDatePicker.java b/designer-base/src/main/java/com/fr/design/gui/date/UIDatePicker.java index fb44f618f..be3ef20a3 100644 --- a/designer-base/src/main/java/com/fr/design/gui/date/UIDatePicker.java +++ b/designer-base/src/main/java/com/fr/design/gui/date/UIDatePicker.java @@ -157,7 +157,7 @@ public class UIDatePicker extends UIComboBox implements Serializable { /** * 设置当前选择的日期 */ - public void setSelectedDate(Date date) throws ParseException { + public synchronized void setSelectedDate(Date date) throws ParseException { if (date == null) { this.setSelectedItem(null); } else { @@ -165,6 +165,7 @@ public class UIDatePicker extends UIComboBox implements Serializable { } } + @Override public void setSelectedItem(Object anObject) { model.setSelectedItem(anObject); super.setSelectedItem(anObject); @@ -192,12 +193,14 @@ public class UIDatePicker extends UIComboBox implements Serializable { setBorder(BorderFactory.createEmptyBorder()); } + @Override public void hide() { if (isWillHide) { super.hide(); } } + @Override public void show() { if (isWillHide || UIDatePicker.this.isEnabled() == false) { return; @@ -211,6 +214,7 @@ public class UIDatePicker extends UIComboBox implements Serializable { /** * 显示弹出面板 */ + @Override protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { @@ -250,12 +254,14 @@ public class UIDatePicker extends UIComboBox implements Serializable { } } + @Override protected ComboBoxUI getUIComboBoxUI() { return new UIComboBoxUI() { + @Override protected ComboPopup createPopup() { return new DatePopup(comboBox); } - + @Override public void mousePressed(MouseEvent e) { if (UIDatePicker.this.isPopupVisible()) { isWillHide = true; diff --git a/designer-base/src/main/java/com/fr/design/gui/demo/LoadingPaneDemo.java b/designer-base/src/main/java/com/fr/design/gui/demo/LoadingPaneDemo.java index 2eb93ad3e..b17323774 100644 --- a/designer-base/src/main/java/com/fr/design/gui/demo/LoadingPaneDemo.java +++ b/designer-base/src/main/java/com/fr/design/gui/demo/LoadingPaneDemo.java @@ -35,6 +35,7 @@ public class LoadingPaneDemo extends JPanel { Thread.sleep(500); } catch (InterruptedException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); + Thread.currentThread().interrupt(); } container.add(new UIButton(i + "adfadwdadawdwad")); } diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/LoadingBasicPaneTest.java b/designer-base/src/main/java/com/fr/design/gui/frpane/LoadingBasicPaneTest.java index 7c454ad71..e3a1ae7d7 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/LoadingBasicPaneTest.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/LoadingBasicPaneTest.java @@ -24,6 +24,7 @@ public class LoadingBasicPaneTest { Thread.sleep(500); } catch (InterruptedException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); + Thread.currentThread().interrupt(); } container.add(new UIButton(i + "adfadwdadawdwad")); } From dc0b27d09d4bc5a45fb276c8a27dbe2949b752a6 Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Tue, 20 Aug 2019 11:25:49 +0800 Subject: [PATCH 39/46] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=EF=BC=8Cs?= =?UTF-8?q?onar=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/gui/UIDefaultTheme.java | 3 --- .../gui/autocomplete/LanguageAwareCompletionProvider.java | 3 +++ .../gui/autocomplete/ParameterizedCompletionContext.java | 4 ++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/UIDefaultTheme.java b/designer-base/src/main/java/com/fr/design/gui/UIDefaultTheme.java index 26030c47c..78750e389 100644 --- a/designer-base/src/main/java/com/fr/design/gui/UIDefaultTheme.java +++ b/designer-base/src/main/java/com/fr/design/gui/UIDefaultTheme.java @@ -76,7 +76,6 @@ public class UIDefaultTheme extends DefaultMetalTheme { table.put("Table.background", ThemeUtils.TEXT_BG_COLOR); table.put("Table.selectionForeground", ThemeUtils.NORMAL_FOREGROUND); table.put("Table.selectionBackground", new ColorUIResource(200, 221, 233)); - table.put("Table.gridColor", new ColorUIResource(200, 221, 233)); table.put("TableHeader.background", new ColorUIResource(229, 229, 229)); table.put("ProgressBar.foreground", ThemeUtils.PROCESS_COLOR); table.put("ProgressBar.background", ThemeUtils.TEXT_BG_COLOR); @@ -85,7 +84,6 @@ public class UIDefaultTheme extends DefaultMetalTheme { table.put("ProgressBar.selectionForeground", ThemeUtils.NORMAL_FOREGROUND); table.put("ProgressBar.selectionBackground", ThemeUtils.NORMAL_FOREGROUND); table.put("PopupMenu.background", ThemeUtils.NORMAL_BG); - table.put("TabbedPane.background", ThemeUtils.TEXT_BG_COLOR); table.put("TabbedPane.background", ThemeUtils.NORMAL_BG); table.put("TabbedPane.tabAreaInsets", new InsetsUIResource(4, 2, 0, 0)); table.put("TabbedPane.tabInsets", new InsetsUIResource(1, 6, 4, 6)); @@ -108,7 +106,6 @@ public class UIDefaultTheme extends DefaultMetalTheme { table.put("ComboBox.foreground", ThemeUtils.NORMAL_FOREGROUND); table.put("ComboBox.background", ThemeUtils.TEXT_BG_COLOR); table.put("ComboBox.disabledBackground", ThemeUtils.TEXT_DISABLED_BG_COLOR); - table.put("EditorPane.background", ThemeUtils.TEXT_BG_COLOR); table.put("EditorPane.foreground", ThemeUtils.NORMAL_FOREGROUND); table.put("PasswordField.background", ThemeUtils.TEXT_BG_COLOR); table.put("PasswordField.foreground", ThemeUtils.NORMAL_FOREGROUND); diff --git a/designer-base/src/main/java/com/fr/design/gui/autocomplete/LanguageAwareCompletionProvider.java b/designer-base/src/main/java/com/fr/design/gui/autocomplete/LanguageAwareCompletionProvider.java index b9d9afcc0..8bc805f46 100644 --- a/designer-base/src/main/java/com/fr/design/gui/autocomplete/LanguageAwareCompletionProvider.java +++ b/designer-base/src/main/java/com/fr/design/gui/autocomplete/LanguageAwareCompletionProvider.java @@ -195,6 +195,9 @@ public class LanguageAwareCompletionProvider extends CompletionProviderBase // provider. We do not do function/method completions while editing // strings or comments. CompletionProvider provider = getProviderFor(tc); + if (provider == null) { + return null; + } return provider==defaultProvider ? provider.getParameterizedCompletions(tc) : null; } diff --git a/designer-base/src/main/java/com/fr/design/gui/autocomplete/ParameterizedCompletionContext.java b/designer-base/src/main/java/com/fr/design/gui/autocomplete/ParameterizedCompletionContext.java index a9dd305b0..78d5e74a4 100644 --- a/designer-base/src/main/java/com/fr/design/gui/autocomplete/ParameterizedCompletionContext.java +++ b/designer-base/src/main/java/com/fr/design/gui/autocomplete/ParameterizedCompletionContext.java @@ -517,6 +517,10 @@ class ParameterizedCompletionContext { } } + if (currentNext == null) { + return; + } + // No params after caret - go to first one if (currentNext.getStartOffset() + 1 <= dot) { int nextIndex = getFirstHighlight(highlights); From ec9f79560fed24c0e1a8b0a5e31b8819718520a7 Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Wed, 21 Aug 2019 10:07:11 +0800 Subject: [PATCH 40/46] =?UTF-8?q?REPORT-19464=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91TAB=E4=B8=8B?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=BC=8F=E5=9B=BE=E6=A0=87=E4=BC=98=E5=8C=96?= =?UTF-8?q?2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/layout/FRGUIPaneFactory.java | 2 +- .../mobile/ui/TabIconConfigPane.java | 26 ++++++++++++++++++- .../com/fr/design/web/CustomIconPane.java | 10 +++---- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java b/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java index d906cc39e..4f514477f 100644 --- a/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java +++ b/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java @@ -213,7 +213,7 @@ public class FRGUIPaneFactory { public static JPanel createMediumHGapFlowInnerContainer_M_Pane_First0() { JPanel jp = new JPanel(); jp.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - jp.setLayout(new FRLeftFlowLayout(0, 20, 5)); + jp.setLayout(new FRLeftFlowLayout(0, 5, 0)); return jp; } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java index 724a9c949..9fa9182d7 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java @@ -11,6 +11,8 @@ import com.fr.design.web.CustomIconPane; import com.fr.form.ui.WidgetInfoConfig; import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; +import com.fr.stable.StringUtils; + import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JPanel; @@ -33,6 +35,7 @@ import java.util.ArrayList; public class TabIconConfigPane extends JPanel { private UIButton editIconButton; + private UIButton deleteIconButton; private String curIconName; private IconButton selectIconButton; private ArrayList iconButtons = new ArrayList(); @@ -43,7 +46,7 @@ public class TabIconConfigPane extends JPanel { public void initComp(int count) { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel panel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); + JPanel panel = FRGUIPaneFactory.createMediumHGapFlowInnerContainer_M_Pane_First0(); panel.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0)); editIconButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit")); editIconButton.setFont(FRFont.getInstance("Helvetica", Font.PLAIN, 12, Color.decode("#3A383A"))); @@ -63,12 +66,28 @@ public class TabIconConfigPane extends JPanel { curIconName = cip.update(); setShowIconImage(); TabIconConfigPane.this.repaint(); + deleteIconButton.setEnabled(true); } }); editDialog.setVisible(true); } }); editIconButton.setEnabled(false); + + deleteIconButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Delete")); + deleteIconButton.setFont(FRFont.getInstance("Helvetica", Font.PLAIN, 12, Color.decode("#3A383A"))); + deleteIconButton.setPreferredSize(new Dimension(62, 20)); + panel.add(deleteIconButton); + deleteIconButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + curIconName = ""; + setShowIconImage(); + TabIconConfigPane.this.repaint(); + deleteIconButton.setEnabled(false); + } + }); + deleteIconButton.setEnabled(false); + this.add(panel, BorderLayout.CENTER); JPanel northPane = new JPanel(); @@ -163,6 +182,11 @@ public class TabIconConfigPane extends JPanel { public void actionPerformed(ActionEvent evt) { selectIconButton = this; editIconButton.setEnabled(true); + if (StringUtils.equals("", this.getIconName())) { + deleteIconButton.setEnabled(false); + } else { + deleteIconButton.setEnabled(true); + } TabIconConfigPane.this.repaint();// repaint } diff --git a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java index 74a499030..35ff2afba 100644 --- a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java +++ b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java @@ -433,7 +433,7 @@ public class CustomIconPane extends BasicPane { JPanel imagePane = new JPanel(); imagePane.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 0)); showImageLabel = new UILabel(); - showImageLabel.setPreferredSize(new Dimension(20, 20)); + showImageLabel.setPreferredSize(new Dimension(50, 50)); imagePane.add(showImageLabel); imagePane.add(browseButton); Component[][] components = {{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Name") + ":"), nameTextField}, {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Icon") + ":"), imagePane}}; @@ -450,12 +450,12 @@ public class CustomIconPane extends BasicPane { if (JFileChooser.APPROVE_OPTION == jf.showOpenDialog(DesignerContext.getDesignerFrame())) { String path = jf.getSelectedFile().getAbsolutePath(); - // 将图片转化到16 × 16大小 + // 图片存储有最大值48*48限制,没有超过最大值时,按原图大小存储,超过最大值后,压缩至最大值存储 Image image = BaseUtils.readImage(path); - BufferedImage bufferedImage = CoreGraphHelper.createBufferedImage(IconManager.DEFAULT_ICONWIDTH, - IconManager.DEFAULT_ICONHEIGHT, BufferedImage.TYPE_INT_ARGB); + BufferedImage bufferedImage = CoreGraphHelper.createBufferedImage(image.getWidth(null) >= 48 ? IconManager.DEFAULT_ICONWIDTH + 32 : image.getWidth(null), + image.getHeight(null) >= 48 ? IconManager.DEFAULT_ICONHEIGHT + 32 : image.getHeight(null), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = bufferedImage.createGraphics(); - g2d.drawImage(image, 0, 0, IconManager.DEFAULT_ICONWIDTH, IconManager.DEFAULT_ICONHEIGHT, null); + g2d.drawImage(image, 0, 0, image.getWidth(null) >= 48 ? IconManager.DEFAULT_ICONWIDTH + 32 : image.getWidth(null), image.getHeight(null) >= 48 ? IconManager.DEFAULT_ICONHEIGHT + 32 : image.getHeight(null), null); bufferedImage.flush(); g2d.dispose(); iconImage = bufferedImage; From 7800cc8235b3c13019146c32403b2b5581ac2837 Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Wed, 21 Aug 2019 10:51:21 +0800 Subject: [PATCH 41/46] =?UTF-8?q?REPORT-19464=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91TAB=E4=B8=8B?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=BC=8F=E5=9B=BE=E6=A0=87=E4=BC=98=E5=8C=96?= =?UTF-8?q?2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/layout/FRGUIPaneFactory.java | 12 ++++++++++++ .../mainframe/mobile/ui/TabIconConfigPane.java | 8 ++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java b/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java index 4f514477f..38097c2d9 100644 --- a/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java +++ b/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java @@ -211,6 +211,18 @@ public class FRGUIPaneFactory { * @return JPanel对象 */ public static JPanel createMediumHGapFlowInnerContainer_M_Pane_First0() { + JPanel jp = new JPanel(); + jp.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + jp.setLayout(new FRLeftFlowLayout(0, 20, 5)); + return jp; + } + + /** + * 创建一个靠左空边框面板,间隔小,firsthgap 为0 + * + * @return JPanel对象 + */ + public static JPanel createTinyHGapFlowInnerContainer_M_Pane_First0() { JPanel jp = new JPanel(); jp.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); jp.setLayout(new FRLeftFlowLayout(0, 5, 0)); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java index 9fa9182d7..214156ef3 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java @@ -46,7 +46,7 @@ public class TabIconConfigPane extends JPanel { public void initComp(int count) { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel panel = FRGUIPaneFactory.createMediumHGapFlowInnerContainer_M_Pane_First0(); + JPanel panel = FRGUIPaneFactory.createTinyHGapFlowInnerContainer_M_Pane_First0(); panel.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0)); editIconButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit")); editIconButton.setFont(FRFont.getInstance("Helvetica", Font.PLAIN, 12, Color.decode("#3A383A"))); @@ -182,11 +182,7 @@ public class TabIconConfigPane extends JPanel { public void actionPerformed(ActionEvent evt) { selectIconButton = this; editIconButton.setEnabled(true); - if (StringUtils.equals("", this.getIconName())) { - deleteIconButton.setEnabled(false); - } else { - deleteIconButton.setEnabled(true); - } + deleteIconButton.setEnabled(StringUtils.isNotEmpty(this.getIconName())); TabIconConfigPane.this.repaint();// repaint } From d259b596fffa5d74ba3c3b6788b599fbf7b97942 Mon Sep 17 00:00:00 2001 From: jinbokai Date: Wed, 21 Aug 2019 10:52:41 +0800 Subject: [PATCH 42/46] REPORT-20328 sonar --- .../design/gui/iscrollbar/UIScrollBarUI.java | 16 ++++++++++----- .../com/fr/design/mainframe/JWorkBook.java | 12 +++++------ .../design/mainframe/errorinfo/ErrorInfo.java | 18 ++++++++++------- .../entity/FileEntityBuilder.java | 20 +++++++++++-------- 4 files changed, 39 insertions(+), 27 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBarUI.java b/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBarUI.java index da9aec981..8054a29ea 100644 --- a/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBarUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBarUI.java @@ -1,5 +1,7 @@ package com.fr.design.gui.iscrollbar; +import com.fr.design.constants.UIConstants; +import com.fr.stable.StringUtils; import java.awt.Color; import java.awt.Component; import java.awt.Container; @@ -20,7 +22,6 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; - import javax.swing.BoundedRangeModel; import javax.swing.InputMap; import javax.swing.JComponent; @@ -38,8 +39,6 @@ import javax.swing.event.ChangeListener; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.ScrollBarUI; import javax.swing.plaf.UIResource; - -import com.fr.design.constants.UIConstants; import sun.swing.DefaultLookup; /** @@ -148,6 +147,7 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo * * @param c */ + @Override public void installUI(JComponent c) { scrollbar = (JScrollBar) c; thumbRect = new Rectangle(0, 0, 0, 0); @@ -163,6 +163,7 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo * * @param c */ + @Override public void uninstallUI(JComponent c) { scrollbar = (JScrollBar) c; uninstallListeners(); @@ -357,6 +358,7 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo /** * 只画Thumb */ + @Override public void paint(Graphics g, JComponent c) { Rectangle thumbBounds = getThumbBounds(); if (thumbBounds.intersects(g.getClipBounds())) { @@ -380,6 +382,7 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo * @see #getMaximumSize * @see #getMinimumSize */ + @Override public Dimension getPreferredSize(JComponent c) { return (scrollbar.getOrientation() == JScrollBar.VERTICAL) ? new Dimension(scrollBarWidth, 48) : new Dimension(48, scrollBarWidth); } @@ -390,6 +393,7 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo * @see #getMinimumSize * @see #getPreferredSize */ + @Override public Dimension getMaximumSize(JComponent c) { return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); } @@ -937,6 +941,7 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo private transient int direction = +1; + @Override public void mouseReleased(MouseEvent e) { isPressing = false; if (isDragging) { @@ -968,6 +973,7 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo * one page. If there is no thumb then page up if the mouse is in the * upper half of the track. */ + @Override public void mousePressed(MouseEvent e) { boolean isMiddle = !isSupportsAbsolutePositioning() && SwingUtilities.isMiddleMouseButton(e); if (SwingUtilities.isRightMouseButton(e) || isMiddle) { @@ -1313,7 +1319,7 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo public void propertyChange(PropertyChangeEvent e) { String propertyName = e.getPropertyName(); - if ("model" == propertyName) { + if (StringUtils.equals("model", propertyName)) { BoundedRangeModel oldModel = (BoundedRangeModel) e.getOldValue(); BoundedRangeModel newModel = (BoundedRangeModel) e.getNewValue(); oldModel.removeChangeListener(modelListener); @@ -1329,4 +1335,4 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo } } } -} \ No newline at end of file +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java index 07136bc1e..e5cb04b0f 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java @@ -95,10 +95,6 @@ import com.fr.stable.module.Module; import com.fr.stable.project.ProjectConstants; import com.fr.web.controller.ViewRequestConstants; import com.fr.workspace.WorkContext; - -import javax.swing.Icon; -import javax.swing.JComponent; -import javax.swing.JPanel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.FileOutputStream; @@ -106,6 +102,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JPanel; /** * JWorkBook used to edit WorkBook. @@ -1103,9 +1102,8 @@ public class JWorkBook extends JTemplate { // 弹出输入参数 java.util.Map parameterMap = inputParameters(tpl); - try { - String fullPath = StableUtils.pathJoin(WorkContext.getCurrent().getPath(), newFile.getPath()); - FileOutputStream fileOutputStream = new FileOutputStream(fullPath); + String fullPath = StableUtils.pathJoin(WorkContext.getCurrent().getPath(), newFile.getPath()); + try (FileOutputStream fileOutputStream = new FileOutputStream(fullPath)) { EmbeddedTableDataExporter exporter = new EmbeddedTableDataExporter(); exporter.export(fileOutputStream, tpl, parameterMap); } catch (Exception e1) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfo.java b/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfo.java index d22bcf75b..4e733c7b1 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfo.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfo.java @@ -2,14 +2,17 @@ package com.fr.design.mainframe.errorinfo; import com.fr.base.FRContext; import com.fr.general.IOUtils; -import com.fr.json.JSONException; import com.fr.json.JSONObject; import com.fr.stable.EncodeConstants; import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.core.UUID; - -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.util.Date; @@ -124,13 +127,14 @@ public class ErrorInfo { String content = jo.toString(); String fileName = UUID.randomUUID() + ErrorInfoUploader.SUFFIX; File file = new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), ErrorInfoUploader.FOLDER_NAME, fileName)); - try { + FileOutputStream out = null; + try (InputStream in = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8))) { StableUtils.makesureFileExist(file); - FileOutputStream out = new FileOutputStream(file); - InputStream in = new ByteArrayInputStream(content.getBytes(EncodeConstants.ENCODING_UTF_8)); + out = new FileOutputStream(file); IOUtils.copyBinaryTo(in, out); - out.close(); } catch (IOException ignore) { + } finally { + IOUtils.close(out); } } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/entity/FileEntityBuilder.java b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/entity/FileEntityBuilder.java index 4497a0b28..358672d23 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/entity/FileEntityBuilder.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/entity/FileEntityBuilder.java @@ -19,7 +19,9 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.UUID; +import java.util.zip.ZipOutputStream; /** * @author alex sung @@ -52,13 +54,15 @@ public class FileEntityBuilder { return null; } File zipFile = null; + ZipOutputStream zipOut = null; try { zipFile = new File(pathName + ".zip"); - java.util.zip.ZipOutputStream zipOut = new java.util.zip.ZipOutputStream(new FileOutputStream(zipFile)); + zipOut = new ZipOutputStream(new FileOutputStream(zipFile)); IOUtils.zip(zipOut, new File(pathName)); - zipOut.close(); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); + } finally { + IOUtils.close(zipOut); } return zipFile; } @@ -67,18 +71,18 @@ public class FileEntityBuilder { if (jsonArray.size() == 0) { return; } - try { - String content = jsonArray.toString(); + FileOutputStream out = null; + String content = jsonArray.toString(); + try (InputStream in = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8))) { String fileName = String.valueOf(UUID.randomUUID()); File file = new File(folderName + File.separator + fileName + ".json"); StableUtils.makesureFileExist(file); - FileOutputStream out = new FileOutputStream(file); - InputStream in = new ByteArrayInputStream(content.getBytes(EncodeConstants.ENCODING_UTF_8)); + out = new FileOutputStream(file); IOUtils.copyBinaryTo(in, out); - in.close(); - out.close(); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); + } finally { + IOUtils.close(out); } } From 3d5a891ae6d3de7bac290b70b8f9992a636504aa Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Wed, 21 Aug 2019 15:23:24 +0800 Subject: [PATCH 43/46] =?UTF-8?q?REPORT-19464=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91TAB=E4=B8=8B?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=BC=8F=E5=9B=BE=E6=A0=87=E4=BC=98=E5=8C=96?= =?UTF-8?q?2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/web/CustomIconPane.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java index 35ff2afba..bc21d4c73 100644 --- a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java +++ b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java @@ -452,10 +452,10 @@ public class CustomIconPane extends BasicPane { String path = jf.getSelectedFile().getAbsolutePath(); // 图片存储有最大值48*48限制,没有超过最大值时,按原图大小存储,超过最大值后,压缩至最大值存储 Image image = BaseUtils.readImage(path); - BufferedImage bufferedImage = CoreGraphHelper.createBufferedImage(image.getWidth(null) >= 48 ? IconManager.DEFAULT_ICONWIDTH + 32 : image.getWidth(null), - image.getHeight(null) >= 48 ? IconManager.DEFAULT_ICONHEIGHT + 32 : image.getHeight(null), BufferedImage.TYPE_INT_ARGB); + BufferedImage bufferedImage = CoreGraphHelper.createBufferedImage(image.getWidth(null) >= 48 ? IconManager.MAXSTORAGE_ICONWIDTH : image.getWidth(null), + image.getHeight(null) >= 48 ? IconManager.MAXSTORAGE_ICONHEIGHT : image.getHeight(null), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = bufferedImage.createGraphics(); - g2d.drawImage(image, 0, 0, image.getWidth(null) >= 48 ? IconManager.DEFAULT_ICONWIDTH + 32 : image.getWidth(null), image.getHeight(null) >= 48 ? IconManager.DEFAULT_ICONHEIGHT + 32 : image.getHeight(null), null); + g2d.drawImage(image, 0, 0, image.getWidth(null) >= 48 ? IconManager.MAXSTORAGE_ICONWIDTH : image.getWidth(null), image.getHeight(null) >= 48 ? IconManager.MAXSTORAGE_ICONHEIGHT : image.getHeight(null), null); bufferedImage.flush(); g2d.dispose(); iconImage = bufferedImage; From d1b2e791e487dc66577fa19883dc9e27daaf0ea0 Mon Sep 17 00:00:00 2001 From: Hades Date: Wed, 21 Aug 2019 15:37:54 +0800 Subject: [PATCH 44/46] REPORT-19462 --- .../gui/icombocheckbox/UICheckListPopup.java | 51 +++++++--- .../gui/icombocheckbox/UIComboCheckBox.java | 27 +++++- .../designer/mobile/BodyMobileDefinePane.java | 40 +++++--- .../mobile/TabMobileWidgetDefinePane.java | 19 ++-- .../component/MobileComponentFrozenPane.java | 92 +++++++++++++++++++ .../MobileComponentLayoutIntervalPane.java | 18 +--- ...ne.java => MobileComponentMarginPane.java} | 10 +- 7 files changed, 200 insertions(+), 57 deletions(-) create mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentFrozenPane.java rename designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/{MobileComponentAdvancePane.java => MobileComponentMarginPane.java} (77%) diff --git a/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UICheckListPopup.java b/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UICheckListPopup.java index a0f442074..b0b57f29c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UICheckListPopup.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UICheckListPopup.java @@ -7,12 +7,25 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.icon.IconPathConstants; import com.fr.design.layout.FRGUIPaneFactory; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; +import com.fr.general.IOUtils; + +import javax.swing.JCheckBox; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.Insets; +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.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Map; public class UICheckListPopup extends UIPopupMenu { private List listeners = new ArrayList(); @@ -66,10 +79,10 @@ public class UICheckListPopup extends UIPopupMenu { } addSelectListener(); - jScrollPane.setPreferredSize(new Dimension(200, checkBoxList.size() * CHECKBOX_HEIGHT + 10)); + jScrollPane.setPreferredSize(new Dimension(130, checkBoxList.size() * CHECKBOX_HEIGHT + 10)); //超过1页的数量时显示滚动条 if (checkBoxList.size() > maxDisplayNumber) { - jScrollPane.setPreferredSize(new Dimension(200, maxDisplayNumber * CHECKBOX_HEIGHT)); + jScrollPane.setPreferredSize(new Dimension(130, maxDisplayNumber * CHECKBOX_HEIGHT)); } checkboxPane.repaint(); jScrollPane.repaint(); @@ -77,11 +90,11 @@ public class UICheckListPopup extends UIPopupMenu { private void addOneCheckValue(Object checkValue) { JPanel checkPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - checkPane.setPreferredSize(new Dimension(185, CHECKBOX_HEIGHT)); + checkPane.setPreferredSize(new Dimension(120, CHECKBOX_HEIGHT)); final JCheckBox temp = createCheckbox(); final UILabel label = new UILabel(checkValue.toString()); label.setBackground(Color.WHITE); - label.setPreferredSize(new Dimension(156, 20)); + label.setPreferredSize(new Dimension(80, 20)); checkPane.setBackground(Color.WHITE); checkPane.add(temp); checkPane.add(label); @@ -95,8 +108,8 @@ public class UICheckListPopup extends UIPopupMenu { JCheckBox checkBox = new JCheckBox(); checkBox.setPreferredSize(new Dimension(20, 20)); checkBox.setBackground(Color.WHITE); - checkBox.setIcon(BaseUtils.readIcon(IconPathConstants.CHECKBOX_NORMAL)); - checkBox.setSelectedIcon(BaseUtils.readIcon(IconPathConstants.CHECKBOX_SELECTED)); + checkBox.setIcon(IOUtils.readIcon(IconPathConstants.CHECKBOX_NORMAL)); + checkBox.setSelectedIcon(IOUtils.readIcon(IconPathConstants.CHECKBOX_SELECTED)); return checkBox; } @@ -109,10 +122,12 @@ public class UICheckListPopup extends UIPopupMenu { */ private void addMouseListener(final JCheckBox checkBox, final UILabel label) { label.addMouseListener(new MouseAdapter() { + @Override public void mouseExited(MouseEvent e) { label.setBackground(Color.WHITE); } + @Override public void mouseEntered(MouseEvent e) { label.setOpaque(true); label.setBackground(mouseEnteredColor); @@ -133,6 +148,7 @@ public class UICheckListPopup extends UIPopupMenu { JCheckBox checkBox = checkBoxList.get(i); if (i == 0) { checkBox.addItemListener(new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { //全选checkbox事件 doSelectAll(checkBoxList.get(0).isSelected()); @@ -140,6 +156,7 @@ public class UICheckListPopup extends UIPopupMenu { }); } else { checkBox.addItemListener(new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { //do半选判断放在commit事件里 commit(); @@ -157,8 +174,17 @@ public class UICheckListPopup extends UIPopupMenu { private void doSelectAll(boolean isSelected) { for (int i = 1; i < checkBoxList.size(); i++) { //全选和反全选都不考虑全选按钮本身 - if (!SELECT_ALL.equals(checkBoxList.get(i).getText())) + if (!SELECT_ALL.equals(checkBoxList.get(i).getText())) { checkBoxList.get(i).setSelected(isSelected); + } + } + } + + public void setSelectedValue(Map selectedValues) { + List allValue = Arrays.asList(values); + for (Object value : selectedValues.keySet()) { + int index = allValue.indexOf(value); + checkBoxList.get(index + 1).setSelected(selectedValues.get(value)); } } @@ -214,8 +240,9 @@ public class UICheckListPopup extends UIPopupMenu { } public void addActionListener(ActionListener listener) { - if (!listeners.contains(listener)) + if (!listeners.contains(listener)) { listeners.add(listener); + } } public void removeActionListener(ActionListener listener) { diff --git a/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UIComboCheckBox.java b/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UIComboCheckBox.java index 11cfeb6fe..e570ee515 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UIComboCheckBox.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UIComboCheckBox.java @@ -11,14 +11,23 @@ import com.fr.design.icon.IconPathConstants; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.stable.StringUtils; -import javax.swing.*; -import java.awt.*; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.FontMetrics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * 设计器下拉复选框组件 @@ -125,7 +134,7 @@ public class UIComboCheckBox extends JComponent implements UIObserver, GlobalNam private UITextField createEditor() { UITextField editor = new UITextField(); editor.setEditable(false); - editor.setPreferredSize(new Dimension(180, 20)); + editor.setPreferredSize(new Dimension(110, 20)); addPopupListener(editor); return editor; @@ -138,6 +147,7 @@ public class UIComboCheckBox extends JComponent implements UIObserver, GlobalNam */ private void addPopupListener(Component component) { component.addMouseListener(new MouseAdapter() { + @Override public void mouseClicked(MouseEvent e) { togglePopup(); } @@ -166,6 +176,7 @@ public class UIComboCheckBox extends JComponent implements UIObserver, GlobalNam private class PopupAction implements ActionListener { + @Override public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals(UICheckListPopup.COMMIT_EVENT)) { selectedValues = popup.getSelectedValues(); @@ -292,13 +303,15 @@ public class UIComboCheckBox extends JComponent implements UIObserver, GlobalNam } public void addActionListener(ActionListener listener) { - if (!listeners.contains(listener)) + if (!listeners.contains(listener)) { listeners.add(listener); + } } public void removeActionListener(ActionListener listener) { - if (listeners.contains(listener)) + if (listeners.contains(listener)) { listeners.remove(listener); + } } protected void fireActionPerformed(ActionEvent e) { @@ -307,6 +320,10 @@ public class UIComboCheckBox extends JComponent implements UIObserver, GlobalNam } } + public void setSelectedValues(Map map) { + popup.setSelectedValue(map); + } + /** * 简单的测试demo * @param args diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java index b91e1d7b6..bfd0ea7ea 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java @@ -11,7 +11,8 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.MobileWidgetListPane; import com.fr.design.mainframe.WidgetPropertyPane; -import com.fr.design.widget.ui.designer.mobile.component.MobileComponentAdvancePane; +import com.fr.design.widget.ui.designer.mobile.component.MobileComponentFrozenPane; +import com.fr.design.widget.ui.designer.mobile.component.MobileComponentMarginPane; import com.fr.design.widget.ui.designer.mobile.component.MobileComponentLayoutIntervalPane; import com.fr.form.ui.RichStyleWidgetProvider; import com.fr.form.ui.container.WFitLayout; @@ -30,8 +31,11 @@ public class BodyMobileDefinePane extends MobileWidgetDefinePane { private AttributeChangeListener changeListener; private UICheckBox appRelayoutCheck; private MobileWidgetListPane mobileWidgetListPane; - private MobileComponentAdvancePane advancePane; + private MobileComponentMarginPane marginPane; private MobileComponentLayoutIntervalPane intervalPane; + private MobileComponentFrozenPane frozenPane; + private UIExpandablePane advancePane; + private UIExpandablePane layoutPane; public BodyMobileDefinePane(XCreator xCreator) { this.bodyCreator = xCreator; @@ -89,16 +93,23 @@ public class BodyMobileDefinePane extends MobileWidgetDefinePane { private JPanel createNorthPane() { JPanel holder = FRGUIPaneFactory.createBorderLayout_S_Pane(); holder.add(getMobilePropertyPane(), BorderLayout.NORTH); - - advancePane = new MobileComponentAdvancePane(FormBodyPaddingAttrMark.XML_TAG); + marginPane = new MobileComponentMarginPane(FormBodyPaddingAttrMark.XML_TAG); intervalPane = new MobileComponentLayoutIntervalPane(FormBodyPaddingAttrMark.XML_TAG); + frozenPane = new MobileComponentFrozenPane(); + JPanel wrapLayoutPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + wrapLayoutPane.add(intervalPane, BorderLayout.NORTH); + wrapLayoutPane.add(frozenPane, BorderLayout.CENTER); + advancePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, marginPane); + layoutPane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout"), 280, 20, wrapLayoutPane); //高级 holder.add(advancePane, BorderLayout.CENTER); //布局 - holder.add(intervalPane, BorderLayout.SOUTH); + holder.add(layoutPane, BorderLayout.SOUTH); - advancePane.setVisible(!shouldHidePadding(designer)); - intervalPane.setVisible(!shouldHidePadding(designer)); + boolean flag = !shouldHidePadding(designer); + advancePane.setVisible(flag); + layoutPane.setVisible(flag); + frozenPane.setVisible(appRelayoutCheck.isSelected()); return holder; } @@ -137,13 +148,12 @@ public class BodyMobileDefinePane extends MobileWidgetDefinePane { public void populate(FormDesigner designer) { this.designer = designer; appRelayoutCheck.setSelected(FormDesignerUtils.isAppRelayout(designer)); - // 数据 populate 完成后,再设置监听 this.bindListeners2Widgets(); this.addAttributeChangeListener(changeListener); - - advancePane.populate((RichStyleWidgetProvider) getBodyCreator().toData()); + marginPane.populate((RichStyleWidgetProvider) getBodyCreator().toData()); intervalPane.populate((RichStyleWidgetProvider) getBodyCreator().toData()); + frozenPane.populate(designer.getSelectionModel().getSelection().getSelectedCreator()); } @Override @@ -152,15 +162,19 @@ public class BodyMobileDefinePane extends MobileWidgetDefinePane { setAppRelayout(appRelayoutCheck.isSelected()); boolean appPaddingVisible = appRelayout || !FormDesignerUtils.isBodyAbsolute(designer); advancePane.setVisible(appPaddingVisible); - intervalPane.setVisible(appPaddingVisible); + layoutPane.setVisible(appPaddingVisible); + frozenPane.setVisible(appRelayout); mobileWidgetListPane.updateToDesigner(); designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_EDITED); if (advancePane.isVisible()) { - advancePane.update((RichStyleWidgetProvider) getBodyCreator().toData()); + marginPane.update((RichStyleWidgetProvider) getBodyCreator().toData()); } - if (intervalPane.isVisible()) { + if (layoutPane.isVisible()) { intervalPane.update((RichStyleWidgetProvider) getBodyCreator().toData()); } + if (appRelayout) { + frozenPane.update(designer.getSelectionModel().getSelection().getSelectedCreator()); + } } } diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TabMobileWidgetDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TabMobileWidgetDefinePane.java index 8a795b887..5cf7f74f7 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TabMobileWidgetDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TabMobileWidgetDefinePane.java @@ -4,6 +4,7 @@ import com.fr.base.iofile.attr.FormTabPaddingAttrMark; import com.fr.design.constants.LayoutConstants; import com.fr.design.designer.IntervalConstants; import com.fr.design.designer.creator.XCreator; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.frpane.AttributeChangeListener; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; @@ -13,7 +14,7 @@ import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.WidgetPropertyPane; import com.fr.design.mainframe.widget.accessibles.AccessibleTemplateStyleEditor; import com.fr.design.mainframe.widget.accessibles.MobileTemplateStylePane; -import com.fr.design.widget.ui.designer.mobile.component.MobileComponentAdvancePane; +import com.fr.design.widget.ui.designer.mobile.component.MobileComponentMarginPane; import com.fr.design.widget.ui.designer.mobile.component.MobileComponentLayoutIntervalPane; import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.general.cardtag.mobile.MobileTemplateStyle; @@ -27,7 +28,7 @@ public class TabMobileWidgetDefinePane extends MobileWidgetDefinePane { private FormDesigner designer; // 当前设计器 private AccessibleTemplateStyleEditor templateStyleEditor; private AttributeChangeListener changeListener; - private MobileComponentAdvancePane advancePane; + private MobileComponentMarginPane marginPane; private MobileComponentLayoutIntervalPane intervalPane; public TabMobileWidgetDefinePane(XCreator xCreator) { @@ -61,12 +62,14 @@ public class TabMobileWidgetDefinePane extends MobileWidgetDefinePane { JPanel holder = FRGUIPaneFactory.createBorderLayout_S_Pane(); holder.add(jPanel, BorderLayout.NORTH); if (!shouldHidePadding(designer)) { - advancePane = new MobileComponentAdvancePane(FormTabPaddingAttrMark.XML_TAG); + marginPane = new MobileComponentMarginPane(FormTabPaddingAttrMark.XML_TAG); intervalPane = new MobileComponentLayoutIntervalPane(FormTabPaddingAttrMark.XML_TAG); + UIExpandablePane advancePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, marginPane); + UIExpandablePane layoutPane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout"), 280, 20, intervalPane); //高级 holder.add(advancePane, BorderLayout.CENTER); //布局 - holder.add(intervalPane, BorderLayout.SOUTH); + holder.add(layoutPane, BorderLayout.SOUTH); } this.add(holder, BorderLayout.NORTH); @@ -78,8 +81,8 @@ public class TabMobileWidgetDefinePane extends MobileWidgetDefinePane { // 数据 populate 完成后,再设置监听 this.bindListeners2Widgets(); this.addAttributeChangeListener(changeListener); - if (advancePane != null) {//业务层面可以写成shouldHidePadding但是这样写应该性能差点 - advancePane.populate((WCardTagLayout) xCreator.toData()); + if (marginPane != null) {//业务层面可以写成shouldHidePadding但是这样写应该性能差点 + marginPane.populate((WCardTagLayout) xCreator.toData()); } if (intervalPane != null) { intervalPane.populate((WCardTagLayout) xCreator.toData()); @@ -90,8 +93,8 @@ public class TabMobileWidgetDefinePane extends MobileWidgetDefinePane { public void update() { ((WCardTagLayout) xCreator.toData()).setMobileTemplateStyle((MobileTemplateStyle) templateStyleEditor.getValue()); DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); // 触发设计器保存按钮亮起来 - if (advancePane != null) { - advancePane.update((WCardTagLayout) xCreator.toData()); + if (marginPane != null) { + marginPane.update((WCardTagLayout) xCreator.toData()); } if (intervalPane != null) { intervalPane.update((WCardTagLayout) xCreator.toData()); diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentFrozenPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentFrozenPane.java new file mode 100644 index 000000000..0d5ce4b71 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentFrozenPane.java @@ -0,0 +1,92 @@ +package com.fr.design.widget.ui.designer.mobile.component; + +import com.fr.design.designer.IntervalConstants; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.icombocheckbox.UIComboCheckBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.WidgetPropertyPane; +import com.fr.design.utils.gui.UIComponentUtils; +import com.fr.design.widget.FRWidgetFactory; +import com.fr.form.ui.Widget; +import com.fr.form.ui.container.WSortLayout; +import com.fr.stable.ArrayUtils; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Component; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Hades + * @date 2019/8/14 + */ +public class MobileComponentFrozenPane extends BasicPane { + + private UIComboCheckBox uiComboCheckBox; + + public MobileComponentFrozenPane() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + UILabel frozenLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Component_Frozen")); + uiComboCheckBox = new UIComboCheckBox(initData()); + JPanel wrapJPanel = UIComponentUtils.wrapWithBorderLayoutPane(uiComboCheckBox); + Component[][] components = new Component[][]{ + new Component[]{frozenLabel, wrapJPanel} + }; + JPanel centerPane = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); + centerPane.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L5, 10, 0)); + JPanel holder = FRGUIPaneFactory.createBorderLayout_S_Pane(); + holder.add(centerPane, BorderLayout.NORTH); + this.add(holder, BorderLayout.NORTH); + } + + private String[] initData() { + FormDesigner designer = WidgetPropertyPane.getInstance().getEditingFormDesigner(); + XCreator selectedCreator = designer.getSelectionModel().getSelection().getSelectedCreator(); + Widget selectedModel = selectedCreator != null ? selectedCreator.toData() : null; + + if (selectedModel == null || !selectedModel.acceptType(WSortLayout.class)) { + return ArrayUtils.EMPTY_STRING_ARRAY; + } + + List widgetList = ((WSortLayout) selectedModel).getNonContainerWidgetList(); + return widgetList.toArray(new String[0]); + } + + public void update(XCreator xCreator) { + List selected = new ArrayList<>(); + WSortLayout wSortLayout = ((WSortLayout) xCreator.toData()); + Object[] values = uiComboCheckBox.getSelectedValues(); + for (Object widgetName : values) { + selected.add((String) widgetName); + } + wSortLayout.updateFrozenWidgets(selected); + } + + public void populate(XCreator xCreator) { + WSortLayout wSortLayout = ((WSortLayout) xCreator.toData()); + List all = wSortLayout.getNonContainerWidgetList(); + List selected = wSortLayout.getFrozenWidgets(); + Map map = new LinkedHashMap<>(); + for (String value : selected) { + map.put(value, true); + } + all.removeAll(selected); + for (String value : all) { + map.put(value, false); + } + uiComboCheckBox.setSelectedValues(map); + } + + @Override + protected String title4PopupWindow() { + return "ComponentFrozenPane"; + } +} diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentLayoutIntervalPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentLayoutIntervalPane.java index 5a565373d..169b014a0 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentLayoutIntervalPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentLayoutIntervalPane.java @@ -3,7 +3,6 @@ package com.fr.design.widget.ui.designer.mobile.component; import com.fr.base.iofile.attr.AttrMarkFactory; import com.fr.base.iofile.attr.FormBodyPaddingAttrMark; import com.fr.design.designer.IntervalConstants; -import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.layout.FRGUIPaneFactory; @@ -29,24 +28,17 @@ public class MobileComponentLayoutIntervalPane extends XmlRelationedBasicPane { super(xmlTag); this.setLayout(FRGUIPaneFactory.createBorderLayout()); UILabel intervalLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Component_Interval")); - - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}, {1, 1}}; componentIntervel = new UISpinner(0, Integer.MAX_VALUE, 1, FormBodyPaddingAttrMark.DEFAULT_SIZE); - JPanel componentIntervelPane = UIComponentUtils.wrapWithBorderLayoutPane(componentIntervel); + JPanel componentIntervalPane = UIComponentUtils.wrapWithBorderLayoutPane(componentIntervel); Component[][] components = new Component[][]{ - new Component[]{intervalLabel, componentIntervelPane} + new Component[]{intervalLabel, componentIntervalPane} }; - JPanel centerPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - centerPane.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L5, 0, 0)); + JPanel centerPane = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); + centerPane.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L5, 10, 0)); JPanel holder = FRGUIPaneFactory.createBorderLayout_S_Pane(); holder.add(centerPane, BorderLayout.NORTH); - UIExpandablePane layoutExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout"), 280, 20, holder); - this.add(layoutExpandablePane, BorderLayout.NORTH); + this.add(holder, BorderLayout.NORTH); } @Override diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentAdvancePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentMarginPane.java similarity index 77% rename from designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentAdvancePane.java rename to designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentMarginPane.java index f94d57907..7a1bb34ee 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentAdvancePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentMarginPane.java @@ -2,7 +2,6 @@ package com.fr.design.widget.ui.designer.mobile.component; import com.fr.base.iofile.attr.AttrMarkFactory; import com.fr.base.iofile.attr.FormBodyPaddingAttrMark; -import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.widget.ui.designer.XmlRelationedBasicPane; import com.fr.design.widget.ui.designer.component.PaddingBoundPane; @@ -13,20 +12,19 @@ import java.awt.BorderLayout; /** * 只有内边距设置的高级设置 */ -public class MobileComponentAdvancePane extends XmlRelationedBasicPane { +public class MobileComponentMarginPane extends XmlRelationedBasicPane { private PaddingBoundPane paddingBound; - public MobileComponentAdvancePane(String xmlTag) { + public MobileComponentMarginPane(String xmlTag) { super(xmlTag); this.setLayout(FRGUIPaneFactory.createBorderLayout()); paddingBound = new PaddingBoundPane(FormBodyPaddingAttrMark.DEFAULT_SIZE, FormBodyPaddingAttrMark.DEFAULT_SIZE, FormBodyPaddingAttrMark.DEFAULT_SIZE, FormBodyPaddingAttrMark.DEFAULT_SIZE); - UIExpandablePane advanceExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, paddingBound); - this.add(advanceExpandablePane, BorderLayout.NORTH); + this.add(paddingBound, BorderLayout.NORTH); } @Override protected String title4PopupWindow() { - return "ComponentAdvancePane"; + return "ComponentMarginPane"; } public void update(RichStyleWidgetProvider marginWidget) { From 6e65fd6e0a9ee8190fad98dfbe6d35ff4d1baf2f Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Wed, 21 Aug 2019 18:28:07 +0800 Subject: [PATCH 45/46] =?UTF-8?q?REPORT-19464=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91TAB=E4=B8=8B?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=BC=8F=E5=9B=BE=E6=A0=87=E4=BC=98=E5=8C=96?= =?UTF-8?q?2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/web/CustomIconPane.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java index bc21d4c73..0231963b9 100644 --- a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java +++ b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java @@ -452,10 +452,10 @@ public class CustomIconPane extends BasicPane { String path = jf.getSelectedFile().getAbsolutePath(); // 图片存储有最大值48*48限制,没有超过最大值时,按原图大小存储,超过最大值后,压缩至最大值存储 Image image = BaseUtils.readImage(path); - BufferedImage bufferedImage = CoreGraphHelper.createBufferedImage(image.getWidth(null) >= 48 ? IconManager.MAXSTORAGE_ICONWIDTH : image.getWidth(null), - image.getHeight(null) >= 48 ? IconManager.MAXSTORAGE_ICONHEIGHT : image.getHeight(null), BufferedImage.TYPE_INT_ARGB); + BufferedImage bufferedImage = CoreGraphHelper.createBufferedImage(Math.min(image.getWidth(null), IconManager.MAXSTORAGE_ICONWIDTH), + Math.min(image.getHeight(null), IconManager.MAXSTORAGE_ICONHEIGHT), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = bufferedImage.createGraphics(); - g2d.drawImage(image, 0, 0, image.getWidth(null) >= 48 ? IconManager.MAXSTORAGE_ICONWIDTH : image.getWidth(null), image.getHeight(null) >= 48 ? IconManager.MAXSTORAGE_ICONHEIGHT : image.getHeight(null), null); + g2d.drawImage(image, 0, 0, Math.min(image.getWidth(null), IconManager.MAXSTORAGE_ICONWIDTH), Math.min(image.getHeight(null), IconManager.MAXSTORAGE_ICONHEIGHT), null); bufferedImage.flush(); g2d.dispose(); iconImage = bufferedImage; From ff6238a50f9d5717b2c789126a71232bcdb93b91 Mon Sep 17 00:00:00 2001 From: author Date: Thu, 22 Aug 2019 18:15:06 +0800 Subject: [PATCH 46/46] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=EF=BC=8Cs?= =?UTF-8?q?onar=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/gui/icheckbox/UICheckBox.java | 100 +++++++++--------- .../fr/design/gui/icheckbox/UICheckBoxUI.java | 2 +- .../fr/design/gui/icombobox/LazyComboBox.java | 1 + .../gui/icombobox/LazyComboBoxTest.java | 1 + 4 files changed, 52 insertions(+), 52 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBox.java b/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBox.java index 7489b4f59..10ea06a8c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBox.java +++ b/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBox.java @@ -125,60 +125,58 @@ public class UICheckBox extends JCheckBox implements UIObserver, GlobalNameObser private class UICheckBoxUI extends MetalCheckBoxUI { @Override - public void paint(Graphics g, JComponent c) { - synchronized (this) { - AbstractButton b = (AbstractButton) c; - ButtonModel model = b.getModel(); - Dimension size = c.getSize(); - Font f = c.getFont(); - g.setFont(f); - FontMetrics fm = SwingUtilities2.getFontMetrics(c, g, f); - - Rectangle viewRect = new Rectangle(size); - Rectangle iconRect = new Rectangle(); - Rectangle textRect = new Rectangle(); - - Insets i = c.getInsets(); - viewRect.x += i.left; - viewRect.y += i.top; - viewRect.width -= (i.right + viewRect.x); - viewRect.height -= (i.bottom + viewRect.y); - - Icon altIcon = b.getIcon(); - - String text = SwingUtilities.layoutCompoundLabel( - c, fm, b.getText(), altIcon != null ? altIcon : getDefaultIcon(), - b.getVerticalAlignment(), b.getHorizontalAlignment(), - b.getVerticalTextPosition(), b.getHorizontalTextPosition(), - viewRect, iconRect, textRect, b.getIconTextGap()); - - // fill background - if (c.isOpaque()) { - g.setColor(b.getBackground()); - g.fillRect(0, 0, size.width, size.height); - } - - Graphics2D g2d = (Graphics2D) g; - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - if (model.isSelected()) { - GUIPaintUtils.fillPaint(g2d, iconRect.x, iconRect.y, iconRect.width, iconRect.height, false, Constants.NULL, - model.isEnabled() ? UIConstants.CHECKBOX_HOVER_SELECTED : UIConstants.DISABLED_ICON_COLOR, 0); - } else if (model.isRollover() && !model.isSelected()) { - g.setColor(UIConstants.CHECKBOX_HOVER_SELECTED); - g2d.drawRoundRect(iconRect.x, iconRect.y, iconRect.width - 1, iconRect.height - 1, UIConstants.ARC, UIConstants.ARC); - } else { - g.setColor(UIConstants.LINE_COLOR); - g2d.drawRoundRect(iconRect.x, iconRect.y, iconRect.width - 1, iconRect.height - 1, UIConstants.ARC, UIConstants.ARC); - } + public synchronized void paint(Graphics g, JComponent c) { + AbstractButton b = (AbstractButton) c; + ButtonModel model = b.getModel(); + Dimension size = c.getSize(); + Font f = c.getFont(); + g.setFont(f); + FontMetrics fm = SwingUtilities2.getFontMetrics(c, g, f); + + Rectangle viewRect = new Rectangle(size); + Rectangle iconRect = new Rectangle(); + Rectangle textRect = new Rectangle(); + + Insets i = c.getInsets(); + viewRect.x += i.left; + viewRect.y += i.top; + viewRect.width -= (i.right + viewRect.x); + viewRect.height -= (i.bottom + viewRect.y); + + Icon altIcon = b.getIcon(); + + String text = SwingUtilities.layoutCompoundLabel( + c, fm, b.getText(), altIcon != null ? altIcon : getDefaultIcon(), + b.getVerticalAlignment(), b.getHorizontalAlignment(), + b.getVerticalTextPosition(), b.getHorizontalTextPosition(), + viewRect, iconRect, textRect, b.getIconTextGap()); + + // fill background + if (c.isOpaque()) { + g.setColor(b.getBackground()); + g.fillRect(0, 0, size.width, size.height); + } - if (model.isSelected()) { - UIConstants.YES_ICON.paintIcon(c, g, iconRect.x + 2, iconRect.y + 2); - } - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + if (model.isSelected()) { + GUIPaintUtils.fillPaint(g2d, iconRect.x, iconRect.y, iconRect.width, iconRect.height, false, Constants.NULL, + model.isEnabled() ? UIConstants.CHECKBOX_HOVER_SELECTED : UIConstants.DISABLED_ICON_COLOR, 0); + } else if (model.isRollover() && !model.isSelected()) { + g.setColor(UIConstants.CHECKBOX_HOVER_SELECTED); + g2d.drawRoundRect(iconRect.x, iconRect.y, iconRect.width - 1, iconRect.height - 1, UIConstants.ARC, UIConstants.ARC); + } else { + g.setColor(UIConstants.LINE_COLOR); + g2d.drawRoundRect(iconRect.x, iconRect.y, iconRect.width - 1, iconRect.height - 1, UIConstants.ARC, UIConstants.ARC); + } - // Draw the Text - drawLine(text, g, b, c, textRect, fm); + if (model.isSelected()) { + UIConstants.YES_ICON.paintIcon(c, g, iconRect.x + 2, iconRect.y + 2); } + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + + // Draw the Text + drawLine(text, g, b, c, textRect, fm); } private void drawLine(String text, Graphics g, AbstractButton b, JComponent c, Rectangle textRect, FontMetrics fm) { diff --git a/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBoxUI.java b/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBoxUI.java index 1a7bbb661..9076d355d 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBoxUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBoxUI.java @@ -64,7 +64,7 @@ public class UICheckBoxUI extends MetalCheckBoxUI { } } - static BasicStroke focusStroke = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 1.0f, new float[]{1.0f / 1.0f}, 1.0f); + static BasicStroke focusStroke = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 1.0f, new float[]{1.0f}, 1.0f); protected void paintFocus(Graphics g, Rectangle t, Dimension arg2) { if (!ThemeUtils.BUTTON_FOCUS) { diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBox.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBox.java index be83cf5b1..300790457 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBox.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBox.java @@ -84,6 +84,7 @@ public abstract class LazyComboBox extends UIComboBox implements PopupMenuListen LazyComboBox.this.loadList(get()); } catch (InterruptedException | ExecutionException exception) { FineLoggerFactory.getLogger().debug(exception.getMessage()); + Thread.currentThread().interrupt(); } LazyComboBox.this.showPopup(); } diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java index 4016a263c..37e9db154 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java @@ -40,6 +40,7 @@ public class LazyComboBoxTest { Thread.sleep(3000); } catch (InterruptedException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); + Thread.currentThread().interrupt(); } return m; }