From 7e1f6c1322043502c08a687473b50e8b45a147f4 Mon Sep 17 00:00:00 2001 From: vito Date: Fri, 3 Nov 2023 16:23:47 +0800 Subject: [PATCH 001/302] =?UTF-8?q?REPORT-99485=20=E9=80=82=E9=85=8D?= =?UTF-8?q?=E4=B8=BB=E9=A2=98=EF=BC=8C=E5=90=8C=E6=AD=A5=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 9 +- designer-base/build.base.gradle | 12 +- .../fine/theme/light/icon/IconManager.java | 11 + .../theme/light/ui/FineToggleButtonUI.java | 93 ++ .../fine/theme/light/ui/laf/FineLightLaf.java | 24 + .../fine/theme/light/utils/FineUIUtils.java | 40 + .../fr/design/actions/core/ActionFactory.java | 22 +- .../design/data/datapane/TableDataTree.java | 8 +- .../data/datapane/TableDataTreePane.java | 3 +- .../connect/ConnectionTableProcedurePane.java | 4 +- .../pane/TableDataSearchRemindPane.java | 2 +- .../exe/callback/ModifyStatusCallback.java | 25 +- .../exe/callback/UninstallPluginCallback.java | 47 +- .../fr/design/file/MultiTemplateTabPane.java | 37 +- .../com/fr/design/file/NewTemplatePane.java | 4 +- .../fr/design/foldablepane/HeaderPane.java | 38 +- .../java/com/fr/design/gui/UILookAndFeel.java | 25 +- .../design/gui/controlpane/UIControlPane.java | 16 +- .../design/gui/frpane/LoadingBasicPane.java | 30 +- .../fr/design/gui/frpane/UITabbedPane.java | 39 +- .../fr/design/gui/frpane/UITabbedPaneUI.java | 2 +- .../com/fr/design/gui/ibutton/UIButton.java | 74 +- .../fr/design/gui/ibutton/UIButtonGroup.java | 52 +- .../com/fr/design/gui/ibutton/UIButtonUI.java | 50 +- .../com/fr/design/gui/ibutton/UIHead.java | 23 +- .../fr/design/gui/ibutton/UIHeadGroup.java | 282 +++-- .../UIHeadGroupSingleSelectionModel.java | 31 + .../fr/design/gui/icombobox/UIComboBox.java | 16 +- .../icontainer/UIEastResizableContainer.java | 13 +- .../icontainer/UIModeControlContainer.java | 1 + .../gui/icontainer/UIResizableContainer.java | 12 +- .../design/gui/icontainer/UIScrollPane.java | 14 +- .../fr/design/gui/ilist/TableViewList.java | 2 +- .../com/fr/design/gui/imenu/UIHeadMenu.java | 73 +- .../fr/design/gui/imenu/UILockMenuItemUI.java | 4 +- .../java/com/fr/design/gui/imenu/UIMenu.java | 119 +- .../com/fr/design/gui/imenu/UIMenuBar.java | 8 +- .../com/fr/design/gui/imenu/UIMenuBarUI.java | 9 +- .../design/gui/imenu/UIMenuEastAttrItem.java | 10 +- .../fr/design/gui/imenu/UIMenuHighLight.java | 25 - .../com/fr/design/gui/imenu/UIMenuItem.java | 9 +- .../com/fr/design/gui/imenu/UIPopupMenu.java | 24 +- .../com/fr/design/gui/imenu/UIScrollMenu.java | 14 +- .../design/gui/imenu/UIScrollPopUpMenu.java | 22 +- .../fr/design/gui/iscrollbar/UIScrollBar.java | 6 +- .../fr/design/gui/ispinner/UISpinnerUI.java | 1 - .../com/fr/design/gui/itable/UITable.java | 51 +- .../itableeditorpane/UITableEditorPane.java | 2 +- .../fr/design/gui/itextfield/UITextField.java | 16 +- .../com/fr/design/gui/itoolbar/UIToolbar.java | 7 +- .../gui/itree/filetree/EnvFileTree.java | 12 +- .../refreshabletree/RefreshableJTree.java | 17 +- .../com/fr/design/i18n/DesignI18nImpl.java | 9 +- .../mainframe/CenterRegionContainerPane.java | 2 - .../DesignerFrameFileDealerPane.java | 3 - .../mainframe/EastRegionContainerPane.java | 97 +- .../fr/design/mainframe/ForbiddenPane.java | 17 +- .../fr/design/mainframe/JFormSliderPane.java | 19 +- .../mainframe/NorthRegionContainerPane.java | 2 - .../mainframe/WestRegionContainerPane.java | 17 +- .../mainframe/guide/base/GuideView.java | 2 +- .../loghandler/DesignerLogHandler.java | 2 +- .../mainframe/loghandler/LogHandlerBar.java | 2 +- .../mainframe/loghandler/LogMessageBar.java | 3 - .../mainframe/toolbar/LookAndFeelAction.java | 41 + .../mainframe/toolbar/ToolBarMenuDock.java | 21 +- .../design/mainframe/vcs/ui/VcsMovePanel.java | 14 +- .../mainframe/widget/editors/TextField.java | 4 +- .../com/fr/design/menu/DottedSeparator.java | 16 +- .../com/fr/design/menu/LineSeparator.java | 12 +- .../com/fr/design/menu/NameSeparator.java | 18 +- .../ui/NotificationCenterPane.java | 4 +- .../roleAuthority/ReportAndFSManagePane.java | 3 +- .../style/color/CustomChooserPanel.java | 1 - .../java/com/fr/design/ui/util/UIUtil.java | 12 +- .../java/com/fr/design/upm/UpmBridge.java | 4 +- .../java/com/fr/design/utils/DesignUtils.java | 12 +- .../start/server/FineEmbedServerMonitor.java | 29 +- .../light/ui/laf/FineLightLaf.properties | 1077 +++++++++++++++++ designer-chart/build.chart.gradle | 2 +- designer-chart/build.gradle | 2 +- .../design/mainframe/chart/ChartEditPane.java | 1 - designer-form/build.form.gradle | 2 +- designer-form/build.gradle | 2 +- .../treeview/ComponentTreeCellRenderer.java | 4 +- .../fr/design/mainframe/ComponentTree.java | 16 +- .../mainframe/FormHierarchyTreePane.java | 21 +- .../design/mainframe/WidgetPropertyPane.java | 7 +- designer-realize/build.gradle | 4 +- .../fr/design/cell/bar/DynamicScrollBar.java | 22 +- .../fr/design/mainframe/ReportFloatPane.java | 19 +- .../fr/design/mainframe/SheetNameTabPane.java | 54 +- .../alphafine/component/AlphaFinePane.java | 4 - .../alphafine/question/QuestionWindow.java | 7 +- .../mainframe/cell/CellElementEditPane.java | 1 - .../design/mainframe/guide/GuideRegister.java | 9 +- .../com/fr/design/webattr/SettingToolBar.java | 23 +- .../fr/design/webattr/ToolBarDragPane.java | 15 +- .../com/fr/design/webattr/ToolBarPane.java | 4 +- .../fr/design/widget/CellWidgetCardPane.java | 1 - .../src/main/java/com/fr/grid/GridCorner.java | 12 +- .../src/main/java/com/fr/grid/GridUI.java | 11 +- .../cellquick/CellDSColumnEditor.java | 1 - .../main/java/com/fr/start/MainDesigner.java | 48 +- .../fr/start/module/DesignerActivator.java | 38 +- settings.gradle | 2 +- 106 files changed, 2302 insertions(+), 963 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/light/icon/IconManager.java create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineToggleButtonUI.java create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java create mode 100644 designer-base/src/main/java/com/fine/theme/light/utils/FineUIUtils.java create mode 100644 designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroupSingleSelectionModel.java delete mode 100644 designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuHighLight.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/toolbar/LookAndFeelAction.java create mode 100644 designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties diff --git a/build.gradle b/build.gradle index 052b2e40cc..0ebf3e9cb6 100644 --- a/build.gradle +++ b/build.gradle @@ -73,8 +73,8 @@ allprojects { implementation 'org.swingexplorer:swexpl:2.0.1' implementation 'org.swingexplorer:swag:1.0' implementation 'net.java.dev.jna:jna:5.4.0' - implementation 'org.apache.tomcat:tomcat-catalina:8.5.72' - implementation 'org.apache.tomcat:tomcat-websocket:8.5.72' + implementation 'org.apache.tomcat:tomcat-catalina:8.5.93' + implementation 'org.apache.tomcat:tomcat-websocket:8.5.93' implementation 'io.socket:socket.io-client:0.7.0' implementation 'com.fr.third:fine-third:' + frVersion implementation 'com.fr.core:fine-core:' + frDevVersion @@ -87,6 +87,10 @@ allprojects { implementation 'com.fr.report:engine-chart:' + frDevVersion implementation 'com.fr.report:engine-i18n:' + frDevVersion implementation 'com.fr.design:design-i18n:' + frDevVersion + implementation 'com.formdev:flatlaf:3.2' + implementation 'com.formdev:flatlaf-extras:3.2.1' + implementation 'com.fanruan.vito:gui-inspector:1.0.1' + implementation 'com.fine.swing.ui:layout:1.0-SNAPSHOT' testImplementation 'org.easymock:easymock:3.5.1' testImplementation 'org.powermock:powermock-module-junit4:1.7.1' testImplementation 'org.powermock:powermock-api-easymock:1.7.1' @@ -98,6 +102,7 @@ allprojects { if (OperatingSystem.current().isMacOsX() && "aarch64".equals(System.getProperty("os.arch"))) { dependencies { // jxbrowser 6.23不支持M1,因此没有本地库,但是6.23jar还是需要留着,用来兼容 + implementation 'com.fr.third:jxbrowser-mac:6.23' implementation "com.fr.third:jxbrowser-mac-arm-v7:${jxBrowserVersion}" } } else if (OperatingSystem.current().isMacOsX()) { diff --git a/designer-base/build.base.gradle b/designer-base/build.base.gradle index 094d45d9a6..5ad2f5394b 100644 --- a/designer-base/build.base.gradle +++ b/designer-base/build.base.gradle @@ -59,12 +59,12 @@ def branchName=buildDir.substring(buildDir.lastIndexOf ('\\')+1) //声明外部依赖 dependencies{ - compile fileTree(dir:"../${baseDir}/lib-other",include:'**/*.jar') - compile fileTree(dir:"../${baseDir}/lib-core",include:'**/*.jar') - compile fileTree(dir:"../${baseDir}/lib-design",include:'**/*.jar') - compile fileTree(dir:"../${baseDir}",include:"**/build/libs/*.jar",exclude:"bi/**/*.jar") - compile group: 'io.socket', name: 'socket.io-client', version: '0.7.0' - testCompile 'junit:junit:4.12' + api fileTree(dir:"../${baseDir}/lib-other",include:'**/*.jar') + api fileTree(dir:"../${baseDir}/lib-core",include:'**/*.jar') + api fileTree(dir:"../${baseDir}/lib-design",include:'**/*.jar') + api fileTree(dir:"../${baseDir}",include:"**/build/libs/*.jar",exclude:"bi/**/*.jar") + api group: 'io.socket', name: 'socket.io-client', version: '0.7.0' + testImplementation 'junit:junit:4.12' } //输出依赖报 diff --git a/designer-base/src/main/java/com/fine/theme/light/icon/IconManager.java b/designer-base/src/main/java/com/fine/theme/light/icon/IconManager.java new file mode 100644 index 0000000000..bc4bbeade8 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/icon/IconManager.java @@ -0,0 +1,11 @@ +package com.fine.theme.light.icon; + +/** + * 图标管理器 + * + * @author vito + * @since 11.0 + * Created on 2023/9/12 + */ +public class IconManager { +} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineToggleButtonUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineToggleButtonUI.java new file mode 100644 index 0000000000..71e4b83b5f --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineToggleButtonUI.java @@ -0,0 +1,93 @@ +package com.fine.theme.light.ui; + + +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatToggleButtonUI; +import com.formdev.flatlaf.ui.FlatUIUtils; +import org.jetbrains.annotations.Nullable; + +import javax.swing.AbstractButton; +import javax.swing.JComponent; +import javax.swing.JToggleButton; +import javax.swing.UIManager; +import javax.swing.plaf.ComponentUI; +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics; + +import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; +import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE_TAB; +import static com.formdev.flatlaf.FlatClientProperties.TAB_BUTTON_SELECTED_BACKGROUND; +import static com.formdev.flatlaf.FlatClientProperties.clientPropertyColor; + +/** + * 提供 {@link javax.swing.JToggleButton} 的UI类 + *

+ * + * @author vito + * @uiDefault ToggleButton.tab.arc int + * @since 11.0 + * Created on 2023/11/3 + */ +public class FineToggleButtonUI extends FlatToggleButtonUI { + + @Styleable(dot = true) + protected int tabArc; + + public static ComponentUI createUI(JComponent c) { + return FlatUIUtils.canUseSharedUI(c) + ? FlatUIUtils.createSharedUI(FlatToggleButtonUI.class, () -> new FineToggleButtonUI(true)) + : new FineToggleButtonUI(false); + } + + protected FineToggleButtonUI(boolean shared) { + super(shared); + } + + @Override + protected void installDefaults(AbstractButton b) { + super.installDefaults(b); + tabArc = UIManager.getInt("ToggleButton.tab.arc"); + } + + + @Nullable + static String getButtonTypeStr(AbstractButton c) { + Object value = c.getClientProperty(BUTTON_TYPE); + if (value instanceof String) + return (String) value; + return null; + } + + static boolean isTabButton(Component c) { + return c instanceof JToggleButton && BUTTON_TYPE_TAB.equals(getButtonTypeStr((JToggleButton) c)); + } + + @Override + protected void paintBackground(Graphics g, JComponent c) { + if (isTabButton(c)) { + int height = c.getHeight(); + int width = c.getWidth(); + boolean selected = ((AbstractButton) c).isSelected(); + Color enabledColor = selected ? clientPropertyColor(c, TAB_BUTTON_SELECTED_BACKGROUND, tabSelectedBackground) : null; + + // use component background if explicitly set + if (enabledColor == null) { + Color bg = c.getBackground(); + if (isCustomBackground(bg)) + enabledColor = bg; + } + + // paint background + Color background = buttonStateColor(c, enabledColor, + null, tabFocusBackground, tabHoverBackground, null); + if (background != null) { + g.setColor(background); + g.fillRoundRect(0, 0, width, height, tabArc, tabArc); + } + } else + super.paintBackground(g, c); + } + +} + diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java new file mode 100644 index 0000000000..7b3bbcce1b --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java @@ -0,0 +1,24 @@ +package com.fine.theme.light.ui.laf; + +import com.formdev.flatlaf.FlatLightLaf; + +/** + * FineReport designer new look and feel + * + * @author vito + * @since 11.0 + * Created on 2023/9/12 + */ +public class FineLightLaf extends FlatLightLaf { + public static boolean setup() { + return setup( new FineLightLaf() ); + } + + @Override + public String getName() { + return "FineLightLaf"; + } + + + +} diff --git a/designer-base/src/main/java/com/fine/theme/light/utils/FineUIUtils.java b/designer-base/src/main/java/com/fine/theme/light/utils/FineUIUtils.java new file mode 100644 index 0000000000..693600770e --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/utils/FineUIUtils.java @@ -0,0 +1,40 @@ +package com.fine.theme.light.utils; + +import javax.swing.UIManager; +import java.awt.Color; + +/** + * UI绘制的一些常用方法 + * + * @author vito + * @since 11.0 + * Created on 2023/11/3 + */ +public class FineUIUtils { + + + /** + * 通过key获取UI的颜色,如果没有则使用后备key获取 + * + * @param key 颜色key + * @param defaultKey 颜色后备key + * @return 颜色 + */ + + public static Color getUIColor(String key, String defaultKey) { + Color color = UIManager.getColor(key); + return (color != null) ? color : UIManager.getColor(defaultKey); + } + + /** + * 获取key指定的int值,如果没有则使用后备key获取 + * + * @param key int所在的key + * @param defaultKey 后备key + * @return 长度 + */ + public static int getUIInt(String key, String defaultKey) { + Object value = UIManager.get(key); + return (value instanceof Integer) ? (Integer) value : UIManager.getInt(defaultKey); + } +} diff --git a/designer-base/src/main/java/com/fr/design/actions/core/ActionFactory.java b/designer-base/src/main/java/com/fr/design/actions/core/ActionFactory.java index 3a8137f9d0..84fcd68696 100644 --- a/designer-base/src/main/java/com/fr/design/actions/core/ActionFactory.java +++ b/designer-base/src/main/java/com/fr/design/actions/core/ActionFactory.java @@ -30,8 +30,8 @@ import java.util.concurrent.CopyOnWriteArraySet; * @version 2017年11月17日14点39分 */ public class ActionFactory { - private static Set> actionClasses = new CopyOnWriteArraySet<>(); - private static Set> floatActionClasses = new CopyOnWriteArraySet<>(); + private static final Set> actionClasses = new CopyOnWriteArraySet<>(); + private static final Set> floatActionClasses = new CopyOnWriteArraySet<>(); private static Class chartCollectionClass = null; /** @@ -287,13 +287,13 @@ public class ActionFactory { * * @param cls 类型数组 */ - public static void registerCellInsertActionClass(Class[] cls) { + public static void registerCellInsertActionClass(Class[] cls) { if (cls != null) { actionClasses.addAll(Arrays.asList(cls)); } } - public static void referCellInsertActionClass(Class[] cls) { + public static void referCellInsertActionClass(Class[] cls) { if (cls != null) { actionClasses.clear(); actionClasses.addAll(Arrays.asList(cls)); @@ -331,13 +331,13 @@ public class ActionFactory { public static MenuKeySet[] createCellInsertActionName() { List actionNames = new ArrayList<>(); JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); - for (Class clazz : actionClasses) { + for (Class clazz : actionClasses) { if (clazz == null) { continue; } if (jTemplate.acceptToolbarItem(clazz)) { try { - Constructor c = (Constructor) clazz.getConstructor(); + Constructor c = clazz.getConstructor(); actionNames.add(c.newInstance().getMenuKeySet()); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); @@ -352,13 +352,13 @@ public class ActionFactory { * * @param cls 插入类型数组 */ - public static void registerFloatInsertActionClass(Class[] cls) { + public static void registerFloatInsertActionClass(Class[] cls) { if (cls != null) { floatActionClasses.addAll(Arrays.asList(cls)); } } - public static void referFloatInsertActionClass(Class[] cls) { + public static void referFloatInsertActionClass(Class[] cls) { if (cls != null) { floatActionClasses.clear(); floatActionClasses.addAll(Arrays.asList(cls)); @@ -374,18 +374,18 @@ public class ActionFactory { */ public static UpdateAction[] createFloatInsertAction(Class cls, Object obj) { List actions = new ArrayList<>(); - for (Class clazz : floatActionClasses) { + for (Class clazz : floatActionClasses) { if (clazz == null) { continue; } try { - Constructor c = (Constructor) clazz.getConstructor(cls); + Constructor c = clazz.getConstructor(cls); actions.add(c.newInstance(obj)); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } } - return actions.toArray(new UpdateAction[actions.size()]); + return actions.toArray(new UpdateAction[0]); } private static QuickEditor createEditor(Class clazz, Map editorMap, Map> editorClassMap) { diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java index ed08cffddf..c19b4b2740 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java @@ -2,7 +2,6 @@ package com.fr.design.data.datapane; import com.fr.base.svg.IconUtils; import com.fr.data.MultiResultTableData; -import com.fr.design.constants.UIConstants; import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager; import com.fr.design.data.tabledata.wrapper.TableDataWrapper; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; @@ -17,7 +16,6 @@ import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; -import java.awt.Color; import java.awt.Component; import java.util.ArrayList; import java.util.HashMap; @@ -79,9 +77,9 @@ public class TableDataTree extends UserObjectRefreshJTree { this.setText(PENDING.toString()); } this.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0)); - this.setBackgroundNonSelectionColor(UIConstants.TREE_BACKGROUND); - this.setTextSelectionColor(Color.WHITE); - this.setBackgroundSelectionColor(UIConstants.FLESH_BLUE); +// this.setBackgroundNonSelectionColor(UIConstants.TREE_BACKGROUND); +// this.setTextSelectionColor(Color.WHITE); +// this.setBackgroundSelectionColor(UIConstants.FLESH_BLUE); return this; } }; diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index 149fa87dc2..83078a2f19 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -76,6 +76,7 @@ import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import javax.swing.ToolTipManager; +import javax.swing.border.EmptyBorder; import javax.swing.tree.TreePath; import java.awt.BorderLayout; import java.awt.Color; @@ -275,6 +276,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { treePane.add(northPane, BorderLayout.NORTH); treePane.add(remindPane, BorderLayout.CENTER); + treePane.setBorder(new EmptyBorder(10, 10,10,10)); return treePane; } @@ -813,7 +815,6 @@ public class TableDataTreePane extends BasicTableDataTreePane { return false; } }; - buttonGroup.setNeedLeftRightOutLine(false); } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java index 79e75a0b83..41556dae83 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java @@ -7,7 +7,6 @@ import com.fr.data.impl.AbstractDatabaseConnection; import com.fr.data.impl.Connection; import com.fr.design.border.UIRoundedBorder; import com.fr.design.constants.UIConstants; -import com.fr.design.data.tabledata.tabledatapane.DBTableDataPane; import com.fr.design.data.tabledata.tabledatapane.loading.SwitchableTableDataPane; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; @@ -27,7 +26,6 @@ import javax.swing.ToolTipManager; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.BorderLayout; -import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -164,7 +162,7 @@ public class ConnectionTableProcedurePane extends BasicPane { JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); JPanel searchPane = new JPanel(new BorderLayout(10, 0)); searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.TOOLBAR_BORDER_COLOR)); - searchPane.setBackground(Color.WHITE); +// searchPane.setBackground(Color.WHITE); searchField = new UITextField(); searchField.setBorderPainted(false); searchField.setPlaceholder(Toolkit.i18nText("Fine-Design_Basic_Table_Search")); diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TableDataSearchRemindPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TableDataSearchRemindPane.java index dad2d4d4c6..bab21699cb 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TableDataSearchRemindPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TableDataSearchRemindPane.java @@ -106,7 +106,7 @@ public class TableDataSearchRemindPane extends JPanel implements TreeSearchStatu emptyPicLabel.setHorizontalAlignment(SwingConstants.CENTER); emptyPicLabel.setPreferredSize(new Dimension(240, 100)); UILabel textLabel = new UILabel(Toolkit.i18nText("Fine-Design_Tree_Search_Not_Match"), SwingConstants.CENTER); - textLabel.setForeground(Color.gray); +// textLabel.setForeground(Color.gray); textLabel.setHorizontalAlignment(SwingConstants.CENTER); textLabel.setPreferredSize(new Dimension(240, 20)); notFoundPane.add(emptyPicLabel); diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/callback/ModifyStatusCallback.java b/designer-base/src/main/java/com/fr/design/extra/exe/callback/ModifyStatusCallback.java index 434be685db..c9c8190a98 100644 --- a/designer-base/src/main/java/com/fr/design/extra/exe/callback/ModifyStatusCallback.java +++ b/designer-base/src/main/java/com/fr/design/extra/exe/callback/ModifyStatusCallback.java @@ -7,6 +7,7 @@ import com.fr.design.extra.PluginOperateUtils; import com.fr.design.i18n.Toolkit; import com.fr.design.plugin.DesignerPluginContext; +import com.fr.design.ui.util.UIUtil; import com.fr.log.FineLoggerFactory; import com.fr.plugin.manage.control.PluginTaskCallback; import com.fr.plugin.manage.control.PluginTaskResult; @@ -32,17 +33,19 @@ public class ModifyStatusCallback implements PluginTaskCallback { @Override public void done(PluginTaskResult result) { - String pluginInfo = PluginOperateUtils.getSuccessInfo(result); - if (result.isSuccess()) { - jsCallback.execute("success"); - String modifyMessage = isActive ? - pluginInfo + Toolkit.i18nText("Fine-Design_Basic_Plugin_Has_Been_Disabled_Duplicate") : - pluginInfo + Toolkit.i18nText("Fine-Design_Plugin_Has_Been_Actived_Duplicate"); - FineLoggerFactory.getLogger().info(modifyMessage); - FineJOptionPane.showMessageDialog(DesignerPluginContext.getPluginDialog(), modifyMessage); - } else { - FineJOptionPane.showMessageDialog(DesignerPluginContext.getPluginDialog(), pluginInfo, Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } + UIUtil.invokeLaterIfNeeded(() -> { + String pluginInfo = PluginOperateUtils.getSuccessInfo(result); + if (result.isSuccess()) { + jsCallback.execute("success"); + String modifyMessage = isActive ? + pluginInfo + Toolkit.i18nText("Fine-Design_Basic_Plugin_Has_Been_Disabled_Duplicate") : + pluginInfo + Toolkit.i18nText("Fine-Design_Plugin_Has_Been_Actived_Duplicate"); + FineLoggerFactory.getLogger().info(modifyMessage); + FineJOptionPane.showMessageDialog(DesignerPluginContext.getPluginDialog(), modifyMessage); + } else { + FineJOptionPane.showMessageDialog(DesignerPluginContext.getPluginDialog(), pluginInfo, Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + }); } } diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/callback/UninstallPluginCallback.java b/designer-base/src/main/java/com/fr/design/extra/exe/callback/UninstallPluginCallback.java index 6fba685d75..5baeeaeff4 100644 --- a/designer-base/src/main/java/com/fr/design/extra/exe/callback/UninstallPluginCallback.java +++ b/designer-base/src/main/java/com/fr/design/extra/exe/callback/UninstallPluginCallback.java @@ -5,6 +5,7 @@ import com.fr.design.dialog.FineJOptionPane; import com.fr.design.extra.PluginOperateUtils; import com.fr.design.i18n.Toolkit; +import com.fr.design.ui.util.UIUtil; import com.fr.log.FineLoggerFactory; import com.fr.plugin.context.PluginMarker; import com.fr.plugin.error.PluginErrorCode; @@ -17,34 +18,36 @@ import com.fr.plugin.manage.control.PluginTaskResult; public class UninstallPluginCallback extends AbstractPluginTaskCallback { private JSCallback jsCallback; - public UninstallPluginCallback(PluginMarker pluginMarker, JSCallback jsCallback){ + public UninstallPluginCallback(PluginMarker pluginMarker, JSCallback jsCallback) { this.jsCallback = jsCallback; this.pluginMarker = pluginMarker; } @Override public void done(PluginTaskResult result) { - String pluginInfo = PluginOperateUtils.getSuccessInfo(result); - if (result.isSuccess()) { - jsCallback.execute("success"); - String successInfo = pluginInfo + Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Success"); - FineLoggerFactory.getLogger().info(successInfo); - FineJOptionPane.showMessageDialog(null, successInfo); - }else if (result.errorCode() == PluginErrorCode.NeedUninstallDependingPluginFirst) { - int rv = FineJOptionPane.showConfirmDialog( - null, - Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Dependence"), - Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), - FineJOptionPane.OK_CANCEL_OPTION, - FineJOptionPane.INFORMATION_MESSAGE - ); - if (rv == FineJOptionPane.OK_OPTION) { - PluginManager.getController().uninstall(pluginMarker, true, new UninstallPluginCallback(pluginMarker, jsCallback)); + UIUtil.invokeLaterIfNeeded(() -> { + String pluginInfo = PluginOperateUtils.getSuccessInfo(result); + if (result.isSuccess()) { + jsCallback.execute("success"); + String successInfo = pluginInfo + Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Success"); + FineLoggerFactory.getLogger().info(successInfo); + FineJOptionPane.showMessageDialog(null, successInfo); + } else if (result.errorCode() == PluginErrorCode.NeedUninstallDependingPluginFirst) { + int rv = FineJOptionPane.showConfirmDialog( + null, + Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Dependence"), + Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), + FineJOptionPane.OK_CANCEL_OPTION, + FineJOptionPane.INFORMATION_MESSAGE + ); + if (rv == FineJOptionPane.OK_OPTION) { + PluginManager.getController().uninstall(pluginMarker, true, new UninstallPluginCallback(pluginMarker, jsCallback)); + } + } else { + jsCallback.execute("failed"); + FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Failed")); + FineJOptionPane.showMessageDialog(null, pluginInfo, Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), FineJOptionPane.ERROR_MESSAGE); } - } else { - jsCallback.execute("failed"); - FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Failed")); - FineJOptionPane.showMessageDialog(null, pluginInfo, Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), FineJOptionPane.ERROR_MESSAGE); - } + }); } } diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 8f2783a3ca..670e3ca15f 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -62,7 +62,6 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; -import java.awt.geom.Arc2D; import java.awt.geom.GeneralPath; import java.awt.geom.Line2D; import java.awt.geom.Path2D; @@ -76,6 +75,7 @@ import static javax.swing.JOptionPane.OK_CANCEL_OPTION; import static javax.swing.JOptionPane.OK_OPTION; import static javax.swing.JOptionPane.WARNING_MESSAGE; +// todo: 自己绘制组件 /** * 改个名字,一个拼写 n 个错误 * @@ -146,6 +146,9 @@ public class MultiTemplateTabPane extends JComponent { // 模板时,模板B会自动关闭 private JTemplate temTemplate = null; +// private final Color selectedColor = UIManager.getColor("TabbedPane.hoverColor"); +// private Color hoverColor = UIManager.getColor("TabbedPane.inactiveUnderlineColor"); + public static MultiTemplateTabPane getInstance() { if (THIS == null) { @@ -163,7 +166,7 @@ public class MultiTemplateTabPane extends JComponent { this.addMouseListener(new MultiTemplateTabMouseListener()); this.addMouseMotionListener(new MultiTemplateTabMouseMotionListener()); this.setBorder(null); - this.setForeground(new Color(58, 56, 58)); +// this.setForeground(new Color(58, 56, 58)); this.setFont(DesignUtils.getDefaultGUIFont().applySize(12)); openedTemplate = HistoryTemplateListCache.getInstance().getHistoryList(); selectedIndex = openedTemplate.size() - 1; @@ -527,11 +530,11 @@ public class MultiTemplateTabPane extends JComponent { final int index = i; final JTemplate tem = openedTemplate.get(i); templates[i] = new UIMenuItem(tempalteShowName(tem), tem.getIcon()); - templates[i].setUI(new UIListDownItemUI()); +// templates[i].setUI(new UIListDownItemUI()); setListDownItemPreferredSize(templates[i]); if (i == selectedIndex) { //画选中的高亮 - templates[i].setBackground(UIConstants.SHADOW_CENTER); +// templates[i].setBackground(UIConstants.SHADOW_CENTER); } templates[i].addActionListener(new ActionListener() { @Override @@ -676,7 +679,7 @@ public class MultiTemplateTabPane extends JComponent { private void paintDefaultBackground(Graphics2D g2d) { //画默认背景 - g2d.setPaint(new GradientPaint(1, 1, UIConstants.TEMPLATE_TAB_PANE_BACKGROUND, 1, (float) (getHeight() - 1.0D), UIConstants.TEMPLATE_TAB_PANE_BACKGROUND)); + g2d.setPaint(new GradientPaint(1, 1, getBackground(), 1, (float) (getHeight() - 1.0D), getBackground())); g2d.fillRect(0, 0, getWidth(), getHeight()); } @@ -856,7 +859,7 @@ public class MultiTemplateTabPane extends JComponent { double[] x = {templateStartX, templateStartX, templateStartX + realWidth, templateStartX + realWidth, templateStartX}; double[] y = {1, getHeight() + 1, getHeight() + 1, 1, 1}; RoundRectangle2D.Double rect1 = new RoundRectangle2D.Double(templateStartX, 1, this.getWidth(), this.getHeight(), 7, 7); - g2d.setPaint(new GradientPaint(1, 1, UIConstants.SELECT_TAB, 1, (float) (getHeight() - 1.0D), UIConstants.SELECT_TAB)); + g2d.setPaint(new GradientPaint(1, 1, getBackground(), (float) (getWidth() -1.0d), 1, getBackground())); //选了30度和60度的特殊角度的x,y作为经过的两个点的坐标 double specialLocation1 = 2.5; double specialLocation2 = 4.330127; @@ -874,14 +877,14 @@ public class MultiTemplateTabPane extends JComponent { generalPath.closePath(); g2d.fill(generalPath); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2d.setPaint(new Color(200, 201, 205)); - g2d.draw(new Arc2D.Double(x[0], y[0], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, 90, 0)); - g2d.draw(new Line2D.Double(x[0], y[0] + CORNOR_RADIUS, x[1], y[1])); - g2d.draw(new Line2D.Double(x[1], y[1], x[2], y[2])); - g2d.draw(new Line2D.Double(x[2], y[2], x[3], y[3] + CORNOR_RADIUS)); - g2d.draw(new Arc2D.Double(x[3] - CORNOR_RADIUS * 2, y[3], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, -90, 0)); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); +// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); +// g2d.setPaint(Color.red); +// g2d.draw(new Arc2D.Double(x[0], y[0], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, 90, 0)); +// g2d.draw(new Line2D.Double(x[0], y[0] + CORNOR_RADIUS, x[1], y[1])); +// g2d.draw(new Line2D.Double(x[1], y[1], x[2], y[2])); +// g2d.draw(new Line2D.Double(x[2], y[2], x[3], y[3] + CORNOR_RADIUS)); +// g2d.draw(new Arc2D.Double(x[3] - CORNOR_RADIUS * 2, y[3], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, -90, 0)); +// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); int sheetIconY = (getHeight() - sheeticon.getIconHeight()) / 2; sheeticon.paintIcon(this, g2d, (int) templateStartX + GAP, sheetIconY); // 画字符 @@ -911,9 +914,9 @@ public class MultiTemplateTabPane extends JComponent { double[] x = {templateStartX, templateStartX, templateStartX + realWidth, templateStartX + realWidth, templateStartX}; double[] y = {-1, getHeight() - 1, getHeight() - 1, -1, -1}; if (selfIndex == mouseOveredIndex) { - g2d.setPaint(new GradientPaint(1, 1, UIConstants.HOVER_BLUE, 1, (float) (getHeight() - 1.0D), UIConstants.HOVER_BLUE)); + g2d.setPaint(new GradientPaint(1, 1, getBackground(), 1, (float) (getHeight() - 1.0D), getBackground())); } else { - g2d.setPaint(new GradientPaint(1, 1, UIConstants.SHADOW_GREY, 1, (float) (getHeight() - 1.0D), UIConstants.SHADOW_GREY)); + g2d.setPaint(new GradientPaint(1, 1, getBackground(), 1, (float) (getHeight() - 1.0D), getBackground())); } @@ -1177,7 +1180,7 @@ public class MultiTemplateTabPane extends JComponent { Color oldColor = g.getColor(); int menuWidth = menuItem.getWidth(); int menuHeight = menuItem.getHeight(); - g.setColor(UIConstants.NORMAL_BACKGROUND); + g.setColor(getBackground()); g.fillRect(0, 0, menuWidth, menuHeight); boolean itemIsSelected = menuItem instanceof JMenu && model.isSelected(); if (menuItem.isOpaque()) { diff --git a/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java index 81f82e78c6..256ddccd27 100644 --- a/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java +++ b/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java @@ -13,6 +13,7 @@ import java.awt.event.MouseMotionListener; import java.awt.geom.Line2D; import java.awt.geom.Rectangle2D; +// todo: 自己绘制组件 /** * Author : daisy * Date: 13-8-27 @@ -33,7 +34,6 @@ public abstract class NewTemplatePane extends JComponent implements MouseListene this.addMouseListener(this); this.addMouseMotionListener(this); this.setBorder(null); - this.setForeground(new Color(99, 99, 99)); } public Dimension getPreferredSize() { @@ -46,7 +46,7 @@ public abstract class NewTemplatePane extends JComponent implements MouseListene public void paintComponent(Graphics g) { super.paintComponent(g); g2d = (Graphics2D) g; - g2d.setColor(UIConstants.TEMPLATE_TAB_PANE_BACKGROUND); + g2d.setColor(getBackground()); g2d.fill(new Rectangle2D.Double(0, 0, getWidth(),getHeight())); int sheetIconY = (getHeight() - newWorkBookIconMode.getIconHeight()) / 2; newWorkBookIconMode.paintIcon(this, g2d, ICON_START_X, sheetIconY); diff --git a/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java b/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java index 31cc290324..07e0172373 100644 --- a/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java +++ b/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java @@ -2,12 +2,15 @@ package com.fr.design.foldablepane; import com.fr.base.GraphHelper; import com.fr.design.constants.UIConstants; -import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxUtilities; -import javax.swing.*; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.util.Map; +import javax.swing.JFrame; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; /** * Created by MoMeak on 2017/7/5. @@ -55,26 +58,12 @@ public class HeaderPane extends JPanel { @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - BufferedImage panelImage = createPanelImage(); - g2d.drawImage(panelImage, null, 0, 0); - GraphHelper.drawString(g2d, this.title, TITLE_X, headHeight - fontSize / 2 - 1); - } - - private BufferedImage createPanelImage() { - BufferedImage panelImage = new BufferedImage(getWidth(), headHeight, BufferedImage.TYPE_INT_ARGB); - Graphics2D g2d = panelImage.createGraphics(); - - g2d.setColor(isPressed ? UIConstants.POPUP_TITLE_BACKGROUND : UIConstants.COMPONENT_BACKGROUND_COLOR); +// g2d.setColor(isPressed ? UIConstants.POPUP_TITLE_BACKGROUND : UIConstants.COMPONENT_BACKGROUND_COLOR); headWidth = this.getWidth(); + g2d.setColor(getBackground()); g2d.fillRect(0, 0, headWidth, headHeight); - g2d.setFont(new Font("SimSun", 0, fontSize)); - g2d.setPaint(bgColor); - Map desktopHints = RSyntaxUtilities.getDesktopAntiAliasHints(); - if (desktopHints != null) { - g2d.setRenderingHints(desktopHints); - } +// g2d.setFont(new Font("SimSun", 0, fontSize)); + g2d.setPaint(getForeground()); int leftWdith = headWidth - LEFT_X; if (this.isShow) { image = UIConstants.DRAG_DOWN_SELECTED_SMALL; @@ -83,7 +72,8 @@ public class HeaderPane extends JPanel { image = UIConstants.DRAG_LEFT_NORMAL_SMALL; g2d.drawImage(image, leftWdith, LEFT_Y, null); } - return panelImage; + + GraphHelper.drawString(g2d, this.title, TITLE_X, headHeight - fontSize / 2 - 1); } @Override diff --git a/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java b/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java index c33f3e0fc2..89c73ee226 100644 --- a/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java +++ b/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java @@ -7,27 +7,30 @@ import com.fr.design.gui.borders.UITableHeaderBorder; import com.fr.design.gui.borders.UITableHeaderRolloverBorder; import com.fr.design.gui.borders.UITextFieldBorder; import com.fr.design.gui.frpane.UIBasicOptionPaneUI; -import com.fr.design.gui.ibutton.UIBasicButtonUI; +import com.fr.design.gui.frpane.UITabbedPaneUI; import com.fr.design.gui.ibutton.UIButtonBorder; +import com.fr.design.gui.ibutton.UIButtonUI; import com.fr.design.gui.ibutton.UIRadioButtonMenuItemUI; import com.fr.design.gui.ibutton.UIRadioButtonUI; import com.fr.design.gui.icheckbox.UICheckBoxUI; -import com.fr.design.gui.icombobox.UIBasicComboBoxUI; +import com.fr.design.gui.icombobox.UIComboBoxUI; import com.fr.design.gui.icontainer.UIScrollPaneBorder; import com.fr.design.gui.icontainer.UIScrollPaneUI; import com.fr.design.gui.icontainer.UITableScrollPaneBorder; -import com.fr.design.gui.imenu.UIBasicMenuItemUI; import com.fr.design.gui.imenu.UIBasicMenuUI; +import com.fr.design.gui.imenu.UIMenuBarUI; +import com.fr.design.gui.imenu.UIMenuItemUI; import com.fr.design.gui.imenu.UIPopupMenuBorder; import com.fr.design.gui.imenu.UIPopupMenuSeparatorUI; import com.fr.design.gui.iprogressbar.UIProgressBarBorder; import com.fr.design.gui.iprogressbar.UIProgressBarUI; -import com.fr.design.gui.iscrollbar.UIBasicScrollBarUI; +import com.fr.design.gui.iscrollbar.UIScrollBarUI; import com.fr.design.gui.ispinner.UISpinnerUI; import com.fr.design.gui.isplitpanedivider.UISplitPaneUI; import com.fr.design.gui.itable.UIBasicTableUI; import com.fr.design.gui.itoolbar.UIToolBarBorder; import com.fr.design.gui.itoolbar.UIToolBarSeparatorUI; +import com.fr.design.gui.itoolbar.UIToolBarUI; import com.fr.design.gui.itooltip.UIToolTipBorder; import com.fr.design.gui.itree.UITreeUI; import com.fr.design.i18n.Toolkit; @@ -89,16 +92,20 @@ public class UILookAndFeel extends MetalLookAndFeel { "RadioButtonUI", UIRadioButtonUI.class.getName(), "CheckBoxUI", UICheckBoxUI.class.getName(), "ToolBarSeparatorUI", UIToolBarSeparatorUI.class.getName(), - "ScrollBarUI", UIBasicScrollBarUI.class.getName(), - "ComboBoxUI", UIBasicComboBoxUI.class.getName(), - "ButtonUI", UIBasicButtonUI.class.getName(), - "ToggleButtonUI", UIBasicButtonUI.class.getName(), + "ScrollBarUI", UIScrollBarUI.class.getName(), + "ComboBoxUI", UIComboBoxUI.class.getName(), + "ButtonUI", UIButtonUI.class.getName(), + "ToggleButtonUI", UIButtonUI.class.getName(), "TableUI", UIBasicTableUI.class.getName(), "ProgressBarUI", UIProgressBarUI.class.getName(), "MenuUI", UIBasicMenuUI.class.getName(), - "MenuItemUI", UIBasicMenuItemUI.class.getName(), + "MenuItemUI", UIMenuItemUI.class.getName(), "RadioButtonMenuItemUI", UIRadioButtonMenuItemUI.class.getName(), "OptionPaneUI", UIBasicOptionPaneUI.class.getName(), + "ToolBarUI", UIToolBarUI.class.getName(), + "MenuBarUI", UIMenuBarUI.class.getName(), +// "PopupMenuUI", PopupMenuUI.class.getName(), + "TabbedPaneUI", UITabbedPaneUI.class.getName(), }); } diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java index 12f904922d..c4fb03cfbe 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java @@ -111,14 +111,14 @@ public abstract class UIControlPane extends JControlPane { @Override protected void initToolBar() { super.initToolBar(); - toolBar.setUI(new UIToolBarUI() { - @Override - public void paint(Graphics g, JComponent c) { - Graphics2D g2 = (Graphics2D) g; - g2.setColor(Color.WHITE); - g2.fillRect(0, 0, c.getWidth(), c.getHeight()); - } - }); +// toolBar.setUI(new UIToolBarUI() { +// @Override +// public void paint(Graphics g, JComponent c) { +// Graphics2D g2 = (Graphics2D) g; +// g2.setColor(Color.WHITE); +// g2.fillRect(0, 0, c.getWidth(), c.getHeight()); +// } +// }); } protected JPanel getLeftPane() { diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/LoadingBasicPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/LoadingBasicPane.java index a7776e26be..24e1c79698 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/LoadingBasicPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/LoadingBasicPane.java @@ -11,7 +11,6 @@ import com.fr.design.utils.gui.LayoutUtils; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.SwingConstants; -import javax.swing.SwingWorker; import java.awt.BorderLayout; import java.awt.CardLayout; @@ -25,37 +24,25 @@ public abstract class LoadingBasicPane extends BasicPane { private CardLayout card; private JPanel container; private JProgressBar progressBar; + public LoadingBasicPane() { initCards(); initPane(); } - protected void initPane(){ - new SwingWorker() { - - @Override - protected Integer doInBackground() throws Exception { - initComponents(container); - return 0; - } - - @Override - protected void done() { - complete(); - LayoutUtils.layoutRootContainer(LoadingBasicPane.this); - card.show(LoadingBasicPane.this, "CONTAINER"); - } - - }.execute(); + protected void initPane() { + initComponents(container); + complete(); + LayoutUtils.layoutRootContainer(LoadingBasicPane.this); + card.show(LoadingBasicPane.this, "CONTAINER"); } - private void initCards() { card = new CardLayout(); setLayout(card); JPanel loadingDisPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - UILabel loadingPane = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Loading_And_Waiting") , SwingConstants.CENTER); + UILabel loadingPane = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Loading_And_Waiting"), SwingConstants.CENTER); loadingDisPane.add(loadingPane, BorderLayout.CENTER); progressBar = new JProgressBar(); progressBar.setIndeterminate(true); @@ -69,7 +56,7 @@ public abstract class LoadingBasicPane extends BasicPane { } - protected void renameConnection(String oldName,String newName){ + protected void renameConnection(String oldName, String newName) { } @@ -79,6 +66,7 @@ public abstract class LoadingBasicPane extends BasicPane { /** * 为了alphafine搜索使用,预加载面板控件,获取全部控件的信息 + * * @return */ public JPanel getAllComponents() { diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPane.java index 27cff9c5e3..1211c76372 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPane.java @@ -3,10 +3,11 @@ package com.fr.design.gui.frpane; import com.fr.design.dialog.FineJOptionPane; import com.fr.general.ComparatorUtils; - -import javax.swing.*; -import javax.swing.plaf.TabbedPaneUI; -import java.awt.*; +import javax.swing.JOptionPane; +import javax.swing.JTabbedPane; +import javax.swing.SwingUtilities; +import java.awt.Color; +import java.awt.Component; /** * Created by IntelliJ IDEA. @@ -105,21 +106,21 @@ public class UITabbedPane extends JTabbedPane{ repaint(); } - @Override - /** - * 获取UI对象 - */ - public TabbedPaneUI getUI(){ - return new UITabbedPaneUI(); - } - - @Override - /** - * 更新UI - */ - public void updateUI() { - setUI(getUI()); - } +// @Override +// /** +// * 获取UI对象 +// */ +// public TabbedPaneUI getUI(){ +// return new UITabbedPaneUI(); +// } +// +// @Override +// /** +// * 更新UI +// */ +// public void updateUI() { +// setUI(getUI()); +// } /** * 删除tab,不能直接复写removeTabAt diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPaneUI.java b/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPaneUI.java index d31107c2ce..edbcd25c88 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPaneUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPaneUI.java @@ -313,7 +313,7 @@ public class UITabbedPaneUI extends BasicTabbedPaneUI { h -= (y - insets.top); } drawUIContentBorder(g, x, y, w, h); - if (((UITabbedPane) tabPane).isClosable()) { + if (tabPane instanceof UITabbedPane && ((UITabbedPane) tabPane).isClosable()) { drawUITabAddBtn(g, tabPlacement, x, y, w, h); } super.paint(g, c); diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java index e5f2c03ff8..f42266dc1f 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java @@ -1,8 +1,9 @@ package com.fr.design.gui.ibutton; +import com.fanruan.gui.UiInspector; +import com.fine.theme.light.ui.laf.FineLightLaf; import com.fr.base.BaseUtils; import com.fr.base.CellBorderStyle; -import com.fr.base.GraphHelper; import com.fr.base.svg.IconUtils; import com.fr.design.constants.UIConstants; import com.fr.design.event.UIObserver; @@ -18,7 +19,8 @@ import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.ToolTipManager; -import javax.swing.plaf.ButtonUI; +import javax.swing.UIManager; +import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; @@ -174,29 +176,17 @@ public class UIButton extends JButton implements UIObserver, UITextComponent { ToolTipManager.sharedInstance().setInitialDelay(TOOLTIP_INIT_DELAY); } - @Override - public ButtonUI getUI() { - return new UIButtonUI(); - } - - /** - * 更新界面 - */ - public void updateUI() { - setUI(getUI()); - } - public CellBorderStyle getBorderStyle() { return this.border; } - @Override - public Insets getInsets() { - if (getIcon() != null) { - return new Insets(0, 3, 0, 3); - } - return new Insets(0, 10, 0, 10); - } +// @Override +// public Insets getInsets() { +// if (getIcon() != null) { +// return new Insets(0, 3, 0, 3); +// } +// return new Insets(0, 10, 0, 10); +// } //@Override public Dimension getPreferredSize() { @@ -217,7 +207,6 @@ public class UIButton extends JButton implements UIObserver, UITextComponent { borderColor = c; } - @Override protected void paintBorder(Graphics g) { @@ -243,25 +232,6 @@ public class UIButton extends JButton implements UIObserver, UITextComponent { @Override public void paintComponent(Graphics g) { super.paintComponent(g); - Dimension size = this.getSize(); - Graphics2D g2d = (Graphics2D) g; - Stroke oldStroke = g2d.getStroke(); - if (border != null) { - g2d.setColor(border.getTopColor()); - GraphHelper.drawLine(g2d, 3, 4, size.getWidth() - 4, 4, border.getTopStyle()); - g2d.setColor(border.getLeftColor()); - GraphHelper.drawLine(g2d, 3, 4, 3, size.getHeight() - 4, border.getLeftStyle()); - g2d.setColor(border.getBottomColor()); - GraphHelper.drawLine(g2d, 3, size.getHeight() - 4, size.getWidth() - 4, size.getHeight() - 4, border.getBottomStyle()); - g2d.setColor(border.getRightColor()); - GraphHelper.drawLine(g2d, size.getWidth() - 4, 4, size.getWidth() - 4, size.getHeight() - 4, border.getRightStyle()); - } else { - GraphHelper.drawLine(g2d, 2, 4, size.getWidth() - 4, 4, Constants.LINE_NONE); - GraphHelper.drawLine(g2d, 2, 4, 2, size.getHeight() - 4, Constants.LINE_NONE); - GraphHelper.drawLine(g2d, 2, size.getHeight() - 4, size.getWidth() - 4, size.getHeight() - 4, Constants.LINE_NONE); - GraphHelper.drawLine(g2d, size.getWidth() - 4, 4, size.getWidth() - 4, size.getHeight() - 4, Constants.LINE_NONE); - } - g2d.setStroke(oldStroke); } @@ -371,20 +341,32 @@ public class UIButton extends JButton implements UIObserver, UITextComponent { * @param args 入口参数 */ public static void main(String... args) { + try { + UIManager.setLookAndFeel( new FineLightLaf() ); + } catch( Exception ex ) { + System.err.println( "Failed to initialize LaF" ); + } JFrame jf = new JFrame("test"); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel content = (JPanel) jf.getContentPane(); - content.setLayout(null); +// content.setLayout(new BorderLayout()); UIButton bb = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); - bb.setEnabled(false); - bb.setBorderType(OTHER_BORDER); + bb.setEnabled(true); // bb.setBounds(20, 20,content.getSize().width, bb.getPreferredSize().height); - bb.setPreferredSize(new Dimension(100, 30)); +// bb.setPreferredSize(new Dimension(100, 30)); bb.setBounds(0, 0, bb.getPreferredSize().width, bb.getPreferredSize().height); - content.add(bb); + bb.setMargin(new Insets(10,10,10,10)); + UIButton cc = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); + cc.setEnabled(true); +// cc.setPreferredSize(new Dimension(100, 30)); + cc.setBounds(0, 0, cc.getPreferredSize().width, cc.getPreferredSize().height); + cc.setMargin(new Insets(20,20,20,20)); + content.add(bb, BorderLayout.SOUTH); + content.add(cc,BorderLayout.NORTH); GUICoreUtils.centerWindow(jf); jf.setSize(400, 400); + new UiInspector(); jf.setVisible(true); } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java index bd2e8b2afb..822aee00da 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java @@ -8,15 +8,21 @@ import com.fr.design.event.UIObserverListener; import com.fr.design.utils.gui.UIComponentUtils; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; -import sun.swing.SwingUtilities2; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.Icon; +import javax.swing.JPanel; import javax.swing.border.Border; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import javax.swing.plaf.basic.BasicHTML; -import javax.swing.text.View; -import java.awt.*; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.LayoutManager; +import java.awt.RenderingHints; +import java.awt.Shape; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -195,24 +201,24 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver, UIOb } }; - labelButton.setUI(new UIButtonUI() { - protected void paintText(Graphics g, AbstractButton b, String text, Rectangle textRec) { - View v = (View) b.getClientProperty(BasicHTML.propertyKey); - if (v != null) { - v.paint(g, textRec); - return; - } - FontMetrics fm = SwingUtilities2.getFontMetrics(b, g); - int mnemonicIndex = b.getDisplayedMnemonicIndex(); - if (isPressed(b)) { - g.setColor(Color.white); - } else { - g.setColor(b.isEnabled() ? Color.black : UIConstants.LINE_COLOR); - } - - SwingUtilities2.drawStringUnderlineCharAt(b, g, text, mnemonicIndex, textRec.x + getTextShiftOffset(), textRec.y + fm.getAscent() + getTextShiftOffset()); - } - }); +// labelButton.setUI(new UIButtonUI() { +// protected void paintText(Graphics g, AbstractButton b, String text, Rectangle textRec) { +// View v = (View) b.getClientProperty(BasicHTML.propertyKey); +// if (v != null) { +// v.paint(g, textRec); +// return; +// } +// FontMetrics fm = SwingUtilities2.getFontMetrics(b, g); +// int mnemonicIndex = b.getDisplayedMnemonicIndex(); +// if (isPressed(b)) { +// g.setColor(Color.white); +// } else { +// g.setColor(b.isEnabled() ? Color.black : UIConstants.LINE_COLOR); +// } +// +// SwingUtilities2.drawStringUnderlineCharAt(b, g, text, mnemonicIndex, textRec.x + getTextShiftOffset(), textRec.y + fm.getAscent() + getTextShiftOffset()); +// } +// }); initButton(labelButton); } } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonUI.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonUI.java index 851ac8b513..3516acdd6d 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonUI.java @@ -1,16 +1,32 @@ package com.fr.design.gui.ibutton; +import com.fr.base.CellBorderStyle; +import com.fr.base.GraphHelper; import com.fr.design.constants.UIConstants; import com.fr.design.roleAuthority.ReportAndFSManagePane; import com.fr.design.utils.gui.GUIPaintUtils; +import com.fr.stable.Constants; import com.fr.stable.StringUtils; import sun.swing.SwingUtilities2; -import javax.swing.*; +import javax.swing.AbstractButton; +import javax.swing.ButtonModel; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.SwingUtilities; import javax.swing.plaf.basic.BasicButtonUI; import javax.swing.plaf.basic.BasicHTML; import javax.swing.text.View; -import java.awt.*; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.Stroke; + public class UIButtonUI extends BasicButtonUI { @@ -36,6 +52,26 @@ public class UIButtonUI extends BasicButtonUI { ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); paintContent(g, b, text); + + Dimension size = b.getSize(); + Stroke oldStroke = g2d.getStroke(); + CellBorderStyle border = b.getBorderStyle(); + if (border != null) { + g2d.setColor(border.getTopColor()); + GraphHelper.drawLine(g2d, 3, 4, size.getWidth() - 4, 4, border.getTopStyle()); + g2d.setColor(border.getLeftColor()); + GraphHelper.drawLine(g2d, 3, 4, 3, size.getHeight() - 4, border.getLeftStyle()); + g2d.setColor(border.getBottomColor()); + GraphHelper.drawLine(g2d, 3, size.getHeight() - 4, size.getWidth() - 4, size.getHeight() - 4, border.getBottomStyle()); + g2d.setColor(border.getRightColor()); + GraphHelper.drawLine(g2d, size.getWidth() - 4, 4, size.getWidth() - 4, size.getHeight() - 4, border.getRightStyle()); + } else { + GraphHelper.drawLine(g2d, 2, 4, size.getWidth() - 4, 4, Constants.LINE_NONE); + GraphHelper.drawLine(g2d, 2, 4, 2, size.getHeight() - 4, Constants.LINE_NONE); + GraphHelper.drawLine(g2d, 2, size.getHeight() - 4, size.getWidth() - 4, size.getHeight() - 4, Constants.LINE_NONE); + GraphHelper.drawLine(g2d, size.getWidth() - 4, 4, size.getWidth() - 4, size.getHeight() - 4, Constants.LINE_NONE); + } + g2d.setStroke(oldStroke); } protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) { @@ -46,6 +82,16 @@ public class UIButtonUI extends BasicButtonUI { } else if (b.isNormalPainted()) { GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted()); } + + if (isPressed(b) && b.isPressedPainted()) { + Color pressColor = b.isPressedPainted() ? UIConstants.TAB_BUTTON_PRESS_SELECTED : UIConstants.TAB_BUTTON_PRESS; + GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), pressColor); + } else if (isRollOver(b)) { + Color hoverColor = b.isPressedPainted() ? UIConstants.TAB_BUTTON_HOVER_SELECTED : UIConstants.TAB_BUTTON_HOVER; + GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), hoverColor); + } else if (b.isNormalPainted()) { + GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted()); + } } protected boolean isRollOver(AbstractButton b) { diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHead.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHead.java index 0a41aae172..e1f91b15a7 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHead.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHead.java @@ -8,36 +8,32 @@ public class UIHead { private String text = StringUtils.EMPTY; private Icon icon = null; private boolean enable = true; - private int index = 0; - public UIHead(String text, int index) { + public UIHead(String text) { this.text = text; - this.index = index; } - public UIHead(String text, int index, boolean enable) { - this(text, index); + public UIHead(String text, boolean enable) { + this(text); this.enable = enable; } - public UIHead(Icon icon, int index) { + public UIHead(Icon icon) { this.icon = icon; - this.index = index; } public UIHead(Icon icon, int index, boolean enable) { - this(icon, index); + this(icon); this.enable = enable; } - public UIHead(String text, Icon icon, int index) { + public UIHead(String text, Icon icon) { this.text = text; this.icon = icon; - this.index = index; } - public UIHead(String text, Icon icon, int index, boolean enable) { - this(text, icon, index); + public UIHead(String text, Icon icon, boolean enable) { + this(text, icon); this.enable = enable; } @@ -57,7 +53,4 @@ public class UIHead { return enable; } - public int getIndex() { - return index; - } } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java index 0cfe7c3903..8d92c8e5f2 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java @@ -1,155 +1,201 @@ package com.fr.design.gui.ibutton; -import com.fr.base.BaseUtils; -import com.fr.design.constants.UIConstants; -import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.design.utils.gui.UIComponentUtils; - +import com.fine.swing.ui.layout.Layouts; +import com.fine.swing.ui.layout.Row; +import com.fine.theme.light.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.third.guava.collect.Streams; + +import javax.swing.AbstractButton; +import javax.swing.ButtonGroup; import javax.swing.Icon; -import javax.swing.JFrame; -import javax.swing.JPanel; +import javax.swing.JComponent; +import javax.swing.JToggleButton; +import javax.swing.event.ChangeListener; +import javax.swing.plaf.ComponentUI; import java.awt.Color; import java.awt.Dimension; -import java.awt.GridLayout; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; +import java.awt.Graphics; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; -// fanglei:不是原作者,只是优化如下问题:代码冗余,无法拓展(例如我想加个enable属性没法加),甚至还有数组越界的问题。 -public class UIHeadGroup extends JPanel { - private static final int MIN_HEIGHT = 25; - private List uiHeads = new ArrayList<>(); - protected List labelButtonList; - private boolean isNeedLeftRightOutLine = true; - protected int selectedIndex = -1; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; +import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE_TAB; + +/** + * 面板头部 tab 按钮组 + * + * @author vito + * @since 11.0 + * Created on 2023/10/31 + */ +public class UIHeadGroup extends Row { - protected void tabChanged(int newSelectedIndex) { - // do nothing - } + + private UIHeadGroupSingleSelectionModel model; + + private List btns; + + private final ButtonGroup buttonGroup = new ButtonGroup(); public UIHeadGroup(String[] textArray) { - for (int i = 0; i < textArray.length; i++) { - uiHeads.add(new UIHead(textArray[i], i)); - } - initUIHeadGroup(uiHeads); + setModel(new UIHeadGroupSingleSelectionModel( + Arrays.stream(textArray).map(UIHead::new).collect(Collectors.toList()))); + intiContent(); } public UIHeadGroup(Icon[] iconArray) { - for (int i = 0; i < iconArray.length; i++) { - uiHeads.add(new UIHead(iconArray[i], i)); - } - initUIHeadGroup(uiHeads); + setModel(new UIHeadGroupSingleSelectionModel( + Arrays.stream(iconArray).map(UIHead::new).collect(Collectors.toList()))); + intiContent(); } - public UIHeadGroup(Icon[] iconArray, String[] textArray) { - int length = Math.min(textArray.length, iconArray.length); - for (int i = 0; i < length; i++) { - uiHeads.add(new UIHead(textArray[i], iconArray[i], i)); - } - initUIHeadGroup(uiHeads); + public UIHeadGroup(List heads) { + setModel(new UIHeadGroupSingleSelectionModel(heads)); + intiContent(); } - public UIHeadGroup(List uiHeads) { - initUIHeadGroup(uiHeads); + private void intiContent() { + setSpacing(4); + setOpaque(false); + add(buttonGroup()); + setUI(new UIHeadGroupUI()); + setSelectedIndex(0); + setBorder(new ScaledEmptyBorder(2, 2, 2, 2)); } - public void initUIHeadGroup(List uiHeads) { - if (uiHeads != null) { - labelButtonList = new ArrayList(uiHeads.size()); - this.setLayout(new GridLayout(0, uiHeads.size(), 1, 0)); - - for (UIHead head : uiHeads) { - if (head.isOnlyText()) { - this.setBackground(UIConstants.TREE_BACKGROUND); - } else { - this.setBackground(UIConstants.NORMAL_BACKGROUND); - } - initButton(createUIToggleButton(head)); - } - setSelectedIndex(0); - } + private Layouts.Cell[] buttonGroup() { + btns = new ArrayList<>(getModel().getDataList().size()); + return Streams.mapWithIndex(getModel().getDataList().stream(), + (h, index) -> cell(new JToggleButton(h.getText(), h.getIcon())) + .weight(1.0) + .with(b -> { + btns.add(b); + buttonGroup.add(b); + b.setEnabled(h.isEnable()); + b.putClientProperty(BUTTON_TYPE, BUTTON_TYPE_TAB); + b.addActionListener(e -> setSelectedIndex((int) index)); + }) + + ).toArray(Layouts.Cell[]::new); } - @Override - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - if (dim.height < MIN_HEIGHT) { - dim.height = MIN_HEIGHT; + /** + * tabChanged 时调用 + * + * @param newSelectedIndex + * @see #addChangeListener(ChangeListener) + * @deprecated 这种方式会导致使用的时候都要创建一个匿名类, 使用监听代替{@link #addChangeListener(ChangeListener)} + */ + @Deprecated + protected void tabChanged(int newSelectedIndex) { + // do nothing + } + + private static class UIHeadGroupUI extends ComponentUI { + + @Styleable(dot = true) + protected Color background; + + @Styleable(dot = true) + protected int arc; + + @SuppressWarnings({"MethodOverridesStaticMethodOfSuperclass", "UnusedDeclaration"}) + public static ComponentUI createUI(JComponent c) { + return new UIHeadGroupUI(); + } + + @Override + public void installUI(JComponent c) { + super.installUI(c); + background = FineUIUtils.getUIColor("HeadGroup.background", "desktop"); + arc = FineUIUtils.getUIInt("HeadGroup.arc", "Component.arc"); + } + + @Override + public void uninstallUI(JComponent c) { + super.uninstallUI(c); + } + + @Override + public Dimension getMinimumSize(JComponent component) { + return new Dimension(0, 0); + } + + @Override + public Dimension getMaximumSize(JComponent component) { + return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); + } + + @Override + public void update(Graphics g, JComponent c) { + paintBackground(g, c); + paint(g, c); + } + + protected void paintBackground(Graphics g, JComponent c) { + FlatUIUtils.setRenderingHints(g); + g.setColor(background); + g.fillRoundRect(0, 0, c.getWidth(), c.getHeight(), arc, arc); } - return dim; } - private void initButton(UIToggleButton labelButton) { - labelButton.setRoundBorder(false); - labelButton.setBorderPainted(false); - labelButton.setPressedPainted(false); - UIComponentUtils.setLineWrap(labelButton); - labelButtonList.add(labelButton); - this.add(labelButton); + private UIHeadGroupSingleSelectionModel getModel() { + return model; } - public void setSelectedIndex(int newSelectedIndex) { - selectedIndex = newSelectedIndex; - for (int i = 0; i < labelButtonList.size(); i++) { - UIToggleButton button = labelButtonList.get(i); - if (i == selectedIndex) { - button.setNormalPainted(false); - button.setBackground(new Color(240, 240, 243)); - button.setOpaque(true); - button.setSelected(true); - } else { - button.setOpaque(false); - button.setNormalPainted(true); - button.setSelected(false); - } - } + public void setModel(UIHeadGroupSingleSelectionModel model) { + this.model = model; + } - tabChanged(newSelectedIndex); + /** + * 添加一个监听,在tab切换时触发 + * + * @param l 监听 + */ + public void addChangeListener(ChangeListener l) { + getModel().addChangeListener(l); } - public void setNeedLeftRightOutLine(boolean isNeedLeftRightOutLine) { - this.isNeedLeftRightOutLine = isNeedLeftRightOutLine; + /** + * 移除一个监听 + * + * @param l 监听 + */ + public void removeChangeListener(ChangeListener l) { + getModel().removeChangeListener(l); } - public int getSelectedIndex() { - return selectedIndex; + /** + * 设置索引用于选中某个tab + * + * @param index 面板索引 + */ + public void setSelectedIndex(int index) { + if (!checkRange(index)) { + return; + } + buttonGroup.setSelected(btns.get(index).getModel(), true); + getModel().setSelectedIndex(index); + tabChanged(index); } - public UIToggleButton createUIToggleButton(final UIHead head) { - UIToggleButton uiToggleButton = new UIToggleButton(head.getText(), head.getIcon()) { - @Override - protected MouseListener getMouseListener() { - return new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - if (head.isEnable()) { - setSelectedIndex(head.getIndex()); - UIHeadGroup.this.repaint(); - } - } - }; - } - }; - - uiToggleButton.setEnabled(head.isEnable()); - return uiToggleButton; + /** + * 获取选中tab的索引 + * + * @return 选中tab的索引 + */ + public int getSelectedIndex() { + return getModel().getSelectedIndex(); } - public static void main(String... args) { - JFrame jf = new JFrame("test"); - jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JPanel content = (JPanel) jf.getContentPane(); - content.setLayout(null); - Icon[] a1 = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"), - BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png")}; - UIHeadGroup bb = new UIHeadGroup(a1); - bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); - bb.setSelectedIndex(0); - content.add(bb); - GUICoreUtils.centerWindow(jf); - jf.setSize(400, 400); - jf.setVisible(true); + private boolean checkRange(int newSelectedIndex) { + return newSelectedIndex > -1 && newSelectedIndex < btns.size(); } -} \ No newline at end of file + +} diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroupSingleSelectionModel.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroupSingleSelectionModel.java new file mode 100644 index 0000000000..aacb6ec1fa --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroupSingleSelectionModel.java @@ -0,0 +1,31 @@ +package com.fr.design.gui.ibutton; + +import javax.swing.DefaultSingleSelectionModel; +import java.util.List; + +/** + * 头部按钮组单选模型 + * + * @author vito + * @since 11.0 + * Created on 2023/11/2 + */ +public class UIHeadGroupSingleSelectionModel extends DefaultSingleSelectionModel { + + private final List dataList; + + UIHeadGroupSingleSelectionModel(List dataList) { + this.dataList = dataList; + } + + public UIHeadGroupSingleSelectionModel set(int index, UIHead head) { + dataList.add(index, head); + return this; + } + + + public List getDataList() { + return dataList; + } + +} diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBox.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBox.java index e6130ca3da..e7f6578dc9 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBox.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBox.java @@ -67,7 +67,7 @@ public class UIComboBox extends JComboBox implements UIObserver, GlobalNameObser private void init() { setOpaque(false); - setUI(getUIComboBoxUI()); +// setUI(getUIComboBoxUI()); setRenderer(new UIComboBoxRenderer()); setEditor(new UIComboBoxEditor()); initListener(); @@ -161,13 +161,13 @@ public class UIComboBox extends JComboBox implements UIObserver, GlobalNameObser } - /** - * - */ - @Override - public void updateUI() { - setUI(getUIComboBoxUI()); - } +// /** +// * +// */ +// @Override +// public void updateUI() { +// setUI(getUIComboBoxUI()); +// } /** diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java index cec4b840a7..6c35310fa4 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java @@ -12,7 +12,6 @@ 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.Container; import java.awt.Cursor; @@ -36,7 +35,7 @@ public class UIEastResizableContainer extends JPanel { private int containerWidth = 240; private int preferredWidth = 240; private int topToolPaneHeight = 25; - private int leftPaneWidth = 40; + private int leftPaneWidth = 42; private JComponent leftPane; private JComponent rightPane; @@ -78,12 +77,12 @@ public class UIEastResizableContainer extends JPanel { } public UIEastResizableContainer(JComponent leftPane, JComponent rightPane) { - setBackground(UIConstants.PROPERTY_PANE_BACKGROUND); +// setBackground(UIConstants.PROPERTY_PANE_BACKGROUND); this.leftPane = leftPane; this.rightPane = rightPane; this.topToolPane = new TopToolPane(); - topToolPane.setBackground(UIConstants.PROPERTY_PANE_BACKGROUND); +// topToolPane.setBackground(UIConstants.PROPERTY_PANE_BACKGROUND); setLayout(containerLayout); add(topToolPane); @@ -98,9 +97,9 @@ public class UIEastResizableContainer extends JPanel { content.setLayout(new BorderLayout()); JPanel leftPane = new JPanel(); - leftPane.setBackground(Color.yellow); +// leftPane.setBackground(Color.yellow); JPanel rightPane = new JPanel(); - rightPane.setBackground(Color.green); +// rightPane.setBackground(Color.green); UIButton b1, b2; b1 = new UIButton("b1"); @@ -114,7 +113,7 @@ public class UIEastResizableContainer extends JPanel { UIEastResizableContainer bb = new UIEastResizableContainer(leftPane, rightPane); JPanel cc = new JPanel(); - cc.setBackground(Color.WHITE); +// cc.setBackground(Color.WHITE); content.add(bb, BorderLayout.EAST); content.add(cc, BorderLayout.CENTER); diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIModeControlContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIModeControlContainer.java index 627baf6b92..e09f877d3c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIModeControlContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIModeControlContainer.java @@ -67,6 +67,7 @@ public class UIModeControlContainer extends JLayeredPane { add(upPane); add(horizontToolPane); } +// setLayout(new VerticalFlowLayout(CENTER, 10, 10)); add(downPane); add(coverPane = new CoverPane()); add(hidePane = new HidePane()); diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java index a7682107ec..535ba582ab 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java @@ -10,6 +10,7 @@ import com.fr.stable.Constants; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; +import javax.swing.UIManager; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; @@ -89,7 +90,6 @@ public class UIResizableContainer extends JPanel { } public UIResizableContainer(JComponent upPane, JComponent downPane, int direction) { - setBackground(UIConstants.NORMAL_BACKGROUND); this.upPane = upPane; this.direction = direction; @@ -106,7 +106,6 @@ public class UIResizableContainer extends JPanel { } public UIResizableContainer(JComponent upPane, int direction) { - setBackground(UIConstants.NORMAL_BACKGROUND); this.upPane = upPane; this.direction = direction; @@ -420,7 +419,8 @@ public class UIResizableContainer extends JPanel { Image upButton = (upModel == UIConstants.MODEL_NORMAL ? UIConstants.DRAG_UP_NORMAL : UIConstants.DRAG_UP_PRESS); Image downButton = (downModel == UIConstants.MODEL_NORMAL ? UIConstants.DRAG_DOWN_NORMAL : UIConstants.DRAG_DOWN_PRESS); - g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, getWidth(), getHeight(), null); + g.setColor(UIManager.getColor("SplitPane.background")); + g.fillRect(0, 0, getWidth(), getHeight()); SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, UIConstants.DRAG_LINE, (getWidth() - toolPaneHeight) / 2, 3, null)); SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, upButton, ARROW_MARGIN, 0, null)); SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, downButton, (getWidth() - toolPaneHeight - ARROW_MARGIN), 0, null)); @@ -505,8 +505,10 @@ public class UIResizableContainer extends JPanel { @Override public void paint(Graphics g) { Image button; + g.setColor(UIManager.getColor("SplitPane.background")); + g.fillRect(0, 0, toolPaneHeight, getHeight()); if (direction == Constants.RIGHT) { - g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, toolPaneHeight, getHeight(), null); +// g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, toolPaneHeight, getHeight(), null); if (containerWidth == toolPaneHeight) { if (model == UIConstants.MODEL_NORMAL) { button = UIConstants.DRAG_RIGHT_NORMAL; @@ -522,7 +524,7 @@ public class UIResizableContainer extends JPanel { } SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, button, -6, ARROW_MARGIN_VERTICAL, VerticalToolPane.this)); } else { - g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, toolPaneHeight, getHeight(), null); +// g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, toolPaneHeight, getHeight(), null); if (containerWidth == toolPaneHeight) { if (model == UIConstants.MODEL_NORMAL) { button = UIConstants.DRAG_LEFT_NORMAL; diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIScrollPane.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIScrollPane.java index 55ba64b0e9..7bb13af2d6 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIScrollPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIScrollPane.java @@ -1,12 +1,10 @@ package com.fr.design.gui.icontainer; -import com.fr.design.constants.UIConstants; import com.fr.design.gui.iscrollbar.UIScrollBar; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.ScrollPaneConstants; -import java.awt.Color; import java.awt.Component; /** @@ -27,10 +25,10 @@ public class UIScrollPane extends JScrollPane { this.setHorizontalScrollBar(createHorizontalScrollBar()); this.getVerticalScrollBar().setUnitIncrement(INCREAMENT); this.getVerticalScrollBar().setBlockIncrement(INCREAMENT); - this.getHorizontalScrollBar().setOpaque(true); - this.getHorizontalScrollBar().setBackground(Color.WHITE); - this.getVerticalScrollBar().setOpaque(true); - this.getVerticalScrollBar().setBackground(Color.WHITE); +// this.getHorizontalScrollBar().setOpaque(true); +// this.getHorizontalScrollBar().setBackground(Color.WHITE); +// this.getVerticalScrollBar().setOpaque(true); +// this.getVerticalScrollBar().setBackground(Color.WHITE); } @Override @@ -39,7 +37,7 @@ public class UIScrollPane extends JScrollPane { */ public UIScrollBar createHorizontalScrollBar() { UIScrollBar sbr = new UIScrollBar(JScrollBar.HORIZONTAL); - sbr.setBackground(UIConstants.NORMAL_BACKGROUND); +// sbr.setBackground(UIConstants.NORMAL_BACKGROUND); return sbr; } @@ -49,7 +47,7 @@ public class UIScrollPane extends JScrollPane { */ public UIScrollBar createVerticalScrollBar() { UIScrollBar sbr = new UIScrollBar(JScrollBar.VERTICAL); - sbr.setBackground(UIConstants.NORMAL_BACKGROUND); +// sbr.setBackground(UIConstants.NORMAL_BACKGROUND); return sbr; } diff --git a/designer-base/src/main/java/com/fr/design/gui/ilist/TableViewList.java b/designer-base/src/main/java/com/fr/design/gui/ilist/TableViewList.java index ba29288fc8..8862493242 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ilist/TableViewList.java +++ b/designer-base/src/main/java/com/fr/design/gui/ilist/TableViewList.java @@ -53,7 +53,7 @@ public class TableViewList extends UIList { public TableViewList() { super(); - this.setBackground(UIConstants.NORMAL_BACKGROUND); +// this.setBackground(UIConstants.NORMAL_BACKGROUND); this.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); this.setCellRenderer(new TableListCellRenderer()); new TableProcessorTreeDragSource(this, DnDConstants.ACTION_COPY); diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIHeadMenu.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIHeadMenu.java index e196f90a5f..60058264af 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIHeadMenu.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIHeadMenu.java @@ -1,20 +1,12 @@ package com.fr.design.gui.imenu; -import com.fr.design.constants.UIConstants; -import com.fr.design.utils.gui.GUIPaintUtils; - import javax.swing.Action; import javax.swing.JButton; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.MenuElement; -import javax.swing.border.Border; +import javax.swing.border.EmptyBorder; import java.awt.Component; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Insets; -import java.awt.RenderingHints; -import java.awt.Shape; /** * @author null @@ -25,54 +17,43 @@ public class UIHeadMenu extends UIMenu { public UIHeadMenu(String name) { super(name); + setBorder(new EmptyBorder(5,14,5,14)); } @Override public JPopupMenu getPopupMenu() { ensurePopupMenuCreated(); - popupMenu.setBackground(UIConstants.NORMAL_BACKGROUND); - popupMenu.setBorder(new Border() { - - @Override - public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { - Graphics2D g2d = (Graphics2D) g; - int rec = (int) REC; - GUIPaintUtils.paintShapeBorder(g2d, x, y, width, height, rec); - if (!(UIHeadMenu.this.getParent() instanceof JPopupMenu)) { - g.setColor(UIConstants.NORMAL_BACKGROUND); - g.drawLine(1, 0, UIHeadMenu.this.getWidth() - 2, 0); - } - } - - @Override - public boolean isBorderOpaque() { - return false; - } - - @Override - public Insets getBorderInsets(Component c) { - return new Insets(5, 2, 10, 10); - } - }); +// popupMenu.setBackground(UIConstants.NORMAL_BACKGROUND); +// popupMenu.setBorder(new Border() { +// +// @Override +// public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { +// Graphics2D g2d = (Graphics2D) g; +// int rec = (int) REC; +// GUIPaintUtils.paintShapeBorder(g2d, x, y, width, height, rec); +// if (!(UIHeadMenu.this.getParent() instanceof JPopupMenu)) { +// g.setColor(UIConstants.NORMAL_BACKGROUND); +// g.drawLine(1, 0, UIHeadMenu.this.getWidth() - 2, 0); +// } +// } +// +// @Override +// public boolean isBorderOpaque() { +// return false; +// } +// +// @Override +// public Insets getBorderInsets(Component c) { +// return new Insets(5, 2, 10, 10); +// } +// }); return popupMenu; } @Override protected void ensurePopupMenuCreated() { if (popupMenu == null) { - this.popupMenu = new JPopupMenu() { - @Override - protected void paintComponent(Graphics g) { - Graphics2D g2d = (Graphics2D) g; - float width = getWidth(); - float height = getHeight(); - - Shape shape = GUIPaintUtils.paintShape(g2d, width, height, REC); - g2d.setClip(shape); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - super.paintComponent(g2d); - } - }; + this.popupMenu = new JPopupMenu(); popupMenu.setInvoker(this); popupListener = createWinListener(popupMenu); } diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UILockMenuItemUI.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UILockMenuItemUI.java index c0f70795bb..7601b70ad1 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UILockMenuItemUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UILockMenuItemUI.java @@ -18,11 +18,11 @@ public class UILockMenuItemUI extends UIMenuItemUI{ super.paintText(g, menuItem, textRect, text); // 除了绘制text之外,还需要画一下锁定图标 UILockMenuItem lockMenuItem = (UILockMenuItem) menuItem; - if (EditLockUtils.isLocked(lockMenuItem.getLockItem())) { +// if (EditLockUtils.isLocked(lockMenuItem.getLockItem())) { int width = menuItem.getWidth(); int height = menuItem.getHeight(); g.drawImage(EditLockUtils.LOCKED_IMAGE, (int) Math.round(width * 0.9), (int) Math.round(height * 0.1), 16, 16, null); - } +// } } } diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenu.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenu.java index 98f60619b9..ec78046709 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenu.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenu.java @@ -1,106 +1,95 @@ package com.fr.design.gui.imenu; -import com.fr.design.constants.UIConstants; -import com.fr.stable.StringUtils; - import javax.swing.Action; import javax.swing.JButton; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.MenuElement; -import javax.swing.border.Border; import java.awt.Component; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Insets; -import java.awt.RenderingHints; -import java.awt.Shape; -import java.awt.geom.RoundRectangle2D; /** * @author null */ public class UIMenu extends JMenu { - private static final float REC = 8f; private JPopupMenu popupMenu; public UIMenu(String name) { super(name); setName(name); setRolloverEnabled(true); - setBackground(UIConstants.NORMAL_BACKGROUND); +// setBackground(UIConstants.NORMAL_BACKGROUND); } - @Override - public String getText() { - if (this.getParent() instanceof JPopupMenu) { - return StringUtils.BLANK + super.getText(); - } - return " " + super.getText(); - } +// @Override +// public String getText() { +// if (this.getParent() instanceof JPopupMenu) { +// return super.getText(); +// } +// return super.getText(); +// } @Override public JPopupMenu getPopupMenu() { ensurePopupMenuCreated(); popupMenu.setOpaque(false); - popupMenu.setBorder(new Border() { - - @Override - public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { - Graphics2D g2d = (Graphics2D) g; - int rec = (int) REC; - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); - g2d.setColor(UIConstants.UIPOPUPMENU_LINE_COLOR); - g2d.drawRoundRect(x, y, width - 1, height - 1, rec, rec); - if (!(UIMenu.this.getParent() instanceof JPopupMenu)) { - g.setColor(UIConstants.NORMAL_BACKGROUND); - g.drawLine(1, 0, UIMenu.this.getWidth() - 2, 0); - } - } - - @Override - public boolean isBorderOpaque() { - return false; - } - - @Override - public Insets getBorderInsets(Component c) { - return new Insets(5, 2, 10, 10); - } - }); +// popupMenu.setBorder(new Border() { +// +// @Override +// public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { +// Graphics2D g2d = (Graphics2D) g; +// int rec = (int) REC; +// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); +// g2d.setColor(UIConstants.UIPOPUPMENU_LINE_COLOR); +// g2d.drawRoundRect(x, y, width - 1, height - 1, rec, rec); +// if (!(UIMenu.this.getParent() instanceof JPopupMenu)) { +// g.setColor(UIConstants.NORMAL_BACKGROUND); +// g.drawLine(1, 0, UIMenu.this.getWidth() - 2, 0); +// } +// } +// +// @Override +// public boolean isBorderOpaque() { +// return false; +// } +// +// @Override +// public Insets getBorderInsets(Component c) { +// return new Insets(5, 2, 10, 10); +// } +// }); return popupMenu; } protected void ensurePopupMenuCreated() { if (popupMenu == null) { - this.popupMenu = new JPopupMenu() { - @Override - protected void paintComponent(Graphics g) { - Graphics2D g2d = (Graphics2D) g; - int rec = (int) REC; - Shape shape = new RoundRectangle2D.Double(0, 0, getWidth(), getHeight(), REC, REC); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2d.setColor(UIConstants.NORMAL_BACKGROUND); - g2d.fillRoundRect(0, 0, getWidth(), getHeight(), rec, rec); - g2d.setClip(shape); - super.paintComponent(g2d); - } - - }; + this.popupMenu = new JPopupMenu(); +// @Override +// protected void paintComponent(Graphics g) { +// Graphics2D g2d = (Graphics2D) g; +// int rec = (int) REC; +// Shape shape = new RoundRectangle2D.Double(0, 0, getWidth(), getHeight(), REC, REC); +// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); +// g2d.setColor(UIConstants.NORMAL_BACKGROUND); +// g2d.fillRoundRect(0, 0, getWidth(), getHeight(), rec, rec); +// g2d.setClip(shape); +// super.paintComponent(g2d); +// } +// +// }; popupMenu.setInvoker(this); popupListener = createWinListener(popupMenu); } } - /** - * 画界面 - */ - @Override - public void updateUI() { - setUI(new UIMenuUI()); - } +// /** +// * 画界面 +// */ +// @Override +// public void updateUI() { +// setUI(new UIMenuUI()); +// } /** * 判断popupmeu是否隐藏 diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuBar.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuBar.java index 6f7a68c83c..37248a2490 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuBar.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuBar.java @@ -12,7 +12,7 @@ import javax.swing.border.EmptyBorder; */ public class UIMenuBar extends JMenuBar { - private static final int LEFT_GAP = 5; + private static final int LEFT_GAP = 10; public UIMenuBar() { super(); @@ -23,7 +23,7 @@ public class UIMenuBar extends JMenuBar { /** * 更新UI */ - public void updateUI() { - setUI(new UIMenuBarUI()); - } +// public void updateUI() { +// setUI(new UIMenuBarUI()); +// } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuBarUI.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuBarUI.java index a93b1d23db..a0f073ce2b 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuBarUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuBarUI.java @@ -1,9 +1,6 @@ package com.fr.design.gui.imenu; -import com.fr.design.constants.UIConstants; - import javax.swing.plaf.basic.BasicMenuBarUI; -import java.awt.*; /** * Created by IntelliJ IDEA. @@ -23,10 +20,8 @@ public class UIMenuBarUI extends BasicMenuBarUI { if (!c.isOpaque()) { return; } - Color oldColor = g.getColor(); - g.setColor(UIConstants.UI_MENU_BACKGOURND); - g.fillRect(0, 0, c.getWidth(), c.getHeight()); - g.setColor(oldColor); +// g.setColor(UIManager.getColor("Menu.background")); +// g.fillRect(0, 0, c.getWidth(), c.getHeight()); } diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuEastAttrItem.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuEastAttrItem.java index 0df132caf4..78f0ae06fa 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuEastAttrItem.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuEastAttrItem.java @@ -26,14 +26,14 @@ public class UIMenuEastAttrItem extends JMenuItem { public UIMenuEastAttrItem(String string, Icon pageSmallIcon) { super(string, pageSmallIcon); - setBackground(UIConstants.NORMAL_BACKGROUND); - setUI(new UIMenuItemEastAttrUI()); +// setBackground(UIConstants.NORMAL_BACKGROUND); +// setUI(new UIMenuItemEastAttrUI()); } public UIMenuEastAttrItem(String string, int key) { super(string, key); - setBackground(UIConstants.NORMAL_BACKGROUND); - setUI(new UIMenuItemEastAttrUI()); +// setBackground(UIConstants.NORMAL_BACKGROUND); +// setUI(new UIMenuItemEastAttrUI()); } public UIMenuEastAttrItem(Action action) { @@ -57,7 +57,7 @@ public class UIMenuEastAttrItem extends JMenuItem { Color oldColor = g.getColor(); int menuWidth = menuItem.getWidth(); int menuHeight = menuItem.getHeight(); - g.setColor(UIConstants.NORMAL_BACKGROUND); +// g.setColor(UIConstants.NORMAL_BACKGROUND); g.fillRect(0, 0, menuWidth, menuHeight); if (menuItem.isOpaque()) { diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuHighLight.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuHighLight.java deleted file mode 100644 index 6fb127e5ca..0000000000 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuHighLight.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.fr.design.gui.imenu; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; - -import javax.swing.JPanel; - -import com.fr.design.constants.UIConstants; - -public class UIMenuHighLight extends JPanel{ - - @Override - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.height = 0; - return dim; - } - public void paint(Graphics g) { - g.setColor(UIConstants.LINE_COLOR); - g.drawLine(0, 0, getWidth(), 0); - g.setColor(Color.WHITE); - g.drawLine(0, 1, getWidth(), 1); - }; -} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuItem.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuItem.java index 3230dbda21..d5bd493bde 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuItem.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuItem.java @@ -1,6 +1,5 @@ package com.fr.design.gui.imenu; -import com.fr.design.constants.UIConstants; import com.fr.stable.StringUtils; import javax.swing.Action; @@ -19,14 +18,14 @@ public class UIMenuItem extends JMenuItem{ public UIMenuItem(String string, Icon pageSmallIcon) { super(string, pageSmallIcon); - setBackground(UIConstants.NORMAL_BACKGROUND); - setUI(new UIMenuItemUI()); +// setBackground(UIConstants.NORMAL_BACKGROUND); +// setUI(new UIMenuItemUI()); } public UIMenuItem(String string, int key) { super(string, key); - setBackground(UIConstants.NORMAL_BACKGROUND); - setUI(new UIMenuItemUI()); +// setBackground(UIConstants.NORMAL_BACKGROUND); +// setUI(new UIMenuItemUI()); } public UIMenuItem(Action action) { diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIPopupMenu.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIPopupMenu.java index 3aeaa186be..e2a2546b25 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIPopupMenu.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIPopupMenu.java @@ -1,12 +1,12 @@ package com.fr.design.gui.imenu; -import java.awt.*; -import java.awt.geom.RoundRectangle2D; - -import javax.swing.*; - import com.fr.design.constants.UIConstants; +import javax.swing.JPopupMenu; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; + public class UIPopupMenu extends JPopupMenu{ private static final float DEFAULT_REC = 8f; private boolean onlyText = false; @@ -15,23 +15,23 @@ public class UIPopupMenu extends JPopupMenu{ public static UIPopupMenu EMPTY = new UIPopupMenu(); public UIPopupMenu() { super(); - setBackground(UIConstants.NORMAL_BACKGROUND); +// setBackground(UIConstants.NORMAL_BACKGROUND); } @Override protected void paintComponent(Graphics g) { - Graphics2D g2d = (Graphics2D) g; - Shape shape = new RoundRectangle2D.Double(0, 0, getWidth(), getHeight(), rec, rec); - g2d.setClip(shape); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - super.paintComponent(g2d); +// Graphics2D g2d = (Graphics2D) g; +// Shape shape = new RoundRectangle2D.Double(0, 0, getWidth(), getHeight(), rec, rec); +// g2d.setClip(shape); +// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + super.paintComponent(g); } @Override protected void paintBorder(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setColor(UIConstants.UIPOPUPMENU_LINE_COLOR); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); +// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, (int) rec, (int) rec); } diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIScrollMenu.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIScrollMenu.java index 1d176c384c..dff9d24a81 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIScrollMenu.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIScrollMenu.java @@ -68,13 +68,13 @@ public class UIScrollMenu extends UIMenu { //// All of these methods are necessary because ensurePopupMenuCreated() is private in JMenu ////////////////////////////// - /** - * 画界面 - */ - @Override - public void updateUI() { - setUI(new UIMenuUI()); - } +// /** +// * 画界面 +// */ +// @Override +// public void updateUI() { +// setUI(new UIMenuUI()); +// } /** diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIScrollPopUpMenu.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIScrollPopUpMenu.java index c2713fc26a..4bedf626dd 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIScrollPopUpMenu.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIScrollPopUpMenu.java @@ -1,10 +1,14 @@ package com.fr.design.gui.imenu; -import com.fr.design.constants.UIConstants; import com.fr.design.gui.iscrollbar.UIScrollBar; -import java.awt.*; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Insets; +import java.awt.LayoutManager; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.MouseWheelEvent; @@ -41,13 +45,13 @@ public class UIScrollPopUpMenu extends UIPopupMenu { public void paintChildren(Graphics g) { - Graphics2D g2d = (Graphics2D) g; - int rec = (int) REC; - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2d.setColor(UIConstants.NORMAL_BACKGROUND); - g2d.fillRoundRect(1, 1, getWidth() - 2, getHeight() - 2, rec, rec); - Insets insets = getInsets(); - g.clipRect(insets.left, insets.top, getWidth(), getHeight() - insets.top - insets.bottom); +// Graphics2D g2d = (Graphics2D) g; +// int rec = (int) REC; +// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); +// g2d.setColor(UIConstants.NORMAL_BACKGROUND); +// g2d.fillRoundRect(1, 1, getWidth() - 2, getHeight() - 2, rec, rec); +// Insets insets = getInsets(); +// g.clipRect(insets.left, insets.top, getWidth(), getHeight() - insets.top - insets.bottom); super.paintChildren(g); } diff --git a/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBar.java b/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBar.java index 5cdd9cacd3..d7ec3db936 100644 --- a/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBar.java +++ b/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBar.java @@ -22,7 +22,6 @@ public class UIScrollBar extends JScrollBar { public UIScrollBar(int orientation) { super(orientation); - setUI(new UIScrollBarUI()); } @Override @@ -32,6 +31,11 @@ public class UIScrollBar extends JScrollBar { : new Dimension(super.getPreferredSize().width, 10); } + @Override + public void setBackground(Color bg) { + super.setBackground(bg); + } + @Override /** * 取得宽度 diff --git a/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinnerUI.java b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinnerUI.java index d6d91e991d..d1abbf39b6 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinnerUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinnerUI.java @@ -6,7 +6,6 @@ package com.fr.design.gui.ispinner; import com.fr.design.constants.UIConstants; -import com.fr.design.gui.ibutton.SpecialUIButton; import com.fr.design.gui.ibutton.UIButton; import javax.swing.*; diff --git a/designer-base/src/main/java/com/fr/design/gui/itable/UITable.java b/designer-base/src/main/java/com/fr/design/gui/itable/UITable.java index e5dcd7fd14..2ddb20a7d3 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itable/UITable.java +++ b/designer-base/src/main/java/com/fr/design/gui/itable/UITable.java @@ -1,12 +1,11 @@ package com.fr.design.gui.itable; -import java.awt.*; -import java.awt.event.AWTEventListener; -import java.awt.event.FocusAdapter; -import java.awt.event.FocusEvent; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.List; +import com.fr.design.constants.UIConstants; +import com.fr.design.event.UIObserver; +import com.fr.design.event.UIObserverListener; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.BorderFactory; import javax.swing.JComponent; @@ -17,16 +16,20 @@ import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.plaf.TableUI; -import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; - -import com.fr.design.constants.UIConstants; -import com.fr.design.event.UIObserver; -import com.fr.design.event.UIObserverListener; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.utils.gui.GUICoreUtils; +import java.awt.AWTEvent; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Toolkit; +import java.awt.event.AWTEventListener; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.List; public class UITable extends JTable implements UIObserver { @@ -218,7 +221,7 @@ public class UITable extends JTable implements UIObserver { setBackground(UIConstants.NORMAL_BACKGROUND); setDefaultEditor(UITable.class, editor); setDefaultRenderer(UITable.class, new UITableRender()); - setUI(getUI()); +// setUI(getUI()); TableColumn deleteTableColumn = new TableColumn(getTableDataModel().getColumnCount()); deleteTableColumn.setCellEditor(null); @@ -286,21 +289,21 @@ public class UITable extends JTable implements UIObserver { return new UITableUI(); } - @Override +// @Override /** * */ - public TableCellEditor getDefaultEditor(Class columnClass) { - return super.getDefaultEditor(UITable.class); - } +// public TableCellEditor getDefaultEditor(Class columnClass) { +// return super.getDefaultEditor(UITable.class); +// } - @Override +// @Override /** * */ - public TableCellRenderer getDefaultRenderer(Class columnClass) { - return super.getDefaultRenderer(UITable.class); - } +// public TableCellRenderer getDefaultRenderer(Class columnClass) { +// return super.getDefaultRenderer(UITable.class); +// } /** * 给组件登记一个观察者监听事件 diff --git a/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableEditorPane.java b/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableEditorPane.java index aca38b28d2..f385874b51 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableEditorPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableEditorPane.java @@ -51,7 +51,7 @@ public class UITableEditorPane extends BasicPane { UILabel l = new UILabel(leftLabelName); editTable = tableModel.createTable(); - editTable.getTableHeader().setBackground(UIConstants.DEFAULT_BG_RULER); +// editTable.getTableHeader().setBackground(UIConstants.DEFAULT_BG_RULER); UIScrollPane scrollPane = new UIScrollPane(editTable); scrollPane.setBorder(new UIRoundedBorder(UIConstants.TITLED_BORDER_COLOR, 1, UIConstants.ARC)); diff --git a/designer-base/src/main/java/com/fr/design/gui/itextfield/UITextField.java b/designer-base/src/main/java/com/fr/design/gui/itextfield/UITextField.java index 10edf9fe00..5be57fb018 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itextfield/UITextField.java +++ b/designer-base/src/main/java/com/fr/design/gui/itextfield/UITextField.java @@ -144,10 +144,10 @@ public class UITextField extends JTextField implements UIObserver, GlobalNameObs return preferredSize; } - @Override - public UITextFieldUI getUI() { - return (UITextFieldUI) ui; - } +// @Override +// public UITextFieldUI getUI() { +// return (UITextFieldUI) ui; +// } /** * 设置变化的背景颜色 @@ -159,9 +159,9 @@ public class UITextField extends JTextField implements UIObserver, GlobalNameObs /** * 更新UI */ - public void updateUI() { - this.setUI(new UITextFieldUI(this)); - } +// public void updateUI() { +// this.setUI(new UITextFieldUI(this)); +// } @Override protected void paintComponent(final Graphics pG) { @@ -183,7 +183,7 @@ public class UITextField extends JTextField implements UIObserver, GlobalNameObs if (!isBorderPainted) { return; } - getUI().paintBorder((Graphics2D) g, getWidth(), getHeight(), isRoundBorder, rectDirection); +// getUI().paintBorder((Graphics2D) g, getWidth(), getHeight(), isRoundBorder, rectDirection); } /** diff --git a/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java b/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java index 709fdece73..7b30e45d96 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java +++ b/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java @@ -1,14 +1,11 @@ package com.fr.design.gui.itoolbar; -import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.mainframe.JTemplate; - +import javax.swing.JToolBar; import java.awt.Component; import java.awt.FlowLayout; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -import javax.swing.JToolBar; public class UIToolbar extends JToolBar { @@ -21,7 +18,7 @@ public class UIToolbar extends JToolBar { setFloatable(false); setRollover(true); setLayout(new FlowLayout(align, 4, 0)); - setUI(uiToolBarUI); +// setUI(uiToolBarUI); setBorderPainted(false); } diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java index d61b58cf1c..de1411c408 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java @@ -1,7 +1,6 @@ package com.fr.design.gui.itree.filetree; import com.fr.base.FRContext; -import com.fr.design.constants.UIConstants; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.gui.itree.refreshabletree.RefreshableJTree; import com.fr.design.i18n.Toolkit; @@ -13,17 +12,16 @@ import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.workspace.WorkContext; -import java.util.HashMap; -import java.util.Map; import javax.swing.BorderFactory; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; -import java.awt.Color; import java.awt.Component; import java.io.File; import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; /* * 文件结构树. @@ -87,9 +85,9 @@ public class EnvFileTree extends RefreshableJTree { this.setText(PENDING.toString()); } this.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0)); - this.setBackgroundNonSelectionColor(UIConstants.TREE_BACKGROUND); - this.setTextSelectionColor(Color.WHITE); - this.setBackgroundSelectionColor(UIConstants.FLESH_BLUE); +// this.setBackgroundNonSelectionColor(UIConstants.TREE_BACKGROUND); +// this.setTextSelectionColor(Color.WHITE); +// this.setBackgroundSelectionColor(UIConstants.FLESH_BLUE); return this; } }; diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java b/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java index 338038c36b..113b2e4b45 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java @@ -1,6 +1,5 @@ package com.fr.design.gui.itree.refreshabletree; -import com.fr.design.constants.UIConstants; import com.fr.design.gui.itooltip.UIToolTip; import com.fr.design.gui.itree.checkboxtree.CheckBoxTree; import com.fr.design.i18n.Toolkit; @@ -55,7 +54,7 @@ public abstract class RefreshableJTree extends CheckBoxTree { ExpandMutableTreeNode root = (ExpandMutableTreeNode) model.getRoot(); root.setExpanded(true); this.setRootVisible(false); - this.setBackground(UIConstants.TREE_BACKGROUND); +// this.setBackground(UIConstants.TREE_BACKGROUND); this.addTreeExpansionListener(expansion); this.addTreeWillExpandListener(willExpand); } @@ -106,21 +105,23 @@ public abstract class RefreshableJTree extends CheckBoxTree { @Override protected Long doInBackground() throws Exception { long startTime = System.currentTimeMillis(); + + return System.currentTimeMillis() - startTime; + } + + @Override + protected void done() { ExpandMutableTreeNode[] nodes = RefreshableJTree.this.loadChildTreeNodes(treeNode); for (int i = 0; i < nodes.length; i++) { treeNode.add(nodes[i]); } - DefaultTreeModel treeModel = (DefaultTreeModel) RefreshableJTree.this.getModel(); + // 主要耗时是用在了treeUI的渲染上了,所以把这个放到工作线程里面 if (treeNode.getChildCount() >= 1 && ((ExpandMutableTreeNode) treeNode.getFirstChild()).getUserObject() == PENDING) { treeNode.remove(0); } + DefaultTreeModel treeModel = (DefaultTreeModel) RefreshableJTree.this.getModel(); treeModel.nodeStructureChanged(treeNode); - return System.currentTimeMillis() - startTime; - } - - @Override - protected void done() { RefreshableJTree.this.updateUI(); // 恢复Tree的可用性 RefreshableJTree.this.setEnabled(true); diff --git a/designer-base/src/main/java/com/fr/design/i18n/DesignI18nImpl.java b/designer-base/src/main/java/com/fr/design/i18n/DesignI18nImpl.java index 7d57708642..3bd65fd7ae 100644 --- a/designer-base/src/main/java/com/fr/design/i18n/DesignI18nImpl.java +++ b/designer-base/src/main/java/com/fr/design/i18n/DesignI18nImpl.java @@ -1,6 +1,5 @@ package com.fr.design.i18n; -import com.fr.design.DesignerEnvManager; import com.fr.general.GeneralContext; import com.fr.general.log.MessageFormatter; import com.fr.locale.DesignI18nProvider; @@ -15,10 +14,10 @@ import java.util.Locale; public class DesignI18nImpl implements DesignI18nProvider { - static { - // GeneralContext上下文 存储本次启动的语言环境 直接使用DesignerEnvManager 会在设置语言环境后 不重启 立即生效 存在问题 - GeneralContext.setLocale(DesignerEnvManager.getEnvManager().getLanguage()); - } +// static { +// // GeneralContext上下文 存储本次启动的语言环境 直接使用DesignerEnvManager 会在设置语言环境后 不重启 立即生效 存在问题 +// GeneralContext.setLocale(DesignerEnvManager.getEnvManager().getLanguage()); +// } private static DesignI18nImpl instance = new DesignI18nImpl(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java index 3cceff5a75..41bb38e291 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java @@ -7,7 +7,6 @@ import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.file.NewTemplatePane; import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.imenu.UIMenuHighLight; import com.fr.design.gui.itoolbar.UILargeToolbar; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.layout.FRGUIPaneFactory; @@ -92,7 +91,6 @@ public class CenterRegionContainerPane extends JPanel { eastPane.add(eastCenterPane, BorderLayout.CENTER); toolbarPane.add(eastPane, BorderLayout.NORTH); - toolbarPane.add(new UIMenuHighLight(), BorderLayout.SOUTH); this.setLayout(new BorderLayout()); this.add(centerTemplateCardPane = new DesktopCardPane(), BorderLayout.CENTER); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index 16c8ef46ca..2db9d50e74 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -16,7 +16,6 @@ import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.TableDataTreePane; import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager; import com.fr.design.data.tabledata.ResponseDataSourceChange; -import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.file.FileOperations; import com.fr.design.file.FileToolbarStateChangeListener; @@ -26,7 +25,6 @@ import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.file.TemplateTreePane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.imenu.UIMenuHighLight; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.i18n.Toolkit; @@ -174,7 +172,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt parent.add(createUpToolBarPane(), BorderLayout.CENTER); parent.setBorder(BorderFactory.createEmptyBorder(3, 0, 4, 0)); tooBarPane.add(parent, BorderLayout.CENTER); - tooBarPane.add(new UIMenuHighLight(), BorderLayout.SOUTH); searchToolbarPane = new TemplateTreeSearchToolbarPane(toolBar); searchToolbarPane.add(createUpToolBarPane(), BorderLayout.EAST); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 1357b48354..9898d606ff 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -1,5 +1,7 @@ package com.fr.design.mainframe; +import com.formdev.flatlaf.FlatDarkLaf; +import com.formdev.flatlaf.ui.FlatLineBorder; import com.fr.base.FRContext; import com.fr.base.svg.IconUtils; import com.fr.base.vcs.DesignerMode; @@ -9,7 +11,6 @@ import com.fr.design.constants.UIConstants; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.fun.PropertyItemPaneProvider; import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.ibutton.UIButtonUI; import com.fr.design.gui.icontainer.UIEastResizableContainer; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.VerticalFlowLayout; @@ -21,7 +22,6 @@ import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.DesignUtils; import com.fr.design.utils.SvgDrawUtils; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.log.FineLoggerFactory; import com.fr.plugin.context.PluginContext; import com.fr.plugin.context.PluginRuntime; @@ -41,6 +41,8 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.EmptyBorder; import java.awt.BorderLayout; import java.awt.CardLayout; @@ -49,9 +51,9 @@ import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; -import java.awt.Graphics2D; import java.awt.GraphicsEnvironment; import java.awt.Image; +import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; @@ -76,9 +78,9 @@ public class EastRegionContainerPane extends UIEastResizableContainer { private FixedPopupPane currentPopupPane; private UIButton currentButton; private static final int CONTAINER_WIDTH = containerWidth(); - private static final int TAB_WIDTH = 38; - private static final int TAB_BUTTON_WIDTH = 32; - private static final int TAB_BUTTON_HEIGHT = 28; + private static final int TAB_WIDTH = 42; + private static final int TAB_BUTTON_WIDTH = 40; + private static final int TAB_BUTTON_HEIGHT = 34; private static final int CONTENT_WIDTH = CONTAINER_WIDTH - TAB_WIDTH; private static final int POPUP_TOOLPANE_HEIGHT = 27; private static final int ARROW_RANGE_START = CONTENT_WIDTH - 30; @@ -92,6 +94,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { public static final String KEY_CONDITION_ATTR = "conditionAttr"; public static final String KEY_HYPERLINK = "hyperlink"; public static final String KEY_WIDGET_LIB = "widgetLib"; + public static final String KEY_AI_CHAT = "AIChat"; public static final String KEY_AUTHORITY_EDITION = "authorityEdition"; public static final String KEY_CONFIGURED_ROLES = "editedRoles"; public static final String DEFAULT_PANE = "defaultPane"; @@ -166,7 +169,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { switchMode(PropertyMode.REPORT); setContainerWidth(CONTAINER_WIDTH); - initPluginPane(); +// initPluginPane(); listenPlugin(); } @@ -332,6 +335,18 @@ public class EastRegionContainerPane extends UIEastResizableContainer { "configuredroles", new PropertyMode[]{PropertyMode.AUTHORITY_EDITION_DISABLED}, new PropertyMode[]{PropertyMode.AUTHORITY_EDITION}); + PropertyItem aiChat = new PropertyItem( + KEY_AI_CHAT, + "设计器助手", + "widgetlib", + new PropertyMode[]{PropertyMode.REPORT}, + new PropertyMode[]{PropertyMode.REPORT}, + null, + null, + e -> { + + }); + propertyItemMap.put(KEY_CELL_ELEMENT, cellElement); propertyItemMap.put(KEY_CELL_ATTR, cellAttr); propertyItemMap.put(KEY_FLOAT_ELEMENT, floatElement); @@ -339,6 +354,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { propertyItemMap.put(KEY_CONDITION_ATTR, conditionAttr); propertyItemMap.put(KEY_HYPERLINK, hyperlink); propertyItemMap.put(KEY_WIDGET_LIB, widgetLib); + propertyItemMap.put(KEY_AI_CHAT, aiChat); propertyItemMap.put(KEY_AUTHORITY_EDITION, authorityEdition); propertyItemMap.put(KEY_CONFIGURED_ROLES, configuredRoles); } @@ -383,7 +399,6 @@ public class EastRegionContainerPane extends UIEastResizableContainer { private void initRightPane() { rightPane = new JPanel(); propertyCard = new CardLayout(); - rightPane.setBackground(Color.green); rightPane.setLayout(propertyCard); for (PropertyItem item : propertyItemMap.values()) { if (item.isPoppedOut() || !item.isVisible()) { @@ -401,15 +416,15 @@ public class EastRegionContainerPane extends UIEastResizableContainer { // 左侧按钮面板 private void initLeftPane() { leftPane = new JPanel(); - leftPane.setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 4, 4)); + leftPane.setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 1, 4)); for (PropertyItem item : propertyItemMap.values()) { if (item.isPoppedOut() || !item.isVisible()) { continue; } leftPane.add(item.getButton()); } + leftPane.setBorder(new FlatLineBorder(new Insets(0,0,0,0), UIManager.getColor("East.border"))); - leftPane.setBackground(UIConstants.PROPERTY_PANE_BACKGROUND); replaceLeftPane(leftPane); } @@ -557,6 +572,15 @@ public class EastRegionContainerPane extends UIEastResizableContainer { propertyItemMap.get(KEY_CONFIGURED_ROLES).replaceContentPane(pane); } + public void replaceAIChatPane(JComponent pane) { + propertyItemMap.get(KEY_AI_CHAT).replaceContentPane(pane); + } + + public JComponent getAIChatPane() { + return propertyItemMap.get(KEY_AI_CHAT).getContentPane(); + } + + public void replaceKeyPane(final String key, final JComponent pane) { //需要放到 ui 线程中处理 @@ -580,13 +604,18 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } public static void main(String[] args) { + try { + UIManager.setLookAndFeel( new FlatDarkLaf() ); + } catch (UnsupportedLookAndFeelException e) { + throw new RuntimeException(e); + } JFrame jf = new JFrame("test"); // jf = new JFrame("test"); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel cc = new JPanel(); - cc.setBackground(Color.WHITE); +// cc.setBackground(Color.WHITE); // JPanel leftPane = new JPanel(); // leftPane.setBackground(Color.yellow); // JPanel rightPane = new JPanel(); @@ -861,7 +890,6 @@ public class EastRegionContainerPane extends UIEastResizableContainer { private void initPropertyPanel() { propertyPanel = new JPanel(); - propertyPanel.setBackground(Color.pink); contentPane = generateContentPane(); popupToolPane = new PopupToolPane(this, PopupToolPane.DOWN_BUTTON); headerPane = new JPanel(); @@ -947,7 +975,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { if (iconSuffix.equals(ICON_SUFFIX_SELECTED)) { iconSuffix = ICON_SUFFIX_NORMAL; button.setIcon(IconUtils.readIcon(getBtnIconUrl())); - button.setBackground(originBtnBackground); +// button.setBackground(originBtnBackground); button.setOpaque(false); } } @@ -956,7 +984,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { resetPropertyIcons(); iconSuffix = ICON_SUFFIX_SELECTED; button.setIcon(IconUtils.readIcon(getBtnIconUrl())); - button.setBackground(selectedBtnBackground); +// button.setBackground(selectedBtnBackground); button.setOpaque(true); selectedItem = this; } @@ -970,28 +998,23 @@ public class EastRegionContainerPane extends UIEastResizableContainer { public Dimension getPreferredSize() { return new Dimension(TAB_BUTTON_WIDTH, TAB_BUTTON_HEIGHT); } - - @Override - public void paintComponent(Graphics g) { - super.paintComponent(g); - } }; button.setDisabledIcon(IconUtils.readIcon(getIconBaseDir() + btnIconName + ICON_SUFFIX_DISABLED)); button.set4LargeToolbarButton(); - button.setUI(new UIButtonUI() { - @Override - protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) { - if (isPressed(b) && b.isPressedPainted()) { - Color pressColor = isTabButtonSelected() ? UIConstants.TAB_BUTTON_PRESS_SELECTED : UIConstants.TAB_BUTTON_PRESS; - GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), pressColor); - } else if (isRollOver(b)) { - Color hoverColor = isTabButtonSelected() ? UIConstants.TAB_BUTTON_HOVER_SELECTED : UIConstants.TAB_BUTTON_HOVER; - GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), hoverColor); - } else if (b.isNormalPainted()) { - GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted()); - } - } - }); +// button.setUI(new UIButtonUI() { +// @Override +// protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) { +// if (isPressed(b) && b.isPressedPainted()) { +// Color pressColor = isTabButtonSelected() ? UIConstants.TAB_BUTTON_PRESS_SELECTED : UIConstants.TAB_BUTTON_PRESS; +// GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), pressColor); +// } else if (isRollOver(b)) { +// Color hoverColor = isTabButtonSelected() ? UIConstants.TAB_BUTTON_HOVER_SELECTED : UIConstants.TAB_BUTTON_HOVER; +// GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), hoverColor); +// } else if (b.isNormalPainted()) { +// GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted()); +// } +// } +// }); originBtnBackground = button.getBackground(); button.addActionListener(new ActionListener() { @Override @@ -1182,7 +1205,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { public void mouseExited(MouseEvent e) { setCursor(Cursor.getDefaultCursor()); if (mouseDownCompCoords == null) { - contentPane.setBackground(originColor); +// contentPane.setBackground(originColor); } repaint(); } @@ -1198,7 +1221,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { public void mouseReleased(MouseEvent e) { mouseDownCompCoords = null; if (!getBounds().contains(e.getPoint())) { - contentPane.setBackground(originColor); +// contentPane.setBackground(originColor); } } @@ -1217,7 +1240,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } else if (isMovable) { setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); - contentPane.setBackground(UIConstants.POPUP_TITLE_BACKGROUND); +// contentPane.setBackground(UIConstants.POPUP_TITLE_BACKGROUND); } else { setCursor(Cursor.getDefaultCursor()); } @@ -1263,7 +1286,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { originColor = UIConstants.UI_TOOLBAR_COLOR; contentPane = new JPanel(); - contentPane.setBackground(originColor); +// contentPane.setBackground(originColor); contentPane.setLayout(new BorderLayout()); UILabel label = new UILabel(title); contentPane.add(label, BorderLayout.WEST); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/ForbiddenPane.java b/designer-base/src/main/java/com/fr/design/mainframe/ForbiddenPane.java index 9c33534c7b..482986241b 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/ForbiddenPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/ForbiddenPane.java @@ -8,8 +8,15 @@ import com.fr.design.mainframe.guide.base.GuideView; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; -import com.fr.workspace.WorkContext; import com.fr.report.lock.LockInfoOperator; +import com.fr.workspace.WorkContext; + +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.SwingWorker; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; @@ -22,12 +29,6 @@ import java.awt.LayoutManager; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.SwingWorker; /** * @author hades @@ -38,7 +39,7 @@ public class ForbiddenPane extends JPanel { private static final ImageIcon LOCK_ICON = new ImageIcon(IOUtils.readImage("/com/fr/design/images/mainframe/lock_template.png")); private static final Color TIP_COLOR = new Color(108, 174, 235); - private static final Color BUTTON_COLOR = new Color(63, 155, 249); + private static final Color BUTTON_COLOR = new Color(249, 63, 63); private static final int Y_GAP = 10; private static final int X_GAP = 10; private static final int ARC = 4; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java b/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java index adea8d7e4d..71702a0d5e 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe; +import com.formdev.flatlaf.FlatDarculaLaf; import com.fr.base.BaseUtils; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; @@ -10,6 +11,7 @@ import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JPanel; +import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.plaf.basic.BasicSliderUI; @@ -74,7 +76,7 @@ public class JFormSliderPane extends JPanel { UILabel uiLabel = new UILabel(SUFFIX); uiLabel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4)); panel.add(uiLabel); - panel.setBackground(BACK_COLOR); +// panel.setBackground(BACK_COLOR); this.add(panel, BorderLayout.NORTH); } @@ -89,7 +91,7 @@ public class JFormSliderPane extends JPanel { } }; slider.setValue(HALF_HUNDRED); - slider.setUI(new JSliderPaneUI(slider)); +// slider.setUI(new JSliderPaneUI(slider)); slider.addChangeListener(listener); slider.setPreferredSize(new Dimension(220, 20)); //去掉虚线框 @@ -104,7 +106,7 @@ public class JFormSliderPane extends JPanel { return new Point(event.getX(), event.getY() - TOOLTIP_Y); } }; - downButton.setOpaque(false); +// downButton.setOpaque(false); downButton.setBorderPainted(false); downButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Scale_Down")); upButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/data/source/normalUp20.png"), BaseUtils.readIcon("com/fr/design/images/data/source/hoverUp20.png"), BaseUtils.readIcon("com/fr/design/images/data/source/hoverUp20.png")) { @@ -112,8 +114,8 @@ public class JFormSliderPane extends JPanel { return new Point(event.getX(), event.getY() - TOOLTIP_Y); } }; - upButton.setOpaque(false); - upButton.setBorderPainted(false); +// upButton.setOpaque(false); +// upButton.setBorderPainted(false); upButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Scale_Up")); downButton.setActionCommand("less"); upButton.setActionCommand("more"); @@ -316,7 +318,7 @@ public class JFormSliderPane extends JPanel { Graphics2D g2 = (Graphics2D) g; cy = (trackBounds.height / 2); cw = trackBounds.width; - g2.setPaint(BACK_COLOR); +// g2.setPaint(BACK_COLOR); g2.fillRect(0, -cy, cw + 10, cy * 4); g.setColor(new Color(216, 216, 216)); g.drawLine(0, cy, cw + 3, cy); @@ -334,6 +336,11 @@ public class JFormSliderPane extends JPanel { } public static void main(String[] args) { + try { + UIManager.setLookAndFeel( new FlatDarculaLaf() ); + } catch( Exception ex ) { + System.err.println( "Failed to initialize LaF" ); + } JFrame jf = new JFrame("test"); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel content = (JPanel) jf.getContentPane(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java index d850e8e814..a48be8b034 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java @@ -4,7 +4,6 @@ import com.fr.design.DesignState; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; import com.fr.design.fun.TitlePlaceProcessor; -import com.fr.design.gui.imenu.UIMenuHighLight; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.loghandler.LogMessageBar; import com.fr.design.mainframe.toolbar.ToolBarMenuDock; @@ -66,7 +65,6 @@ public class NorthRegionContainerPane extends JPanel { ToolBarMenuDock ad = DesignerContext.getDesignerFrame().getToolBarMenuDock(); this.setLayout(new BorderLayout()); - this.add(new UIMenuHighLight(), BorderLayout.SOUTH); this.add(initNorthEastPane(ad), BorderLayout.EAST); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/WestRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/WestRegionContainerPane.java index 004fbd55a3..e1f5ff3ad1 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/WestRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/WestRegionContainerPane.java @@ -2,9 +2,9 @@ package com.fr.design.mainframe; import com.fr.design.DesignModelAdapter; import com.fr.design.DesignerEnvManager; -import com.fr.design.constants.UIConstants; import com.fr.design.data.datapane.TableDataTreePane; import com.fr.design.gui.icontainer.UIResizableContainer; +import com.fr.design.ui.util.UIUtil; import com.fr.general.GeneralContext; import com.fr.plugin.context.PluginContext; import com.fr.plugin.injectable.PluginModule; @@ -39,12 +39,13 @@ public class WestRegionContainerPane extends UIResizableContainer { @Override public void on(PluginEvent event) { - - if (getDownPane() != null) { - replaceDownPane(TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter())); - } else { - setDownPane(TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter())); - } + UIUtil.invokeLaterIfNeeded(()-> { + if (getDownPane() != null) { + replaceDownPane(TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter())); + } else { + setDownPane(TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter())); + } + }); } }, new PluginFilter() { @@ -56,6 +57,6 @@ public class WestRegionContainerPane extends UIResizableContainer { }); setContainerWidth(165); - setBackground(UIConstants.TREE_BACKGROUND); +// setBackground(UIConstants.TREE_BACKGROUND); } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/base/GuideView.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/base/GuideView.java index 6a9a60615f..97ef1a1a55 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/guide/base/GuideView.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/base/GuideView.java @@ -23,7 +23,7 @@ public class GuideView extends JDialog { private float modalOpacity; private Window window; - public static GuideView getInstance(Guide guide) { + public static synchronized GuideView getInstance(Guide guide) { if (guideView == null) { guideView = new GuideView(DesignerContext.getDesignerFrame(), guide); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java index b36ca47294..55616e8695 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java @@ -206,7 +206,7 @@ public class DesignerLogHandler { this.setPreferredSize(new Dimension(super.getPreferredSize().width, 150)); jTextArea.setEditable(false); - jTextArea.setBackground(Color.WHITE); +// jTextArea.setBackground(Color.WHITE); popup = new JPopupMenu(); selectAll = new UIMenuItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Select_All")); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogHandlerBar.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogHandlerBar.java index eb9ba74c2e..a0035aae49 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogHandlerBar.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogHandlerBar.java @@ -44,7 +44,7 @@ public class LogHandlerBar extends JPanel implements ItemSelectable { public LogHandlerBar(String text) { this.setLayout(new FlowLayout(FlowLayout.RIGHT, FLOW_LAYOUT_HGAP, FLOW_LAYOUT_VGAP)); - this.setUI(new LogHandlerBarUI()); +// this.setUI(new LogHandlerBarUI()); this.text = text; clear = new UIButton(BaseUtils.readIcon("com/fr/design/images/log/clear.png")); clear.setMargin(null); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java index fded318188..0d1a64a761 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java @@ -1,10 +1,8 @@ package com.fr.design.mainframe.loghandler; -import com.fr.design.constants.UIConstants; import com.fr.design.gui.ilable.UILabel; import com.fr.stable.StringUtils; - import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.BorderLayout; @@ -42,7 +40,6 @@ public class LogMessageBar extends JPanel { messageLabel = new UILabel(); setLayout(new BorderLayout()); add(messageLabel, BorderLayout.CENTER); - setBackground(UIConstants.LOG_MESSAGE_BAR_BACKGROUND); addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/LookAndFeelAction.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/LookAndFeelAction.java new file mode 100644 index 0000000000..f12a9cac4e --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/LookAndFeelAction.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.mainframe.toolbar; + + +import com.formdev.flatlaf.FlatLaf; +import com.formdev.flatlaf.extras.FlatAnimatedLafChange; +import com.fr.design.actions.UpdateAction; + +import javax.swing.LookAndFeel; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import java.awt.event.ActionEvent; + +public class LookAndFeelAction extends UpdateAction { + + private final LookAndFeel lookAndFeel; + + public LookAndFeelAction(String name, LookAndFeel lookAndFeel) { + this.setName(name); + this.lookAndFeel = lookAndFeel; + } + + @Override + public void actionPerformed(ActionEvent e) { + applyLookAndFeel(lookAndFeel); + } + + private void applyLookAndFeel(LookAndFeel lookAndFeel){ + FlatAnimatedLafChange.showSnapshot(); + try { + UIManager.setLookAndFeel( lookAndFeel ); + } catch (UnsupportedLookAndFeelException e) { + throw new RuntimeException(e); + } + FlatLaf.updateUI(); + FlatAnimatedLafChange.hideSnapshotWithAnimation(); + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index 3372e2ad13..5a60d60825 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -3,6 +3,9 @@ */ package com.fr.design.mainframe.toolbar; +import com.fine.theme.light.ui.laf.FineLightLaf; +import com.formdev.flatlaf.FlatDarculaLaf; +import com.formdev.flatlaf.FlatLightLaf; import com.fr.base.FRContext; import com.fr.base.vcs.DesignerMode; import com.fr.design.DesignState; @@ -48,6 +51,7 @@ import com.fr.design.fun.MenuHandler; import com.fr.design.fun.OemProcessor; import com.fr.design.fun.PluginManagerProvider; import com.fr.design.fun.TableDataPaneProcessor; +import com.fr.design.gui.UILookAndFeel; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.imenu.UIMenu; @@ -62,7 +66,6 @@ import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; -import com.fr.design.module.DesignModuleFactory; import com.fr.design.os.impl.SupportOSImpl; import com.fr.design.remote.action.RemoteDesignAuthManagerAction; import com.fr.design.update.actions.SoftwareUpdateAction; @@ -296,6 +299,7 @@ public abstract class ToolBarMenuDock { } }, SupportLocaleImpl.COMMUNITY); + menuList.add(createLookAndFeel()); // 添加全部UpdateAction到actionmanager中 addAllUpdateActionsToList(menuList); @@ -481,7 +485,7 @@ public abstract class ToolBarMenuDock { return new UILabel(); } - public Component createNotificationCenterPane(){ + public Component createNotificationCenterPane() { return new UILabel(); } @@ -672,6 +676,19 @@ public abstract class ToolBarMenuDock { return menuDef; } + public MenuDef createLookAndFeel() { + MenuDef menuDef = new MenuDef("外观", 'H'); + menuDef.addShortCut( + new LookAndFeelAction("FR11", new UILookAndFeel()), + new LookAndFeelAction("fine new ui", new FineLightLaf()), + new LookAndFeelAction("flat dark", new FlatDarculaLaf()), + new LookAndFeelAction("flat light", new FlatLightLaf()) + ); + insertMenu(menuDef, "laf"); + return menuDef; + } + + public MenuDef createCommunityMenuDef() { MenuDef menuDef = new MenuDef(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community"), 'C'); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsMovePanel.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsMovePanel.java index 28cb3f2447..cccc08bc72 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsMovePanel.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsMovePanel.java @@ -10,7 +10,6 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.iprogressbar.ModernUIProgressBarUI; -import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; @@ -21,7 +20,6 @@ import com.fr.design.mainframe.vcs.VcsExceptionUtils; import com.fr.design.mainframe.vcs.common.VcsHelper; import com.fr.design.utils.BrowseUtils; import com.fr.design.utils.DesignUtils; -import com.fr.design.utils.ThemeUtils; import com.fr.design.widget.FRWidgetFactory; import com.fr.general.FRFont; import com.fr.log.FineLoggerFactory; @@ -36,7 +34,10 @@ import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Color; +import java.awt.Cursor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; @@ -44,7 +45,6 @@ import java.awt.event.MouseEvent; import java.util.List; import java.util.concurrent.ExecutionException; -import static javax.swing.JOptionPane.YES_NO_CANCEL_OPTION; import static javax.swing.JOptionPane.YES_OPTION; @@ -61,7 +61,7 @@ public class VcsMovePanel extends BasicPane { .applySize(14) .applyStyle(FRFont.BOLD); - private static final Color BACK_GROUND_COLOR = new Color(202,232,255); +// private static final Color BACK_GROUND_COLOR = new Color(202,232,255); //提示字体的颜色,直接模仿其他面板的写法 private static final Color TIP_COLOR = new Color(51, 51, 52, (int)Math.round(0.5 * 255)); @@ -261,12 +261,12 @@ public class VcsMovePanel extends BasicPane { private void initVcsLabel(JPanel parent) { parent.removeAll(); if (!VcsHelper.getInstance().isLegacyMode()) { - parent.setBackground(ThemeUtils.BACK_COLOR); +// parent.setBackground(ThemeUtils.BACK_COLOR); centerButton = new UIButton(Toolkit.i18nText("Fine-Design_Vcs_Center")); parent.add(centerButton); initVcsCenterListener(); } else { - parent.setBackground(BACK_GROUND_COLOR); +// parent.setBackground(BACK_GROUND_COLOR); vcsUpdateExistLabel = new UILabel(IconUtils.readIcon("/com/fr/design/vcs/vcs_move_icon.svg")); vcsUpdateExistLabel.setText(Toolkit.i18nText("Fine-Design_Vcs_Can_Update")); vcsUpdateFireLabel = new UILabel(Toolkit.i18nText("Fine-Design_Vcs_Update")); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/editors/TextField.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/editors/TextField.java index f6b0b5cef2..0374427f38 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/widget/editors/TextField.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/editors/TextField.java @@ -1,7 +1,5 @@ package com.fr.design.mainframe.widget.editors; -import java.awt.Color; - import com.fr.design.gui.itextfield.UITextField; /** @@ -22,6 +20,6 @@ public class TextField extends UITextField implements ITextComponent { @Override public void setEditable(boolean b) { super.setEditable(b); - setBackground(Color.WHITE); +// setBackground(Color.WHITE); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/menu/DottedSeparator.java b/designer-base/src/main/java/com/fr/design/menu/DottedSeparator.java index 1f5f032770..7d1ec7b261 100644 --- a/designer-base/src/main/java/com/fr/design/menu/DottedSeparator.java +++ b/designer-base/src/main/java/com/fr/design/menu/DottedSeparator.java @@ -1,17 +1,15 @@ package com.fr.design.menu; +import com.fr.design.actions.UpdateAction; +import com.fr.design.gui.imenu.UIMenuItem; + import java.awt.BasicStroke; -import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Stroke; import java.awt.event.ActionEvent; -import com.fr.design.constants.UIConstants; -import com.fr.design.actions.UpdateAction; -import com.fr.design.gui.imenu.UIMenuItem; - /** * 虚线的Separator。 * @author zhou @@ -19,7 +17,7 @@ import com.fr.design.gui.imenu.UIMenuItem; */ public class DottedSeparator extends UpdateAction { - private static Color color = new Color(153, 153, 153); +// private static Color color = new Color(153, 153, 153); public DottedSeparator() { @@ -53,13 +51,13 @@ public class DottedSeparator extends UpdateAction { int w = this.getWidth(); int h = this.getHeight(); Graphics2D g2d = (Graphics2D)g; - g2d.setColor(UIConstants.NORMAL_BACKGROUND); + g2d.setColor(getBackground()); g2d.fillRect(0, 0, w, h); - g2d.setColor(color); + g2d.setColor(getForeground()); Stroke bs = new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 2f, new float[] { 3, 1 }, 0); g2d.setStroke(bs); g2d.drawLine(30, h / 2+1, w-4, h / 2+1); - this.setForeground(color); + this.setForeground(getForeground()); super.paint(g); } diff --git a/designer-base/src/main/java/com/fr/design/menu/LineSeparator.java b/designer-base/src/main/java/com/fr/design/menu/LineSeparator.java index 45e45fc0d5..1419d31d88 100644 --- a/designer-base/src/main/java/com/fr/design/menu/LineSeparator.java +++ b/designer-base/src/main/java/com/fr/design/menu/LineSeparator.java @@ -1,10 +1,12 @@ package com.fr.design.menu; -import com.fr.design.constants.UIConstants; import com.fr.design.actions.UpdateAction; import com.fr.design.gui.imenu.UIMenuItem; -import java.awt.*; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; import java.awt.event.ActionEvent; /** @@ -53,11 +55,11 @@ public class LineSeparator extends UpdateAction{ int w = this.getWidth(); int h = this.getHeight(); Graphics2D g2d = (Graphics2D)g; - g2d.setColor(UIConstants.NORMAL_BACKGROUND); + g2d.setColor(getBackground()); g2d.fillRect(0, 0, w, h); - g2d.setColor(color); + g2d.setColor(getForeground()); g2d.drawLine(4, h / 2+1, w-4, h / 2+1); - this.setForeground(color); +// this.setForeground(color); super.paint(g); } diff --git a/designer-base/src/main/java/com/fr/design/menu/NameSeparator.java b/designer-base/src/main/java/com/fr/design/menu/NameSeparator.java index 89d291e543..b22184eb8f 100644 --- a/designer-base/src/main/java/com/fr/design/menu/NameSeparator.java +++ b/designer-base/src/main/java/com/fr/design/menu/NameSeparator.java @@ -1,5 +1,10 @@ package com.fr.design.menu; +import com.fr.base.GraphHelper; +import com.fr.design.actions.UpdateAction; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.imenu.UIMenuItem; + import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FontMetrics; @@ -7,13 +12,6 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; -import com.fr.design.constants.UIConstants; -import com.fr.design.gui.ilable.UILabel; - -import com.fr.base.GraphHelper; -import com.fr.design.actions.UpdateAction; -import com.fr.design.gui.imenu.UIMenuItem; - /** * * @author zhou @@ -56,9 +54,8 @@ public class NameSeparator extends UpdateAction { int w = this.getWidth(); int h = this.getHeight(); Graphics2D g2d = (Graphics2D)g; - g2d.setColor(UIConstants.NORMAL_BACKGROUND); + g2d.setColor(getBackground()); g2d.fillRect(0, 0, w, h); - this.setForeground(UIConstants.FONT_COLOR); super.paint(g); } @@ -81,7 +78,7 @@ public class NameSeparator extends UpdateAction { int w = this.getWidth(); int h = this.getHeight(); Graphics2D g2d = (Graphics2D)g; - g2d.setColor(UIConstants.FONT_COLOR); + g2d.setColor(getForeground()); FontMetrics fm = GraphHelper.getFontMetrics(this.getFont()); int strwidth = 0; String str = this.getText(); @@ -89,7 +86,6 @@ public class NameSeparator extends UpdateAction { strwidth = strwidth + fm.charWidth(str.charAt(i)); } g2d.drawLine(strwidth + 4, h / 2+2, w, h / 2+2); - this.setForeground(UIConstants.FONT_COLOR); super.paint(g); } } diff --git a/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java b/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java index 8e5c3ff404..b8d41ebe56 100644 --- a/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java +++ b/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java @@ -1,13 +1,12 @@ package com.fr.design.notification.ui; import com.fr.base.svg.IconUtils; -import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.notification.NotificationCenter; -import com.fr.general.IOUtils; + import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.MouseAdapter; @@ -33,7 +32,6 @@ public class NotificationCenterPane extends BasicPane { notificationCenterDialog.showDialog(); } }); - this.setBackground(UIConstants.TEMPLATE_TAB_PANE_BACKGROUND); } public static NotificationCenterPane getNotificationCenterPane() { diff --git a/designer-base/src/main/java/com/fr/design/roleAuthority/ReportAndFSManagePane.java b/designer-base/src/main/java/com/fr/design/roleAuthority/ReportAndFSManagePane.java index f393b1a09c..ce8a9012a9 100644 --- a/designer-base/src/main/java/com/fr/design/roleAuthority/ReportAndFSManagePane.java +++ b/designer-base/src/main/java/com/fr/design/roleAuthority/ReportAndFSManagePane.java @@ -184,7 +184,7 @@ public class ReportAndFSManagePane extends DockingView implements Prepare4DataSo Icon[] iconArray = new Icon[]{BaseUtils.readIcon("/com/fr/web/images/platform/demo.png")}; String[] textArray = new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FS_Name")}; - buttonGroup = new UIHeadGroup(iconArray, textArray) { + buttonGroup = new UIHeadGroup(textArray) { public void tabChanged(int index) { roleTree.setEditable(false); if (op != null) { @@ -198,7 +198,6 @@ public class ReportAndFSManagePane extends DockingView implements Prepare4DataSo } }; buttonGroup.setBorder(BorderFactory.createMatteBorder(1, LEFT_GAP, 0, 0, UIConstants.LINE_COLOR)); - buttonGroup.setNeedLeftRightOutLine(false); } /** diff --git a/designer-base/src/main/java/com/fr/design/style/color/CustomChooserPanel.java b/designer-base/src/main/java/com/fr/design/style/color/CustomChooserPanel.java index 49a3a91254..95f2d7f36e 100644 --- a/designer-base/src/main/java/com/fr/design/style/color/CustomChooserPanel.java +++ b/designer-base/src/main/java/com/fr/design/style/color/CustomChooserPanel.java @@ -22,7 +22,6 @@ import javax.swing.event.DocumentListener; import javax.swing.text.BadLocationException; import javax.swing.text.Document; -import com.fr.design.gui.ibutton.SpecialUIButton; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.islider.UISlider; diff --git a/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java b/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java index 86093a6d82..c03550da2a 100644 --- a/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java +++ b/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java @@ -6,6 +6,8 @@ import com.fr.third.guava.base.Supplier; import org.jetbrains.annotations.NotNull; import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import java.awt.Color; import java.util.concurrent.TimeUnit; /** @@ -55,18 +57,18 @@ public class UIUtil { } } } - + /** * 有些时候,交互上需要有一些等待的效果, * 如果没有等待到, 会让交互失去作用。 * * @param supplier 结果 - * @param timeout 超时 + * @param timeout 超时 * @param timeUnit 单位 * @return 结果 */ public static T waitUntil(Supplier supplier, long timeout, TimeUnit timeUnit) { - + Stopwatch st = Stopwatch.createStarted(); T result = supplier.get(); long elapsed = st.elapsed(timeUnit); @@ -81,4 +83,8 @@ public class UIUtil { } return result; } + + public static Color getPanelBackageColor() { + return UIManager.getColor("Panel.background"); + } } diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java b/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java index 8f44ae197e..980ac2c8a8 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java @@ -23,6 +23,7 @@ import com.fr.design.locale.impl.BbsRegisterMark; import com.fr.design.locale.impl.BbsResetMark; import com.fr.design.locale.impl.BbsSpaceMark; import com.fr.design.login.utils.DesignerLoginUtils; +import com.fr.design.ui.util.UIUtil; import com.fr.design.upm.event.DownloadEvent; import com.fr.design.upm.exec.UpmBrowserExecutor; import com.fr.design.upm.task.UpmTaskWorker; @@ -40,7 +41,6 @@ import com.teamdev.jxbrowser.chromium.Browser; import com.teamdev.jxbrowser.chromium.JSArray; import com.teamdev.jxbrowser.chromium.JSFunction; import com.teamdev.jxbrowser.chromium.JSObject; -import com.teamdev.jxbrowser.chromium.JSValue; import javax.swing.JFileChooser; import javax.swing.SwingUtilities; @@ -146,7 +146,7 @@ public class UpmBridge { @JSBridge public void closeWindow() { - UpmFinder.closeWindow(); + UIUtil.invokeLaterIfNeeded(UpmFinder::closeWindow); } 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 bfba512a20..2da9646639 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 @@ -1,5 +1,7 @@ package com.fr.design.utils; +import com.fine.theme.light.ui.laf.FineLightLaf; +import com.formdev.flatlaf.extras.FlatUIDefaultsInspector; import com.fr.base.FeedBackInfo; import com.fr.base.ServerConfig; import com.fr.base.Utils; @@ -10,7 +12,6 @@ import com.fr.design.deeplink.DeepLinkCore; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.fun.DefaultValueAdjustProvider; import com.fr.design.fun.DesignerEnvProcessor; -import com.fr.design.gui.UILookAndFeel; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.ui.util.UIUtil; @@ -27,7 +28,6 @@ import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.bridge.ObjectHolder; import com.fr.stable.os.OperatingSystem; -import com.fr.stable.plugin.ExtraDesignClassManagerProvider; import com.fr.start.ServerStarter; import com.fr.start.common.DesignerStartupContext; import com.fr.start.common.DesignerStartupUtil; @@ -306,12 +306,7 @@ public class DesignUtils { * p:初始化look and feel, 把一切放到这个里面.可以让多个地方调用. */ public static void initLookAndFeel() { - // p:隐藏对话框的系统标题风格,用look and feel定义的标题风格. - try { - UIManager.setLookAndFeel(UILookAndFeel.class.getName()); - } catch (Exception e) { - FineLoggerFactory.getLogger().error("Substance Raven Graphite failed to initialize"); - } + FineLightLaf.setup(); //获取当前系统语言下设计器用的默认字体 FRFont guiFRFont = getDefaultGUIFont(); //指定UIManager中字体 @@ -323,6 +318,7 @@ public class DesignUtils { UIManager.put(key, isTextField(key) ? getNamedFont("Dialog") : guiFRFont); } } + FlatUIDefaultsInspector.install( "ctrl shift alt Y" ); } private static boolean isTextField(String key) { diff --git a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java index f8f7a13ea2..c20aaa153d 100644 --- a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java +++ b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java @@ -5,12 +5,12 @@ import com.fr.design.gui.iprogressbar.ProgressDialog; import com.fr.design.i18n.Toolkit; import com.fr.design.locale.impl.SupportLocaleImpl; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.ui.util.UIUtil; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; import com.fr.event.Null; import com.fr.general.FRFont; -import com.fr.general.locale.LocaleAction; import com.fr.general.locale.LocaleCenter; import javax.swing.plaf.ColorUIResource; @@ -47,7 +47,7 @@ public class FineEmbedServerMonitor { @Override public void on(Event event, Null aNull) { getInstance().reset(); - progressDialog.dispose(); + UIUtil.invokeLaterIfNeeded(() -> progressDialog.dispose()); } }); } @@ -87,29 +87,24 @@ public class FineEmbedServerMonitor { public void monitor() { final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory("FineEmbedServerMonitor")); - scheduler.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - if (isComplete()) { - scheduler.shutdown(); - progressDialog.dispose(); - return; - } + scheduler.scheduleAtFixedRate(() -> { + if (isComplete()) { + scheduler.shutdown(); + UIUtil.invokeLaterIfNeeded(() -> progressDialog.dispose()); + return; + } + UIUtil.invokeLaterIfNeeded(() -> { if (!progressDialog.isVisible()) { progressDialog = new ProgressDialog(DesignerContext.getDesignerFrame()); progressDialog.setVisible(true); //如果为韩文则改变字体 - LocaleCenter.buildAction(new LocaleAction() { - @Override - public void execute() { - font = FRFont.getInstance().applySize(FONT_SIZE).applyForeground(new ColorUIResource(FONT_RGB)).applyName(FONT_NAME); - } - }, SupportLocaleImpl.SUPPORT_KOREA); + LocaleCenter.buildAction(() -> font = FRFont.getInstance().applySize(FONT_SIZE).applyForeground(new ColorUIResource(FONT_RGB)).applyName(FONT_NAME), SupportLocaleImpl.SUPPORT_KOREA); String text = Toolkit.i18nText("Fine-Design_Basic_Loading_Embed_Server"); progressDialog.updateLoadingText(text, font); } progressDialog.setProgressValue(getProgress()); - } + }); + }, 0, STEP_HEARTBEAT, TimeUnit.MILLISECONDS); } diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties new file mode 100644 index 0000000000..02700bd9f4 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -0,0 +1,1077 @@ +# +# Copyright 2019 FormDev Software GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# +# This file is loaded for all light themes (that extend class FlatLightLaf). +# +# Documentation: +# - https://www.formdev.com/flatlaf/properties-files/ +# - https://www.formdev.com/flatlaf/how-to-customize/ +# +# NOTE: Avoid copying the whole content of this file to own properties files. +# This will make upgrading to newer FlatLaf versions complex and error-prone. +# Instead, copy and modify only those properties that you need to alter. +# + +# Colors and style mostly based on IntelliJ theme from IntelliJ IDEA Community Edition, +# which is licensed under the Apache 2.0 license. Copyright 2000-2019 JetBrains s.r.o. +# See: https://github.com/JetBrains/intellij-community/ + +#---- UI delegates ---- + +ButtonUI = com.formdev.flatlaf.ui.FlatButtonUI +CheckBoxUI = com.formdev.flatlaf.ui.FlatCheckBoxUI +CheckBoxMenuItemUI = com.formdev.flatlaf.ui.FlatCheckBoxMenuItemUI +ColorChooserUI = com.formdev.flatlaf.ui.FlatColorChooserUI +ComboBoxUI = com.formdev.flatlaf.ui.FlatComboBoxUI +DesktopIconUI = com.formdev.flatlaf.ui.FlatDesktopIconUI +DesktopPaneUI = com.formdev.flatlaf.ui.FlatDesktopPaneUI +EditorPaneUI = com.formdev.flatlaf.ui.FlatEditorPaneUI +FileChooserUI = com.formdev.flatlaf.ui.FlatFileChooserUI +FormattedTextFieldUI = com.formdev.flatlaf.ui.FlatFormattedTextFieldUI +InternalFrameUI = com.formdev.flatlaf.ui.FlatInternalFrameUI +LabelUI = com.formdev.flatlaf.ui.FlatLabelUI +ListUI = com.formdev.flatlaf.ui.FlatListUI +MenuUI = com.formdev.flatlaf.ui.FlatMenuUI +MenuBarUI = com.formdev.flatlaf.ui.FlatMenuBarUI +MenuItemUI = com.formdev.flatlaf.ui.FlatMenuItemUI +OptionPaneUI = com.formdev.flatlaf.ui.FlatOptionPaneUI +PanelUI = com.formdev.flatlaf.ui.FlatPanelUI +PasswordFieldUI = com.formdev.flatlaf.ui.FlatPasswordFieldUI +PopupMenuUI = com.formdev.flatlaf.ui.FlatPopupMenuUI +PopupMenuSeparatorUI = com.formdev.flatlaf.ui.FlatPopupMenuSeparatorUI +ProgressBarUI = com.formdev.flatlaf.ui.FlatProgressBarUI +RadioButtonUI = com.formdev.flatlaf.ui.FlatRadioButtonUI +RadioButtonMenuItemUI = com.formdev.flatlaf.ui.FlatRadioButtonMenuItemUI +RootPaneUI = com.formdev.flatlaf.ui.FlatRootPaneUI +ScrollBarUI = com.formdev.flatlaf.ui.FlatScrollBarUI +ScrollPaneUI = com.formdev.flatlaf.ui.FlatScrollPaneUI +SeparatorUI = com.formdev.flatlaf.ui.FlatSeparatorUI +SliderUI = com.formdev.flatlaf.ui.FlatSliderUI +SpinnerUI = com.formdev.flatlaf.ui.FlatSpinnerUI +SplitPaneUI = com.formdev.flatlaf.ui.FlatSplitPaneUI +TabbedPaneUI = com.formdev.flatlaf.ui.FlatTabbedPaneUI +TableUI = com.formdev.flatlaf.ui.FlatTableUI +TableHeaderUI = com.formdev.flatlaf.ui.FlatTableHeaderUI +TextAreaUI = com.formdev.flatlaf.ui.FlatTextAreaUI +TextFieldUI = com.formdev.flatlaf.ui.FlatTextFieldUI +TextPaneUI = com.formdev.flatlaf.ui.FlatTextPaneUI +ToggleButtonUI = com.fine.theme.light.ui.FineToggleButtonUI +ToolBarUI = com.formdev.flatlaf.ui.FlatToolBarUI +ToolBarSeparatorUI = com.formdev.flatlaf.ui.FlatToolBarSeparatorUI +ToolTipUI = com.formdev.flatlaf.ui.FlatToolTipUI +TreeUI = com.formdev.flatlaf.ui.FlatTreeUI +ViewportUI = com.formdev.flatlaf.ui.FlatViewportUI + + +#---- variables ---- + +# general background and foreground (text color) +@background = #F6F8FA +@foreground = #0B1B39 +@disabledBackground = @background +@disabledForeground = tint(@foreground,55%) + +# component background +@buttonBackground = lighten(@background,5%) +@componentBackground = @background +@menuBackground = @background + +# selection +@selectionBackground = @accentSelectionBackground +@selectionForeground = contrast(@selectionBackground, @foreground, #fff) +@selectionInactiveBackground = shade(@background,13%) +@selectionInactiveForeground = @foreground + +# menu +@menuSelectionBackground = @selectionBackground +@menuHoverBackground = darken(@menuBackground,10%,derived) +@menuCheckBackground = lighten(@menuSelectionBackground,40%,derived noAutoInverse) +@menuAcceleratorForeground = lighten(@foreground,30%) +@menuAcceleratorSelectionForeground = @selectionForeground + +# misc +@cellFocusColor = darken(@selectionBackground,20%) +@icon = shade(@background,27%) + +# accent colors (blueish) +# set @accentColor to use single accent color or +# modify @accentBaseColor to use variations of accent base color +@accentColor = systemColor(accent,null) +@accentBaseColor = #2675BF +@accentBase2Color = lighten(saturate(@accentBaseColor,10%),6%) +# accent color variations +@accentCheckmarkColor = if(@accentColor, @accentColor, tint(@accentBase2Color,20%)) +@accentFocusColor = if(@accentColor, @accentColor, lighten(@accentBaseColor,31%)) +@accentLinkColor = if(@accentColor, @accentColor, darken(@accentBaseColor,3%)) +@accentSelectionBackground = if(@accentColor, @accentColor, @accentBaseColor) +@accentSliderColor = if(@accentColor, @accentColor, @accentBase2Color) +@accentUnderlineColor = if(@accentColor, @accentColor, tint(@accentBaseColor,10%)) +@accentButtonDefaultBorderColor = if(@accentColor, @accentColor, tint(@accentBase2Color,20%)) + +# for buttons within components (e.g. combobox or spinner) +@buttonArrowColor = tint(@foreground,40%) +@buttonDisabledArrowColor = lighten(@buttonArrowColor,25%) +@buttonHoverArrowColor = lighten(@buttonArrowColor,20%,derived noAutoInverse) +@buttonPressedArrowColor = lighten(@buttonArrowColor,30%,derived noAutoInverse) + +# Drop (use lazy colors for IntelliJ platform themes, which usually do not specify these colors) +@dropCellBackground = lighten(List.selectionBackground,10%,lazy) +@dropCellForeground = lazy(List.selectionForeground) +@dropLineColor = lighten(List.selectionBackground,20%,lazy) +@dropLineShortColor = darken(List.selectionBackground,20%,lazy) + + +#---- system colors ---- + +activeCaption = #99b4d1 +inactiveCaption = #bfcddb +controlHighlight = lighten($controlShadow,12%) +controlLtHighlight = lighten($controlShadow,25%) +controlDkShadow = darken($controlShadow,15%) + + +#---- Button ---- + +Button.border = com.formdev.flatlaf.ui.FlatButtonBorder +Button.arc = 6 +Button.minimumWidth = 72 +Button.margin = 2,14,2,14 +Button.iconTextGap = 4 +Button.rollover = true +Button.defaultButtonFollowsFocus = false +Button.borderWidth = 1 + +Button.background = @buttonBackground +Button.focusedBackground = changeLightness($Component.focusColor,95%) +Button.hoverBackground = darken($Button.background,3%,derived) +Button.pressedBackground = darken($Button.background,10%,derived) +Button.selectedBackground = darken($Button.background,20%,derived) +Button.selectedForeground = $Button.foreground +Button.disabledSelectedBackground = darken($Button.background,13%,derived) + +Button.borderColor = $Component.borderColor +Button.disabledBorderColor = $Component.disabledBorderColor +Button.focusedBorderColor = $Component.focusedBorderColor +Button.hoverBorderColor = $Button.focusedBorderColor + +Button.innerFocusWidth = 0 + +Button.default.background = $Button.background +Button.default.foreground = $Button.foreground +Button.default.focusedBackground = $Button.focusedBackground +Button.default.hoverBackground = darken($Button.default.background,3%,derived) +Button.default.pressedBackground = darken($Button.default.background,10%,derived) +Button.default.borderColor = @accentButtonDefaultBorderColor +Button.default.hoverBorderColor = $Button.hoverBorderColor +Button.default.focusedBorderColor = $Button.focusedBorderColor +Button.default.focusColor = $Component.focusColor +Button.default.borderWidth = 2 + +Button.toolbar.hoverBackground = darken($Button.background,12%,derived) +Button.toolbar.pressedBackground = darken($Button.background,15%,derived) +Button.toolbar.selectedBackground = $Button.selectedBackground +Button.toolbar.margin = 3,3,3,3 +Button.toolbar.spacingInsets = 1,2,1,2 + +#---- CheckBox ---- + +CheckBox.border = com.formdev.flatlaf.ui.FlatMarginBorder +CheckBox.icon = com.formdev.flatlaf.icons.FlatCheckBoxIcon +CheckBox.arc = 4 +CheckBox.margin = 2,2,2,2 +CheckBox.iconTextGap = 4 +CheckBox.rollover = true + +CheckBox.icon.focusWidth = 1 + +# enabled +CheckBox.icon.borderColor = shade($Component.borderColor,10%) +CheckBox.icon.background = @buttonBackground +CheckBox.icon.selectedBorderColor = $CheckBox.icon.checkmarkColor +CheckBox.icon.selectedBackground = $CheckBox.icon.background +CheckBox.icon.checkmarkColor = @accentCheckmarkColor + +# disabled +CheckBox.icon.disabledBorderColor = tint($CheckBox.icon.borderColor,20%) +CheckBox.icon.disabledBackground = @disabledBackground +CheckBox.icon.disabledCheckmarkColor = lighten(changeSaturation($CheckBox.icon.checkmarkColor,0%),5%) + +# focused +CheckBox.icon.focusedBorderColor = shade($Component.focusedBorderColor,10%) +CheckBox.icon.focusedBackground = changeLightness($Component.focusColor,95%) + +# hover +CheckBox.icon.hoverBorderColor = $CheckBox.icon.focusedBorderColor +CheckBox.icon.hoverBackground = darken($CheckBox.icon.background,3%,derived) + +# pressed +CheckBox.icon.pressedBorderColor = $CheckBox.icon.focusedBorderColor +CheckBox.icon.pressedBackground = darken($CheckBox.icon.background,10%,derived) + + +# used if CheckBox.icon.style or RadioButton.icon.style = filled +# enabled +CheckBox.icon[filled].selectedBorderColor = shade($CheckBox.icon[filled].selectedBackground,5%) +CheckBox.icon[filled].selectedBackground = @accentCheckmarkColor +CheckBox.icon[filled].checkmarkColor = @buttonBackground +# focused +CheckBox.icon[filled].focusedSelectedBorderColor = tint($CheckBox.icon[filled].selectedBackground,50%) +CheckBox.icon[filled].focusedSelectedBackground = $CheckBox.icon[filled].selectedBackground +CheckBox.icon[filled].focusedCheckmarkColor = $CheckBox.icon.focusedBackground +# hover +CheckBox.icon[filled].hoverSelectedBackground = darken($CheckBox.icon[filled].selectedBackground,5%,derived) +# pressed +CheckBox.icon[filled].pressedSelectedBackground = darken($CheckBox.icon[filled].selectedBackground,10%,derived) + + +#---- CheckBoxMenuItem ---- + +CheckBoxMenuItem.icon.checkmarkColor = @accentCheckmarkColor +CheckBoxMenuItem.icon.disabledCheckmarkColor = @buttonDisabledArrowColor +CheckBoxMenuItem.border = com.formdev.flatlaf.ui.FlatMenuItemBorder +CheckBoxMenuItem.checkIcon = com.formdev.flatlaf.icons.FlatCheckBoxMenuItemIcon +CheckBoxMenuItem.arrowIcon = com.formdev.flatlaf.icons.FlatMenuItemArrowIcon +CheckBoxMenuItem.margin = @menuItemMargin +CheckBoxMenuItem.opaque = false +CheckBoxMenuItem.borderPainted = true +CheckBoxMenuItem.background = @menuBackground + +#---- ColorChooser ---- + +ColorChooser.swatchesSwatchSize = {scaledDimension}16,16 +ColorChooser.swatchesRecentSwatchSize = {scaledDimension}16,16 +ColorChooser.swatchesDefaultRecentColor = $control + + +#---- ComboBox ---- + +ComboBox.border = com.formdev.flatlaf.ui.FlatRoundBorder +ComboBox.padding = @componentMargin +ComboBox.minimumWidth = 72 +ComboBox.editorColumns = 0 +ComboBox.maximumRowCount = 15 +[mac]ComboBox.showPopupOnNavigation = true +# allowed values: auto, button or none +ComboBox.buttonStyle = auto +ComboBox.background = @componentBackground +ComboBox.buttonBackground = $ComboBox.background +ComboBox.buttonEditableBackground = darken($ComboBox.background,2%) +ComboBox.buttonSeparatorColor = $Component.borderColor +ComboBox.buttonDisabledSeparatorColor = $Component.disabledBorderColor +ComboBox.buttonArrowColor = @buttonArrowColor +ComboBox.buttonDisabledArrowColor = @buttonDisabledArrowColor +ComboBox.buttonHoverArrowColor = @buttonHoverArrowColor +ComboBox.buttonPressedArrowColor = @buttonPressedArrowColor + +ComboBox.popupInsets = 0,0,0,0 +ComboBox.selectionInsets = 0,0,0,0 +ComboBox.selectionArc = 0 +ComboBox.borderCornerRadius = $Popup.borderCornerRadius + + +#---- Component ---- + +Component.focusWidth = 0 +Component.innerFocusWidth = 0.5 +Component.innerOutlineWidth = 1 +Component.borderWidth = 1 +Component.arc = 5 +Component.minimumWidth = 64 +# allowed values: chevron or triangle +Component.arrowType = chevron +Component.hideMnemonics = true + +Component.borderColor = shade(@background,20%) +Component.disabledBorderColor = tint($Component.borderColor,20%) +Component.focusedBorderColor = shade($Component.focusColor,10%) +Component.focusColor = @accentFocusColor +Component.linkColor = @accentLinkColor +Component.accentColor = if(@accentColor, @accentColor, @accentBaseColor) +Component.grayFilter = 25,-25,100 + +Component.error.borderColor = lighten(desaturate($Component.error.focusedBorderColor,20%),25%) +Component.error.focusedBorderColor = #e53e4d +Component.warning.borderColor = lighten(saturate($Component.warning.focusedBorderColor,25%),20%) +Component.warning.focusedBorderColor = #e2a53a +Component.custom.borderColor = lighten(desaturate(#f00,20%,derived noAutoInverse),25%,derived noAutoInverse) + + +#---- Desktop ---- + +Desktop.background = #E6EBF0 + +#---- DesktopIcon ---- + +DesktopIcon.background = darken($Desktop.background,10%,derived) +DesktopIcon.border = 4,4,4,4 +DesktopIcon.iconSize = 64,64 +DesktopIcon.closeSize = 20,20 +DesktopIcon.closeIcon = com.formdev.flatlaf.icons.FlatInternalFrameCloseIcon + +#---- EditorPane ---- + +EditorPane.border = com.formdev.flatlaf.ui.FlatMarginBorder +EditorPane.margin = @componentMargin +EditorPane.background = @componentBackground + + +#---- FileChooser ---- + +FileChooser.newFolderIcon = com.formdev.flatlaf.icons.FlatFileChooserNewFolderIcon +FileChooser.upFolderIcon = com.formdev.flatlaf.icons.FlatFileChooserUpFolderIcon +FileChooser.homeFolderIcon = com.formdev.flatlaf.icons.FlatFileChooserHomeFolderIcon +FileChooser.detailsViewIcon = com.formdev.flatlaf.icons.FlatFileChooserDetailsViewIcon +FileChooser.listViewIcon = com.formdev.flatlaf.icons.FlatFileChooserListViewIcon +FileChooser.usesSingleFilePane = true +[win]FileChooser.useSystemExtensionHiding = true + + +#---- FileView ---- + +FileView.directoryIcon = com.formdev.flatlaf.icons.FlatFileViewDirectoryIcon +FileView.fileIcon = com.formdev.flatlaf.icons.FlatFileViewFileIcon +FileView.computerIcon = com.formdev.flatlaf.icons.FlatFileViewComputerIcon +FileView.hardDriveIcon = com.formdev.flatlaf.icons.FlatFileViewHardDriveIcon +FileView.floppyDriveIcon = com.formdev.flatlaf.icons.FlatFileViewFloppyDriveIcon +FileView.fullRowSelection = true + + +#---- FormattedTextField ---- + +FormattedTextField.border = com.formdev.flatlaf.ui.FlatTextBorder +FormattedTextField.margin = @componentMargin +FormattedTextField.background = @componentBackground +FormattedTextField.placeholderForeground = @disabledForeground +FormattedTextField.iconTextGap = 4 + +#---- HelpButton ---- + +HelpButton.questionMarkColor = @accentCheckmarkColor +HelpButton.disabledQuestionMarkColor = shade(@background,30%) + +HelpButton.icon = com.formdev.flatlaf.icons.FlatHelpButtonIcon +HelpButton.borderColor = $Button.borderColor +HelpButton.disabledBorderColor = $Button.disabledBorderColor +HelpButton.focusedBorderColor = $Button.focusedBorderColor +HelpButton.hoverBorderColor = $?Button.hoverBorderColor +HelpButton.background = $Button.background +HelpButton.disabledBackground = $Button.disabledBackground +HelpButton.focusedBackground = $?Button.focusedBackground +HelpButton.hoverBackground = $?Button.hoverBackground +HelpButton.pressedBackground = $?Button.pressedBackground + +HelpButton.borderWidth = $?Button.borderWidth +HelpButton.innerFocusWidth = $?Button.innerFocusWidth + + +#---- InternalFrame ---- + +InternalFrame.border = com.formdev.flatlaf.ui.FlatInternalFrameUI$FlatInternalFrameBorder +InternalFrame.borderLineWidth = 1 +InternalFrame.borderMargins = 6,6,6,6 +InternalFrame.buttonSize = 24,24 +InternalFrame.closeIcon = com.formdev.flatlaf.icons.FlatInternalFrameCloseIcon +InternalFrame.iconifyIcon = com.formdev.flatlaf.icons.FlatInternalFrameIconifyIcon +InternalFrame.maximizeIcon = com.formdev.flatlaf.icons.FlatInternalFrameMaximizeIcon +InternalFrame.minimizeIcon = com.formdev.flatlaf.icons.FlatInternalFrameRestoreIcon +InternalFrame.windowBindings = null + +# drop shadow +InternalFrame.dropShadowPainted = true +InternalFrame.activeDropShadowColor = null +InternalFrame.activeDropShadowInsets = 5,5,6,6 +InternalFrame.inactiveDropShadowColor = null +InternalFrame.inactiveDropShadowInsets = 3,3,4,4 + +InternalFrame.activeTitleBackground = #fff +InternalFrame.activeTitleForeground = @foreground +InternalFrame.inactiveTitleBackground = darken($InternalFrame.activeTitleBackground,2%) +InternalFrame.inactiveTitleForeground = @disabledForeground + +InternalFrame.activeBorderColor = shade(@background,40%) +InternalFrame.inactiveBorderColor = shade(@background,20%) + +InternalFrame.buttonHoverBackground = darken($InternalFrame.activeTitleBackground,10%,derived) +InternalFrame.buttonPressedBackground = darken($InternalFrame.activeTitleBackground,20%,derived) +InternalFrame.closeHoverBackground = lazy(Actions.Red) +InternalFrame.closePressedBackground = darken(Actions.Red,10%,lazy) +InternalFrame.closeHoverForeground = #fff +InternalFrame.closePressedForeground = #fff + +InternalFrame.activeDropShadowOpacity = 0.25 +InternalFrame.inactiveDropShadowOpacity = 0.5 + +#---- InternalFrameTitlePane ---- + +InternalFrameTitlePane.border = 0,8,0,0 + +#---- List ---- + +List.border = 0,0,0,0 +List.cellMargins = 1,6,1,6 +List.selectionInsets = 0,0,0,0 +List.selectionArc = 0 +List.cellFocusColor = @cellFocusColor +List.cellNoFocusBorder = com.formdev.flatlaf.ui.FlatListCellBorder$Default +List.focusCellHighlightBorder = com.formdev.flatlaf.ui.FlatListCellBorder$Focused +List.focusSelectedCellHighlightBorder = com.formdev.flatlaf.ui.FlatListCellBorder$Selected +List.background = @componentBackground +List.selectionInactiveBackground = @selectionInactiveBackground +List.selectionInactiveForeground = @selectionInactiveForeground +List.dropCellBackground = @dropCellBackground +List.dropCellForeground = @dropCellForeground +List.dropLineColor = @dropLineColor +List.showCellFocusIndicator = false + +#---- Menu ---- + +Menu.icon.arrowColor = @buttonArrowColor +Menu.icon.disabledArrowColor = @buttonDisabledArrowColor + +Menu.border = com.formdev.flatlaf.ui.FlatMenuItemBorder +Menu.arrowIcon = com.formdev.flatlaf.icons.FlatMenuArrowIcon +Menu.checkIcon = null +Menu.margin = @menuItemMargin +Menu.submenuPopupOffsetX = {scaledInteger}-4 +Menu.submenuPopupOffsetY = {scaledInteger}-4 +Menu.opaque = false +Menu.borderPainted = true +Menu.background = @menuBackground + + +#---- MenuBar ---- + +MenuBar.borderColor = $Separator.foreground +MenuBar.border = com.formdev.flatlaf.ui.FlatMenuBarBorder +MenuBar.background = @menuBackground +MenuBar.hoverBackground = @menuHoverBackground +MenuBar.itemMargins = 3,8,3,8 +MenuBar.selectionInsets = $MenuItem.selectionInsets +MenuBar.selectionEmbeddedInsets = $MenuItem.selectionInsets +MenuBar.selectionArc = $MenuItem.selectionArc + +#---- MenuItem ---- + +MenuItem.border = com.formdev.flatlaf.ui.FlatMenuItemBorder +MenuItem.arrowIcon = com.formdev.flatlaf.icons.FlatMenuItemArrowIcon +MenuItem.checkIcon = null +MenuItem.margin = @menuItemMargin +MenuItem.opaque = false +MenuItem.borderPainted = true +MenuItem.verticallyAlignText = true +MenuItem.background = @menuBackground +MenuItem.checkBackground = @menuCheckBackground +MenuItem.checkMargins = 2,2,2,2 +MenuItem.minimumWidth = 72 +MenuItem.minimumIconSize = 16,16 +MenuItem.iconTextGap = 6 +MenuItem.textAcceleratorGap = 24 +MenuItem.textNoAcceleratorGap = 6 +MenuItem.acceleratorArrowGap = 2 +MenuItem.acceleratorDelimiter = "+" +[mac]MenuItem.acceleratorDelimiter = "" +MenuItem.selectionInsets = 0,0,0,0 +MenuItem.selectionArc = 0 + +# for MenuItem.selectionType = underline +MenuItem.underlineSelectionBackground = @menuHoverBackground +MenuItem.underlineSelectionCheckBackground = @menuCheckBackground +MenuItem.underlineSelectionColor = @accentUnderlineColor +MenuItem.underlineSelectionHeight = 3 + +#---- OptionPane ---- + +OptionPane.border = 12,12,12,12 +OptionPane.messageAreaBorder = 0,0,0,0 +OptionPane.buttonAreaBorder = 12,0,0,0 +OptionPane.messageForeground = null + +OptionPane.showIcon = false +OptionPane.maxCharactersPerLine = 80 +OptionPane.iconMessageGap = 16 +OptionPane.messagePadding = 3 +OptionPane.buttonPadding = 8 +OptionPane.buttonMinimumWidth = {scaledInteger}72 +OptionPane.sameSizeButtons = true +OptionPane.setButtonMargin = false +OptionPane.buttonOrientation = 4 +[mac]OptionPane.isYesLast = true + +OptionPane.errorIcon = com.formdev.flatlaf.icons.FlatOptionPaneErrorIcon +OptionPane.informationIcon = com.formdev.flatlaf.icons.FlatOptionPaneInformationIcon +OptionPane.questionIcon = com.formdev.flatlaf.icons.FlatOptionPaneQuestionIcon +OptionPane.warningIcon = com.formdev.flatlaf.icons.FlatOptionPaneWarningIcon + +#---- PasswordField ---- + +PasswordField.capsLockIconColor = #00000064 +PasswordField.revealIconColor = tint(@foreground,40%) +PasswordField.border = com.formdev.flatlaf.ui.FlatTextBorder +PasswordField.margin = @componentMargin +PasswordField.background = @componentBackground +PasswordField.placeholderForeground = @disabledForeground +PasswordField.iconTextGap = 4 +PasswordField.echoChar = \u2022 +PasswordField.showCapsLock = true +PasswordField.showRevealButton = false +PasswordField.capsLockIcon = com.formdev.flatlaf.icons.FlatCapsLockIcon +PasswordField.revealIcon = com.formdev.flatlaf.icons.FlatRevealIcon + + +#---- Popup ---- + +Popup.borderCornerRadius = 4 +Popup.dropShadowPainted = true +Popup.dropShadowInsets = -4,-4,4,4 +Popup.dropShadowColor = #000 +Popup.dropShadowOpacity = 0.15 + + +#---- PopupMenu ---- + +PopupMenu.border = com.formdev.flatlaf.ui.FlatPopupMenuBorder +PopupMenu.borderInsets = 4,1,4,1 +PopupMenu.borderCornerRadius = $Popup.borderCornerRadius +PopupMenu.background = @menuBackground +PopupMenu.scrollArrowColor = @buttonArrowColor +PopupMenu.borderColor = shade(@background,28%) +PopupMenu.hoverScrollArrowBackground = darken(@background,5%) + +#---- PopupMenuSeparator ---- + +PopupMenuSeparator.height = 9 +PopupMenuSeparator.stripeWidth = 1 +PopupMenuSeparator.stripeIndent = 4 + + +#---- ProgressBar ---- + +ProgressBar.border = com.formdev.flatlaf.ui.FlatEmptyBorder +ProgressBar.arc = 4 +ProgressBar.horizontalSize = 146,4 +ProgressBar.verticalSize = 4,146 +ProgressBar.cycleTime = 4000 +ProgressBar.repaintInterval = 15 +ProgressBar.font = -2 +ProgressBar.background = darken(@background,13%) +ProgressBar.foreground = @accentSliderColor +ProgressBar.selectionBackground = @foreground +ProgressBar.selectionForeground = contrast($ProgressBar.foreground, @foreground, @componentBackground) + + +#---- RadioButton ---- + +RadioButton.border = com.formdev.flatlaf.ui.FlatMarginBorder +RadioButton.icon = com.formdev.flatlaf.icons.FlatRadioButtonIcon +RadioButton.icon.centerDiameter = 8 +RadioButton.icon[filled].centerDiameter = 5 +RadioButton.margin = 2,2,2,2 +RadioButton.iconTextGap = 4 +RadioButton.rollover = true + + +#---- RadioButtonMenuItem ---- + +RadioButtonMenuItem.border = com.formdev.flatlaf.ui.FlatMenuItemBorder +RadioButtonMenuItem.checkIcon = com.formdev.flatlaf.icons.FlatRadioButtonMenuItemIcon +RadioButtonMenuItem.arrowIcon = com.formdev.flatlaf.icons.FlatMenuItemArrowIcon +RadioButtonMenuItem.margin = @menuItemMargin +RadioButtonMenuItem.opaque = false +RadioButtonMenuItem.borderPainted = true +RadioButtonMenuItem.background = @menuBackground + + +#---- RootPane ---- + +RootPane.border = com.formdev.flatlaf.ui.FlatRootPaneUI$FlatWindowBorder +RootPane.borderDragThickness = 5 +RootPane.cornerDragWidth = 16 +RootPane.honorFrameMinimumSizeOnResize = false +RootPane.honorDialogMinimumSizeOnResize = true +RootPane.activeBorderColor = darken(@background,50%,derived) +RootPane.inactiveBorderColor = darken(@background,30%,derived) + + +#---- ScrollBar ---- + +ScrollBar.width = 10 +ScrollBar.minimumButtonSize = 12,12 +ScrollBar.minimumThumbSize = 10,10 +ScrollBar.maximumThumbSize = 100000,100000 +ScrollBar.trackInsets = 0,0,0,0 +ScrollBar.thumbInsets = 0,0,0,0 +ScrollBar.trackArc = 0 +ScrollBar.thumbArc = 0 +ScrollBar.hoverThumbWithTrack = false +ScrollBar.pressedThumbWithTrack = false +ScrollBar.showButtons = false +ScrollBar.squareButtons = false +ScrollBar.buttonArrowColor = @buttonArrowColor +ScrollBar.buttonDisabledArrowColor = @buttonDisabledArrowColor +ScrollBar.allowsAbsolutePositioning = true + +[mac]ScrollBar.minimumThumbSize = 18,18 +[mac]ScrollBar.thumbInsets = 2,2,2,2 +[mac]ScrollBar.thumbArc = 999 +[mac]ScrollBar.hoverThumbWithTrack = true + +[linux]ScrollBar.minimumThumbSize = 18,18 +[linux]ScrollBar.thumbInsets = 2,2,2,2 +[linux]ScrollBar.thumbArc = 999 + +ScrollBar.track = lighten(@background,1%,derived noAutoInverse) +ScrollBar.thumb = darken($ScrollBar.track,10%,derived noAutoInverse) +ScrollBar.hoverTrackColor = darken($ScrollBar.track,3%,derived noAutoInverse) +ScrollBar.hoverThumbColor = darken($ScrollBar.thumb,10%,derived noAutoInverse) +ScrollBar.pressedThumbColor = darken($ScrollBar.thumb,20%,derived noAutoInverse) +ScrollBar.hoverButtonBackground = darken(@background,5%,derived noAutoInverse) +ScrollBar.pressedButtonBackground = darken(@background,10%,derived noAutoInverse) + + +#---- ScrollPane ---- + +ScrollPane.border = com.formdev.flatlaf.ui.FlatBorder +ScrollPane.background = $ScrollBar.track +ScrollPane.fillUpperCorner = true +ScrollPane.smoothScrolling = true + + +#---- SearchField ---- + +SearchField.searchIconColor = fade(Actions.GreyInline,90%,lazy) +SearchField.searchIconHoverColor = fade(Actions.GreyInline,70%,lazy) +SearchField.searchIconPressedColor = fade(Actions.GreyInline,50%,lazy) + +SearchField.clearIconColor = fade(Actions.GreyInline,50%,lazy) +SearchField.clearIconHoverColor = $SearchField.clearIconColor +SearchField.clearIconPressedColor = fade(Actions.GreyInline,80%,lazy) + + +#---- Separator ---- + +Separator.height = 3 +Separator.stripeWidth = 1 +Separator.stripeIndent = 1 +Separator.foreground = shade(@background,15%) + + +#---- Slider ---- + +Slider.focusInsets = 0,0,0,0 +Slider.trackWidth = 2 +Slider.thumbSize = 12,12 +Slider.focusWidth = 4 +Slider.trackValueColor = @accentSliderColor +Slider.trackColor = darken(@background,18%) +Slider.thumbColor = $Slider.trackValueColor +Slider.tickColor = @disabledForeground +Slider.focusedColor = fade(changeLightness($Component.focusColor,75%,derived),50%,derived) +Slider.hoverThumbColor = darken($Slider.thumbColor,5%,derived) +Slider.pressedThumbColor = darken($Slider.thumbColor,8%,derived) +Slider.disabledTrackColor = darken(@background,13%) +Slider.disabledThumbColor = $Slider.disabledTrackColor + + +#---- Spinner ---- + +Spinner.border = com.formdev.flatlaf.ui.FlatRoundBorder +Spinner.background = @componentBackground +Spinner.buttonBackground = darken($Spinner.background,2%) +Spinner.buttonSeparatorColor = $Component.borderColor +Spinner.buttonDisabledSeparatorColor = $Component.disabledBorderColor +Spinner.buttonArrowColor = @buttonArrowColor +Spinner.buttonDisabledArrowColor = @buttonDisabledArrowColor +Spinner.buttonHoverArrowColor = @buttonHoverArrowColor +Spinner.buttonPressedArrowColor = @buttonPressedArrowColor +Spinner.padding = @componentMargin +Spinner.editorBorderPainted = false +# allowed values: button or none +Spinner.buttonStyle = button + + +#---- SplitPane ---- + +SplitPane.dividerSize = 5 +SplitPane.continuousLayout = true +SplitPane.border = null +SplitPane.centerOneTouchButtons = true +SplitPane.oneTouchButtonSize = {scaledInteger}6 +SplitPane.oneTouchButtonOffset = {scaledInteger}2 + +SplitPaneDivider.border = null +SplitPaneDivider.oneTouchArrowColor = @buttonArrowColor +SplitPaneDivider.oneTouchHoverArrowColor = @buttonHoverArrowColor +SplitPaneDivider.oneTouchPressedArrowColor = @buttonPressedArrowColor +# allowed values: grip or plain +SplitPaneDivider.style = grip +SplitPaneDivider.gripColor = @icon +SplitPaneDivider.gripDotCount = 3 +SplitPaneDivider.gripDotSize = 3 +SplitPaneDivider.gripGap = 2 +SplitPaneDivider.draggingColor = $Component.borderColor + + +#---- TabbedPane ---- + +TabbedPane.tabHeight = 32 +TabbedPane.tabSelectionHeight = 3 +TabbedPane.cardTabSelectionHeight = 3 +TabbedPane.tabArc = 0 +TabbedPane.tabSelectionArc = 0 +TabbedPane.cardTabArc = 12 +TabbedPane.selectedInsets = 0,0,0,0 +TabbedPane.tabSelectionInsets = 0,0,0,0 +TabbedPane.contentSeparatorHeight = 1 +TabbedPane.showTabSeparators = false +TabbedPane.tabSeparatorsFullHeight = false +TabbedPane.hasFullBorder = false +TabbedPane.tabInsets = 4,12,4,12 +TabbedPane.tabAreaInsets = 0,0,0,0 +TabbedPane.selectedTabPadInsets = 0,0,0,0 +TabbedPane.tabRunOverlay = 0 +TabbedPane.tabsOverlapBorder = false +TabbedPane.disabledForeground = @disabledForeground +TabbedPane.shadow = @background +TabbedPane.contentBorderInsets = null +# allowed values: moreTabsButton or arrowButtons +TabbedPane.hiddenTabsNavigation = moreTabsButton +# allowed values: leading, trailing, center or fill +TabbedPane.tabAreaAlignment = leading +# allowed values: leading, trailing or center +TabbedPane.tabAlignment = center +# allowed values: preferred, equal or compact +TabbedPane.tabWidthMode = preferred + +# allowed values: underlined or card +TabbedPane.tabType = underlined + +# allowed values: chevron or triangle +TabbedPane.arrowType = chevron +TabbedPane.buttonInsets = 2,1,2,1 +TabbedPane.buttonArc = $Button.arc + +# allowed values: wrap or scroll +#TabbedPane.tabLayoutPolicy = scroll +# allowed values: never or asNeeded +TabbedPane.tabsPopupPolicy = asNeeded +# allowed values: never, asNeeded or asNeededSingle +TabbedPane.scrollButtonsPolicy = asNeededSingle +# allowed values: both or trailing +TabbedPane.scrollButtonsPlacement = both + +TabbedPane.closeIcon = com.formdev.flatlaf.icons.FlatTabbedPaneCloseIcon +TabbedPane.closeSize = 16,16 +TabbedPane.closeArc = 4 +TabbedPane.closeCrossPlainSize = 7.5 +TabbedPane.closeCrossFilledSize = $TabbedPane.closeCrossPlainSize +TabbedPane.closeCrossLineWidth = 1 + +TabbedPane.underlineColor = @accentUnderlineColor +TabbedPane.inactiveUnderlineColor = mix(@accentUnderlineColor,$TabbedPane.background,50%) +TabbedPane.disabledUnderlineColor = darken(@background,28%) +TabbedPane.hoverColor = darken($TabbedPane.background,7%,derived) +TabbedPane.focusColor = mix(@selectionBackground,$TabbedPane.background,10%) +TabbedPane.contentAreaColor = $Component.borderColor + +TabbedPane.buttonHoverBackground = darken($TabbedPane.background,7%,derived) +TabbedPane.buttonPressedBackground = darken($TabbedPane.background,10%,derived) + +TabbedPane.closeBackground = null +TabbedPane.closeForeground = @disabledForeground +TabbedPane.closeHoverBackground = darken($TabbedPane.background,20%,derived) +TabbedPane.closeHoverForeground = @foreground +TabbedPane.closePressedBackground = darken($TabbedPane.background,25%,derived) +TabbedPane.closePressedForeground = $TabbedPane.closeHoverForeground + + +#---- Table ---- + +Table.rowHeight = 20 +Table.showHorizontalLines = false +Table.showVerticalLines = false +Table.showTrailingVerticalLine = false +Table.consistentHomeEndKeyBehavior = true +Table.intercellSpacing = 0,0 +Table.scrollPaneBorder = com.formdev.flatlaf.ui.FlatBorder +Table.ascendingSortIcon = com.formdev.flatlaf.icons.FlatAscendingSortIcon +Table.descendingSortIcon = com.formdev.flatlaf.icons.FlatDescendingSortIcon +Table.sortIconColor = @icon +Table.cellMargins = 2,3,2,3 +Table.cellFocusColor = @cellFocusColor +Table.cellNoFocusBorder = com.formdev.flatlaf.ui.FlatTableCellBorder$Default +Table.focusCellHighlightBorder = com.formdev.flatlaf.ui.FlatTableCellBorder$Focused +Table.focusSelectedCellHighlightBorder = com.formdev.flatlaf.ui.FlatTableCellBorder$Selected +Table.focusCellBackground = $Table.background +Table.focusCellForeground = $Table.foreground +Table.background = @componentBackground +Table.selectionInactiveBackground = @selectionInactiveBackground +Table.selectionInactiveForeground = @selectionInactiveForeground +Table.dropCellBackground = @dropCellBackground +Table.dropCellForeground = @dropCellForeground +Table.dropLineColor = @dropLineColor +Table.dropLineShortColor = @dropLineShortColor +Table.gridColor = darken($Table.background,8%) + + +#---- TableHeader ---- + +TableHeader.height = 25 +TableHeader.cellBorder = com.formdev.flatlaf.ui.FlatTableHeaderBorder +TableHeader.cellMargins = 2,3,2,3 +TableHeader.focusCellBackground = $TableHeader.background +TableHeader.background = @componentBackground +TableHeader.showTrailingVerticalLine = false +TableHeader.hoverBackground = darken($TableHeader.background,5%,derived) +TableHeader.pressedBackground = darken($TableHeader.background,10%,derived) +TableHeader.separatorColor = darken($TableHeader.background,10%) +TableHeader.bottomSeparatorColor = $TableHeader.separatorColor + + +#---- TextArea ---- + +TextArea.border = com.formdev.flatlaf.ui.FlatMarginBorder +TextArea.margin = @componentMargin +TextArea.background = @componentBackground + + +#---- TextComponent ---- + +# allowed values: never, once or always +TextComponent.selectAllOnFocusPolicy = once +TextComponent.selectAllOnMouseClick = false +TextComponent.arc = 0 + + +#---- TextField ---- + +TextField.border = com.formdev.flatlaf.ui.FlatTextBorder +TextField.margin = @componentMargin +TextField.background = @componentBackground +TextField.placeholderForeground = @disabledForeground +TextField.iconTextGap = 4 + + +#---- TextPane ---- + +TextPane.border = com.formdev.flatlaf.ui.FlatMarginBorder +TextPane.margin = @componentMargin +TextPane.background = @componentBackground + + +#---- TitledBorder ---- + +TitledBorder.titleColor = @foreground +TitledBorder.border = 1,1,1,1,$Separator.foreground + +#---- TitlePane ---- + +TitlePane.useWindowDecorations = true +TitlePane.menuBarEmbedded = true +TitlePane.unifiedBackground = true +TitlePane.showIcon = true +TitlePane.showIconInDialogs = true +TitlePane.noIconLeftGap = 8 +TitlePane.iconSize = 16,16 +TitlePane.iconMargins = 3,8,3,8 +TitlePane.titleMargins = 3,0,3,0 +TitlePane.titleMinimumWidth = 60 +TitlePane.buttonSize = 44,30 +TitlePane.buttonMinimumWidth = 30 +TitlePane.buttonMaximizedHeight = 22 +TitlePane.buttonSymbolHeight = 10 +TitlePane.centerTitle = false +TitlePane.centerTitleIfMenuBarEmbedded = true +TitlePane.showIconBesideTitle = false +TitlePane.menuBarTitleGap = 40 +TitlePane.menuBarTitleMinimumGap = 12 +TitlePane.menuBarResizeHeight = 4 +TitlePane.closeIcon = com.formdev.flatlaf.icons.FlatWindowCloseIcon +TitlePane.iconifyIcon = com.formdev.flatlaf.icons.FlatWindowIconifyIcon +TitlePane.maximizeIcon = com.formdev.flatlaf.icons.FlatWindowMaximizeIcon +TitlePane.restoreIcon = com.formdev.flatlaf.icons.FlatWindowRestoreIcon + +TitlePane.background = $MenuBar.background +TitlePane.inactiveBackground = $TitlePane.background +TitlePane.foreground = @foreground +TitlePane.inactiveForeground = @disabledForeground + +TitlePane.closeHoverBackground = #c42b1c +TitlePane.closePressedBackground = fade($TitlePane.closeHoverBackground,90%) +TitlePane.closeHoverForeground = #fff +TitlePane.closePressedForeground = #fff + +# window style "small" +TitlePane.small.font = -1 +TitlePane.small.showIcon = false +TitlePane.small.buttonSize = 30,20 +TitlePane.small.buttonSymbolHeight = 8 +TitlePane.small.closeIcon = com.formdev.flatlaf.icons.FlatWindowCloseIcon, small +TitlePane.small.iconifyIcon = com.formdev.flatlaf.icons.FlatWindowIconifyIcon, small +TitlePane.small.maximizeIcon = com.formdev.flatlaf.icons.FlatWindowMaximizeIcon, small +TitlePane.small.restoreIcon = com.formdev.flatlaf.icons.FlatWindowRestoreIcon, small + +TitlePane.embeddedForeground = lighten($TitlePane.foreground,35%) +TitlePane.buttonHoverBackground = darken($TitlePane.background,10%,derived) +TitlePane.buttonPressedBackground = darken($TitlePane.background,8%,derived) + + +#---- ToggleButton ---- + +ToggleButton.border = $Button.border +ToggleButton.margin = $Button.margin +ToggleButton.iconTextGap = $Button.iconTextGap +ToggleButton.rollover = $Button.rollover + +ToggleButton.background = $Button.background +ToggleButton.pressedBackground = $Button.pressedBackground +ToggleButton.selectedForeground = $ToggleButton.foreground + +ToggleButton.toolbar.hoverBackground = $Button.toolbar.hoverBackground +ToggleButton.toolbar.pressedBackground = $Button.toolbar.pressedBackground + +# button type "tab" +ToggleButton.tab.underlineHeight = 0 +ToggleButton.tab.underlineColor = $TabbedPane.underlineColor +ToggleButton.tab.disabledUnderlineColor = $TabbedPane.disabledUnderlineColor +ToggleButton.tab.selectedBackground = #FFFFFF +ToggleButton.tab.selectedForeground = $?TabbedPane.selectedForeground +ToggleButton.tab.hoverBackground = $TabbedPane.hoverColor +ToggleButton.tab.focusBackground = #FFFFFF +ToggleButton.tab.arc = $Component.arc + +ToggleButton.selectedBackground = darken($ToggleButton.background,20%,derived) +ToggleButton.disabledSelectedBackground = darken($ToggleButton.background,13%,derived) + +ToggleButton.toolbar.selectedBackground = $ToggleButton.selectedBackground + +#---- HeadGroup ---- +HeadGroup.background= #E9ECF1 +HeadGroup.arc= $Component.arc + +#---- ToolBar ---- + +ToolBar.border = com.formdev.flatlaf.ui.FlatToolBarBorder +ToolBar.borderMargins = 2,2,2,2 +ToolBar.isRollover = true +ToolBar.focusableButtons = false +ToolBar.arrowKeysOnlyNavigation = true +ToolBar.hoverButtonGroupArc = 8 +ToolBar.floatable = false +ToolBar.gripColor = @icon +ToolBar.dockingBackground = darken($ToolBar.background,5%) +ToolBar.dockingForeground = $Component.borderColor +ToolBar.floatingBackground = $ToolBar.background +ToolBar.floatingForeground = $Component.borderColor + +ToolBar.separatorSize = null +ToolBar.separatorWidth = 7 +ToolBar.separatorColor = $Separator.foreground + +# not used in FlatLaf; intended for custom components in toolbar +# https://github.com/JFormDesigner/FlatLaf/issues/56#issuecomment-586297814 +ToolBar.spacingBorder = $Button.toolbar.spacingInsets + +ToolBar.hoverButtonGroupBackground = darken($ToolBar.background,3%,derived) + + +#---- ToolTipManager ---- + +ToolTipManager.enableToolTipMode = activeApplication + + +#---- ToolTip ---- + +ToolTip.borderCornerRadius = $Popup.borderCornerRadius +ToolTip.border = 4,6,4,6,shade(@background,40%) +ToolTip.background = lighten(@background,3%) + + +#---- Tree ---- + +Tree.border = 1,1,1,1 +Tree.editorBorder = 1,1,1,1,@cellFocusColor +Tree.background = @componentBackground +Tree.selectionInactiveBackground = @selectionInactiveBackground +Tree.selectionInactiveForeground = @selectionInactiveForeground +Tree.textBackground = $Tree.background +Tree.textForeground = $Tree.foreground +Tree.selectionBorderColor = @cellFocusColor +Tree.dropCellBackground = @dropCellBackground +Tree.dropCellForeground = @dropCellForeground +Tree.dropLineColor = @dropLineColor +Tree.rendererFillBackground = false +Tree.rendererMargins = 1,2,1,2 +Tree.selectionInsets = 0,0,0,0 +Tree.selectionArc = 0 +Tree.wideSelection = true +Tree.repaintWholeRow = true +Tree.paintLines = false +Tree.showCellFocusIndicator = false +Tree.showDefaultIcons = false +Tree.leftChildIndent = 7 +Tree.rightChildIndent = 11 +Tree.rowHeight = 0 + +Tree.expandedIcon = com.formdev.flatlaf.icons.FlatTreeExpandedIcon +Tree.collapsedIcon = com.formdev.flatlaf.icons.FlatTreeCollapsedIcon +Tree.leafIcon = com.formdev.flatlaf.icons.FlatTreeLeafIcon +Tree.closedIcon = com.formdev.flatlaf.icons.FlatTreeClosedIcon +Tree.openIcon = com.formdev.flatlaf.icons.FlatTreeOpenIcon + +Tree.icon.expandedColor = @icon +Tree.icon.collapsedColor = @icon +Tree.icon.leafColor = @icon +Tree.icon.closedColor = @icon +Tree.icon.openColor = @icon +Tree.hash = darken($Tree.background,10%) + +#---- East ---- +East.border = #E9EDF2 + +#---- Styles ------------------------------------------------------------------ + +#---- inTextField ---- +# for leading/trailing components in text fields + +[style]ToggleButton.inTextField = $[style]Button.inTextField + +[style]ToolBar.inTextField = \ + floatable: false; \ + opaque: false; \ + borderMargins: 0,0,0,0 + +[style]ToolBarSeparator.inTextField = \ + separatorWidth: 3 + +[style]Button.inTextField = \ + focusable: false; \ + toolbar.margin: 1,1,1,1; \ + toolbar.spacingInsets: 1,1,1,1; \ + toolbar.hoverBackground: darken($TextField.background,4%); \ + toolbar.pressedBackground: darken($TextField.background,8%); \ + toolbar.selectedBackground: darken($TextField.background,12%) + +#---- clearButton ---- +# for clear/cancel button in text fields + +[style]Button.clearButton = \ + icon: com.formdev.flatlaf.icons.FlatClearIcon; \ + focusable: false; \ + toolbar.margin: 1,1,1,1; \ + toolbar.spacingInsets: 1,1,1,1; \ + toolbar.hoverBackground: null; \ + toolbar.pressedBackground: null \ No newline at end of file diff --git a/designer-chart/build.chart.gradle b/designer-chart/build.chart.gradle index 806b92aaba..943404fc84 100644 --- a/designer-chart/build.chart.gradle +++ b/designer-chart/build.chart.gradle @@ -63,7 +63,7 @@ dependencies{ compile fileTree(dir:"../${baseDir}/lib-core",include:'**/*.jar') compile fileTree(dir:"../${baseDir}/lib-design",include:'**/*.jar') compile fileTree(dir:"../${baseDir}",include:"**/build/libs/*.jar",exclude:"bi/**/*.jar") - testCompile 'junit:junit:4.12' + testImplementation 'junit:junit:4.12' } //复制非.java文件到classes文件夹下参与打包 task copyFile(type:Copy,dependsOn:compileJava){ diff --git a/designer-chart/build.gradle b/designer-chart/build.gradle index e59f9ef2f8..3d646c1b93 100644 --- a/designer-chart/build.gradle +++ b/designer-chart/build.gradle @@ -1,3 +1,3 @@ dependencies { - compile project(':designer-base') + api project(':designer-base') } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartEditPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartEditPane.java index 6064ef89d0..0589ad8321 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartEditPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartEditPane.java @@ -102,7 +102,6 @@ public class ChartEditPane extends BasicPane implements AttributeChange, Prepare } } }; - tabsHeaderIconPane.setNeedLeftRightOutLine(false); this.add(tabsHeaderIconPane, BorderLayout.NORTH); this.add(center, BorderLayout.CENTER); } diff --git a/designer-form/build.form.gradle b/designer-form/build.form.gradle index 42b16b0208..ec55d54d49 100644 --- a/designer-form/build.form.gradle +++ b/designer-form/build.form.gradle @@ -66,7 +66,7 @@ dependencies{ compile fileTree(dir:"../${baseDir}/lib-core",include:"**/*.jar") compile fileTree(dir:"../${baseDir}/lib-design",include:'**/*.jar') compile fileTree(dir:"../${baseDir}",include:"**/build/libs/*.jar",exclude:"bi/**/*.jar") - testCompile 'junit:junit:4.12' + testImplementation 'junit:junit:4.12' } //复制非.java文件到classes文件夹下参与打包 diff --git a/designer-form/build.gradle b/designer-form/build.gradle index e59f9ef2f8..3d646c1b93 100644 --- a/designer-form/build.gradle +++ b/designer-form/build.gradle @@ -1,3 +1,3 @@ dependencies { - compile project(':designer-base') + api project(':designer-base') } diff --git a/designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java b/designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java index 5aad58379c..0e344e083f 100644 --- a/designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java +++ b/designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java @@ -1,7 +1,5 @@ package com.fr.design.designer.treeview; -import com.fr.base.BaseUtils; -import com.fr.design.constants.UIConstants; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XCreatorUtils; import com.fr.log.FineLoggerFactory; @@ -38,7 +36,7 @@ public class ComponentTreeCellRenderer extends DefaultTreeCellRenderer { this.treeCellRender = ((XCreator) value).getComponentTreeCellRender(); } this.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0)); - this.setBackgroundNonSelectionColor(UIConstants.TREE_BACKGROUND); + this.setBackgroundNonSelectionColor(getBackground()); return this; } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java b/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java index 0c86493485..4cd6072225 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java @@ -14,9 +14,7 @@ import com.fr.design.gui.itree.UITreeUI; import com.fr.design.utils.ComponentUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.StringUtils; -import java.awt.Rectangle; -import java.util.Stack; -import java.util.function.Consumer; + import javax.swing.BorderFactory; import javax.swing.DropMode; import javax.swing.JPanel; @@ -27,12 +25,12 @@ import javax.swing.tree.TreeCellRenderer; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import java.awt.BorderLayout; -import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Point; +import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; @@ -42,6 +40,8 @@ import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Stack; +import java.util.function.Consumer; public class ComponentTree extends JTree { @@ -56,7 +56,7 @@ public class ComponentTree extends JTree { public ComponentTree(FormDesigner designer) { this.designer = designer; - this.setBackground(UIConstants.TREE_BACKGROUND); +// this.setBackground(UIConstants.TREE_BACKGROUND); setRootVisible(true); setCellRenderer(new ComponentTreeCellRenderer()); getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); @@ -66,7 +66,7 @@ public class ComponentTree extends JTree { this.refreshTreeRoot(); initListeners(); setEditable(true); - setUI(uiTreeUI); +// setUI(uiTreeUI); setBorder(BorderFactory.createEmptyBorder(PADDING_TOP, PADDING_LEFT, 0, 0)); } @@ -162,7 +162,7 @@ public class ComponentTree extends JTree { */ public void refreshUI() { updateUI(); - setUI(uiTreeUI); +// setUI(uiTreeUI); } @@ -525,7 +525,7 @@ public class ComponentTree extends JTree { PopupPreviewPane() { contentPane = new JPanel(); - contentPane.setBackground(Color.white); +// contentPane.setBackground(Color.white); this.setLayout(new BorderLayout()); this.add(contentPane, BorderLayout.CENTER); this.setOpaque(false); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java b/designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java index fdb8881c70..17f07cdee6 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java @@ -10,7 +10,6 @@ import com.fr.design.designer.creator.XWParameterLayout; import com.fr.design.designer.treeview.ComponentTreeModel; import com.fr.design.gui.controlpane.ShortCut4JControlPane; import com.fr.design.gui.icontainer.UIScrollPane; -import com.fr.design.gui.itoolbar.UIToolBarUI; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.menu.ShortCut; @@ -20,14 +19,10 @@ import com.fr.design.parameter.HierarchyTreePane; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.Icon; -import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.SwingUtilities; import java.awt.BorderLayout; -import java.awt.Color; import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; import java.util.ArrayList; @@ -179,14 +174,14 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree private JPanel getToolBarPane() { UIToolbar toolBar = ToolBarDef.createJToolBar(); - toolBar.setUI(new UIToolBarUI() { - @Override - public void paint(Graphics g, JComponent c) { - Graphics2D g2 = (Graphics2D) g; - g2.setColor(new Color(245, 245, 247)); - g2.fillRect(0, 0, c.getWidth(), c.getHeight()); - } - }); +// toolBar.setUI(new UIToolBarUI() { +// @Override +// public void paint(Graphics g, JComponent c) { +// Graphics2D g2 = (Graphics2D) g; +// g2.setColor(new Color(245, 245, 247)); +// g2.fillRect(0, 0, c.getWidth(), c.getHeight()); +// } +// }); for (int i = 0; i < shorts.length; i++) { if (i == SHORTS_SEPARATOR_POS) { toolBar.addSeparator(new Dimension(2, 16)); 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 e61e8a600e..8abb9d81cf 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 @@ -251,9 +251,9 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper List uiHeads = new ArrayList(){ private static final long serialVersionUID = -2456634893793575347L; { - add(new UIHead(tabTitles[0], 0)); - add(new UIHead(tabTitles[1], 1, !designer.isMultiSelection())); - add(new UIHead(tabTitles[2], 2, !designer.isMultiSelection())); + add(new UIHead(tabTitles[0])); + add(new UIHead(tabTitles[1], !designer.isMultiSelection())); + add(new UIHead(tabTitles[2], !designer.isMultiSelection())); } }; @@ -282,7 +282,6 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper tabbedPane.show(center, tabTitles[index]); } }; - tabsHeaderIconPane.setNeedLeftRightOutLine(true); tabsHeaderIconPane.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, UIConstants.SHADOW_GREY)); this.add(tabsHeaderIconPane, BorderLayout.NORTH); } diff --git a/designer-realize/build.gradle b/designer-realize/build.gradle index ffb6823e88..d926d5cfe3 100644 --- a/designer-realize/build.gradle +++ b/designer-realize/build.gradle @@ -1,4 +1,4 @@ dependencies { - compile project(':designer-form') - compile project(':designer-chart') + api project(':designer-form') + api project(':designer-chart') } diff --git a/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollBar.java b/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollBar.java index 0a61436564..3476b08740 100644 --- a/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollBar.java +++ b/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollBar.java @@ -3,19 +3,19 @@ */ package com.fr.design.cell.bar; -import java.awt.Adjustable; -import java.awt.Dimension; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; - -import javax.accessibility.AccessibleContext; -import javax.swing.*; - import com.fr.base.DynamicUnitList; import com.fr.design.mainframe.ElementCasePane; import com.fr.grid.GridUtils; import com.fr.report.ReportHelper; +import javax.accessibility.AccessibleContext; +import javax.swing.BoundedRangeModel; +import javax.swing.JScrollBar; +import java.awt.Adjustable; +import java.awt.Dimension; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; + /** * ScrollBar change its max value dynamically. */ @@ -99,9 +99,9 @@ public class DynamicScrollBar extends JScrollBar { } - public void updateUI() { - setUI(new DynamicScrollBarUI()); - } +// public void updateUI() { +// setUI(new DynamicScrollBarUI()); +// } @Override public void setValue(int value) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ReportFloatPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/ReportFloatPane.java index 2e034076fc..73f8aabba2 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ReportFloatPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ReportFloatPane.java @@ -12,9 +12,12 @@ import com.fr.design.layout.TableLayoutHelper; import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.MenuDef; - -import javax.swing.*; -import java.awt.*; +import javax.swing.BorderFactory; +import javax.swing.JComponent; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; /** * 悬浮元素 @@ -92,11 +95,11 @@ public class ReportFloatPane extends JPanel { private UIButton createButtonUI() { UIButton createdButton = insertFloatMenu.createUIButton(); // 此按钮单独抽出,不应使用工具栏外观 - if (!createdButton.isOpaque()) { - createdButton.setOpaque(true); - createdButton.setNormalPainted(true); - createdButton.setBorderPaintedOnlyWhenPressed(false); - } +// if (!createdButton.isOpaque()) { +// createdButton.setOpaque(true); +// createdButton.setNormalPainted(true); +// createdButton.setBorderPaintedOnlyWhenPressed(false); +// } return createdButton; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java index 661c1f7bf1..c971264b9b 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java @@ -13,13 +13,11 @@ import com.fr.design.dialog.FineJOptionPane; import com.fr.design.event.RemoveListener; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.ibutton.UIButtonUI; import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; import com.fr.design.roleAuthority.ReportAndFSManagePane; import com.fr.design.roleAuthority.RolesAlreadyEditedPane; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; import com.fr.main.impl.WorkBook; @@ -167,18 +165,18 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse return new Dimension(super.getPreferredSize().width, TOOLBAR_HEIGHT); } }; - leftButton.setUI(new UIButtonUI() { - @Override - protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) { - if (isPressed(b) && b.isPressedPainted()) { - GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), UIConstants.PROPERTY_PANE_BACKGROUND); - } else if (isRollOver(b)) { - GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), UIConstants.PROPERTY_PANE_BACKGROUND); - } else if (b.isNormalPainted()) { - GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted()); - } - } - }); +// leftButton.setUI(new UIButtonUI() { +// @Override +// protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) { +// if (isPressed(b) && b.isPressedPainted()) { +// GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), UIConstants.PROPERTY_PANE_BACKGROUND); +// } else if (isRollOver(b)) { +// GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), UIConstants.PROPERTY_PANE_BACKGROUND); +// } else if (b.isNormalPainted()) { +// GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted()); +// } +// } +// }); leftButton.set4ToolbarButton(); leftButton.setDisabledIcon(DISABLED_LEFT_ICON); rightButton = new UIButton(RIGHT_ICON) { @@ -187,18 +185,18 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse return new Dimension(super.getPreferredSize().width, TOOLBAR_HEIGHT); } }; - rightButton.setUI(new UIButtonUI() { - @Override - protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) { - if (isPressed(b) && b.isPressedPainted()) { - GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), UIConstants.PROPERTY_PANE_BACKGROUND); - } else if (isRollOver(b)) { - GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), UIConstants.PROPERTY_PANE_BACKGROUND); - } else if (b.isNormalPainted()) { - GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted()); - } - } - }); +// rightButton.setUI(new UIButtonUI() { +// @Override +// protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) { +// if (isPressed(b) && b.isPressedPainted()) { +// GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), UIConstants.PROPERTY_PANE_BACKGROUND); +// } else if (isRollOver(b)) { +// GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), UIConstants.PROPERTY_PANE_BACKGROUND); +// } else if (b.isNormalPainted()) { +// GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted()); +// } +// } +// }); rightButton.set4ToolbarButton(); rightButton.setDisabledIcon(DISABLED_RIGHT_ICON); buttonPane = new JPanel(new BorderLayout(3, 0)); @@ -452,7 +450,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse if (isNeedPaintAuthority) { g2d.setPaint(new GradientPaint(1, 1, UIConstants.AUTHORITY_SHEET_LIGHT, 1, getHeight() - 1, UIConstants.AUTHORITY_SHEET_DARK)); } else { - g2d.setPaint(new GradientPaint(1, 1, Color.WHITE, 1, getHeight() - 1, Color.WHITE)); + g2d.setPaint(new GradientPaint(1, 1, getBackground(), 1, getHeight() - 1, getBackground())); } GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, x.length); generalPath.moveTo((float) x[0], (float) y[0]); @@ -488,7 +486,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse if (isNeedPaintAuthority) { g2d.setPaint(UIConstants.AUTHORITY_SHEET_UNSELECTED); } else{ - g2d.setPaint(tabBackground); + g2d.setPaint(getBackground()); } GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, x.length); generalPath.moveTo((float) x[0], (float) y[0]); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java index 55580d304e..54f5bf381b 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java @@ -3,12 +3,9 @@ package com.fr.design.mainframe.alphafine.component; import com.fr.base.svg.IconUtils; import com.fr.design.actions.help.alphafine.AlphaFineContext; import com.fr.design.actions.help.alphafine.AlphaFineListener; -import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.mainframe.alphafine.AlphaFineHelper; -import com.fr.general.IOUtils; - import java.awt.AWTEvent; import java.awt.BorderLayout; @@ -36,7 +33,6 @@ public class AlphaFinePane extends BasicPane { refreshButton.set4ToolbarButton(); refreshButton.setRolloverEnabled(false); this.add(refreshButton); - this.setBackground(UIConstants.TEMPLATE_TAB_PANE_BACKGROUND); refreshButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/question/QuestionWindow.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/question/QuestionWindow.java index e5d9edfec2..9fa3d293fe 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/question/QuestionWindow.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/question/QuestionWindow.java @@ -4,14 +4,14 @@ import com.fr.design.DesignerEnvManager; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.alphafine.AlphaFineHelper; -import java.awt.Color; + +import javax.swing.JWindow; import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; -import javax.swing.JWindow; /** * @author hades @@ -25,7 +25,8 @@ public class QuestionWindow extends JWindow { private int pressX; private int pressY; private QuestionWindow() { - this.setBackground(new Color(0, 0, 0, 0)); +// this.setBackground(new Color(0, 0, 0, 0)); + this.setOpacity(0); questionPane.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/CellElementEditPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/CellElementEditPane.java index 4205ea152c..34c4ea8e18 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/CellElementEditPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/CellElementEditPane.java @@ -76,7 +76,6 @@ public class CellElementEditPane extends BasicPane { } } }; - tabsHeaderIconPane.setNeedLeftRightOutLine(false); downTitle = new JPanel(); downTitle.setLayout(new BorderLayout()); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/guide/GuideRegister.java b/designer-realize/src/main/java/com/fr/design/mainframe/guide/GuideRegister.java index 537051153e..705e9b031f 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/guide/GuideRegister.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/guide/GuideRegister.java @@ -3,7 +3,6 @@ package com.fr.design.mainframe.guide; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.guide.base.GuideGroup; import com.fr.design.mainframe.guide.base.GuideManager; -import com.fr.design.mainframe.guide.collect.GuideCollector; import com.fr.design.mainframe.guide.creator.layout.ChangeLayoutComponentGuide; import com.fr.design.mainframe.guide.creator.layout.UseLayoutAndComponentGuide; import com.fr.design.mainframe.guide.creator.theme.DownloadComponentPackageGuide; @@ -11,10 +10,10 @@ import com.fr.design.mainframe.guide.creator.theme.ThemeToggleGuide; public class GuideRegister { public static void register() { - GuideCollector.getInstance().loadFromFile(); - GuideManager.getInstance().clearAll(); - registerGroup(); - registerGuide(); +// GuideCollector.getInstance().loadFromFile(); +// GuideManager.getInstance().clearAll(); +// registerGroup(); +// registerGuide(); } private static void registerGroup() { diff --git a/designer-realize/src/main/java/com/fr/design/webattr/SettingToolBar.java b/designer-realize/src/main/java/com/fr/design/webattr/SettingToolBar.java index 24f5bd190d..5a97f75eff 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/SettingToolBar.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/SettingToolBar.java @@ -1,22 +1,19 @@ package com.fr.design.webattr; -import java.awt.Color; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import com.fr.base.BaseUtils; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Icon; -import com.fr.design.gui.ilable.UILabel; import javax.swing.JPanel; - -import com.fr.base.BaseUtils; -import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.mainframe.DesignerContext; -import com.fr.design.dialog.BasicDialog; -import com.fr.design.dialog.DialogActionAdapter; - -import com.fr.design.utils.gui.GUICoreUtils; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; public class SettingToolBar extends JPanel { private Icon setIcon = BaseUtils.readIcon("com/fr/design/images/toolbarbtn/toolbarbtnsetting.png"); @@ -27,7 +24,7 @@ public class SettingToolBar extends JPanel { public SettingToolBar(String name,ToolBarPane toolBarPane) { super(); - this.setBackground(Color.lightGray); +// this.setBackground(Color.lightGray); this.add(new UILabel(name)); this.toolBarPane = toolBarPane; setButton = GUICoreUtils.createTransparentButton(setIcon, setIcon, setIcon); diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java index a8cd06a9b3..868475b524 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java @@ -27,7 +27,6 @@ import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumnModel; import java.awt.BorderLayout; -import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; @@ -88,7 +87,7 @@ public class ToolBarDragPane extends WidgetToolBarPane { northToolBar = new ToolBarPane(); northToolBar.setPreferredSize(new Dimension(ImageObserver.WIDTH, 26)); - northToolBar.setBackground(Color.lightGray); +// northToolBar.setBackground(Color.lightGray); UIButton topButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/arrow/arrow_up.png")); topButton.setBorder(null); @@ -142,29 +141,29 @@ public class ToolBarDragPane extends WidgetToolBarPane { initLayoutTable(); JPanel center = FRGUIPaneFactory.createBorderLayout_S_Pane(); - center.setBackground(Color.WHITE); +// center.setBackground(Color.WHITE); center.add(topButton, BorderLayout.NORTH); JPanel small = FRGUIPaneFactory.createBorderLayout_S_Pane(); - small.setBackground(Color.WHITE); +// small.setBackground(Color.WHITE); small.add(new UILabel(StringUtils.BLANK), BorderLayout.NORTH); small.add(layoutTable, BorderLayout.CENTER); center.add(small, BorderLayout.CENTER); center.add(downButton, BorderLayout.SOUTH); southToolBar = new ToolBarPane(); southToolBar.setPreferredSize(new Dimension(ImageObserver.WIDTH, 26)); - southToolBar.setBackground(Color.lightGray); +// southToolBar.setBackground(Color.lightGray); JPanel movePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); JPanel northContentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); SettingToolBar top = new SettingToolBar(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ToolBar_Top"), northToolBar); northContentPane.add(top, BorderLayout.EAST); northContentPane.add(northToolBar, BorderLayout.CENTER); - northContentPane.setBackground(Color.lightGray); +// northContentPane.setBackground(Color.lightGray); JPanel southContentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); SettingToolBar bottom = new SettingToolBar(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ToolBar_Bottom"), southToolBar); southContentPane.add(bottom, BorderLayout.EAST); southContentPane.add(southToolBar, BorderLayout.CENTER); - southContentPane.setBackground(Color.lightGray); +// southContentPane.setBackground(Color.lightGray); movePane.add(northContentPane, BorderLayout.NORTH); movePane.add(center, BorderLayout.CENTER); @@ -180,7 +179,7 @@ public class ToolBarDragPane extends WidgetToolBarPane { layoutTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); layoutTable.setColumnSelectionAllowed(false); layoutTable.setRowSelectionAllowed(false); - layoutTable.setBackground(Color.WHITE); +// layoutTable.setBackground(Color.WHITE); layoutTable.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() > 1 && !(SwingUtilities.isRightMouseButton(e)) && isEnabled) { diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarPane.java index c5acde0a63..eaeb652486 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarPane.java @@ -8,11 +8,9 @@ import com.fr.design.gui.core.WidgetOption; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.form.ui.ToolBar; import com.fr.form.ui.Widget; - import com.fr.report.web.annotation.OldPrintMethod; import javax.swing.BorderFactory; -import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import javax.swing.TransferHandler; import java.awt.Component; @@ -156,7 +154,7 @@ public class ToolBarPane extends BasicBeanPane { this.validate(); this.repaint(); } - this.getFToolBar().setBackground(toolbar.getBackground()); +// this.getFToolBar().setBackground(toolbar.getBackground()); this.getFToolBar().setDefault(toolbar.isDefault()); setPopulateFinished(true); } diff --git a/designer-realize/src/main/java/com/fr/design/widget/CellWidgetCardPane.java b/designer-realize/src/main/java/com/fr/design/widget/CellWidgetCardPane.java index 8928e5fb6f..6dfc1a51d4 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/CellWidgetCardPane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/CellWidgetCardPane.java @@ -105,7 +105,6 @@ public class CellWidgetCardPane extends BasicPane { tabbedPane.show(center, tabTitles[index]); } }; - tabsHeaderIconPane.setNeedLeftRightOutLine(true); tabsHeaderIconPane.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, UIConstants.SHADOW_GREY)); this.add(tabsHeaderIconPane, BorderLayout.NORTH); } diff --git a/designer-realize/src/main/java/com/fr/grid/GridCorner.java b/designer-realize/src/main/java/com/fr/grid/GridCorner.java index 2bbe3d9df0..700fd802dc 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridCorner.java +++ b/designer-realize/src/main/java/com/fr/grid/GridCorner.java @@ -41,13 +41,13 @@ public class GridCorner extends BaseGridComponent { Dimension size = this.getSize(); Rectangle2D rect2D = new Rectangle2D.Double(0, 0, size.getWidth(), size.getHeight()); //paint background. - if (this.getBackground() != null) { - g2d.setPaint(this.getBackground()); +// if (this.getBackground() != null) { +// g2d.setPaint(this.getBackground()); +// GraphHelper.fill(g2d, rect2D); +// } else { + g2d.setPaint(reportPane.getGrid().getBackground()); GraphHelper.fill(g2d, rect2D); - } else { - g2d.setPaint(reportPane.getBackground()); - GraphHelper.fill(g2d, rect2D); - } +// } paintArc(g2d, size, time); diff --git a/designer-realize/src/main/java/com/fr/grid/GridUI.java b/designer-realize/src/main/java/com/fr/grid/GridUI.java index 60fb2c30ad..e0e59e4c4f 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridUI.java +++ b/designer-realize/src/main/java/com/fr/grid/GridUI.java @@ -6,7 +6,6 @@ import com.fr.base.GraphHelper; import com.fr.base.Margin; import com.fr.base.PaperSize; import com.fr.base.Utils; -import com.fr.base.background.ColorBackground; import com.fr.base.background.ImageFileBackground; import com.fr.base.iofile.attr.WatermarkAttr; import com.fr.base.vcs.DesignerMode; @@ -47,11 +46,11 @@ import com.fr.report.stable.ReportConstants; import com.fr.report.stable.ReportSettings; import com.fr.report.worksheet.FormElementCase; import com.fr.report.worksheet.WorkSheet; +import com.fr.script.CalculatorUtils; import com.fr.stable.AssistUtils; import com.fr.stable.ColumnRow; import com.fr.stable.Constants; import com.fr.stable.GraphDrawHelper; -import com.fr.script.CalculatorUtils; import com.fr.stable.unit.FU; import com.fr.stable.unit.UNIT; import com.fr.third.antlr.ANTLRException; @@ -83,6 +82,7 @@ import java.util.List; import java.util.Objects; public class GridUI extends ComponentUI { + private static final String uiClassID = "GridUI"; public static int INVALID_INTEGER = Integer.MIN_VALUE;// 作为不合法的数值. protected Dimension gridSize; @@ -101,8 +101,6 @@ public class GridUI extends ComponentUI { protected List paintCellElementRectangleList = new ArrayList(); protected List paginateLineList = new ArrayList(); // 分页线 protected HashMultimap mergeCellElementTable = HashMultimap.create(); - // 为了画白色的背景. - protected static Background WHITE_Backgorund = ColorBackground.getInstance(Color.WHITE); // CellElementPainter protected CellElementPainter painter = new CellElementPainter(); // Left @@ -122,6 +120,11 @@ public class GridUI extends ComponentUI { private boolean isAuthority = false; + public String getUIClassID() { + return uiClassID; + } + + public GridUI(int resolution) { super(); this.resolution = resolution; diff --git a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java index f93cbfc3d6..9fcdecbe18 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java @@ -168,7 +168,6 @@ public class CellDSColumnEditor extends CellQuickEditor { paneList.get(index).populate(); } }; - tabsHeaderIconPane.setNeedLeftRightOutLine(false); } /** diff --git a/designer-realize/src/main/java/com/fr/start/MainDesigner.java b/designer-realize/src/main/java/com/fr/start/MainDesigner.java index 98a4d4c76e..f02b061343 100644 --- a/designer-realize/src/main/java/com/fr/start/MainDesigner.java +++ b/designer-realize/src/main/java/com/fr/start/MainDesigner.java @@ -1,6 +1,7 @@ package com.fr.start; +import com.fanruan.gui.UiInspector; import com.fr.base.function.UITerminator; import com.fr.base.vcs.DesignerMode; import com.fr.design.DesignerEnvManager; @@ -47,6 +48,7 @@ import com.fr.design.module.DesignModuleFactory; import com.fr.design.monitor.DesignerLifecycleMonitorContext; import com.fr.design.notification.ui.NotificationCenterPane; import com.fr.design.share.SharableManager; +import com.fr.design.ui.util.EdtInvocationManager; import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.DesignUtils; import com.fr.design.utils.DesignerPort; @@ -86,7 +88,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.ArrayList; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; @@ -117,21 +118,21 @@ public class MainDesigner extends BaseDesigner { * @param args 参数 */ public static void main(String[] args) { - + DesignerStartupContext.getRecorder().start(); - + DesignerEnvManager.getEnvManager(); - + startPreload0(); - + DesignerLifecycleMonitorContext.getMonitor().beforeStart(); //启动运行时 FineRuntime.start(); //等 FineRuntime 启动后启动 DeepLinkManager.getInstance().start(args); - + startPreload1(); - + DesignerSubListener.getInstance().start(); EventDispatcher.listen(LifecycleErrorEvent.SELF, new Listener() { @Override @@ -140,7 +141,7 @@ public class MainDesigner extends BaseDesigner { } }); Module designerRoot = ModuleContext.parseRoot("designer-startup.xml"); - + FineLoggerFactory.getLogger().debug("Designer prepared.Time used {} ms", DesignerStartupContext.getRecorder().getTime(TimeUnit.MILLISECONDS)); //传递启动参数 designerRoot.setSingleton(StartupArgs.class, new StartupArgs(args)); @@ -157,24 +158,24 @@ public class MainDesigner extends BaseDesigner { FineLoggerFactory.getLogger().info("Designer started.Time used {} ms", DesignerStartupContext.getRecorder().getTime(TimeUnit.MILLISECONDS)); SwitchForSwingChecker.initThreadMonitoring(); + new UiInspector(); + EdtInvocationManager.installEDTCheckers(); } - + /** * 在 {@link FineRuntime#start()} 运行后 */ private static void startPreload1() { - - CompletableFuture initLookAndFeel = CompletableFuture.runAsync(DesignUtils::initLookAndFeel); - PreLoadService.getInstance().addUIFuture(initLookAndFeel); - + + DesignUtils.initLookAndFeel(); showSplash(); } - + /** * 在 {@link FineRuntime#start()} 运行前 */ private static void startPreload0() { - + PreLoadService.getInstance().addRunnable(() -> { if (DesignUtils.isPortOccupied()) { UITerminator action = new UITerminator() { @@ -189,9 +190,9 @@ public class MainDesigner extends BaseDesigner { } }); } - + private static void showSplash() { - + // 快快显示启动画面 // vito: 这里必须用 wait, 不然会导致莫名其妙的问题 UIUtil.invokeAndWaitIfNeeded(new Runnable() { @@ -202,7 +203,7 @@ public class MainDesigner extends BaseDesigner { } }); } - + /** * 创建新建文件的快捷方式数组。 * @@ -217,6 +218,7 @@ public class MainDesigner extends BaseDesigner { MenuDef newOtherFileMenuDef = new MenuDef(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_M_New_Other_Template")); newOtherFileMenuDef.setIconPath("/com/fr/design/images/buttonicon/new_other"); try { + // todo:菜单 if (DesignModuleFactory.getNewFormAction() != null) { newOtherFileMenuDef.addShortCut((ShortCut) DesignModuleFactory.getNewFormAction().newInstance()); } @@ -250,7 +252,7 @@ public class MainDesigner extends BaseDesigner { menuDef.addShortCut( new WidgetManagerAction() ); - menuDef.addShortCut(new ChartPreStyleAction(), new ChartEmptyDataStyleAction(),new ChartMapEditorAction()); + menuDef.addShortCut(new ChartPreStyleAction(), new ChartEmptyDataStyleAction(), new ChartMapEditorAction()); } insertMenu(menuDef, MenuHandler.SERVER); @@ -501,7 +503,7 @@ public class MainDesigner extends BaseDesigner { return GuideEntryPane.getGuideEntryPane(); } - public Component createNotificationCenterPane(){ + public Component createNotificationCenterPane() { return NotificationCenterPane.getNotificationCenterPane(); } @@ -603,9 +605,9 @@ public class MainDesigner extends BaseDesigner { DesignerInteractionHistory historyCollector = DesignerInteractionHistory.getInstance(); historyCollector.saveXMLFile(); } - + private static SplashStrategy createSplash() { - + OemProcessor oemProcessor = OemHandler.findOem(); if (oemProcessor != null) { SplashStrategy splashStrategy = null; @@ -618,7 +620,7 @@ public class MainDesigner extends BaseDesigner { return splashStrategy; } } - + return new SplashCommon(); } } 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 16a923df37..bbf5e3ee08 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 @@ -18,6 +18,7 @@ import com.fr.decision.webservice.v10.plugin.helper.category.impl.UpmResourceLoa import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.NewFormAction; +import com.fr.design.actions.UpdateAction; import com.fr.design.actions.core.ActionFactory; import com.fr.design.actions.insert.cell.BiasCellAction; import com.fr.design.actions.insert.cell.ChartCellAction; @@ -130,7 +131,6 @@ import com.fr.report.cell.cellattr.core.SubReport; import com.fr.report.cell.cellattr.core.group.DSColumn; import com.fr.report.cell.painter.BiasTextPainter; import com.fr.report.cell.painter.CellImagePainter; -import com.fr.stable.ArrayUtils; import com.fr.stable.ParameterProvider; import com.fr.stable.bridge.StableFactory; import com.fr.stable.os.support.OSBasedAction; @@ -299,38 +299,36 @@ public class DesignerActivator extends Activator implements Prepare { }); } - private static Class[] actionsForInsertCellElement() { + private static Class[] actionsForInsertCellElement() { List> classes = new ArrayList<>(); + classes.add(DSColumnCellAction.class); + classes.add(GeneralCellAction.class); + classes.add(RichTextCellAction.class); + classes.add(FormulaCellAction.class); + classes.add(ChartCellAction.class); + classes.add(ImageCellAction.class); + classes.add(BiasCellAction.class); + classes.add(SubReportCellAction.class); Set providers = ExtraDesignClassManager.getInstance().getArray(ElementUIProvider.MARK_STRING); for (ElementUIProvider provider : providers) { classes.add(provider.actionForInsertCellElement()); } - return ArrayUtils.addAll(new Class[]{ - DSColumnCellAction.class, - GeneralCellAction.class, - RichTextCellAction.class, - FormulaCellAction.class, - ChartCellAction.class, - ImageCellAction.class, - BiasCellAction.class, - SubReportCellAction.class - }, classes.toArray(new Class[classes.size()])); + return classes.toArray(new Class[0]); } - private static Class[] actionsForInsertFloatElement() { - List> classes = new ArrayList<>(); + private static Class[] actionsForInsertFloatElement() { + List> classes = new ArrayList<>(); + classes.add(TextBoxFloatAction.class); + classes.add(FormulaFloatAction.class); + classes.add(ChartFloatAction.class); + classes.add(ImageFloatAction.class); Set providers = ExtraDesignClassManager.getInstance().getArray(ElementUIProvider.MARK_STRING); for (ElementUIProvider provider : providers) { classes.add(provider.actionForInsertFloatElement()); } - return ArrayUtils.addAll(new Class[]{ - TextBoxFloatAction.class, - FormulaFloatAction.class, - ChartFloatAction.class, - ImageFloatAction.class - }, classes.toArray(new Class[classes.size()])); + return classes.toArray(new Class[0]); } private static NameableCreator[] hyperlinkTypes() { diff --git a/settings.gradle b/settings.gradle index 077d17597b..0bb22b5646 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1,7 @@ pluginManagement { repositories { maven { - url 'http://mvn.finedevelop.com/repository/maven-public/' + url 'https://mvn.fanruan.com/repository/maven-public/' } gradlePluginPortal() } From 3d010eb1eb088884cc95f7ac4c19c0251096a336 Mon Sep 17 00:00:00 2001 From: vito Date: Fri, 17 Nov 2023 22:00:41 +0800 Subject: [PATCH 002/302] =?UTF-8?q?REPORT-99485=20=E6=96=B0=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E7=AE=A1=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/icon/AbstractIconSet.java | 79 +++++++++ .../fine/theme/icon/AbstractIconSource.java | 106 ++++++++++++ .../com/fine/theme/icon/DisabledIcon.java | 23 +++ .../com/fine/theme/icon/IconException.java | 29 ++++ .../java/com/fine/theme/icon/IconManager.java | 114 +++++++++++++ .../com/fine/theme/icon/IconResource.java | 17 ++ .../java/com/fine/theme/icon/IconSet.java | 65 ++++++++ .../java/com/fine/theme/icon/IconSource.java | 25 +++ .../com/fine/theme/icon/Identifiable.java | 12 ++ .../java/com/fine/theme/icon/LazyIcon.java | 71 ++++++++ .../com/fine/theme/icon/UrlIconResource.java | 39 +++++ .../java/com/fine/theme/icon/svg/SvgIcon.java | 155 ++++++++++++++++++ .../fine/theme/icon/svg/SvgIconSource.java | 74 +++++++++ .../fine/theme/icon/svg/SvgTranscoder.java | 65 ++++++++ .../fine/theme/light/icon/IconManager.java | 11 -- .../fine/theme/light/ui/FineLightIconSet.java | 34 ++++ .../fine/theme/light/ui/laf/FineLightLaf.java | 7 +- .../fine/theme/light/utils/FineUIUtils.java | 40 ----- .../com/fine/theme/utils/FineUIScale.java | 86 ++++++++++ .../com/fine/theme/utils/FineUIUtils.java | 83 ++++++++++ .../com/fr/design/actions/UpdateAction.java | 8 +- .../fr/design/actions/edit/CopyAction.java | 3 +- .../com/fr/design/actions/edit/CutAction.java | 4 +- .../fr/design/actions/edit/PasteAction.java | 3 +- .../com/fr/design/gui/ibutton/UIButton.java | 4 + .../fr/design/gui/ibutton/UIHeadGroup.java | 2 +- .../fr/design/gui/ibutton/UIToggleButton.java | 46 +++--- .../com/fr/design/mainframe/JTemplate.java | 3 +- .../design/mainframe/check/CheckButton.java | 4 +- .../resources/com/fine/theme/icon/copy.svg | 8 + .../com/fine/theme/icon/copy_disable.svg | 8 + .../resources/com/fine/theme/icon/cut.svg | 5 + .../com/fine/theme/icon/cut_disable.svg | 5 + .../com/fine/theme/icon/font_miss_check.svg | 15 ++ .../theme/icon/font_miss_check_disable.svg | 15 ++ .../com/fine/theme/icon/formatBrush.svg | 5 + .../fine/theme/icon/formatBrush_disable.svg | 5 + .../resources/com/fine/theme/icon/paste.svg | 16 ++ .../com/fine/theme/icon/paste_disable.svg | 16 ++ .../resources/com/fine/theme/icon/redo.svg | 4 + .../com/fine/theme/icon/redo_disable.svg | 4 + .../resources/com/fine/theme/icon/save.svg | 8 + .../com/fine/theme/icon/save_disable.svg | 9 + .../com/fine/theme/icon/template_theme.svg | 10 ++ .../theme/icon/template_theme_disable.svg | 10 ++ .../resources/com/fine/theme/icon/undo.svg | 4 + .../com/fine/theme/icon/undo_disable.svg | 4 + .../com/fine/theme/icon/version_save.svg | 7 + .../fine/theme/icon/version_save_disable.svg | 7 + .../light/ui/laf/FineLightLaf.properties | 15 +- .../design/mainframe/FormatBrushAction.java | 3 +- .../main/java/com/fr/start/MainDesigner.java | 7 +- 52 files changed, 1312 insertions(+), 90 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/icon/AbstractIconSet.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/DisabledIcon.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/IconException.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/IconManager.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/IconResource.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/IconSet.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/IconSource.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/Identifiable.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/UrlIconResource.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/svg/SvgIconSource.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/svg/SvgTranscoder.java delete mode 100644 designer-base/src/main/java/com/fine/theme/light/icon/IconManager.java create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java delete mode 100644 designer-base/src/main/java/com/fine/theme/light/utils/FineUIUtils.java create mode 100644 designer-base/src/main/java/com/fine/theme/utils/FineUIScale.java create mode 100644 designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/copy.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/copy_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/cut.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/cut_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/font_miss_check.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/font_miss_check_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/formatBrush.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/formatBrush_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/paste.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/paste_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/redo.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/redo_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/save.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/save_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/template_theme.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/template_theme_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/undo.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/undo_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/version_save.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/version_save_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSet.java new file mode 100644 index 0000000000..f565077ffc --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSet.java @@ -0,0 +1,79 @@ +package com.fine.theme.icon; + +import com.fr.third.errorprone.annotations.Immutable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.Icon; +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 抽象图标集 + * + * @author vito + * @since 11.0 + * Created on 2023/11/15 + */ +@Immutable +public abstract class AbstractIconSet implements IconSet { + + private final String id; + + private final Map> map = new ConcurrentHashMap<>(64); + private final Map cache = new ConcurrentHashMap<>(64); + private final Map disableCache = new ConcurrentHashMap<>(64); + + public AbstractIconSet(String id) { + this.id = id; + } + + @Override + public @NotNull String getId() { + return id; + } + + @Override + public @NotNull Collection getIds() { + return map.keySet(); + } + + @Override + public void addIcon(@NotNull IconSource icon) { + map.put(icon.getId(), icon); + } + + @Override + public void addIcon(@NotNull IconSource... icons) { + for (IconSource icon: icons){ + map.put(icon.getId(), icon); + } + } + + @Override + public @Nullable Icon findIcon(@NotNull String id) { + Icon icon = cache.get(id); + if (icon == null) { + IconSource iconSource = map.get(id); + if (iconSource != null) { + icon = iconSource.loadIcon(); + cache.put(id, icon); + } + } + return icon; + } + + @Override + public @Nullable Icon findDisableIcon(@NotNull String id) { + Icon icon = disableCache.get(id); + if (icon == null) { + IconSource iconSource = map.get(id); + if (iconSource != null) { + icon = iconSource.disabled(); + disableCache.put(id, icon); + } + } + return icon; + } +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java b/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java new file mode 100644 index 0000000000..134bbb2a69 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java @@ -0,0 +1,106 @@ +package com.fine.theme.icon; + +import com.fr.third.errorprone.annotations.Immutable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.Icon; + +/** + * 抽象图标源 + * 能够根据图标源寻找灰化图标资源 + * + * @author vito + * @since 11.0 + * Created on 2023/11/14 + */ +@Immutable +public abstract class AbstractIconSource implements IconSource { + + public static final String ICON_DISABLE = "_disable"; + + protected String id; + + protected final IconResource resource; + + @Nullable + protected IconResource grayResource; + + protected boolean autoFindDisable = false; + + public AbstractIconSource(@NotNull final String id, @NotNull final IconResource resource) { + this.id = id; + this.resource = resource; + } + + public AbstractIconSource(@NotNull final String id, + @NotNull final IconResource resource, + final boolean autoFindDisable) { + this.id = id; + this.resource = resource; + this.autoFindDisable = autoFindDisable; + } + + + public AbstractIconSource(@NotNull final String id, + @NotNull final IconResource resource, + @Nullable final IconResource grayResource) { + this.id = id; + this.resource = resource; + this.grayResource = grayResource; + } + + @NotNull + @Override + public String getId() { + return id; + } + + @NotNull + @Override + public IconResource getResource() { + return resource; + } + + @NotNull + @Override + public I loadIcon() { + try { + return loadIcon(resource); + } catch (final Exception e) { + throw new IconException("Unable to load Icon: " + getId(), e); + } + } + + @NotNull + protected abstract I loadIcon(@NotNull IconResource resource); + + + /** + * 先找提供明确URL的灰化图, + * 再找指定自动寻找路径的灰化图, + * 最后再由具体图标提供默认灰化图 + * + * @return 灰化图 + */ + @Override + public @NotNull I disabled() { + if (grayResource != null) { + return loadIcon(grayResource); + } + if (autoFindDisable && resource instanceof UrlIconResource) { + String disablePath = findDisablePath(((UrlIconResource) resource).getPath()); + grayResource = new UrlIconResource(disablePath); + return loadIcon(grayResource); + } + return loadDisableIcon(); + } + + private static String findDisablePath(String path) { + int i = path.lastIndexOf('.'); + return path.substring(0, i) + ICON_DISABLE + path.substring(i); + } + + @NotNull + protected abstract I loadDisableIcon(); +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/DisabledIcon.java b/designer-base/src/main/java/com/fine/theme/icon/DisabledIcon.java new file mode 100644 index 0000000000..242b49b4b7 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/DisabledIcon.java @@ -0,0 +1,23 @@ +package com.fine.theme.icon; + +import org.jetbrains.annotations.NotNull; + +import javax.swing.Icon; + +/** + * 创建一个灰化 Icon + * + * @author vito + * @since 11.0 + * Created on 2023/11/16 + */ +public interface DisabledIcon { + + /** + * 创建一份灰化图标 + * + * @return 灰化图标 + */ + @NotNull + Icon disabled(); +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconException.java b/designer-base/src/main/java/com/fine/theme/icon/IconException.java new file mode 100644 index 0000000000..58087fb7b0 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/IconException.java @@ -0,0 +1,29 @@ +package com.fine.theme.icon; + +/** + * 图标异常 + * + * @author vito + * @since 11.0 + * Created on 2023/11/6 + */ +public class IconException extends RuntimeException { + public IconException() { + } + + public IconException(String message) { + super(message); + } + + public IconException(String message, Throwable cause) { + super(message, cause); + } + + public IconException(Throwable cause) { + super(cause); + } + + public IconException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconManager.java b/designer-base/src/main/java/com/fine/theme/icon/IconManager.java new file mode 100644 index 0000000000..9f4600609e --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/IconManager.java @@ -0,0 +1,114 @@ +package com.fine.theme.icon; + +import com.fr.third.errorprone.annotations.Immutable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.Icon; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.HashMap; + +/** + * 图标管理器 + * 1. 提供注册管理图标集,方便整体替换 + * 2. 提供图标缓存 + * 3. 查找图标 + * 4. 配合 {@link LazyIcon} 实现图标懒加载 + * + * @author vito + * @since 11.0 + * Created on 2023/9/12 + */ +@Immutable +public class IconManager { + + public static boolean initialized = false; + public static ArrayList iconSets = new ArrayList<>(2);; + public static HashMap> cache = new HashMap<>(60);; + public static HashMap> disableCache = new HashMap<>(60); + + + public static IconSet getSet(String id) { + for (IconSet set : iconSets) { + if (set.getId().equals(id)) { + return set; + } + } + throw new IconException("[IconManager] Can not find icon set by id: " + id); + } + + public static void addSet(@NotNull IconSet set) { + if (!iconSets.contains(set)) { + iconSets.add(set); + // 清理可能来自其他图集相同名称图标 + clearIconSetCache(set); + } else { + throw new IconException("[IconManager] IconSet by id:" + set.getId() + "is added!"); + } + } + + @NotNull + public static I getIcon(String id) { + Icon icon = findIcon(id); + if (icon == null) { + throw new IconException("[IconManager] Can not find icon by id: " + id); + } + return (I) icon; + } + + @NotNull + public static I getDisableIcon(String id) { + Icon icon = findDisableIcon(id); + if (icon == null) { + throw new IconException("[IconManager] Can not find icon by id: " + id); + } + return (I) icon; + } + + @Nullable + public static I findDisableIcon(String id) { + final WeakReference reference = disableCache.get(id); + I icon = reference != null ? (I) reference.get() : null; + if (icon == null) { + for (IconSet set : iconSets) { + Icon f = set.findDisableIcon(id); + if (f != null) { + icon = (I) f; + disableCache.put(id, new WeakReference<>(icon)); + } + } + } + return icon; + } + + @Nullable + public static I findIcon(String id) { + final WeakReference reference = cache.get(id); + I icon = reference != null ? (I) reference.get() : null; + if (icon == null) { + for (IconSet set : iconSets) { + Icon f = set.findIcon(id); + if (f != null) { + icon = (I) f; + cache.put(id, new WeakReference<>(icon)); + } + } + } + return icon; + } + + public static void clearCache() { + cache.clear(); + } + + public static void clearIconCache(String id) { + cache.remove(id); + } + + public static void clearIconSetCache(@NotNull IconSet set) { + for (String id : set.getIds()) { + cache.remove(id); + } + } +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconResource.java b/designer-base/src/main/java/com/fine/theme/icon/IconResource.java new file mode 100644 index 0000000000..d5375c7454 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/IconResource.java @@ -0,0 +1,17 @@ +package com.fine.theme.icon; + +import org.jetbrains.annotations.Nullable; + +import java.io.InputStream; + +/** + * 资源接口 + * + * @author vito + * @since 11.0 + * Created on 2023/11/6 + */ +public interface IconResource { + @Nullable + InputStream getInputStream(); +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconSet.java b/designer-base/src/main/java/com/fine/theme/icon/IconSet.java new file mode 100644 index 0000000000..5f14f697e3 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/IconSet.java @@ -0,0 +1,65 @@ +package com.fine.theme.icon; + +import com.fr.third.errorprone.annotations.Immutable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.Icon; +import java.util.Collection; + +/** + * 图标集 + * + * @author vito + * @since 11.0 + * Created on 2023/11/6 + */ +@Immutable +public interface IconSet extends Identifiable { + @NotNull + @Override + String getId(); + + /** + * 返回集合中所有 Icons 的 id。 + * + * @return 集合中所有 Icons 的 id。 + */ + @NotNull + Collection getIds(); + + /** + * 将指定 IconSource 引用的新 Icon 添加到集合中。 + * + * @param icon icon 源 + */ + void addIcon(@NotNull IconSource icon); + + /** + * 将指定 IconSource 引用的新 Icon 添加到集合中。 + * + * @param icon icon 源 + */ + void addIcon(@NotNull IconSource... icon); + + /** + * 返回指定 id 的 Icon。 + * + * @param id id + * @return Icon + * todo 实现 iconset,实现 iconsource + */ + @Nullable + Icon findIcon(@NotNull String id); + + + /** + * 返回指定 id 的 Icon。 + * + * @param id id + * @return Icon + * todo 实现 iconset,实现 iconsource + */ + @Nullable + Icon findDisableIcon(@NotNull String id); +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconSource.java b/designer-base/src/main/java/com/fine/theme/icon/IconSource.java new file mode 100644 index 0000000000..7d6234afe0 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/IconSource.java @@ -0,0 +1,25 @@ +package com.fine.theme.icon; + +import com.fr.third.errorprone.annotations.Immutable; +import org.jetbrains.annotations.NotNull; + +import javax.swing.Icon; +import java.io.Serializable; + +/** + * 图标源,在进行图标管理的时候代替真实图标对象 + * 使用时加载,节省内存 + * + * @author vito + * @since 11.0 + * Created on 2023/11/6 + */ +@Immutable +public interface IconSource extends Identifiable, DisabledIcon, Cloneable, Serializable { + @NotNull + IconResource getResource(); + + + @NotNull + I loadIcon(); +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/Identifiable.java b/designer-base/src/main/java/com/fine/theme/icon/Identifiable.java new file mode 100644 index 0000000000..b1d32e4ae1 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/Identifiable.java @@ -0,0 +1,12 @@ +package com.fine.theme.icon; + +/** + * id 接口 + * + * @author vito + * @since 11.0 + * Created on 2023/11/6 + */ +public interface Identifiable { + String getId(); +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java b/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java new file mode 100644 index 0000000000..3e72dab961 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java @@ -0,0 +1,71 @@ +package com.fine.theme.icon; + +import com.fr.third.errorprone.annotations.Immutable; +import org.jetbrains.annotations.NotNull; + +import javax.swing.Icon; +import java.awt.Component; +import java.awt.Graphics; + +/** + * 懒加载图标 + * + * @author vito + * @since 11.0 + * Created on 2023/11/6 + */ +@Immutable +public class LazyIcon implements Identifiable, DisabledIcon, Icon { + @NotNull + private String id; + + public LazyIcon(@NotNull final String id) { + this.id = id; + } + + + @NotNull + @Override + public String getId() { + return id; + } + + @Override + public void paintIcon(@NotNull final Component c, @NotNull final Graphics g, final int x, final int y) { + getIcon().paintIcon(c, g, x, y); + } + + @Override + public int getIconWidth() { + return getIcon().getIconWidth(); + } + + @Override + public int getIconHeight() { + return getIcon().getIconHeight(); + } + + + @NotNull + public I getIcon() { + return IconManager.getIcon(getId()); + } + + /** + * 创建一份灰化图标 + * + * @return 灰化图标 + */ + @NotNull + @Override + public Icon disabled() { + return IconManager.getDisableIcon(getId()); + } + + @NotNull + @Override + public String toString() { + return getClass().getCanonicalName() + "[id=" + getId() + "]"; + + } +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/UrlIconResource.java b/designer-base/src/main/java/com/fine/theme/icon/UrlIconResource.java new file mode 100644 index 0000000000..58e53646e2 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/UrlIconResource.java @@ -0,0 +1,39 @@ +package com.fine.theme.icon; + +import com.fr.general.IOUtils; +import com.fr.io.utils.ResourceIOUtils; +import com.fr.third.errorprone.annotations.Immutable; + +import java.io.InputStream; + +/** + * url图标资源 + * + * @author vito + * @since 11.0 + * Created on 2023/11/15 + */ +@Immutable +public class UrlIconResource implements IconResource { + + private final String path; + + public UrlIconResource(String path) { + this.path = path; + } + + public String getPath() { + return path; + } + + @Override + public InputStream getInputStream() { + return getInputStream(path); + } + + + private InputStream getInputStream(String path) { + InputStream inputStream = IOUtils.getInputStream(path); + return inputStream != null ? inputStream : ResourceIOUtils.read(path); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java new file mode 100644 index 0000000000..9887a7eb1b --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java @@ -0,0 +1,155 @@ +package com.fine.theme.icon.svg; + +import com.fine.theme.icon.DisabledIcon; +import com.fine.theme.icon.IconResource; +import com.fr.clone.cloning.Immutable; +import org.apache.batik.transcoder.TranscoderException; +import org.apache.batik.transcoder.TranscoderInput; +import org.jetbrains.annotations.NotNull; + +import javax.swing.Icon; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; + +import static com.fine.theme.utils.FineUIScale.scale; +import static com.fine.theme.utils.FineUIScale.unscale; +import static com.fine.theme.utils.FineUIUtils.RETINA_SCALE_FACTOR; +import static com.fine.theme.utils.FineUIUtils.isRetina; + +/** + * svg图标 + * 1.绘制长度会跟随DPI比率变化 + * 2.如果设备支持 Retina 则支持Retina绘制HIDPI图 + * 1跟2的缩放原因不同,因此不能混淆,宽高测量等依旧 + * 使用DPI缩放进行,只有绘制内容时使用Retina绘制(如果有) + * Retina绘制不影响最终尺寸,注意区分 + * + * @author vito + * @since 11.0 + * Created on 2023/11/15 + */ +@Immutable +public class SvgIcon implements DisabledIcon, Icon { + + protected transient BufferedImage cache; + + private final Dimension size; + private final IconResource resource; + private final boolean disable; + + public SvgIcon(IconResource resource, Dimension size) { + this(resource, size, false); + } + + public SvgIcon(IconResource resource, Dimension size, boolean disable) { + this.resource = resource; + // 根据dpi进行缩放 + this.size = scale(size); + this.disable = disable; + } + + public SvgIcon(IconResource resource, int side) { + this(resource, new Dimension(side, side), false); + } + + /** + * 如果支持绘制Retina绘制,则进行Retina绘制, + * 绘制结束不影响任何外部尺寸 + */ + @Override + public void paintIcon(Component c, Graphics g, int x, int y) { + if (cache == null + || cache.getWidth() != scaleRetina(size.width) + || cache.getHeight() != scaleRetina(size.height)) { + if (cache != null) { + cache.flush(); + } + Dimension scale = scaleRetina(size); + if (disable && c != null) { + cache = toGrayImage(scale, c.getBackground()); + } else { + cache = toImage(scale); + } + } + if (isRetina()) { + // 高清绘制的原理:scale(1/2,1/2)的原理是坐标减半,底层是矩阵进行坐标变换,意思是坐标减半进行绘制, + // 这样就可以将两倍图绘制到一倍的大小,如果这时候设备支持Retina绘制(四个像素模拟一个像素), + // 正好就可以将4个像素利用起来,每个像素点都有不同的颜色,而不像之前只能是四个共用一个颜色。因此图像 + // 可以更加细腻当然,绘图之后,需要将这个坐标变换给恢复。 + ((Graphics2D) g).scale(1.0 / RETINA_SCALE_FACTOR, 1.0 / RETINA_SCALE_FACTOR); + g.drawImage(cache, x * RETINA_SCALE_FACTOR, y * RETINA_SCALE_FACTOR, null); + ((Graphics2D) g).scale(RETINA_SCALE_FACTOR, RETINA_SCALE_FACTOR); + } else { + g.drawImage(cache, x, y, null); + } + } + + private static int scaleRetina(int size) { + return isRetina() + ? size * RETINA_SCALE_FACTOR + : size; + } + + private static Dimension scaleRetina(Dimension dimension) { + return isRetina() + ? new Dimension(dimension.width * RETINA_SCALE_FACTOR, dimension.height * RETINA_SCALE_FACTOR) + : dimension; + } + + @Override + public int getIconWidth() { + // 根据dpi解除缩放 + return unscale(size.width); + } + + @Override + public int getIconHeight() { + // 根据dpi解除缩放 + return unscale(size.height); + } + + /** + * 根据指定尺寸绘制图片,这里尺寸为结算后的尺寸, + * 因此不必进行缩放 + * + * @param size 图像尺寸 + * @return 图像 + */ + private BufferedImage toImage(Dimension size) { + SvgTranscoder transcoder = new SvgTranscoder(size); + TranscoderInput transcoderInput = new TranscoderInput(resource.getInputStream()); + try { + transcoder.transcode(transcoderInput, null); + return transcoder.getImage(); + } catch (TranscoderException e) { + throw new RuntimeException(e); + } + } + + /** + * 简单的灰化处理,不能有透明度,因此需要传入背景, + * 暂时用作灰度,后面再处理 + */ + private BufferedImage toGrayImage(Dimension size, Color background) { + SvgTranscoder transcoder = new SvgTranscoder(size, background, true); + TranscoderInput transcoderInput = new TranscoderInput(resource.getInputStream()); + try { + transcoder.transcode(transcoderInput, null); + return transcoder.getImage(); + } catch (TranscoderException e) { + throw new RuntimeException(e); + } + } + + /** + * 默认提供一个简单的灰化处理 + */ + @Override + public @NotNull SvgIcon disabled() { + return new SvgIcon(resource, size, true); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIconSource.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIconSource.java new file mode 100644 index 0000000000..c7870a1037 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIconSource.java @@ -0,0 +1,74 @@ +package com.fine.theme.icon.svg; + +import com.fine.theme.icon.AbstractIconSource; +import com.fine.theme.icon.IconResource; +import com.fine.theme.icon.UrlIconResource; +import com.fr.clone.cloning.Immutable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.awt.Dimension; + +/** + * svg图标源 + * + * @author vito + * @since 11.0 + * Created on 2023/11/14 + */ +@Immutable +public class SvgIconSource extends AbstractIconSource { + + private static final int ICON_SIDE_LENGTH = 16; + + private final Dimension size; + + public SvgIconSource(@NotNull String id, @NotNull String resource) { + this(id, new UrlIconResource(resource), null, new Dimension(ICON_SIDE_LENGTH, ICON_SIDE_LENGTH)); + } + + public SvgIconSource(@NotNull String id, @NotNull String resource, boolean autoFindDisable) { + this(id, new UrlIconResource(resource), autoFindDisable, new Dimension(ICON_SIDE_LENGTH, ICON_SIDE_LENGTH)); + } + + public SvgIconSource(@NotNull String id, @NotNull String resource, int side) { + this(id, new UrlIconResource(resource), null, side); + } + + public SvgIconSource(@NotNull String id, @NotNull String resource, boolean autoFindDisable, int side) { + this(id, new UrlIconResource(resource), autoFindDisable, new Dimension(side, side)); + } + + public SvgIconSource(@NotNull String id, @NotNull String resource, @Nullable String grayResource, int side) { + this(id, new UrlIconResource(resource), new UrlIconResource(grayResource), side); + } + + public SvgIconSource(@NotNull String id, @NotNull IconResource resource, + @Nullable IconResource grayResource, int side) { + this(id, resource, grayResource, new Dimension(side, side)); + } + + public SvgIconSource(@NotNull String id, @NotNull IconResource resource, + boolean autoFindDisable, Dimension size) { + super(id, resource, autoFindDisable); + this.size = size; + } + + public SvgIconSource(@NotNull String id, @NotNull IconResource resource, + @Nullable IconResource grayResource, Dimension size) { + super(id, resource, grayResource); + this.size = size; + } + + + @NotNull + @Override + protected SvgIcon loadIcon(@NotNull IconResource resource) { + return new SvgIcon(resource, size); + } + + @Override + public @NotNull SvgIcon loadDisableIcon() { + return new SvgIcon(resource, size).disabled(); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgTranscoder.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgTranscoder.java new file mode 100644 index 0000000000..ca4a6132a3 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgTranscoder.java @@ -0,0 +1,65 @@ +package com.fine.theme.icon.svg; + +import org.apache.batik.transcoder.SVGAbstractTranscoder; +import org.apache.batik.transcoder.TranscoderException; +import org.apache.batik.transcoder.TranscoderOutput; +import org.apache.batik.transcoder.image.ImageTranscoder; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.image.BufferedImage; + +/** + * Svg图标转码器 + * + * @author vito + * @since 11.0 + * Created on 2023/11/15 + */ +public class SvgTranscoder extends ImageTranscoder { + + private BufferedImage bufferedImage; + private boolean gray = false; + + public SvgTranscoder(Dimension size) { + addTranscodingHint(SVGAbstractTranscoder.KEY_WIDTH, (float) size.getWidth()); + addTranscodingHint(SVGAbstractTranscoder.KEY_HEIGHT, (float) size.getHeight()); + } + + public SvgTranscoder(Dimension size, Color background, boolean gray) { + this.gray = gray; + addTranscodingHint(SVGAbstractTranscoder.KEY_WIDTH, (float) size.getWidth()); + addTranscodingHint(SVGAbstractTranscoder.KEY_HEIGHT, (float) size.getHeight()); + addTranscodingHint(ImageTranscoder.KEY_BACKGROUND_COLOR, background); + } + + + public SvgTranscoder(float width, float height) { + addTranscodingHint(SVGAbstractTranscoder.KEY_WIDTH, width); + addTranscodingHint(SVGAbstractTranscoder.KEY_HEIGHT, height); + } + + @Override + public BufferedImage createImage(int width, int height) { + return gray ? + createGrayImage(width, height) : + new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + } + + /** + * 灰度控件底图 + */ + private BufferedImage createGrayImage(int width, int height) { + return new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); + } + + + @Override + public void writeImage(BufferedImage bufferedImage, TranscoderOutput transcoderOutput) throws TranscoderException { + this.bufferedImage = bufferedImage; + } + + public BufferedImage getImage() { + return bufferedImage; + } +} diff --git a/designer-base/src/main/java/com/fine/theme/light/icon/IconManager.java b/designer-base/src/main/java/com/fine/theme/light/icon/IconManager.java deleted file mode 100644 index bc4bbeade8..0000000000 --- a/designer-base/src/main/java/com/fine/theme/light/icon/IconManager.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fine.theme.light.icon; - -/** - * 图标管理器 - * - * @author vito - * @since 11.0 - * Created on 2023/9/12 - */ -public class IconManager { -} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java new file mode 100644 index 0000000000..d02166ad3e --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -0,0 +1,34 @@ +package com.fine.theme.light.ui; + +import com.fine.theme.icon.AbstractIconSet; +import com.fine.theme.icon.svg.SvgIconSource; + +/** + * Fine 亮主题图标集 + * + * @author vito + * @since 11.0 + * Created on 2023/11/17 + */ +public class FineLightIconSet extends AbstractIconSet { + + public FineLightIconSet(String id) { + super(id); + load(); + } + + private void load() { + addIcon( + new SvgIconSource("cut", "com/fine/theme/icon/cut.svg", true), + new SvgIconSource("save", "com/fine/theme/icon/save.svg", true), + new SvgIconSource("copy", "com/fine/theme/icon/copy.svg", true), + new SvgIconSource("formatBrush", "com/fine/theme/icon/formatBrush.svg", true), + new SvgIconSource("paste", "com/fine/theme/icon/paste.svg", true), + new SvgIconSource("undo", "com/fine/theme/icon/undo.svg", true), + new SvgIconSource("redo", "com/fine/theme/icon/redo.svg", true), + new SvgIconSource("version_save", "com/fine/theme/icon/version_save.svg", true), + new SvgIconSource("font_miss_check", "com/fine/theme/icon/font_miss_check.svg", true), + new SvgIconSource("template_theme", "com/fine/theme/icon/template_theme.svg", true) + ); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java index 7b3bbcce1b..58442eca58 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java @@ -1,5 +1,7 @@ package com.fine.theme.light.ui.laf; +import com.fine.theme.light.ui.FineLightIconSet; +import com.fine.theme.icon.IconManager; import com.formdev.flatlaf.FlatLightLaf; /** @@ -11,7 +13,8 @@ import com.formdev.flatlaf.FlatLightLaf; */ public class FineLightLaf extends FlatLightLaf { public static boolean setup() { - return setup( new FineLightLaf() ); + IconManager.addSet(new FineLightIconSet("fine-light")); + return setup(new FineLightLaf()); } @Override @@ -19,6 +22,4 @@ public class FineLightLaf extends FlatLightLaf { return "FineLightLaf"; } - - } diff --git a/designer-base/src/main/java/com/fine/theme/light/utils/FineUIUtils.java b/designer-base/src/main/java/com/fine/theme/light/utils/FineUIUtils.java deleted file mode 100644 index 693600770e..0000000000 --- a/designer-base/src/main/java/com/fine/theme/light/utils/FineUIUtils.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fine.theme.light.utils; - -import javax.swing.UIManager; -import java.awt.Color; - -/** - * UI绘制的一些常用方法 - * - * @author vito - * @since 11.0 - * Created on 2023/11/3 - */ -public class FineUIUtils { - - - /** - * 通过key获取UI的颜色,如果没有则使用后备key获取 - * - * @param key 颜色key - * @param defaultKey 颜色后备key - * @return 颜色 - */ - - public static Color getUIColor(String key, String defaultKey) { - Color color = UIManager.getColor(key); - return (color != null) ? color : UIManager.getColor(defaultKey); - } - - /** - * 获取key指定的int值,如果没有则使用后备key获取 - * - * @param key int所在的key - * @param defaultKey 后备key - * @return 长度 - */ - public static int getUIInt(String key, String defaultKey) { - Object value = UIManager.get(key); - return (value instanceof Integer) ? (Integer) value : UIManager.getInt(defaultKey); - } -} diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIScale.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIScale.java new file mode 100644 index 0000000000..6297166c78 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIScale.java @@ -0,0 +1,86 @@ +package com.fine.theme.utils; + +import com.formdev.flatlaf.util.UIScale; + +import javax.swing.plaf.DimensionUIResource; +import javax.swing.plaf.InsetsUIResource; +import javax.swing.plaf.UIResource; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Insets; + +/** + * UI缩放工具 + * + * @author vito + * @since 11.0 + * Created on 2023/11/15 + */ +public class FineUIScale { + /** + * Multiplies the given value by the user scale factor. + */ + public static float scale(float value) { + return UIScale.scale(value); + } + + /** + * Multiplies the given value by the user scale factor and rounds the result. + */ + public static int scale(int value) { + return UIScale.scale(value); + } + + /** + * Similar as {@link #scale(int)} but always "rounds down". + *

+ * For use in special cases. {@link #scale(int)} is the preferred method. + */ + public static int scale2(int value) { + return UIScale.scale2(value); + } + + /** + * Divides the given value by the user scale factor. + */ + public static float unscale(float value) { + return UIScale.unscale(value); + } + + /** + * Divides the given value by the user scale factor and rounds the result. + */ + public static int unscale(int value) { + return UIScale.unscale(value); + } + + /** + * If user scale factor is not 1, scale the given graphics context by invoking + * {@link Graphics2D#scale(double, double)} with user scale factor. + */ + public static void scaleGraphics(Graphics2D g) { + UIScale.scaleGraphics(g); + } + + /** + * Scales the given dimension with the user scale factor. + *

+ * If user scale factor is 1, then the given dimension is simply returned. + * Otherwise, a new instance of {@link Dimension} or {@link DimensionUIResource} + * is returned, depending on whether the passed dimension implements {@link UIResource}. + */ + public static Dimension scale(Dimension dimension) { + return UIScale.scale(dimension); + } + + /** + * Scales the given insets with the user scale factor. + *

+ * If user scale factor is 1, then the given insets is simply returned. + * Otherwise, a new instance of {@link Insets} or {@link InsetsUIResource} + * is returned, depending on whether the passed dimension implements {@link UIResource}. + */ + public static Insets scale(Insets insets) { + return UIScale.scale(insets); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java new file mode 100644 index 0000000000..3af6be8e55 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java @@ -0,0 +1,83 @@ +package com.fine.theme.utils; + +import com.fr.stable.os.OperatingSystem; +import com.fr.value.AtomicClearableLazyValue; + +import javax.swing.UIManager; +import java.awt.Color; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.lang.reflect.Field; + +/** + * UI绘制的一些常用方法 + * + * @author vito + * @since 11.0 + * Created on 2023/11/3 + */ +public class FineUIUtils { + + public static final int RETINA_SCALE_FACTOR = 2; + + /** + * 判断是否支持retina,制作一些特殊效果,如HIDPI图片绘制。 + * retina 是一种特殊的效果,使用4个像素点模拟一个像素点, + * 因此在其他操作系统上,即使是高分屏也不具备retina的效果。 + * + * @since 2023.11.16 + */ + private static final AtomicClearableLazyValue retina = AtomicClearableLazyValue.create(() -> { + // 经过测试win11,ubuntu等,没有retina效果 + if (!OperatingSystem.isMacos()) { + return false; + } + GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice device = env.getDefaultScreenDevice(); + + try { + Field field = device.getClass().getDeclaredField("scale"); + field.setAccessible(true); + Object scale = field.get(device); + if (scale instanceof Integer && (Integer) scale == 2) { + return true; + } + } catch (Exception ignored) { + } + return false; + }); + + + public static boolean isRetina() { + return retina.getValue(); + } + + public static void clearRetina() { + retina.drop(); + } + + /** + * 通过key获取UI的颜色,如果没有则使用后备key获取 + * + * @param key 颜色key + * @param defaultKey 颜色后备key + * @return 颜色 + */ + + public static Color getUIColor(String key, String defaultKey) { + Color color = UIManager.getColor(key); + return (color != null) ? color : UIManager.getColor(defaultKey); + } + + /** + * 获取key指定的int值,如果没有则使用后备key获取 + * + * @param key int所在的key + * @param defaultKey 后备key + * @return 长度 + */ + public static int getUIInt(String key, String defaultKey) { + Object value = UIManager.get(key); + return (value instanceof Integer) ? (Integer) value : UIManager.getInt(defaultKey); + } +} diff --git a/designer-base/src/main/java/com/fr/design/actions/UpdateAction.java b/designer-base/src/main/java/com/fr/design/actions/UpdateAction.java index d33c04eb15..b9734ac9b8 100644 --- a/designer-base/src/main/java/com/fr/design/actions/UpdateAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/UpdateAction.java @@ -3,6 +3,7 @@ */ package com.fr.design.actions; +import com.fine.theme.icon.LazyIcon; import com.fr.base.NameStyle; import com.fr.base.ScreenResolution; import com.fr.base.Style; @@ -171,6 +172,11 @@ public abstract class UpdateAction extends ShortCut implements Action { * @param smallIcon The small icon for the action. */ public void setSmallIcon(Icon smallIcon) { + if(smallIcon instanceof LazyIcon){ + this.putValue(Action.SMALL_ICON, smallIcon); + this.putValue(UpdateAction.DISABLED_ICON,((LazyIcon) smallIcon).disabled()); + return; + } this.putValue(Action.SMALL_ICON, smallIcon); } @@ -677,7 +683,7 @@ public abstract class UpdateAction extends ShortCut implements Action { protected void setDisabledIcon4Button(AbstractButton button) { Icon disabledIcon = (Icon) this.getValue(UpdateAction.DISABLED_ICON); - if (disabledIcon != null && disabledIcon instanceof SVGIcon) { + if (disabledIcon != null) { button.setDisabledIcon(disabledIcon); } } diff --git a/designer-base/src/main/java/com/fr/design/actions/edit/CopyAction.java b/designer-base/src/main/java/com/fr/design/actions/edit/CopyAction.java index 0505a8e140..9f1eda60a9 100644 --- a/designer-base/src/main/java/com/fr/design/actions/edit/CopyAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/edit/CopyAction.java @@ -3,6 +3,7 @@ */ package com.fr.design.actions.edit; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.TemplateComponentAction; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.designer.TargetComponent; @@ -21,7 +22,7 @@ public class CopyAction extends TemplateComponentAction { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_M_Edit_Copy")); this.setMnemonic('C'); - this.setSmallIcon("/com/fr/design/standard/copy/copy"); + this.setSmallIcon(new LazyIcon("copy")); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, DEFAULT_MODIFIER)); this.setEnabled(!DesignModeContext.isBanCopyAndCut()); } 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 c15e962272..001c40d770 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 @@ -3,10 +3,10 @@ */ package com.fr.design.actions.edit; +import com.fine.theme.icon.LazyIcon; 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,7 +25,7 @@ public class CutAction extends TemplateComponentAction { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_M_Edit_Cut")); this.setMnemonic('T'); - this.setSmallIcon("/com/fr/design/standard/cut/cut"); + this.setSmallIcon(new LazyIcon("cut")); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, DEFAULT_MODIFIER)); this.setEnabled(!DesignModeContext.isBanCopyAndCut()); } diff --git a/designer-base/src/main/java/com/fr/design/actions/edit/PasteAction.java b/designer-base/src/main/java/com/fr/design/actions/edit/PasteAction.java index c14fcabf57..7319400faf 100644 --- a/designer-base/src/main/java/com/fr/design/actions/edit/PasteAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/edit/PasteAction.java @@ -3,6 +3,7 @@ */ package com.fr.design.actions.edit; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.TemplateComponentAction; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.designer.TargetComponent; @@ -24,7 +25,7 @@ public class PasteAction extends TemplateComponentAction { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Edit_Paste")); this.setMnemonic('P'); - this.setSmallIcon("/com/fr/design/standard/paste/paste"); + this.setSmallIcon(new LazyIcon("paste")); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, DEFAULT_MODIFIER)); } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java index f42266dc1f..f6c37d815a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java @@ -1,6 +1,7 @@ package com.fr.design.gui.ibutton; import com.fanruan.gui.UiInspector; +import com.fine.theme.icon.LazyIcon; import com.fine.theme.light.ui.laf.FineLightLaf; import com.fr.base.BaseUtils; import com.fr.base.CellBorderStyle; @@ -74,6 +75,9 @@ public class UIButton extends JButton implements UIObserver, UITextComponent { public UIButton(Icon icon) { super(icon); + if (icon instanceof LazyIcon) { + this.setDisabledIcon(((LazyIcon) icon).disabled()); + } init(); } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java index 8d92c8e5f2..1eeb0bb913 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java @@ -2,7 +2,7 @@ package com.fr.design.gui.ibutton; import com.fine.swing.ui.layout.Layouts; import com.fine.swing.ui.layout.Row; -import com.fine.theme.light.utils.FineUIUtils; +import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; import com.formdev.flatlaf.ui.FlatUIUtils; import com.formdev.flatlaf.util.ScaledEmptyBorder; diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java index 18764e9119..afa0643c97 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java @@ -1,5 +1,15 @@ package com.fr.design.gui.ibutton; +import com.fr.design.constants.UIConstants; +import com.fr.design.event.GlobalNameListener; +import com.fr.design.event.GlobalNameObserver; +import com.fr.stable.StringUtils; + +import javax.swing.AbstractAction; +import javax.swing.Icon; +import javax.swing.SwingUtilities; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Shape; @@ -9,14 +19,6 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.geom.RoundRectangle2D; -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import com.fr.design.constants.UIConstants; -import com.fr.design.event.GlobalNameListener; -import com.fr.design.event.GlobalNameObserver; -import com.fr.stable.StringUtils; /** * SelectedAble button label @@ -125,22 +127,22 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{ } @Override - protected void initListener(){ - if(shouldResponseChangeListener()){ - this.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - if (uiObserverListener == null) { - return; - } + protected void initListener(){ + if(shouldResponseChangeListener()){ + this.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + if (uiObserverListener == null) { + return; + } if(globalNameListener!=null && shouldResponseNameListener()){ globalNameListener.setGlobalName(toggleButtonName); } - uiObserverListener.doChange(); - } - }); - } - } + uiObserverListener.doChange(); + } + }); + } + } public void setSelected(boolean isSelected, boolean fireChanged) { if (this.isSelected != isSelected) { @@ -243,7 +245,7 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{ */ @Override public void registerNameListener(GlobalNameListener listener) { - globalNameListener = listener; + globalNameListener = listener; } /** diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index 76abb74455..e3742f8a31 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe; +import com.fine.theme.icon.LazyIcon; import com.fr.base.Parameter; import com.fr.base.TRL; import com.fr.base.extension.FileExtension; @@ -1593,7 +1594,7 @@ public abstract class JTemplate> } protected UIButton createTemplateThemeButton() { - UIButton button = new UIButton(IconUtils.readIcon("/com/fr/design/standard/template_theme")) { + UIButton button = new UIButton(new LazyIcon("template_theme")) { @Override public Dimension getPreferredSize() { FontMetrics metrics = getFontMetrics(getFont()); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java index 1d09f24828..dc502dcdf4 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java @@ -1,7 +1,7 @@ package com.fr.design.mainframe.check; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseUtils; -import com.fr.base.svg.IconUtils; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; @@ -45,7 +45,7 @@ public class CheckButton extends UIButton { private UILabel imageLabel; public CheckButton() { - this.setIcon(IconUtils.readIcon("/com/fr/design/standard/font_miss_check")); + this.setIcon(new LazyIcon("font_miss_check")); this.setToolTipText(Toolkit.i18nText("Fine_Designer_Check_Font")); this.set4ToolbarButton(); this.addActionListener(checkListener); diff --git a/designer-base/src/main/resources/com/fine/theme/icon/copy.svg b/designer-base/src/main/resources/com/fine/theme/icon/copy.svg new file mode 100644 index 0000000000..160be86092 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/copy.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/copy_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/copy_disable.svg new file mode 100644 index 0000000000..786ba17b82 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/copy_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cut.svg b/designer-base/src/main/resources/com/fine/theme/icon/cut.svg new file mode 100644 index 0000000000..6cb12c56e8 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cut.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cut_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/cut_disable.svg new file mode 100644 index 0000000000..eb27ced476 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cut_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font_miss_check.svg b/designer-base/src/main/resources/com/fine/theme/icon/font_miss_check.svg new file mode 100644 index 0000000000..46125afd25 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font_miss_check.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font_miss_check_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/font_miss_check_disable.svg new file mode 100644 index 0000000000..0bde37db4c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font_miss_check_disable.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/formatBrush.svg b/designer-base/src/main/resources/com/fine/theme/icon/formatBrush.svg new file mode 100644 index 0000000000..c1531fbed4 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/formatBrush.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/formatBrush_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/formatBrush_disable.svg new file mode 100644 index 0000000000..f732f5b64d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/formatBrush_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/paste.svg b/designer-base/src/main/resources/com/fine/theme/icon/paste.svg new file mode 100644 index 0000000000..d520164fb6 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/paste.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/paste_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/paste_disable.svg new file mode 100644 index 0000000000..076509580d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/paste_disable.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/redo.svg b/designer-base/src/main/resources/com/fine/theme/icon/redo.svg new file mode 100644 index 0000000000..5fa4361cfe --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/redo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/redo_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/redo_disable.svg new file mode 100644 index 0000000000..42adaa3271 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/redo_disable.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/save.svg b/designer-base/src/main/resources/com/fine/theme/icon/save.svg new file mode 100644 index 0000000000..469a1a61b0 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/save.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/save_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/save_disable.svg new file mode 100644 index 0000000000..1085e2bb0c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/save_disable.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/template_theme.svg b/designer-base/src/main/resources/com/fine/theme/icon/template_theme.svg new file mode 100644 index 0000000000..48a11990d9 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/template_theme.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/template_theme_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/template_theme_disable.svg new file mode 100644 index 0000000000..94a01fa74d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/template_theme_disable.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/undo.svg b/designer-base/src/main/resources/com/fine/theme/icon/undo.svg new file mode 100644 index 0000000000..6a76ee0b67 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/undo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/undo_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/undo_disable.svg new file mode 100644 index 0000000000..4e186ac0a7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/undo_disable.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/version_save.svg b/designer-base/src/main/resources/com/fine/theme/icon/version_save.svg new file mode 100644 index 0000000000..3e7f6e1141 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/version_save.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/version_save_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/version_save_disable.svg new file mode 100644 index 0000000000..4251f6a911 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/version_save_disable.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index 02700bd9f4..b35df4f71f 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -30,6 +30,17 @@ # which is licensed under the Apache 2.0 license. Copyright 2000-2019 JetBrains s.r.o. # See: https://github.com/JetBrains/intellij-community/ +# font weights +# Windows +[win]light.font = "Microsoft YaHei", "Microsoft JhengHei", "MingLiU", "Arial" +[win]semibold.font = "Microsoft YaHei", "Microsoft JhengHei", "MingLiU", "Arial" +# macOS +[mac]light.font = "PingFang SC", "Apple LiGothic", "Apple LiSun", "Arial" +[mac]semibold.font = "PingFang SC", "Apple LiGothic", "Apple LiSun", "Arial" +# Linux +[linux]light.font = "Noto SansCJK", "SimHei", "Arial", "Ubuntu" +[linux]semibold.font = "Noto SansCJK", "SimHei", "Arial", "Ubuntu" + #---- UI delegates ---- ButtonUI = com.formdev.flatlaf.ui.FlatButtonUI @@ -107,6 +118,8 @@ ViewportUI = com.formdev.flatlaf.ui.FlatViewportUI @cellFocusColor = darken(@selectionBackground,20%) @icon = shade(@background,27%) + + # accent colors (blueish) # set @accentColor to use single accent color or # modify @accentBaseColor to use variations of accent base color @@ -783,7 +796,7 @@ TabbedPane.closeCrossLineWidth = 1 TabbedPane.underlineColor = @accentUnderlineColor TabbedPane.inactiveUnderlineColor = mix(@accentUnderlineColor,$TabbedPane.background,50%) TabbedPane.disabledUnderlineColor = darken(@background,28%) -TabbedPane.hoverColor = darken($TabbedPane.background,7%,derived) +TabbedPane.hoverColor = #DADEE7 TabbedPane.focusColor = mix(@selectionBackground,$TabbedPane.background,10%) TabbedPane.contentAreaColor = $Component.borderColor diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/FormatBrushAction.java b/designer-realize/src/main/java/com/fr/design/mainframe/FormatBrushAction.java index d0ad191296..586b6944c9 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/FormatBrushAction.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/FormatBrushAction.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe; +import com.fine.theme.icon.LazyIcon; import com.fr.base.Style; import com.fr.design.actions.ElementCaseAction; @@ -34,7 +35,7 @@ public class FormatBrushAction extends ElementCaseAction { super(t); this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_M_Edit_FormatBrush")); this.setMnemonic('B'); - this.setSmallIcon("/com/fr/design/standard/formatbrush/formatBrush", false); + this.setSmallIcon(new LazyIcon("formatBrush")); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, DEFAULT_MODIFIER)); } diff --git a/designer-realize/src/main/java/com/fr/start/MainDesigner.java b/designer-realize/src/main/java/com/fr/start/MainDesigner.java index f02b061343..f733d64eb8 100644 --- a/designer-realize/src/main/java/com/fr/start/MainDesigner.java +++ b/designer-realize/src/main/java/com/fr/start/MainDesigner.java @@ -2,6 +2,7 @@ package com.fr.start; import com.fanruan.gui.UiInspector; +import com.fine.theme.icon.LazyIcon; import com.fr.base.function.UITerminator; import com.fr.base.vcs.DesignerMode; import com.fr.design.DesignerEnvManager; @@ -312,7 +313,7 @@ public class MainDesigner extends BaseDesigner { private void createSaveButton() { - saveButton = new UIButton("/com/fr/design/standard/save/save", true); + saveButton = new UIButton(new LazyIcon("save"), true); saveButton.setToolTipText(KeySetUtils.SAVE_TEMPLATE.getMenuKeySetName()); saveButton.set4ToolbarButton(); saveButton.addActionListener(new ActionListener() { @@ -329,7 +330,7 @@ public class MainDesigner extends BaseDesigner { private void createUndoButton() { - undo = new UIButton("/com/fr/design/standard/undo/undo", true); + undo = new UIButton(new LazyIcon("undo"), true); undo.setToolTipText(KeySetUtils.UNDO.getMenuKeySetName()); undo.set4ToolbarButton(); undo.addActionListener(new ActionListener() { @@ -344,7 +345,7 @@ public class MainDesigner extends BaseDesigner { } private void createRedoButton() { - redo = new UIButton("/com/fr/design/standard/redo/redo", true); + redo = new UIButton(new LazyIcon("redo"), true); redo.setToolTipText(KeySetUtils.REDO.getMenuKeySetName()); redo.set4ToolbarButton(); redo.addActionListener(new ActionListener() { From bee1e0a6b993e3bac25685eefeb50a8e489f29d7 Mon Sep 17 00:00:00 2001 From: vito Date: Mon, 20 Nov 2023 16:44:09 +0800 Subject: [PATCH 003/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fine/theme/icon/IconManager.java | 45 ++++++++++++++++--- .../com/fine/theme/icon/IconResource.java | 6 +++ .../java/com/fine/theme/icon/IconSet.java | 2 - .../java/com/fine/theme/icon/IconSource.java | 11 +++++ .../java/com/fine/theme/icon/LazyIcon.java | 2 +- .../java/com/fine/theme/icon/svg/SvgIcon.java | 18 +++++--- .../fine/theme/icon/svg/SvgTranscoder.java | 2 +- .../com/fine/theme/utils/FineUIUtils.java | 21 ++++++--- 8 files changed, 83 insertions(+), 24 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconManager.java b/designer-base/src/main/java/com/fine/theme/icon/IconManager.java index 9f4600609e..3f9f6c7f76 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/IconManager.java +++ b/designer-base/src/main/java/com/fine/theme/icon/IconManager.java @@ -24,11 +24,19 @@ import java.util.HashMap; public class IconManager { public static boolean initialized = false; - public static ArrayList iconSets = new ArrayList<>(2);; - public static HashMap> cache = new HashMap<>(60);; + public static ArrayList iconSets = new ArrayList<>(2); + ; + public static HashMap> cache = new HashMap<>(60); + ; public static HashMap> disableCache = new HashMap<>(60); + /** + * 获取图标集 + * + * @param id 图标集ID + * @return 图标集 + */ public static IconSet getSet(String id) { for (IconSet set : iconSets) { if (set.getId().equals(id)) { @@ -38,16 +46,28 @@ public class IconManager { throw new IconException("[IconManager] Can not find icon set by id: " + id); } + /** + * 添加图标集 + * + * @param set 图标集 + */ public static void addSet(@NotNull IconSet set) { if (!iconSets.contains(set)) { iconSets.add(set); // 清理可能来自其他图集相同名称图标 clearIconSetCache(set); } else { - throw new IconException("[IconManager] IconSet by id:" + set.getId() + "is added!"); + throw new IconException("[IconManager] IconSet by id:" + set.getId() + "is added!"); } } + /** + * 根据图标ID获取图标 + * + * @param id 图标ID + * @param 图标类型 + * @return 图标 + */ @NotNull public static I getIcon(String id) { Icon icon = findIcon(id); @@ -57,6 +77,13 @@ public class IconManager { return (I) icon; } + /** + * 获取灰化图标 + * + * @param id 图标ID + * @param 图标类型 + * @return 图标 + */ @NotNull public static I getDisableIcon(String id) { Icon icon = findDisableIcon(id); @@ -67,7 +94,7 @@ public class IconManager { } @Nullable - public static I findDisableIcon(String id) { + private static I findDisableIcon(String id) { final WeakReference reference = disableCache.get(id); I icon = reference != null ? (I) reference.get() : null; if (icon == null) { @@ -83,7 +110,7 @@ public class IconManager { } @Nullable - public static I findIcon(String id) { + private static I findIcon(String id) { final WeakReference reference = cache.get(id); I icon = reference != null ? (I) reference.get() : null; if (icon == null) { @@ -98,15 +125,21 @@ public class IconManager { return icon; } + /** + * 清理所有缓存 + */ public static void clearCache() { cache.clear(); } + /** + * 清理图标缓存 + */ public static void clearIconCache(String id) { cache.remove(id); } - public static void clearIconSetCache(@NotNull IconSet set) { + private static void clearIconSetCache(@NotNull IconSet set) { for (String id : set.getIds()) { cache.remove(id); } diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconResource.java b/designer-base/src/main/java/com/fine/theme/icon/IconResource.java index d5375c7454..f654a6cf8c 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/IconResource.java +++ b/designer-base/src/main/java/com/fine/theme/icon/IconResource.java @@ -12,6 +12,12 @@ import java.io.InputStream; * Created on 2023/11/6 */ public interface IconResource { + + /** + * 获取输入资源流 + * + * @return 资源流 + */ @Nullable InputStream getInputStream(); } diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconSet.java b/designer-base/src/main/java/com/fine/theme/icon/IconSet.java index 5f14f697e3..f5f92d6bab 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/IconSet.java +++ b/designer-base/src/main/java/com/fine/theme/icon/IconSet.java @@ -47,7 +47,6 @@ public interface IconSet extends Identifiable { * * @param id id * @return Icon - * todo 实现 iconset,实现 iconsource */ @Nullable Icon findIcon(@NotNull String id); @@ -58,7 +57,6 @@ public interface IconSet extends Identifiable { * * @param id id * @return Icon - * todo 实现 iconset,实现 iconsource */ @Nullable Icon findDisableIcon(@NotNull String id); diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconSource.java b/designer-base/src/main/java/com/fine/theme/icon/IconSource.java index 7d6234afe0..ed2d1c6b76 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/IconSource.java +++ b/designer-base/src/main/java/com/fine/theme/icon/IconSource.java @@ -16,10 +16,21 @@ import java.io.Serializable; */ @Immutable public interface IconSource extends Identifiable, DisabledIcon, Cloneable, Serializable { + + /** + * 获取图标资源 + * + * @return 图标资源 + */ @NotNull IconResource getResource(); + /** + * 加载图标 + * + * @return 图标 + */ @NotNull I loadIcon(); } diff --git a/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java b/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java index 3e72dab961..aa77042fd4 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java @@ -17,7 +17,7 @@ import java.awt.Graphics; @Immutable public class LazyIcon implements Identifiable, DisabledIcon, Icon { @NotNull - private String id; + private final String id; public LazyIcon(@NotNull final String id) { this.id = id; diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java index 9887a7eb1b..1d81ed1504 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java @@ -18,7 +18,7 @@ import java.awt.image.BufferedImage; import static com.fine.theme.utils.FineUIScale.scale; import static com.fine.theme.utils.FineUIScale.unscale; import static com.fine.theme.utils.FineUIUtils.RETINA_SCALE_FACTOR; -import static com.fine.theme.utils.FineUIUtils.isRetina; +import static com.fine.theme.utils.FineUIUtils.getRetina; /** * svg图标 @@ -62,9 +62,7 @@ public class SvgIcon implements DisabledIcon, Icon { */ @Override public void paintIcon(Component c, Graphics g, int x, int y) { - if (cache == null - || cache.getWidth() != scaleRetina(size.width) - || cache.getHeight() != scaleRetina(size.height)) { + if (isCacheValid()) { if (cache != null) { cache.flush(); } @@ -75,7 +73,7 @@ public class SvgIcon implements DisabledIcon, Icon { cache = toImage(scale); } } - if (isRetina()) { + if (getRetina()) { // 高清绘制的原理:scale(1/2,1/2)的原理是坐标减半,底层是矩阵进行坐标变换,意思是坐标减半进行绘制, // 这样就可以将两倍图绘制到一倍的大小,如果这时候设备支持Retina绘制(四个像素模拟一个像素), // 正好就可以将4个像素利用起来,每个像素点都有不同的颜色,而不像之前只能是四个共用一个颜色。因此图像 @@ -88,14 +86,20 @@ public class SvgIcon implements DisabledIcon, Icon { } } + private boolean isCacheValid() { + return cache == null + || cache.getWidth() != scaleRetina(size.width) + || cache.getHeight() != scaleRetina(size.height); + } + private static int scaleRetina(int size) { - return isRetina() + return getRetina() ? size * RETINA_SCALE_FACTOR : size; } private static Dimension scaleRetina(Dimension dimension) { - return isRetina() + return getRetina() ? new Dimension(dimension.width * RETINA_SCALE_FACTOR, dimension.height * RETINA_SCALE_FACTOR) : dimension; } diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgTranscoder.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgTranscoder.java index ca4a6132a3..abb55e1c72 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgTranscoder.java +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgTranscoder.java @@ -47,7 +47,7 @@ public class SvgTranscoder extends ImageTranscoder { } /** - * 灰度控件底图 + * 灰化底图 */ private BufferedImage createGrayImage(int width, int height) { return new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java index 3af6be8e55..b4b6c9a301 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java @@ -24,10 +24,11 @@ public class FineUIUtils { * 判断是否支持retina,制作一些特殊效果,如HIDPI图片绘制。 * retina 是一种特殊的效果,使用4个像素点模拟一个像素点, * 因此在其他操作系统上,即使是高分屏也不具备retina的效果。 + * 甚至还有劣化的效果以及更差的性能。 * * @since 2023.11.16 */ - private static final AtomicClearableLazyValue retina = AtomicClearableLazyValue.create(() -> { + private static final AtomicClearableLazyValue RETINA = AtomicClearableLazyValue.create(() -> { // 经过测试win11,ubuntu等,没有retina效果 if (!OperatingSystem.isMacos()) { return false; @@ -39,7 +40,7 @@ public class FineUIUtils { Field field = device.getClass().getDeclaredField("scale"); field.setAccessible(true); Object scale = field.get(device); - if (scale instanceof Integer && (Integer) scale == 2) { + if (scale instanceof Integer && (Integer) scale == RETINA_SCALE_FACTOR) { return true; } } catch (Exception ignored) { @@ -47,13 +48,20 @@ public class FineUIUtils { return false; }); - - public static boolean isRetina() { - return retina.getValue(); + /** + * 是否支持 retina + * + * @return 是否支持 retina + */ + public static boolean getRetina() { + return RETINA.getValue(); } + /** + * 放弃 retina 判断结果,用于清理或者切换环境 + */ public static void clearRetina() { - retina.drop(); + RETINA.drop(); } /** @@ -63,7 +71,6 @@ public class FineUIUtils { * @param defaultKey 颜色后备key * @return 颜色 */ - public static Color getUIColor(String key, String defaultKey) { Color color = UIManager.getColor(key); return (color != null) ? color : UIManager.getColor(defaultKey); From c74cea80e4c0dd4d386ee14d6fdc9ace94c9bac4 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Thu, 23 Nov 2023 14:14:29 +0800 Subject: [PATCH 004/302] =?UTF-8?q?REPORT-107973=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0-=E4=B8=BB?= =?UTF-8?q?=E9=A1=B5=E5=8F=8A=E7=BB=84=E4=BB=B6=E8=A7=86=E8=A7=89=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E7=BF=BB=E6=96=B0=20=E3=80=90=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=8E=9F=E5=9B=A0=E3=80=91rt=20=E3=80=90=E6=94=B9=E5=8A=A8?= =?UTF-8?q?=E6=80=9D=E8=B7=AF=E3=80=91rt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 18 ++++++- .../fr/design/actions/file/DelFileAction.java | 3 +- .../actions/server/ProcedureListAction.java | 5 +- .../design/data/BasicTableDataTreePane.java | 6 +-- .../datapane/TableDataCreatorProducer.java | 48 ++++++++++++------- .../datapane/TableDataNameObjectCreator.java | 35 +++++++++++++- .../design/data/datapane/TableDataTree.java | 5 +- .../data/datapane/TableDataTreePane.java | 17 +++---- .../search/pane/TreeSearchToolbarPane.java | 9 ++-- .../tabledatapane/ProcedureListPane.java | 5 +- .../MultiResultTableDataWrapperHelper.java | 8 ++-- .../wrapper/ServerTableDataWrapper.java | 19 ++++---- .../wrapper/StoreProcedureDataWrapper.java | 4 +- .../wrapper/StoreProcedureNameWrapper.java | 4 +- .../tabledata/wrapper/TableDataFactory.java | 37 +++++++++----- .../wrapper/TemplateTableDataWrapper.java | 9 ++-- .../controlpane/AbstractNameableCreator.java | 43 +++++++++++++++-- .../gui/controlpane/NameObjectCreator.java | 34 +++++++++++-- .../shortcutfactory/OldShortCutFactory.java | 2 +- .../fr/design/gui/ilist/TableViewList.java | 3 +- .../DesignerFrameFileDealerPane.java | 3 +- .../pane/TemplateTreeSearchToolbarPane.java | 9 ++-- .../standard/batchesdoff/batch_esd_off.svg | 7 +++ ...disabled.svg => batch_esd_off_disable.svg} | 0 .../batchesdoff/batch_esd_off_normal.svg | 3 -- .../standard/batchesdon/batch_esd_on.svg | 8 ++++ ..._disabled.svg => batch_esd_on_disable.svg} | 0 .../batchesdon/batch_esd_on_normal.svg | 3 -- .../fr/design/standard/class_table_data.svg | 15 ++++++ .../standard/class_table_data_normal.svg | 4 -- .../com/fr/design/standard/connection.svg | 12 +++++ .../fr/design/standard/connection_normal.svg | 11 ----- .../com/fr/design/standard/data_table.svg | 20 ++++++++ .../fr/design/standard/data_table_normal.svg | 3 -- .../com/fr/design/standard/database.svg | 12 +++++ .../fr/design/standard/database_normal.svg | 3 -- .../fr/design/standard/editdataset/edit.svg | 6 +++ .../{edit_disabled.svg => edit_disable.svg} | 2 +- .../standard/editdataset/edit_normal.svg | 8 ---- .../com/fr/design/standard/field.svg | 11 +++++ .../com/fr/design/standard/field_normal.svg | 5 -- .../resources/com/fr/design/standard/file.svg | 25 ++++++++++ .../com/fr/design/standard/file_normal.svg | 5 -- .../com/fr/design/standard/multi.svg | 21 ++++++++ .../com/fr/design/standard/multi_normal.svg | 11 ----- .../standard/previewdateset/preview.svg | 7 +++ ...eview_disabled.svg => preview_disable.svg} | 2 +- .../previewdateset/preview_normal.svg | 7 --- .../com/fr/design/standard/remove/remove.svg | 9 ++++ ...remove_disabled.svg => remove_disable.svg} | 2 +- .../design/standard/remove/remove_normal.svg | 9 ---- .../{search_normal.svg => search.svg} | 2 +- .../fr/design/standard/server_database.svg | 36 ++++++++++++++ .../standard/server_database_normal.svg | 7 --- .../fr/design/standard/store_procedure.svg | 20 ++++++++ .../standard/store_procedure_normal.svg | 8 ---- .../resources/com/fr/design/standard/tree.svg | 48 +++++++++++++++++++ .../com/fr/design/standard/tree_normal.svg | 14 ------ 58 files changed, 495 insertions(+), 197 deletions(-) create mode 100755 designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off.svg rename designer-base/src/main/resources/com/fr/design/standard/batchesdoff/{batch_esd_off_disabled.svg => batch_esd_off_disable.svg} (100%) delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off_normal.svg create mode 100755 designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on.svg rename designer-base/src/main/resources/com/fr/design/standard/batchesdon/{batch_esd_on_disabled.svg => batch_esd_on_disable.svg} (100%) delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on_normal.svg create mode 100755 designer-base/src/main/resources/com/fr/design/standard/class_table_data.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/class_table_data_normal.svg create mode 100755 designer-base/src/main/resources/com/fr/design/standard/connection.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/connection_normal.svg create mode 100755 designer-base/src/main/resources/com/fr/design/standard/data_table.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/data_table_normal.svg create mode 100755 designer-base/src/main/resources/com/fr/design/standard/database.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/database_normal.svg create mode 100755 designer-base/src/main/resources/com/fr/design/standard/editdataset/edit.svg rename designer-base/src/main/resources/com/fr/design/standard/editdataset/{edit_disabled.svg => edit_disable.svg} (89%) delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_normal.svg create mode 100755 designer-base/src/main/resources/com/fr/design/standard/field.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/field_normal.svg create mode 100755 designer-base/src/main/resources/com/fr/design/standard/file.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/file_normal.svg create mode 100755 designer-base/src/main/resources/com/fr/design/standard/multi.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/multi_normal.svg create mode 100755 designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview.svg rename designer-base/src/main/resources/com/fr/design/standard/previewdateset/{preview_disabled.svg => preview_disable.svg} (92%) delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_normal.svg create mode 100755 designer-base/src/main/resources/com/fr/design/standard/remove/remove.svg rename designer-base/src/main/resources/com/fr/design/standard/remove/{remove_disabled.svg => remove_disable.svg} (89%) delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/remove/remove_normal.svg rename designer-base/src/main/resources/com/fr/design/standard/{search_normal.svg => search.svg} (91%) create mode 100755 designer-base/src/main/resources/com/fr/design/standard/server_database.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/server_database_normal.svg create mode 100755 designer-base/src/main/resources/com/fr/design/standard/store_procedure.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/store_procedure_normal.svg create mode 100755 designer-base/src/main/resources/com/fr/design/standard/tree.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/tree_normal.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index d02166ad3e..e4957b9bdb 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -28,7 +28,23 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("redo", "com/fine/theme/icon/redo.svg", true), new SvgIconSource("version_save", "com/fine/theme/icon/version_save.svg", true), new SvgIconSource("font_miss_check", "com/fine/theme/icon/font_miss_check.svg", true), - new SvgIconSource("template_theme", "com/fine/theme/icon/template_theme.svg", true) + new SvgIconSource("template_theme", "com/fine/theme/icon/template_theme.svg", true), + new SvgIconSource("database", "com/fr/design/standard/database.svg", true), + new SvgIconSource("preview", "com/fr/design/standard/previewdateset/preview.svg", false), + new SvgIconSource("connection", "com/fr/design/standard/connection.svg", true), + new SvgIconSource("class_table_data", "com/fr/design/standard/class_table_data.svg", true), + new SvgIconSource("data_table", "com/fr/design/standard/data_table.svg", true), + new SvgIconSource("multi", "com/fr/design/standard/multi.svg", true), + new SvgIconSource("file", "com/fr/design/standard/file.svg", true), + new SvgIconSource("tree", "com/fr/design/standard/tree.svg", true), + new SvgIconSource("store_procedure", "/com/fr/design/standard/store_procedure.svg", true), + new SvgIconSource("batch_esd_on", "com/fr/design/standard/batchesdon/batch_esd_on.svg", true), + new SvgIconSource("batch_esd_off", "com/fr/design/standard/batchesdoff/batch_esd_off.svg", true), + new SvgIconSource("edit", "com/fr/design/standard/editdataset/edit.svg", true), + new SvgIconSource("remove", "com/fr/design/standard/remove/remove.svg", true), + new SvgIconSource("search", "/com/fr/design/standard/search.svg", true), + new SvgIconSource("server_database", "com/fr/design/standard/server_database.svg", true), + new SvgIconSource("field", "com/fr/design/standard/field.svg", true) ); } } diff --git a/designer-base/src/main/java/com/fr/design/actions/file/DelFileAction.java b/designer-base/src/main/java/com/fr/design/actions/file/DelFileAction.java index f7851d7af6..b1c66a75bb 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/DelFileAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/DelFileAction.java @@ -1,5 +1,6 @@ package com.fr.design.actions.file; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.file.FileOperations; @@ -22,7 +23,7 @@ public class DelFileAction extends UpdateAction { public DelFileAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Remove")); - this.setSmallIcon("/com/fr/design/standard/remove/remove"); + this.setSmallIcon(new LazyIcon("remove")); } @Override diff --git a/designer-base/src/main/java/com/fr/design/actions/server/ProcedureListAction.java b/designer-base/src/main/java/com/fr/design/actions/server/ProcedureListAction.java index 9989182d48..c94044e9a1 100644 --- a/designer-base/src/main/java/com/fr/design/actions/server/ProcedureListAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/server/ProcedureListAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.server; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.DesignModelAdapter; import com.fr.design.actions.UpdateAction; import com.fr.design.data.DesignTableDataManager; @@ -11,7 +11,6 @@ import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrame; import com.fr.file.ProcedureConfig; - import com.fr.transaction.CallBackAdaptor; import com.fr.transaction.Configurations; import com.fr.transaction.WorkerFacade; @@ -22,7 +21,7 @@ public class ProcedureListAction extends UpdateAction { public ProcedureListAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Stored_Procedure") + "(P)" + "..."); this.setMnemonic('P'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/data/store_procedure.png")); + this.setSmallIcon(new LazyIcon("store_procedure")); } /** diff --git a/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java index af9850172b..8c1252651a 100644 --- a/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java @@ -1,6 +1,6 @@ package com.fr.design.data; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.base.TableData; import com.fr.base.svg.IconUtils; import com.fr.data.MultiResultTableData; @@ -431,7 +431,7 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp public PreviewTableDataAction(TableDataTree dataTree) { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview")); this.setMnemonic('p'); - this.setSmallIcon("/com/fr/design/standard/previewdateset/preview"); + this.setSmallIcon(new LazyIcon("preview")); this.dataTree = dataTree; } @@ -508,7 +508,7 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp public ConnectionTableAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Server_Define_Data_Connection")); this.setMnemonic('D'); - this.setSmallIcon("/com/fr/design/standard/connection", false); + this.setSmallIcon(new LazyIcon("connection")); } @Override diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataCreatorProducer.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataCreatorProducer.java index 8db517d614..f452784acc 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataCreatorProducer.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataCreatorProducer.java @@ -4,11 +4,25 @@ package com.fr.design.data.datapane; -import com.fr.data.impl.*; +import com.fine.theme.icon.LazyIcon; +import com.fr.data.impl.ClassTableData; +import com.fr.data.impl.ConditionTableData; +import com.fr.data.impl.DBTableData; +import com.fr.data.impl.EmbeddedTableData; +import com.fr.data.impl.FileTableData; +import com.fr.data.impl.RecursionTableData; import com.fr.data.impl.storeproc.StoreProcedure; import com.fr.design.ExtraDesignClassManager; -import com.fr.design.data.tabledata.tabledatapane.*; - +import com.fr.design.data.tabledata.tabledatapane.ClassTableDataPane; +import com.fr.design.data.tabledata.tabledatapane.DBTableDataPane; +import com.fr.design.data.tabledata.tabledatapane.EmbeddedTableDataPane; +import com.fr.design.data.tabledata.tabledatapane.FileTableDataSmallHeightPane; +import com.fr.design.data.tabledata.tabledatapane.FileTableDataSmallPane; +import com.fr.design.data.tabledata.tabledatapane.GlobalMultiTDTableDataPane; +import com.fr.design.data.tabledata.tabledatapane.GlobalTreeTableDataPane; +import com.fr.design.data.tabledata.tabledatapane.MultiTDTableDataPane; +import com.fr.design.data.tabledata.tabledatapane.ProcedureDataPane; +import com.fr.design.data.tabledata.tabledatapane.TreeTableDataPane; import com.fr.stable.ArrayUtils; import java.util.ArrayList; @@ -33,33 +47,33 @@ public class TableDataCreatorProducer { public TableDataNameObjectCreator[] createReportTableDataCreator() { TableDataNameObjectCreator dataBase = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DS_Database_Query"), "ds", - "/com/fr/design/standard/database_normal.svg", DBTableData.class, DBTableDataPane.class); + new LazyIcon("database"), DBTableData.class, DBTableDataPane.class); TableDataNameObjectCreator ds_Class = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Class"), "Class", - "/com/fr/design/standard/class_table_data_normal.svg", ClassTableData.class, ClassTableDataPane.class); + new LazyIcon("class_table_data"), ClassTableData.class, ClassTableDataPane.class); TableDataNameObjectCreator table = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Embedded"), "Embedded", - "/com/fr/design/standard/data_table_normal.svg", EmbeddedTableData.class, EmbeddedTableDataPane.class); + new LazyIcon("data_table"), EmbeddedTableData.class, EmbeddedTableDataPane.class); TableDataNameObjectCreator multiTable = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Relation"), "Multi", - "/com/fr/design/standard/multi_normal.svg", ConditionTableData.class, MultiTDTableDataPane.class) { + new LazyIcon("multi"), ConditionTableData.class, MultiTDTableDataPane.class) { public boolean isNeedParameterWhenPopulateJControlPane() { return true; } }; TableDataNameObjectCreator fileTable = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_File"), "File", - "/com/fr/design/standard/file_normal.svg", FileTableData.class, FileTableDataSmallHeightPane.class); + new LazyIcon("file"), FileTableData.class, FileTableDataSmallHeightPane.class); TableDataNameObjectCreator treeTable = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Tree"), "Tree", - "/com/fr/design/standard/tree_normal.svg", RecursionTableData.class, TreeTableDataPane.class) { + new LazyIcon("tree"), RecursionTableData.class, TreeTableDataPane.class) { public boolean isNeedParameterWhenPopulateJControlPane() { return true; } }; TableDataNameObjectCreator storeProcedure = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Stored_Procedure"), "Proc", - "/com/fr/design/standard/store_procedure_normal.svg", + new LazyIcon("store_procedure"), StoreProcedure.class, ProcedureDataPane.class) { @Override public boolean shouldInsertSeparator() { @@ -72,33 +86,33 @@ public class TableDataCreatorProducer { public TableDataNameObjectCreator[] createServerTableDataCreator() { TableDataNameObjectCreator dataBase = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DS_Database_Query"), - "/com/fr/design/standard/server_database_normal.svg", DBTableData.class, + new LazyIcon("server_database"), DBTableData.class, DBTableDataPane.class); TableDataNameObjectCreator ds_Class = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Class"), - "/com/fr/design/standard/class_table_data_normal.svg", ClassTableData.class, + new LazyIcon("class_table_data"), ClassTableData.class, ClassTableDataPane.class); TableDataNameObjectCreator table = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Embedded"), - "/com/fr/design/standard/data_table_normal.svg", EmbeddedTableData.class, + new LazyIcon("data_table"), EmbeddedTableData.class, EmbeddedTableDataPane.class); TableDataNameObjectCreator fileTable = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_File"), - "/com/fr/design/standard/file_normal.svg", FileTableData.class, + new LazyIcon("file"), FileTableData.class, FileTableDataSmallPane.class); TableDataNameObjectCreator treeTable = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Tree"), - "/com/fr/design/standard/tree_normal.svg", + new LazyIcon("tree"), RecursionTableData.class, GlobalTreeTableDataPane.class) { public boolean isNeedParameterWhenPopulateJControlPane() { return true; } }; TableDataNameObjectCreator multiTable = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Relation"), - "/com/fr/design/standard/multi_normal.svg", + new LazyIcon("multi"), ConditionTableData.class, GlobalMultiTDTableDataPane.class) { public boolean isNeedParameterWhenPopulateJControlPane() { return true; } }; TableDataNameObjectCreator storeProcedure = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Stored_Procedure"), - "/com/fr/design/standard/store_procedure_normal.svg", + new LazyIcon("store_procedure"), StoreProcedure.class, ProcedureDataPane.class) { @Override public boolean shouldInsertSeparator() { diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataNameObjectCreator.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataNameObjectCreator.java index 0ee4599159..84fe9d6609 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataNameObjectCreator.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataNameObjectCreator.java @@ -1,7 +1,5 @@ package com.fr.design.data.datapane; -import com.fr.base.BaseUtils; -import com.fr.base.svg.IconUtils; import com.fr.base.svg.SVGLoader; import com.fr.data.impl.DBTableData; import com.fr.design.actions.tabledata.TableDataAction; @@ -52,6 +50,9 @@ public class TableDataNameObjectCreator extends NameObjectCreator { prefix = action.getPrefix(); } + /** + * 改用{@link TableDataNameObjectCreator#TableDataNameObjectCreator(String, Icon, Class, Class)} + */ public TableDataNameObjectCreator(String menuName, String iconPath, Class clazz, Class updatePane) { super(menuName, iconPath, clazz, updatePane); if (iconPath != null) { @@ -60,6 +61,14 @@ public class TableDataNameObjectCreator extends NameObjectCreator { } } + public TableDataNameObjectCreator(String menuName, Icon icon, Class clazz, Class updatePane) { + super(menuName, icon, clazz, updatePane); + } + + /** + * 改用{@link TableDataNameObjectCreator#TableDataNameObjectCreator(String, String, Icon, Class, Class)} + */ + @Deprecated public TableDataNameObjectCreator(String menuName, String prefix, String iconPath, Class clazz, Class updatePane) { super(menuName, iconPath, clazz, updatePane); if (iconPath != null) { @@ -69,6 +78,15 @@ public class TableDataNameObjectCreator extends NameObjectCreator { this.prefix = prefix; } + public TableDataNameObjectCreator(String menuName, String prefix, Icon icon, Class clazz, Class updatePane) { + super(menuName, icon, clazz, updatePane); + this.prefix = prefix; + } + + /** + * 改用{@link TableDataNameObjectCreator#TableDataNameObjectCreator(String, Icon, Class, Class, Class)} + */ + @Deprecated public TableDataNameObjectCreator(String menuName, String iconPath, Class clazz, Class clazz4Init, Class updatePane) { super(menuName, iconPath, clazz, clazz4Init, updatePane); if (iconPath != null) { @@ -77,6 +95,14 @@ public class TableDataNameObjectCreator extends NameObjectCreator { } } + public TableDataNameObjectCreator(String menuName, Icon icon, Class clazz, Class clazz4Init, Class updatePane) { + super(menuName, icon, clazz, clazz4Init, updatePane); + } + + /** + * 改用{@link TableDataNameObjectCreator#TableDataNameObjectCreator(String, String, Icon, Class, Class, Class)} + */ + @Deprecated public TableDataNameObjectCreator(String menuName, String prefix, String iconPath, Class clazz, Class clazz4Init, Class updatePane) { super(menuName, iconPath, clazz, clazz4Init, updatePane); if (iconPath != null) { @@ -86,6 +112,11 @@ public class TableDataNameObjectCreator extends NameObjectCreator { this.prefix = prefix; } + public TableDataNameObjectCreator(String menuName, String prefix, Icon icon, Class clazz, Class clazz4Init, Class updatePane) { + super(menuName, icon, clazz, clazz4Init, updatePane); + this.prefix = prefix; + } + @Override protected void doSthChanged4Icon(Object ob) { diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java index c19b4b2740..cc267aceff 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java @@ -1,5 +1,6 @@ package com.fr.design.data.datapane; +import com.fine.theme.icon.LazyIcon; import com.fr.base.svg.IconUtils; import com.fr.data.MultiResultTableData; import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager; @@ -52,7 +53,7 @@ public class TableDataTree extends UserObjectRefreshJTree { Object userObj = treeNode.getUserObject(); if (userObj instanceof String) { // p:这个是column field. - this.setIcon(IconUtils.readIcon("/com/fr/design/standard/field")); + this.setIcon(new LazyIcon("field")); this.setText((String) userObj); } else if (userObj instanceof NameObject) { NameObject nameObject = (NameObject) userObj; @@ -70,7 +71,7 @@ public class TableDataTree extends UserObjectRefreshJTree { this.setIcon(IconUtils.readIcon(IconPathConstants.DS_QUERY_ICON_PATH)); } } else { - this.setIcon(IconUtils.readIcon("/com/fr/design/images/data/store_procedure.png")); + this.setIcon(new LazyIcon("store_procedure")); } } else if (userObj == PENDING) { this.setIcon(null); diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index 83078a2f19..ff514af9ca 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -1,5 +1,6 @@ package com.fr.design.data.datapane; +import com.fine.theme.icon.LazyIcon; import com.fr.base.TableData; import com.fr.data.MultiResultTableData; import com.fr.data.TableDataSource; @@ -896,7 +897,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { @Override public String getIconResource() { - return "/com/fr/design/standard/batchesdon/batch_esd_on"; + return "batch_esd_on"; } @Override @@ -943,7 +944,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { @Override public String getIconResource() { - return "/com/fr/design/standard/batchesdoff/batch_esd_off"; + return "batch_esd_off"; } @Override @@ -971,7 +972,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { public AbstractESDAction() { this.setName(getName()); this.setMnemonic('R'); - this.setSmallIcon(getIconResource()); + this.setSmallIcon(new LazyIcon(getIconResource())); } @Override @@ -1037,7 +1038,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { public EditAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Edit")); this.setMnemonic('E'); - this.setSmallIcon("/com/fr/design/standard/editdataset/edit"); + this.setSmallIcon(new LazyIcon("edit")); } @Override @@ -1102,7 +1103,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { public RemoveAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Remove")); this.setMnemonic('R'); - this.setSmallIcon("/com/fr/design/standard/remove/remove"); + this.setSmallIcon(new LazyIcon("remove")); } @Override @@ -1178,7 +1179,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { public CopyAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Copy")); this.setMnemonic('C'); - this.setSmallIcon("/com/fr/design/standard/copy/copy"); + this.setSmallIcon(new LazyIcon("copy")); } @Override @@ -1194,7 +1195,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { public PasteAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Action_Paste_Name")); this.setMnemonic('P'); - this.setSmallIcon("/com/fr/design/images/m_edit/paste"); + this.setSmallIcon(new LazyIcon("paste")); } @Override @@ -1228,7 +1229,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { public SwitchAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Search")); this.setMnemonic('S'); - this.setSmallIcon("/com/fr/design/standard/search", false); + this.setSmallIcon(new LazyIcon("search")); } @Override diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java index f5266c9b6d..75b6bd77a5 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java @@ -1,18 +1,19 @@ package com.fr.design.data.datapane.management.search.pane; +import com.fine.theme.icon.LazyIcon; import com.fr.base.svg.IconUtils; import com.fr.design.DesignModelAdapter; import com.fr.design.constants.UIConstants; import com.fr.design.data.datapane.TableDataTreePane; import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager; -import com.fr.design.search.event.TreeSearchStatusChangeEvent; -import com.fr.design.search.event.TreeSearchStatusChangeListener; -import com.fr.design.search.TreeSearchStatus; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.search.TreeSearchStatus; +import com.fr.design.search.event.TreeSearchStatusChangeEvent; +import com.fr.design.search.event.TreeSearchStatusChangeListener; import com.fr.stable.StringUtils; import javax.swing.BorderFactory; @@ -103,7 +104,7 @@ public class TreeSearchToolbarPane extends JPanel implements TreeSearchStatusCha searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.TOOLBAR_BORDER_COLOR)); searchPane.setBackground(Color.WHITE); // 左侧搜索图标 - UILabel searchLabel = new UILabel(IconUtils.readIcon("/com/fr/design/standard/search")); + UILabel searchLabel = new UILabel(new LazyIcon("search")); searchLabel.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0)); searchLabel.addMouseListener(new MouseAdapter() { @Override diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ProcedureListPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ProcedureListPane.java index 804f9a22a5..7a21185511 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ProcedureListPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ProcedureListPane.java @@ -1,5 +1,6 @@ package com.fr.design.data.tabledata.tabledatapane; +import com.fine.theme.icon.LazyIcon; import com.fr.data.TableDataSource; import com.fr.data.impl.storeproc.StoreProcedure; import com.fr.design.data.DesignTableDataManager; @@ -14,7 +15,7 @@ import com.fr.stable.Nameable; import com.fr.stable.StringUtils; import com.fr.stable.core.PropertyChangeAdapter; -import javax.swing.*; +import javax.swing.DefaultListModel; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -101,7 +102,7 @@ public class ProcedureListPane extends JListControlPane { * @return 面板组件 */ public NameableCreator[] createNameableCreators() { - return new NameableCreator[] { new NameObjectCreator("Proc", "/com/fr/design/images/data/store_procedure.png", StoreProcedure.class, + return new NameableCreator[]{new NameObjectCreator("Proc", new LazyIcon("store_procedure"), StoreProcedure.class, ProcedureDataPane.class) }; } diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/MultiResultTableDataWrapperHelper.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/MultiResultTableDataWrapperHelper.java index 45211c095f..e64e5eb6ac 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/MultiResultTableDataWrapperHelper.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/MultiResultTableDataWrapperHelper.java @@ -1,7 +1,7 @@ package com.fr.design.data.tabledata.wrapper; +import com.fine.theme.icon.LazyIcon; import com.fr.base.TableData; -import com.fr.base.svg.IconUtils; import com.fr.design.data.datapane.TableDataCreatorProducer; import com.fr.design.data.datapane.TableDataNameObjectCreator; import com.fr.design.fun.ServerTableDataDefineProvider; @@ -25,7 +25,7 @@ import java.util.Map; */ class MultiResultTableDataWrapperHelper { private static final Map, Icon> TABLE_DATA_ICON_PATHS = new HashMap<>(); - private static final String DEFAULT_MULTI_RESULT_TD_ICON = "/com/fr/design/standard/multi"; + private static final String DEFAULT_MULTI_RESULT_TD_ICON = "multi"; static { @@ -45,10 +45,10 @@ class MultiResultTableDataWrapperHelper { return TABLE_DATA_ICON_PATHS.computeIfAbsent(tableDataClass, cls -> { for (TableDataNameObjectCreator creator : TableDataCreatorProducer.getInstance().createReportTableDataCreator()) { if (creator.createObject().getClass().isAssignableFrom(tableDataClass)) { - return IconUtils.readIcon(creator.getIconPath()); + return creator.menuIcon(); } } - return IconUtils.readIcon(DEFAULT_MULTI_RESULT_TD_ICON); + return new LazyIcon(DEFAULT_MULTI_RESULT_TD_ICON); }); } } diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java index cf66d9700e..df20f0d07a 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java @@ -1,8 +1,7 @@ package com.fr.design.data.tabledata.wrapper; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.base.TableData; -import com.fr.base.svg.IconUtils; import com.fr.base.svg.SVGLoader; import com.fr.data.impl.ClassTableData; import com.fr.data.impl.DBTableData; @@ -12,7 +11,7 @@ import com.fr.data.impl.storeproc.StoreProcedure; import com.fr.design.icon.WarningIcon; import com.fr.stable.StringUtils; -import javax.swing.*; +import javax.swing.Icon; public final class ServerTableDataWrapper extends AbstractTableDataWrapper { public ServerTableDataWrapper(TableData tabledata) { @@ -27,21 +26,21 @@ public final class ServerTableDataWrapper extends AbstractTableDataWrapper { public Icon getIcon() { if (tabledata instanceof DBTableData) { if (StringUtils.isBlank(((DBTableData) tabledata).getQuery())) { - return new WarningIcon(SVGLoader.load("/com/fr/design/standard/server_database_normal.svg")); + return new WarningIcon(SVGLoader.load("/com/fr/design/standard/server_database.svg")); } else { - return IconUtils.readIcon("/com/fr/design/standard/server_database"); + return new LazyIcon("server_database"); } } else if (tabledata instanceof ClassTableData) { - return IconUtils.readIcon("/com/fr/design/standard/class_table_data"); + return new LazyIcon("class_table_data"); } else if (tabledata instanceof EmbeddedTableData) { - return IconUtils.readIcon("/com/fr/design/standard/data_table"); + return new LazyIcon("data_table"); }else if(tabledata instanceof RecursionTableData){ - return IconUtils.readIcon("/com/fr/design/standard/tree"); + return new LazyIcon("tree"); } else if (tabledata instanceof StoreProcedure) { - return IconUtils.readIcon("/com/fr/design/standard/store_procedure"); + return new LazyIcon("store_procedure"); } - return IconUtils.readIcon("/com/fr/design/standard/server_database"); + return new LazyIcon("server_database"); } /** diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java index 6c9af4827f..2de4132b47 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java @@ -1,7 +1,7 @@ package com.fr.design.data.tabledata.wrapper; +import com.fine.theme.icon.LazyIcon; import com.fr.base.TableData; -import com.fr.base.svg.IconUtils; import com.fr.data.impl.storeproc.ProcedureDataModel; import com.fr.data.impl.storeproc.StoreProcedure; import com.fr.data.operator.DataOperator; @@ -150,7 +150,7 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { @Override public Icon getIcon() { - return IconUtils.readIcon("/com/fr/design/standard/store_procedure"); + return new LazyIcon("store_procedure"); } /** diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureNameWrapper.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureNameWrapper.java index c2c815e8a8..f13be4a0be 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureNameWrapper.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureNameWrapper.java @@ -1,7 +1,7 @@ package com.fr.design.data.tabledata.wrapper; +import com.fine.theme.icon.LazyIcon; import com.fr.base.TableData; -import com.fr.base.svg.IconUtils; import com.fr.data.impl.storeproc.ProcedureDataModel; import com.fr.data.impl.storeproc.StoreProcedure; import com.fr.design.data.DesignTableDataManager; @@ -71,7 +71,7 @@ public final class StoreProcedureNameWrapper implements TableDataWrapper { @Override public Icon getIcon() { - return IconUtils.readIcon("/com/fr/design/standard/store_procedure"); + return new LazyIcon("store_procedure"); } private void createStore(boolean needLoadingBar) { diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/TableDataFactory.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/TableDataFactory.java index 8345bde944..09586a6bca 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/TableDataFactory.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/TableDataFactory.java @@ -1,5 +1,6 @@ package com.fr.design.data.tabledata.wrapper; +import com.fine.theme.icon.LazyIcon; import com.fr.base.TableData; import com.fr.data.TableDataSource; import com.fr.data.impl.ClassTableData; @@ -29,6 +30,7 @@ import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.server.authority.user.UserAuthority; +import javax.swing.Icon; import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.Iterator; @@ -55,15 +57,15 @@ public abstract class TableDataFactory { * 同一类型的只能加一次,就加最上层的类,因为要排序。如果将所有的 FileTableData都加进来,那么FileTableData的排序就不正确了 */ static { - defaultMap.put(DBTableData.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/standard/database_normal.svg", DBTableData.class, DBTableDataPane.class)); - defaultMap.put(ClassTableData.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/standard/class_table_data_normal.svg", ClassTableData.class, ClassTableDataPane.class)); - defaultMap.put(EmbeddedTableData.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/standard/data_table_normal.svg", EmbeddedTableData.class, EmbeddedTableDataPane.class)); - defaultMap.put(DecoratedTableData.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/standard/multi_normal.svg", DecoratedTableData.class, DecoratedTableDataPane.class)); - defaultMap.put(StoreProcedure.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/standard/store_procedure_normal.svg", StoreProcedure.class, ProcedureDataPane.class)); - defaultMap.put(MultiTDTableData.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/standard/multi_normal.svg", MultiTDTableData.class, MultiTDTableDataPane.class)); - defaultMap.put(FileTableData.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/standard/file_normal.svg", FileTableData.class, FileTableDataPane.class)); - defaultMap.put(RecursionTableData.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/standard/tree_normal.svg", RecursionTableData.class, TreeTableDataPane.class)); - defaultMap.put(MultiFieldTableData.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/standard/database_normal.svg", MultiFieldTableData.class, null)); + defaultMap.put(DBTableData.class.getName(), new TableDataNameObjectCreator(null, new LazyIcon("database"), DBTableData.class, DBTableDataPane.class)); + defaultMap.put(ClassTableData.class.getName(), new TableDataNameObjectCreator(null, new LazyIcon("class_table_data"), ClassTableData.class, ClassTableDataPane.class)); + defaultMap.put(EmbeddedTableData.class.getName(), new TableDataNameObjectCreator(null, new LazyIcon("data_table"), EmbeddedTableData.class, EmbeddedTableDataPane.class)); + defaultMap.put(DecoratedTableData.class.getName(), new TableDataNameObjectCreator(null, new LazyIcon("multi"), DecoratedTableData.class, DecoratedTableDataPane.class)); + defaultMap.put(StoreProcedure.class.getName(), new TableDataNameObjectCreator(null, new LazyIcon("store_procedure"), StoreProcedure.class, ProcedureDataPane.class)); + defaultMap.put(MultiTDTableData.class.getName(), new TableDataNameObjectCreator(null, new LazyIcon("multi"), MultiTDTableData.class, MultiTDTableDataPane.class)); + defaultMap.put(FileTableData.class.getName(), new TableDataNameObjectCreator(null, new LazyIcon("file"), FileTableData.class, FileTableDataPane.class)); + defaultMap.put(RecursionTableData.class.getName(), new TableDataNameObjectCreator(null, new LazyIcon("tree"), RecursionTableData.class, TreeTableDataPane.class)); + defaultMap.put(MultiFieldTableData.class.getName(), new TableDataNameObjectCreator(null, new LazyIcon("database"), MultiFieldTableData.class, null)); map.putAll(defaultMap); } @@ -143,15 +145,26 @@ public abstract class TableDataFactory { /** * 获取数据集所对应的图标路径 * - * @param tabledata - * @return + * 获取图标直接使用 {@link #getIcon(TableData)} */ + @Deprecated public static String getIconPath(TableData tabledata) { TableDataNameObjectCreator tableDataNameObjectCreator = getTableDataNameObjectCreator(tabledata); if (tableDataNameObjectCreator != null && tableDataNameObjectCreator.getIconPath() != null) { return tableDataNameObjectCreator.getIconPath(); } - return "/com/fr/design/standard/database_normal.svg"; + return "database"; + } + + /** + * 获取数据集所对应的图标 + */ + public static Icon getIcon(TableData tabledata) { + TableDataNameObjectCreator tableDataNameObjectCreator = getTableDataNameObjectCreator(tabledata); + if (tableDataNameObjectCreator != null && tableDataNameObjectCreator.menuIcon() != null) { + return tableDataNameObjectCreator.menuIcon(); + } + return new LazyIcon(getIconPath(tabledata)); } /** diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/TemplateTableDataWrapper.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/TemplateTableDataWrapper.java index 93bb7bf3bf..f2442e7e84 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/TemplateTableDataWrapper.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/TemplateTableDataWrapper.java @@ -1,14 +1,13 @@ package com.fr.design.data.tabledata.wrapper; -import javax.swing.Icon; - import com.fr.base.TableData; -import com.fr.base.svg.IconUtils; import com.fr.base.svg.SVGLoader; import com.fr.data.impl.DBTableData; import com.fr.design.icon.WarningIcon; import com.fr.stable.StringUtils; +import javax.swing.Icon; + public final class TemplateTableDataWrapper extends AbstractTableDataWrapper { public TemplateTableDataWrapper(TableData tabledata) { super(tabledata); @@ -21,9 +20,9 @@ public final class TemplateTableDataWrapper extends AbstractTableDataWrapper { @Override public Icon getIcon() { if (tabledata instanceof DBTableData && StringUtils.isBlank(((DBTableData) tabledata).getQuery())) { - return new WarningIcon(SVGLoader.load("/com/fr/design/standard/database_normal.svg")); + return new WarningIcon(SVGLoader.load("/com/fr/design/standard/database.svg")); } - return IconUtils.readIcon(TableDataFactory.getIconPath(tabledata)); + return TableDataFactory.getIcon(tabledata); } @Override diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/AbstractNameableCreator.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/AbstractNameableCreator.java index 9ad08a9e63..c7a46b03f8 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/AbstractNameableCreator.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/AbstractNameableCreator.java @@ -1,13 +1,12 @@ package com.fr.design.gui.controlpane; -import com.fr.base.BaseUtils; import com.fr.base.svg.IconUtils; import com.fr.design.beans.BasicBeanPane; import com.fr.general.ComparatorUtils; import com.fr.general.NameObject; import com.fr.js.JavaScript; -import javax.swing.*; +import javax.swing.Icon; public abstract class AbstractNameableCreator implements NameableCreator { @@ -24,13 +23,28 @@ public abstract class AbstractNameableCreator implements NameableCreator { this.clazzOfEditor = clazzOfEditor; } + /** + * 改用 {@link AbstractNameableCreator#AbstractNameableCreator(String, Icon, Class)} + */ + @Deprecated public AbstractNameableCreator(String menuName, String iconPath, Class clazz) { this.menuName = menuName; this.menuIcon = IconUtils.readIcon(iconPath); this.clazzOfObject = clazz; this.clazzOfInitCase = clazz; } - + + public AbstractNameableCreator(String menuName, Icon icon, Class clazz) { + this.menuName = menuName; + this.menuIcon = icon; + this.clazzOfObject = clazz; + this.clazzOfInitCase = clazz; + } + + /** + * 改用{@link AbstractNameableCreator#AbstractNameableCreator(String, Icon, Class, Class)} + */ + @Deprecated public AbstractNameableCreator(String menuName, String iconPath, Class clazz, Class clazzOfEditor) { this.menuName = menuName; this.menuIcon = IconUtils.readIcon(iconPath); @@ -38,7 +52,19 @@ public abstract class AbstractNameableCreator implements NameableCreator { this.clazzOfEditor = clazzOfEditor; this.clazzOfInitCase = clazz; } - + + public AbstractNameableCreator(String menuName, Icon icon, Class clazz, Class clazzOfEditor) { + this.menuName = menuName; + this.menuIcon = icon; + this.clazzOfObject = clazz; + this.clazzOfEditor = clazzOfEditor; + this.clazzOfInitCase = clazz; + } + + /** + * 改用{@link AbstractNameableCreator#AbstractNameableCreator(String, Icon, Class, Class, Class)} + */ + @Deprecated public AbstractNameableCreator(String menuName, String iconPath, Class clazz, Class clazz4Init, Class clazzOfEditor) { this.menuName = menuName; this.menuIcon = IconUtils.readIcon(iconPath); @@ -48,6 +74,15 @@ public abstract class AbstractNameableCreator implements NameableCreator { this.clazzOfInitCase = clazz4Init; } + public AbstractNameableCreator(String menuName, Icon icon, Class clazz, Class clazz4Init, Class clazzOfEditor) { + this.menuName = menuName; + this.menuIcon = icon; + this.clazzOfObject = clazz; + this.clazzOfEditor = clazzOfEditor; + this.clazzOfInitCase = clazz; + this.clazzOfInitCase = clazz4Init; + } + /** * get menuName * @return diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/NameObjectCreator.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/NameObjectCreator.java index e7697183af..3b5f1efed3 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/NameObjectCreator.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/NameObjectCreator.java @@ -1,10 +1,12 @@ package com.fr.design.gui.controlpane; -import com.fr.general.NameObject; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.ilist.ListModelElement; +import com.fr.general.NameObject; import com.fr.stable.Nameable; +import javax.swing.Icon; + public class NameObjectCreator extends AbstractNameableCreator { @@ -16,18 +18,44 @@ public class NameObjectCreator extends AbstractNameableCreator { super(menuName, clazz, updatePane); } + /** + * 改用{@link NameObjectCreator#NameObjectCreator(String, Icon, Class)} + */ + @Deprecated public NameObjectCreator(String menuName, String iconPath, Class clazz) { super(menuName, iconPath, clazz); } - + + public NameObjectCreator(String menuName, Icon icon, Class clazz) { + super(menuName, icon, clazz); + } + + /** + * 改用{@link NameObjectCreator#NameObjectCreator(String, Icon, Class, Class)} + */ + @Deprecated public NameObjectCreator(String menuName, String iconPath, Class clazz, Class updatePane) { super(menuName, iconPath, clazz, updatePane); } - + + public NameObjectCreator(String menuName, Icon icon, Class clazz, Class updatePane) { + super(menuName, icon, clazz, updatePane); + } + + /** + * 改用{@link NameObjectCreator#NameObjectCreator(String, Icon, Class, Class, Class)} + */ + @Deprecated public NameObjectCreator(String menuName, String iconPath, Class clazz, Class clazz4Init, Class updatePane) { super(menuName, iconPath, clazz, clazz4Init, updatePane); } + public NameObjectCreator(String menuName, Icon icon, Class clazz, Class clazz4Init, Class updatePane) { + super(menuName, icon, clazz, clazz4Init, updatePane); + } + + + /** * create Nameable * @param helper diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/shortcutfactory/OldShortCutFactory.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/shortcutfactory/OldShortCutFactory.java index d0cf10f7e8..6d966a289a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/shortcutfactory/OldShortCutFactory.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/shortcutfactory/OldShortCutFactory.java @@ -79,7 +79,7 @@ public class OldShortCutFactory extends AbstractShortCutFactory { AddItemMenuDef(NameableCreator[] creators) { this.setName(com.fr.design.i18n.Toolkit.i18nText(("Fine-Design_Basic_Action_Add"))); this.setMnemonic('A'); - this.setIconPath("/com/fr/design/images/control/addPopup.png"); + this.setIconPath("addPopup"); wrapActionListener(creators); } diff --git a/designer-base/src/main/java/com/fr/design/gui/ilist/TableViewList.java b/designer-base/src/main/java/com/fr/design/gui/ilist/TableViewList.java index 8862493242..d2558012be 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ilist/TableViewList.java +++ b/designer-base/src/main/java/com/fr/design/gui/ilist/TableViewList.java @@ -1,5 +1,6 @@ package com.fr.design.gui.ilist; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseUtils; import com.fr.data.core.DataCoreUtils; import com.fr.data.core.db.TableProcedure; @@ -251,7 +252,7 @@ public class TableViewList extends UIList { } else if (ComparatorUtils.equals(type, TableProcedure.VIEW)) { icon = BaseUtils.readIcon("/com/fr/design/images/data/views.png"); } else { - icon = BaseUtils.readIcon("/com/fr/design/images/data/store_procedure.png"); + icon = new LazyIcon("store_procedure"); } this.setIcon(icon); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index 2db9d50e74..3df9250733 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseUtils; import com.fr.base.extension.FileExtension; import com.fr.base.vcs.DesignerMode; @@ -452,7 +453,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt public SwitchAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Search")); this.setMnemonic('S'); - this.setSmallIcon("/com/fr/design/standard/search", false); + this.setSmallIcon(new LazyIcon("search")); } @Override diff --git a/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateTreeSearchToolbarPane.java b/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateTreeSearchToolbarPane.java index ee9b861b1e..e12050c18b 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateTreeSearchToolbarPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateTreeSearchToolbarPane.java @@ -1,10 +1,8 @@ package com.fr.design.mainframe.manager.search.searcher.control.pane; +import com.fine.theme.icon.LazyIcon; import com.fr.base.svg.IconUtils; import com.fr.design.constants.UIConstants; -import com.fr.design.search.event.TreeSearchStatusChangeEvent; -import com.fr.design.search.event.TreeSearchStatusChangeListener; -import com.fr.design.search.TreeSearchStatus; import com.fr.design.file.TemplateTreePane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; @@ -12,6 +10,9 @@ import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.manager.search.TemplateTreeSearchManager; +import com.fr.design.search.TreeSearchStatus; +import com.fr.design.search.event.TreeSearchStatusChangeEvent; +import com.fr.design.search.event.TreeSearchStatusChangeListener; import com.fr.stable.StringUtils; import javax.swing.BorderFactory; @@ -107,7 +108,7 @@ public class TemplateTreeSearchToolbarPane extends JPanel implements TreeSearchS searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.TOOLBAR_BORDER_COLOR)); searchPane.setBackground(Color.WHITE); // 左侧搜索图标 - UILabel searchLabel = new UILabel(IconUtils.readIcon("/com/fr/design/standard/search")); + UILabel searchLabel = new UILabel(new LazyIcon("search")); searchLabel.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0)); searchLabel.addMouseListener(new MouseAdapter() { @Override diff --git a/designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off.svg b/designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off.svg new file mode 100755 index 0000000000..6f8804919f --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off.svg @@ -0,0 +1,7 @@ + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off_disabled.svg b/designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off_disable.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off_disabled.svg rename to designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off_disable.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off_normal.svg deleted file mode 100644 index c81b5419aa..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off_normal.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on.svg b/designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on.svg new file mode 100755 index 0000000000..fa45b2e20d --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on.svg @@ -0,0 +1,8 @@ + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on_disabled.svg b/designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on_disable.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on_disabled.svg rename to designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on_disable.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on_normal.svg deleted file mode 100644 index 13f924d88b..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on_normal.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/designer-base/src/main/resources/com/fr/design/standard/class_table_data.svg b/designer-base/src/main/resources/com/fr/design/standard/class_table_data.svg new file mode 100755 index 0000000000..e9d8a7d851 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/class_table_data.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/class_table_data_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/class_table_data_normal.svg deleted file mode 100644 index 19fc851ecd..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/class_table_data_normal.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/designer-base/src/main/resources/com/fr/design/standard/connection.svg b/designer-base/src/main/resources/com/fr/design/standard/connection.svg new file mode 100755 index 0000000000..6d45067212 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/connection.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/connection_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/connection_normal.svg deleted file mode 100644 index 7c865b45e0..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/connection_normal.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - icon_定义数据连接_normal备份 - - - - - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/data_table.svg b/designer-base/src/main/resources/com/fr/design/standard/data_table.svg new file mode 100755 index 0000000000..d3137e6741 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/data_table.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/data_table_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/data_table_normal.svg deleted file mode 100644 index 220cd95269..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/data_table_normal.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/database.svg b/designer-base/src/main/resources/com/fr/design/standard/database.svg new file mode 100755 index 0000000000..5fd6afb17b --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/database.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/database_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/database_normal.svg deleted file mode 100644 index 8c0361dcda..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/database_normal.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit.svg b/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit.svg new file mode 100755 index 0000000000..b43e5c10b5 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit.svg @@ -0,0 +1,6 @@ + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_disabled.svg b/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_disable.svg similarity index 89% rename from designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_disabled.svg rename to designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_disable.svg index 9b001cfc5f..c93e1e6904 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_disabled.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_disable.svg @@ -1,5 +1,5 @@ - + icon_编辑_disable diff --git a/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_normal.svg deleted file mode 100644 index 2917194523..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_normal.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - icon_编辑_normal - - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/field.svg b/designer-base/src/main/resources/com/fr/design/standard/field.svg new file mode 100755 index 0000000000..ac7b5bd3ec --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/field.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/field_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/field_normal.svg deleted file mode 100644 index 608d1fd589..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/field_normal.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/file.svg b/designer-base/src/main/resources/com/fr/design/standard/file.svg new file mode 100755 index 0000000000..969092dd91 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/file.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/file_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/file_normal.svg deleted file mode 100644 index cafbff6526..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/file_normal.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/designer-base/src/main/resources/com/fr/design/standard/multi.svg b/designer-base/src/main/resources/com/fr/design/standard/multi.svg new file mode 100755 index 0000000000..0f8eebe55c --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/multi.svg @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/multi_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/multi_normal.svg deleted file mode 100644 index 0c8144e634..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/multi_normal.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview.svg b/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview.svg new file mode 100755 index 0000000000..a271d50876 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview.svg @@ -0,0 +1,7 @@ + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_disabled.svg b/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_disable.svg similarity index 92% rename from designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_disabled.svg rename to designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_disable.svg index 6f2c4afa1f..b0e8234410 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_disabled.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_disable.svg @@ -1,5 +1,5 @@ - + icon_预览_disabled diff --git a/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_normal.svg deleted file mode 100644 index 0412b5e108..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_normal.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - icon_预览_normal - - - - diff --git a/designer-base/src/main/resources/com/fr/design/standard/remove/remove.svg b/designer-base/src/main/resources/com/fr/design/standard/remove/remove.svg new file mode 100755 index 0000000000..760055c5e2 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/remove/remove.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/remove/remove_disabled.svg b/designer-base/src/main/resources/com/fr/design/standard/remove/remove_disable.svg similarity index 89% rename from designer-base/src/main/resources/com/fr/design/standard/remove/remove_disabled.svg rename to designer-base/src/main/resources/com/fr/design/standard/remove/remove_disable.svg index b57f9a853d..93bca0fc3c 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/remove/remove_disabled.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/remove/remove_disable.svg @@ -1,5 +1,5 @@ - + icon_删除_normal diff --git a/designer-base/src/main/resources/com/fr/design/standard/remove/remove_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/remove/remove_normal.svg deleted file mode 100644 index b09268f454..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/remove/remove_normal.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - icon_删除_normal备份 - - - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/search_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/search.svg similarity index 91% rename from designer-base/src/main/resources/com/fr/design/standard/search_normal.svg rename to designer-base/src/main/resources/com/fr/design/standard/search.svg index 673548dfaf..0e0ebbbd44 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/search_normal.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/search.svg @@ -1,5 +1,5 @@ - + icon_搜索_normal diff --git a/designer-base/src/main/resources/com/fr/design/standard/server_database.svg b/designer-base/src/main/resources/com/fr/design/standard/server_database.svg new file mode 100755 index 0000000000..20fae8b6f2 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/server_database.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/server_database_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/server_database_normal.svg deleted file mode 100644 index 50a509fcbf..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/server_database_normal.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/store_procedure.svg b/designer-base/src/main/resources/com/fr/design/standard/store_procedure.svg new file mode 100755 index 0000000000..b1a15cb1c3 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/store_procedure.svg @@ -0,0 +1,20 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/store_procedure_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/store_procedure_normal.svg deleted file mode 100644 index 55393d59ab..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/store_procedure_normal.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/designer-base/src/main/resources/com/fr/design/standard/tree.svg b/designer-base/src/main/resources/com/fr/design/standard/tree.svg new file mode 100755 index 0000000000..9086b2a553 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/tree.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/tree_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/tree_normal.svg deleted file mode 100644 index cc965888e7..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/tree_normal.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file From b75652dc438f16b7e0bee2d5266b4a35f756fe91 Mon Sep 17 00:00:00 2001 From: vito Date: Fri, 24 Nov 2023 15:37:47 +0800 Subject: [PATCH 005/302] =?UTF-8?q?REPORT-99485=20UI=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=88=86=E7=A6=BBDemo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connect/ConnectionComboBoxPanel.java | 200 ++++--- .../connect/ConnectionTableProcedurePane.java | 548 +++++++++--------- .../connect/ItemEditableComboBoxPanel.java | 182 ------ .../tabledatapane/DBTableDataPane.java | 505 ++++------------ .../tabledatapane/DBTableDataViewModel.java | 281 +++++++++ 5 files changed, 787 insertions(+), 929 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataViewModel.java diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionComboBoxPanel.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionComboBoxPanel.java index 76f32d6f0c..d3b1a720d7 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionComboBoxPanel.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionComboBoxPanel.java @@ -1,7 +1,9 @@ package com.fr.design.data.datapane.connect; +import com.fine.state.livedata.LiveData; +import com.fine.swing.ui.layout.Row; +import com.fr.base.BaseUtils; import com.fr.base.svg.IconUtils; -import com.fr.data.impl.AbstractDatabaseConnection; import com.fr.data.impl.Connection; import com.fr.data.impl.NameDatabaseConnection; import com.fr.design.DesignerEnvManager; @@ -9,22 +11,23 @@ import com.fr.design.editlock.ConnectionLockChangeChecker; import com.fr.design.editlock.EditLockUtils; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UILockButton; -import com.fr.file.ConnectionConfig; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.i18n.Toolkit; +import com.fr.log.FineLoggerFactory; import com.fr.report.LockItem; import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; -import com.fr.workspace.server.connection.DBConnectAuth; +import org.jetbrains.annotations.Nullable; +import javax.swing.DefaultComboBoxModel; import javax.swing.SwingUtilities; -import java.awt.Dimension; -import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; import java.util.List; +import java.util.Objects; +import java.util.concurrent.CancellationException; +import java.util.function.Consumer; + +import static com.fine.swing.ui.layout.Layouts.cell; /** * 选择数据连接的下拉框 @@ -32,86 +35,150 @@ import java.util.List; * @editor zhou * @since 2012-3-28下午3:02:30 */ -public class ConnectionComboBoxPanel extends ItemEditableComboBoxPanel { - /** - * - */ +public class ConnectionComboBoxPanel extends Row { private static final long serialVersionUID = 1L; - private Class cls; // 所取的Connection都是cls及其子类 - private List nameList = new ArrayList(); - public ConnectionComboBoxPanel(Class cls) { - super(); + private static final String PENDING = Toolkit.i18nText("Fine-Design_Basic_Loading") + "..."; + + protected static final Object EMPTY = new Object() { + public String toString() { + return ""; + } + }; - this.cls = cls; + protected UIComboBox itemComboBox; + protected UIButton editButton; + + // 记录原来选中的Item,重新加载后需要再次选中 + private Object lastSelectedItem; + + private final LiveData> names; + private final Consumer fetchNames; + + public ConnectionComboBoxPanel( + LiveData> names, + LiveData selectedItem, + @Nullable Consumer fetchNames, + @Nullable Consumer selecteChangeConsumer + ) { + super(); + this.names = names; + this.fetchNames = fetchNames; + initComponents(); // alex:添加item change监听,当改变时改变DesignerEnvManager中的最近选中的数据连接 - this.itemComboBox.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - String selected = ConnectionComboBoxPanel.this.getSelectedItem(); - if (StringUtils.isNotBlank(selected)) { - DesignerEnvManager.getEnvManager().setRecentSelectedConnection(selected); + this.itemComboBox.addItemListener(e -> { + String selected = ConnectionComboBoxPanel.this.getSelectedItem(); + if(PENDING.equals(selected)){ + return; + } + if (StringUtils.isNotBlank(selected)) { + DesignerEnvManager.getEnvManager().setRecentSelectedConnection(selected); + } + if(!Objects.isNull(selecteChangeConsumer)){ + selecteChangeConsumer.accept(selected); + } + }); + names.observeForever(strings -> { + try { + itemComboBox.setModel(new DefaultComboBoxModel<>(strings.toArray(new String[0]))); +// // 如果加载成功 但是下拉框是可见的 下拉框高度是会固定为原始高度 不会因为填充了更多下拉项而变化 +// // 需要重新设置下拉框高度 但值一样时相关事件不会生效 所以先加再减下 +// if (itemComboBox.isPopupVisible()) { +// itemComboBox.setMaximumRowCount(itemComboBox.getMaximumRowCount() + 1); +// itemComboBox.setMaximumRowCount(itemComboBox.getMaximumRowCount() - 1); +// } +// // 存在两种场景之前只考虑了填充场景 有populate会填充下 把这边的填充逻辑删了 所以没有问题 +// // 如果是纯通过刷新按钮 没有populate 需要手动设置下上次选中的内容 + if (lastSelectedItem != null) { + itemComboBox.setSelectedItem(lastSelectedItem); + } + } catch (Exception e) { + if (!(e instanceof CancellationException)) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } }); + + + lastSelectedItem = selectedItem.getValue(); refreshItems(); } - @Override - protected UIButton initEditButton(UIButton editButton, Dimension buttonSize) { - editButton = new UILockButton( + private void initComponents() { + setSpacing(5); + add( + cell(new UIComboBox()).weight(1.0).with(uiComboBox -> { + this.itemComboBox= uiComboBox; + uiComboBox.setEnabled(true); + + }), + cell(new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png"))) + .with(btn -> btn.addActionListener(e -> refreshItems())), + cell(initEditButton()).with(uiButton -> editButton = uiButton) + ); + } + + + /** + * 给itemComboBox添加ActionListener + */ + public void addComboBoxActionListener(ActionListener l) { + itemComboBox.addActionListener(l); + } + + /* + * 刷新itemComboBox的内容 + */ + protected void refreshItems() { + lastSelectedItem = itemComboBox.getSelectedItem(); + DefaultComboBoxModel model = ((DefaultComboBoxModel) itemComboBox.getModel()); + + model.removeAllElements(); + + // 先加EMPTY,再加items + model.addElement(PENDING); + if(!Objects.isNull(fetchNames)){ + fetchNames.accept(null); + } + } + + protected UIButton initEditButton() { + UIButton editButton = new UILockButton( EditLockUtils.CONNECTION_LOCKED_ICON, IconUtils.readIcon("/com/fr/design/images/m_web/connection"), EditLockUtils.CONNECTION_LOCKED_TOOLTIPS, null ); - editButton.setPreferredSize(buttonSize); - editButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - editItems(); - } - }); +// editButton.setPreferredSize(buttonSize); + editButton.addActionListener(evt -> editItems()); ConnectionLockChangeChecker.getInstance().addEditLockChangeListener((UILockButton) editButton); return editButton; } /* - * 刷新ComboBox.items + * 得到其中的itemComboBox所选中的Item */ - protected Iterator items() { - ConnectionConfig mgr = ConnectionConfig.getInstance(); - Iterator nameIt = mgr.getConnections().keySet().iterator(); - - Collection noAuthConnections = WorkContext.getCurrent().get(DBConnectAuth.class).getNoAuthConnections(); + public String getSelectedItem() { + Object selected = itemComboBox.getSelectedItem(); - nameList = new ArrayList<>(); - - if (noAuthConnections == null) { - return nameList.iterator(); - } - while (nameIt.hasNext()) { - String conName = nameIt.next(); - if (noAuthConnections.contains(conName)) { - continue; - } - Connection connection = mgr.getConnection(conName); - // nameList依赖items方法初始化,父类ItemEditableComboBoxPanel里异步执行item方法 - filterConnection(connection, conName, nameList); - } - - return nameList.iterator(); + return selected instanceof String ? (String)selected : null; } - protected void filterConnection(Connection connection, String conName, List nameList) { - connection.addConnection(nameList, conName, new Class[]{AbstractDatabaseConnection.class}); + /* + * 选中name项 + */ + public void setSelectedItem(String name) { + DefaultComboBoxModel model = ((DefaultComboBoxModel) itemComboBox.getModel()); + model.setSelectedItem(name); } public int getConnectionSize() { - return nameList.size(); + return names.getValue().size(); } public String getConnection(int i) { - return nameList.get(i); + return names.getValue().get(i); } /* @@ -148,9 +215,7 @@ public class ConnectionComboBoxPanel extends ItemEditableComboBoxPanel { protected void setRecentConnection() { String s = DesignerEnvManager.getEnvManager().getRecentSelectedConnection(); if (StringUtils.isNotBlank(s)) { - // 之前的写法有多线程问题,nameList异步尚未初始化完成的时候,这里可能无法匹配设置数据连接名称,导致DBTableDataPane打开后连接面板空白 - // 这里的需求无非是设置上一次使用的数据连接,做个简单检查这个连接是否存在即可,存在就设置 - if (nameList.contains(s)) { + if (names.getValue().contains(s)) { this.setSelectedItem(s); } } @@ -160,12 +225,5 @@ public class ConnectionComboBoxPanel extends ItemEditableComboBoxPanel { } } - /** - * 是否无选中状态(空白item也视为无选中) - * @return - */ - protected boolean isSelectedItemEmpty() { - String selectedItem = this.getSelectedItem(); - return selectedItem == null || StringUtils.equals(selectedItem, EMPTY.toString()); - } -} + +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java index 41556dae83..de5d1ed8a7 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java @@ -1,13 +1,14 @@ package com.fr.design.data.datapane.connect; +import com.fine.state.livedata.LiveData; +import com.fine.state.livedata.MutableLiveData; import com.fr.base.BaseUtils; import com.fr.base.svg.IconUtils; import com.fr.data.core.db.TableProcedure; -import com.fr.data.impl.AbstractDatabaseConnection; import com.fr.data.impl.Connection; +import com.fr.design.DesignerEnvManager; import com.fr.design.border.UIRoundedBorder; import com.fr.design.constants.UIConstants; -import com.fr.design.data.tabledata.tabledatapane.loading.SwitchableTableDataPane; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icontainer.UIScrollPane; @@ -18,21 +19,24 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.general.GeneralContext; import com.fr.stable.ArrayUtils; +import com.fr.stable.StringUtils; import javax.swing.BorderFactory; -import javax.swing.DefaultComboBoxModel; import javax.swing.JPanel; import javax.swing.ToolTipManager; +import javax.swing.border.EmptyBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.BorderLayout; import java.awt.Dimension; -import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import java.util.function.Consumer; /** * 数据集编辑面板左边的部分 @@ -41,277 +45,269 @@ import java.util.List; * @since 2012-3-28下午10:14:59 */ public class ConnectionTableProcedurePane extends BasicPane { - private static int WIDTH = 155; - private ConnectionComboBoxPanel connectionComboBox; - private UICheckBox tableCheckBox; - private UICheckBox viewCheckBox; - protected UITextField searchField; - private TableViewList tableViewList; - private java.util.List listeners = new java.util.ArrayList(); - - public ConnectionTableProcedurePane() { - init(null); - } - - /** - * 传入父容器 - * @param parent - */ - public ConnectionTableProcedurePane(SwitchableTableDataPane parent) { - init(parent); - } - - private void init(SwitchableTableDataPane parent) { - this.setLayout(new BorderLayout(4, 4)); - // 初始化数据连接下拉框 - initConnectionComboBox(parent); - // 初始化中间的面板 - JPanel centerPane = initCenterPane(); - this.add(connectionComboBox, BorderLayout.NORTH); - this.add(centerPane, BorderLayout.CENTER); - this.setPreferredSize(new Dimension(WIDTH, getPreferredSize().height)); - addKeyMonitor(); - } - - private JPanel initCenterPane() { - JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - // 搜索面板 - centerPane.add(createSearchPane(), BorderLayout.NORTH); - // 数据库表视图面板 - centerPane.add(createTableViewBorderPane(), BorderLayout.CENTER); - return centerPane; - } - - private void initConnectionComboBox(SwitchableTableDataPane parent) { - connectionComboBox = new ConnectionComboBoxPanel(com.fr.data.impl.Connection.class) { - - @Override - protected void filterConnection(Connection connection, String conName, List nameList) { - filter(connection, conName, nameList); - } - - @Override - protected void refreshItems() { - super.refreshItems(); - if (tableViewList != null) { - search(true); - } - } - - @Override - protected void afterRefreshItems() { - // 刷新完成后,如果未选中(在nameList初始化完成之前可能会出现),则尝试再次设置 - if (isSelectedItemEmpty()) { - setRecentConnection(); - } - // 获取数据连接之后,让父容器切换面板 - if (parent != null) { - parent.switchTo(SwitchableTableDataPane.CONTENT_PANE_NAME); - } - DefaultComboBoxModel model = ((DefaultComboBoxModel) itemComboBox.getModel()); - model.removeElement(EMPTY); - } - - @Override - protected void refreshItemsError() { - // 获取数据连接出现错误时,也让父容器从Loading面板切换至内容面板 - if (parent != null) { - parent.switchTo(SwitchableTableDataPane.CONTENT_PANE_NAME); - } - } - }; - connectionComboBox.addComboBoxActionListener(filter); - } - - private JPanel createTableViewBorderPane() { - tableViewList = new TableViewList(); - ToolTipManager.sharedInstance().registerComponent(tableViewList); - - tableViewList.addMouseListener(new MouseAdapter() { - public void mouseClicked(MouseEvent evt) { - if (evt.getClickCount() >= 2) { - Object obj = tableViewList.getSelectedValue(); - TableProcedure tableProcedure = null; - if (obj instanceof TableProcedure) { - tableProcedure = (TableProcedure) obj; - } else { - return; - } - for (int i = 0; i < ConnectionTableProcedurePane.this.listeners.size(); i++) { - ConnectionTableProcedurePane.this.listeners.get(i).actionPerformed(tableProcedure); - } - } - } - }); - UIScrollPane tableViewListPane = new UIScrollPane(tableViewList); - tableViewListPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); - JPanel tableViewBorderPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - tableViewBorderPane.add(tableViewListPane, BorderLayout.CENTER); - JPanel checkBoxgroupPane = createCheckBoxgroupPane(); - if (checkBoxgroupPane != null) { - tableViewBorderPane.add(createCheckBoxgroupPane(), BorderLayout.SOUTH); - } - return tableViewBorderPane; - } - - /** - * 创建搜索Panel,用于搜索表或视图 - * @return - */ - private JPanel createSearchPane() { - JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - JPanel searchPane = new JPanel(new BorderLayout(10, 0)); - searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.TOOLBAR_BORDER_COLOR)); + private static int WIDTH = 155; + private ConnectionComboBoxPanel connectionComboBox; + private UICheckBox tableCheckBox; + private UICheckBox viewCheckBox; + protected UITextField searchField; + private TableViewList tableViewList; + private List listeners = new ArrayList(); + + private ConnectionTableState state; + + public MutableLiveData selected = new MutableLiveData<>(); + public Consumer selecteChangeConsumer; + + public static class ConnectionTableState { + public LiveData> names; + public Consumer namesConsumer; + public LiveData> tableProcedures; + public Consumer tableProcedureBeanConsumer; + + public ConnectionTableState(LiveData> names, Consumer namesConsumer, LiveData> tableProcedures, Consumer tableProcedureBeanConsumer) { + this.names = names; + this.namesConsumer = namesConsumer; + this.tableProcedures = tableProcedures; + this.tableProcedureBeanConsumer = tableProcedureBeanConsumer; + } + } + + public ConnectionTableProcedurePane() { + init(); + } + + public ConnectionTableProcedurePane(ConnectionTableState state) { + this.state = state; + init(); + } + + + private void init() { + selecteChangeConsumer = selectedName -> { + selected.setValue(selectedName); + }; + this.setLayout(new BorderLayout(4, 4)); + + // 初始化中间的面板 + JPanel centerPane = initCenterPane(); + this.add(centerPane, BorderLayout.CENTER); + // 初始化数据连接下拉框 + initConnectionComboBox(); + this.add(connectionComboBox, BorderLayout.NORTH); + setBorder(new EmptyBorder( + 10, 10, 10, 10 + )); + this.setPreferredSize(new Dimension(WIDTH, getPreferredSize().height)); + addKeyMonitor(); + state.names.observeForever(strings -> { + search(true); + }); + } + + + protected void filter(Connection connection, String conName, List nameList) { + + } + + private JPanel initCenterPane() { + JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + // 搜索面板 + centerPane.add(createSearchPane(), BorderLayout.NORTH); + // 数据库表视图面板 + centerPane.add(createTableViewBorderPane(), BorderLayout.CENTER); + return centerPane; + } + + private void initConnectionComboBox() { + connectionComboBox = new ConnectionComboBoxPanel(state.names, selected,state.namesConsumer, selecteChangeConsumer); + connectionComboBox.addComboBoxActionListener(filter); + } + + + + private JPanel createTableViewBorderPane() { + tableViewList = new TableViewList(state.tableProcedures, state.tableProcedureBeanConsumer); + ToolTipManager.sharedInstance().registerComponent(tableViewList); + + tableViewList.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent evt) { + if (evt.getClickCount() >= 2) { + Object obj = tableViewList.getSelectedValue(); + TableProcedure tableProcedure = null; + if (obj instanceof TableProcedure) { + tableProcedure = (TableProcedure) obj; + } else { + return; + } + for (DoubleClickSelectedNodeOnTreeListener listener : ConnectionTableProcedurePane.this.listeners) { + listener.actionPerformed(tableProcedure); + } + } + } + }); + UIScrollPane tableViewListPane = new UIScrollPane(tableViewList); + tableViewListPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); + JPanel tableViewBorderPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + tableViewBorderPane.add(tableViewListPane, BorderLayout.CENTER); + JPanel checkBoxgroupPane = createCheckBoxgroupPane(); + if (checkBoxgroupPane != null) { + tableViewBorderPane.add(createCheckBoxgroupPane(), BorderLayout.SOUTH); + } + return tableViewBorderPane; + } + + /** + * 创建搜索Panel,用于搜索表或视图 + * + * @return + */ + private JPanel createSearchPane() { + JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + JPanel searchPane = new JPanel(new BorderLayout(10, 0)); + searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.TOOLBAR_BORDER_COLOR)); // searchPane.setBackground(Color.WHITE); - searchField = new UITextField(); - searchField.setBorderPainted(false); - searchField.setPlaceholder(Toolkit.i18nText("Fine-Design_Basic_Table_Search")); - searchField.getDocument().addDocumentListener(searchListener); - searchField.addMouseListener(new MouseAdapter() { - @Override - public void mouseEntered(MouseEvent e) { - super.mouseEntered(e); - searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.CHECKBOX_HOVER_SELECTED)); - } - - @Override - public void mouseExited(MouseEvent e) { - super.mouseExited(e); - searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.TOOLBAR_BORDER_COLOR)); - } - }); - // 搜索图标 - UILabel searchLabel = new UILabel(IconUtils.readIcon("/com/fr/design/images/data/search")); - searchLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); - searchPane.add(searchField, BorderLayout.CENTER); - searchPane.add(searchLabel, BorderLayout.EAST); - panel.add(searchPane, BorderLayout.CENTER); - return panel; - } - - protected void filter(Connection connection, String conName, List nameList) { - connection.addConnection(nameList, conName, new Class[]{AbstractDatabaseConnection.class}); - } - - protected void addKeyMonitor() { - //do nothing - } - - protected JPanel createCheckBoxgroupPane() { - JPanel checkBoxgroupPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); - JPanel first = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - tableCheckBox = new UICheckBox(); - tableCheckBox.setSelected(true); - tableCheckBox.addActionListener(filter); - first.add(tableCheckBox); - - JPanel second = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - viewCheckBox = new UICheckBox(); - viewCheckBox.setSelected(true); - viewCheckBox.addActionListener(filter); - second.add(viewCheckBox); - - // 根据环境是否为中文设置不同的显示 - if (GeneralContext.isChineseEnv()) { - first.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_SQL_Table"), - BaseUtils.readIcon("/com/fr/design/images/data/tables.png"), UILabel.LEADING)); - second.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_SQL_View"), - BaseUtils.readIcon("/com/fr/design/images/data/views.png"), UILabel.LEADING)); - } else { - UILabel ui1 = new UILabel(BaseUtils.readIcon("/com/fr/design/images/data/tables.png"), UILabel.LEADING); - UILabel ui2 = new UILabel(BaseUtils.readIcon("/com/fr/design/images/data/views.png"), UILabel.LEADING); - ui1.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_SQL_Table")); - ui2.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_SQL_View")); - first.add(ui1); - second.add(ui2); - } - checkBoxgroupPane.add(first); - checkBoxgroupPane.add(second); - - return checkBoxgroupPane; - } - - /** - * 给 itemComboBox 加上 itemListener - * - * @param itemListener - */ - public void addItemListener(ItemListener itemListener) { - connectionComboBox.itemComboBox.addItemListener(itemListener); - } - - private DocumentListener searchListener = new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - search(false); - } - - @Override - public void insertUpdate(DocumentEvent e) { - search(false); - } - - @Override - public void changedUpdate(DocumentEvent e) { - search(false); - } - }; - - private ActionListener filter = new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - search(false); - } - }; - - /** - * 选项改变,需要重新刷新下拉列表里面的项 - */ - protected void search(boolean refresh) { - String selectedObj = connectionComboBox.getSelectedItem(); - - String[] types = ArrayUtils.EMPTY_STRING_ARRAY; - if (tableCheckBox != null) { - if (tableCheckBox.isSelected()) { - types = (String[]) ArrayUtils.add(types, TableProcedure.TABLE); - } - if (viewCheckBox.isSelected()) { - types = (String[]) ArrayUtils.add(types, TableProcedure.VIEW); - } - } else { - types = (String[]) ArrayUtils.add(types, TableProcedure.PROCEDURE); - } - tableViewList.populate(selectedObj, searchField.getText().trim(), refresh, types); - } - - @Override - protected String title4PopupWindow() { - return "Connection"; - } - - /** - * @param l - */ - public void addDoubleClickListener(DoubleClickSelectedNodeOnTreeListener l) { - this.listeners.add(l); - } - - public void setSelectedDatabaseConnection(com.fr.data.impl.Connection db) { - connectionComboBox.populate(db); - } - - public String getSelectedDatabaseConnnectonName() { - return connectionComboBox.getSelectedItem(); - } - - public static interface DoubleClickSelectedNodeOnTreeListener { - /** - * 处理双击事件 - * - * @param target - */ - public void actionPerformed(TableProcedure target); - } + searchField = new UITextField(); + searchField.setBorderPainted(false); + searchField.setPlaceholder(Toolkit.i18nText("Fine-Design_Basic_Table_Search")); + searchField.getDocument().addDocumentListener(searchListener); + searchField.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + super.mouseEntered(e); + searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.CHECKBOX_HOVER_SELECTED)); + } + + @Override + public void mouseExited(MouseEvent e) { + super.mouseExited(e); + searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.TOOLBAR_BORDER_COLOR)); + } + }); + // 搜索图标 + UILabel searchLabel = new UILabel(IconUtils.readIcon("/com/fr/design/images/data/search")); + searchLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); + searchPane.add(searchField, BorderLayout.CENTER); + searchPane.add(searchLabel, BorderLayout.EAST); + panel.add(searchPane, BorderLayout.CENTER); + return panel; + } + + protected void addKeyMonitor() { + //do nothing + } + + protected JPanel createCheckBoxgroupPane() { + JPanel checkBoxgroupPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); + JPanel first = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + tableCheckBox = new UICheckBox(); + tableCheckBox.setSelected(true); + tableCheckBox.addActionListener(filter); + first.add(tableCheckBox); + + JPanel second = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + viewCheckBox = new UICheckBox(); + viewCheckBox.setSelected(true); + viewCheckBox.addActionListener(filter); + second.add(viewCheckBox); + + // 根据环境是否为中文设置不同的显示 + if (GeneralContext.isChineseEnv()) { + first.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_SQL_Table"), + BaseUtils.readIcon("/com/fr/design/images/data/tables.png"), UILabel.LEADING)); + second.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_SQL_View"), + BaseUtils.readIcon("/com/fr/design/images/data/views.png"), UILabel.LEADING)); + } else { + UILabel ui1 = new UILabel(BaseUtils.readIcon("/com/fr/design/images/data/tables.png"), UILabel.LEADING); + UILabel ui2 = new UILabel(BaseUtils.readIcon("/com/fr/design/images/data/views.png"), UILabel.LEADING); + ui1.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_SQL_Table")); + ui2.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_SQL_View")); + first.add(ui1); + second.add(ui2); + } + checkBoxgroupPane.add(first); + checkBoxgroupPane.add(second); + + return checkBoxgroupPane; + } + + /** + * 给 itemComboBox 加上 itemListener + * + * @param itemListener + */ + public void addItemListener(ItemListener itemListener) { + connectionComboBox.itemComboBox.addItemListener(itemListener); + } + + private final DocumentListener searchListener = new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + search(false); + } + + @Override + public void insertUpdate(DocumentEvent e) { + search(false); + } + + @Override + public void changedUpdate(DocumentEvent e) { + search(false); + } + }; + + private final ActionListener filter = e -> search(false); + + /** + * 选项改变,需要重新刷新下拉列表里面的项 + */ + protected void search(boolean refresh) { + String selectedObj = selected.getValue(); + if(StringUtils.isBlank(selectedObj)){ + selectedObj = DesignerEnvManager.getEnvManager().getRecentSelectedConnection(); + } + + String[] types = ArrayUtils.EMPTY_STRING_ARRAY; + if (tableCheckBox != null) { + if (tableCheckBox.isSelected()) { + types = ArrayUtils.add(types, TableProcedure.TABLE); + } + if (viewCheckBox.isSelected()) { + types = ArrayUtils.add(types, TableProcedure.VIEW); + } + } else { + types = ArrayUtils.add(types, TableProcedure.PROCEDURE); + } + tableViewList.populate(selectedObj, searchField.getText().trim(), refresh, types); + } + + @Override + protected String title4PopupWindow() { + return "Connection"; + } + + /** + * @param l + */ + public void addDoubleClickListener(DoubleClickSelectedNodeOnTreeListener l) { + this.listeners.add(l); + } + + public void setSelectedDatabaseConnection(com.fr.data.impl.Connection db) { + connectionComboBox.populate(db); + } + + public String getSelectedDatabaseConnnectonName() { + return connectionComboBox.getSelectedItem(); + } + + public static interface DoubleClickSelectedNodeOnTreeListener { + /** + * 处理双击事件 + * + * @param target + */ + public void actionPerformed(TableProcedure target); + } } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ItemEditableComboBoxPanel.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ItemEditableComboBoxPanel.java index a430a13bd1..8b13789179 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ItemEditableComboBoxPanel.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ItemEditableComboBoxPanel.java @@ -1,183 +1 @@ -package com.fr.design.data.datapane.connect; -import com.fr.base.BaseUtils; -import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.icombobox.UIComboBox; -import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; - -import com.fr.log.FineLoggerFactory; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.util.Iterator; -import java.util.concurrent.CancellationException; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import javax.swing.DefaultComboBoxModel; -import javax.swing.JPanel; -import javax.swing.SwingWorker; - -public abstract class ItemEditableComboBoxPanel extends JPanel { - /** - * - */ - private static final long serialVersionUID = 1L; - - private static final String PENDING = Toolkit.i18nText("Fine-Design_Basic_Loading") + "..."; - - protected static final Object EMPTY = new Object() { - public String toString() { - return ""; - } - }; - - protected UIComboBox itemComboBox; - protected UIButton editButton; - protected UIButton refreshButton; - - private SwingWorker, Void> refreshWorker; - - public ItemEditableComboBoxPanel() { - super(); - - initComponents(); - } - - protected void initComponents() { - this.setLayout(FRGUIPaneFactory.createM_BorderLayout()); - Dimension buttonSize = new Dimension(26, 20); - itemComboBox = new UIComboBox(); - itemComboBox.setEnabled(true); - this.add(itemComboBox, BorderLayout.CENTER); - refreshButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); - JPanel jPanel = FRGUIPaneFactory.createNColumnGridInnerContainer_Pane(2, 4 ,4); - editButton = initEditButton(editButton, buttonSize); - jPanel.add(editButton); - jPanel.add(refreshButton); - this.add(jPanel, BorderLayout.EAST); - refreshButton.setPreferredSize(buttonSize); - refreshButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - refreshItems(); - } - }); - } - - protected UIButton initEditButton(UIButton editButton, Dimension buttonSize) { - editButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/control-center2.png")); - editButton.setPreferredSize(buttonSize); - editButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - editItems(); - } - }); - return editButton; - } - - - /** - * 给itemComboBox添加ActionListener - */ - public void addComboBoxActionListener(ActionListener l) { - itemComboBox.addActionListener(l); - } - - /* - * 刷新itemComboBox的内容 - */ - protected void refreshItems() { - - if (refreshWorker != null && !refreshWorker.isDone()) { - refreshWorker.cancel(true); - } - - // 记录原来选中的Item,重新加载后需要再次选中 - Object lastSelectedItem = itemComboBox.getSelectedItem(); - - DefaultComboBoxModel model = ((DefaultComboBoxModel) itemComboBox.getModel()); - model.removeAllElements(); - - // 先加EMPTY,再加items - model.addElement(EMPTY); - model.addElement(PENDING); - - // 存在两种场景之前只考虑了填充场景 有populate会填充下 把这边的填充逻辑删了 所以没有问题 - // 如果是纯通过刷新按钮 没有populate 需要手动设置下上次选中的内容 - if (lastSelectedItem != null) { - model.setSelectedItem(lastSelectedItem); - } - - refreshWorker = new SwingWorker, Void>() { - @Override - protected Iterator doInBackground() throws Exception { - return items(); - } - - @Override - protected void done() { - try { - Iterator itemIt = get(); - model.removeElement(PENDING); - while(itemIt.hasNext()) { - model.addElement(itemIt.next()); - } - // 如果加载成功 但是下拉框是可见的 下拉框高度是会固定为原始高度 不会因为填充了更多下拉项而变化 - // 需要重新设置下拉框高度 但值一样时相关事件不会生效 所以先加再减下 - if (itemComboBox.isPopupVisible()) { - itemComboBox.setMaximumRowCount(itemComboBox.getMaximumRowCount() + 1); - itemComboBox.setMaximumRowCount(itemComboBox.getMaximumRowCount() - 1); - } - afterRefreshItems(); - } catch (Exception e) { - if (!(e instanceof CancellationException)) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - refreshItemsError(); - } - - } - }; - refreshWorker.execute(); - } - - /* - * 得到其中的itemComboBox所选中的Item - */ - public String getSelectedItem() { - Object selected = itemComboBox.getSelectedItem(); - - return selected instanceof String ? (String)selected : null; - } - - /* - * 选中name项 - */ - public void setSelectedItem(String name) { - DefaultComboBoxModel model = ((DefaultComboBoxModel) itemComboBox.getModel()); - model.setSelectedItem(name); - } - - /* - * 刷新ComboBox.items - */ - protected abstract java.util.Iterator items(); - - /** - * 刷新ComboBox.items之后 - */ - protected void afterRefreshItems() { - // 空实现,供子类重写 - } - - /** - * 刷新ComboBox.items时出现异常 - */ - protected void refreshItemsError() { - // 空实现,供子类重写 - } - - /* - * 弹出对话框编辑Items - */ - protected abstract void editItems(); -} diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java index d0ffd7f22c..db0f03e72b 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java @@ -1,35 +1,24 @@ package com.fr.design.data.tabledata.tabledatapane; -import com.fr.base.Parameter; -import com.fr.base.ParameterHelper; -import com.fr.data.core.db.TableProcedure; +import com.fine.state.livedata.DocumentLiveData; import com.fr.data.impl.Connection; import com.fr.data.impl.DBTableData; import com.fr.data.impl.JDBCDatabaseConnection; import com.fr.data.impl.JNDIDatabaseConnection; -import com.fr.data.impl.NameDatabaseConnection; import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.UpdateAction; import com.fr.design.border.UIRoundedBorder; import com.fr.design.constants.UIConstants; -import com.fr.design.data.StrategyConfigAttrUtils; -import com.fr.design.data.datapane.ESDStrategyConfigPane; import com.fr.design.data.datapane.connect.ConnectionTableProcedurePane; import com.fr.design.data.datapane.preview.PreviewTablePane; import com.fr.design.data.datapane.preview.sql.PreviewPerformedSqlPane; import com.fr.design.data.datapane.sqlpane.SQLEditPane; -import com.fr.design.data.tabledata.strategy.StrategyConfigHandler; -import com.fr.design.data.tabledata.tabledatapane.db.StrategyConfigFrom; import com.fr.design.data.tabledata.tabledatapane.loading.SwitchableTableDataPane; import com.fr.design.data.tabledata.tabledatapane.loading.TipsPane; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; -import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.fun.DBTableDataMenuHandler; -import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itableeditorpane.ParameterTableModel; import com.fr.design.gui.itableeditorpane.UITableEditAction; @@ -42,25 +31,15 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; import com.fr.design.menu.SeparatorDef; import com.fr.design.menu.ToolBarDef; -import com.fr.design.utils.ParameterUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.esd.core.strategy.config.StrategyConfig; -import com.fr.esd.core.strategy.config.StrategyConfigHelper; -import com.fr.esd.core.strategy.config.service.StrategyConfigService; -import com.fr.esd.data.db.DBTableDataSavedHook; -import com.fr.esd.event.DSMapping; -import com.fr.esd.event.DsNameTarget; -import com.fr.esd.event.StrategyEventsNotifier; -import com.fr.esd.query.StrategicTableData; import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; -import com.fr.general.sql.SqlUtils; import com.fr.log.FineLoggerFactory; import com.fr.script.Calculator; import com.fr.stable.ArrayUtils; import com.fr.stable.ParameterProvider; import com.fr.stable.StringUtils; -import com.fr.workspace.WorkContext; import javax.swing.BorderFactory; import javax.swing.Box; @@ -69,20 +48,16 @@ import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JToolBar; -import javax.swing.SwingUtilities; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import java.awt.BorderLayout; import java.awt.CardLayout; -import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; -import java.util.ArrayList; import java.util.List; /** @@ -99,27 +74,22 @@ public class DBTableDataPane extends AbstractTableDataPane implemen private UITableEditorPane editorPane; private DBTableDataMenuHandler dbTableDataMenuHandler; private SQLEditPane sqlTextPane; - private String pageQuery; - private DBTableData dbTableData; - //ESD - private UILabel esdSettingsLabel; - private UIComboBox esdConfigOption; - private UICheckBox esdEnabled; - private UIButton esdSettingsBtn; - private UILabel barErrorTips; - //配置 - private StrategyConfig strategyConfig; - - private StrategyConfigHandler configHandler; private CardLayout card; - /** 数据库查询面板真正的内容面板 */ + /** + * 数据库查询面板真正的内容面板 + */ private JPanel contentPane; - /** 加载中面板 */ + /** + * 加载中面板 + */ private JPanel loadingPane; + private DBTableDataViewModel viewModel; + public DBTableDataPane() { + viewModel = new DBTableDataViewModel(); initCards(); initContentPane(); } @@ -144,7 +114,7 @@ public class DBTableDataPane extends AbstractTableDataPane implemen add(LOADING_PANE_NAME, loadingPane); add(CONTENT_PANE_NAME, contentPane); - switchTo(LOADING_PANE_NAME); + switchTo(CONTENT_PANE_NAME); } private void init() { @@ -162,7 +132,13 @@ public class DBTableDataPane extends AbstractTableDataPane implemen editorPane = new UITableEditorPane<>(model); - this.connectionTableProcedurePane = new ConnectionTableProcedurePane(this) { + this.connectionTableProcedurePane = new ConnectionTableProcedurePane( + new ConnectionTableProcedurePane.ConnectionTableState( + viewModel.getConnectionList(), + unused -> viewModel.fetchConnectionNameAction(), + viewModel.getTableProcedures(), + bean -> viewModel.fetchTableProceduresAction(bean) + )) { @Override protected void filter(Connection connection, String conName, List nameList) { connection.addConnection(nameList, conName, new Class[]{ @@ -195,35 +171,31 @@ public class DBTableDataPane extends AbstractTableDataPane implemen }); } }; - this.connectionTableProcedurePane.addDoubleClickListener(new ConnectionTableProcedurePane.DoubleClickSelectedNodeOnTreeListener() { - @Override - public void actionPerformed(TableProcedure target) { - Document document = DBTableDataPane.this.sqlTextPane.getDocument(); - try { - document.insertString(DBTableDataPane.this.sqlTextPane.getCaretPosition(), target.toString(), null); - } catch (BadLocationException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - - - DBTableDataPane.this.sqlTextPane.requestFocus(); + this.connectionTableProcedurePane.addDoubleClickListener(target -> { + Document document = DBTableDataPane.this.sqlTextPane.getDocument(); + try { + document.insertString(DBTableDataPane.this.sqlTextPane.getCaretPosition(), target.toString(), null); + } catch (BadLocationException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); } + DBTableDataPane.this.sqlTextPane.requestFocus(); }); this.sqlTextPane.addFocusListener(new FocusListener() { @Override public void focusGained(FocusEvent e) { - barErrorTips.setVisible(false); } @Override public void focusLost(FocusEvent e) { if (DBTableDataPane.this.isPreviewOrRefreshButton(e)) { - DBTableDataPane.this.checkParameter(); + viewModel.refreshParameters(); } } }); + DocumentLiveData.fromDocumentEventsOf(sqlTextPane.getDocument()) + .observeForever(documentEvent -> viewModel.updateQuery(sqlTextPane.getText())); } private void initMainSplitPane() { @@ -293,16 +265,6 @@ public class DBTableDataPane extends AbstractTableDataPane implemen return Toolkit.i18nText("Fine-Design_Basic_DS-Database_Query"); } - private void refreshParameters() { - String[] paramTexts = new String[2]; - paramTexts[0] = SqlUtils.tryPureSqlText(this.sqlTextPane.getText()); - paramTexts[1] = SqlUtils.tryPureSqlText(this.pageQuery); - List existParameterList = this.editorPane.update(); - Parameter[] ps = (existParameterList == null) ? new Parameter[0] : existParameterList.toArray(new Parameter[0]); - - this.editorPane.populate(ParameterUtils.analyzeAndUnionParameters(paramTexts, ps)); - } - private JToolBar createToolBar() { ToolBarDef toolBarDef = new ToolBarDef(); toolBarDef.addShortCut(new PreviewAction()); @@ -319,248 +281,105 @@ public class DBTableDataPane extends AbstractTableDataPane implemen toolBarDef.updateToolBar(editToolBar); //esd相关组件初始化 - createToolbarEsdComponents(editToolBar); +// createToolbarEsdComponents(editToolBar); return editToolBar; } - private void createToolbarEsdComponents(final UIToolbar editToolBar) { - this.esdSettingsLabel = new UILabel(Toolkit.i18nText("Fine-Design_ESD_Cache_Settings")); - this.esdConfigOption = new UIComboBox(StrategyConfigFrom.values()); - this.esdEnabled = new UICheckBox(Toolkit.i18nText("Fine-Design_ESD_Enable_Cache")); - this.barErrorTips = new UILabel(); - this.barErrorTips.setForeground(Color.RED); - this.barErrorTips.setVisible(false); - - esdSettingsBtn = new UIButton(Toolkit.i18nText("Fine-Design_ESD_Strategy_Config")); - esdSettingsBtn.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - final boolean global = globalOptionSelected(); - - final ESDStrategyConfigPane strategyConfigPane = new ESDStrategyConfigPane(global); - - StrategyConfig populateStrategyConfig; - if (global) { - populateStrategyConfig = StrategyConfigService.getGlobalConfig(); - } else { - populateStrategyConfig = strategyConfig; - } - - //显示对应的配置 - strategyConfigPane.populateBean(populateStrategyConfig); - - BasicDialog dlg = strategyConfigPane.showMediumWindow(SwingUtilities.getWindowAncestor(DBTableDataPane.this), new DialogActionAdapter() { - @Override - public void doOk() { - super.doOk(); - if (!global) { - //点击策略配置面板的确定,重新设置策略配置 - strategyConfig = strategyConfigPane.updateBean(); - // TODO: 2021/3/12 这个直接使用不太好 - } - } - }); - //dlg.setAlwaysOnTop(true); - dlg.setVisible(true); - } - }); - - this.esdConfigOption.setSelectedIndex(StrategyConfigFrom.GLOBAL.getIndex()); - this.esdConfigOption.addActionListener(e -> setEsdEnabled()); - - - //工具栏加上esd相关组件 - editToolBar.add(this.esdSettingsLabel); - editToolBar.add(this.esdConfigOption); - editToolBar.add(this.esdEnabled); - editToolBar.add(this.esdSettingsBtn); - editToolBar.add(this.barErrorTips); - } - - private boolean globalOptionSelected() { - return esdConfigOption.getSelectedIndex() == StrategyConfigFrom.GLOBAL.getIndex(); - } - - private void setEsdEnableStatus(boolean selected, boolean enabled) { - this.esdEnabled.setSelected(selected); - this.esdEnabled.setEnabled(enabled); - } - - private void setEsdEnabled() { - boolean useIndividualConfig = !this.globalOptionSelected(); - if (useIndividualConfig) { - if (this.strategyConfig == null) { - //新建的数据集,选择单独时,可用但是不勾选 - setEsdEnableStatus(false, true); - } else { - setEsdEnableStatus(!this.strategyConfig.isUseGlobal() && this.strategyConfig.enabled(), true); - } - } else { - //判断是不是模版数据集 - switch (this.dbTableData.getScope()) { - case TEMPLATE: - String tplPath = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getPath(); - setEsdEnableStatus(StrategyConfigService.isTemplateEnabled(tplPath), false); - break; - case SERVER: - //不会走到这里 - default: - break; - } - } - } public StrategyConfig updateStrategyConfig() { - return this.strategyConfig; - } - - private void checkParameter() { - String[] paramTexts = new String[2]; - paramTexts[0] = this.sqlTextPane.getText(); - paramTexts[1] = this.pageQuery; - Parameter[] parameters = ParameterHelper.analyze4Parameters(paramTexts, false); - - if (parameters.length < 1 && this.editorPane.update().size() < 1) { - return; - } - boolean isIn = true; - List list = this.editorPane.update(); - List name = new ArrayList<>(); - for (ParameterProvider parameter : list) { - name.add(parameter.getName()); - } - for (Parameter parameter : parameters) { - if (!name.contains(parameter.getName())) { - isIn = false; - break; - } - } - if (list.size() == parameters.length && isIn) { - return; - } - - refreshParameters(); + return null; } @Override - public void populateBean(DBTableData dbTableData) { - this.dbTableData = dbTableData; - if (this.dbTableDataMenuHandler != null) { - this.dbTableDataMenuHandler.populate(dbTableData); - } - - - Calculator c = Calculator.createCalculator(); - - ParameterProvider[] parameters = dbTableData.getParameters(c); - this.editorPane.populate(parameters); + public void populateBean(DBTableData tableData) { + this.viewModel.updateTableData(tableData); + this.viewModel.getDbTableData().observeForever(dbTableData -> { + if (this.dbTableDataMenuHandler != null) { + this.dbTableDataMenuHandler.populate(dbTableData); + } + editorPane.populate(dbTableData.getParameters(Calculator.createCalculator())); + connectionTableProcedurePane.setSelectedDatabaseConnection(dbTableData.getDatabase()); + connectionTableProcedurePane.addItemListener(event -> { + String dbName = connectionTableProcedurePane.getSelectedDatabaseConnnectonName(); +// if (StringUtils.isBlank(dbName) || StringUtils.isBlank(sqlTextPane.getText())) { +// try { +// throw new Exception(Toolkit.i18nText("Fine-Design_Basic_Connect_SQL_Cannot_Null") + "."); +// } catch (Exception e) { +// FineLoggerFactory.getLogger().error(e.getMessage(), e); +// } +// } + viewModel.updateDBName(dbName); + }); + }); - Connection db = dbTableData.getDatabase(); - String query = dbTableData.getQuery(); - this.pageQuery = dbTableData.getPageQuerySql(); - this.connectionTableProcedurePane.setSelectedDatabaseConnection(db); - this.sqlTextPane.setText(query); - this.sqlTextPane.requestFocus(); + this.sqlTextPane.setText(tableData.getQuery()); this.sqlTextPane.moveCaretPosition(this.sqlTextPane.getCaretPosition()); + this.sqlTextPane.requestFocus(); - switch (dbTableData.getScope()) { - - case TEMPLATE: - this.configHandler = new TemplateStrategyConfigHandler(dbTableData); - break; - case SERVER: - //服务器数据集 - default: - //新建服务器数据集 - this.configHandler = new ServerStrategyConfigHandler(dbTableData); - break; - } //设置esd相关组件显示状态 - populateESDComponents(); +// populateESDComponents(); } - private void populateESDComponents() { - //查找映射的配置 - this.strategyConfig = configHandler.find(); - - boolean shouldEnable = false; - StrategyConfigFrom from = StrategyConfigFrom.GLOBAL; - - if (this.strategyConfig != null) { - if (this.strategyConfig.enabled()) { - shouldEnable = true; - } - if (!this.strategyConfig.isUseGlobal()) { - from = StrategyConfigFrom.INDIVIDUAL; - } - } - - //服务器数据集不允许设置来源,只能单独配置 - if (dbTableData.getScope() != StrategicTableData.Scope.TEMPLATE) { - from = StrategyConfigFrom.INDIVIDUAL; - this.esdConfigOption.setEnabled(false); - } - this.esdEnabled.setSelected(shouldEnable); - this.esdConfigOption.setSelectedIndex(from.getIndex()); - } +// private void populateESDComponents() { +// //查找映射的配置 +// this.strategyConfig = configHandler.find(); +// +// boolean shouldEnable = false; +// StrategyConfigFrom from = StrategyConfigFrom.GLOBAL; +// +// if (this.strategyConfig != null) { +// if (this.strategyConfig.enabled()) { +// shouldEnable = true; +// } +// if (!this.strategyConfig.isUseGlobal()) { +// from = StrategyConfigFrom.INDIVIDUAL; +// } +// } +// +// //服务器数据集不允许设置来源,只能单独配置 +// if (dbTableData.getScope() != StrategicTableData.Scope.TEMPLATE) { +// from = StrategyConfigFrom.INDIVIDUAL; +// this.esdConfigOption.setEnabled(false); +// } +// this.esdEnabled.setSelected(shouldEnable); +// this.esdConfigOption.setSelectedIndex(from.getIndex()); +// } @Override public DBTableData updateBean() { updateDBTableData(); - internalUpdateStrategyConfig(); +// internalUpdateStrategyConfig(); - return this.dbTableData; + return viewModel.getDbTableData().getValue(); } - private void internalUpdateStrategyConfig() { - //这边只修改enable和useGlobal - boolean global = globalOptionSelected(); - boolean enable = this.esdEnabled.isSelected(); - - - //未开启缓存的,如果选择了单独配置,需要创建配置 - if (this.strategyConfig == null && !global) { - this.strategyConfig = StrategyConfig.createDefault(); - } - - //设置配置来源和开启状态 - if (this.strategyConfig != null) { - this.strategyConfig.setEnable(enable); - this.strategyConfig.setUseGlobal(global); - } - - //保存 - this.configHandler.save(this.dbTableData, this.strategyConfig); - } +// private void internalUpdateStrategyConfig() { +// //这边只修改enable和useGlobal +// boolean global = globalOptionSelected(); +// boolean enable = this.esdEnabled.isSelected(); +// +// +// //未开启缓存的,如果选择了单独配置,需要创建配置 +// if (this.strategyConfig == null && !global) { +// this.strategyConfig = StrategyConfig.createDefault(); +// } +// +// //设置配置来源和开启状态 +// if (this.strategyConfig != null) { +// this.strategyConfig.setEnable(enable); +// this.strategyConfig.setUseGlobal(global); +// } +// +// //保存 +// this.configHandler.save(this.dbTableData, this.strategyConfig); +// } private void updateDBTableData() { - String dbName = this.connectionTableProcedurePane.getSelectedDatabaseConnnectonName(); - if (StringUtils.isBlank(dbName) || StringUtils.isBlank(this.sqlTextPane.getText())) { - try { - throw new Exception(Toolkit.i18nText("Fine-Design_Basic_Connect_SQL_Cannot_Null") + "."); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - } - - - // 保存前 刷新下参数列表 保证获取到最新的参数 - refreshParameters(); - - List parameterList = this.editorPane.update(); - ParameterProvider[] parameters = parameterList.toArray(new ParameterProvider[0]); - - dbTableData.setDatabase(new NameDatabaseConnection(dbName)); - - dbTableData.setParameters(parameters); - dbTableData.setQuery(this.sqlTextPane.getText().trim()); - - dbTableData.setPageQuerySql(this.pageQuery); + viewModel.refreshParameters(); if (this.dbTableDataMenuHandler != null) { this.dbTableDataMenuHandler.update(); } @@ -575,7 +394,7 @@ public class DBTableDataPane extends AbstractTableDataPane implemen @Override public void actionPerformed(ActionEvent e) { - DBTableDataPane.this.refreshParameters(); + viewModel.refreshParameters(); } @@ -594,7 +413,6 @@ public class DBTableDataPane extends AbstractTableDataPane implemen @Override public void actionPerformed(ActionEvent evt) { - DBTableDataPane.this.checkParameter(); PreviewTablePane.previewTableData(DBTableDataPane.this.updateBean()); } } @@ -608,7 +426,7 @@ public class DBTableDataPane extends AbstractTableDataPane implemen @Override public void actionPerformed(ActionEvent e) { - checkParameter(); + viewModel.refreshParameters(); PreviewPerformedSqlPane.previewPerformedSql(DBTableDataPane.this.updateBean()); } } @@ -623,13 +441,13 @@ public class DBTableDataPane extends AbstractTableDataPane implemen @Override public void actionPerformed(ActionEvent e) { final QueryPane pane = new QueryPane(Toolkit.i18nText("Fine-Design_Basic_Layer_Page_Report_Define_Page_Query_SQL")); - pane.populate(pageQuery); + pane.populate(viewModel.getDbTableData().getValue().getPageQuerySql()); BasicDialog dialog = pane.showWindow(DesignerContext.getDesignerFrame()); dialog.addDialogActionListener(new DialogActionAdapter() { @Override public void doOk() { - pageQuery = pane.update(); - checkParameter(); + viewModel.updatePageQuery(pane.update()); + viewModel.refreshParameters(); } }); dialog.setVisible(true); @@ -673,117 +491,4 @@ public class DBTableDataPane extends AbstractTableDataPane implemen } } - /** - * 服务器数据集配置处理器 - */ - private static class ServerStrategyConfigHandler extends StrategyConfigHandler { - private final String origName; - - private final String origConnection; - - private final String origQuery; - - public ServerStrategyConfigHandler(DBTableData tableData) { - super(tableData); - this.origName = tableData.getDsName(); - this.origConnection = tableData.getDatabase().toString(); - this.origQuery = tableData.getQuery(); - } - - @Override - public StrategyConfig find() { - StrategyConfig strategyConfig = null; - if (getTableData() != null) { - strategyConfig = getTableData().getStrategyConfig(); - if (strategyConfig == null) { - //共享数据集 - if (getTableData().isShare()) { - strategyConfig = StrategyConfigHelper.createStrategyConfig(true, false, true); - } - } - } - - return strategyConfig; - } - - @Override - public void save(DBTableData saved, StrategyConfig strategyConfig) { - String conn = saved.getDatabase().toString(); - String query = saved.getQuery(); - - - //检查数据链接和sql是否修改,如果修改需要触发缓存监听事件 - if (!conn.equals(origConnection) || !query.equals(origQuery)) { - if (StringUtils.isNotEmpty(origName)) { - //新建数据集的origName为null,不用触发 - StrategyEventsNotifier.modifyDataSet(DSMapping.ofServerDS(new DsNameTarget(origName))); - } - } - - - //配置变动事件 - try { - final StrategyConfig orig = getTableData().getStrategyConfig(); - saved.setStrategyConfig(strategyConfig.clone()); - StrategyEventsNotifier.compareAndFireConfigEvents(orig, strategyConfig, DSMapping.ofServerDS(new DsNameTarget(saved.getDsName()))); - } catch (CloneNotSupportedException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - } - } - - - /** - * 模版数据集配置处理器 - */ - private static class TemplateStrategyConfigHandler extends StrategyConfigHandler { - public TemplateStrategyConfigHandler(DBTableData tableData) { - super(tableData); - } - - @Override - public StrategyConfig find() { - StrategyConfig strategyConfig = null; - String tplPath = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getPath(); - if (getTableData() != null && StringUtils.isNotEmpty(tplPath)) { - //设置保存数据集的事件检查钩子 - //新建模版此时不存在,不需要注册钩子 - if (getTableData().getXmlSavedHook() == null && WorkContext.getWorkResource().exist(tplPath)) { - getTableData().setXmlSavedHook(new DBTableDataSavedHook(tplPath, getTableData())); - } - - //获取当前的缓存配置,没有就创建一份 - String dsName = getTableData().getDsName(); - - //这里为了之前兼容插件创建的配置,缓存配置不在DBTableData,而是从模版attr读取 - strategyConfig = StrategyConfigAttrUtils.getStrategyConfig(dsName); - - - if (useGlobal(getTableData(), strategyConfig)) { - //使用全局配置 - strategyConfig = StrategyConfigHelper.createStrategyConfig(true); - } else if (strategyConfig == null && getTableData().isShare()) { - //没有配置时,使用共享数据集兼容配置 - strategyConfig = StrategyConfigHelper.createStrategyConfig(true, false, true); - } - } - - return strategyConfig; - } - - private boolean useGlobal(DBTableData dbTableData, StrategyConfig strategyConfig) { - //非共享且配置为空或者指定使用全局配置时,检查是否全局开启 - if (strategyConfig == null) { - return !dbTableData.isShare(); - } else { - return strategyConfig.isUseGlobal(); - } - } - - @Override - public void save(DBTableData saved, StrategyConfig config) { - - //DBTableDataSavedHook处理了 - } - } } diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataViewModel.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataViewModel.java new file mode 100644 index 0000000000..6260e4960b --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataViewModel.java @@ -0,0 +1,281 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import com.fine.state.livedata.LiveData; +import com.fine.state.livedata.MutableLiveData; +import com.fr.base.Parameter; +import com.fr.base.ParameterHelper; +import com.fr.base.TableData; +import com.fr.data.core.DataCoreUtils; +import com.fr.data.core.db.TableProcedure; +import com.fr.data.core.db.dialect.base.key.check.DataBaseDetail; +import com.fr.data.core.db.dialect.base.key.check.DataBaseType; +import com.fr.data.impl.AbstractDatabaseConnection; +import com.fr.data.impl.Connection; +import com.fr.data.impl.DBTableData; +import com.fr.data.impl.NameDatabaseConnection; +import com.fr.data.operator.DataOperator; +import com.fr.design.DesignerEnvManager; +import com.fr.design.gui.ilist.TableViewList; +import com.fr.design.utils.ParameterUtils; +import com.fr.file.ConnectionConfig; +import com.fr.general.ComparatorUtils; +import com.fr.general.sql.SqlUtils; +import com.fr.stable.ArrayUtils; +import com.fr.stable.ParameterProvider; +import com.fr.stable.StringUtils; +import com.fr.workspace.WorkContext; +import com.fr.workspace.server.connection.DBConnectAuth; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +import static com.fr.data.core.db.TableProcedure.ERROR_TABLE_PROCEDURE; + +/** + * 数据集界面视图模型 + * + * @author vito + * @since 11.0 + * Created on 2023/11/7 + */ +public class DBTableDataViewModel { + + private MutableLiveData dbTableData = new MutableLiveData<>(); + private MutableLiveData> connectionList = new MutableLiveData<>(Collections.emptyList()); + private MutableLiveData> tableProcedures = new MutableLiveData<>(Collections.emptyList()); + + public DBTableDataViewModel() { + } + + public LiveData getDbTableData() { + return dbTableData; + } + + public LiveData> getConnectionList() { + return connectionList; + } + + public LiveData> getTableProcedures() { + return tableProcedures; + } + + /* ---------action--------- */ + public void updateTableData(TableData tableData) { + if (!(tableData instanceof DBTableData)) { + return; + } + dbTableData.postValue((DBTableData) tableData); + } + + + public void fetchConnectionNameAction() { + new Thread(() -> { + + ConnectionConfig mgr = ConnectionConfig.getInstance(); + Set connectionName = mgr.getConnections().keySet(); + + Collection noAuthConnections = WorkContext.getCurrent().get(DBConnectAuth.class).getNoAuthConnections(); + + ArrayList nameList = new ArrayList<>(); + + if (noAuthConnections == null) { + connectionList.postValue(Collections.emptyList()); + return; + } + for (String conName : connectionName) { + if (noAuthConnections.contains(conName)) { + continue; + } + Connection connection = mgr.getConnection(conName); + connection.addConnection(nameList, conName, new Class[]{AbstractDatabaseConnection.class}); + } + connectionList.postValue(nameList); + }).start(); + } + + public void fetchTableProceduresAction(TableViewList.TableProcedureBean tableProcedureBean) { + new Thread(() -> { + List list; + try { + list = fetchTableProcedures(tableProcedureBean); + } catch (Exception e) { + list = new ArrayList<>(); + list.add(ERROR_TABLE_PROCEDURE); + } + tableProcedures.postValue(list); + }).start(); + } + + /** + * august:databaseName是数据库名字,searchFilter是输入的过滤条件,typesFilter是视图、表、 + * 存储过程中的一者或者几者 + * + * @param bean 数据 + */ + private List fetchTableProcedures(TableViewList.TableProcedureBean bean) throws Exception { + if (bean.refresh) { + clearCache(ConnectionConfig.getInstance().getConnection(bean.databaseName)); + } + Connection datasource = ConnectionConfig.getInstance().getConnection(bean.databaseName); + if (datasource == null) { + return Collections.emptyList(); + } + String[] schemas = DataCoreUtils.getDatabaseSchema(datasource); + + String searchFilter = bean.searchFilter.toLowerCase(); + boolean isOracleSystemSpace = DesignerEnvManager.getEnvManager().isOracleSystemSpace(); + // oracle不勾选显示所有表,则只显示用户下的(包括存储过程和table表) + DataBaseDetail detail = DataOperator.getInstance().getDataBaseDetail(datasource, isOracleSystemSpace); + if (ArrayUtils.isNotEmpty(detail.getSchemas())) { + schemas = detail.getSchemas(); + } + if (bean.typesFilter.length == 1 && ComparatorUtils.equals(bean.typesFilter[0], TableProcedure.PROCEDURE)) { + return processStoreProcedure(schemas, datasource, DataBaseType.ORACLE.equals(detail.getType()), searchFilter); + } else { + return processTableAndView(schemas, datasource, searchFilter, DataBaseType.ORACLE.equals(detail.getType()), bean.typesFilter); + } + } + + private void clearCache(Connection datasource) { + String[] schemas = DataCoreUtils.getDatabaseSchema(datasource); + schemas = (schemas == null || schemas.length == 0) ? new String[]{null} : schemas; + for (String schema : schemas) { + doClearCache(datasource, schema); + } + doClearCache(datasource, null); + } + + private void doClearCache(Connection datasource, String schema) { + DataCoreUtils.refreshTables(datasource, TableProcedure.TABLE, schema); + DataCoreUtils.refreshTables(datasource, TableProcedure.VIEW, schema); + DataCoreUtils.refreshTables(datasource, TableProcedure.PROCEDURE, schema); + } + + private List processStoreProcedure(String[] schemas, Connection datasource, boolean isOracle, String searchFilter) throws Exception { + List tableProcedures = new ArrayList<>(); + boolean isBlank = StringUtils.isBlank(searchFilter); + boolean isOracleSysSpace = DesignerEnvManager.getEnvManager().isOracleSystemSpace(); + List sqlTablees = DataCoreUtils.getProcedures(datasource, schemas, isOracle, isOracleSysSpace); + for (TableProcedure[] sqlTables : sqlTablees) { + if (sqlTables == null) { + continue; + } + for (TableProcedure sqlTable : sqlTables) { + String name = sqlTable.toString().toLowerCase(); + if (isBlank || name.contains(searchFilter)) { + tableProcedures.add(sqlTable); + } + } + } + return tableProcedures; + } + + private List processTableAndView(String[] schemas, Connection datasource, String searchFilter, boolean isOracle, String... typesFilter) + throws Exception { + List tableProcedures = new ArrayList<>(); + boolean isBlank = StringUtils.isBlank(searchFilter); + boolean isOracleSystemSpace = DesignerEnvManager.getEnvManager().isOracleSystemSpace(); + if (!isOracle) { + String schema = null; + for (String type : typesFilter) { + //非oracle数据库,默认都是显示所有表的,参数为true + TableProcedure[] sqlTables = DataCoreUtils.getTables(datasource, type, schema, true); + if (Objects.isNull(sqlTables)) { + return tableProcedures; + } + for (TableProcedure sqlTable : sqlTables) { + if (isBlank || sqlTable.getName().toLowerCase().contains(searchFilter)) { + tableProcedures.add(sqlTable); + } + } + } + } else { + for (String type : typesFilter) { + for (String schema : schemas) { + TableProcedure[] sqlTables = DataCoreUtils.getTables(datasource, type, schema, isOracleSystemSpace); + if (Objects.isNull(sqlTables)) { + return tableProcedures; + } + // oracle的表名加上模式 + for (TableProcedure ta : sqlTables) { + String name = ta.getSchema() + '.' + ta.getName(); + if (isBlank || name.toLowerCase().contains(searchFilter)) { + tableProcedures.add(ta); + } + } + } + } + } + return tableProcedures; + } + + public void updatePageQuery(String pageQuery) { + DBTableData tableData = dbTableData.getValue(); + if (ComparatorUtils.equals(pageQuery, tableData.getPageQuerySql())) { + return; + } + tableData.setPageQuerySql(pageQuery); + dbTableData.postValue(tableData); + } + + public void updateQuery(String query) { + DBTableData tableData = dbTableData.getValue(); + if (ComparatorUtils.equals(query, tableData.getQuery())) { + return; + } + tableData.setQuery(query); + dbTableData.postValue(tableData); + } + + public void refreshParameters() { + DBTableData tableData = dbTableData.getValue(); + if (needRefreshParameter(tableData)) { + tableData.setParameters(calParameter(tableData)); + } + dbTableData.postValue(tableData); + } + + private boolean needRefreshParameter(DBTableData tableData) { + String[] paramTexts = new String[2]; + paramTexts[0] = tableData.getQuery(); + paramTexts[1] = tableData.getPageQuerySql(); + Parameter[] parameters = ParameterHelper.analyze4Parameters(paramTexts, false); + + if (parameters.length < 1 && tableData.getParameters().length < 1) { + return false; + } + boolean isIn = true; + ParameterProvider[] list = tableData.getParameters(); + List name = new ArrayList<>(); + for (ParameterProvider parameter : list) { + name.add(parameter.getName()); + } + for (Parameter parameter : parameters) { + if (!name.contains(parameter.getName())) { + isIn = false; + break; + } + } + return list.length != parameters.length || !isIn; + } + + private Parameter[] calParameter(DBTableData tableData) { + + String[] paramTexts = new String[2]; + paramTexts[0] = SqlUtils.tryPureSqlText(tableData.getQuery()); + paramTexts[1] = SqlUtils.tryPureSqlText(tableData.getPageQuerySql()); + Parameter[] oldParameters = Arrays.asList(tableData.getParameters()).toArray(new Parameter[0]); + return ParameterUtils.analyzeAndUnionParameters(paramTexts, oldParameters); + } + + public void updateDBName(String dbName) { + DBTableData tableData = dbTableData.getValue(); + tableData.setDatabase(new NameDatabaseConnection(dbName)); + dbTableData.postValue(tableData); + } +} From a64aa24b528786375fbaa25fa478637b03668753 Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 28 Nov 2023 12:03:01 +0800 Subject: [PATCH 006/302] =?UTF-8?q?REPORT-99485=20UI=20demo=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=E6=95=85=E4=BA=8B=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/icon/IconResource.java | 4 +- .../com/fine/theme/icon/UrlIconResource.java | 8 +- .../fine/theme/light/ui/laf/FineDarkLaf.java | 37 ++++++++ .../fine/theme/light/ui/laf/FineLightLaf.java | 19 ++++- .../com/fr/design/gui/ibutton/UIHead.java | 2 +- .../fr/design/gui/ibutton/UIHeadGroup.java | 2 +- .../gui/storybook/ButtonStoryBoard.java | 36 ++++++++ .../fr/design/gui/storybook/StoryBoard.java | 30 +++++++ .../gui/storybook/StoryBookComponent.java | 18 ++++ .../fr/design/gui/storybook/Storybook.java | 85 +++++++++++++++++++ .../gui/storybook/ToggleButtonStoryBoard.java | 31 +++++++ .../gui/storybook/UIHeadGroupStoryBoard.java | 65 ++++++++++++++ 12 files changed, 331 insertions(+), 6 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java create mode 100644 designer-base/src/test/java/com/fr/design/gui/storybook/ButtonStoryBoard.java create mode 100644 designer-base/src/test/java/com/fr/design/gui/storybook/StoryBoard.java create mode 100644 designer-base/src/test/java/com/fr/design/gui/storybook/StoryBookComponent.java create mode 100644 designer-base/src/test/java/com/fr/design/gui/storybook/Storybook.java create mode 100644 designer-base/src/test/java/com/fr/design/gui/storybook/ToggleButtonStoryBoard.java create mode 100644 designer-base/src/test/java/com/fr/design/gui/storybook/UIHeadGroupStoryBoard.java diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconResource.java b/designer-base/src/main/java/com/fine/theme/icon/IconResource.java index f654a6cf8c..d519601391 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/IconResource.java +++ b/designer-base/src/main/java/com/fine/theme/icon/IconResource.java @@ -1,6 +1,6 @@ package com.fine.theme.icon; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import java.io.InputStream; @@ -18,6 +18,6 @@ public interface IconResource { * * @return 资源流 */ - @Nullable + @NotNull InputStream getInputStream(); } diff --git a/designer-base/src/main/java/com/fine/theme/icon/UrlIconResource.java b/designer-base/src/main/java/com/fine/theme/icon/UrlIconResource.java index 58e53646e2..1684a5464c 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/UrlIconResource.java +++ b/designer-base/src/main/java/com/fine/theme/icon/UrlIconResource.java @@ -3,6 +3,7 @@ package com.fine.theme.icon; import com.fr.general.IOUtils; import com.fr.io.utils.ResourceIOUtils; import com.fr.third.errorprone.annotations.Immutable; +import org.jetbrains.annotations.NotNull; import java.io.InputStream; @@ -27,8 +28,13 @@ public class UrlIconResource implements IconResource { } @Override + @NotNull public InputStream getInputStream() { - return getInputStream(path); + InputStream inputStream = getInputStream(path); + if (inputStream == null) { + throw new IconException("Icon load failed: " + path); + } + return inputStream; } diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java new file mode 100644 index 0000000000..062e818a74 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java @@ -0,0 +1,37 @@ +package com.fine.theme.light.ui.laf; + +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.icon.IconManager; +import com.fine.theme.light.ui.FineLightIconSet; +import com.formdev.flatlaf.FlatDarkLaf; +import com.formdev.flatlaf.util.UIScale; +import com.fr.stable.StringUtils; + +/** + * FineReport designer new look and feel + * + * @author vito + * @since 11.0 + * Created on 2023/9/12 + */ +public class FineDarkLaf extends FlatDarkLaf { + + private static final String USER_SCALE_FACTOR = "userScaleFactor"; + + public static boolean setup() { + IconManager.addSet(new FineLightIconSet("fine-light")); + Layouts.setScaleFactor(UIScale.getUserScaleFactor()); + UIScale.addPropertyChangeListener(evt -> { + if (StringUtils.equals(evt.getPropertyName(), USER_SCALE_FACTOR)) { + Layouts.setScaleFactor((float) evt.getNewValue()); + } + }); + return setup(new FineDarkLaf()); + } + + @Override + public String getName() { + return "FineDarkLaf"; + } + +} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java index 58442eca58..f18bbcd69b 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java @@ -1,8 +1,11 @@ package com.fine.theme.light.ui.laf; -import com.fine.theme.light.ui.FineLightIconSet; +import com.fine.swing.ui.layout.Layouts; import com.fine.theme.icon.IconManager; +import com.fine.theme.light.ui.FineLightIconSet; import com.formdev.flatlaf.FlatLightLaf; +import com.formdev.flatlaf.util.UIScale; +import com.fr.stable.StringUtils; /** * FineReport designer new look and feel @@ -12,8 +15,22 @@ import com.formdev.flatlaf.FlatLightLaf; * Created on 2023/9/12 */ public class FineLightLaf extends FlatLightLaf { + + public static final String USER_SCALE_FACTOR = "userScaleFactor"; + + /** + * 安装外观 + * + * @return 是否安装成功 + */ public static boolean setup() { IconManager.addSet(new FineLightIconSet("fine-light")); + Layouts.setScaleFactor(UIScale.getUserScaleFactor()); + UIScale.addPropertyChangeListener(evt -> { + if (StringUtils.equals(evt.getPropertyName(), USER_SCALE_FACTOR)) { + Layouts.setScaleFactor((float) evt.getNewValue()); + } + }); return setup(new FineLightLaf()); } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHead.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHead.java index e1f91b15a7..9d52c61870 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHead.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHead.java @@ -22,7 +22,7 @@ public class UIHead { this.icon = icon; } - public UIHead(Icon icon, int index, boolean enable) { + public UIHead(Icon icon,boolean enable) { this(icon); this.enable = enable; } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java index 1eeb0bb913..f5560810ec 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java @@ -61,7 +61,7 @@ public class UIHeadGroup extends Row { } private void intiContent() { - setSpacing(4); + setSpacing(2); setOpaque(false); add(buttonGroup()); setUI(new UIHeadGroupUI()); diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/ButtonStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/ButtonStoryBoard.java new file mode 100644 index 0000000000..17646a18dc --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/ButtonStoryBoard.java @@ -0,0 +1,36 @@ +package com.fr.design.gui.storybook; + +import com.fine.theme.icon.LazyIcon; +import com.fr.design.gui.ibutton.UIButton; + +import javax.swing.JButton; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + +/** + * 按钮 + * + * @author vito + * @since 11.0 + * Created on 2023/11/27 + */ +public class ButtonStoryBoard extends StoryBoard { + + public ButtonStoryBoard() { + super("按钮"); + add( + row(10, + cell(new UIButton("按钮")), + cell(new UIButton("保存", new LazyIcon("save"))), + cell(new UIButton(new LazyIcon("multi"))) + ), + row(10, + cell(new JButton("按钮")), + cell(new JButton(new LazyIcon("multi"))) + ), + flex() + ); + } +} diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/StoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/StoryBoard.java new file mode 100644 index 0000000000..ad7f04aa32 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/StoryBoard.java @@ -0,0 +1,30 @@ +package com.fr.design.gui.storybook; + +import com.fine.swing.ui.layout.Column; +import com.fr.design.gui.ilable.UILabel; + +import javax.swing.UIManager; +import java.awt.Font; + +import static com.fine.swing.ui.layout.Layouts.cell; + +/** + * UI 故事板,用于demo + * 展示每个UI组件的能力 + * + * @author vito + * @since 11.0 + * Created on 2023/11/27 + */ +public class StoryBoard extends Column { + + protected static final Font labelFont = UIManager.getFont("Label.font"); + + protected String title; + + public StoryBoard(String title) { + this.title = title; + setSpacing(4); + add(cell(new UILabel(title)).with(it -> it.setFont(labelFont.deriveFont(16f).deriveFont(Font.BOLD)))); + } +} diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/StoryBookComponent.java b/designer-base/src/test/java/com/fr/design/gui/storybook/StoryBookComponent.java new file mode 100644 index 0000000000..8926899aea --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/StoryBookComponent.java @@ -0,0 +1,18 @@ +package com.fr.design.gui.storybook; + +import javax.swing.JComponent; + +/** + * @author vito + * @since 11.0 + * Created on 2023/11/27 + */ +public class StoryBookComponent { + public String name; + public JComponent component; + + public StoryBookComponent(String name, JComponent component) { + this.name = name; + this.component = component; + } +} diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/Storybook.java b/designer-base/src/test/java/com/fr/design/gui/storybook/Storybook.java new file mode 100644 index 0000000000..e6621cddca --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/Storybook.java @@ -0,0 +1,85 @@ +package com.fr.design.gui.storybook; + +import com.fanruan.gui.UiInspector; +import com.fine.theme.light.ui.laf.FineLightLaf; +import com.formdev.flatlaf.util.ScaledEmptyBorder; + +import javax.swing.DefaultListCellRenderer; +import javax.swing.JFrame; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Component; +import java.util.ArrayList; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIScale.scale; + +/** + * UI 故事书,用于demo + * 展示每个UI组件的能力 + * + * @author vito + * @since 11.0 + * Created on 2023/11/27 + */ +public class Storybook { + + CardLayout cardLayout; + JPanel cards; + + public void start() { + FineLightLaf.setup(); + JFrame jf = new JFrame("Story Book"); + jf.add(row( + cell(new JList<>(components())).with(it -> { + it.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); + it.setCellRenderer(new MyListCellRenderer()); + it.addListSelectionListener(e -> { + StoryBookComponent[] cs = components(); + cards.removeAll(); + cards.add(cs[it.getSelectedIndex()].component); + cards.revalidate(); + }); + }), + cell(new JScrollPane()).weight(1).with(it -> { + cards = new JPanel(new BorderLayout()); + it.setViewportView(cards); + cards.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); + cards.add(components()[0].component); + }) + ).getComponent()); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + jf.setSize(scale(600), scale(400)); + new UiInspector(); + jf.setVisible(true); + } + + + static class MyListCellRenderer extends DefaultListCellRenderer { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + setText(((StoryBookComponent) value).name); + return this; + } + } + + private StoryBookComponent[] components() { + ArrayList components = new ArrayList<>(); + components.add(new StoryBookComponent("Button", new ButtonStoryBoard())); + components.add(new StoryBookComponent("HeadGroup", new UIHeadGroupStoryBoard())); + components.add(new StoryBookComponent("ToggleButton", new ToggleButtonStoryBoard())); + return components.toArray(new StoryBookComponent[0]); + } + + + public static void main(String... args) { + SwingUtilities.invokeLater(() -> new Storybook().start()); + } + +} diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/ToggleButtonStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/ToggleButtonStoryBoard.java new file mode 100644 index 0000000000..8ef89bc40a --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/ToggleButtonStoryBoard.java @@ -0,0 +1,31 @@ +package com.fr.design.gui.storybook; + +import com.fine.theme.icon.LazyIcon; + +import javax.swing.JToggleButton; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + +/** + * 切换状态按钮 + * + * @author vito + * @since 11.0 + * Created on 2023/11/27 + */ +public class ToggleButtonStoryBoard extends StoryBoard { + + public ToggleButtonStoryBoard() { + super("切换按钮"); + add( + row(10, + cell(new JToggleButton("切换按钮")), + cell(new JToggleButton("长文字保存保存保存保存", new LazyIcon("save"))), + cell(new JToggleButton(new LazyIcon("multi"))) + ), + flex() + ); + } +} diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/UIHeadGroupStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/UIHeadGroupStoryBoard.java new file mode 100644 index 0000000000..887c59e9e4 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/UIHeadGroupStoryBoard.java @@ -0,0 +1,65 @@ +package com.fr.design.gui.storybook; + +import com.fine.theme.icon.LazyIcon; +import com.fr.design.gui.ibutton.UIHead; +import com.fr.design.gui.ibutton.UIHeadGroup; +import com.fr.design.gui.ilable.UILabel; + +import java.util.ArrayList; +import java.util.List; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; + +/** + * 属性面板tab + * + * @author vito + * @since 11.0 + * Created on 2023/11/27 + */ +class UIHeadGroupStoryBoard extends StoryBoard { + + public UIHeadGroupStoryBoard() { + super("属性面板&导入数据集tab"); + add( + cell(new UILabel("文字Tab")).with(it -> it.setFont(labelFont.deriveFont(14f))), + cell(new UIHeadGroup(new String[]{"左按钮", "右按钮"})), + cell(new UILabel("图标Tab")).with(it -> it.setFont(labelFont.deriveFont(14f))), + cell(new UIHeadGroup(iconList())), + cell(new UILabel("文字Tab带禁用")).with(it -> it.setFont(labelFont.deriveFont(14f))), + cell(new UIHeadGroup(iconList2())), + cell(new UILabel("文字图标Tab带禁用")).with(it -> it.setFont(labelFont.deriveFont(14f))), + cell(new UIHeadGroup(iconList3())), + flex() + ); + } + + public static List iconList() { + List uiHeads = new ArrayList<>(); + uiHeads.add(new UIHead(new LazyIcon("cut"))); + uiHeads.add(new UIHead(new LazyIcon("save"))); + return uiHeads; + } + + public static List iconList2() { + List uiHeads = new ArrayList<>(); + uiHeads.add(new UIHead(new LazyIcon("cut"))); + uiHeads.add(new UIHead(new LazyIcon("save"), false)); + return uiHeads; + } + + public static List iconList3() { + List uiHeads = new ArrayList<>(); + uiHeads.add(new UIHead("剪切", new LazyIcon("cut"))); + uiHeads.add(new UIHead("保存", new LazyIcon("save"), false)); + return uiHeads; + } + + public static List iconList4() { + List uiHeads = new ArrayList<>(); + uiHeads.add(new UIHead("剪切剪切剪切剪切剪切剪切剪切剪切剪切", new LazyIcon("cut"))); + uiHeads.add(new UIHead("保存", new LazyIcon("save"), false)); + return uiHeads; + } +} From 372ab423f69f12d70507b076833db03802d05650 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Tue, 28 Nov 2023 18:43:28 +0800 Subject: [PATCH 007/302] =?UTF-8?q?REPORT-107972=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0=20Tree=E7=BF=BB?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 20 +++++++- .../fr/design/actions/file/LocateAction.java | 3 +- .../fr/design/actions/file/RenameAction.java | 3 +- .../design/data/datapane/TableDataTree.java | 8 +--- .../com/fr/design/gui/itree/UITreeUI.java | 15 ++---- .../gui/itree/checkboxtree/CheckBoxTree.java | 6 --- .../gui/itree/filetree/EnvFileTree.java | 9 +--- .../gui/itree/filetree/FileTreeIcon.java | 48 ++++++++++++------- .../itree/filetree/FineTreeCellRender.java | 30 ++++++++++++ .../refreshabletree/RefreshableJTree.java | 1 - .../DesignerFrameFileDealerPane.java | 10 ++-- .../light/ui/laf/FineLightLaf.properties | 5 +- .../com/fr/design/images/newui/cpt_icon.svg | 10 ++++ .../com/fr/design/images/newui/folder.svg | 8 ++++ .../fr/design/images/newui/folder_open.svg | 8 ++++ .../com/fr/design/images/newui/frm_icon.svg | 12 +++++ .../com/fr/design/standard/collapse_all.svg | 5 ++ .../design/standard/collapse_all_disable.svg | 5 ++ .../design/standard/collapse_all_normal.svg | 4 -- .../fr/design/standard/fileicon/cpt_icon.svg | 19 ++++---- .../design/standard/fileicon/excel_icon.svg | 7 +++ .../fr/design/standard/fileicon/folder.svg | 11 +++-- .../design/standard/fileicon/folder_open.svg | 8 ++++ .../fr/design/standard/fileicon/frm_icon.svg | 21 ++++---- .../fr/design/standard/fileicon/fvs_icon.svg | 13 +++++ .../com/fr/design/standard/fileicon/minus.svg | 8 ++-- .../com/fr/design/standard/fileicon/plus.svg | 8 ++-- .../com/fr/design/standard/locate/locate.svg | 5 ++ .../design/standard/locate/locate_disable.svg | 5 ++ .../standard/locate/locate_disabled.svg | 15 ------ .../design/standard/locate/locate_normal.svg | 15 ------ .../design/standard/newfolder/new_folder.svg | 8 ++++ .../standard/newfolder/new_folder_disable.svg | 8 ++++ .../newfolder/new_folder_disabled.svg | 8 ---- .../standard/newfolder/new_folder_normal.svg | 8 ---- .../com/fr/design/standard/refresh.svg | 8 ++++ .../fr/design/standard/refresh_disable.svg | 8 ++++ .../com/fr/design/standard/refresh_normal.svg | 7 --- .../com/fr/design/standard/rename/rename.svg | 10 ++++ .../design/standard/rename/rename_disable.svg | 10 ++++ .../standard/rename/rename_disabled.svg | 7 --- .../design/standard/rename/rename_normal.svg | 7 --- .../fr/design/standard/vcslist/vcs_list.svg | 5 ++ .../standard/vcslist/vcs_list_disable.svg | 5 ++ .../standard/vcslist/vcs_list_disabled.svg | 7 --- .../standard/vcslist/vcs_list_normal.svg | 7 --- .../standard/viewfolder/view_folder.svg | 9 ++++ .../viewfolder/view_folder_disable.svg | 9 ++++ .../viewfolder/view_folder_disabled.svg | 7 --- .../viewfolder/view_folder_normal.svg | 7 --- 50 files changed, 308 insertions(+), 182 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/gui/itree/filetree/FineTreeCellRender.java create mode 100644 designer-base/src/main/resources/com/fr/design/images/newui/cpt_icon.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/newui/folder.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/newui/folder_open.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/newui/frm_icon.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/collapse_all.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/collapse_all_disable.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/collapse_all_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/fileicon/excel_icon.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/fileicon/folder_open.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/fileicon/fvs_icon.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/locate/locate.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/locate/locate_disable.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/locate/locate_disabled.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/locate/locate_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_disable.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_disabled.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/refresh.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/refresh_disable.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/refresh_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/rename/rename.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/rename/rename_disable.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/rename/rename_disabled.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/rename/rename_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_disable.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_disabled.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_disable.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_disabled.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_normal.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index e4957b9bdb..5854b8d6e1 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -44,7 +44,25 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("remove", "com/fr/design/standard/remove/remove.svg", true), new SvgIconSource("search", "/com/fr/design/standard/search.svg", true), new SvgIconSource("server_database", "com/fr/design/standard/server_database.svg", true), - new SvgIconSource("field", "com/fr/design/standard/field.svg", true) + new SvgIconSource("field", "com/fr/design/standard/field.svg", true), + + // 目录树相关Icon + new SvgIconSource("folder", "com/fr/design/standard/fileicon/folder.svg", true), + new SvgIconSource("folder_open", "com/fr/design/standard/fileicon/folder_open.svg", true), + new SvgIconSource("cpt_icon", "com/fr/design/standard/fileicon/cpt_icon.svg", true), + new SvgIconSource("frm_icon", "com/fr/design/standard/fileicon/frm_icon.svg", true), + new SvgIconSource("fvs_icon", "com/fr/design/standard/fileicon/fvs_icon.svg", true), + new SvgIconSource("excel_icon", "com/fr/design/standard/fileicon/excel_icon.svg", true), + new SvgIconSource("minus", "com/fr/design/standard/fileicon/minus.svg", true), + new SvgIconSource("plus", "com/fr/design/standard/fileicon/plus.svg", true), + new SvgIconSource("locate", "com/fr/design/standard/locate/locate.svg", true), + new SvgIconSource("rename", "com/fr/design/standard/rename/rename.svg", true), + new SvgIconSource("collapse_all", "com/fr/design/standard/collapse_all.svg", true), + new SvgIconSource("vcs_list", "com/fr/design/standard/vcslist/vcs_list.svg", true), + new SvgIconSource("view_folder", "com/fr/design/standard/viewfolder/view_folder.svg", true), + new SvgIconSource("refresh", "com/fr/design/standard/refresh.svg", true), + new SvgIconSource("new_folder", "com/fr/design/standard/newfolder/new_folder.svg", true) + ); } } diff --git a/designer-base/src/main/java/com/fr/design/actions/file/LocateAction.java b/designer-base/src/main/java/com/fr/design/actions/file/LocateAction.java index 0c039b4af7..44275bedf3 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/LocateAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/LocateAction.java @@ -1,5 +1,6 @@ package com.fr.design.actions.file; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.TemplateTreePane; @@ -28,7 +29,7 @@ public class LocateAction extends UpdateAction { public LocateAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Locate")); - this.setSmallIcon("/com/fr/design/standard/locate/locate"); + this.setSmallIcon(new LazyIcon("locate")); } @Override diff --git a/designer-base/src/main/java/com/fr/design/actions/file/RenameAction.java b/designer-base/src/main/java/com/fr/design/actions/file/RenameAction.java index 842292ce2a..5bdc941cf4 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/RenameAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/RenameAction.java @@ -1,5 +1,6 @@ package com.fr.design.actions.file; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseUtils; import com.fr.chartx.TwoTuple; import com.fr.design.DesignerEnvManager; @@ -62,7 +63,7 @@ public class RenameAction extends UpdateAction { public RenameAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Rename")); - this.setSmallIcon("/com/fr/design/standard/rename/rename"); + this.setSmallIcon(new LazyIcon("rename")); } @Override diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java index cc267aceff..ca7cb38b4b 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java @@ -5,13 +5,13 @@ import com.fr.base.svg.IconUtils; import com.fr.data.MultiResultTableData; import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager; import com.fr.design.data.tabledata.wrapper.TableDataWrapper; +import com.fr.design.gui.itree.filetree.FineTreeCellRender; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.gui.itree.refreshabletree.UserObjectRefreshJTree; import com.fr.design.icon.IconPathConstants; import com.fr.general.ComparatorUtils; import com.fr.general.NameObject; -import javax.swing.BorderFactory; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; @@ -43,7 +43,7 @@ public class TableDataTree extends UserObjectRefreshJTree { } // CellRenderer - private DefaultTreeCellRenderer tableDataTreeCellRenderer = new DefaultTreeCellRenderer() { + private DefaultTreeCellRenderer tableDataTreeCellRenderer = new FineTreeCellRender() { private static final long serialVersionUID = 1L; @Override @@ -77,10 +77,6 @@ public class TableDataTree extends UserObjectRefreshJTree { this.setIcon(null); this.setText(PENDING.toString()); } - this.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0)); -// this.setBackgroundNonSelectionColor(UIConstants.TREE_BACKGROUND); -// this.setTextSelectionColor(Color.WHITE); -// this.setBackgroundSelectionColor(UIConstants.FLESH_BLUE); return this; } }; diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/UITreeUI.java b/designer-base/src/main/java/com/fr/design/gui/itree/UITreeUI.java index a4d66c4384..bb932187b2 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/UITreeUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/UITreeUI.java @@ -1,5 +1,7 @@ package com.fr.design.gui.itree; +import com.fine.theme.icon.LazyIcon; +import com.formdev.flatlaf.ui.FlatTreeUI; import com.fr.base.BaseUtils; import com.fr.base.svg.IconUtils; import com.fr.design.utils.ThemeUtils; @@ -16,7 +18,7 @@ import javax.swing.tree.DefaultTreeCellRenderer; * Date: 13-12-31 * Time: 下午4:58 */ -public class UITreeUI extends MetalTreeUI { +public class UITreeUI extends FlatTreeUI { /** * 创建组件UI * @param x 组件 @@ -28,14 +30,7 @@ public class UITreeUI extends MetalTreeUI { protected void installDefaults() { super.installDefaults(); - setExpandedIcon(IconUtils.readIcon("/com/fr/design/standard/fileicon/minus.svg")); - setCollapsedIcon(IconUtils.readIcon("/com/fr/design/standard/fileicon/plus.svg")); - if (tree.getCellRenderer() instanceof DefaultTreeCellRenderer) { - DefaultTreeCellRenderer r = (DefaultTreeCellRenderer) tree.getCellRenderer(); - r.setBackgroundNonSelectionColor(ThemeUtils.TEXT_BG_COLOR); - r.setBackgroundSelectionColor(ThemeUtils.TEXT_SELECTED_BG_COLOR); - r.setTextNonSelectionColor(ThemeUtils.NORMAL_FOREGROUND); - r.setTextSelectionColor(ThemeUtils.TEXT_BG_COLOR); - } + setExpandedIcon(new LazyIcon("minus")); + setCollapsedIcon(new LazyIcon("plus")); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/checkboxtree/CheckBoxTree.java b/designer-base/src/main/java/com/fr/design/gui/itree/checkboxtree/CheckBoxTree.java index e06ac43033..00f740983a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/checkboxtree/CheckBoxTree.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/checkboxtree/CheckBoxTree.java @@ -117,9 +117,6 @@ public class CheckBoxTree extends JTree { for (int i = 0, length = listeners.length; i < length; i++) { component.removeMouseListener(listeners[i]); } -// for (MouseListener listener : listeners) { -// component.removeMouseListener(listener); -// } for (int i = 0; i < listeners.length; i++) { MouseListener listener = listeners[i]; if (index == i) { @@ -357,9 +354,6 @@ public class CheckBoxTree extends JTree { TreePath tmpTreePath = treePaths[i]; toggleSelection(tmpTreePath); } -// for (TreePath treePath : treePaths) { -// toggleSelection(treePath); -// } } } diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java index de1411c408..6b65cd3770 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java @@ -12,7 +12,6 @@ import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.workspace.WorkContext; -import javax.swing.BorderFactory; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; @@ -59,7 +58,7 @@ public class EnvFileTree extends RefreshableJTree { // CellRenderer // 这里新建一个Label作为render是因为JTree在动态刷新的时候,节点上render画布的的宽度不会变,会使得一部分比较长的数据显示为 - DefaultTreeCellRenderer fileTreeCellRenderer = new DefaultTreeCellRenderer() { + DefaultTreeCellRenderer fileTreeCellRenderer = new FineTreeCellRender() { @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, @@ -75,7 +74,7 @@ public class EnvFileTree extends RefreshableJTree { if (lock != null && !lock.equals(node.getUserID())) { name = name + Toolkit.i18nText("Fine-Design_Basic_Template_Status_Locked", "(", ")"); } - this.setIcon(FileTreeIcon.getIcon(node)); + this.setIcon(FileTreeIcon.getIconWithExpandAttr(node, expanded)); } else { this.setIcon(FileTreeIcon.getFolderHalfImageIcon()); } @@ -84,10 +83,6 @@ public class EnvFileTree extends RefreshableJTree { this.setIcon(null); this.setText(PENDING.toString()); } - this.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0)); -// this.setBackgroundNonSelectionColor(UIConstants.TREE_BACKGROUND); -// this.setTextSelectionColor(Color.WHITE); -// this.setBackgroundSelectionColor(UIConstants.FLESH_BLUE); return this; } }; diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java index 194dfa82de..785bca06b4 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java @@ -1,5 +1,6 @@ package com.fr.design.gui.itree.filetree; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseUtils; import com.fr.base.svg.IconUtils; import com.fr.design.ExtraDesignClassManager; @@ -23,14 +24,16 @@ public class FileTreeIcon { public static final String FILE_LOCKED_ICON_PATH = "/com/fr/design/images/gui/file_lock.png"; - public static final Icon BLANK_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/blank.gif"); - - public static final Icon FOLDER_IMAGE_ICON = IconUtils.readIcon("/com/fr/design/standard/fileicon/folder.svg"); - public static final Icon FOLDER_HALF_IMAGE_ICON = - IconUtils.readIcon("/com/fr/design/standard/fileicon/folder_half_authority.svg"); + public static final Icon FOLDER_IMAGE_ICON = new LazyIcon("folder"); + public static final Icon FOLDER_OPEN_IMAGE_ICON = new LazyIcon("folder_open"); + public static final Icon MODERN_CPT_FILE_IMAGE_ICON = new LazyIcon("cpt_icon"); + public static final Icon MODERN_FRM_FILE_IMAGE_ICON = new LazyIcon("frm_icon"); public static final Icon FILE_IMAGE_ICON = UIManager.getIcon("FileView.fileIcon"); + // TODO: 以下Icon视觉暂未提供,需提供后替换 + public static final Icon BLANK_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/blank.gif"); + public static final Icon FOLDER_HALF_IMAGE_ICON = IconUtils.readIcon("/com/fr/design/standard/fileicon/folder_half_authority.svg"); public static final Icon JAVA_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/javaFile.gif"); public static final Icon CLASS_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/classFile.gif"); public static final Icon JSP_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/jspFile.gif"); @@ -41,16 +44,8 @@ public class FileTreeIcon { public static final Icon GIF_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/gifFile.gif"); public static final Icon JPG_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/jpgFile.gif"); public static final Icon BMP_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/bmpFile.gif"); - public static final Icon CPT_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/cptFile.png"); - public static final Icon FRM_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/frm.png"); - public static final Icon CHT_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/cht.png"); - public static final Icon MODERN_CPT_FILE_IMAGE_ICON = - IconUtils.readIcon("/com/fr/design/standard/fileicon/cpt_icon.svg"); - public static final Icon MODERN_FRM_FILE_IMAGE_ICON = - IconUtils.readIcon("/com/fr/design/standard/fileicon/frm_icon.svg"); - public static final Icon MODERN_CHT_FILE_IMAGE_ICON = - IconUtils.readIcon("/com/fr/design/standard/fileicon/cht_icon.svg"); + public static final Icon MODERN_CHT_FILE_IMAGE_ICON = IconUtils.readIcon("/com/fr/design/standard/fileicon/cht_icon.svg"); public static final Icon CPTX_ICON = IconUtils.readIcon("/com/fr/design/standard/fileicon/cptx_icon.svg"); public static final Icon CPTX_LOCKED_ICON = IconUtils.readIcon("/com/fr/design/standard/fileicon/cptx_icon_locked.svg"); @@ -149,24 +144,45 @@ public class FileTreeIcon { return getIcon(node, showLock); } + /** + * 获取文件节点对应的图标(含展开与否的属性) + * + * @param node 文件节点 + * @param isExpand 是否已扩展出子节点 + * + * @return 文件节点的图标 + */ + public static Icon getIconWithExpandAttr(FileNode node, boolean isExpand) { + boolean showLock = node.getLock() != null && !ComparatorUtils.equals(node.getUserID(), node.getLock()); + return getIconWithExpandAttr(node, showLock, isExpand); + } + public static Icon getIcon(FileNode node, boolean isShowLock) { + return getIconWithExpandAttr(node, isShowLock, false); + } + + private static Icon getIconWithExpandAttr(FileNode node, boolean isShowLock, boolean isExpand) { String path = StableUtils.pathJoin(WorkContext.getCurrent().getPath(), node.getEnvPath()); if (WorkContext.getCurrent().isLocal()) { File ff = new File(path); if (ff.exists()) { if (node.isDirectory()) { - return FileTreeIcon.FOLDER_IMAGE_ICON; + return getFolderIcon(isExpand); } return getLocalFileIcon(path, isShowLock); } } if (node.isDirectory()) { - return FileTreeIcon.FOLDER_IMAGE_ICON; + return getFolderIcon(isExpand); } else { return getRemoteFileIcon(node, isShowLock); } } + private static Icon getFolderIcon(boolean isExpand) { + return isExpand ? FileTreeIcon.FOLDER_OPEN_IMAGE_ICON : FileTreeIcon.FOLDER_IMAGE_ICON; + } + private static Icon getLocalFileIcon(String path, boolean isShowLock) { Icon icon = getExtraIcon(path, isShowLock); if (icon != null) { diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FineTreeCellRender.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FineTreeCellRender.java new file mode 100644 index 0000000000..1df1325678 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FineTreeCellRender.java @@ -0,0 +1,30 @@ +package com.fr.design.gui.itree.filetree; + +import javax.swing.JTree; +import javax.swing.UIManager; +import javax.swing.BorderFactory; +import javax.swing.tree.DefaultTreeCellRenderer; +import java.awt.*; + +/** + * Tree子节点的渲染器 + * + * @author Levy.Xie + * @since 11.0 + * Created on 2023/11/28 + */ +public class FineTreeCellRender extends DefaultTreeCellRenderer { + + private static final long serialVersionUID = 1L; + + @Override + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { + super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); + Insets margins = UIManager.getInsets("Tree.rendererMargins"); + this.setBorder(BorderFactory.createEmptyBorder(margins.top, margins.left, + margins.bottom, margins.right)); + + this.setIconTextGap(UIManager.getInt("Tree.iconTextGap")); + return this; + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java b/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java index 113b2e4b45..6a8433225a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java @@ -54,7 +54,6 @@ public abstract class RefreshableJTree extends CheckBoxTree { ExpandMutableTreeNode root = (ExpandMutableTreeNode) model.getRoot(); root.setExpanded(true); this.setRootVisible(false); -// this.setBackground(UIConstants.TREE_BACKGROUND); this.addTreeExpansionListener(expansion); this.addTreeWillExpandListener(willExpand); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index 3df9250733..115d4aeaf2 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -428,7 +428,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt public NewFolderAction() { this.setName(KeySetUtils.NEW_FOLDER.getMenuKeySetName()); - this.setSmallIcon("/com/fr/design/standard/newfolder/new_folder"); + this.setSmallIcon(new LazyIcon("new_folder")); } @Override @@ -470,7 +470,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt public CollapseAllAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Collapse_All")); - this.setSmallIcon("/com/fr/design/standard/collapse_all", false); + this.setSmallIcon(new LazyIcon("collapse_all")); } @Override @@ -486,7 +486,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt private class VcsAction extends UpdateAction { public VcsAction() { - this.setSmallIcon("/com/fr/design/standard/vcslist/vcs_list"); + this.setSmallIcon(new LazyIcon("vcs_list")); } @Override @@ -569,7 +569,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt public ShowInExplorerAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Show_In_Containing_Folder")); - this.setSmallIcon("/com/fr/design/standard/viewfolder/view_folder"); + this.setSmallIcon(new LazyIcon("view_folder")); } @Override @@ -586,7 +586,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt public RefreshTreeAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Refresh")); - this.setSmallIcon("/com/fr/design/standard/refresh", false); + this.setSmallIcon(new LazyIcon("refresh")); } @Override diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index b35df4f71f..fbceec41c4 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -84,7 +84,7 @@ ToggleButtonUI = com.fine.theme.light.ui.FineToggleButtonUI ToolBarUI = com.formdev.flatlaf.ui.FlatToolBarUI ToolBarSeparatorUI = com.formdev.flatlaf.ui.FlatToolBarSeparatorUI ToolTipUI = com.formdev.flatlaf.ui.FlatToolTipUI -TreeUI = com.formdev.flatlaf.ui.FlatTreeUI +TreeUI =com.fr.design.gui.itree.UITreeUI ViewportUI = com.formdev.flatlaf.ui.FlatViewportUI @@ -1027,7 +1027,7 @@ Tree.dropCellBackground = @dropCellBackground Tree.dropCellForeground = @dropCellForeground Tree.dropLineColor = @dropLineColor Tree.rendererFillBackground = false -Tree.rendererMargins = 1,2,1,2 +Tree.rendererMargins = 4,0,4,0 Tree.selectionInsets = 0,0,0,0 Tree.selectionArc = 0 Tree.wideSelection = true @@ -1038,6 +1038,7 @@ Tree.showDefaultIcons = false Tree.leftChildIndent = 7 Tree.rightChildIndent = 11 Tree.rowHeight = 0 +Tree.iconTextGap = 6 Tree.expandedIcon = com.formdev.flatlaf.icons.FlatTreeExpandedIcon Tree.collapsedIcon = com.formdev.flatlaf.icons.FlatTreeCollapsedIcon diff --git a/designer-base/src/main/resources/com/fr/design/images/newui/cpt_icon.svg b/designer-base/src/main/resources/com/fr/design/images/newui/cpt_icon.svg new file mode 100644 index 0000000000..131380bdfa --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/newui/cpt_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/images/newui/folder.svg b/designer-base/src/main/resources/com/fr/design/images/newui/folder.svg new file mode 100644 index 0000000000..b18a8a15ea --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/newui/folder.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/images/newui/folder_open.svg b/designer-base/src/main/resources/com/fr/design/images/newui/folder_open.svg new file mode 100644 index 0000000000..ff22b046e2 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/newui/folder_open.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/images/newui/frm_icon.svg b/designer-base/src/main/resources/com/fr/design/images/newui/frm_icon.svg new file mode 100644 index 0000000000..10717832b0 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/newui/frm_icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/collapse_all.svg b/designer-base/src/main/resources/com/fr/design/standard/collapse_all.svg new file mode 100644 index 0000000000..d0040b8551 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/collapse_all.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/collapse_all_disable.svg b/designer-base/src/main/resources/com/fr/design/standard/collapse_all_disable.svg new file mode 100644 index 0000000000..ad625939c6 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/collapse_all_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/collapse_all_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/collapse_all_normal.svg deleted file mode 100644 index 45b28a56b3..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/collapse_all_normal.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/cpt_icon.svg b/designer-base/src/main/resources/com/fr/design/standard/fileicon/cpt_icon.svg index d691f38b67..65e47758f6 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/fileicon/cpt_icon.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/fileicon/cpt_icon.svg @@ -1,9 +1,10 @@ - - - - - - - - - \ No newline at end of file + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/excel_icon.svg b/designer-base/src/main/resources/com/fr/design/standard/fileicon/excel_icon.svg new file mode 100644 index 0000000000..9cfaf72f91 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/fileicon/excel_icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/folder.svg b/designer-base/src/main/resources/com/fr/design/standard/fileicon/folder.svg index ebafeec23c..4dd51d6ea1 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/fileicon/folder.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/fileicon/folder.svg @@ -1,3 +1,8 @@ - - - \ No newline at end of file + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/folder_open.svg b/designer-base/src/main/resources/com/fr/design/standard/fileicon/folder_open.svg new file mode 100644 index 0000000000..c68e5c464b --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/fileicon/folder_open.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/frm_icon.svg b/designer-base/src/main/resources/com/fr/design/standard/fileicon/frm_icon.svg index fa61a511fe..4eb67dbe7c 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/fileicon/frm_icon.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/fileicon/frm_icon.svg @@ -1,9 +1,12 @@ - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/fvs_icon.svg b/designer-base/src/main/resources/com/fr/design/standard/fileicon/fvs_icon.svg new file mode 100644 index 0000000000..768daca872 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/fileicon/fvs_icon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/minus.svg b/designer-base/src/main/resources/com/fr/design/standard/fileicon/minus.svg index db4e76f2a9..75878fc8c2 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/fileicon/minus.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/fileicon/minus.svg @@ -1,3 +1,5 @@ - - - \ No newline at end of file + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/plus.svg b/designer-base/src/main/resources/com/fr/design/standard/fileicon/plus.svg index f012490aee..ca1e276691 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/fileicon/plus.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/fileicon/plus.svg @@ -1,3 +1,5 @@ - - - \ No newline at end of file + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/locate/locate.svg b/designer-base/src/main/resources/com/fr/design/standard/locate/locate.svg new file mode 100644 index 0000000000..de1e9e0032 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/locate/locate.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/locate/locate_disable.svg b/designer-base/src/main/resources/com/fr/design/standard/locate/locate_disable.svg new file mode 100644 index 0000000000..c21036aee8 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/locate/locate_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/locate/locate_disabled.svg b/designer-base/src/main/resources/com/fr/design/standard/locate/locate_disabled.svg deleted file mode 100644 index 3a94510fb0..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/locate/locate_disabled.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/locate/locate_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/locate/locate_normal.svg deleted file mode 100644 index 6c78878c0a..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/locate/locate_normal.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder.svg b/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder.svg new file mode 100644 index 0000000000..1b6be8d0de --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_disable.svg b/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_disable.svg new file mode 100644 index 0000000000..0f80825179 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_disabled.svg b/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_disabled.svg deleted file mode 100644 index f3936e1539..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_disabled.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - icon_NewFolderIcon_disable - - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_normal.svg deleted file mode 100644 index 85f41e26a7..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_normal.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - icon_NewFolderIcon_normal - - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/refresh.svg b/designer-base/src/main/resources/com/fr/design/standard/refresh.svg new file mode 100644 index 0000000000..48b431577e --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/refresh.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/refresh_disable.svg b/designer-base/src/main/resources/com/fr/design/standard/refresh_disable.svg new file mode 100644 index 0000000000..d54fdf70ad --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/refresh_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/refresh_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/refresh_normal.svg deleted file mode 100644 index 4e3fd9c147..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/refresh_normal.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - icon_刷新_normal - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/rename/rename.svg b/designer-base/src/main/resources/com/fr/design/standard/rename/rename.svg new file mode 100644 index 0000000000..7b47879915 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/rename/rename.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/rename/rename_disable.svg b/designer-base/src/main/resources/com/fr/design/standard/rename/rename_disable.svg new file mode 100644 index 0000000000..f5066f037b --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/rename/rename_disable.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/rename/rename_disabled.svg b/designer-base/src/main/resources/com/fr/design/standard/rename/rename_disabled.svg deleted file mode 100644 index 953e12eaa9..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/rename/rename_disabled.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - icon_重命名_disable - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/rename/rename_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/rename/rename_normal.svg deleted file mode 100644 index a2c287789d..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/rename/rename_normal.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - icon_重命名_normal - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list.svg b/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list.svg new file mode 100644 index 0000000000..c21bbce647 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_disable.svg b/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_disable.svg new file mode 100644 index 0000000000..1fb00c82e7 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_disabled.svg b/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_disabled.svg deleted file mode 100644 index b88ee0998e..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_disabled.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - icon_版本管理_disabled - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_normal.svg deleted file mode 100644 index ebfca43899..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_normal.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - icon_版本管理_normal - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder.svg b/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder.svg new file mode 100644 index 0000000000..9781e5d2e2 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_disable.svg b/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_disable.svg new file mode 100644 index 0000000000..0a89f2ef5c --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_disable.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_disabled.svg b/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_disabled.svg deleted file mode 100644 index 376d372d41..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_disabled.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - icon_打开文件_disable - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_normal.svg deleted file mode 100644 index 42ae6cbd3d..0000000000 --- a/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_normal.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - icon_所在文件夹_normal - - - - \ No newline at end of file From 6021cbfcc6ac33fc94956746ba951b903f779f44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Tue, 28 Nov 2023 19:06:52 +0800 Subject: [PATCH 008/302] =?UTF-8?q?REPORT-107972=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0=20CheckBox?= =?UTF-8?q?=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 10 +++++-- .../fr/design/gui/icheckbox/UICheckBox.java | 27 +++++-------------- .../fr/design/images/newui/check-hovered.svg | 6 +++++ .../com/fr/design/images/newui/checked.svg | 20 ++++++++++++++ .../fr/design/images/newui/not-checked.svg | 6 +++++ .../fr/design/standard/checkbox/checked.svg | 19 +++++++++++++ .../standard/checkbox/checked_disable.svg | 7 +++++ .../fr/design/standard/checkbox/hovered.svg | 6 +++++ .../design/standard/checkbox/part_checked.svg | 6 +++++ .../fr/design/standard/checkbox/unchecked.svg | 6 +++++ .../standard/checkbox/unchecked_disable.svg | 6 +++++ 11 files changed, 96 insertions(+), 23 deletions(-) create mode 100644 designer-base/src/main/resources/com/fr/design/images/newui/check-hovered.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/newui/checked.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/newui/not-checked.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/checkbox/checked.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/checkbox/checked_disable.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/checkbox/hovered.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/checkbox/part_checked.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/checkbox/unchecked.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/checkbox/unchecked_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 5854b8d6e1..3212a41853 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -61,8 +61,14 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("vcs_list", "com/fr/design/standard/vcslist/vcs_list.svg", true), new SvgIconSource("view_folder", "com/fr/design/standard/viewfolder/view_folder.svg", true), new SvgIconSource("refresh", "com/fr/design/standard/refresh.svg", true), - new SvgIconSource("new_folder", "com/fr/design/standard/newfolder/new_folder.svg", true) + new SvgIconSource("new_folder", "com/fr/design/standard/newfolder/new_folder.svg", true), - ); + // CheckBox相关Icon + new SvgIconSource("checkbox_checked", "com/fr/design/standard/checkbox/checked.svg", true), + new SvgIconSource("checkbox_unchecked", "com/fr/design/standard/checkbox/unchecked.svg", true), + new SvgIconSource("checkbox_part_checked", "com/fr/design/standard/checkbox/part_checked.svg", true), + new SvgIconSource("checkbox_hovered", "com/fr/design/standard/checkbox/hovered.svg", true) + + ); } } 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 8162c7ba86..93490f7116 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 @@ -1,13 +1,11 @@ package com.fr.design.gui.icheckbox; -import com.fr.design.constants.UIConstants; +import com.fine.theme.icon.LazyIcon; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; import com.fr.design.gui.core.UITextComponent; -import com.fr.design.utils.gui.GUIPaintUtils; -import com.fr.stable.Constants; import sun.swing.SwingUtilities2; import javax.swing.AbstractButton; @@ -144,7 +142,7 @@ public class UICheckBox extends JCheckBox implements UIObserver, GlobalNameObser * * @return UICheckBoxUI */ - public UICheckBoxUI getUICheckBoxUI(){ + public UICheckBoxUI getUICheckBoxUI() { return new UICheckBoxUI(); } @@ -176,28 +174,15 @@ public class UICheckBox extends JCheckBox implements UIObserver, GlobalNameObser 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); + new LazyIcon("checkbox_checked").paintIcon(c, g, iconRect.x, iconRect.y); + } else if (model.isRollover()) { + new LazyIcon("checkbox_hovered").paintIcon(c, g, iconRect.x, iconRect.y); } else { - g.setColor(UIConstants.LINE_COLOR); - g2d.drawRoundRect(iconRect.x, iconRect.y, iconRect.width - 1, iconRect.height - 1, UIConstants.ARC, UIConstants.ARC); + new LazyIcon("checkbox_unchecked").paintIcon(c, g, iconRect.x, iconRect.y); } - - 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 diff --git a/designer-base/src/main/resources/com/fr/design/images/newui/check-hovered.svg b/designer-base/src/main/resources/com/fr/design/images/newui/check-hovered.svg new file mode 100644 index 0000000000..1305030ec4 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/newui/check-hovered.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/newui/checked.svg b/designer-base/src/main/resources/com/fr/design/images/newui/checked.svg new file mode 100644 index 0000000000..d6d97f23ab --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/newui/checked.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/newui/not-checked.svg b/designer-base/src/main/resources/com/fr/design/images/newui/not-checked.svg new file mode 100644 index 0000000000..3f26076a0b --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/newui/not-checked.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/checkbox/checked.svg b/designer-base/src/main/resources/com/fr/design/standard/checkbox/checked.svg new file mode 100644 index 0000000000..fa4b47ddd7 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/checkbox/checked.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/checkbox/checked_disable.svg b/designer-base/src/main/resources/com/fr/design/standard/checkbox/checked_disable.svg new file mode 100644 index 0000000000..88df5c1a59 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/checkbox/checked_disable.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/checkbox/hovered.svg b/designer-base/src/main/resources/com/fr/design/standard/checkbox/hovered.svg new file mode 100644 index 0000000000..54a7539d4d --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/checkbox/hovered.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/checkbox/part_checked.svg b/designer-base/src/main/resources/com/fr/design/standard/checkbox/part_checked.svg new file mode 100644 index 0000000000..caeebfd58c --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/checkbox/part_checked.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/checkbox/unchecked.svg b/designer-base/src/main/resources/com/fr/design/standard/checkbox/unchecked.svg new file mode 100644 index 0000000000..86fa2f7148 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/checkbox/unchecked.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/checkbox/unchecked_disable.svg b/designer-base/src/main/resources/com/fr/design/standard/checkbox/unchecked_disable.svg new file mode 100644 index 0000000000..cab88105ee --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/checkbox/unchecked_disable.svg @@ -0,0 +1,6 @@ + + + + + + From d2e12394bbe4e0f33d1bb11c983fd31b17026bef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Tue, 28 Nov 2023 19:19:15 +0800 Subject: [PATCH 009/302] =?UTF-8?q?REPORT-107972=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0=20=E5=8E=BB?= =?UTF-8?q?=E9=99=A4=E5=A4=9A=E4=BD=99=E7=9A=84icon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/images/newui/check-hovered.svg | 6 ------ .../com/fr/design/images/newui/checked.svg | 20 ------------------- .../com/fr/design/images/newui/cpt_icon.svg | 10 ---------- .../com/fr/design/images/newui/folder.svg | 8 -------- .../fr/design/images/newui/folder_open.svg | 8 -------- .../com/fr/design/images/newui/frm_icon.svg | 12 ----------- .../fr/design/images/newui/not-checked.svg | 6 ------ 7 files changed, 70 deletions(-) delete mode 100644 designer-base/src/main/resources/com/fr/design/images/newui/check-hovered.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/images/newui/checked.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/images/newui/cpt_icon.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/images/newui/folder.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/images/newui/folder_open.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/images/newui/frm_icon.svg delete mode 100644 designer-base/src/main/resources/com/fr/design/images/newui/not-checked.svg diff --git a/designer-base/src/main/resources/com/fr/design/images/newui/check-hovered.svg b/designer-base/src/main/resources/com/fr/design/images/newui/check-hovered.svg deleted file mode 100644 index 1305030ec4..0000000000 --- a/designer-base/src/main/resources/com/fr/design/images/newui/check-hovered.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/newui/checked.svg b/designer-base/src/main/resources/com/fr/design/images/newui/checked.svg deleted file mode 100644 index d6d97f23ab..0000000000 --- a/designer-base/src/main/resources/com/fr/design/images/newui/checked.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/newui/cpt_icon.svg b/designer-base/src/main/resources/com/fr/design/images/newui/cpt_icon.svg deleted file mode 100644 index 131380bdfa..0000000000 --- a/designer-base/src/main/resources/com/fr/design/images/newui/cpt_icon.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/designer-base/src/main/resources/com/fr/design/images/newui/folder.svg b/designer-base/src/main/resources/com/fr/design/images/newui/folder.svg deleted file mode 100644 index b18a8a15ea..0000000000 --- a/designer-base/src/main/resources/com/fr/design/images/newui/folder.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/designer-base/src/main/resources/com/fr/design/images/newui/folder_open.svg b/designer-base/src/main/resources/com/fr/design/images/newui/folder_open.svg deleted file mode 100644 index ff22b046e2..0000000000 --- a/designer-base/src/main/resources/com/fr/design/images/newui/folder_open.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/designer-base/src/main/resources/com/fr/design/images/newui/frm_icon.svg b/designer-base/src/main/resources/com/fr/design/images/newui/frm_icon.svg deleted file mode 100644 index 10717832b0..0000000000 --- a/designer-base/src/main/resources/com/fr/design/images/newui/frm_icon.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/designer-base/src/main/resources/com/fr/design/images/newui/not-checked.svg b/designer-base/src/main/resources/com/fr/design/images/newui/not-checked.svg deleted file mode 100644 index 3f26076a0b..0000000000 --- a/designer-base/src/main/resources/com/fr/design/images/newui/not-checked.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file From 9194c8cd70b8efb4642d5edec03dcdf2c823346a Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 28 Nov 2023 20:44:32 +0800 Subject: [PATCH 010/302] =?UTF-8?q?Revert=20"REPORT-99485=20UI=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=88=86=E7=A6=BBDemo"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit b75652dc438f16b7e0bee2d5266b4a35f756fe91. --- .../connect/ConnectionComboBoxPanel.java | 200 +++---- .../connect/ConnectionTableProcedurePane.java | 548 +++++++++--------- .../connect/ItemEditableComboBoxPanel.java | 182 ++++++ .../tabledatapane/DBTableDataPane.java | 505 ++++++++++++---- .../tabledatapane/DBTableDataViewModel.java | 281 --------- 5 files changed, 929 insertions(+), 787 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataViewModel.java diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionComboBoxPanel.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionComboBoxPanel.java index d3b1a720d7..76f32d6f0c 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionComboBoxPanel.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionComboBoxPanel.java @@ -1,9 +1,7 @@ package com.fr.design.data.datapane.connect; -import com.fine.state.livedata.LiveData; -import com.fine.swing.ui.layout.Row; -import com.fr.base.BaseUtils; import com.fr.base.svg.IconUtils; +import com.fr.data.impl.AbstractDatabaseConnection; import com.fr.data.impl.Connection; import com.fr.data.impl.NameDatabaseConnection; import com.fr.design.DesignerEnvManager; @@ -11,23 +9,22 @@ import com.fr.design.editlock.ConnectionLockChangeChecker; import com.fr.design.editlock.EditLockUtils; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UILockButton; -import com.fr.design.gui.icombobox.UIComboBox; -import com.fr.design.i18n.Toolkit; -import com.fr.log.FineLoggerFactory; +import com.fr.file.ConnectionConfig; import com.fr.report.LockItem; import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; -import org.jetbrains.annotations.Nullable; +import com.fr.workspace.server.connection.DBConnectAuth; -import javax.swing.DefaultComboBoxModel; import javax.swing.SwingUtilities; +import java.awt.Dimension; +import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; import java.util.List; -import java.util.Objects; -import java.util.concurrent.CancellationException; -import java.util.function.Consumer; - -import static com.fine.swing.ui.layout.Layouts.cell; /** * 选择数据连接的下拉框 @@ -35,150 +32,86 @@ import static com.fine.swing.ui.layout.Layouts.cell; * @editor zhou * @since 2012-3-28下午3:02:30 */ -public class ConnectionComboBoxPanel extends Row { +public class ConnectionComboBoxPanel extends ItemEditableComboBoxPanel { + /** + * + */ private static final long serialVersionUID = 1L; + private Class cls; // 所取的Connection都是cls及其子类 + private List nameList = new ArrayList(); - private static final String PENDING = Toolkit.i18nText("Fine-Design_Basic_Loading") + "..."; - - protected static final Object EMPTY = new Object() { - public String toString() { - return ""; - } - }; - - protected UIComboBox itemComboBox; - protected UIButton editButton; - - // 记录原来选中的Item,重新加载后需要再次选中 - private Object lastSelectedItem; - - private final LiveData> names; - private final Consumer fetchNames; - - public ConnectionComboBoxPanel( - LiveData> names, - LiveData selectedItem, - @Nullable Consumer fetchNames, - @Nullable Consumer selecteChangeConsumer - ) { + public ConnectionComboBoxPanel(Class cls) { super(); - this.names = names; - this.fetchNames = fetchNames; - initComponents(); + + this.cls = cls; // alex:添加item change监听,当改变时改变DesignerEnvManager中的最近选中的数据连接 - this.itemComboBox.addItemListener(e -> { - String selected = ConnectionComboBoxPanel.this.getSelectedItem(); - if(PENDING.equals(selected)){ - return; - } - if (StringUtils.isNotBlank(selected)) { - DesignerEnvManager.getEnvManager().setRecentSelectedConnection(selected); - } - if(!Objects.isNull(selecteChangeConsumer)){ - selecteChangeConsumer.accept(selected); - } - }); - names.observeForever(strings -> { - try { - itemComboBox.setModel(new DefaultComboBoxModel<>(strings.toArray(new String[0]))); -// // 如果加载成功 但是下拉框是可见的 下拉框高度是会固定为原始高度 不会因为填充了更多下拉项而变化 -// // 需要重新设置下拉框高度 但值一样时相关事件不会生效 所以先加再减下 -// if (itemComboBox.isPopupVisible()) { -// itemComboBox.setMaximumRowCount(itemComboBox.getMaximumRowCount() + 1); -// itemComboBox.setMaximumRowCount(itemComboBox.getMaximumRowCount() - 1); -// } -// // 存在两种场景之前只考虑了填充场景 有populate会填充下 把这边的填充逻辑删了 所以没有问题 -// // 如果是纯通过刷新按钮 没有populate 需要手动设置下上次选中的内容 - if (lastSelectedItem != null) { - itemComboBox.setSelectedItem(lastSelectedItem); - } - } catch (Exception e) { - if (!(e instanceof CancellationException)) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + this.itemComboBox.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + String selected = ConnectionComboBoxPanel.this.getSelectedItem(); + if (StringUtils.isNotBlank(selected)) { + DesignerEnvManager.getEnvManager().setRecentSelectedConnection(selected); } } }); - - - lastSelectedItem = selectedItem.getValue(); refreshItems(); } - private void initComponents() { - setSpacing(5); - add( - cell(new UIComboBox()).weight(1.0).with(uiComboBox -> { - this.itemComboBox= uiComboBox; - uiComboBox.setEnabled(true); - - }), - cell(new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png"))) - .with(btn -> btn.addActionListener(e -> refreshItems())), - cell(initEditButton()).with(uiButton -> editButton = uiButton) - ); - } - - - /** - * 给itemComboBox添加ActionListener - */ - public void addComboBoxActionListener(ActionListener l) { - itemComboBox.addActionListener(l); - } - - /* - * 刷新itemComboBox的内容 - */ - protected void refreshItems() { - lastSelectedItem = itemComboBox.getSelectedItem(); - DefaultComboBoxModel model = ((DefaultComboBoxModel) itemComboBox.getModel()); - - model.removeAllElements(); - - // 先加EMPTY,再加items - model.addElement(PENDING); - if(!Objects.isNull(fetchNames)){ - fetchNames.accept(null); - } - } - - protected UIButton initEditButton() { - UIButton editButton = new UILockButton( + @Override + protected UIButton initEditButton(UIButton editButton, Dimension buttonSize) { + editButton = new UILockButton( EditLockUtils.CONNECTION_LOCKED_ICON, IconUtils.readIcon("/com/fr/design/images/m_web/connection"), EditLockUtils.CONNECTION_LOCKED_TOOLTIPS, null ); -// editButton.setPreferredSize(buttonSize); - editButton.addActionListener(evt -> editItems()); + editButton.setPreferredSize(buttonSize); + editButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + editItems(); + } + }); ConnectionLockChangeChecker.getInstance().addEditLockChangeListener((UILockButton) editButton); return editButton; } /* - * 得到其中的itemComboBox所选中的Item + * 刷新ComboBox.items */ - public String getSelectedItem() { - Object selected = itemComboBox.getSelectedItem(); + protected Iterator items() { + ConnectionConfig mgr = ConnectionConfig.getInstance(); + Iterator nameIt = mgr.getConnections().keySet().iterator(); + + Collection noAuthConnections = WorkContext.getCurrent().get(DBConnectAuth.class).getNoAuthConnections(); - return selected instanceof String ? (String)selected : null; + nameList = new ArrayList<>(); + + if (noAuthConnections == null) { + return nameList.iterator(); + } + while (nameIt.hasNext()) { + String conName = nameIt.next(); + if (noAuthConnections.contains(conName)) { + continue; + } + Connection connection = mgr.getConnection(conName); + // nameList依赖items方法初始化,父类ItemEditableComboBoxPanel里异步执行item方法 + filterConnection(connection, conName, nameList); + } + + return nameList.iterator(); } - /* - * 选中name项 - */ - public void setSelectedItem(String name) { - DefaultComboBoxModel model = ((DefaultComboBoxModel) itemComboBox.getModel()); - model.setSelectedItem(name); + protected void filterConnection(Connection connection, String conName, List nameList) { + connection.addConnection(nameList, conName, new Class[]{AbstractDatabaseConnection.class}); } public int getConnectionSize() { - return names.getValue().size(); + return nameList.size(); } public String getConnection(int i) { - return names.getValue().get(i); + return nameList.get(i); } /* @@ -215,7 +148,9 @@ public class ConnectionComboBoxPanel extends Row { protected void setRecentConnection() { String s = DesignerEnvManager.getEnvManager().getRecentSelectedConnection(); if (StringUtils.isNotBlank(s)) { - if (names.getValue().contains(s)) { + // 之前的写法有多线程问题,nameList异步尚未初始化完成的时候,这里可能无法匹配设置数据连接名称,导致DBTableDataPane打开后连接面板空白 + // 这里的需求无非是设置上一次使用的数据连接,做个简单检查这个连接是否存在即可,存在就设置 + if (nameList.contains(s)) { this.setSelectedItem(s); } } @@ -225,5 +160,12 @@ public class ConnectionComboBoxPanel extends Row { } } - -} \ No newline at end of file + /** + * 是否无选中状态(空白item也视为无选中) + * @return + */ + protected boolean isSelectedItemEmpty() { + String selectedItem = this.getSelectedItem(); + return selectedItem == null || StringUtils.equals(selectedItem, EMPTY.toString()); + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java index de5d1ed8a7..41556dae83 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java @@ -1,14 +1,13 @@ package com.fr.design.data.datapane.connect; -import com.fine.state.livedata.LiveData; -import com.fine.state.livedata.MutableLiveData; import com.fr.base.BaseUtils; import com.fr.base.svg.IconUtils; import com.fr.data.core.db.TableProcedure; +import com.fr.data.impl.AbstractDatabaseConnection; import com.fr.data.impl.Connection; -import com.fr.design.DesignerEnvManager; import com.fr.design.border.UIRoundedBorder; import com.fr.design.constants.UIConstants; +import com.fr.design.data.tabledata.tabledatapane.loading.SwitchableTableDataPane; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icontainer.UIScrollPane; @@ -19,24 +18,21 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.general.GeneralContext; import com.fr.stable.ArrayUtils; -import com.fr.stable.StringUtils; import javax.swing.BorderFactory; +import javax.swing.DefaultComboBoxModel; import javax.swing.JPanel; import javax.swing.ToolTipManager; -import javax.swing.border.EmptyBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.BorderLayout; import java.awt.Dimension; +import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.function.Consumer; /** * 数据集编辑面板左边的部分 @@ -45,269 +41,277 @@ import java.util.function.Consumer; * @since 2012-3-28下午10:14:59 */ public class ConnectionTableProcedurePane extends BasicPane { - private static int WIDTH = 155; - private ConnectionComboBoxPanel connectionComboBox; - private UICheckBox tableCheckBox; - private UICheckBox viewCheckBox; - protected UITextField searchField; - private TableViewList tableViewList; - private List listeners = new ArrayList(); - - private ConnectionTableState state; - - public MutableLiveData selected = new MutableLiveData<>(); - public Consumer selecteChangeConsumer; - - public static class ConnectionTableState { - public LiveData> names; - public Consumer namesConsumer; - public LiveData> tableProcedures; - public Consumer tableProcedureBeanConsumer; - - public ConnectionTableState(LiveData> names, Consumer namesConsumer, LiveData> tableProcedures, Consumer tableProcedureBeanConsumer) { - this.names = names; - this.namesConsumer = namesConsumer; - this.tableProcedures = tableProcedures; - this.tableProcedureBeanConsumer = tableProcedureBeanConsumer; - } - } - - public ConnectionTableProcedurePane() { - init(); - } - - public ConnectionTableProcedurePane(ConnectionTableState state) { - this.state = state; - init(); - } - - - private void init() { - selecteChangeConsumer = selectedName -> { - selected.setValue(selectedName); - }; - this.setLayout(new BorderLayout(4, 4)); - - // 初始化中间的面板 - JPanel centerPane = initCenterPane(); - this.add(centerPane, BorderLayout.CENTER); - // 初始化数据连接下拉框 - initConnectionComboBox(); - this.add(connectionComboBox, BorderLayout.NORTH); - setBorder(new EmptyBorder( - 10, 10, 10, 10 - )); - this.setPreferredSize(new Dimension(WIDTH, getPreferredSize().height)); - addKeyMonitor(); - state.names.observeForever(strings -> { - search(true); - }); - } - - - protected void filter(Connection connection, String conName, List nameList) { - - } - - private JPanel initCenterPane() { - JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - // 搜索面板 - centerPane.add(createSearchPane(), BorderLayout.NORTH); - // 数据库表视图面板 - centerPane.add(createTableViewBorderPane(), BorderLayout.CENTER); - return centerPane; - } - - private void initConnectionComboBox() { - connectionComboBox = new ConnectionComboBoxPanel(state.names, selected,state.namesConsumer, selecteChangeConsumer); - connectionComboBox.addComboBoxActionListener(filter); - } - - - - private JPanel createTableViewBorderPane() { - tableViewList = new TableViewList(state.tableProcedures, state.tableProcedureBeanConsumer); - ToolTipManager.sharedInstance().registerComponent(tableViewList); - - tableViewList.addMouseListener(new MouseAdapter() { - public void mouseClicked(MouseEvent evt) { - if (evt.getClickCount() >= 2) { - Object obj = tableViewList.getSelectedValue(); - TableProcedure tableProcedure = null; - if (obj instanceof TableProcedure) { - tableProcedure = (TableProcedure) obj; - } else { - return; - } - for (DoubleClickSelectedNodeOnTreeListener listener : ConnectionTableProcedurePane.this.listeners) { - listener.actionPerformed(tableProcedure); - } - } - } - }); - UIScrollPane tableViewListPane = new UIScrollPane(tableViewList); - tableViewListPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); - JPanel tableViewBorderPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - tableViewBorderPane.add(tableViewListPane, BorderLayout.CENTER); - JPanel checkBoxgroupPane = createCheckBoxgroupPane(); - if (checkBoxgroupPane != null) { - tableViewBorderPane.add(createCheckBoxgroupPane(), BorderLayout.SOUTH); - } - return tableViewBorderPane; - } - - /** - * 创建搜索Panel,用于搜索表或视图 - * - * @return - */ - private JPanel createSearchPane() { - JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - JPanel searchPane = new JPanel(new BorderLayout(10, 0)); - searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.TOOLBAR_BORDER_COLOR)); + private static int WIDTH = 155; + private ConnectionComboBoxPanel connectionComboBox; + private UICheckBox tableCheckBox; + private UICheckBox viewCheckBox; + protected UITextField searchField; + private TableViewList tableViewList; + private java.util.List listeners = new java.util.ArrayList(); + + public ConnectionTableProcedurePane() { + init(null); + } + + /** + * 传入父容器 + * @param parent + */ + public ConnectionTableProcedurePane(SwitchableTableDataPane parent) { + init(parent); + } + + private void init(SwitchableTableDataPane parent) { + this.setLayout(new BorderLayout(4, 4)); + // 初始化数据连接下拉框 + initConnectionComboBox(parent); + // 初始化中间的面板 + JPanel centerPane = initCenterPane(); + this.add(connectionComboBox, BorderLayout.NORTH); + this.add(centerPane, BorderLayout.CENTER); + this.setPreferredSize(new Dimension(WIDTH, getPreferredSize().height)); + addKeyMonitor(); + } + + private JPanel initCenterPane() { + JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + // 搜索面板 + centerPane.add(createSearchPane(), BorderLayout.NORTH); + // 数据库表视图面板 + centerPane.add(createTableViewBorderPane(), BorderLayout.CENTER); + return centerPane; + } + + private void initConnectionComboBox(SwitchableTableDataPane parent) { + connectionComboBox = new ConnectionComboBoxPanel(com.fr.data.impl.Connection.class) { + + @Override + protected void filterConnection(Connection connection, String conName, List nameList) { + filter(connection, conName, nameList); + } + + @Override + protected void refreshItems() { + super.refreshItems(); + if (tableViewList != null) { + search(true); + } + } + + @Override + protected void afterRefreshItems() { + // 刷新完成后,如果未选中(在nameList初始化完成之前可能会出现),则尝试再次设置 + if (isSelectedItemEmpty()) { + setRecentConnection(); + } + // 获取数据连接之后,让父容器切换面板 + if (parent != null) { + parent.switchTo(SwitchableTableDataPane.CONTENT_PANE_NAME); + } + DefaultComboBoxModel model = ((DefaultComboBoxModel) itemComboBox.getModel()); + model.removeElement(EMPTY); + } + + @Override + protected void refreshItemsError() { + // 获取数据连接出现错误时,也让父容器从Loading面板切换至内容面板 + if (parent != null) { + parent.switchTo(SwitchableTableDataPane.CONTENT_PANE_NAME); + } + } + }; + connectionComboBox.addComboBoxActionListener(filter); + } + + private JPanel createTableViewBorderPane() { + tableViewList = new TableViewList(); + ToolTipManager.sharedInstance().registerComponent(tableViewList); + + tableViewList.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent evt) { + if (evt.getClickCount() >= 2) { + Object obj = tableViewList.getSelectedValue(); + TableProcedure tableProcedure = null; + if (obj instanceof TableProcedure) { + tableProcedure = (TableProcedure) obj; + } else { + return; + } + for (int i = 0; i < ConnectionTableProcedurePane.this.listeners.size(); i++) { + ConnectionTableProcedurePane.this.listeners.get(i).actionPerformed(tableProcedure); + } + } + } + }); + UIScrollPane tableViewListPane = new UIScrollPane(tableViewList); + tableViewListPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); + JPanel tableViewBorderPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + tableViewBorderPane.add(tableViewListPane, BorderLayout.CENTER); + JPanel checkBoxgroupPane = createCheckBoxgroupPane(); + if (checkBoxgroupPane != null) { + tableViewBorderPane.add(createCheckBoxgroupPane(), BorderLayout.SOUTH); + } + return tableViewBorderPane; + } + + /** + * 创建搜索Panel,用于搜索表或视图 + * @return + */ + private JPanel createSearchPane() { + JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + JPanel searchPane = new JPanel(new BorderLayout(10, 0)); + searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.TOOLBAR_BORDER_COLOR)); // searchPane.setBackground(Color.WHITE); - searchField = new UITextField(); - searchField.setBorderPainted(false); - searchField.setPlaceholder(Toolkit.i18nText("Fine-Design_Basic_Table_Search")); - searchField.getDocument().addDocumentListener(searchListener); - searchField.addMouseListener(new MouseAdapter() { - @Override - public void mouseEntered(MouseEvent e) { - super.mouseEntered(e); - searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.CHECKBOX_HOVER_SELECTED)); - } - - @Override - public void mouseExited(MouseEvent e) { - super.mouseExited(e); - searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.TOOLBAR_BORDER_COLOR)); - } - }); - // 搜索图标 - UILabel searchLabel = new UILabel(IconUtils.readIcon("/com/fr/design/images/data/search")); - searchLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); - searchPane.add(searchField, BorderLayout.CENTER); - searchPane.add(searchLabel, BorderLayout.EAST); - panel.add(searchPane, BorderLayout.CENTER); - return panel; - } - - protected void addKeyMonitor() { - //do nothing - } - - protected JPanel createCheckBoxgroupPane() { - JPanel checkBoxgroupPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); - JPanel first = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - tableCheckBox = new UICheckBox(); - tableCheckBox.setSelected(true); - tableCheckBox.addActionListener(filter); - first.add(tableCheckBox); - - JPanel second = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - viewCheckBox = new UICheckBox(); - viewCheckBox.setSelected(true); - viewCheckBox.addActionListener(filter); - second.add(viewCheckBox); - - // 根据环境是否为中文设置不同的显示 - if (GeneralContext.isChineseEnv()) { - first.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_SQL_Table"), - BaseUtils.readIcon("/com/fr/design/images/data/tables.png"), UILabel.LEADING)); - second.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_SQL_View"), - BaseUtils.readIcon("/com/fr/design/images/data/views.png"), UILabel.LEADING)); - } else { - UILabel ui1 = new UILabel(BaseUtils.readIcon("/com/fr/design/images/data/tables.png"), UILabel.LEADING); - UILabel ui2 = new UILabel(BaseUtils.readIcon("/com/fr/design/images/data/views.png"), UILabel.LEADING); - ui1.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_SQL_Table")); - ui2.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_SQL_View")); - first.add(ui1); - second.add(ui2); - } - checkBoxgroupPane.add(first); - checkBoxgroupPane.add(second); - - return checkBoxgroupPane; - } - - /** - * 给 itemComboBox 加上 itemListener - * - * @param itemListener - */ - public void addItemListener(ItemListener itemListener) { - connectionComboBox.itemComboBox.addItemListener(itemListener); - } - - private final DocumentListener searchListener = new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent e) { - search(false); - } - - @Override - public void insertUpdate(DocumentEvent e) { - search(false); - } - - @Override - public void changedUpdate(DocumentEvent e) { - search(false); - } - }; - - private final ActionListener filter = e -> search(false); - - /** - * 选项改变,需要重新刷新下拉列表里面的项 - */ - protected void search(boolean refresh) { - String selectedObj = selected.getValue(); - if(StringUtils.isBlank(selectedObj)){ - selectedObj = DesignerEnvManager.getEnvManager().getRecentSelectedConnection(); - } - - String[] types = ArrayUtils.EMPTY_STRING_ARRAY; - if (tableCheckBox != null) { - if (tableCheckBox.isSelected()) { - types = ArrayUtils.add(types, TableProcedure.TABLE); - } - if (viewCheckBox.isSelected()) { - types = ArrayUtils.add(types, TableProcedure.VIEW); - } - } else { - types = ArrayUtils.add(types, TableProcedure.PROCEDURE); - } - tableViewList.populate(selectedObj, searchField.getText().trim(), refresh, types); - } - - @Override - protected String title4PopupWindow() { - return "Connection"; - } - - /** - * @param l - */ - public void addDoubleClickListener(DoubleClickSelectedNodeOnTreeListener l) { - this.listeners.add(l); - } - - public void setSelectedDatabaseConnection(com.fr.data.impl.Connection db) { - connectionComboBox.populate(db); - } - - public String getSelectedDatabaseConnnectonName() { - return connectionComboBox.getSelectedItem(); - } - - public static interface DoubleClickSelectedNodeOnTreeListener { - /** - * 处理双击事件 - * - * @param target - */ - public void actionPerformed(TableProcedure target); - } + searchField = new UITextField(); + searchField.setBorderPainted(false); + searchField.setPlaceholder(Toolkit.i18nText("Fine-Design_Basic_Table_Search")); + searchField.getDocument().addDocumentListener(searchListener); + searchField.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + super.mouseEntered(e); + searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.CHECKBOX_HOVER_SELECTED)); + } + + @Override + public void mouseExited(MouseEvent e) { + super.mouseExited(e); + searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.TOOLBAR_BORDER_COLOR)); + } + }); + // 搜索图标 + UILabel searchLabel = new UILabel(IconUtils.readIcon("/com/fr/design/images/data/search")); + searchLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); + searchPane.add(searchField, BorderLayout.CENTER); + searchPane.add(searchLabel, BorderLayout.EAST); + panel.add(searchPane, BorderLayout.CENTER); + return panel; + } + + protected void filter(Connection connection, String conName, List nameList) { + connection.addConnection(nameList, conName, new Class[]{AbstractDatabaseConnection.class}); + } + + protected void addKeyMonitor() { + //do nothing + } + + protected JPanel createCheckBoxgroupPane() { + JPanel checkBoxgroupPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); + JPanel first = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + tableCheckBox = new UICheckBox(); + tableCheckBox.setSelected(true); + tableCheckBox.addActionListener(filter); + first.add(tableCheckBox); + + JPanel second = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + viewCheckBox = new UICheckBox(); + viewCheckBox.setSelected(true); + viewCheckBox.addActionListener(filter); + second.add(viewCheckBox); + + // 根据环境是否为中文设置不同的显示 + if (GeneralContext.isChineseEnv()) { + first.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_SQL_Table"), + BaseUtils.readIcon("/com/fr/design/images/data/tables.png"), UILabel.LEADING)); + second.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_SQL_View"), + BaseUtils.readIcon("/com/fr/design/images/data/views.png"), UILabel.LEADING)); + } else { + UILabel ui1 = new UILabel(BaseUtils.readIcon("/com/fr/design/images/data/tables.png"), UILabel.LEADING); + UILabel ui2 = new UILabel(BaseUtils.readIcon("/com/fr/design/images/data/views.png"), UILabel.LEADING); + ui1.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_SQL_Table")); + ui2.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_SQL_View")); + first.add(ui1); + second.add(ui2); + } + checkBoxgroupPane.add(first); + checkBoxgroupPane.add(second); + + return checkBoxgroupPane; + } + + /** + * 给 itemComboBox 加上 itemListener + * + * @param itemListener + */ + public void addItemListener(ItemListener itemListener) { + connectionComboBox.itemComboBox.addItemListener(itemListener); + } + + private DocumentListener searchListener = new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + search(false); + } + + @Override + public void insertUpdate(DocumentEvent e) { + search(false); + } + + @Override + public void changedUpdate(DocumentEvent e) { + search(false); + } + }; + + private ActionListener filter = new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + search(false); + } + }; + + /** + * 选项改变,需要重新刷新下拉列表里面的项 + */ + protected void search(boolean refresh) { + String selectedObj = connectionComboBox.getSelectedItem(); + + String[] types = ArrayUtils.EMPTY_STRING_ARRAY; + if (tableCheckBox != null) { + if (tableCheckBox.isSelected()) { + types = (String[]) ArrayUtils.add(types, TableProcedure.TABLE); + } + if (viewCheckBox.isSelected()) { + types = (String[]) ArrayUtils.add(types, TableProcedure.VIEW); + } + } else { + types = (String[]) ArrayUtils.add(types, TableProcedure.PROCEDURE); + } + tableViewList.populate(selectedObj, searchField.getText().trim(), refresh, types); + } + + @Override + protected String title4PopupWindow() { + return "Connection"; + } + + /** + * @param l + */ + public void addDoubleClickListener(DoubleClickSelectedNodeOnTreeListener l) { + this.listeners.add(l); + } + + public void setSelectedDatabaseConnection(com.fr.data.impl.Connection db) { + connectionComboBox.populate(db); + } + + public String getSelectedDatabaseConnnectonName() { + return connectionComboBox.getSelectedItem(); + } + + public static interface DoubleClickSelectedNodeOnTreeListener { + /** + * 处理双击事件 + * + * @param target + */ + public void actionPerformed(TableProcedure target); + } } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ItemEditableComboBoxPanel.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ItemEditableComboBoxPanel.java index 8b13789179..a430a13bd1 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ItemEditableComboBoxPanel.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ItemEditableComboBoxPanel.java @@ -1 +1,183 @@ +package com.fr.design.data.datapane.connect; +import com.fr.base.BaseUtils; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; + +import com.fr.log.FineLoggerFactory; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.util.Iterator; +import java.util.concurrent.CancellationException; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JPanel; +import javax.swing.SwingWorker; + +public abstract class ItemEditableComboBoxPanel extends JPanel { + /** + * + */ + private static final long serialVersionUID = 1L; + + private static final String PENDING = Toolkit.i18nText("Fine-Design_Basic_Loading") + "..."; + + protected static final Object EMPTY = new Object() { + public String toString() { + return ""; + } + }; + + protected UIComboBox itemComboBox; + protected UIButton editButton; + protected UIButton refreshButton; + + private SwingWorker, Void> refreshWorker; + + public ItemEditableComboBoxPanel() { + super(); + + initComponents(); + } + + protected void initComponents() { + this.setLayout(FRGUIPaneFactory.createM_BorderLayout()); + Dimension buttonSize = new Dimension(26, 20); + itemComboBox = new UIComboBox(); + itemComboBox.setEnabled(true); + this.add(itemComboBox, BorderLayout.CENTER); + refreshButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); + JPanel jPanel = FRGUIPaneFactory.createNColumnGridInnerContainer_Pane(2, 4 ,4); + editButton = initEditButton(editButton, buttonSize); + jPanel.add(editButton); + jPanel.add(refreshButton); + this.add(jPanel, BorderLayout.EAST); + refreshButton.setPreferredSize(buttonSize); + refreshButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + refreshItems(); + } + }); + } + + protected UIButton initEditButton(UIButton editButton, Dimension buttonSize) { + editButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/control-center2.png")); + editButton.setPreferredSize(buttonSize); + editButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + editItems(); + } + }); + return editButton; + } + + + /** + * 给itemComboBox添加ActionListener + */ + public void addComboBoxActionListener(ActionListener l) { + itemComboBox.addActionListener(l); + } + + /* + * 刷新itemComboBox的内容 + */ + protected void refreshItems() { + + if (refreshWorker != null && !refreshWorker.isDone()) { + refreshWorker.cancel(true); + } + + // 记录原来选中的Item,重新加载后需要再次选中 + Object lastSelectedItem = itemComboBox.getSelectedItem(); + + DefaultComboBoxModel model = ((DefaultComboBoxModel) itemComboBox.getModel()); + model.removeAllElements(); + + // 先加EMPTY,再加items + model.addElement(EMPTY); + model.addElement(PENDING); + + // 存在两种场景之前只考虑了填充场景 有populate会填充下 把这边的填充逻辑删了 所以没有问题 + // 如果是纯通过刷新按钮 没有populate 需要手动设置下上次选中的内容 + if (lastSelectedItem != null) { + model.setSelectedItem(lastSelectedItem); + } + + refreshWorker = new SwingWorker, Void>() { + @Override + protected Iterator doInBackground() throws Exception { + return items(); + } + + @Override + protected void done() { + try { + Iterator itemIt = get(); + model.removeElement(PENDING); + while(itemIt.hasNext()) { + model.addElement(itemIt.next()); + } + // 如果加载成功 但是下拉框是可见的 下拉框高度是会固定为原始高度 不会因为填充了更多下拉项而变化 + // 需要重新设置下拉框高度 但值一样时相关事件不会生效 所以先加再减下 + if (itemComboBox.isPopupVisible()) { + itemComboBox.setMaximumRowCount(itemComboBox.getMaximumRowCount() + 1); + itemComboBox.setMaximumRowCount(itemComboBox.getMaximumRowCount() - 1); + } + afterRefreshItems(); + } catch (Exception e) { + if (!(e instanceof CancellationException)) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + refreshItemsError(); + } + + } + }; + refreshWorker.execute(); + } + + /* + * 得到其中的itemComboBox所选中的Item + */ + public String getSelectedItem() { + Object selected = itemComboBox.getSelectedItem(); + + return selected instanceof String ? (String)selected : null; + } + + /* + * 选中name项 + */ + public void setSelectedItem(String name) { + DefaultComboBoxModel model = ((DefaultComboBoxModel) itemComboBox.getModel()); + model.setSelectedItem(name); + } + + /* + * 刷新ComboBox.items + */ + protected abstract java.util.Iterator items(); + + /** + * 刷新ComboBox.items之后 + */ + protected void afterRefreshItems() { + // 空实现,供子类重写 + } + + /** + * 刷新ComboBox.items时出现异常 + */ + protected void refreshItemsError() { + // 空实现,供子类重写 + } + + /* + * 弹出对话框编辑Items + */ + protected abstract void editItems(); +} diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java index db0f03e72b..d0ffd7f22c 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java @@ -1,24 +1,35 @@ package com.fr.design.data.tabledata.tabledatapane; -import com.fine.state.livedata.DocumentLiveData; +import com.fr.base.Parameter; +import com.fr.base.ParameterHelper; +import com.fr.data.core.db.TableProcedure; import com.fr.data.impl.Connection; import com.fr.data.impl.DBTableData; import com.fr.data.impl.JDBCDatabaseConnection; import com.fr.data.impl.JNDIDatabaseConnection; +import com.fr.data.impl.NameDatabaseConnection; import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.UpdateAction; import com.fr.design.border.UIRoundedBorder; import com.fr.design.constants.UIConstants; +import com.fr.design.data.StrategyConfigAttrUtils; +import com.fr.design.data.datapane.ESDStrategyConfigPane; import com.fr.design.data.datapane.connect.ConnectionTableProcedurePane; import com.fr.design.data.datapane.preview.PreviewTablePane; import com.fr.design.data.datapane.preview.sql.PreviewPerformedSqlPane; import com.fr.design.data.datapane.sqlpane.SQLEditPane; +import com.fr.design.data.tabledata.strategy.StrategyConfigHandler; +import com.fr.design.data.tabledata.tabledatapane.db.StrategyConfigFrom; import com.fr.design.data.tabledata.tabledatapane.loading.SwitchableTableDataPane; import com.fr.design.data.tabledata.tabledatapane.loading.TipsPane; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.fun.DBTableDataMenuHandler; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itableeditorpane.ParameterTableModel; import com.fr.design.gui.itableeditorpane.UITableEditAction; @@ -31,15 +42,25 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; import com.fr.design.menu.SeparatorDef; import com.fr.design.menu.ToolBarDef; +import com.fr.design.utils.ParameterUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.esd.core.strategy.config.StrategyConfig; +import com.fr.esd.core.strategy.config.StrategyConfigHelper; +import com.fr.esd.core.strategy.config.service.StrategyConfigService; +import com.fr.esd.data.db.DBTableDataSavedHook; +import com.fr.esd.event.DSMapping; +import com.fr.esd.event.DsNameTarget; +import com.fr.esd.event.StrategyEventsNotifier; +import com.fr.esd.query.StrategicTableData; import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; +import com.fr.general.sql.SqlUtils; import com.fr.log.FineLoggerFactory; import com.fr.script.Calculator; import com.fr.stable.ArrayUtils; import com.fr.stable.ParameterProvider; import com.fr.stable.StringUtils; +import com.fr.workspace.WorkContext; import javax.swing.BorderFactory; import javax.swing.Box; @@ -48,16 +69,20 @@ import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JToolBar; +import javax.swing.SwingUtilities; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import java.awt.BorderLayout; import java.awt.CardLayout; +import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; +import java.util.ArrayList; import java.util.List; /** @@ -74,22 +99,27 @@ public class DBTableDataPane extends AbstractTableDataPane implemen private UITableEditorPane editorPane; private DBTableDataMenuHandler dbTableDataMenuHandler; private SQLEditPane sqlTextPane; + private String pageQuery; + private DBTableData dbTableData; + //ESD + private UILabel esdSettingsLabel; + private UIComboBox esdConfigOption; + private UICheckBox esdEnabled; + private UIButton esdSettingsBtn; + private UILabel barErrorTips; + //配置 + private StrategyConfig strategyConfig; + + private StrategyConfigHandler configHandler; private CardLayout card; - /** - * 数据库查询面板真正的内容面板 - */ + /** 数据库查询面板真正的内容面板 */ private JPanel contentPane; - /** - * 加载中面板 - */ + /** 加载中面板 */ private JPanel loadingPane; - private DBTableDataViewModel viewModel; - public DBTableDataPane() { - viewModel = new DBTableDataViewModel(); initCards(); initContentPane(); } @@ -114,7 +144,7 @@ public class DBTableDataPane extends AbstractTableDataPane implemen add(LOADING_PANE_NAME, loadingPane); add(CONTENT_PANE_NAME, contentPane); - switchTo(CONTENT_PANE_NAME); + switchTo(LOADING_PANE_NAME); } private void init() { @@ -132,13 +162,7 @@ public class DBTableDataPane extends AbstractTableDataPane implemen editorPane = new UITableEditorPane<>(model); - this.connectionTableProcedurePane = new ConnectionTableProcedurePane( - new ConnectionTableProcedurePane.ConnectionTableState( - viewModel.getConnectionList(), - unused -> viewModel.fetchConnectionNameAction(), - viewModel.getTableProcedures(), - bean -> viewModel.fetchTableProceduresAction(bean) - )) { + this.connectionTableProcedurePane = new ConnectionTableProcedurePane(this) { @Override protected void filter(Connection connection, String conName, List nameList) { connection.addConnection(nameList, conName, new Class[]{ @@ -171,31 +195,35 @@ public class DBTableDataPane extends AbstractTableDataPane implemen }); } }; - this.connectionTableProcedurePane.addDoubleClickListener(target -> { - Document document = DBTableDataPane.this.sqlTextPane.getDocument(); - try { - document.insertString(DBTableDataPane.this.sqlTextPane.getCaretPosition(), target.toString(), null); - } catch (BadLocationException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + this.connectionTableProcedurePane.addDoubleClickListener(new ConnectionTableProcedurePane.DoubleClickSelectedNodeOnTreeListener() { + @Override + public void actionPerformed(TableProcedure target) { + Document document = DBTableDataPane.this.sqlTextPane.getDocument(); + try { + document.insertString(DBTableDataPane.this.sqlTextPane.getCaretPosition(), target.toString(), null); + } catch (BadLocationException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + + + DBTableDataPane.this.sqlTextPane.requestFocus(); } - DBTableDataPane.this.sqlTextPane.requestFocus(); }); this.sqlTextPane.addFocusListener(new FocusListener() { @Override public void focusGained(FocusEvent e) { + barErrorTips.setVisible(false); } @Override public void focusLost(FocusEvent e) { if (DBTableDataPane.this.isPreviewOrRefreshButton(e)) { - viewModel.refreshParameters(); + DBTableDataPane.this.checkParameter(); } } }); - DocumentLiveData.fromDocumentEventsOf(sqlTextPane.getDocument()) - .observeForever(documentEvent -> viewModel.updateQuery(sqlTextPane.getText())); } private void initMainSplitPane() { @@ -265,6 +293,16 @@ public class DBTableDataPane extends AbstractTableDataPane implemen return Toolkit.i18nText("Fine-Design_Basic_DS-Database_Query"); } + private void refreshParameters() { + String[] paramTexts = new String[2]; + paramTexts[0] = SqlUtils.tryPureSqlText(this.sqlTextPane.getText()); + paramTexts[1] = SqlUtils.tryPureSqlText(this.pageQuery); + List existParameterList = this.editorPane.update(); + Parameter[] ps = (existParameterList == null) ? new Parameter[0] : existParameterList.toArray(new Parameter[0]); + + this.editorPane.populate(ParameterUtils.analyzeAndUnionParameters(paramTexts, ps)); + } + private JToolBar createToolBar() { ToolBarDef toolBarDef = new ToolBarDef(); toolBarDef.addShortCut(new PreviewAction()); @@ -281,105 +319,248 @@ public class DBTableDataPane extends AbstractTableDataPane implemen toolBarDef.updateToolBar(editToolBar); //esd相关组件初始化 -// createToolbarEsdComponents(editToolBar); + createToolbarEsdComponents(editToolBar); return editToolBar; } + private void createToolbarEsdComponents(final UIToolbar editToolBar) { + this.esdSettingsLabel = new UILabel(Toolkit.i18nText("Fine-Design_ESD_Cache_Settings")); + this.esdConfigOption = new UIComboBox(StrategyConfigFrom.values()); + this.esdEnabled = new UICheckBox(Toolkit.i18nText("Fine-Design_ESD_Enable_Cache")); + this.barErrorTips = new UILabel(); + this.barErrorTips.setForeground(Color.RED); + this.barErrorTips.setVisible(false); + + esdSettingsBtn = new UIButton(Toolkit.i18nText("Fine-Design_ESD_Strategy_Config")); + esdSettingsBtn.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + final boolean global = globalOptionSelected(); + + final ESDStrategyConfigPane strategyConfigPane = new ESDStrategyConfigPane(global); + + StrategyConfig populateStrategyConfig; + if (global) { + populateStrategyConfig = StrategyConfigService.getGlobalConfig(); + } else { + populateStrategyConfig = strategyConfig; + } + + //显示对应的配置 + strategyConfigPane.populateBean(populateStrategyConfig); + + BasicDialog dlg = strategyConfigPane.showMediumWindow(SwingUtilities.getWindowAncestor(DBTableDataPane.this), new DialogActionAdapter() { + @Override + public void doOk() { + super.doOk(); + if (!global) { + //点击策略配置面板的确定,重新设置策略配置 + strategyConfig = strategyConfigPane.updateBean(); + // TODO: 2021/3/12 这个直接使用不太好 + } + } + }); + //dlg.setAlwaysOnTop(true); + dlg.setVisible(true); + } + }); + + this.esdConfigOption.setSelectedIndex(StrategyConfigFrom.GLOBAL.getIndex()); + this.esdConfigOption.addActionListener(e -> setEsdEnabled()); + + + //工具栏加上esd相关组件 + editToolBar.add(this.esdSettingsLabel); + editToolBar.add(this.esdConfigOption); + editToolBar.add(this.esdEnabled); + editToolBar.add(this.esdSettingsBtn); + editToolBar.add(this.barErrorTips); + } + + private boolean globalOptionSelected() { + return esdConfigOption.getSelectedIndex() == StrategyConfigFrom.GLOBAL.getIndex(); + } + + private void setEsdEnableStatus(boolean selected, boolean enabled) { + this.esdEnabled.setSelected(selected); + this.esdEnabled.setEnabled(enabled); + } + + private void setEsdEnabled() { + boolean useIndividualConfig = !this.globalOptionSelected(); + if (useIndividualConfig) { + if (this.strategyConfig == null) { + //新建的数据集,选择单独时,可用但是不勾选 + setEsdEnableStatus(false, true); + } else { + setEsdEnableStatus(!this.strategyConfig.isUseGlobal() && this.strategyConfig.enabled(), true); + } + } else { + //判断是不是模版数据集 + switch (this.dbTableData.getScope()) { + case TEMPLATE: + String tplPath = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getPath(); + setEsdEnableStatus(StrategyConfigService.isTemplateEnabled(tplPath), false); + break; + case SERVER: + //不会走到这里 + default: + break; + } + } + } public StrategyConfig updateStrategyConfig() { - return null; + return this.strategyConfig; } - @Override - public void populateBean(DBTableData tableData) { - this.viewModel.updateTableData(tableData); - this.viewModel.getDbTableData().observeForever(dbTableData -> { - if (this.dbTableDataMenuHandler != null) { - this.dbTableDataMenuHandler.populate(dbTableData); + private void checkParameter() { + String[] paramTexts = new String[2]; + paramTexts[0] = this.sqlTextPane.getText(); + paramTexts[1] = this.pageQuery; + Parameter[] parameters = ParameterHelper.analyze4Parameters(paramTexts, false); + + if (parameters.length < 1 && this.editorPane.update().size() < 1) { + return; + } + boolean isIn = true; + List list = this.editorPane.update(); + List name = new ArrayList<>(); + for (ParameterProvider parameter : list) { + name.add(parameter.getName()); + } + for (Parameter parameter : parameters) { + if (!name.contains(parameter.getName())) { + isIn = false; + break; } - editorPane.populate(dbTableData.getParameters(Calculator.createCalculator())); - connectionTableProcedurePane.setSelectedDatabaseConnection(dbTableData.getDatabase()); - connectionTableProcedurePane.addItemListener(event -> { - String dbName = connectionTableProcedurePane.getSelectedDatabaseConnnectonName(); -// if (StringUtils.isBlank(dbName) || StringUtils.isBlank(sqlTextPane.getText())) { -// try { -// throw new Exception(Toolkit.i18nText("Fine-Design_Basic_Connect_SQL_Cannot_Null") + "."); -// } catch (Exception e) { -// FineLoggerFactory.getLogger().error(e.getMessage(), e); -// } -// } - viewModel.updateDBName(dbName); - }); + } + if (list.size() == parameters.length && isIn) { + return; + } - }); + refreshParameters(); + } - this.sqlTextPane.setText(tableData.getQuery()); - this.sqlTextPane.moveCaretPosition(this.sqlTextPane.getCaretPosition()); + @Override + public void populateBean(DBTableData dbTableData) { + this.dbTableData = dbTableData; + if (this.dbTableDataMenuHandler != null) { + this.dbTableDataMenuHandler.populate(dbTableData); + } + + + Calculator c = Calculator.createCalculator(); + + ParameterProvider[] parameters = dbTableData.getParameters(c); + this.editorPane.populate(parameters); + + + Connection db = dbTableData.getDatabase(); + String query = dbTableData.getQuery(); + this.pageQuery = dbTableData.getPageQuerySql(); + this.connectionTableProcedurePane.setSelectedDatabaseConnection(db); + this.sqlTextPane.setText(query); this.sqlTextPane.requestFocus(); + this.sqlTextPane.moveCaretPosition(this.sqlTextPane.getCaretPosition()); + switch (dbTableData.getScope()) { + + case TEMPLATE: + this.configHandler = new TemplateStrategyConfigHandler(dbTableData); + break; + case SERVER: + //服务器数据集 + default: + //新建服务器数据集 + this.configHandler = new ServerStrategyConfigHandler(dbTableData); + break; + } //设置esd相关组件显示状态 -// populateESDComponents(); + populateESDComponents(); } -// private void populateESDComponents() { -// //查找映射的配置 -// this.strategyConfig = configHandler.find(); -// -// boolean shouldEnable = false; -// StrategyConfigFrom from = StrategyConfigFrom.GLOBAL; -// -// if (this.strategyConfig != null) { -// if (this.strategyConfig.enabled()) { -// shouldEnable = true; -// } -// if (!this.strategyConfig.isUseGlobal()) { -// from = StrategyConfigFrom.INDIVIDUAL; -// } -// } -// -// //服务器数据集不允许设置来源,只能单独配置 -// if (dbTableData.getScope() != StrategicTableData.Scope.TEMPLATE) { -// from = StrategyConfigFrom.INDIVIDUAL; -// this.esdConfigOption.setEnabled(false); -// } -// this.esdEnabled.setSelected(shouldEnable); -// this.esdConfigOption.setSelectedIndex(from.getIndex()); -// } + private void populateESDComponents() { + //查找映射的配置 + this.strategyConfig = configHandler.find(); + + boolean shouldEnable = false; + StrategyConfigFrom from = StrategyConfigFrom.GLOBAL; + + if (this.strategyConfig != null) { + if (this.strategyConfig.enabled()) { + shouldEnable = true; + } + if (!this.strategyConfig.isUseGlobal()) { + from = StrategyConfigFrom.INDIVIDUAL; + } + } + + //服务器数据集不允许设置来源,只能单独配置 + if (dbTableData.getScope() != StrategicTableData.Scope.TEMPLATE) { + from = StrategyConfigFrom.INDIVIDUAL; + this.esdConfigOption.setEnabled(false); + } + this.esdEnabled.setSelected(shouldEnable); + this.esdConfigOption.setSelectedIndex(from.getIndex()); + } @Override public DBTableData updateBean() { updateDBTableData(); -// internalUpdateStrategyConfig(); + internalUpdateStrategyConfig(); - return viewModel.getDbTableData().getValue(); + return this.dbTableData; } -// private void internalUpdateStrategyConfig() { -// //这边只修改enable和useGlobal -// boolean global = globalOptionSelected(); -// boolean enable = this.esdEnabled.isSelected(); -// -// -// //未开启缓存的,如果选择了单独配置,需要创建配置 -// if (this.strategyConfig == null && !global) { -// this.strategyConfig = StrategyConfig.createDefault(); -// } -// -// //设置配置来源和开启状态 -// if (this.strategyConfig != null) { -// this.strategyConfig.setEnable(enable); -// this.strategyConfig.setUseGlobal(global); -// } -// -// //保存 -// this.configHandler.save(this.dbTableData, this.strategyConfig); -// } + private void internalUpdateStrategyConfig() { + //这边只修改enable和useGlobal + boolean global = globalOptionSelected(); + boolean enable = this.esdEnabled.isSelected(); + + + //未开启缓存的,如果选择了单独配置,需要创建配置 + if (this.strategyConfig == null && !global) { + this.strategyConfig = StrategyConfig.createDefault(); + } + + //设置配置来源和开启状态 + if (this.strategyConfig != null) { + this.strategyConfig.setEnable(enable); + this.strategyConfig.setUseGlobal(global); + } + + //保存 + this.configHandler.save(this.dbTableData, this.strategyConfig); + } private void updateDBTableData() { + String dbName = this.connectionTableProcedurePane.getSelectedDatabaseConnnectonName(); + if (StringUtils.isBlank(dbName) || StringUtils.isBlank(this.sqlTextPane.getText())) { + try { + throw new Exception(Toolkit.i18nText("Fine-Design_Basic_Connect_SQL_Cannot_Null") + "."); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + + + // 保存前 刷新下参数列表 保证获取到最新的参数 + refreshParameters(); + + List parameterList = this.editorPane.update(); + ParameterProvider[] parameters = parameterList.toArray(new ParameterProvider[0]); + + dbTableData.setDatabase(new NameDatabaseConnection(dbName)); + - viewModel.refreshParameters(); + dbTableData.setParameters(parameters); + dbTableData.setQuery(this.sqlTextPane.getText().trim()); + + dbTableData.setPageQuerySql(this.pageQuery); if (this.dbTableDataMenuHandler != null) { this.dbTableDataMenuHandler.update(); } @@ -394,7 +575,7 @@ public class DBTableDataPane extends AbstractTableDataPane implemen @Override public void actionPerformed(ActionEvent e) { - viewModel.refreshParameters(); + DBTableDataPane.this.refreshParameters(); } @@ -413,6 +594,7 @@ public class DBTableDataPane extends AbstractTableDataPane implemen @Override public void actionPerformed(ActionEvent evt) { + DBTableDataPane.this.checkParameter(); PreviewTablePane.previewTableData(DBTableDataPane.this.updateBean()); } } @@ -426,7 +608,7 @@ public class DBTableDataPane extends AbstractTableDataPane implemen @Override public void actionPerformed(ActionEvent e) { - viewModel.refreshParameters(); + checkParameter(); PreviewPerformedSqlPane.previewPerformedSql(DBTableDataPane.this.updateBean()); } } @@ -441,13 +623,13 @@ public class DBTableDataPane extends AbstractTableDataPane implemen @Override public void actionPerformed(ActionEvent e) { final QueryPane pane = new QueryPane(Toolkit.i18nText("Fine-Design_Basic_Layer_Page_Report_Define_Page_Query_SQL")); - pane.populate(viewModel.getDbTableData().getValue().getPageQuerySql()); + pane.populate(pageQuery); BasicDialog dialog = pane.showWindow(DesignerContext.getDesignerFrame()); dialog.addDialogActionListener(new DialogActionAdapter() { @Override public void doOk() { - viewModel.updatePageQuery(pane.update()); - viewModel.refreshParameters(); + pageQuery = pane.update(); + checkParameter(); } }); dialog.setVisible(true); @@ -491,4 +673,117 @@ public class DBTableDataPane extends AbstractTableDataPane implemen } } + /** + * 服务器数据集配置处理器 + */ + private static class ServerStrategyConfigHandler extends StrategyConfigHandler { + private final String origName; + + private final String origConnection; + + private final String origQuery; + + public ServerStrategyConfigHandler(DBTableData tableData) { + super(tableData); + this.origName = tableData.getDsName(); + this.origConnection = tableData.getDatabase().toString(); + this.origQuery = tableData.getQuery(); + } + + @Override + public StrategyConfig find() { + StrategyConfig strategyConfig = null; + if (getTableData() != null) { + strategyConfig = getTableData().getStrategyConfig(); + if (strategyConfig == null) { + //共享数据集 + if (getTableData().isShare()) { + strategyConfig = StrategyConfigHelper.createStrategyConfig(true, false, true); + } + } + } + + return strategyConfig; + } + + @Override + public void save(DBTableData saved, StrategyConfig strategyConfig) { + String conn = saved.getDatabase().toString(); + String query = saved.getQuery(); + + + //检查数据链接和sql是否修改,如果修改需要触发缓存监听事件 + if (!conn.equals(origConnection) || !query.equals(origQuery)) { + if (StringUtils.isNotEmpty(origName)) { + //新建数据集的origName为null,不用触发 + StrategyEventsNotifier.modifyDataSet(DSMapping.ofServerDS(new DsNameTarget(origName))); + } + } + + + //配置变动事件 + try { + final StrategyConfig orig = getTableData().getStrategyConfig(); + saved.setStrategyConfig(strategyConfig.clone()); + StrategyEventsNotifier.compareAndFireConfigEvents(orig, strategyConfig, DSMapping.ofServerDS(new DsNameTarget(saved.getDsName()))); + } catch (CloneNotSupportedException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + } + + + /** + * 模版数据集配置处理器 + */ + private static class TemplateStrategyConfigHandler extends StrategyConfigHandler { + public TemplateStrategyConfigHandler(DBTableData tableData) { + super(tableData); + } + + @Override + public StrategyConfig find() { + StrategyConfig strategyConfig = null; + String tplPath = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getPath(); + if (getTableData() != null && StringUtils.isNotEmpty(tplPath)) { + //设置保存数据集的事件检查钩子 + //新建模版此时不存在,不需要注册钩子 + if (getTableData().getXmlSavedHook() == null && WorkContext.getWorkResource().exist(tplPath)) { + getTableData().setXmlSavedHook(new DBTableDataSavedHook(tplPath, getTableData())); + } + + //获取当前的缓存配置,没有就创建一份 + String dsName = getTableData().getDsName(); + + //这里为了之前兼容插件创建的配置,缓存配置不在DBTableData,而是从模版attr读取 + strategyConfig = StrategyConfigAttrUtils.getStrategyConfig(dsName); + + + if (useGlobal(getTableData(), strategyConfig)) { + //使用全局配置 + strategyConfig = StrategyConfigHelper.createStrategyConfig(true); + } else if (strategyConfig == null && getTableData().isShare()) { + //没有配置时,使用共享数据集兼容配置 + strategyConfig = StrategyConfigHelper.createStrategyConfig(true, false, true); + } + } + + return strategyConfig; + } + + private boolean useGlobal(DBTableData dbTableData, StrategyConfig strategyConfig) { + //非共享且配置为空或者指定使用全局配置时,检查是否全局开启 + if (strategyConfig == null) { + return !dbTableData.isShare(); + } else { + return strategyConfig.isUseGlobal(); + } + } + + @Override + public void save(DBTableData saved, StrategyConfig config) { + + //DBTableDataSavedHook处理了 + } + } } diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataViewModel.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataViewModel.java deleted file mode 100644 index 6260e4960b..0000000000 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataViewModel.java +++ /dev/null @@ -1,281 +0,0 @@ -package com.fr.design.data.tabledata.tabledatapane; - -import com.fine.state.livedata.LiveData; -import com.fine.state.livedata.MutableLiveData; -import com.fr.base.Parameter; -import com.fr.base.ParameterHelper; -import com.fr.base.TableData; -import com.fr.data.core.DataCoreUtils; -import com.fr.data.core.db.TableProcedure; -import com.fr.data.core.db.dialect.base.key.check.DataBaseDetail; -import com.fr.data.core.db.dialect.base.key.check.DataBaseType; -import com.fr.data.impl.AbstractDatabaseConnection; -import com.fr.data.impl.Connection; -import com.fr.data.impl.DBTableData; -import com.fr.data.impl.NameDatabaseConnection; -import com.fr.data.operator.DataOperator; -import com.fr.design.DesignerEnvManager; -import com.fr.design.gui.ilist.TableViewList; -import com.fr.design.utils.ParameterUtils; -import com.fr.file.ConnectionConfig; -import com.fr.general.ComparatorUtils; -import com.fr.general.sql.SqlUtils; -import com.fr.stable.ArrayUtils; -import com.fr.stable.ParameterProvider; -import com.fr.stable.StringUtils; -import com.fr.workspace.WorkContext; -import com.fr.workspace.server.connection.DBConnectAuth; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.Set; - -import static com.fr.data.core.db.TableProcedure.ERROR_TABLE_PROCEDURE; - -/** - * 数据集界面视图模型 - * - * @author vito - * @since 11.0 - * Created on 2023/11/7 - */ -public class DBTableDataViewModel { - - private MutableLiveData dbTableData = new MutableLiveData<>(); - private MutableLiveData> connectionList = new MutableLiveData<>(Collections.emptyList()); - private MutableLiveData> tableProcedures = new MutableLiveData<>(Collections.emptyList()); - - public DBTableDataViewModel() { - } - - public LiveData getDbTableData() { - return dbTableData; - } - - public LiveData> getConnectionList() { - return connectionList; - } - - public LiveData> getTableProcedures() { - return tableProcedures; - } - - /* ---------action--------- */ - public void updateTableData(TableData tableData) { - if (!(tableData instanceof DBTableData)) { - return; - } - dbTableData.postValue((DBTableData) tableData); - } - - - public void fetchConnectionNameAction() { - new Thread(() -> { - - ConnectionConfig mgr = ConnectionConfig.getInstance(); - Set connectionName = mgr.getConnections().keySet(); - - Collection noAuthConnections = WorkContext.getCurrent().get(DBConnectAuth.class).getNoAuthConnections(); - - ArrayList nameList = new ArrayList<>(); - - if (noAuthConnections == null) { - connectionList.postValue(Collections.emptyList()); - return; - } - for (String conName : connectionName) { - if (noAuthConnections.contains(conName)) { - continue; - } - Connection connection = mgr.getConnection(conName); - connection.addConnection(nameList, conName, new Class[]{AbstractDatabaseConnection.class}); - } - connectionList.postValue(nameList); - }).start(); - } - - public void fetchTableProceduresAction(TableViewList.TableProcedureBean tableProcedureBean) { - new Thread(() -> { - List list; - try { - list = fetchTableProcedures(tableProcedureBean); - } catch (Exception e) { - list = new ArrayList<>(); - list.add(ERROR_TABLE_PROCEDURE); - } - tableProcedures.postValue(list); - }).start(); - } - - /** - * august:databaseName是数据库名字,searchFilter是输入的过滤条件,typesFilter是视图、表、 - * 存储过程中的一者或者几者 - * - * @param bean 数据 - */ - private List fetchTableProcedures(TableViewList.TableProcedureBean bean) throws Exception { - if (bean.refresh) { - clearCache(ConnectionConfig.getInstance().getConnection(bean.databaseName)); - } - Connection datasource = ConnectionConfig.getInstance().getConnection(bean.databaseName); - if (datasource == null) { - return Collections.emptyList(); - } - String[] schemas = DataCoreUtils.getDatabaseSchema(datasource); - - String searchFilter = bean.searchFilter.toLowerCase(); - boolean isOracleSystemSpace = DesignerEnvManager.getEnvManager().isOracleSystemSpace(); - // oracle不勾选显示所有表,则只显示用户下的(包括存储过程和table表) - DataBaseDetail detail = DataOperator.getInstance().getDataBaseDetail(datasource, isOracleSystemSpace); - if (ArrayUtils.isNotEmpty(detail.getSchemas())) { - schemas = detail.getSchemas(); - } - if (bean.typesFilter.length == 1 && ComparatorUtils.equals(bean.typesFilter[0], TableProcedure.PROCEDURE)) { - return processStoreProcedure(schemas, datasource, DataBaseType.ORACLE.equals(detail.getType()), searchFilter); - } else { - return processTableAndView(schemas, datasource, searchFilter, DataBaseType.ORACLE.equals(detail.getType()), bean.typesFilter); - } - } - - private void clearCache(Connection datasource) { - String[] schemas = DataCoreUtils.getDatabaseSchema(datasource); - schemas = (schemas == null || schemas.length == 0) ? new String[]{null} : schemas; - for (String schema : schemas) { - doClearCache(datasource, schema); - } - doClearCache(datasource, null); - } - - private void doClearCache(Connection datasource, String schema) { - DataCoreUtils.refreshTables(datasource, TableProcedure.TABLE, schema); - DataCoreUtils.refreshTables(datasource, TableProcedure.VIEW, schema); - DataCoreUtils.refreshTables(datasource, TableProcedure.PROCEDURE, schema); - } - - private List processStoreProcedure(String[] schemas, Connection datasource, boolean isOracle, String searchFilter) throws Exception { - List tableProcedures = new ArrayList<>(); - boolean isBlank = StringUtils.isBlank(searchFilter); - boolean isOracleSysSpace = DesignerEnvManager.getEnvManager().isOracleSystemSpace(); - List sqlTablees = DataCoreUtils.getProcedures(datasource, schemas, isOracle, isOracleSysSpace); - for (TableProcedure[] sqlTables : sqlTablees) { - if (sqlTables == null) { - continue; - } - for (TableProcedure sqlTable : sqlTables) { - String name = sqlTable.toString().toLowerCase(); - if (isBlank || name.contains(searchFilter)) { - tableProcedures.add(sqlTable); - } - } - } - return tableProcedures; - } - - private List processTableAndView(String[] schemas, Connection datasource, String searchFilter, boolean isOracle, String... typesFilter) - throws Exception { - List tableProcedures = new ArrayList<>(); - boolean isBlank = StringUtils.isBlank(searchFilter); - boolean isOracleSystemSpace = DesignerEnvManager.getEnvManager().isOracleSystemSpace(); - if (!isOracle) { - String schema = null; - for (String type : typesFilter) { - //非oracle数据库,默认都是显示所有表的,参数为true - TableProcedure[] sqlTables = DataCoreUtils.getTables(datasource, type, schema, true); - if (Objects.isNull(sqlTables)) { - return tableProcedures; - } - for (TableProcedure sqlTable : sqlTables) { - if (isBlank || sqlTable.getName().toLowerCase().contains(searchFilter)) { - tableProcedures.add(sqlTable); - } - } - } - } else { - for (String type : typesFilter) { - for (String schema : schemas) { - TableProcedure[] sqlTables = DataCoreUtils.getTables(datasource, type, schema, isOracleSystemSpace); - if (Objects.isNull(sqlTables)) { - return tableProcedures; - } - // oracle的表名加上模式 - for (TableProcedure ta : sqlTables) { - String name = ta.getSchema() + '.' + ta.getName(); - if (isBlank || name.toLowerCase().contains(searchFilter)) { - tableProcedures.add(ta); - } - } - } - } - } - return tableProcedures; - } - - public void updatePageQuery(String pageQuery) { - DBTableData tableData = dbTableData.getValue(); - if (ComparatorUtils.equals(pageQuery, tableData.getPageQuerySql())) { - return; - } - tableData.setPageQuerySql(pageQuery); - dbTableData.postValue(tableData); - } - - public void updateQuery(String query) { - DBTableData tableData = dbTableData.getValue(); - if (ComparatorUtils.equals(query, tableData.getQuery())) { - return; - } - tableData.setQuery(query); - dbTableData.postValue(tableData); - } - - public void refreshParameters() { - DBTableData tableData = dbTableData.getValue(); - if (needRefreshParameter(tableData)) { - tableData.setParameters(calParameter(tableData)); - } - dbTableData.postValue(tableData); - } - - private boolean needRefreshParameter(DBTableData tableData) { - String[] paramTexts = new String[2]; - paramTexts[0] = tableData.getQuery(); - paramTexts[1] = tableData.getPageQuerySql(); - Parameter[] parameters = ParameterHelper.analyze4Parameters(paramTexts, false); - - if (parameters.length < 1 && tableData.getParameters().length < 1) { - return false; - } - boolean isIn = true; - ParameterProvider[] list = tableData.getParameters(); - List name = new ArrayList<>(); - for (ParameterProvider parameter : list) { - name.add(parameter.getName()); - } - for (Parameter parameter : parameters) { - if (!name.contains(parameter.getName())) { - isIn = false; - break; - } - } - return list.length != parameters.length || !isIn; - } - - private Parameter[] calParameter(DBTableData tableData) { - - String[] paramTexts = new String[2]; - paramTexts[0] = SqlUtils.tryPureSqlText(tableData.getQuery()); - paramTexts[1] = SqlUtils.tryPureSqlText(tableData.getPageQuerySql()); - Parameter[] oldParameters = Arrays.asList(tableData.getParameters()).toArray(new Parameter[0]); - return ParameterUtils.analyzeAndUnionParameters(paramTexts, oldParameters); - } - - public void updateDBName(String dbName) { - DBTableData tableData = dbTableData.getValue(); - tableData.setDatabase(new NameDatabaseConnection(dbName)); - dbTableData.postValue(tableData); - } -} From d8fd0f344131278fdf4d6954379873e3ac3177cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 29 Nov 2023 10:49:30 +0800 Subject: [PATCH 011/302] =?UTF-8?q?REPORT-107972=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9ETreeUI=E3=80=81icon=E6=96=87=E4=BB=B6=E5=A4=B9?= =?UTF-8?q?=E8=BD=AC=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 72 ++++++++++--------- .../com/fr/design/gui/itree/UIFlatTreeUI.java | 32 +++++++++ .../com/fr/design/gui/itree/UITreeUI.java | 16 +++-- .../com/fine/theme/icon/checkbox/checked.svg | 19 +++++ .../theme/icon/checkbox/checked_disable.svg | 7 ++ .../com/fine/theme/icon/checkbox/hovered.svg | 6 ++ .../fine/theme/icon/checkbox/part_checked.svg | 6 ++ .../fine/theme/icon/checkbox/unchecked.svg | 6 ++ .../theme/icon/checkbox/unchecked_disable.svg | 6 ++ .../theme/icon/dataset}/batch_esd_off.svg | 0 .../icon/dataset/batch_esd_off_disable.svg | 8 +++ .../theme/icon/dataset}/batch_esd_on.svg | 0 .../icon/dataset/batch_esd_on_disable.svg | 8 +++ .../theme/icon/dataset}/class_table_data.svg | 0 .../theme/icon/dataset}/connection.svg | 0 .../theme/icon/dataset}/data_table.svg | 0 .../theme/icon/dataset}/database.svg | 0 .../theme/icon/dataset}/edit.svg | 0 .../fine/theme/icon/dataset/edit_disable.svg | 8 +++ .../theme/icon/dataset}/field.svg | 0 .../theme/icon/dataset}/file.svg | 0 .../theme/icon/dataset}/multi.svg | 0 .../theme/icon/dataset}/preview.svg | 0 .../theme/icon/dataset/preview_disable.svg | 8 +++ .../theme/icon/dataset}/server_database.svg | 0 .../theme/icon/dataset}/store_procedure.svg | 0 .../theme/icon/dataset}/tree.svg | 0 .../theme/icon/filetree}/collapse_all.svg | 0 .../icon/filetree}/collapse_all_disable.svg | 0 .../com/fine/theme/icon/filetree/cpt_icon.svg | 10 +++ .../theme/icon/filetree}/excel_icon.svg | 0 .../com/fine/theme/icon/filetree/folder.svg | 8 +++ .../theme/icon/filetree}/folder_open.svg | 0 .../com/fine/theme/icon/filetree/frm_icon.svg | 12 ++++ .../theme/icon/filetree}/fvs_icon.svg | 0 .../theme/icon/filetree}/locate.svg | 0 .../theme/icon/filetree}/locate_disable.svg | 0 .../com/fine/theme/icon/filetree/minus.svg | 5 ++ .../theme/icon/filetree}/new_folder.svg | 0 .../icon/filetree}/new_folder_disable.svg | 0 .../com/fine/theme/icon/filetree/plus.svg | 5 ++ .../theme/icon/filetree}/refresh.svg | 0 .../theme/icon/filetree}/refresh_disable.svg | 0 .../theme/icon/filetree}/rename.svg | 0 .../theme/icon/filetree}/rename_disable.svg | 0 .../theme/icon/filetree}/vcs_list.svg | 0 .../theme/icon/filetree}/vcs_list_disable.svg | 0 .../theme/icon/filetree}/view_folder.svg | 0 .../icon/filetree}/view_folder_disable.svg | 0 .../remove => fine/theme/icon}/remove.svg | 0 .../com/fine/theme/icon/remove_disable.svg | 9 +++ .../standard => fine/theme/icon}/search.svg | 0 .../light/ui/laf/FineLightLaf.properties | 2 +- 53 files changed, 211 insertions(+), 42 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/gui/itree/UIFlatTreeUI.java create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/checkbox/checked.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/checkbox/checked_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/checkbox/hovered.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/checkbox/part_checked.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/checkbox/unchecked.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/checkbox/unchecked_disable.svg rename designer-base/src/main/resources/com/{fr/design/standard/batchesdoff => fine/theme/icon/dataset}/batch_esd_off.svg (100%) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/dataset/batch_esd_off_disable.svg rename designer-base/src/main/resources/com/{fr/design/standard/batchesdon => fine/theme/icon/dataset}/batch_esd_on.svg (100%) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/dataset/batch_esd_on_disable.svg rename designer-base/src/main/resources/com/{fr/design/standard => fine/theme/icon/dataset}/class_table_data.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard => fine/theme/icon/dataset}/connection.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard => fine/theme/icon/dataset}/data_table.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard => fine/theme/icon/dataset}/database.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard/editdataset => fine/theme/icon/dataset}/edit.svg (100%) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/dataset/edit_disable.svg rename designer-base/src/main/resources/com/{fr/design/standard => fine/theme/icon/dataset}/field.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard => fine/theme/icon/dataset}/file.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard => fine/theme/icon/dataset}/multi.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard/previewdateset => fine/theme/icon/dataset}/preview.svg (100%) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/dataset/preview_disable.svg rename designer-base/src/main/resources/com/{fr/design/standard => fine/theme/icon/dataset}/server_database.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard => fine/theme/icon/dataset}/store_procedure.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard => fine/theme/icon/dataset}/tree.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard => fine/theme/icon/filetree}/collapse_all.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard => fine/theme/icon/filetree}/collapse_all_disable.svg (100%) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/cpt_icon.svg rename designer-base/src/main/resources/com/{fr/design/standard/fileicon => fine/theme/icon/filetree}/excel_icon.svg (100%) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/folder.svg rename designer-base/src/main/resources/com/{fr/design/standard/fileicon => fine/theme/icon/filetree}/folder_open.svg (100%) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/frm_icon.svg rename designer-base/src/main/resources/com/{fr/design/standard/fileicon => fine/theme/icon/filetree}/fvs_icon.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard/locate => fine/theme/icon/filetree}/locate.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard/locate => fine/theme/icon/filetree}/locate_disable.svg (100%) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/minus.svg rename designer-base/src/main/resources/com/{fr/design/standard/newfolder => fine/theme/icon/filetree}/new_folder.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard/newfolder => fine/theme/icon/filetree}/new_folder_disable.svg (100%) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/plus.svg rename designer-base/src/main/resources/com/{fr/design/standard => fine/theme/icon/filetree}/refresh.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard => fine/theme/icon/filetree}/refresh_disable.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard/rename => fine/theme/icon/filetree}/rename.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard/rename => fine/theme/icon/filetree}/rename_disable.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard/vcslist => fine/theme/icon/filetree}/vcs_list.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard/vcslist => fine/theme/icon/filetree}/vcs_list_disable.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard/viewfolder => fine/theme/icon/filetree}/view_folder.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard/viewfolder => fine/theme/icon/filetree}/view_folder_disable.svg (100%) rename designer-base/src/main/resources/com/{fr/design/standard/remove => fine/theme/icon}/remove.svg (100%) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/remove_disable.svg rename designer-base/src/main/resources/com/{fr/design/standard => fine/theme/icon}/search.svg (100%) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 3212a41853..757bf62c6b 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -29,45 +29,47 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("version_save", "com/fine/theme/icon/version_save.svg", true), new SvgIconSource("font_miss_check", "com/fine/theme/icon/font_miss_check.svg", true), new SvgIconSource("template_theme", "com/fine/theme/icon/template_theme.svg", true), - new SvgIconSource("database", "com/fr/design/standard/database.svg", true), - new SvgIconSource("preview", "com/fr/design/standard/previewdateset/preview.svg", false), - new SvgIconSource("connection", "com/fr/design/standard/connection.svg", true), - new SvgIconSource("class_table_data", "com/fr/design/standard/class_table_data.svg", true), - new SvgIconSource("data_table", "com/fr/design/standard/data_table.svg", true), - new SvgIconSource("multi", "com/fr/design/standard/multi.svg", true), - new SvgIconSource("file", "com/fr/design/standard/file.svg", true), - new SvgIconSource("tree", "com/fr/design/standard/tree.svg", true), - new SvgIconSource("store_procedure", "/com/fr/design/standard/store_procedure.svg", true), - new SvgIconSource("batch_esd_on", "com/fr/design/standard/batchesdon/batch_esd_on.svg", true), - new SvgIconSource("batch_esd_off", "com/fr/design/standard/batchesdoff/batch_esd_off.svg", true), - new SvgIconSource("edit", "com/fr/design/standard/editdataset/edit.svg", true), - new SvgIconSource("remove", "com/fr/design/standard/remove/remove.svg", true), - new SvgIconSource("search", "/com/fr/design/standard/search.svg", true), - new SvgIconSource("server_database", "com/fr/design/standard/server_database.svg", true), - new SvgIconSource("field", "com/fr/design/standard/field.svg", true), + new SvgIconSource("remove", "com/fine/theme/icon/remove.svg", true), + new SvgIconSource("search", "com/fine/theme/icon/search.svg", true), + + // 数据集相关Icon + new SvgIconSource("database", "com/fine/theme/icon/dataset/database.svg", true), + new SvgIconSource("preview", "com/fine/theme/icon/dataset/preview.svg", false), + new SvgIconSource("connection", "com/fine/theme/icon/dataset/connection.svg", true), + new SvgIconSource("class_table_data", "com/fine/theme/icon/dataset/class_table_data.svg", true), + new SvgIconSource("data_table", "com/fine/theme/icon/dataset/data_table.svg", true), + new SvgIconSource("multi", "com/fine/theme/icon/dataset/multi.svg", true), + new SvgIconSource("file", "com/fine/theme/icon/dataset/file.svg", true), + new SvgIconSource("tree", "com/fine/theme/icon/dataset/tree.svg", true), + new SvgIconSource("store_procedure", "com/fine/theme/icon/dataset/store_procedure.svg", true), + new SvgIconSource("batch_esd_on", "com/fine/theme/icon/dataset/batch_esd_on.svg", true), + new SvgIconSource("batch_esd_off", "com/fine/theme/icon/dataset/batch_esd_off.svg", true), + new SvgIconSource("edit", "com/fine/theme/icon/dataset/edit.svg", true), + new SvgIconSource("server_database", "com/fine/theme/icon/dataset/server_database.svg", true), + new SvgIconSource("field", "com/fine/theme/icon/dataset/field.svg", true), // 目录树相关Icon - new SvgIconSource("folder", "com/fr/design/standard/fileicon/folder.svg", true), - new SvgIconSource("folder_open", "com/fr/design/standard/fileicon/folder_open.svg", true), - new SvgIconSource("cpt_icon", "com/fr/design/standard/fileicon/cpt_icon.svg", true), - new SvgIconSource("frm_icon", "com/fr/design/standard/fileicon/frm_icon.svg", true), - new SvgIconSource("fvs_icon", "com/fr/design/standard/fileicon/fvs_icon.svg", true), - new SvgIconSource("excel_icon", "com/fr/design/standard/fileicon/excel_icon.svg", true), - new SvgIconSource("minus", "com/fr/design/standard/fileicon/minus.svg", true), - new SvgIconSource("plus", "com/fr/design/standard/fileicon/plus.svg", true), - new SvgIconSource("locate", "com/fr/design/standard/locate/locate.svg", true), - new SvgIconSource("rename", "com/fr/design/standard/rename/rename.svg", true), - new SvgIconSource("collapse_all", "com/fr/design/standard/collapse_all.svg", true), - new SvgIconSource("vcs_list", "com/fr/design/standard/vcslist/vcs_list.svg", true), - new SvgIconSource("view_folder", "com/fr/design/standard/viewfolder/view_folder.svg", true), - new SvgIconSource("refresh", "com/fr/design/standard/refresh.svg", true), - new SvgIconSource("new_folder", "com/fr/design/standard/newfolder/new_folder.svg", true), + new SvgIconSource("folder", "com/fine/theme/icon/filetree/folder.svg", true), + new SvgIconSource("folder_open", "com/fine/theme/icon/filetree/folder_open.svg", true), + new SvgIconSource("cpt_icon", "com/fine/theme/icon/filetree/cpt_icon.svg", true), + new SvgIconSource("frm_icon", "com/fine/theme/icon/filetree/frm_icon.svg", true), + new SvgIconSource("fvs_icon", "com/fine/theme/icon/filetree/fvs_icon.svg", true), + new SvgIconSource("excel_icon", "com/fine/theme/icon/filetree/excel_icon.svg", true), + new SvgIconSource("minus", "com/fine/theme/icon/filetree/minus.svg", true), + new SvgIconSource("plus", "com/fine/theme/icon/filetree/plus.svg", true), + new SvgIconSource("locate", "com/fine/theme/icon/filetree/locate.svg", true), + new SvgIconSource("rename", "com/fine/theme/icon/filetree/rename.svg", true), + new SvgIconSource("collapse_all", "com/fine/theme/icon/filetree/collapse_all.svg", true), + new SvgIconSource("vcs_list", "com/fine/theme/icon/filetree/vcs_list.svg", true), + new SvgIconSource("view_folder", "com/fine/theme/icon/filetree/view_folder.svg", true), + new SvgIconSource("refresh", "com/fine/theme/icon/filetree/refresh.svg", true), + new SvgIconSource("new_folder", "com/fine/theme/icon/filetree/new_folder.svg", true), // CheckBox相关Icon - new SvgIconSource("checkbox_checked", "com/fr/design/standard/checkbox/checked.svg", true), - new SvgIconSource("checkbox_unchecked", "com/fr/design/standard/checkbox/unchecked.svg", true), - new SvgIconSource("checkbox_part_checked", "com/fr/design/standard/checkbox/part_checked.svg", true), - new SvgIconSource("checkbox_hovered", "com/fr/design/standard/checkbox/hovered.svg", true) + new SvgIconSource("checkbox_checked", "com/fine/theme/icon/checkbox/checked.svg", true), + new SvgIconSource("checkbox_unchecked", "com/fine/theme/icon/checkbox/unchecked.svg", true), + new SvgIconSource("checkbox_part_checked", "com/fine/theme/icon/checkbox/part_checked.svg", true), + new SvgIconSource("checkbox_hovered", "com/fine/theme/icon/checkbox/hovered.svg", true) ); } diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/UIFlatTreeUI.java b/designer-base/src/main/java/com/fr/design/gui/itree/UIFlatTreeUI.java new file mode 100644 index 0000000000..d8d9546a25 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/itree/UIFlatTreeUI.java @@ -0,0 +1,32 @@ +package com.fr.design.gui.itree; + +import com.fine.theme.icon.LazyIcon; +import com.formdev.flatlaf.ui.FlatTreeUI; + +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; + +/** + * 主题化的TreeUI,继承自FlatTreeUI + * + * @author Levy.Xie + * @since 11.0 + * Created on 2023/11/29 + */ +public class UIFlatTreeUI extends FlatTreeUI { + + /** + * 创建组件UI + * @param x 组件 + * @return 返回组件UI + */ + public static ComponentUI createUI(JComponent x) { + return new UIFlatTreeUI(); + } + + protected void installDefaults() { + super.installDefaults(); + setExpandedIcon(new LazyIcon("minus")); + setCollapsedIcon(new LazyIcon("plus")); + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/UITreeUI.java b/designer-base/src/main/java/com/fr/design/gui/itree/UITreeUI.java index bb932187b2..af6dfc7ead 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/UITreeUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/UITreeUI.java @@ -1,8 +1,5 @@ package com.fr.design.gui.itree; -import com.fine.theme.icon.LazyIcon; -import com.formdev.flatlaf.ui.FlatTreeUI; -import com.fr.base.BaseUtils; import com.fr.base.svg.IconUtils; import com.fr.design.utils.ThemeUtils; @@ -18,7 +15,7 @@ import javax.swing.tree.DefaultTreeCellRenderer; * Date: 13-12-31 * Time: 下午4:58 */ -public class UITreeUI extends FlatTreeUI { +public class UITreeUI extends MetalTreeUI { /** * 创建组件UI * @param x 组件 @@ -30,7 +27,14 @@ public class UITreeUI extends FlatTreeUI { protected void installDefaults() { super.installDefaults(); - setExpandedIcon(new LazyIcon("minus")); - setCollapsedIcon(new LazyIcon("plus")); + setExpandedIcon(IconUtils.readIcon("/com/fr/design/standard/fileicon/minus.svg")); + setCollapsedIcon(IconUtils.readIcon("/com/fr/design/standard/fileicon/plus.svg")); + if (tree.getCellRenderer() instanceof DefaultTreeCellRenderer) { + DefaultTreeCellRenderer r = (DefaultTreeCellRenderer) tree.getCellRenderer(); + r.setBackgroundNonSelectionColor(ThemeUtils.TEXT_BG_COLOR); + r.setBackgroundSelectionColor(ThemeUtils.TEXT_SELECTED_BG_COLOR); + r.setTextNonSelectionColor(ThemeUtils.NORMAL_FOREGROUND); + r.setTextSelectionColor(ThemeUtils.TEXT_BG_COLOR); + } } } \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fine/theme/icon/checkbox/checked.svg b/designer-base/src/main/resources/com/fine/theme/icon/checkbox/checked.svg new file mode 100644 index 0000000000..fa4b47ddd7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/checkbox/checked.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/checkbox/checked_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/checkbox/checked_disable.svg new file mode 100644 index 0000000000..88df5c1a59 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/checkbox/checked_disable.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/checkbox/hovered.svg b/designer-base/src/main/resources/com/fine/theme/icon/checkbox/hovered.svg new file mode 100644 index 0000000000..54a7539d4d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/checkbox/hovered.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/checkbox/part_checked.svg b/designer-base/src/main/resources/com/fine/theme/icon/checkbox/part_checked.svg new file mode 100644 index 0000000000..caeebfd58c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/checkbox/part_checked.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/checkbox/unchecked.svg b/designer-base/src/main/resources/com/fine/theme/icon/checkbox/unchecked.svg new file mode 100644 index 0000000000..86fa2f7148 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/checkbox/unchecked.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/checkbox/unchecked_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/checkbox/unchecked_disable.svg new file mode 100644 index 0000000000..cab88105ee --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/checkbox/unchecked_disable.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/batch_esd_off.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off.svg rename to designer-base/src/main/resources/com/fine/theme/icon/dataset/batch_esd_off.svg diff --git a/designer-base/src/main/resources/com/fine/theme/icon/dataset/batch_esd_off_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/batch_esd_off_disable.svg new file mode 100644 index 0000000000..9c2a3730b1 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/dataset/batch_esd_off_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/batch_esd_on.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on.svg rename to designer-base/src/main/resources/com/fine/theme/icon/dataset/batch_esd_on.svg diff --git a/designer-base/src/main/resources/com/fine/theme/icon/dataset/batch_esd_on_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/batch_esd_on_disable.svg new file mode 100644 index 0000000000..042c928afa --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/dataset/batch_esd_on_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/class_table_data.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/class_table_data.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/class_table_data.svg rename to designer-base/src/main/resources/com/fine/theme/icon/dataset/class_table_data.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/connection.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/connection.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/connection.svg rename to designer-base/src/main/resources/com/fine/theme/icon/dataset/connection.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/data_table.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/data_table.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/data_table.svg rename to designer-base/src/main/resources/com/fine/theme/icon/dataset/data_table.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/database.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/database.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/database.svg rename to designer-base/src/main/resources/com/fine/theme/icon/dataset/database.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/edit.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/editdataset/edit.svg rename to designer-base/src/main/resources/com/fine/theme/icon/dataset/edit.svg diff --git a/designer-base/src/main/resources/com/fine/theme/icon/dataset/edit_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/edit_disable.svg new file mode 100644 index 0000000000..409fe0d749 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/dataset/edit_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/field.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/field.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/field.svg rename to designer-base/src/main/resources/com/fine/theme/icon/dataset/field.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/file.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/file.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/file.svg rename to designer-base/src/main/resources/com/fine/theme/icon/dataset/file.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/multi.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/multi.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/multi.svg rename to designer-base/src/main/resources/com/fine/theme/icon/dataset/multi.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/preview.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview.svg rename to designer-base/src/main/resources/com/fine/theme/icon/dataset/preview.svg diff --git a/designer-base/src/main/resources/com/fine/theme/icon/dataset/preview_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/preview_disable.svg new file mode 100644 index 0000000000..f663e9cbb4 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/dataset/preview_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/server_database.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/server_database.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/server_database.svg rename to designer-base/src/main/resources/com/fine/theme/icon/dataset/server_database.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/store_procedure.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/store_procedure.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/store_procedure.svg rename to designer-base/src/main/resources/com/fine/theme/icon/dataset/store_procedure.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/tree.svg b/designer-base/src/main/resources/com/fine/theme/icon/dataset/tree.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/tree.svg rename to designer-base/src/main/resources/com/fine/theme/icon/dataset/tree.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/collapse_all.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/collapse_all.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/collapse_all.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/collapse_all.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/collapse_all_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/collapse_all_disable.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/collapse_all_disable.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/collapse_all_disable.svg diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/cpt_icon.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/cpt_icon.svg new file mode 100644 index 0000000000..65e47758f6 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/cpt_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/excel_icon.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/excel_icon.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/fileicon/excel_icon.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/excel_icon.svg diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/folder.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/folder.svg new file mode 100644 index 0000000000..4dd51d6ea1 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/folder.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/folder_open.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/folder_open.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/fileicon/folder_open.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/folder_open.svg diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/frm_icon.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/frm_icon.svg new file mode 100644 index 0000000000..4eb67dbe7c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/frm_icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/fvs_icon.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/fvs_icon.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/fileicon/fvs_icon.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/fvs_icon.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/locate/locate.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/locate.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/locate/locate.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/locate.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/locate/locate_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/locate_disable.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/locate/locate_disable.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/locate_disable.svg diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/minus.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/minus.svg new file mode 100644 index 0000000000..75878fc8c2 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/minus.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/new_folder.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/new_folder.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/new_folder_disable.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_disable.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/new_folder_disable.svg diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/plus.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/plus.svg new file mode 100644 index 0000000000..ca1e276691 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/plus.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/refresh.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/refresh.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/refresh.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/refresh.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/refresh_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/refresh_disable.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/refresh_disable.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/refresh_disable.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/rename/rename.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/rename.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/rename/rename.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/rename.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/rename/rename_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/rename_disable.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/rename/rename_disable.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/rename_disable.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/vcs_list.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/vcs_list.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/vcs_list_disable.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_disable.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/vcs_list_disable.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/view_folder.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/view_folder.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/view_folder_disable.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_disable.svg rename to designer-base/src/main/resources/com/fine/theme/icon/filetree/view_folder_disable.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/remove/remove.svg b/designer-base/src/main/resources/com/fine/theme/icon/remove.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/remove/remove.svg rename to designer-base/src/main/resources/com/fine/theme/icon/remove.svg diff --git a/designer-base/src/main/resources/com/fine/theme/icon/remove_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/remove_disable.svg new file mode 100644 index 0000000000..927064446e --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/remove_disable.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/search.svg b/designer-base/src/main/resources/com/fine/theme/icon/search.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/search.svg rename to designer-base/src/main/resources/com/fine/theme/icon/search.svg diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index fbceec41c4..cee3a00b75 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -84,7 +84,7 @@ ToggleButtonUI = com.fine.theme.light.ui.FineToggleButtonUI ToolBarUI = com.formdev.flatlaf.ui.FlatToolBarUI ToolBarSeparatorUI = com.formdev.flatlaf.ui.FlatToolBarSeparatorUI ToolTipUI = com.formdev.flatlaf.ui.FlatToolTipUI -TreeUI =com.fr.design.gui.itree.UITreeUI +TreeUI = com.fr.design.gui.itree.UIFlatTreeUI ViewportUI = com.formdev.flatlaf.ui.FlatViewportUI From 3a3147317653c21cc8be35c098750f9cf39cd7d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 29 Nov 2023 10:50:10 +0800 Subject: [PATCH 012/302] =?UTF-8?q?REPORT-107972=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9ETreeUI=E3=80=81icon=E6=96=87=E4=BB=B6=E5=A4=B9?= =?UTF-8?q?=E8=BD=AC=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...disable.svg => batch_esd_off_disabled.svg} | 0 .../batchesdoff/batch_esd_off_normal.svg | 3 +++ ..._disable.svg => batch_esd_on_disabled.svg} | 0 .../batchesdon/batch_esd_on_normal.svg | 3 +++ .../standard/class_table_data_normal.svg | 4 ++++ .../design/standard/collapse_all_normal.svg | 4 ++++ .../fr/design/standard/connection_normal.svg | 11 ++++++++++ .../fr/design/standard/data_table_normal.svg | 3 +++ .../fr/design/standard/database_normal.svg | 3 +++ .../{edit_disable.svg => edit_disabled.svg} | 2 +- .../standard/editdataset/edit_normal.svg | 8 +++++++ .../com/fr/design/standard/field_normal.svg | 5 +++++ .../com/fr/design/standard/file_normal.svg | 5 +++++ .../fr/design/standard/fileicon/cpt_icon.svg | 19 ++++++++--------- .../fr/design/standard/fileicon/folder.svg | 11 +++------- .../fr/design/standard/fileicon/frm_icon.svg | 21 ++++++++----------- .../com/fr/design/standard/fileicon/minus.svg | 8 +++---- .../com/fr/design/standard/fileicon/plus.svg | 8 +++---- .../standard/locate/locate_disabled.svg | 15 +++++++++++++ .../design/standard/locate/locate_normal.svg | 15 +++++++++++++ .../com/fr/design/standard/multi_normal.svg | 11 ++++++++++ .../newfolder/new_folder_disabled.svg | 8 +++++++ .../standard/newfolder/new_folder_normal.svg | 8 +++++++ ...eview_disable.svg => preview_disabled.svg} | 2 +- .../previewdateset/preview_normal.svg | 7 +++++++ .../com/fr/design/standard/refresh_normal.svg | 7 +++++++ ...remove_disable.svg => remove_disabled.svg} | 2 +- .../design/standard/remove/remove_normal.svg | 9 ++++++++ .../standard/rename/rename_disabled.svg | 7 +++++++ .../design/standard/rename/rename_normal.svg | 7 +++++++ .../com/fr/design/standard/search_normal.svg | 7 +++++++ .../standard/server_database_normal.svg | 7 +++++++ .../standard/store_procedure_normal.svg | 8 +++++++ .../com/fr/design/standard/tree_normal.svg | 14 +++++++++++++ .../standard/vcslist/vcs_list_disabled.svg | 7 +++++++ .../standard/vcslist/vcs_list_normal.svg | 7 +++++++ .../viewfolder/view_folder_disabled.svg | 7 +++++++ .../viewfolder/view_folder_normal.svg | 7 +++++++ 38 files changed, 237 insertions(+), 43 deletions(-) rename designer-base/src/main/resources/com/fr/design/standard/batchesdoff/{batch_esd_off_disable.svg => batch_esd_off_disabled.svg} (100%) create mode 100644 designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off_normal.svg rename designer-base/src/main/resources/com/fr/design/standard/batchesdon/{batch_esd_on_disable.svg => batch_esd_on_disabled.svg} (100%) create mode 100644 designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/class_table_data_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/collapse_all_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/connection_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/data_table_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/database_normal.svg rename designer-base/src/main/resources/com/fr/design/standard/editdataset/{edit_disable.svg => edit_disabled.svg} (89%) create mode 100644 designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/field_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/file_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/locate/locate_disabled.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/locate/locate_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/multi_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_disabled.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_normal.svg rename designer-base/src/main/resources/com/fr/design/standard/previewdateset/{preview_disable.svg => preview_disabled.svg} (92%) create mode 100644 designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/refresh_normal.svg rename designer-base/src/main/resources/com/fr/design/standard/remove/{remove_disable.svg => remove_disabled.svg} (89%) create mode 100644 designer-base/src/main/resources/com/fr/design/standard/remove/remove_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/rename/rename_disabled.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/rename/rename_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/search_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/server_database_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/store_procedure_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/tree_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_disabled.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_disabled.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_normal.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off_disable.svg b/designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off_disabled.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off_disable.svg rename to designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off_disabled.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off_normal.svg new file mode 100644 index 0000000000..c81b5419aa --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/batchesdoff/batch_esd_off_normal.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on_disable.svg b/designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on_disabled.svg similarity index 100% rename from designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on_disable.svg rename to designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on_disabled.svg diff --git a/designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on_normal.svg new file mode 100644 index 0000000000..13f924d88b --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/batchesdon/batch_esd_on_normal.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/class_table_data_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/class_table_data_normal.svg new file mode 100644 index 0000000000..19fc851ecd --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/class_table_data_normal.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/collapse_all_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/collapse_all_normal.svg new file mode 100644 index 0000000000..45b28a56b3 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/collapse_all_normal.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/connection_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/connection_normal.svg new file mode 100644 index 0000000000..7c865b45e0 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/connection_normal.svg @@ -0,0 +1,11 @@ + + + icon_定义数据连接_normal备份 + + + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/data_table_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/data_table_normal.svg new file mode 100644 index 0000000000..220cd95269 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/data_table_normal.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/database_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/database_normal.svg new file mode 100644 index 0000000000..8c0361dcda --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/database_normal.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_disable.svg b/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_disabled.svg similarity index 89% rename from designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_disable.svg rename to designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_disabled.svg index c93e1e6904..9b001cfc5f 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_disable.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_disabled.svg @@ -1,5 +1,5 @@ - + icon_编辑_disable diff --git a/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_normal.svg new file mode 100644 index 0000000000..2917194523 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/editdataset/edit_normal.svg @@ -0,0 +1,8 @@ + + + icon_编辑_normal + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/field_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/field_normal.svg new file mode 100644 index 0000000000..608d1fd589 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/field_normal.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/file_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/file_normal.svg new file mode 100644 index 0000000000..cafbff6526 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/file_normal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/cpt_icon.svg b/designer-base/src/main/resources/com/fr/design/standard/fileicon/cpt_icon.svg index 65e47758f6..d691f38b67 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/fileicon/cpt_icon.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/fileicon/cpt_icon.svg @@ -1,10 +1,9 @@ - - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/folder.svg b/designer-base/src/main/resources/com/fr/design/standard/fileicon/folder.svg index 4dd51d6ea1..ebafeec23c 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/fileicon/folder.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/fileicon/folder.svg @@ -1,8 +1,3 @@ - - - - - - - - + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/frm_icon.svg b/designer-base/src/main/resources/com/fr/design/standard/fileicon/frm_icon.svg index 4eb67dbe7c..fa61a511fe 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/fileicon/frm_icon.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/fileicon/frm_icon.svg @@ -1,12 +1,9 @@ - - - - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/minus.svg b/designer-base/src/main/resources/com/fr/design/standard/fileicon/minus.svg index 75878fc8c2..db4e76f2a9 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/fileicon/minus.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/fileicon/minus.svg @@ -1,5 +1,3 @@ - - - - - + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/plus.svg b/designer-base/src/main/resources/com/fr/design/standard/fileicon/plus.svg index ca1e276691..f012490aee 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/fileicon/plus.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/fileicon/plus.svg @@ -1,5 +1,3 @@ - - - - - + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/locate/locate_disabled.svg b/designer-base/src/main/resources/com/fr/design/standard/locate/locate_disabled.svg new file mode 100644 index 0000000000..3a94510fb0 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/locate/locate_disabled.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/locate/locate_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/locate/locate_normal.svg new file mode 100644 index 0000000000..6c78878c0a --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/locate/locate_normal.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/multi_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/multi_normal.svg new file mode 100644 index 0000000000..0c8144e634 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/multi_normal.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_disabled.svg b/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_disabled.svg new file mode 100644 index 0000000000..f3936e1539 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_disabled.svg @@ -0,0 +1,8 @@ + + + icon_NewFolderIcon_disable + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_normal.svg new file mode 100644 index 0000000000..85f41e26a7 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/newfolder/new_folder_normal.svg @@ -0,0 +1,8 @@ + + + icon_NewFolderIcon_normal + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_disable.svg b/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_disabled.svg similarity index 92% rename from designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_disable.svg rename to designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_disabled.svg index b0e8234410..6f2c4afa1f 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_disable.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_disabled.svg @@ -1,5 +1,5 @@ - + icon_预览_disabled diff --git a/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_normal.svg new file mode 100644 index 0000000000..0412b5e108 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/previewdateset/preview_normal.svg @@ -0,0 +1,7 @@ + + + icon_预览_normal + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/refresh_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/refresh_normal.svg new file mode 100644 index 0000000000..4e3fd9c147 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/refresh_normal.svg @@ -0,0 +1,7 @@ + + + icon_刷新_normal + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/remove/remove_disable.svg b/designer-base/src/main/resources/com/fr/design/standard/remove/remove_disabled.svg similarity index 89% rename from designer-base/src/main/resources/com/fr/design/standard/remove/remove_disable.svg rename to designer-base/src/main/resources/com/fr/design/standard/remove/remove_disabled.svg index 93bca0fc3c..b57f9a853d 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/remove/remove_disable.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/remove/remove_disabled.svg @@ -1,5 +1,5 @@ - + icon_删除_normal diff --git a/designer-base/src/main/resources/com/fr/design/standard/remove/remove_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/remove/remove_normal.svg new file mode 100644 index 0000000000..b09268f454 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/remove/remove_normal.svg @@ -0,0 +1,9 @@ + + + icon_删除_normal备份 + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/rename/rename_disabled.svg b/designer-base/src/main/resources/com/fr/design/standard/rename/rename_disabled.svg new file mode 100644 index 0000000000..953e12eaa9 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/rename/rename_disabled.svg @@ -0,0 +1,7 @@ + + + icon_重命名_disable + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/rename/rename_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/rename/rename_normal.svg new file mode 100644 index 0000000000..a2c287789d --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/rename/rename_normal.svg @@ -0,0 +1,7 @@ + + + icon_重命名_normal + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/search_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/search_normal.svg new file mode 100644 index 0000000000..673548dfaf --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/search_normal.svg @@ -0,0 +1,7 @@ + + + icon_搜索_normal + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/server_database_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/server_database_normal.svg new file mode 100644 index 0000000000..50a509fcbf --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/server_database_normal.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/store_procedure_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/store_procedure_normal.svg new file mode 100644 index 0000000000..55393d59ab --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/store_procedure_normal.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/standard/tree_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/tree_normal.svg new file mode 100644 index 0000000000..cc965888e7 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/tree_normal.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_disabled.svg b/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_disabled.svg new file mode 100644 index 0000000000..b88ee0998e --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_disabled.svg @@ -0,0 +1,7 @@ + + + icon_版本管理_disabled + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_normal.svg new file mode 100644 index 0000000000..ebfca43899 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/vcslist/vcs_list_normal.svg @@ -0,0 +1,7 @@ + + + icon_版本管理_normal + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_disabled.svg b/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_disabled.svg new file mode 100644 index 0000000000..376d372d41 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_disabled.svg @@ -0,0 +1,7 @@ + + + icon_打开文件_disable + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_normal.svg new file mode 100644 index 0000000000..42ae6cbd3d --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/viewfolder/view_folder_normal.svg @@ -0,0 +1,7 @@ + + + icon_所在文件夹_normal + + + + \ No newline at end of file From 1b066b4ff49aa092f8f6485cafd92166ac0a7b50 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Fri, 1 Dec 2023 10:26:22 +0800 Subject: [PATCH 013/302] =?UTF-8?q?REPORT-107973=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0=20=E3=80=90?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E5=8E=9F=E5=9B=A0=E3=80=91rt=20=E3=80=90?= =?UTF-8?q?=E6=94=B9=E5=8A=A8=E6=80=9D=E8=B7=AF=E3=80=91=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E6=A0=8Ficon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 28 +++++++++++++++++-- .../search/pane/TreeSearchToolbarPane.java | 3 +- .../java/com/fr/design/icon/BorderIcon.java | 17 +++++------ .../style/color/UIToolbarColorButton.java | 4 +-- .../theme/icon/bindcolumn/bind_column.svg | 16 +++++++++++ .../icon/bindcolumn/bind_column_disable.svg | 16 +++++++++++ .../fine/theme/icon/cellstyle/h_center.svg | 10 +++++++ .../com/fine/theme/icon/cellstyle/h_left.svg | 10 +++++++ .../com/fine/theme/icon/cellstyle/h_right.svg | 10 +++++++ .../resources/com/fine/theme/icon/clear.svg | 11 ++++++++ .../com/fine/theme/icon/font/background.svg | 6 ++++ .../com/fine/theme/icon/font/bold.svg | 5 ++++ .../com/fine/theme/icon/font/foreground.svg | 5 ++++ .../com/fine/theme/icon/font/italic.svg | 5 ++++ .../com/fine/theme/icon/font/underline.svg | 5 ++++ .../com/fine/theme/icon/insert/bias.svg | 5 ++++ .../fine/theme/icon/insert/bias_disable.svg | 5 ++++ .../com/fine/theme/icon/insert/chart.svg | 5 ++++ .../fine/theme/icon/insert/chart_disable.svg | 5 ++++ .../com/fine/theme/icon/insert/formula.svg | 6 ++++ .../theme/icon/insert/formula_disable.svg | 6 ++++ .../com/fine/theme/icon/insert/image.svg | 8 ++++++ .../fine/theme/icon/insert/image_disable.svg | 8 ++++++ .../com/fine/theme/icon/insert/richtext.svg | 14 ++++++++++ .../theme/icon/insert/richtext_disable.svg | 14 ++++++++++ .../com/fine/theme/icon/insert/sub_report.svg | 15 ++++++++++ .../theme/icon/insert/sub_report_disable.svg | 15 ++++++++++ .../com/fine/theme/icon/insert/text.svg | 8 ++++++ .../fine/theme/icon/insert/text_disable.svg | 8 ++++++ .../com/fine/theme/icon/merge/merge.svg | 5 ++++ .../fine/theme/icon/merge/merge_disable.svg | 5 ++++ .../com/fine/theme/icon/merge/unmerge.svg | 5 ++++ .../fine/theme/icon/merge/unmerge_disable.svg | 5 ++++ .../resources/com/fine/theme/icon/noboder.svg | 5 ++++ .../com/fine/theme/icon/popup/popup.svg | 4 +++ .../fr/design/actions/cell/BorderAction.java | 4 +-- .../actions/cell/UIToolbarBorderButton.java | 5 ++-- .../actions/cell/style/AlignmentAction.java | 12 ++++---- .../cell/style/ReportFontBoldAction.java | 7 ++--- .../style/ReportFontForegroundAction.java | 5 ++-- .../cell/style/ReportFontItalicAction.java | 9 +++--- .../cell/style/ReportFontUnderlineAction.java | 9 +++--- .../cell/style/StyleBackgroundAction.java | 19 ++++++------- .../actions/edit/merge/MergeCellAction.java | 5 ++-- .../actions/edit/merge/UnmergeCellAction.java | 5 ++-- .../actions/insert/cell/BiasCellAction.java | 4 +-- .../actions/insert/cell/ChartCellAction.java | 6 ++-- .../insert/cell/DSColumnCellAction.java | 3 +- .../insert/cell/FormulaCellAction.java | 7 ++--- .../insert/cell/GeneralCellAction.java | 6 ++-- .../actions/insert/cell/ImageCellAction.java | 8 +++--- .../insert/cell/RichTextCellAction.java | 4 +-- .../insert/cell/SubReportCellAction.java | 4 +-- 53 files changed, 343 insertions(+), 81 deletions(-) create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/bindcolumn/bind_column.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/bindcolumn/bind_column_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_center.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_left.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_right.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/clear.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/font/background.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/font/bold.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/font/foreground.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/font/italic.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/font/underline.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/insert/bias.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/insert/bias_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/insert/chart.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/insert/chart_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/insert/formula.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/insert/formula_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/insert/image.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/insert/image_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/insert/richtext.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/insert/richtext_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/insert/sub_report.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/insert/sub_report_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/insert/text.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/insert/text_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/merge/merge.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/merge/merge_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/merge/unmerge.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/merge/unmerge_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/noboder.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/popup/popup.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 757bf62c6b..9af2a3dff6 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -69,8 +69,32 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("checkbox_checked", "com/fine/theme/icon/checkbox/checked.svg", true), new SvgIconSource("checkbox_unchecked", "com/fine/theme/icon/checkbox/unchecked.svg", true), new SvgIconSource("checkbox_part_checked", "com/fine/theme/icon/checkbox/part_checked.svg", true), - new SvgIconSource("checkbox_hovered", "com/fine/theme/icon/checkbox/hovered.svg", true) + new SvgIconSource("checkbox_hovered", "com/fine/theme/icon/checkbox/hovered.svg", true), - ); + // 菜单栏Icon + new SvgIconSource("bold", "com/fine/theme/icon/font/bold.svg"), + new SvgIconSource("italic", "com/fine/theme/icon/font/italic.svg"), + new SvgIconSource("underline", "com/fine/theme/icon/font/underline.svg"), + new SvgIconSource("foreground", "com/fine/theme/icon/font/foreground.svg"), + new SvgIconSource("background", "com/fine/theme/icon/font/background.svg"), + new SvgIconSource("h_left", "com/fine/theme/icon/cellstyle/h_left.svg"), + new SvgIconSource("h_center", "com/fine/theme/icon/cellstyle/h_center.svg"), + new SvgIconSource("h_right", "com/fine/theme/icon/cellstyle/h_right.svg"), + new SvgIconSource("noboder", "com/fine/theme/icon/noboder.svg", true), + new SvgIconSource("merge", "com/fine/theme/icon/merge/merge.svg", true), + new SvgIconSource("unmerge", "com/fine/theme/icon/merge/unmerge.svg", true), + new SvgIconSource("bind_column", "com/fine/theme/icon/bindcolumn/bind_column.svg", true), + new SvgIconSource("text", "com/fine/theme/icon/insert/text.svg", true), + new SvgIconSource("richtext", "com/fine/theme/icon/insert/richtext.svg", true), + new SvgIconSource("formula", "com/fine/theme/icon/insert/formula.svg", true), + new SvgIconSource("chart", "com/fine/theme/icon/insert/chart.svg", true), + new SvgIconSource("image", "com/fine/theme/icon/insert/image.svg", true), + new SvgIconSource("bias", "com/fine/theme/icon/insert/bias.svg", true), + new SvgIconSource("sub_report", "com/fine/theme/icon/insert/sub_report.svg", true), + new SvgIconSource("chart_line", "com/fine/theme/icon/chart/chart_line.svg", true), + new SvgIconSource("popup", "com/fine/theme/icon/popup/popup.svg", true), + new SvgIconSource("clear", "com/fine/theme/icon/clear.svg", true) + + ); } } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java index 75b6bd77a5..d1c030742e 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java @@ -1,7 +1,6 @@ package com.fr.design.data.datapane.management.search.pane; import com.fine.theme.icon.LazyIcon; -import com.fr.base.svg.IconUtils; import com.fr.design.DesignModelAdapter; import com.fr.design.constants.UIConstants; import com.fr.design.data.datapane.TableDataTreePane; @@ -150,7 +149,7 @@ public class TreeSearchToolbarPane extends JPanel implements TreeSearchStatusCha }); this.searchTextField.addKeyListener(enterPressed); // 右侧返回图标 - UILabel returnLabel = new UILabel(IconUtils.readIcon("/com/fr/design/standard/clear")); + UILabel returnLabel = new UILabel(new LazyIcon("clear")); returnLabel.setToolTipText(Toolkit.i18nText("Fine-Design_Tree_Search_Return")); returnLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 11)); returnLabel.addMouseListener(new MouseAdapter() { diff --git a/designer-base/src/main/java/com/fr/design/icon/BorderIcon.java b/designer-base/src/main/java/com/fr/design/icon/BorderIcon.java index 8250cd7022..d8ecb88a4f 100644 --- a/designer-base/src/main/java/com/fr/design/icon/BorderIcon.java +++ b/designer-base/src/main/java/com/fr/design/icon/BorderIcon.java @@ -1,18 +1,16 @@ package com.fr.design.icon; +import com.fr.base.CellBorderStyle; +import com.fr.base.GraphHelper; import com.fr.stable.AssistUtils; +import com.fr.stable.Constants; + +import javax.swing.Icon; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; -import javax.swing.Icon; - -import com.fr.base.CellBorderStyle; -import com.fr.base.GraphHelper; -import com.fr.design.constants.UIConstants; -import com.fr.stable.Constants; - public class BorderIcon implements Icon { private int width = 14; @@ -57,7 +55,8 @@ public class BorderIcon implements Icon { || lineStyle == Constants.LINE_DOUBLE) { GraphHelper.drawLine(g, x1, y1, x2, y2, lineStyle); } else { - lineStyle = Constants.LINE_DOT; + lineStyle = Constants.LINE_THIN; + g.setColor(new Color(185, 189, 196)); if (AssistUtils.equals(y1, x2) && AssistUtils.equals(x2, y2)) { GraphHelper.drawLine(g, x1, y1, x2 + 1, y2, lineStyle); } else { @@ -75,8 +74,6 @@ public class BorderIcon implements Icon { int y1 = (defaultHeight - height) / 2; int y2 = (defaultHeight + height) / 2; Graphics2D gr = (Graphics2D) g; - gr.setColor(UIConstants.NORMAL_BACKGROUND); - gr.fillRect(x1, y1, width, height); drawLine(gr, x1, y1, x2, y1, cellBorderStyle.getTopStyle(), cellBorderStyle.getTopColor()); drawLine(gr, x2, y1, x2, y2, cellBorderStyle.getRightStyle(), diff --git a/designer-base/src/main/java/com/fr/design/style/color/UIToolbarColorButton.java b/designer-base/src/main/java/com/fr/design/style/color/UIToolbarColorButton.java index c7c32f7956..5c27bc58cb 100644 --- a/designer-base/src/main/java/com/fr/design/style/color/UIToolbarColorButton.java +++ b/designer-base/src/main/java/com/fr/design/style/color/UIToolbarColorButton.java @@ -4,7 +4,7 @@ package com.fr.design.style.color; -import com.fr.base.svg.IconUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; import com.fr.design.gui.ibutton.UIButton; @@ -35,7 +35,7 @@ public class UIToolbarColorButton extends UICombinationButton implements PopupHi private UIObserverListener uiObserverListener; public UIToolbarColorButton(Icon icon) { - super(new UIColorButton(icon), new UIButton(IconUtils.readIcon("/com/fr/design/standard/popup"))); + super(new UIColorButton(icon), new UIButton(new LazyIcon("popup"))); getLeftButton().setEventBanned(true); getRightButton().addFocusListener(new FocusListener() { diff --git a/designer-base/src/main/resources/com/fine/theme/icon/bindcolumn/bind_column.svg b/designer-base/src/main/resources/com/fine/theme/icon/bindcolumn/bind_column.svg new file mode 100755 index 0000000000..a3ed6545ca --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/bindcolumn/bind_column.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/bindcolumn/bind_column_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/bindcolumn/bind_column_disable.svg new file mode 100755 index 0000000000..5858a92481 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/bindcolumn/bind_column_disable.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_center.svg b/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_center.svg new file mode 100755 index 0000000000..4a52aa1cfe --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_center.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_left.svg b/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_left.svg new file mode 100755 index 0000000000..dbc0b2c62a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_left.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_right.svg b/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_right.svg new file mode 100755 index 0000000000..d8a38dc46b --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_right.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/clear.svg b/designer-base/src/main/resources/com/fine/theme/icon/clear.svg new file mode 100644 index 0000000000..b30c3ab503 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/clear.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/background.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/background.svg new file mode 100755 index 0000000000..97929ef99d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/background.svg @@ -0,0 +1,6 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/bold.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/bold.svg new file mode 100644 index 0000000000..f95596d86c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/bold.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/foreground.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/foreground.svg new file mode 100755 index 0000000000..d26f90872b --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/foreground.svg @@ -0,0 +1,5 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/italic.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/italic.svg new file mode 100755 index 0000000000..5bdf5f2159 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/italic.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/underline.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/underline.svg new file mode 100755 index 0000000000..d792b37af9 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/underline.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/insert/bias.svg b/designer-base/src/main/resources/com/fine/theme/icon/insert/bias.svg new file mode 100755 index 0000000000..179e845138 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/insert/bias.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/insert/bias_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/insert/bias_disable.svg new file mode 100755 index 0000000000..63fd8e51b4 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/insert/bias_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/insert/chart.svg b/designer-base/src/main/resources/com/fine/theme/icon/insert/chart.svg new file mode 100755 index 0000000000..f7ffe73362 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/insert/chart.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/insert/chart_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/insert/chart_disable.svg new file mode 100755 index 0000000000..afddb9d68c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/insert/chart_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/insert/formula.svg b/designer-base/src/main/resources/com/fine/theme/icon/insert/formula.svg new file mode 100755 index 0000000000..948234b49c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/insert/formula.svg @@ -0,0 +1,6 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/insert/formula_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/insert/formula_disable.svg new file mode 100755 index 0000000000..fe02e3020e --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/insert/formula_disable.svg @@ -0,0 +1,6 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/insert/image.svg b/designer-base/src/main/resources/com/fine/theme/icon/insert/image.svg new file mode 100755 index 0000000000..bb7fba99a7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/insert/image.svg @@ -0,0 +1,8 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/insert/image_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/insert/image_disable.svg new file mode 100755 index 0000000000..b9be9b7db5 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/insert/image_disable.svg @@ -0,0 +1,8 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/insert/richtext.svg b/designer-base/src/main/resources/com/fine/theme/icon/insert/richtext.svg new file mode 100755 index 0000000000..5b9a833059 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/insert/richtext.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/insert/richtext_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/insert/richtext_disable.svg new file mode 100755 index 0000000000..2e8c92ed2a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/insert/richtext_disable.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/insert/sub_report.svg b/designer-base/src/main/resources/com/fine/theme/icon/insert/sub_report.svg new file mode 100755 index 0000000000..14f0555a9a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/insert/sub_report.svg @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/insert/sub_report_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/insert/sub_report_disable.svg new file mode 100755 index 0000000000..377745a5a2 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/insert/sub_report_disable.svg @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/insert/text.svg b/designer-base/src/main/resources/com/fine/theme/icon/insert/text.svg new file mode 100755 index 0000000000..219db75d15 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/insert/text.svg @@ -0,0 +1,8 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/insert/text_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/insert/text_disable.svg new file mode 100755 index 0000000000..0c37c6af50 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/insert/text_disable.svg @@ -0,0 +1,8 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/merge/merge.svg b/designer-base/src/main/resources/com/fine/theme/icon/merge/merge.svg new file mode 100755 index 0000000000..b6cd00a087 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/merge/merge.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/merge/merge_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/merge/merge_disable.svg new file mode 100755 index 0000000000..b2cb85a43b --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/merge/merge_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/merge/unmerge.svg b/designer-base/src/main/resources/com/fine/theme/icon/merge/unmerge.svg new file mode 100755 index 0000000000..5ba0599225 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/merge/unmerge.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/merge/unmerge_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/merge/unmerge_disable.svg new file mode 100755 index 0000000000..7917ebc5fb --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/merge/unmerge_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/noboder.svg b/designer-base/src/main/resources/com/fine/theme/icon/noboder.svg new file mode 100755 index 0000000000..1fc34c6b0c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/noboder.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/popup/popup.svg b/designer-base/src/main/resources/com/fine/theme/icon/popup/popup.svg new file mode 100755 index 0000000000..b513a4de7f --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/popup/popup.svg @@ -0,0 +1,4 @@ + + + diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/BorderAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/BorderAction.java index 7b7ec644d6..51f556ec2f 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/BorderAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/BorderAction.java @@ -3,10 +3,10 @@ */ package com.fr.design.actions.cell; +import com.fine.theme.icon.LazyIcon; import com.fr.base.CellBorderStyle; import com.fr.base.NameStyle; import com.fr.base.Style; -import com.fr.base.svg.IconUtils; import com.fr.design.actions.ElementCaseAction; import com.fr.design.actions.core.ActionFactory; import com.fr.design.mainframe.ElementCasePane; @@ -60,7 +60,7 @@ public class BorderAction extends ElementCaseAction implements ChangeListener { public JComponent createToolBarComponent() { Object object = this.getValue(UIToolbarBorderButton.class.getName()); if (object == null || !(object instanceof UIToolbarBorderButton)) { - UIToolbarBorderButton borderStylePane = new UIToolbarBorderButton(IconUtils.readIcon("/com/fr/design/standard/noboder"), this.getEditingComponent()); + UIToolbarBorderButton borderStylePane = new UIToolbarBorderButton(new LazyIcon("noboder"), this.getEditingComponent()); this.putValue(UIToolbarBorderButton.class.getName(), borderStylePane); borderStylePane.setEnabled(this.isEnabled()); borderStylePane.set4Toolbar(); diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/UIToolbarBorderButton.java b/designer-realize/src/main/java/com/fr/design/actions/cell/UIToolbarBorderButton.java index 39e3d34266..a5c2c123b1 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/UIToolbarBorderButton.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/UIToolbarBorderButton.java @@ -1,8 +1,7 @@ package com.fr.design.actions.cell; +import com.fine.theme.icon.LazyIcon; import com.fr.base.CellBorderStyle; - -import com.fr.base.svg.IconUtils; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.ibutton.UIButton; @@ -47,7 +46,7 @@ public class UIToolbarBorderButton extends UICombinationButton implements PopupH private JPopupMenu popupWin; public UIToolbarBorderButton(Icon icon, ElementCasePane reportPane) { - super(new UIButton(icon), new UIButton(IconUtils.readIcon("/com/fr/design/standard/popup"))); + super(new UIButton(icon), new UIButton(new LazyIcon("popup"))); this.reportPane = reportPane; } diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/style/AlignmentAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/style/AlignmentAction.java index bcacc413b8..4a87155c26 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/style/AlignmentAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/style/AlignmentAction.java @@ -1,31 +1,29 @@ package com.fr.design.actions.cell.style; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseUtils; import com.fr.base.Style; import com.fr.base.chart.BaseChartCollection; - -import com.fr.base.svg.IconUtils; import com.fr.design.actions.ButtonGroupAction; import com.fr.design.actions.utils.ReportActionUtils; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.mainframe.ElementCasePane; - import com.fr.grid.selection.FloatSelection; import com.fr.grid.selection.Selection; import com.fr.report.cell.FloatElement; import com.fr.report.elementcase.TemplateElementCase; import com.fr.stable.Constants; -import javax.swing.*; +import javax.swing.Icon; public class AlignmentAction extends ButtonGroupAction implements StyleActionInterface { private static final Icon[][] ICONS = new Icon[][]{ - {IconUtils.readIcon("/com/fr/design/standard/cellstyle/h_left"), IconUtils.readIcon("/com/fr/design/standard/cellstyle/h_left_selected.svg")}, - {IconUtils.readIcon("/com/fr/design/standard/cellstyle/h_center"), IconUtils.readIcon("/com/fr/design/standard/cellstyle/h_center_selected.svg")}, - {IconUtils.readIcon("/com/fr/design/standard/cellstyle/h_right"), IconUtils.readIcon("/com/fr/design/standard/cellstyle/h_right_selected.svg")}}; + {new LazyIcon("h_left"), new LazyIcon("h_left")}, + {new LazyIcon("h_center"), new LazyIcon("h_center")}, + {new LazyIcon("h_right"), new LazyIcon("h_right")}}; private static final Integer[] valueArray = new Integer[]{Constants.LEFT, Constants.CENTER, Constants.RIGHT}; diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontBoldAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontBoldAction.java index 906b639d0d..d50a1d2bd3 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontBoldAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontBoldAction.java @@ -3,17 +3,16 @@ */ package com.fr.design.actions.cell.style; +import com.fine.theme.icon.LazyIcon; import com.fr.base.Style; import com.fr.base.core.StyleUtils; -import com.fr.base.svg.IconUtils; import com.fr.design.actions.ToggleButtonUpdateAction; import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.FRFont; - -import javax.swing.*; +import javax.swing.Icon; /** * Bold. @@ -21,7 +20,7 @@ import javax.swing.*; public class ReportFontBoldAction extends AbstractStyleAction implements ToggleButtonUpdateAction { private UIToggleButton button; protected Style style; - private final static Icon[] ICONS = {IconUtils.readIcon("/com/fr/design/standard/bold/bold"), IconUtils.readIcon("/com/fr/design/standard/bold/bold_selected.svg")}; + private final static Icon[] ICONS = {new LazyIcon("bold"), new LazyIcon("bold")}; public ReportFontBoldAction(ElementCasePane t) { super(t); diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontForegroundAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontForegroundAction.java index da974e0b4a..c4ee254d2d 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontForegroundAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontForegroundAction.java @@ -3,10 +3,9 @@ */ package com.fr.design.actions.cell.style; +import com.fine.theme.icon.LazyIcon; import com.fr.base.Style; import com.fr.base.core.StyleUtils; - -import com.fr.base.svg.IconUtils; import com.fr.design.actions.core.ActionFactory; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.style.color.UIToolbarColorButton; @@ -51,7 +50,7 @@ public class ReportFontForegroundAction extends AbstractStyleAction implements C public JComponent createToolBarComponent() { Object object = this.getValue(UIToolbarColorButton.class.getName()); if (object == null || !(object instanceof UIToolbarColorButton)) { - UIToolbarColorButton tbButton = new UIToolbarColorButton(IconUtils.readIcon("/com/fr/design/standard/foreground")); + UIToolbarColorButton tbButton = new UIToolbarColorButton(new LazyIcon("foreground")); this.putValue(UIToolbarColorButton.class.getName(), tbButton); tbButton.set4Toolbar(); tbButton.setEnabled(this.isEnabled()); diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontItalicAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontItalicAction.java index d1558946f6..9174797735 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontItalicAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontItalicAction.java @@ -3,21 +3,20 @@ */ package com.fr.design.actions.cell.style; +import com.fine.theme.icon.LazyIcon; import com.fr.base.Style; import com.fr.base.core.StyleUtils; -import com.fr.base.svg.IconUtils; -import com.fr.general.FRFont; - import com.fr.design.mainframe.ElementCasePane; +import com.fr.general.FRFont; -import javax.swing.*; +import javax.swing.Icon; /** * Bold. */ public class ReportFontItalicAction extends ReportFontBoldAction { - private final static Icon[] ICONS = {IconUtils.readIcon("/com/fr/design/standard/italic/italic"), IconUtils.readIcon("/com/fr/design/standard/italic/italic_selected.svg")}; + private final static Icon[] ICONS = {new LazyIcon("italic"), new LazyIcon("italic")}; public ReportFontItalicAction(ElementCasePane t) { super(t); diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontUnderlineAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontUnderlineAction.java index fdda8dd9cc..a6cb2a09cd 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontUnderlineAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontUnderlineAction.java @@ -3,22 +3,21 @@ */ package com.fr.design.actions.cell.style; +import com.fine.theme.icon.LazyIcon; import com.fr.base.Style; import com.fr.base.core.StyleUtils; -import com.fr.base.svg.IconUtils; -import com.fr.general.FRFont; - import com.fr.design.mainframe.ElementCasePane; +import com.fr.general.FRFont; import com.fr.stable.Constants; -import javax.swing.*; +import javax.swing.Icon; /** * Bold. */ public class ReportFontUnderlineAction extends ReportFontBoldAction { - private final static Icon[] ICONS = {IconUtils.readIcon("/com/fr/design/standard/underline/underline"), IconUtils.readIcon("/com/fr/design/standard/underline/underline_selected.svg")}; + private final static Icon[] ICONS = {new LazyIcon("underline"), new LazyIcon("underline")}; public ReportFontUnderlineAction(ElementCasePane t) { super(t); diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/style/StyleBackgroundAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/style/StyleBackgroundAction.java index b2b00482c6..597a03fcb6 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/style/StyleBackgroundAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/style/StyleBackgroundAction.java @@ -3,21 +3,18 @@ */ package com.fr.design.actions.cell.style; -import java.awt.Color; - -import javax.swing.JComponent; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - +import com.fine.theme.icon.LazyIcon; import com.fr.base.Style; import com.fr.base.background.ColorBackground; - -import com.fr.base.svg.IconUtils; import com.fr.design.actions.core.ActionFactory; -import com.fr.general.ComparatorUtils; - import com.fr.design.mainframe.ElementCasePane; import com.fr.design.style.color.UIToolbarColorButton; +import com.fr.general.ComparatorUtils; + +import javax.swing.JComponent; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.Color; /** * Background. @@ -60,7 +57,7 @@ public class StyleBackgroundAction extends AbstractStyleAction implements Change public JComponent createToolBarComponent() { Object object = this.getValue(UIToolbarColorButton.class.getName()); if (object == null || !(object instanceof UIToolbarColorButton)) { - UIToolbarColorButton tbButton = new UIToolbarColorButton(IconUtils.readIcon("com/fr/design/standard/background")); + UIToolbarColorButton tbButton = new UIToolbarColorButton(new LazyIcon("background")); tbButton.set4Toolbar(); this.putValue(UIToolbarColorButton.class.getName(), tbButton); diff --git a/designer-realize/src/main/java/com/fr/design/actions/edit/merge/MergeCellAction.java b/designer-realize/src/main/java/com/fr/design/actions/edit/merge/MergeCellAction.java index fcf5e2bb2c..7903b68d83 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/edit/merge/MergeCellAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/edit/merge/MergeCellAction.java @@ -4,9 +4,10 @@ package com.fr.design.actions.edit.merge; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.ElementCaseAction; -import com.fr.design.menu.KeySetUtils; import com.fr.design.mainframe.ElementCasePane; +import com.fr.design.menu.KeySetUtils; /** * merge cell.. @@ -21,7 +22,7 @@ public class MergeCellAction extends ElementCaseAction { this.setMenuKeySet(KeySetUtils.MERGE_CELL); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/standard/merge/merge"); + this.setSmallIcon(new LazyIcon("merge")); } /** diff --git a/designer-realize/src/main/java/com/fr/design/actions/edit/merge/UnmergeCellAction.java b/designer-realize/src/main/java/com/fr/design/actions/edit/merge/UnmergeCellAction.java index f2b967925d..d75644b923 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/edit/merge/UnmergeCellAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/edit/merge/UnmergeCellAction.java @@ -4,9 +4,10 @@ package com.fr.design.actions.edit.merge; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.ElementCaseAction; -import com.fr.design.menu.KeySetUtils; import com.fr.design.mainframe.ElementCasePane; +import com.fr.design.menu.KeySetUtils; /** * unmerge cell.. @@ -20,7 +21,7 @@ public class UnmergeCellAction extends ElementCaseAction { this.setMenuKeySet(KeySetUtils.UNMERGE_CELL); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/standard/unmerge/unmerge"); + this.setSmallIcon(new LazyIcon("unmerge")); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/BiasCellAction.java b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/BiasCellAction.java index efee97ad25..a9d763ef72 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/BiasCellAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/BiasCellAction.java @@ -4,10 +4,10 @@ package com.fr.design.actions.insert.cell; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.core.WorkBookSupportable; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.menu.MenuKeySet; - import com.fr.report.cell.painter.BiasTextPainter; import javax.swing.KeyStroke; @@ -30,7 +30,7 @@ public class BiasCellAction extends AbstractCellAction implements WorkBookSuppor this.setMenuKeySet(INSERT_SLOPE_LINE); this.setName(getMenuKeySet().getMenuKeySetName()+ "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/standard/bias/bias"); + this.setSmallIcon(new LazyIcon("bias")); } public static final MenuKeySet INSERT_SLOPE_LINE = new MenuKeySet() { diff --git a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/ChartCellAction.java b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/ChartCellAction.java index 205d39eac3..92b211493c 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/ChartCellAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/ChartCellAction.java @@ -4,13 +4,13 @@ package com.fr.design.actions.insert.cell; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.core.ActionFactory; import com.fr.design.actions.core.WorkBookSupportable; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.menu.MenuKeySet; - -import javax.swing.*; +import javax.swing.KeyStroke; /** * . @@ -29,7 +29,7 @@ public class ChartCellAction extends AbstractCellAction implements WorkBookSuppo this.setMenuKeySet(INSERT_CHART); this.setName(getMenuKeySet().getMenuKeySetName()+ "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/standard/chart/chart"); + this.setSmallIcon(new LazyIcon("chart")); } public static final MenuKeySet INSERT_CHART = new MenuKeySet() { diff --git a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/DSColumnCellAction.java b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/DSColumnCellAction.java index 56d1d8b91d..17b80cb0fe 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/DSColumnCellAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/DSColumnCellAction.java @@ -1,6 +1,7 @@ package com.fr.design.actions.insert.cell; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.core.WorkBookSupportable; import com.fr.design.dscolumn.DSColumnPane; import com.fr.design.mainframe.ElementCasePane; @@ -22,7 +23,7 @@ public class DSColumnCellAction extends AbstractCellAction implements WorkBookSu this.setMenuKeySet(KeySetUtils.INSERT_DATA_COLUMN); this.setName(getMenuKeySet().getMenuKeySetName() + "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/standard/bindcolunm/bind_column"); + this.setSmallIcon(new LazyIcon("bind_column")); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/FormulaCellAction.java b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/FormulaCellAction.java index 4cfa7ad740..8def3b526a 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/FormulaCellAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/FormulaCellAction.java @@ -3,14 +3,13 @@ */ package com.fr.design.actions.insert.cell; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseFormula; - import com.fr.design.actions.core.WorkBookSupportable; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.menu.MenuKeySet; - -import javax.swing.*; +import javax.swing.KeyStroke; public class FormulaCellAction extends AbstractCellAction implements WorkBookSupportable { public FormulaCellAction() { @@ -26,7 +25,7 @@ public class FormulaCellAction extends AbstractCellAction implements WorkBookSup this.setMenuKeySet(INSERT_FORMULA); this.setName(getMenuKeySet().getMenuKeySetName() + "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/standard/formula/formula"); + this.setSmallIcon(new LazyIcon("formula")); } public static final MenuKeySet INSERT_FORMULA = new MenuKeySet() { diff --git a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/GeneralCellAction.java b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/GeneralCellAction.java index 8a9832ba07..1b8dc91170 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/GeneralCellAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/GeneralCellAction.java @@ -4,12 +4,12 @@ package com.fr.design.actions.insert.cell; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.core.WorkBookSupportable; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.menu.MenuKeySet; - -import javax.swing.*; +import javax.swing.KeyStroke; import java.awt.event.ActionEvent; /** @@ -29,7 +29,7 @@ public class GeneralCellAction extends AbstractCellAction implements WorkBookSup this.setMenuKeySet(INSERT_TEXT); this.setName(getMenuKeySet().getMenuKeySetName() + "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/standard/text/text"); + this.setSmallIcon(new LazyIcon("text")); } public static final MenuKeySet INSERT_TEXT = new MenuKeySet() { diff --git a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/ImageCellAction.java b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/ImageCellAction.java index 5272909aee..311eb803d9 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/ImageCellAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/ImageCellAction.java @@ -4,13 +4,13 @@ package com.fr.design.actions.insert.cell; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.core.WorkBookSupportable; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.menu.MenuKeySet; - -import javax.swing.*; -import java.awt.*; +import javax.swing.KeyStroke; +import java.awt.Image; /** * Image @@ -29,7 +29,7 @@ public class ImageCellAction extends AbstractCellAction implements WorkBookSuppo this.setMenuKeySet(INSERT_IMAGE); this.setName(getMenuKeySet().getMenuKeySetName() + "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/standard/image/image"); + this.setSmallIcon(new LazyIcon("image")); } public static final MenuKeySet INSERT_IMAGE = new MenuKeySet() { diff --git a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/RichTextCellAction.java b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/RichTextCellAction.java index e33d60d194..cf6ef01c49 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/RichTextCellAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/RichTextCellAction.java @@ -1,11 +1,11 @@ package com.fr.design.actions.insert.cell; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.core.WorkBookSupportable; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.menu.MenuKeySet; import com.fr.general.ComparatorUtils; - import com.fr.report.cell.cellattr.core.RichText; import javax.swing.KeyStroke; @@ -25,7 +25,7 @@ public class RichTextCellAction extends AbstractCellAction implements WorkBookSu this.setMenuKeySet(INSERT_RICHTEXT); this.setName(getMenuKeySet().getMenuKeySetName() + "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/standard/richtext/richtext"); + this.setSmallIcon(new LazyIcon("richtext")); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/SubReportCellAction.java b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/SubReportCellAction.java index 9081b67121..0185452389 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/SubReportCellAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/SubReportCellAction.java @@ -1,10 +1,10 @@ package com.fr.design.actions.insert.cell; +import com.fine.theme.icon.LazyIcon; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.menu.MenuKeySet; import com.fr.general.ComparatorUtils; - import com.fr.report.cell.cellattr.core.SubReport; import javax.swing.KeyStroke; @@ -24,7 +24,7 @@ public class SubReportCellAction extends AbstractCellAction { this.setMenuKeySet(INSERT_SUB_REPORT); this.setName(getMenuKeySet().getMenuKeySetName() + "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/standard/subreport/sub_report"); + this.setSmallIcon(new LazyIcon("sub_report")); } public static final MenuKeySet INSERT_SUB_REPORT = new MenuKeySet() { From bda5a9fab625b136cb92ac6b24378102a38a4d79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Mon, 4 Dec 2023 16:27:10 +0800 Subject: [PATCH 014/302] =?UTF-8?q?REPORT-107972=20=E3=80=90UI=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E3=80=91=E7=BF=BB=E6=96=B0=E5=BA=95=E9=83=A8SheetTab?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 38 ++++ .../theme/light/ui}/UIFlatTreeUI.java | 2 +- .../resources/com/fine/theme/icon/add.svg | 5 + .../com/fine/theme/icon/add_disable.svg | 5 + .../com/fine/theme/icon/drag_left.svg | 5 + .../com/fine/theme/icon/drag_right.svg | 5 + .../icon/propertiestab/authorityedit.svg | 7 + .../propertiestab/authorityedit_disabled.svg | 8 + .../propertiestab/authorityedit_selected.svg | 7 + .../theme/icon/propertiestab/cellattr.svg | 6 + .../icon/propertiestab/cellattr_disabled.svg | 6 + .../icon/propertiestab/cellattr_selected.svg | 8 + .../theme/icon/propertiestab/cellelement.svg | 3 + .../propertiestab/cellelement_disabled.svg | 3 + .../propertiestab/cellelement_selected.svg | 6 + .../icon/propertiestab/conditionattr.svg | 3 + .../propertiestab/conditionattr_disabled.svg | 3 + .../propertiestab/conditionattr_selected.svg | 5 + .../icon/propertiestab/configuredroles.svg | 7 + .../configuredroles_disabled.svg | 7 + .../configuredroles_selected.svg | 7 + .../theme/icon/propertiestab/floatelement.svg | 10 + .../propertiestab/floatelement_disabled.svg | 10 + .../propertiestab/floatelement_selected.svg | 14 ++ .../icon/propertiestab/hyperLink_selected.svg | 5 + .../theme/icon/propertiestab/hyperlink.svg | 4 + .../icon/propertiestab/hyperlink_disabled.svg | 4 + .../theme/icon/propertiestab/widgetlib.svg | 5 + .../icon/propertiestab/widgetlib_disabled.svg | 5 + .../icon/propertiestab/widgetlib_selected.svg | 8 + .../icon/propertiestab/widgetsettings.svg | 10 + .../propertiestab/widgetsettings_disabled.svg | 6 + .../propertiestab/widgetsettings_selected.svg | 8 + .../com/fine/theme/icon/sheet/add_frm.svg | 20 ++ .../fine/theme/icon/sheet/add_frm_disable.svg | 24 +++ .../com/fine/theme/icon/sheet/add_sheet.svg | 24 +++ .../theme/icon/sheet/add_sheet_disable.svg | 20 ++ .../light/ui/laf/FineLightLaf.properties | 20 +- .../fr/design/mainframe/SheetNameTabPane.java | 187 +++++------------- 39 files changed, 394 insertions(+), 136 deletions(-) rename designer-base/src/main/java/com/{fr/design/gui/itree => fine/theme/light/ui}/UIFlatTreeUI.java (95%) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/add.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/add_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/drag_left.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/drag_right.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit_disabled.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit_selected.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellattr.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellattr_disabled.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellattr_selected.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellelement.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellelement_disabled.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellelement_selected.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/conditionattr.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/conditionattr_disabled.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/conditionattr_selected.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles_disabled.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles_selected.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/floatelement.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/floatelement_disabled.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/floatelement_selected.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/hyperLink_selected.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/hyperlink.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/hyperlink_disabled.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetlib.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetlib_disabled.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetlib_selected.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetsettings.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetsettings_disabled.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetsettings_selected.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/sheet/add_frm.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/sheet/add_frm_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/sheet/add_sheet.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/sheet/add_sheet_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 9af2a3dff6..9e9c6b97bd 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -31,6 +31,9 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("template_theme", "com/fine/theme/icon/template_theme.svg", true), new SvgIconSource("remove", "com/fine/theme/icon/remove.svg", true), new SvgIconSource("search", "com/fine/theme/icon/search.svg", true), + new SvgIconSource("add", "com/fine/theme/icon/add.svg", true), + new SvgIconSource("drag_left", "com/fine/theme/icon/drag_left.svg", true), + new SvgIconSource("drag_right", "com/fine/theme/icon/drag_right.svg", true), // 数据集相关Icon new SvgIconSource("database", "com/fine/theme/icon/dataset/database.svg", true), @@ -65,6 +68,41 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("refresh", "com/fine/theme/icon/filetree/refresh.svg", true), new SvgIconSource("new_folder", "com/fine/theme/icon/filetree/new_folder.svg", true), + // 属性面板Icon + new SvgIconSource("cellattr", "com/fine/theme/icon/propertiestab/cellattr.svg", false), + new SvgIconSource("cellattr_disabled", "com/fine/theme/icon/propertiestab/cellattr_disabled.svg", false), + new SvgIconSource("cellattr_selected", "com/fine/theme/icon/propertiestab/cellattr_selected.svg", false), + new SvgIconSource("cellelement", "com/fine/theme/icon/propertiestab/cellelement.svg", false), + new SvgIconSource("cellelement_disabled", "com/fine/theme/icon/propertiestab/cellelement_disabled.svg", false), + new SvgIconSource("cellelement_selected", "com/fine/theme/icon/propertiestab/cellelement_selected.svg", false), + new SvgIconSource("conditionattr", "com/fine/theme/icon/propertiestab/conditionattr.svg", false), + new SvgIconSource("conditionattr_disabled", "com/fine/theme/icon/propertiestab/conditionattr_disabled.svg", false), + new SvgIconSource("conditionattr_selected", "com/fine/theme/icon/propertiestab/conditionattr_selected.svg", false), + new SvgIconSource("floatelement", "com/fine/theme/icon/propertiestab/floatelement.svg", false), + new SvgIconSource("floatelement_disabled", "com/fine/theme/icon/propertiestab/floatelement_disabled.svg", false), + new SvgIconSource("floatelement_selected", "com/fine/theme/icon/propertiestab/floatelement_selected.svg", false), + new SvgIconSource("hyperlink", "com/fine/theme/icon/propertiestab/hyperlink.svg", false), + new SvgIconSource("hyperlink_disabled", "com/fine/theme/icon/propertiestab/hyperlink_disabled.svg", false), + new SvgIconSource("hyperlink_selected", "com/fine/theme/icon/propertiestab/hyperlink_selected.svg", false), + new SvgIconSource("widgetlib", "com/fine/theme/icon/propertiestab/widgetlib.svg", false), + new SvgIconSource("widgetlib_disabled", "com/fine/theme/icon/propertiestab/widgetlib_disabled.svg", false), + new SvgIconSource("widgetlib_selected", "com/fine/theme/icon/propertiestab/widgetlib_selected.svg", false), + new SvgIconSource("widgetsettings", "com/fine/theme/icon/propertiestab/widgetsettings.svg", false), + new SvgIconSource("widgetsettings_disabled", "com/fine/theme/icon/propertiestab/widgetsettings_disabled.svg", false), + new SvgIconSource("widgetsettings_selected", "com/fine/theme/icon/propertiestab/widgetsettings_selected.svg", false), + // TODO: 视觉未提供,先用旧的,待视觉提供后替换 + new SvgIconSource("configuredroles", "com/fine/theme/icon/propertiestab/configuredroles.svg", false), + new SvgIconSource("configuredroles_selected", "com/fine/theme/icon/propertiestab/configuredroles_selected.svg", false), + new SvgIconSource("configuredroles_disabled", "com/fine/theme/icon/propertiestab/configuredroles_disabled.svg", false), + new SvgIconSource("authorityedit", "com/fine/theme/icon/propertiestab/authorityedit.svg", false), + new SvgIconSource("authorityedit_disabled", "com/fine/theme/icon/propertiestab/authorityedit_disabled.svg", false), + new SvgIconSource("authorityedit_selected", "com/fine/theme/icon/propertiestab/authorityedit_selected.svg", false), + + // sheet标签栏相关icon + new SvgIconSource("add_worksheet", "com/fine/theme/icon/sheet/add_sheet.svg", true), + // TODO: 待视觉提供后替换 + new SvgIconSource("add_polysheet", "com/fine/theme/icon/sheet/add_frm.svg", true), + // CheckBox相关Icon new SvgIconSource("checkbox_checked", "com/fine/theme/icon/checkbox/checked.svg", true), new SvgIconSource("checkbox_unchecked", "com/fine/theme/icon/checkbox/unchecked.svg", true), diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/UIFlatTreeUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/UIFlatTreeUI.java similarity index 95% rename from designer-base/src/main/java/com/fr/design/gui/itree/UIFlatTreeUI.java rename to designer-base/src/main/java/com/fine/theme/light/ui/UIFlatTreeUI.java index d8d9546a25..2b9a12852e 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/UIFlatTreeUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/UIFlatTreeUI.java @@ -1,4 +1,4 @@ -package com.fr.design.gui.itree; +package com.fine.theme.light.ui; import com.fine.theme.icon.LazyIcon; import com.formdev.flatlaf.ui.FlatTreeUI; diff --git a/designer-base/src/main/resources/com/fine/theme/icon/add.svg b/designer-base/src/main/resources/com/fine/theme/icon/add.svg new file mode 100644 index 0000000000..24f1235ada --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/add.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/add_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/add_disable.svg new file mode 100644 index 0000000000..b46e7d9a5b --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/add_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/drag_left.svg b/designer-base/src/main/resources/com/fine/theme/icon/drag_left.svg new file mode 100644 index 0000000000..3908d661b3 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/drag_left.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/drag_right.svg b/designer-base/src/main/resources/com/fine/theme/icon/drag_right.svg new file mode 100644 index 0000000000..8a825724ab --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/drag_right.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit.svg new file mode 100644 index 0000000000..b7000e6f96 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit.svg @@ -0,0 +1,7 @@ + + + icon_属性_权限编辑_normal + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit_disabled.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit_disabled.svg new file mode 100644 index 0000000000..7df1acf348 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit_disabled.svg @@ -0,0 +1,8 @@ + + + icon_属性_权限编辑_disabled + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit_selected.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit_selected.svg new file mode 100644 index 0000000000..e70df0a896 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit_selected.svg @@ -0,0 +1,7 @@ + + + icon_属性_权限编辑_selected + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellattr.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellattr.svg new file mode 100644 index 0000000000..cfb36fc85d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellattr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellattr_disabled.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellattr_disabled.svg new file mode 100644 index 0000000000..a1150442f7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellattr_disabled.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellattr_selected.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellattr_selected.svg new file mode 100644 index 0000000000..17706fc98d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellattr_selected.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellelement.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellelement.svg new file mode 100644 index 0000000000..e152ee4c18 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellelement.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellelement_disabled.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellelement_disabled.svg new file mode 100644 index 0000000000..0aafcc1d1c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellelement_disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellelement_selected.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellelement_selected.svg new file mode 100644 index 0000000000..cb613c2c1f --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/cellelement_selected.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/conditionattr.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/conditionattr.svg new file mode 100644 index 0000000000..d0497406f7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/conditionattr.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/conditionattr_disabled.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/conditionattr_disabled.svg new file mode 100644 index 0000000000..7c5064a191 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/conditionattr_disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/conditionattr_selected.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/conditionattr_selected.svg new file mode 100644 index 0000000000..9a85985534 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/conditionattr_selected.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles.svg new file mode 100644 index 0000000000..972f102b1d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles.svg @@ -0,0 +1,7 @@ + + + icon_属性_配置角色_normal + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles_disabled.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles_disabled.svg new file mode 100644 index 0000000000..61a2c84fea --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles_disabled.svg @@ -0,0 +1,7 @@ + + + icon_属性_配置角色_disabled + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles_selected.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles_selected.svg new file mode 100644 index 0000000000..74eef28bb3 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles_selected.svg @@ -0,0 +1,7 @@ + + + icon_属性_配置角色_selected + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/floatelement.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/floatelement.svg new file mode 100644 index 0000000000..4ef1ef8734 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/floatelement.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/floatelement_disabled.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/floatelement_disabled.svg new file mode 100644 index 0000000000..0c8a5296ed --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/floatelement_disabled.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/floatelement_selected.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/floatelement_selected.svg new file mode 100644 index 0000000000..1cbe48bfb2 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/floatelement_selected.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/hyperLink_selected.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/hyperLink_selected.svg new file mode 100644 index 0000000000..582f97a227 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/hyperLink_selected.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/hyperlink.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/hyperlink.svg new file mode 100644 index 0000000000..474c6e9fa8 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/hyperlink.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/hyperlink_disabled.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/hyperlink_disabled.svg new file mode 100644 index 0000000000..ea0b21353a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/hyperlink_disabled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetlib.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetlib.svg new file mode 100644 index 0000000000..ff3df716ed --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetlib.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetlib_disabled.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetlib_disabled.svg new file mode 100644 index 0000000000..cd65358eda --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetlib_disabled.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetlib_selected.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetlib_selected.svg new file mode 100644 index 0000000000..d27dbe70d4 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetlib_selected.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetsettings.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetsettings.svg new file mode 100644 index 0000000000..1ed6e9fa32 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetsettings.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetsettings_disabled.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetsettings_disabled.svg new file mode 100644 index 0000000000..7cd626f1c5 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetsettings_disabled.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetsettings_selected.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetsettings_selected.svg new file mode 100644 index 0000000000..04168614f9 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/widgetsettings_selected.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/sheet/add_frm.svg b/designer-base/src/main/resources/com/fine/theme/icon/sheet/add_frm.svg new file mode 100644 index 0000000000..db67adf7c2 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/sheet/add_frm.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/sheet/add_frm_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/sheet/add_frm_disable.svg new file mode 100644 index 0000000000..209f893dc5 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/sheet/add_frm_disable.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/sheet/add_sheet.svg b/designer-base/src/main/resources/com/fine/theme/icon/sheet/add_sheet.svg new file mode 100644 index 0000000000..e3a3b480e9 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/sheet/add_sheet.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/sheet/add_sheet_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/sheet/add_sheet_disable.svg new file mode 100644 index 0000000000..f40b7d35e1 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/sheet/add_sheet_disable.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index cee3a00b75..3695d23491 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -84,7 +84,7 @@ ToggleButtonUI = com.fine.theme.light.ui.FineToggleButtonUI ToolBarUI = com.formdev.flatlaf.ui.FlatToolBarUI ToolBarSeparatorUI = com.formdev.flatlaf.ui.FlatToolBarSeparatorUI ToolTipUI = com.formdev.flatlaf.ui.FlatToolTipUI -TreeUI = com.fr.design.gui.itree.UIFlatTreeUI +TreeUI = com.fine.theme.light.ui.UIFlatTreeUI ViewportUI = com.formdev.flatlaf.ui.FlatViewportUI @@ -155,7 +155,14 @@ inactiveCaption = #bfcddb controlHighlight = lighten($controlShadow,12%) controlLtHighlight = lighten($controlShadow,25%) controlDkShadow = darken($controlShadow,15%) +DarkenedFontColor = #091E40 +DesignerSpaceColor = #FFF +# ---- MainWorkArea ---- + +CenterOuterShadowColor = #F2F4F8 +ZoneBorderColor = #E6E9EF +GridColumnRowColor = #F8F9FC #---- Button ---- @@ -1054,7 +1061,16 @@ Tree.icon.openColor = @icon Tree.hash = darken($Tree.background,10%) #---- East ---- -East.border = #E9EDF2 +East.border = #DADEE7 +East.TabSelectedColor = #B3CFF9 + +#---- South ---- +South.SheetTabRadius = 6 +South.SheetTabButtonGap = 20 +South.SheetIconSepDistance = 16 +South.SheetBarHeight = 24 +South.SheetAddWidth = 6 +South.SheetIconGap = 5 #---- Styles ------------------------------------------------------------------ diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java index c971264b9b..f0f1cbf46c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.base.GraphHelper; import com.fr.base.svg.IconUtils; import com.fr.base.theme.ReportTheme; @@ -19,7 +20,6 @@ import com.fr.design.roleAuthority.ReportAndFSManagePane; import com.fr.design.roleAuthority.RolesAlreadyEditedPane; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; -import com.fr.general.IOUtils; import com.fr.main.impl.WorkBook; import com.fr.poly.PolyDesigner; import com.fr.report.poly.PolyWorkSheet; @@ -37,7 +37,7 @@ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; -import java.awt.GradientPaint; +import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; @@ -49,8 +49,7 @@ import java.awt.event.ComponentListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; -import java.awt.geom.GeneralPath; -import java.awt.geom.Path2D; +import java.awt.geom.RoundRectangle2D; import java.util.ArrayList; import java.util.List; @@ -62,29 +61,32 @@ import java.util.List; */ public class SheetNameTabPane extends JComponent implements MouseListener, MouseMotionListener, RemoveListener { - private static final Color LINE_COLOR = new Color(0xababab); + private static final Color BORDER_COLOR = UIManager.getColor("ZoneBorderColor"); + private static final Color BACKGROUND_COLOR = UIManager.getColor("CenterOuterShadowColor"); + private static final Color SELECTED_COLOR = UIManager.getColor("DesignerSpaceColor"); + private static final Color FONT_COLOR = UIManager.getColor("DarkenedFontColor"); - private static final Icon ADD_WORK_SHEET = IconUtils.readIcon("/com/fr/design/standard/add_worksheet"); - protected static final Icon ADD_POLY_SHEET = IconUtils.readIcon("/com/fr/design/standard/add_polysheet"); - private static final Icon WORK_SHEET_ICON = IconUtils.readIcon("/com/fr/design/standard/worksheet"); - private static final Icon POLY_SHEET_ICON = IconUtils.readIcon("/com/fr/design/standard/polysheet"); + private static final Icon ADD_WORK_SHEET = new LazyIcon("add_worksheet"); + protected static final Icon ADD_POLY_SHEET = new LazyIcon("add_polysheet"); + + // TODO: 视觉未提供 private static final Icon LEFT_ICON = IconUtils.readIcon("/com/fr/design/standard/prepage/pre_page"); private static final Icon RIGHT_ICON = IconUtils.readIcon("/com/fr/design/standard/nextpage/next_page"); private static final Icon DISABLED_LEFT_ICON = IconUtils.readIcon("/com/fr/design/standard/prepage/pre_page_disabled.svg"); private static final Icon DISABLED_RIGHT_ICON = IconUtils.readIcon("/com/fr/design/standard/nextpage/next_page_disabled.svg"); + private static final int NUM = 10; - private static final int ICON_SEP_DISTANCE = 8; - private static final int TOOLBAR_HEIGHT = 16; - private static final int ADD_WIDTH_BY_SHEETNAME = 20; //sheet名字的文本到图标边框的距离 private static final int GRID_TOSHEET_RIGHT = 20; // 添加grid按钮右侧距sheet面板右侧的距离 private static final int POLY_TOSHEET_LEFT = 30; // 添加poly按钮左侧距sheet面板右侧的距离 private static final int POLY_TOSHEET_RIGHT = 50; // 添加poly按钮右侧距sheet面板右侧的距离 - private static final int SHEET_ICON_GAP = 5; // 每个sheet图标之间的距离 - private static final int GRAP = 12; // 给两个添加按钮与其他组件预留的间隔 - private static final int LEFT_CORNOR = 0;// 左角落. - private static final int RIGHT_CORNOR = 0;// 右角落 + private static final int ICON_SEP_DISTANCE = UIManager.getInt("South.SheetIconSepDistance"); + private static final int SHEET_ICON_GAP = UIManager.getInt("South.SheetIconGap"); // 每个sheet图标之间的距离 + private static final int TOOLBAR_HEIGHT = UIManager.getInt("South.SheetBarHeight"); + private static final int ADD_WIDTH_BY_SHEETNAME = UIManager.getInt("South.SheetAddWidth"); //sheet名字的文本到图标边框的距离 + private static final int TAB_BUTTON_GAP = UIManager.getInt("South.SheetTabButtonGap"); // 两个添加按钮与其他组件预留的间隔 + private static final int SHEET_TAB_RADIUS = UIManager.getInt("South.SheetTabRadius"); // sheet标签栏圆角属性 /** * 左移和右移按钮 @@ -158,25 +160,14 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse this.addMouseListener(this); this.addMouseMotionListener(this); this.setBorder(null); - this.setForeground(new Color(99, 99, 99)); + this.setForeground(FONT_COLOR); + this.setBackground(BACKGROUND_COLOR); leftButton = new UIButton(LEFT_ICON) { @Override public Dimension getPreferredSize() { return new Dimension(super.getPreferredSize().width, TOOLBAR_HEIGHT); } }; -// leftButton.setUI(new UIButtonUI() { -// @Override -// protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) { -// if (isPressed(b) && b.isPressedPainted()) { -// GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), UIConstants.PROPERTY_PANE_BACKGROUND); -// } else if (isRollOver(b)) { -// GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), UIConstants.PROPERTY_PANE_BACKGROUND); -// } else if (b.isNormalPainted()) { -// GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted()); -// } -// } -// }); leftButton.set4ToolbarButton(); leftButton.setDisabledIcon(DISABLED_LEFT_ICON); rightButton = new UIButton(RIGHT_ICON) { @@ -185,18 +176,6 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse return new Dimension(super.getPreferredSize().width, TOOLBAR_HEIGHT); } }; -// rightButton.setUI(new UIButtonUI() { -// @Override -// protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) { -// if (isPressed(b) && b.isPressedPainted()) { -// GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), UIConstants.PROPERTY_PANE_BACKGROUND); -// } else if (isRollOver(b)) { -// GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), UIConstants.PROPERTY_PANE_BACKGROUND); -// } else if (b.isNormalPainted()) { -// GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted()); -// } -// } -// }); rightButton.set4ToolbarButton(); rightButton.setDisabledIcon(DISABLED_RIGHT_ICON); buttonPane = new JPanel(new BorderLayout(3, 0)); @@ -347,13 +326,11 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse public Icon getAddWorkSheet(){ return ADD_WORK_SHEET; } - public Icon getWorkSheetIcon(){ - return WORK_SHEET_ICON; - } - @Override + /** * 画Tab */ + @Override public void paintComponent(Graphics g) { super.paintComponent(g); isAuthorityEditing = DesignerMode.isAuthorityEditing(); @@ -366,7 +343,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse double textHeight = this.getSize().getHeight() - 1; widthArray = calculateWidthArray(); - int operationWidth = GRAP + getAddWorkSheet().getIconWidth() + ICON_SEP_DISTANCE + ADD_POLY_SHEET.getIconWidth(); + int operationWidth = TAB_BUTTON_GAP + getAddWorkSheet().getIconWidth() + ICON_SEP_DISTANCE + ADD_POLY_SHEET.getIconWidth(); double maxWidth = getWidth() - operationWidth - buttonPane.getWidth();// 最大宽度 paintBackgroundAndLine(g2d, textHeight, maxWidth, charWidth, textAscent); checkButton(showCount < widthArray.length); @@ -389,7 +366,6 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse WorkBook workBook = reportComposite.getEditingWorkBook(); int reportCount = workBook.getReportCount(); double textX = 0; - Icon sheeticon; for (int i = scrollIndex; i < reportCount; i++) { lastOneIndex = i; TemplateReport templateReport = workBook.getTemplateReport(i); @@ -398,13 +374,11 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse String selectedRoles = ReportAndFSManagePane.getInstance().getRoleTree().getSelectedRoleName(); isNeedPaintedAuthority = templateReport.getWorkSheetPrivilegeControl().checkInvisible(selectedRoles); } - sheeticon = templateReport instanceof WorkSheet ? getWorkSheetIcon() : POLY_SHEET_ICON; String sheetName = workBook.getReportName(i); - if (i == selectedIndex) { - paintSelectedTab(g2d, sheeticon, textHeight, textX, sheetName, charWidth, textAscent, isNeedPaintedAuthority); - } else { - paintUnSelectedTab(g2d, sheeticon, textHeight, textX, sheetName, charWidth, textAscent, i, isNeedPaintedAuthority); - } + + boolean selected = i == selectedIndex; + paintTab(g2d, textHeight, textX, sheetName, charWidth, textAscent, i, isNeedPaintedAuthority, selected); + int width = widthArray[i]; textX += width + 1; addIconlocation += width; @@ -423,7 +397,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse } // 画两个添加sheet图标 - iconLocation = isOvertakeWidth ? (int) (maxWidth) : addIconlocation + GRAP; + iconLocation = isOvertakeWidth ? (int) (maxWidth) : addIconlocation + TAB_BUTTON_GAP; paintAddButton(g2d); } @@ -433,78 +407,29 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse ADD_POLY_SHEET.paintIcon(this, g2d, iconLocation + getAddWorkSheet().getIconWidth() + ICON_SEP_DISTANCE, 3); } - /** - * 画选中的tab - * - * @param g2d - * @param sheeticon - * @param textHeight - * @param textX - * @param sheetName - * @param charWidth - * @param textAscent - */ - private void paintSelectedTab(Graphics2D g2d, Icon sheeticon, double textHeight, double textX, String sheetName, int charWidth, int textAscent, boolean isNeedPaintAuthority) { - double[] x = {textX, textX, textX + LEFT_CORNOR, textX + widthArray[selectedIndex] - RIGHT_CORNOR, textX + widthArray[selectedIndex] + RIGHT_CORNOR}; - double[] y = {0, textHeight - LEFT_CORNOR, textHeight, textHeight, 0}; - if (isNeedPaintAuthority) { - g2d.setPaint(new GradientPaint(1, 1, UIConstants.AUTHORITY_SHEET_LIGHT, 1, getHeight() - 1, UIConstants.AUTHORITY_SHEET_DARK)); - } else { - g2d.setPaint(new GradientPaint(1, 1, getBackground(), 1, getHeight() - 1, getBackground())); - } - GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, x.length); - generalPath.moveTo((float) x[0], (float) y[0]); - for (int index = 1; index < x.length; index++) { - generalPath.lineTo((float) x[index], (float) y[index]); + private void paintTab(Graphics2D g2d, double textHeight, double textX, String sheetName, int charWidth, int textAscent, int i, boolean isNeedPaintAuthority, boolean isSelected) { + + Color backgroundColor = isSelected ? SELECTED_COLOR: (isNeedPaintAuthority ? UIConstants.AUTHORITY_SHEET_UNSELECTED : getBackground()); + g2d.setColor(backgroundColor); + + // 绘制圆角矩形背景 + if (isSelected) { + FlatUIUtils.setRenderingHints(g2d); + + int width = widthArray[i]; + int height = (int) textHeight + SHEET_TAB_RADIUS; + RoundRectangle2D.Double backgroundRect = new RoundRectangle2D.Double(textX, -10, width, height, SHEET_TAB_RADIUS, SHEET_TAB_RADIUS); + g2d.fill(backgroundRect); + + g2d.setColor(BORDER_COLOR); + g2d.setStroke(new BasicStroke(1)); + g2d.draw(backgroundRect); } - generalPath.closePath(); - g2d.fill(generalPath); - sheeticon.paintIcon(this, g2d, (int) textX + charWidth, 2); - // peter:画字符 - g2d.setPaint(getForeground()); - GraphHelper.drawString(g2d, sheetName, (int) textX + charWidth + 14, textAscent); - } - /** - * 画不是选中状态的tab - * - * @param g2d - * @param sheetIcon - * @param textHeight - * @param textX - * @param sheetName - * @param charWidth - * @param textAscent - * @param i - */ - private void paintUnSelectedTab(Graphics2D g2d, Icon sheetIcon, double textHeight, double textX, String sheetName, int charWidth, int textAscent, int i, boolean isNeedPaintAuthority) { - Color tabBackground = UIConstants.COMBOBOX_BTN_NORMAL; - int width = widthArray[i]; - double[] x = {textX, textX, textX + LEFT_CORNOR, textX + width - RIGHT_CORNOR, textX + width, textX + width}; - double[] y = {0, textHeight - LEFT_CORNOR, textHeight, textHeight, textHeight - RIGHT_CORNOR, 0}; - if (isNeedPaintAuthority) { - g2d.setPaint(UIConstants.AUTHORITY_SHEET_UNSELECTED); - } else{ - g2d.setPaint(getBackground()); - } - GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, x.length); - generalPath.moveTo((float) x[0], (float) y[0]); - - for (int index = 1; index < x.length; index++) { - generalPath.lineTo((float) x[index], (float) y[index]); - } - generalPath.closePath(); - g2d.fill(generalPath); - - g2d.setPaint(LINE_COLOR); - double startX = textX > 0 ? textX - 1 : textX; - g2d.drawRect((int)startX, 0, width, (int)textHeight); - - sheetIcon.paintIcon(this, g2d, (int) textX + charWidth, 2); - g2d.setPaint(getForeground()); - // REPORT-40495 之前的g2d.drawString(),在windows下默认宋体时,无法绘制韩文字符,而GraphHelper的drawString中对韩文做了额外处理,可以绘制韩文字符 - GraphHelper.drawString(g2d, sheetName, (int) textX + charWidth + 14, textAscent); + // 绘制文本 + g2d.setColor(getForeground()); + GraphHelper.drawString(g2d, sheetName, (int) textX + charWidth + 4, textAscent + 2); } /** @@ -529,12 +454,8 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse for (int i = 0; i < selectedIndex; i++) { totalWidth += widthArray[i]; } - int distance = startPointX - totalWidth; - int[] x = {(int) lastPoint.getX() - distance, (int) lastPoint.getX() - distance, (int) lastPoint.getX() - distance + width, (int) lastPoint.getX() + width - distance}; - int[] y = {0, (int) (textHeight), (int) (textHeight), 0}; - g2d.drawPolygon(x, y, 4); // peter:画字符 g2d.setPaint(getForeground()); // richie:把当前选中的workSheet的名字画到鼠标拖动产生的图形上. @@ -799,7 +720,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse protected abstract class SheetInsertAction extends UpdateAction { SheetInsertAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Insert") + getTemplateReportType()); - this.setSmallIcon(IOUtils.readIcon("/com/fr/base/images/cell/control/add.png")); + this.setSmallIcon(new LazyIcon("add")); } @Override @@ -838,7 +759,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse widthArray = calculateWidthArray(); int width = widthArray[i]; textX += width + 1; - int operationWidth = GRAP + getAddWorkSheet().getIconWidth() + ICON_SEP_DISTANCE + ADD_POLY_SHEET.getIconWidth(); + int operationWidth = TAB_BUTTON_GAP + getAddWorkSheet().getIconWidth() + ICON_SEP_DISTANCE + ADD_POLY_SHEET.getIconWidth(); double maxWidth = getWidth() - operationWidth - buttonPane.getWidth();// 最大宽度 if (i < widthArray.length - 1 && textX + widthArray[i + 1] + 1 > maxWidth) { isOvertakeWidth = true; @@ -890,7 +811,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse private class RemoveSheetAction extends UpdateAction { RemoveSheetAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove")); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); + this.setSmallIcon(new LazyIcon("remove")); } @Override @@ -947,7 +868,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse private class RenameSheetAction extends UpdateAction { RenameSheetAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Rename")); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/rename.png")); + this.setSmallIcon(new LazyIcon("rename")); } @Override @@ -981,7 +902,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse private class CopySheetAction extends UpdateAction { CopySheetAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Copy")); - this.setSmallIcon(IOUtils.readIcon("/com/fr/design/images/m_edit/copy.png")); + this.setSmallIcon(new LazyIcon("copy")); } @Override From b71d6f55a6bdc8e16e43d4142380eb93a80f9368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Mon, 4 Dec 2023 16:36:52 +0800 Subject: [PATCH 015/302] =?UTF-8?q?REPORT-107972=20=E3=80=90UI=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E3=80=91=E7=BF=BB=E6=96=B0=E4=B8=9C=E5=8C=BA=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E9=9D=A2=E6=9D=BF=E4=BE=A7=E8=BE=B9=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/PropertiesItemUI.java | 39 +++++++++++++ .../icontainer/UIEastResizableContainer.java | 45 ++++++--------- .../mainframe/EastRegionContainerPane.java | 55 ++++++++----------- 3 files changed, 79 insertions(+), 60 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/PropertiesItemUI.java diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/PropertiesItemUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/PropertiesItemUI.java new file mode 100644 index 0000000000..45ce82d352 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/PropertiesItemUI.java @@ -0,0 +1,39 @@ +package com.fine.theme.light.ui; + +import com.formdev.flatlaf.ui.FlatButtonUI; +import com.formdev.flatlaf.ui.FlatUIUtils; + +import javax.swing.JComponent; +import java.awt.*; + +/** + * 东区属性面板,属性按钮UI + * + * @author Levy.Xie + * @since 11.0 + * Created on 2023/11/30 + */ +public class PropertiesItemUI extends FlatButtonUI { + + + public PropertiesItemUI(boolean shared) { + super(shared); + } + + @Override + protected void paintBackground(Graphics g, JComponent c) { + Color background = getBackground( c ); + if( background == null ) { + return; + } + Graphics2D g2 = (Graphics2D) g.create(); + try { + FlatUIUtils.setRenderingHints( g2 ); + g2.setColor(FlatUIUtils.deriveColor(background, getBackgroundBase(c, true))); + float focusWidth = FlatUIUtils.getBorderFocusWidth( c ); + FlatUIUtils.paintComponentBackground( g2, 0, 0, c.getWidth(), c.getHeight(), focusWidth, 0 ); + } finally { + g2.dispose(); + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java index 6c35310fa4..a366626153 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java @@ -1,23 +1,27 @@ package com.fr.design.gui.icontainer; +import com.fine.theme.icon.LazyIcon; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.layout.VerticalFlowLayout; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.utils.SvgDrawUtils; import com.fr.design.utils.gui.GUICoreUtils; +import javax.swing.BorderFactory; +import javax.swing.UIManager; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; +import javax.swing.Icon; +import javax.swing.border.Border; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; -import java.awt.Image; import java.awt.LayoutManager; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -34,20 +38,18 @@ public class UIEastResizableContainer extends JPanel { private int containerWidth = 240; private int preferredWidth = 240; - private int topToolPaneHeight = 25; + private int topToolPaneHeight = 40; private int leftPaneWidth = 42; private JComponent leftPane; private JComponent rightPane; - // private HorizotalToolPane horizontToolPane; private TopToolPane topToolPane; private static final int ARROW_MARGIN = 15; private static final int ARROW_RANGE = 35; -// private boolean isRightPaneVisible = true; public UIEastResizableContainer() { this(new JPanel(), new JPanel()); @@ -68,21 +70,17 @@ public class UIEastResizableContainer extends JPanel { } -// public void setRightPaneVisible(boolean isVisible){ -// this.isRightPaneVisible = isVisible; -// } private void setPreferredWidth(int width) { this.preferredWidth = width; } public UIEastResizableContainer(JComponent leftPane, JComponent rightPane) { -// setBackground(UIConstants.PROPERTY_PANE_BACKGROUND); this.leftPane = leftPane; this.rightPane = rightPane; - this.topToolPane = new TopToolPane(); -// topToolPane.setBackground(UIConstants.PROPERTY_PANE_BACKGROUND); + topToolPane.setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 1, 0)); + topToolPane.setBorder(BorderFactory.createMatteBorder(1 ,1, 0, 1, UIManager.getColor("East.border"))); setLayout(containerLayout); add(topToolPane); @@ -176,12 +174,8 @@ public class UIEastResizableContainer extends JPanel { if (topToolPane == null || rightPane == null) { return; } - -// topToolPane.setBounds(0, 0, containerWidth, topToolPaneHeight);//0,0,10,462 topToolPane.setBounds(0, 0, leftPaneWidth, topToolPaneHeight);//0,0,10,462 leftPane.setBounds(0, topToolPaneHeight, leftPaneWidth, getHeight() - topToolPaneHeight); - -// parameterPane.setBounds(20, 0, 230, getParameterPaneHeight());//10,0,230,462 rightPane.setBounds(leftPaneWidth, 0, containerWidth - leftPaneWidth, getHeight());//20,0,230,0 } @@ -322,21 +316,18 @@ public class UIEastResizableContainer extends JPanel { @Override public void paint(Graphics g) { - Image button; + // 绘制边框 + Border border = getBorder(); + if (border != null) { + border.paintBorder(this, g, 0, 0, getWidth(), getHeight()); + } + Icon button; if (containerWidth == leftPaneWidth) { - if (model == UIConstants.MODEL_NORMAL) { - button = UIConstants.DRAG_LEFT_NORMAL; - } else { - button = UIConstants.DRAG_LEFT_PRESS; - } + button = new LazyIcon("drag_left"); } else { - if (model == UIConstants.MODEL_NORMAL) { - button = UIConstants.DRAG_RIGHT_NORMAL; - } else { - button = UIConstants.DRAG_RIGHT_PRESS; - } + button = new LazyIcon("drag_right"); } - SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, button, 10, 7, null)); + button.paintIcon(this, g, 12, 12); } } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 9898d606ff..73b37acd6c 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -1,9 +1,10 @@ package com.fr.design.mainframe; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.PropertiesItemUI; import com.formdev.flatlaf.FlatDarkLaf; import com.formdev.flatlaf.ui.FlatLineBorder; import com.fr.base.FRContext; -import com.fr.base.svg.IconUtils; import com.fr.base.vcs.DesignerMode; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; @@ -80,9 +81,9 @@ public class EastRegionContainerPane extends UIEastResizableContainer { private static final int CONTAINER_WIDTH = containerWidth(); private static final int TAB_WIDTH = 42; private static final int TAB_BUTTON_WIDTH = 40; - private static final int TAB_BUTTON_HEIGHT = 34; + private static final int TAB_BUTTON_HEIGHT = 40; private static final int CONTENT_WIDTH = CONTAINER_WIDTH - TAB_WIDTH; - private static final int POPUP_TOOLPANE_HEIGHT = 27; + private static final int POPUP_TOOLPANE_HEIGHT = 40; private static final int ARROW_RANGE_START = CONTENT_WIDTH - 30; // 弹出对话框高度 private static final int POPUP_MIN_HEIGHT = 145; @@ -416,7 +417,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { // 左侧按钮面板 private void initLeftPane() { leftPane = new JPanel(); - leftPane.setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 1, 4)); + leftPane.setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 1, 0)); for (PropertyItem item : propertyItemMap.values()) { if (item.isPoppedOut() || !item.isVisible()) { continue; @@ -767,16 +768,15 @@ public class EastRegionContainerPane extends UIEastResizableContainer { // 完整icon路径为 ICON_BASE_DIR + btnIconName + iconSuffix private static final String ICON_BASE_DIR = "/com/fr/design/standard/propertiestab/"; - private static final String ICON_SUFFIX_NORMAL = "_normal.svg"; - private static final String ICON_SUFFIX_DISABLED = "_disabled.svg"; - private static final String ICON_SUFFIX_SELECTED = "_selected.svg"; + private static final String ICON_SUFFIX_NORMAL = StringUtils.EMPTY; + private static final String ICON_SUFFIX_DISABLED = "_disabled"; + private static final String ICON_SUFFIX_SELECTED = "_selected"; private static final int ICON_WIDTH = 18; private static final int ICON_HEIGHT = 18; private String btnIconName; private String iconBaseDir; private String iconSuffix = ICON_SUFFIX_NORMAL; // normal, diabled, selected, 三者之一 - private final Color selectedBtnBackground = new Color(0xF5F5F7); - private Color originBtnBackground; + private final Color selectedBtnBackground = UIManager.getColor("East.TabSelectedColor"); private ActionListener actionListener; @@ -967,15 +967,18 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } private String getBtnIconUrl() { - return getIconBaseDir() + btnIconName + iconSuffix; } + private String getBtnIconId() { + return btnIconName + iconSuffix; + } + public void resetButtonIcon() { + button.setBackground(null); if (iconSuffix.equals(ICON_SUFFIX_SELECTED)) { iconSuffix = ICON_SUFFIX_NORMAL; - button.setIcon(IconUtils.readIcon(getBtnIconUrl())); -// button.setBackground(originBtnBackground); + button.setIcon(new LazyIcon(getBtnIconId())); button.setOpaque(false); } } @@ -983,8 +986,8 @@ public class EastRegionContainerPane extends UIEastResizableContainer { public void setTabButtonSelected() { resetPropertyIcons(); iconSuffix = ICON_SUFFIX_SELECTED; - button.setIcon(IconUtils.readIcon(getBtnIconUrl())); -// button.setBackground(selectedBtnBackground); + button.setIcon(new LazyIcon(getBtnIconId())); + button.setBackground(selectedBtnBackground); button.setOpaque(true); selectedItem = this; } @@ -994,28 +997,14 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } private void initButton() { - button = new UIButton(IconUtils.readIcon(getBtnIconUrl())) { + button = new UIButton(new LazyIcon(getBtnIconId())) { public Dimension getPreferredSize() { return new Dimension(TAB_BUTTON_WIDTH, TAB_BUTTON_HEIGHT); } }; - button.setDisabledIcon(IconUtils.readIcon(getIconBaseDir() + btnIconName + ICON_SUFFIX_DISABLED)); + button.setDisabledIcon(new LazyIcon(btnIconName + ICON_SUFFIX_DISABLED)); button.set4LargeToolbarButton(); -// button.setUI(new UIButtonUI() { -// @Override -// protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) { -// if (isPressed(b) && b.isPressedPainted()) { -// Color pressColor = isTabButtonSelected() ? UIConstants.TAB_BUTTON_PRESS_SELECTED : UIConstants.TAB_BUTTON_PRESS; -// GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), pressColor); -// } else if (isRollOver(b)) { -// Color hoverColor = isTabButtonSelected() ? UIConstants.TAB_BUTTON_HOVER_SELECTED : UIConstants.TAB_BUTTON_HOVER; -// GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), hoverColor); -// } else if (b.isNormalPainted()) { -// GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted()); -// } -// } -// }); - originBtnBackground = button.getBackground(); + button.setUI(new PropertiesItemUI(false)); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -1284,9 +1273,9 @@ public class EastRegionContainerPane extends UIEastResizableContainer { this.propertyItem = propertyItem; this.title = propertyItem.getTitle(); originColor = UIConstants.UI_TOOLBAR_COLOR; + this.setForeground(UIManager.getColor("DarkenedFontColor")); contentPane = new JPanel(); -// contentPane.setBackground(originColor); contentPane.setLayout(new BorderLayout()); UILabel label = new UILabel(title); contentPane.add(label, BorderLayout.WEST); @@ -1294,7 +1283,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { setLayout(new BorderLayout()); add(contentPane, BorderLayout.CENTER); - setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIConstants.TOOLBAR_BORDER_COLOR)); + setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, UIManager.getColor("East.border"))); initToolButton(buttonType); } From 5abb7c83942f47e2949792fb55f21da8eb2ba707 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Tue, 5 Dec 2023 10:35:55 +0800 Subject: [PATCH 016/302] =?UTF-8?q?REPORT-107973=20=E4=B8=BB=E9=A1=B5?= =?UTF-8?q?=E5=8F=8A=E7=BB=84=E4=BB=B6=E8=A7=86=E8=A7=89=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E7=BF=BB=E6=96=B0=20=E3=80=90=E9=97=AE=E9=A2=98=E5=8E=9F?= =?UTF-8?q?=E5=9B=A0=E3=80=91rt=20=E3=80=90=E6=94=B9=E5=8A=A8=E6=80=9D?= =?UTF-8?q?=E8=B7=AF=E3=80=91=E7=BF=BB=E6=96=B0=E5=8C=97=E5=8C=BA=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 5 +++- .../com/fr/design/gui/imenu/UIHeadMenu.java | 3 ++- .../mainframe/loghandler/LogMessageBar.java | 2 ++ .../ui/NotificationCenterPane.java | 5 ++-- .../theme/icon/notification/notification.svg | 8 +++++++ .../light/ui/laf/FineLightLaf.properties | 10 ++++++++ .../alphafine/component/AlphaFinePane.java | 4 ++-- .../fr/design/mainframe/bbs/UserInfoPane.java | 24 +++++++------------ 8 files changed, 39 insertions(+), 22 deletions(-) create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/notification/notification.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 9e9c6b97bd..e3082321dd 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -131,7 +131,10 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("sub_report", "com/fine/theme/icon/insert/sub_report.svg", true), new SvgIconSource("chart_line", "com/fine/theme/icon/chart/chart_line.svg", true), new SvgIconSource("popup", "com/fine/theme/icon/popup/popup.svg", true), - new SvgIconSource("clear", "com/fine/theme/icon/clear.svg", true) + new SvgIconSource("clear", "com/fine/theme/icon/clear.svg", true), + + // 北区菜单栏 + new SvgIconSource("notification", "com/fine/theme/icon/notification/notification.svg") ); } diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIHeadMenu.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIHeadMenu.java index 60058264af..2c7be79510 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIHeadMenu.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIHeadMenu.java @@ -5,6 +5,7 @@ import javax.swing.JButton; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.MenuElement; +import javax.swing.UIManager; import javax.swing.border.EmptyBorder; import java.awt.Component; @@ -17,7 +18,7 @@ public class UIHeadMenu extends UIMenu { public UIHeadMenu(String name) { super(name); - setBorder(new EmptyBorder(5,14,5,14)); + setBorder(new EmptyBorder(UIManager.getInsets("HeadMenu.borderMargins"))); } @Override diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java index 0d1a64a761..f94c9b94d9 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java @@ -5,6 +5,7 @@ import com.fr.stable.StringUtils; import javax.swing.JFrame; import javax.swing.JPanel; +import javax.swing.UIManager; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.MouseAdapter; @@ -40,6 +41,7 @@ public class LogMessageBar extends JPanel { messageLabel = new UILabel(); setLayout(new BorderLayout()); add(messageLabel, BorderLayout.CENTER); + messageLabel.setForeground(UIManager.getColor("color.text.placeholder")); addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { diff --git a/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java b/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java index b8d41ebe56..daf2b4d3fe 100644 --- a/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java +++ b/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java @@ -1,5 +1,6 @@ package com.fr.design.notification.ui; +import com.fine.theme.icon.LazyIcon; import com.fr.base.svg.IconUtils; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButton; @@ -20,7 +21,7 @@ public class NotificationCenterPane extends BasicPane { setPreferredSize(new Dimension(24, 24)); setLayout(new BorderLayout()); notificationCenterButton = new UIButton(); - notificationCenterButton.setIcon(IconUtils.readIcon("/com/fr/design/standard/notification/notification")); + notificationCenterButton.setIcon(new LazyIcon("notification")); notificationCenterButton.setToolTipText(Toolkit.i18nText("Fine-Design_Basic_Show_Notification")); notificationCenterButton.set4ToolbarButton(); notificationCenterButton.setRolloverEnabled(false); @@ -42,7 +43,7 @@ public class NotificationCenterPane extends BasicPane { if (NotificationCenter.getInstance().getNotificationsCount() > 0) { notificationCenterButton.setIcon(IconUtils.readIcon("/com/fr/design/standard/notification/notification_dot.svg")); } else { - notificationCenterButton.setIcon(IconUtils.readIcon("/com/fr/design/standard/notification/notification")); + notificationCenterButton.setIcon(new LazyIcon("notification")); } } diff --git a/designer-base/src/main/resources/com/fine/theme/icon/notification/notification.svg b/designer-base/src/main/resources/com/fine/theme/icon/notification/notification.svg new file mode 100755 index 0000000000..bebe1dd1f7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/notification/notification.svg @@ -0,0 +1,8 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index 3695d23491..e685147c15 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -89,6 +89,10 @@ ViewportUI = com.formdev.flatlaf.ui.FlatViewportUI #---- variables ---- +color.normalBrand=#2576EF +color.text.white=#fff +color.text.placeholder=#0A1C3878 + # general background and foreground (text color) @background = #F6F8FA @@ -981,6 +985,8 @@ ToggleButton.toolbar.selectedBackground = $ToggleButton.selectedBackground #---- HeadGroup ---- HeadGroup.background= #E9ECF1 HeadGroup.arc= $Component.arc +#---- HeadMenu ---- +HeadMenu.borderMargins=5,9,5,10 #---- ToolBar ---- @@ -1071,6 +1077,10 @@ South.SheetIconSepDistance = 16 South.SheetBarHeight = 24 South.SheetAddWidth = 6 South.SheetIconGap = 5 +#---- North ---- +North.userinfoLabel.borderMargins=2, 16, 2, 16 +North.userinfoLabel.width=80 +North.userinfoLabel.height=24 #---- Styles ------------------------------------------------------------------ diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java index 54f5bf381b..fcd652980f 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java @@ -1,6 +1,6 @@ package com.fr.design.mainframe.alphafine.component; -import com.fr.base.svg.IconUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.help.alphafine.AlphaFineContext; import com.fr.design.actions.help.alphafine.AlphaFineListener; import com.fr.design.dialog.BasicPane; @@ -28,7 +28,7 @@ public class AlphaFinePane extends BasicPane { setPreferredSize(new Dimension(24, 24)); setLayout(new BorderLayout()); UIButton refreshButton = new UIButton(); - refreshButton.setIcon(IconUtils.readIcon(("/com/fr/design/standard/smallsearch"))); + refreshButton.setIcon(new LazyIcon(("search"))); refreshButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Learn_More_About")); refreshButton.set4ToolbarButton(); refreshButton.setRolloverEnabled(false); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java index b3d6e35e5e..f9027f4769 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java @@ -6,7 +6,6 @@ package com.fr.design.mainframe.bbs; import com.fr.base.FRContext; import com.fr.concurrent.NamedThreadFactory; import com.fr.design.DesignerEnvManager; -import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.mainframe.DesignerContext; import com.fr.design.upm.event.CertificateEvent; @@ -17,9 +16,11 @@ import com.fr.general.DateUtils; import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; +import javax.swing.BorderFactory; +import javax.swing.UIManager; import java.awt.BorderLayout; -import java.awt.Color; import java.awt.Dimension; +import java.awt.Insets; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -33,15 +34,6 @@ import java.util.concurrent.Executors; * @date: 2015-3-5-上午11:19:50 */ public class UserInfoPane extends BasicPane { - - /** - * 默认未登录颜色 - */ - private static final Color UN_LOGIN_BACKGROUND = UIConstants.DESIGNER_LOGIN_BACKGROUND; - private static final Color LOGIN_BACKGROUND = new Color(184, 220, 242); - private static final int WIDTH = 104; - private static final int HEIGHT = 24; - /** * 登录成功 */ @@ -70,10 +62,12 @@ public class UserInfoPane extends BasicPane { * 构造函数 */ private UserInfoPane() { - this.setPreferredSize(new Dimension(WIDTH, HEIGHT)); + this.setPreferredSize(new Dimension(UIManager.getInt("North.userinfoLabel.width"), UIManager.getInt("North.userinfoLabel.height"))); this.setLayout(new BorderLayout()); this.userInfoLabel = new UserInfoLabel(this); + Insets insets = UIManager.getInsets("North.userinfoLabel.borderMargins"); + this.userInfoLabel.setBorder(BorderFactory.createEmptyBorder(insets.top, insets.left, insets.bottom, insets.right)); this.markUnSignIn(); autoPushLoginDialog(); @@ -108,9 +102,9 @@ public class UserInfoPane extends BasicPane { */ public void markUnSignIn() { this.userInfoLabel.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Login_Onclick")); - this.userInfoLabel.setForeground(Color.WHITE); + this.userInfoLabel.setForeground(UIManager.getColor("color.text.white")); this.userInfoLabel.setOpaque(true); - this.userInfoLabel.setBackground(UN_LOGIN_BACKGROUND); + this.userInfoLabel.setBackground(UIManager.getColor("color.normalBrand")); this.userInfoLabel.resetUserName(); } @@ -121,10 +115,8 @@ public class UserInfoPane extends BasicPane { */ public void markSignIn(String userName) { this.userInfoLabel.setText(userName); - this.userInfoLabel.setForeground(Color.BLACK); this.userInfoLabel.setUserName(userName); this.userInfoLabel.setOpaque(true); - this.userInfoLabel.setBackground(LOGIN_BACKGROUND); } @Override From 17c5066535f19940a3978005ef2a388e4512c68c Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Tue, 5 Dec 2023 11:52:23 +0800 Subject: [PATCH 017/302] =?UTF-8?q?REPORT-107973=20=E4=B8=BB=E9=A1=B5?= =?UTF-8?q?=E5=8F=8A=E7=BB=84=E4=BB=B6=E8=A7=86=E8=A7=89=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E7=BF=BB=E6=96=B0=20=E6=94=B9=E4=B8=8B=E5=90=8D=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/light/ui/laf/FineLightLaf.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index e685147c15..4f4aa7b2c2 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -89,8 +89,8 @@ ViewportUI = com.formdev.flatlaf.ui.FlatViewportUI #---- variables ---- -color.normalBrand=#2576EF -color.text.white=#fff +color.brand.normal=#2576EF +color.text.normal=#ffffff color.text.placeholder=#0A1C3878 From 09389a6d5137b65e744179c18dbf62d53adb14d3 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Tue, 5 Dec 2023 11:52:23 +0800 Subject: [PATCH 018/302] =?UTF-8?q?REPORT-107973=20=E4=B8=BB=E9=A1=B5?= =?UTF-8?q?=E5=8F=8A=E7=BB=84=E4=BB=B6=E8=A7=86=E8=A7=89=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E7=BF=BB=E6=96=B0=20=E6=94=B9=E4=B8=8B=E5=90=8D=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/light/ui/laf/FineLightLaf.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index e685147c15..1a368395cf 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -89,8 +89,8 @@ ViewportUI = com.formdev.flatlaf.ui.FlatViewportUI #---- variables ---- -color.normalBrand=#2576EF -color.text.white=#fff +color.brand.normal=#2576EF +color.text.white=#ffffff color.text.placeholder=#0A1C3878 From 63e6b7733cbb078fc2ea2f2c086bfd5f7299d1b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 6 Dec 2023 16:37:21 +0800 Subject: [PATCH 019/302] =?UTF-8?q?REPORT-107972=20=E3=80=90UI=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E3=80=91=E7=BF=BB=E6=96=B0=E4=B8=BB=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=E8=BE=B9=E8=B7=9D=E3=80=81=E8=BE=B9=E6=A1=86=E3=80=81=E8=83=8C?= =?UTF-8?q?=E6=99=AF=E8=89=B2=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 62 +++++++++++-------- .../com/fine/theme/utils/FineUIUtils.java | 29 +++++++++ .../data/datapane/TableDataTreePane.java | 1 - .../icontainer/UIEastResizableContainer.java | 2 +- .../icontainer/UIModeControlContainer.java | 59 ++++++++---------- .../mainframe/CenterRegionContainerPane.java | 20 +++--- .../DesignerFrameFileDealerPane.java | 1 - .../mainframe/EastRegionContainerPane.java | 2 +- .../mainframe/NorthRegionContainerPane.java | 3 + .../com/fine/theme/icon/param/edit.svg | 5 ++ .../fine/theme/icon/param/edit_disable.svg | 5 ++ .../fine/theme/icon/param/edit_pressed.svg | 6 ++ .../com/fine/theme/icon/param/hide.svg | 5 ++ .../fine/theme/icon/param/hide_disable.svg | 5 ++ .../fine/theme/icon/param/hide_pressed.svg | 6 ++ .../com/fine/theme/icon/param/view.svg | 7 +++ .../light/ui/laf/FineLightLaf.properties | 28 ++++++--- .../mainframe/ReportComponentComposite.java | 3 + .../fr/design/mainframe/SheetNameTabPane.java | 8 +-- .../main/java/com/fr/grid/GridColumnUI.java | 16 ++--- .../src/main/java/com/fr/grid/GridCorner.java | 17 +---- .../src/main/java/com/fr/grid/GridRowUI.java | 18 ++---- 22 files changed, 184 insertions(+), 124 deletions(-) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/param/edit.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/param/edit_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/param/edit_pressed.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/param/hide.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/param/hide_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/param/hide_pressed.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/param/view.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index e3082321dd..16aed93baf 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -69,34 +69,35 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("new_folder", "com/fine/theme/icon/filetree/new_folder.svg", true), // 属性面板Icon - new SvgIconSource("cellattr", "com/fine/theme/icon/propertiestab/cellattr.svg", false), - new SvgIconSource("cellattr_disabled", "com/fine/theme/icon/propertiestab/cellattr_disabled.svg", false), - new SvgIconSource("cellattr_selected", "com/fine/theme/icon/propertiestab/cellattr_selected.svg", false), - new SvgIconSource("cellelement", "com/fine/theme/icon/propertiestab/cellelement.svg", false), - new SvgIconSource("cellelement_disabled", "com/fine/theme/icon/propertiestab/cellelement_disabled.svg", false), - new SvgIconSource("cellelement_selected", "com/fine/theme/icon/propertiestab/cellelement_selected.svg", false), - new SvgIconSource("conditionattr", "com/fine/theme/icon/propertiestab/conditionattr.svg", false), - new SvgIconSource("conditionattr_disabled", "com/fine/theme/icon/propertiestab/conditionattr_disabled.svg", false), - new SvgIconSource("conditionattr_selected", "com/fine/theme/icon/propertiestab/conditionattr_selected.svg", false), - new SvgIconSource("floatelement", "com/fine/theme/icon/propertiestab/floatelement.svg", false), - new SvgIconSource("floatelement_disabled", "com/fine/theme/icon/propertiestab/floatelement_disabled.svg", false), - new SvgIconSource("floatelement_selected", "com/fine/theme/icon/propertiestab/floatelement_selected.svg", false), - new SvgIconSource("hyperlink", "com/fine/theme/icon/propertiestab/hyperlink.svg", false), - new SvgIconSource("hyperlink_disabled", "com/fine/theme/icon/propertiestab/hyperlink_disabled.svg", false), - new SvgIconSource("hyperlink_selected", "com/fine/theme/icon/propertiestab/hyperlink_selected.svg", false), - new SvgIconSource("widgetlib", "com/fine/theme/icon/propertiestab/widgetlib.svg", false), - new SvgIconSource("widgetlib_disabled", "com/fine/theme/icon/propertiestab/widgetlib_disabled.svg", false), - new SvgIconSource("widgetlib_selected", "com/fine/theme/icon/propertiestab/widgetlib_selected.svg", false), - new SvgIconSource("widgetsettings", "com/fine/theme/icon/propertiestab/widgetsettings.svg", false), - new SvgIconSource("widgetsettings_disabled", "com/fine/theme/icon/propertiestab/widgetsettings_disabled.svg", false), - new SvgIconSource("widgetsettings_selected", "com/fine/theme/icon/propertiestab/widgetsettings_selected.svg", false), + new SvgIconSource("cellattr", "com/fine/theme/icon/propertiestab/cellattr.svg", false, 18), + new SvgIconSource("cellattr_disabled", "com/fine/theme/icon/propertiestab/cellattr_disabled.svg", false, 18), + new SvgIconSource("cellattr_selected", "com/fine/theme/icon/propertiestab/cellattr_selected.svg", false, 18), + new SvgIconSource("cellelement", "com/fine/theme/icon/propertiestab/cellelement.svg", false, 18), + new SvgIconSource("cellelement_disabled", "com/fine/theme/icon/propertiestab/cellelement_disabled.svg", false, 18), + new SvgIconSource("cellelement_selected", "com/fine/theme/icon/propertiestab/cellelement_selected.svg", false, 18), + new SvgIconSource("conditionattr", "com/fine/theme/icon/propertiestab/conditionattr.svg", false, 18), + new SvgIconSource("conditionattr_disabled", "com/fine/theme/icon/propertiestab/conditionattr_disabled.svg", false, 18), + new SvgIconSource("conditionattr_selected", "com/fine/theme/icon/propertiestab/conditionattr_selected.svg", false, 18), + new SvgIconSource("floatelement", "com/fine/theme/icon/propertiestab/floatelement.svg", false, 18), + new SvgIconSource("floatelement_disabled", "com/fine/theme/icon/propertiestab/floatelement_disabled.svg", false, 18), + new SvgIconSource("floatelement_selected", "com/fine/theme/icon/propertiestab/floatelement_selected.svg", false, 18), + new SvgIconSource("hyperlink", "com/fine/theme/icon/propertiestab/hyperlink.svg", false, 18), + new SvgIconSource("hyperlink_disabled", "com/fine/theme/icon/propertiestab/hyperlink_disabled.svg", false, 18), + new SvgIconSource("hyperlink_selected", "com/fine/theme/icon/propertiestab/hyperlink_selected.svg", false, 18), + new SvgIconSource("widgetlib", "com/fine/theme/icon/propertiestab/widgetlib.svg", false, 18), + new SvgIconSource("widgetlib_disabled", "com/fine/theme/icon/propertiestab/widgetlib_disabled.svg", false, 18), + new SvgIconSource("widgetlib_selected", "com/fine/theme/icon/propertiestab/widgetlib_selected.svg", false, 18), + new SvgIconSource("widgetsettings", "com/fine/theme/icon/propertiestab/widgetsettings.svg", false, 18), + new SvgIconSource("widgetsettings_disabled", "com/fine/theme/icon/propertiestab/widgetsettings_disabled.svg", false, 18), + new SvgIconSource("widgetsettings_selected", "com/fine/theme/icon/propertiestab/widgetsettings_selected.svg", false, 18), // TODO: 视觉未提供,先用旧的,待视觉提供后替换 - new SvgIconSource("configuredroles", "com/fine/theme/icon/propertiestab/configuredroles.svg", false), - new SvgIconSource("configuredroles_selected", "com/fine/theme/icon/propertiestab/configuredroles_selected.svg", false), - new SvgIconSource("configuredroles_disabled", "com/fine/theme/icon/propertiestab/configuredroles_disabled.svg", false), - new SvgIconSource("authorityedit", "com/fine/theme/icon/propertiestab/authorityedit.svg", false), - new SvgIconSource("authorityedit_disabled", "com/fine/theme/icon/propertiestab/authorityedit_disabled.svg", false), - new SvgIconSource("authorityedit_selected", "com/fine/theme/icon/propertiestab/authorityedit_selected.svg", false), + new SvgIconSource("configuredroles", "com/fine/theme/icon/propertiestab/configuredroles.svg", false, 18), + new SvgIconSource("configuredroles_selected", "com/fine/theme/icon/propertiestab/configuredroles_selected.svg", false, 18), + new SvgIconSource("configuredroles_disabled", "com/fine/theme/icon/propertiestab/configuredroles_disabled.svg", false, 18), + new SvgIconSource("authorityedit", "com/fine/theme/icon/propertiestab/authorityedit.svg", false, 18), + new SvgIconSource("authorityedit_disabled", "com/fine/theme/icon/propertiestab/authorityedit_disabled.svg", false, 18), + new SvgIconSource("authorityedit_selected", "com/fine/theme/icon/propertiestab/authorityedit_selected.svg", false, 18), + // sheet标签栏相关icon new SvgIconSource("add_worksheet", "com/fine/theme/icon/sheet/add_sheet.svg", true), @@ -133,6 +134,13 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("popup", "com/fine/theme/icon/popup/popup.svg", true), new SvgIconSource("clear", "com/fine/theme/icon/clear.svg", true), + // 参数面板 + new SvgIconSource("param_edit", "com/fine/theme/icon/param/edit.svg", true, 24), + new SvgIconSource("param_edit_pressed", "com/fine/theme/icon/param/edit_pressed.svg", true, 24), + new SvgIconSource("param_hide", "com/fine/theme/icon/param/hide.svg", true, 24), + new SvgIconSource("param_hide_pressed", "com/fine/theme/icon/param/hide_pressed.svg", true, 24), + new SvgIconSource("param_view", "com/fine/theme/icon/param/view.svg", true, 18), + // 北区菜单栏 new SvgIconSource("notification", "com/fine/theme/icon/notification/notification.svg") diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java index b4b6c9a301..7d696e02b4 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java @@ -1,12 +1,17 @@ package com.fine.theme.utils; +import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.stable.os.OperatingSystem; import com.fr.value.AtomicClearableLazyValue; import javax.swing.UIManager; import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Composite; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; +import java.awt.geom.RoundRectangle2D; import java.lang.reflect.Field; /** @@ -87,4 +92,28 @@ public class FineUIUtils { Object value = UIManager.get(key); return (value instanceof Integer) ? (Integer) value : UIManager.getInt(defaultKey); } + + /** + * 绘制混合图像,含圆角、背景色设置 + * + * @param g 图像 + * @param composite 混合图像 + * @param background 背景色 + * @param width 宽度 + * @param height 高度 + * @param radius 圆角 + */ + public static void paintWithComposite(Graphics g, Composite composite, Color background, + int width, int height, int radius) { + Graphics2D g2d = (Graphics2D) g; + + FlatUIUtils.setRenderingHints(g2d); + Composite oldComposite = g2d.getComposite(); + g2d.setComposite(composite); + + g2d.setColor(background); + g2d.fill(new RoundRectangle2D.Float(0, 0, width, height, radius, radius)); + g2d.setComposite(oldComposite); + } + } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index ff514af9ca..cadb62550a 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -249,7 +249,6 @@ public class TableDataTreePane extends BasicTableDataTreePane { toolbarDef = new ToolBarDef(); toolbarDef.addShortCut(addMenuDef, SeparatorDef.DEFAULT, editAction, removeAction, SeparatorDef.DEFAULT, previewTableDataAction, connectionTableAction, esdAction, esdOffAction, switchAction); UIToolbar toolBar = ToolBarDef.createJToolBar(); - toolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIConstants.TOOLBAR_BORDER_COLOR)); toolBar.setBorderPainted(true); toolbarDef.updateToolBar(toolBar); diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java index a366626153..c997024146 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java @@ -80,7 +80,7 @@ public class UIEastResizableContainer extends JPanel { this.rightPane = rightPane; this.topToolPane = new TopToolPane(); topToolPane.setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 1, 0)); - topToolPane.setBorder(BorderFactory.createMatteBorder(1 ,1, 0, 1, UIManager.getColor("East.border"))); + topToolPane.setBorder(BorderFactory.createMatteBorder(0 ,1, 0, 1, UIManager.getColor("East.border"))); setLayout(containerLayout); add(topToolPane); diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIModeControlContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIModeControlContainer.java index e09f877d3c..c0903f644c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIModeControlContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIModeControlContainer.java @@ -1,9 +1,12 @@ package com.fr.design.gui.icontainer; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIUtils; import com.fr.base.vcs.DesignerMode; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ibutton.UIButtonUI; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.DesignerContext; import com.fr.design.utils.gui.GUICoreUtils; @@ -12,17 +15,18 @@ import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLayeredPane; import javax.swing.JPanel; +import javax.swing.Icon; +import javax.swing.UIManager; +import javax.swing.plaf.basic.BasicButtonUI; import java.awt.AlphaComposite; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; -import java.awt.Composite; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; -import java.awt.Graphics2D; import java.awt.LayoutManager; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -47,7 +51,9 @@ public class UIModeControlContainer extends JLayeredPane { private boolean isHideMode = false; private boolean isSheeetCovered = false; - private AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f); + private AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f); + private Color coverBackground = UIManager.getColor("North.coverPane.background"); + private int coverRadius = UIManager.getInt("North.coverPane.radius"); public UIModeControlContainer() { this(new JPanel(), new JPanel()); @@ -67,7 +73,6 @@ public class UIModeControlContainer extends JLayeredPane { add(upPane); add(horizontToolPane); } -// setLayout(new VerticalFlowLayout(CENTER, 10, 10)); add(downPane); add(coverPane = new CoverPane()); add(hidePane = new HidePane()); @@ -112,9 +117,8 @@ public class UIModeControlContainer extends JLayeredPane { horizontToolPane = new JPanel() { @Override public void paint(Graphics g) { - g.drawImage(UIConstants.DRAG_BAR, 0, 0, getWidth(), getHeight(), null); if (upEditMode) { - g.drawImage(UIConstants.DRAG_DOT, (getWidth() - toolPaneHeight) / 2, 3, toolPaneHeight, 5, null); + g.drawImage(UIConstants.DRAG_DOT, (getWidth() - toolPaneHeight) / 2, 3, toolPaneHeight, 8, null); } } }; @@ -283,7 +287,7 @@ public class UIModeControlContainer extends JLayeredPane { setLayout(new FlowLayout(FlowLayout.CENTER, 10, -3)); setBackground(UIConstants.NORMAL_BACKGROUND); add(new UILabel("" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Parameter_Panel") + "")); - UIButton viewButton = new UIButton(UIConstants.VIEW_NORMAL_ICON, UIConstants.VIEW_NORMAL_ICON, UIConstants.VIEW_NORMAL_ICON) { + UIButton viewButton = new LargeButton(new LazyIcon("param_view"), new LazyIcon("param_view"), new LazyIcon("param_view")) { @Override public Dimension getPreferredSize() { return new Dimension(32, 32); @@ -352,16 +356,10 @@ public class UIModeControlContainer extends JLayeredPane { @Override public void paint(Graphics g) { - Graphics2D g2d = (Graphics2D) g; - Composite oldComposite = g2d.getComposite(); - g2d.setComposite(composite); - g2d.setColor(Color.BLACK); - g2d.fillRect(0, 0, getWidth(), getHeight()); - g2d.setComposite(oldComposite); + FineUIUtils.paintWithComposite(g, composite, coverBackground, getWidth(), getHeight(), coverRadius); super.paint(g); } - } private class CoverPane extends JPanel { @@ -380,18 +378,8 @@ public class UIModeControlContainer extends JLayeredPane { } }); - editButton = new UIButton(UIConstants.EDIT_NORMAL_ICON, UIConstants.EDIT_PRESSED_ICON, UIConstants.EDIT_PRESSED_ICON) { - @Override - public Dimension getPreferredSize() { - return new Dimension(40, 40); - } - }; - hideButton = new UIButton(UIConstants.HIDE_NORMAL_ICON, UIConstants.HIDE_PRESSED_ICON, UIConstants.HIDE_PRESSED_ICON) { - @Override - public Dimension getPreferredSize() { - return new Dimension(40, 40); - } - }; + editButton = new LargeButton(new LazyIcon("param_edit"), new LazyIcon("param_edit_pressed"), new LazyIcon("param_edit_pressed")); + hideButton = new LargeButton(new LazyIcon("param_hide"), new LazyIcon("param_hide_pressed"), new LazyIcon("param_hide_pressed")); editButton.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { @@ -454,16 +442,23 @@ public class UIModeControlContainer extends JLayeredPane { @Override public void paint(Graphics g) { - Graphics2D g2d = (Graphics2D) g; - Composite oldComposite = g2d.getComposite(); - g2d.setComposite(composite); - g2d.setColor(Color.BLACK); - g2d.fillRect(0, 0, getWidth(), getHeight()); - g2d.setComposite(oldComposite); + FineUIUtils.paintWithComposite(g, composite, coverBackground, getWidth(), getHeight(), coverRadius); super.paint(g); } } + static class LargeButton extends UIButton { + public LargeButton(Icon normal, Icon rollOver, Icon pressed) { + super(normal, rollOver, pressed); + setUI(new BasicButtonUI()); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(40, 40); + } + } + /** * @param args */ diff --git a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java index 41bb38e291..96265efcf1 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java @@ -16,6 +16,8 @@ import org.jetbrains.annotations.Nullable; import javax.swing.JComponent; import javax.swing.JPanel; +import javax.swing.BorderFactory; +import javax.swing.UIManager; import javax.swing.border.MatteBorder; import java.awt.BorderLayout; import java.awt.Component; @@ -78,7 +80,9 @@ public class CenterRegionContainerPane extends JPanel { return dim; } }; + toolbarPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); toolbarPane.setLayout(FRGUIPaneFactory.createBorderLayout()); + toolbarPane.setBackground(UIManager.getColor("Center.SpaceColor")); eastPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); eastPane.add(largeToolbar = getToolBarMenuDock().createLargeToolbar(), BorderLayout.WEST); eastCenterPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); @@ -95,7 +99,8 @@ public class CenterRegionContainerPane extends JPanel { this.setLayout(new BorderLayout()); this.add(centerTemplateCardPane = new DesktopCardPane(), BorderLayout.CENTER); this.add(toolbarPane, BorderLayout.NORTH); - + this.setBackground(UIManager.getColor("Center.SpaceColor")); + this.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10)); } public ToolBarMenuDock getToolBarMenuDock() { @@ -228,8 +233,8 @@ public class CenterRegionContainerPane extends JPanel { // 颜色,字体那些按钮的工具栏 toolbarPane.add(toolbarComponent = ad.resetToolBar(toolbarComponent, plus), BorderLayout.CENTER); - JPanel customNorthPane = strategy.customNorthPane(toolbarPane,plus); - if (!isExist(customNorthPane)){ + JPanel customNorthPane = strategy.customNorthPane(toolbarPane, plus); + if (!isExist(customNorthPane)) { this.removeNorth(); this.add(customNorthPane, BorderLayout.NORTH); } @@ -247,10 +252,10 @@ public class CenterRegionContainerPane extends JPanel { resetByDesignMode(); } - private void removeNorth(){ + private void removeNorth() { Component[] components = this.getComponents(); - for(Component c : components){ - if (c!= centerTemplateCardPane){ + for (Component c : components) { + if (c != centerTemplateCardPane) { this.remove(c); } } @@ -280,7 +285,6 @@ public class CenterRegionContainerPane extends JPanel { } - JComponent getToolbarComponent() { return this.toolbarComponent; @@ -312,7 +316,7 @@ public class CenterRegionContainerPane extends JPanel { /** * 重置下RegionContainerpane */ - public void resetCenterRegionContainerPane(){ + public void resetCenterRegionContainerPane() { templateTabPane.add(MultiTemplateTabPane.getInstance(), BorderLayout.CENTER); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index 115d4aeaf2..901a37a9c1 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -166,7 +166,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt setLayout(new BorderLayout()); toolBar = ToolBarDef.createJToolBar(); - toolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIConstants.TOOLBAR_BORDER_COLOR)); toolBar.setBorderPainted(true); JPanel tooBarPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); JPanel parent = new JPanel(new BorderLayout()); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 73b37acd6c..f11e37478b 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -1283,7 +1283,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { setLayout(new BorderLayout()); add(contentPane, BorderLayout.CENTER); - setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, UIManager.getColor("East.border"))); + setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIManager.getColor("East.border"))); initToolButton(buttonType); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java index a48be8b034..e1540f9a51 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java @@ -20,9 +20,11 @@ import com.fr.plugin.observer.PluginEventType; import com.fr.stable.os.support.OSBasedAction; import com.fr.stable.os.support.OSSupportCenter; +import javax.swing.BorderFactory; import javax.swing.JMenuBar; import javax.swing.JPanel; import javax.swing.SwingUtilities; +import javax.swing.UIManager; import java.awt.BorderLayout; import java.awt.Component; import java.awt.FlowLayout; @@ -66,6 +68,7 @@ public class NorthRegionContainerPane extends JPanel { this.setLayout(new BorderLayout()); this.add(initNorthEastPane(ad), BorderLayout.EAST); + this.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIManager.getColor("North.border"))); } /** diff --git a/designer-base/src/main/resources/com/fine/theme/icon/param/edit.svg b/designer-base/src/main/resources/com/fine/theme/icon/param/edit.svg new file mode 100644 index 0000000000..18e92aecfb --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/param/edit.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/param/edit_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/param/edit_disable.svg new file mode 100644 index 0000000000..09f0d2e49a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/param/edit_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/param/edit_pressed.svg b/designer-base/src/main/resources/com/fine/theme/icon/param/edit_pressed.svg new file mode 100644 index 0000000000..31196d10d7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/param/edit_pressed.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/param/hide.svg b/designer-base/src/main/resources/com/fine/theme/icon/param/hide.svg new file mode 100644 index 0000000000..11dfc10b36 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/param/hide.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/param/hide_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/param/hide_disable.svg new file mode 100644 index 0000000000..73a27ff478 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/param/hide_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/param/hide_pressed.svg b/designer-base/src/main/resources/com/fine/theme/icon/param/hide_pressed.svg new file mode 100644 index 0000000000..2aaf53a1d9 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/param/hide_pressed.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/param/view.svg b/designer-base/src/main/resources/com/fine/theme/icon/param/view.svg new file mode 100644 index 0000000000..8a44f28058 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/param/view.svg @@ -0,0 +1,7 @@ + + + icon 显示 + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index 1a368395cf..1574aeb674 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -160,13 +160,6 @@ controlHighlight = lighten($controlShadow,12%) controlLtHighlight = lighten($controlShadow,25%) controlDkShadow = darken($controlShadow,15%) DarkenedFontColor = #091E40 -DesignerSpaceColor = #FFF - -# ---- MainWorkArea ---- - -CenterOuterShadowColor = #F2F4F8 -ZoneBorderColor = #E6E9EF -GridColumnRowColor = #F8F9FC #---- Button ---- @@ -632,7 +625,7 @@ RootPane.inactiveBorderColor = darken(@background,30%,derived) #---- ScrollBar ---- -ScrollBar.width = 10 +ScrollBar.width = 16 ScrollBar.minimumButtonSize = 12,12 ScrollBar.minimumThumbSize = 10,10 ScrollBar.maximumThumbSize = 100000,100000 @@ -642,7 +635,7 @@ ScrollBar.trackArc = 0 ScrollBar.thumbArc = 0 ScrollBar.hoverThumbWithTrack = false ScrollBar.pressedThumbWithTrack = false -ScrollBar.showButtons = false +ScrollBar.showButtons = true ScrollBar.squareButtons = false ScrollBar.buttonArrowColor = @buttonArrowColor ScrollBar.buttonDisabledArrowColor = @buttonDisabledArrowColor @@ -1066,6 +1059,9 @@ Tree.icon.closedColor = @icon Tree.icon.openColor = @icon Tree.hash = darken($Tree.background,10%) +#---- West ---- +West.border = #DADEE7 + #---- East ---- East.border = #DADEE7 East.TabSelectedColor = #B3CFF9 @@ -1077,10 +1073,24 @@ South.SheetIconSepDistance = 16 South.SheetBarHeight = 24 South.SheetAddWidth = 6 South.SheetIconGap = 5 +South.SheetSelectedColor = #FFF + #---- North ---- North.userinfoLabel.borderMargins=2, 16, 2, 16 North.userinfoLabel.width=80 North.userinfoLabel.height=24 +North.border = #DADEE7 +North.coverPane.background = #0a1c38 +North.coverPane.radius = 8 + +# ---- Center ---- + +Center.OuterShadowColor = #F2F4F8 +Center.ZoneBorderColor = #E6E9EF +Center.GridColumnRowColor = #F8F9FC +Center.SpaceColor = #FFF +Center.border = 0, 10, 10, 10 + #---- Styles ------------------------------------------------------------------ diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ReportComponentComposite.java b/designer-realize/src/main/java/com/fr/design/mainframe/ReportComponentComposite.java index a14573c6e4..5bfc086f37 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ReportComponentComposite.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ReportComponentComposite.java @@ -16,8 +16,10 @@ import com.fr.main.impl.WorkBook; import com.fr.report.report.TemplateReport; import com.fr.stable.StringUtils; +import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JPanel; +import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; @@ -63,6 +65,7 @@ public class ReportComponentComposite extends JComponent implements RemoveListen CellElementRegion = FRGUIPaneFactory.createBorderLayout_S_Pane(); this.add(CellElementRegion, BorderLayout.NORTH); this.add(createSouthControlPane(), BorderLayout.SOUTH); + this.setBorder(BorderFactory.createLineBorder(UIManager.getColor("Center.ZoneBorderColor"))); jSliderContainer.addValueChangeListener(showValSpinnerChangeListener); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java index f0f1cbf46c..531e3f08e6 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java @@ -61,9 +61,9 @@ import java.util.List; */ public class SheetNameTabPane extends JComponent implements MouseListener, MouseMotionListener, RemoveListener { - private static final Color BORDER_COLOR = UIManager.getColor("ZoneBorderColor"); - private static final Color BACKGROUND_COLOR = UIManager.getColor("CenterOuterShadowColor"); - private static final Color SELECTED_COLOR = UIManager.getColor("DesignerSpaceColor"); + private static final Color BORDER_COLOR = UIManager.getColor("Center.ZoneBorderColor"); + private static final Color BACKGROUND_COLOR = UIManager.getColor("Center.OuterShadowColor"); + private static final Color SELECTED_COLOR = UIManager.getColor("South.SheetSelectedColor"); private static final Color FONT_COLOR = UIManager.getColor("DarkenedFontColor"); private static final Icon ADD_WORK_SHEET = new LazyIcon("add_worksheet"); @@ -365,7 +365,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse int addIconlocation = 0; WorkBook workBook = reportComposite.getEditingWorkBook(); int reportCount = workBook.getReportCount(); - double textX = 0; + double textX = SHEET_ICON_GAP; for (int i = scrollIndex; i < reportCount; i++) { lastOneIndex = i; TemplateReport templateReport = workBook.getTemplateReport(i); diff --git a/designer-realize/src/main/java/com/fr/grid/GridColumnUI.java b/designer-realize/src/main/java/com/fr/grid/GridColumnUI.java index 6c401e925b..d05f252d42 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridColumnUI.java +++ b/designer-realize/src/main/java/com/fr/grid/GridColumnUI.java @@ -9,10 +9,8 @@ import javax.swing.JComponent; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; -import com.fr.base.BaseUtils; import com.fr.base.DynamicUnitList; import com.fr.base.GraphHelper; -import com.fr.base.ScreenResolution; import com.fr.base.vcs.DesignerMode; import com.fr.cache.list.IntList; import com.fr.design.constants.UIConstants; @@ -29,7 +27,7 @@ import com.fr.report.elementcase.ElementCase; * @since 2012-3-22下午5:51:10 */ public class GridColumnUI extends ComponentUI { - protected Color withoutDetailsBackground = UIConstants.GRID_COLUMN_DETAILS_BACKGROUND; + protected Color withoutDetailsBackground = UIManager.getColor("Center.GridColumnRowColor"); private int resolution ; public GridColumnUI(int resolution){ @@ -75,21 +73,15 @@ public class GridColumnUI extends ComponentUI { if (gridColumn.getBackground() != null) { g2d.setPaint(this.withoutDetailsBackground); GraphHelper.fill(g2d, new Rectangle2D.Double(0, 0, columnLeftWidth, size.getHeight())); - g2d.setPaint(Color.WHITE); - GraphHelper.fill(g2d, new Rectangle2D.Double(columnLeftWidth, 0, size.getWidth() - columnLeftWidth, size.getHeight())); } // draw left border line. g2d.setPaint(gridColumn.getSeparatorLineColor()); GraphHelper.drawLine(g2d, 0, 0, 0, size.getHeight()); - double tmpWidth2 = 0; - drawColumn(horizontalBeginValue, horizontalEndValue, columnWidthList, tmpWidth2, reportPane, g2d, gridColumn, size); - // 画上边的边框线. - g2d.setColor(gridColumn.getSeparatorLineColor()); - GraphHelper.drawLine(g2d, 0, 0, tmpWidth2, 0); + drawColumn(horizontalBeginValue, horizontalEndValue, columnWidthList, reportPane, g2d, gridColumn, size); } - private void drawColumn(int horizontalBeginValue, int horizontalEndValue, DynamicUnitList columnWidthList, double tmpWidth2, + private void drawColumn(int horizontalBeginValue, int horizontalEndValue, DynamicUnitList columnWidthList, ElementCasePane reportPane, Graphics2D g2d, GridColumn gridColumn, Dimension size) { // draw column. @@ -112,7 +104,7 @@ public class GridColumnUI extends ComponentUI { tmpIncreaseWidth = columnWidthList.get(i).toPixD(resolution); // check these column wich width is zero. - tmpWidth2 = tmpIncreaseWidth <= 0 ? tmpWidth1 + 1 : tmpWidth1 + tmpIncreaseWidth; + double tmpWidth2 = tmpIncreaseWidth <= 0 ? tmpWidth1 + 1 : tmpWidth1 + tmpIncreaseWidth; // marks:画出来多个选中的区域 Selection sel = reportPane.getSelection(); int[] selectedColumn = sel.getSelectedColumns(); diff --git a/designer-realize/src/main/java/com/fr/grid/GridCorner.java b/designer-realize/src/main/java/com/fr/grid/GridCorner.java index 700fd802dc..43ca7fbe5e 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridCorner.java +++ b/designer-realize/src/main/java/com/fr/grid/GridCorner.java @@ -40,24 +40,11 @@ public class GridCorner extends BaseGridComponent { //size Dimension size = this.getSize(); Rectangle2D rect2D = new Rectangle2D.Double(0, 0, size.getWidth(), size.getHeight()); - //paint background. -// if (this.getBackground() != null) { -// g2d.setPaint(this.getBackground()); -// GraphHelper.fill(g2d, rect2D); -// } else { - g2d.setPaint(reportPane.getGrid().getBackground()); - GraphHelper.fill(g2d, rect2D); -// } + g2d.setPaint(reportPane.getGrid().getBackground()); + GraphHelper.fill(g2d, rect2D); paintArc(g2d, size, time); - //画左边的边框线. - g2d.setColor(reportPane.getGridColumn().getSeparatorLineColor()); - GraphHelper.drawLine(g2d, 0, 0, 0, size.getHeight()); - - //画上边的边框线. - g2d.setColor(reportPane.getGridRow().getSeparatorLineColor()); - GraphHelper.drawLine(g2d, 0, 0, size.getWidth(), 0); } /** diff --git a/designer-realize/src/main/java/com/fr/grid/GridRowUI.java b/designer-realize/src/main/java/com/fr/grid/GridRowUI.java index 19f4d76df5..5f88c6c952 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridRowUI.java +++ b/designer-realize/src/main/java/com/fr/grid/GridRowUI.java @@ -10,10 +10,8 @@ import javax.swing.plaf.ComponentUI; import com.fr.design.mainframe.DesignerUIModeConfig; import com.fr.stable.AssistUtils; -import com.fr.base.BaseUtils; import com.fr.base.DynamicUnitList; import com.fr.base.GraphHelper; -import com.fr.base.ScreenResolution; import com.fr.base.vcs.DesignerMode; import com.fr.cache.list.IntList; import com.fr.design.constants.UIConstants; @@ -29,7 +27,7 @@ import com.fr.report.elementcase.ElementCase; * @since 2012-3-22下午5:54:21 */ public class GridRowUI extends ComponentUI { - private Color detailsBackground = UIConstants.GRID_ROW_DETAILS_BACKGROUND; + private Color detailsBackground = UIManager.getColor("Center.GridColumnRowColor"); private int resolution ; GridRowUI(int resolution){ @@ -74,23 +72,17 @@ public class GridRowUI extends ComponentUI { rowTopHeight = Math.min(horizontalLineHeight, rowTopHeight); if (gridRow.getBackground() != null) { g2d.setPaint(this.detailsBackground); - GraphHelper.fill(g2d, new Rectangle2D.Double(0, 0, size.getWidth(), rowTopHeight)); - g2d.setPaint(Color.WHITE); - GraphHelper.fill(g2d, new Rectangle2D.Double(0, rowTopHeight, size.getHeight(), size.getHeight() - rowTopHeight)); + GraphHelper.fill(g2d, new Rectangle2D.Double(0, 0, size.getWidth(), rowTopHeight)); } // draw top border line. g2d.setPaint(gridRow.getSeparatorLineColor()); GraphHelper.drawLine(g2d, 0, 0, size.getWidth(), 0); // draw row - double tmpHeight2 = 0; - drawRow(verticalBeginValue, verticalEndValue, rowHeightList, resolution, tmpHeight2, gridRow, g2d); - // 画左边的边框线. - g2d.setColor(gridRow.getSeparatorLineColor()); - GraphHelper.drawLine(g2d, 0, 0, 0, tmpHeight2); + drawRow(verticalBeginValue, verticalEndValue, rowHeightList, resolution, gridRow, g2d); } private void drawRow(int verticalBeginValue, int verticalEndValue, DynamicUnitList rowHeightList, int resolution, - double tmpHeight2, GridRow gridRow, Graphics2D g2d) { + GridRow gridRow, Graphics2D g2d) { boolean isSelectedBounds; double tmpHeight1 = 0; double tmpIncreaseHeight = 0; @@ -108,7 +100,7 @@ public class GridRowUI extends ComponentUI { tmpHeight1 += tmpIncreaseHeight; tmpIncreaseHeight = rowHeightList.get(i).toPixD(resolution); // check these row wich height is zero. - tmpHeight2 = AssistUtils.equals(tmpIncreaseHeight,0d) ? tmpHeight1 + 1 : tmpHeight1 + tmpIncreaseHeight; + double tmpHeight2 = AssistUtils.equals(tmpIncreaseHeight, 0d) ? tmpHeight1 + 1 : tmpHeight1 + tmpIncreaseHeight; // check selection bound. Selection sel = reportPane.getSelection(); int[] selectedRows = sel.getSelectedRows(); From b7c2ce4c0e759ddda858731007f2758e5b1d98ba Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Wed, 6 Dec 2023 18:39:35 +0800 Subject: [PATCH 020/302] =?UTF-8?q?REPORT-107973=20=E4=B8=BB=E9=A1=B5?= =?UTF-8?q?=E5=8F=8A=E7=BB=84=E4=BB=B6=E8=A7=86=E8=A7=89=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E7=BF=BB=E6=96=B0=20=E3=80=90=E9=97=AE=E9=A2=98=E5=8E=9F?= =?UTF-8?q?=E5=9B=A0=E3=80=91rt=20=E3=80=90=E6=94=B9=E5=8A=A8=E6=80=9D?= =?UTF-8?q?=E8=B7=AF=E3=80=91=E5=8F=AF=E6=8A=98=E5=8F=A0=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 9 ++- .../fr/design/foldablepane/HeaderPane.java | 64 ++++++++++--------- .../design/foldablepane/UIExpandablePane.java | 9 ++- .../theme/icon/triangle/triangle_down.svg | 4 ++ .../icon/triangle/triangle_down_small.svg | 4 ++ .../theme/icon/triangle/triangle_left.svg | 4 ++ .../icon/triangle/triangle_left_small.svg | 4 ++ .../theme/icon/triangle/triangle_right.svg | 4 ++ .../icon/triangle/triangle_right_small.svg | 4 ++ .../light/ui/laf/FineLightLaf.properties | 7 ++ .../cell/settingpane/CellOtherSetPane.java | 21 +++--- 11 files changed, 89 insertions(+), 45 deletions(-) create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_down.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_down_small.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_left.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_left_small.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_right.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_right_small.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 16aed93baf..40ee8c30aa 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -142,8 +142,15 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("param_view", "com/fine/theme/icon/param/view.svg", true, 18), // 北区菜单栏 - new SvgIconSource("notification", "com/fine/theme/icon/notification/notification.svg") + new SvgIconSource("notification", "com/fine/theme/icon/notification/notification.svg"), + // 三角 + new SvgIconSource("triangle_down", "com/fine/theme/icon/triangle/triangle_down.svg"), + new SvgIconSource("triangle_down_small", "com/fine/theme/icon/triangle/triangle_down_small.svg"), + new SvgIconSource("triangle_left", "com/fine/theme/icon/triangle/triangle_left.svg"), + new SvgIconSource("triangle_left_small", "com/fine/theme/icon/triangle/triangle_left_small.svg"), + new SvgIconSource("triangle_right", "com/fine/theme/icon/triangle/triangle_right.svg"), + new SvgIconSource("triangle_right_small", "com/fine/theme/icon/triangle/triangle_right_small.svg") ); } } diff --git a/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java b/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java index 07e0172373..a71cc5204f 100644 --- a/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java +++ b/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java @@ -1,39 +1,42 @@ package com.fr.design.foldablepane; +import com.fine.theme.icon.LazyIcon; import com.fr.base.GraphHelper; -import com.fr.design.constants.UIConstants; +import javax.swing.BorderFactory; +import javax.swing.Icon; import javax.swing.JFrame; import javax.swing.JPanel; +import javax.swing.UIManager; +import java.awt.AlphaComposite; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; +import java.awt.Font; +import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; -import java.awt.Image; +import java.awt.Insets; /** * Created by MoMeak on 2017/7/5. */ public class HeaderPane extends JPanel { private static final long serialVersionUID = 1L; - private static final int TITLE_X = 5; - private static final int LEFT_X = 16; - private static final int LEFT_Y = 6; - private static final int NORMAL_FONTSIZE = 12; private int headWidth; private int headHeight; private Color bgColor; private boolean isShow; private boolean isPressed = false; private String title; - private Image image; private int fontSize; + private final Icon triangleDown; + private final Icon triangleRight; + private final int hGap; public void setPressed(boolean pressed) { this.isPressed = pressed; } - public void setShow(boolean isShow) { this.isShow = isShow; } @@ -58,45 +61,44 @@ public class HeaderPane extends JPanel { @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); -// g2d.setColor(isPressed ? UIConstants.POPUP_TITLE_BACKGROUND : UIConstants.COMPONENT_BACKGROUND_COLOR); - headWidth = this.getWidth(); g2d.setColor(getBackground()); - g2d.fillRect(0, 0, headWidth, headHeight); -// g2d.setFont(new Font("SimSun", 0, fontSize)); - g2d.setPaint(getForeground()); - int leftWdith = headWidth - LEFT_X; + g2d.fillRect(0, 0, this.getWidth(), this.getHeight()); + + int iconY = (this.getHeight() - triangleDown.getIconHeight()) / 2; if (this.isShow) { - image = UIConstants.DRAG_DOWN_SELECTED_SMALL; - g2d.drawImage(image, leftWdith, LEFT_Y, null); + triangleDown.paintIcon(this, g2d, 0, iconY); } else { - image = UIConstants.DRAG_LEFT_NORMAL_SMALL; - g2d.drawImage(image, leftWdith, LEFT_Y, null); + triangleRight.paintIcon(this, g2d, 0, iconY); } - GraphHelper.drawString(g2d, this.title, TITLE_X, headHeight - fontSize / 2 - 1); - } + g2d.setFont(getFont()); + g2d.setPaint(getForeground()); + g2d.setComposite(AlphaComposite.SrcOver.derive((float) getForeground().getAlpha() / 255)); - @Override - public Dimension getPreferredSize() { - return new Dimension(this.getWidth(), headHeight); - } + FontMetrics metrics = g2d.getFontMetrics(); + int ascent = metrics.getAscent(); + int descent = metrics.getDescent(); - @Override - public Dimension getSize() { - return new Dimension(this.getWidth(), headHeight); + double titleY = (double) (getHeight() - (ascent + descent)) / 2 + ascent; + GraphHelper.drawString(g2d, this.title, triangleDown.getIconWidth() + this.hGap, titleY); + g2d.dispose(); } public HeaderPane(Color bgColor) { - this.bgColor = bgColor; this.isShow = true; - + triangleDown = new LazyIcon("triangle_down"); + triangleRight = new LazyIcon("triangle_right"); + this.hGap = UIManager.getInt("ExpandablePane.HeaderPane.hGap"); + this.setPreferredSize(new Dimension(UIManager.getInt("HeaderPane.width"), UIManager.getInt("HeaderPane.height"))); + Insets insets = UIManager.getInsets("ExpandablePane.HeaderPane.borderInsets"); + this.setForeground(UIManager.getColor("color.text.highlight")); + this.setFont(getFont().deriveFont(Font.BOLD)); + this.setBorder(BorderFactory.createEmptyBorder(insets.top, insets.left, insets.bottom, insets.right)); } public HeaderPane(Color bgColor, String title, int headHeight) { this(bgColor); this.title = title; - this.headHeight = headHeight; - this.fontSize = NORMAL_FONTSIZE; } public static void main(String[] args) { diff --git a/designer-base/src/main/java/com/fr/design/foldablepane/UIExpandablePane.java b/designer-base/src/main/java/com/fr/design/foldablepane/UIExpandablePane.java index 9ed2d9757b..7d27031468 100644 --- a/designer-base/src/main/java/com/fr/design/foldablepane/UIExpandablePane.java +++ b/designer-base/src/main/java/com/fr/design/foldablepane/UIExpandablePane.java @@ -1,7 +1,10 @@ package com.fr.design.foldablepane; -import javax.swing.*; -import java.awt.*; +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.UIManager; +import java.awt.BorderLayout; +import java.awt.Color; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -42,7 +45,7 @@ public class UIExpandablePane extends JPanel { } private void initComponents() { - this.setLayout(new BorderLayout()); + this.setLayout(new BorderLayout(0, UIManager.getInt("ExpandablePane.vGap"))); headerPanel = new HeaderPane(color, title, headHeight); headerPanel.addMouseListener(new PanelAction()); diff --git a/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_down.svg b/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_down.svg new file mode 100755 index 0000000000..7a0d1e3443 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_down.svg @@ -0,0 +1,4 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_down_small.svg b/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_down_small.svg new file mode 100755 index 0000000000..b513a4de7f --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_down_small.svg @@ -0,0 +1,4 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_left.svg b/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_left.svg new file mode 100755 index 0000000000..0e9c0637ba --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_left.svg @@ -0,0 +1,4 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_left_small.svg b/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_left_small.svg new file mode 100755 index 0000000000..7307860955 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_left_small.svg @@ -0,0 +1,4 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_right.svg b/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_right.svg new file mode 100755 index 0000000000..cfdd78d161 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_right.svg @@ -0,0 +1,4 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_right_small.svg b/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_right_small.svg new file mode 100755 index 0000000000..af6ac0335a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/triangle/triangle_right_small.svg @@ -0,0 +1,4 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index 1574aeb674..64685e8553 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -92,6 +92,7 @@ ViewportUI = com.formdev.flatlaf.ui.FlatViewportUI color.brand.normal=#2576EF color.text.white=#ffffff color.text.placeholder=#0A1C3878 +color.text.highlight=#0A1C38E6 # general background and foreground (text color) @@ -1061,6 +1062,12 @@ Tree.hash = darken($Tree.background,10%) #---- West ---- West.border = #DADEE7 +#---- ExpandablePane ---- +ExpandablePane.HeaderPane.borderInsets=0, 6, 0, 6 +ExpandablePane.HeaderPane.hGap=2 +ExpandablePane.vGap=10 +HeaderPane.width=248 +HeaderPane.height=24 #---- East ---- East.border = #DADEE7 diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java index 5ac64d401a..6f01d9e192 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java @@ -141,17 +141,18 @@ public class CellOtherSetPane extends AbstractCellAttrPane { * @return 面板 */ public JPanel createContentPane() { - JPanel contentPane = FRGUIPaneFactory.createVerticalFlowLayout_F_Pane(true, VerticalFlowLayout.TOP, 0, 0, true); - - contentPane.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Basic"), HEAD_WDITH, HEAD_HEIGTH, basicPane())); - contentPane.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advaced"), HEAD_WDITH, HEAD_HEIGTH, seniorPane())); - contentPane.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Pagination"), HEAD_WDITH, HEAD_HEIGTH, pagePane())); - contentPane.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Desensitization"), HEAD_WDITH, HEAD_HEIGTH, desensitizePane())); - // VerticalFlowLayout 与 实现的滚动条有冲突,因此再加一层panel - JPanel jPanel = new JPanel(); - jPanel.add(contentPane); + + Component[][] components = new Component[][]{ + new Component[]{new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Basic"), HEAD_WDITH, HEAD_HEIGTH, basicPane())}, + new Component[]{new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advaced"), HEAD_WDITH, HEAD_HEIGTH, seniorPane())}, + new Component[]{new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Pagination"), HEAD_WDITH, HEAD_HEIGTH, pagePane())}, + new Component[]{new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Desensitization"), HEAD_WDITH, HEAD_HEIGTH, desensitizePane())} + }; + + JPanel tableLayoutPane = TableLayoutHelper.createTableLayoutPane(components, new double[]{p, p, p, p}, new double[]{f}); + initAllNames(); - return jPanel; + return tableLayoutPane; } private JPanel desensitizePane() { From faff0f39595a2704f4183eac3b650ac1d4d19a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Thu, 7 Dec 2023 16:37:39 +0800 Subject: [PATCH 021/302] =?UTF-8?q?REPORT-107972=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0-UIComboBox?= =?UTF-8?q?=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineComboBoxUI.java | 41 ++++++++++ .../fine/theme/light/ui/FineLightIconSet.java | 1 + .../java/com/fr/design/event/HoverAware.java | 13 ++++ .../gui/icombobox/ExtendedComboBox.java | 4 +- .../design/gui/icombobox/FRTreeComboBox.java | 78 +------------------ .../fr/design/gui/icombobox/UIComboBox.java | 47 ++++++----- .../com/fine/theme/icon/down_arrow.svg | 5 ++ .../fine/theme/icon/down_arrow_disable.svg | 5 ++ .../light/ui/laf/FineLightLaf.properties | 28 ++++--- 9 files changed, 113 insertions(+), 109 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineComboBoxUI.java create mode 100644 designer-base/src/main/java/com/fr/design/event/HoverAware.java create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/down_arrow.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/down_arrow_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineComboBoxUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineComboBoxUI.java new file mode 100644 index 0000000000..a335aba921 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineComboBoxUI.java @@ -0,0 +1,41 @@ +package com.fine.theme.light.ui; + +import com.formdev.flatlaf.ui.FlatComboBoxUI; + +import javax.swing.JComponent; +import javax.swing.JButton; +import javax.swing.SwingConstants; +import javax.swing.plaf.ComponentUI; +import java.awt.Graphics2D; + +/** + * 提供 {@link javax.swing.JComboBox} 的UI类 + * + * @author Levy.Xie + * @since 11.0 + * Created on 2023/12/07 + */ +public class FineComboBoxUI extends FlatComboBoxUI { + + public static ComponentUI createUI(JComponent c) { + return new FineComboBoxUI(); + } + + @Override + protected JButton createArrowButton() { + return new FineComboBoxButton(); + } + + protected class FineComboBoxButton extends FlatComboBoxButton { + + @Override + protected void paintArrow(Graphics2D g) { + if (isPopupVisible(comboBox)) { + setDirection(SwingConstants.NORTH); + } else { + setDirection(SwingConstants.SOUTH); + } + super.paintArrow(g); + } + } +} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 40ee8c30aa..489c6d2219 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -34,6 +34,7 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("add", "com/fine/theme/icon/add.svg", true), new SvgIconSource("drag_left", "com/fine/theme/icon/drag_left.svg", true), new SvgIconSource("drag_right", "com/fine/theme/icon/drag_right.svg", true), + new SvgIconSource("down_arrow", "com/fine/theme/icon/down_arrow.svg", true), // 数据集相关Icon new SvgIconSource("database", "com/fine/theme/icon/dataset/database.svg", true), diff --git a/designer-base/src/main/java/com/fr/design/event/HoverAware.java b/designer-base/src/main/java/com/fr/design/event/HoverAware.java new file mode 100644 index 0000000000..36af8275db --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/event/HoverAware.java @@ -0,0 +1,13 @@ +package com.fr.design.event; + +/** + * 组件判断是否被hover的能力接口 + * + * @author Levy.Xie + * @since 11.0 + * Created on 2023/12/07 + */ +public interface HoverAware { + + boolean isHovered(); +} diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/ExtendedComboBox.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/ExtendedComboBox.java index 70fa9dccdf..9fc3d9e172 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombobox/ExtendedComboBox.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/ExtendedComboBox.java @@ -1,12 +1,12 @@ package com.fr.design.gui.icombobox; +import com.fine.theme.light.ui.FineComboBoxUI; import com.fr.common.inputevent.InputEventBaseOnOS; import java.awt.Component; import java.awt.Dimension; import java.awt.Point; import java.awt.Rectangle; -import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.util.Vector; @@ -54,7 +54,7 @@ public class ExtendedComboBox extends UIComboBox { return dim; } - static class ExtendedComboBoxUI extends UIBasicComboBoxUI { + static class ExtendedComboBoxUI extends FineComboBoxUI { public static ComponentUI createUI(JComponent c) { return new ExtendedComboBoxUI(); } diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/FRTreeComboBox.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/FRTreeComboBox.java index c122394476..abb6f2d982 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombobox/FRTreeComboBox.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/FRTreeComboBox.java @@ -1,5 +1,6 @@ package com.fr.design.gui.icombobox; +import com.fine.theme.light.ui.FineComboBoxUI; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; @@ -248,8 +249,7 @@ public class FRTreeComboBox extends UIComboBox { private static TreePopup treePopup; - protected static class FRTreeComboBoxUI extends BasicComboBoxUI implements MouseListener{ - private boolean isRollover = false; + protected static class FRTreeComboBoxUI extends FineComboBoxUI { public FRTreeComboBoxUI() { super(); @@ -258,81 +258,7 @@ public class FRTreeComboBox extends UIComboBox { treePopup = new TreePopup(comboBox); return treePopup; } - @Override - protected UIButton createArrowButton() { - arrowButton = new UIButton(UIConstants.ARROW_DOWN_ICON){ - /** - * 组件是否需要响应添加的观察者事件 - * - * @return 如果需要响应观察者事件则返回true,否则返回false - */ - @Override - public boolean shouldResponseChangeListener() { - return false; - } - }; - ((UIButton) arrowButton).setRoundBorder(true, Constants.LEFT); - arrowButton.addMouseListener(this); - comboBox.addMouseListener(this); - return (UIButton) arrowButton; - } - - public void paint(Graphics g, JComponent c) { - super.paint(g, c); - Graphics2D g2d = (Graphics2D)g; - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - Color linecolor = null; - if (comboBox.isPopupVisible()) { - linecolor = UIConstants.LINE_COLOR; - arrowButton.setSelected(true); - } else if (isRollover) { - linecolor = UIConstants.LIGHT_BLUE; - } else { - linecolor = UIConstants.LINE_COLOR; - arrowButton.setSelected(false); - } - g2d.setColor(linecolor); - if (!comboBox.isPopupVisible()) { - g2d.drawRoundRect(0, 0, c.getWidth() - arrowButton.getWidth() + 3, c.getHeight() - 1, UIConstants.LARGEARC, UIConstants.LARGEARC); - } else { - g2d.drawRoundRect(0, 0, c.getWidth() , c.getHeight() + 3, UIConstants.LARGEARC, UIConstants.LARGEARC ); - g2d.drawLine(0, c.getHeight()-1, c.getWidth(), c.getHeight()-1); - } - } - - - - private void setRollover(boolean isRollover) { - if (this.isRollover != isRollover) { - this.isRollover = isRollover; - comboBox.repaint(); - } - } - @Override - public void mouseEntered(MouseEvent e) { - setRollover(true); - } - - @Override - public void mouseExited(MouseEvent e) { - setRollover(false); - } - - @Override - public void mouseClicked(MouseEvent e) { - // do nothing - } - - @Override - public void mousePressed(MouseEvent e) { - - } - - @Override - public void mouseReleased(MouseEvent e) { - - } } /** diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBox.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBox.java index e7f6578dc9..62ac619181 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBox.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBox.java @@ -1,13 +1,16 @@ package com.fr.design.gui.icombobox; +import com.fine.theme.light.ui.FineComboBoxUI; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; +import com.fr.design.event.HoverAware; import javax.swing.ComboBoxModel; import javax.swing.JComboBox; import javax.swing.ListCellRenderer; +import javax.swing.UIManager; import javax.swing.plaf.ComboBoxUI; import javax.swing.plaf.basic.ComboPopup; import java.awt.Dimension; @@ -15,6 +18,8 @@ import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.util.List; import java.util.Vector; @@ -28,16 +33,13 @@ import java.util.Vector; * @author zhou * @since 2012-5-9下午3:18:58 */ -public class UIComboBox extends JComboBox implements UIObserver, GlobalNameObserver { +public class UIComboBox extends JComboBox implements UIObserver, GlobalNameObserver, HoverAware { - /** - * - */ private static final long serialVersionUID = 1L; - private static final int SIZE = 20; + private static final int SIZE = UIManager.getInt("ComboBox.comboHeight"); - private static final int SIZE5 = 5; + private static final int RENDER_FIX_SIZE = 5; protected UIObserverListener uiObserverListener; @@ -45,6 +47,8 @@ public class UIComboBox extends JComboBox implements UIObserver, GlobalNameObser private GlobalNameListener globalNameListener = null; + private boolean hovered; + public UIComboBox() { super(); init(); @@ -67,7 +71,6 @@ public class UIComboBox extends JComboBox implements UIObserver, GlobalNameObser private void init() { setOpaque(false); -// setUI(getUIComboBoxUI()); setRenderer(new UIComboBoxRenderer()); setEditor(new UIComboBoxEditor()); initListener(); @@ -93,6 +96,18 @@ public class UIComboBox extends JComboBox implements UIObserver, GlobalNameObser } } }); + this.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + hovered = true; + repaint(); + } + @Override + public void mouseExited(MouseEvent e) { + hovered = false; + repaint(); + } + }); } } @@ -104,7 +119,7 @@ public class UIComboBox extends JComboBox implements UIObserver, GlobalNameObser protected ComboBoxUI getUIComboBoxUI() { - return new UIComboBoxUI(); + return new FineComboBoxUI(); } /** @@ -129,7 +144,7 @@ public class UIComboBox extends JComboBox implements UIObserver, GlobalNameObser @Override public Dimension getPreferredSize() { //加5的原因在于:render里,每一个项前面了空了一格,要多几像素 - return new Dimension(super.getPreferredSize().width + SIZE5, SIZE); + return new Dimension(super.getPreferredSize().width + RENDER_FIX_SIZE, SIZE); } public void refreshBoxItems(List list) { @@ -161,15 +176,6 @@ public class UIComboBox extends JComboBox implements UIObserver, GlobalNameObser } -// /** -// * -// */ -// @Override -// public void updateUI() { -// setUI(getUIComboBoxUI()); -// } - - /** * @param listener 观察者监听事件 */ @@ -210,5 +216,8 @@ public class UIComboBox extends JComboBox implements UIObserver, GlobalNameObser return true; } - + @Override + public boolean isHovered() { + return hovered; + } } \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fine/theme/icon/down_arrow.svg b/designer-base/src/main/resources/com/fine/theme/icon/down_arrow.svg new file mode 100644 index 0000000000..1b2194ef08 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/down_arrow.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/down_arrow_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/down_arrow_disable.svg new file mode 100644 index 0000000000..65d7345b73 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/down_arrow_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index 64685e8553..a81e07fbad 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -47,7 +47,7 @@ ButtonUI = com.formdev.flatlaf.ui.FlatButtonUI CheckBoxUI = com.formdev.flatlaf.ui.FlatCheckBoxUI CheckBoxMenuItemUI = com.formdev.flatlaf.ui.FlatCheckBoxMenuItemUI ColorChooserUI = com.formdev.flatlaf.ui.FlatColorChooserUI -ComboBoxUI = com.formdev.flatlaf.ui.FlatComboBoxUI +ComboBoxUI = com.fine.theme.light.ui.FineComboBoxUI DesktopIconUI = com.formdev.flatlaf.ui.FlatDesktopIconUI DesktopPaneUI = com.formdev.flatlaf.ui.FlatDesktopPaneUI EditorPaneUI = com.formdev.flatlaf.ui.FlatEditorPaneUI @@ -161,6 +161,10 @@ controlHighlight = lighten($controlShadow,12%) controlLtHighlight = lighten($controlShadow,25%) controlDkShadow = darken($controlShadow,15%) DarkenedFontColor = #091E40 +defaultBorderColor = #DADEE7 +defaultHighlightBorderColor = #2576EF +defaultBorderFocusShadow = #2576ef19 +defaultBorderFocusWidth = 1 #---- Button ---- @@ -277,7 +281,7 @@ ColorChooser.swatchesDefaultRecentColor = $control #---- ComboBox ---- -ComboBox.border = com.formdev.flatlaf.ui.FlatRoundBorder +ComboBox.border = com.fine.theme.light.ui.FineRoundBorder ComboBox.padding = @componentMargin ComboBox.minimumWidth = 72 ComboBox.editorColumns = 0 @@ -285,21 +289,21 @@ ComboBox.maximumRowCount = 15 [mac]ComboBox.showPopupOnNavigation = true # allowed values: auto, button or none ComboBox.buttonStyle = auto -ComboBox.background = @componentBackground +ComboBox.background = #FFF ComboBox.buttonBackground = $ComboBox.background ComboBox.buttonEditableBackground = darken($ComboBox.background,2%) -ComboBox.buttonSeparatorColor = $Component.borderColor +ComboBox.buttonSeparatorColor = $ComboBox.background ComboBox.buttonDisabledSeparatorColor = $Component.disabledBorderColor -ComboBox.buttonArrowColor = @buttonArrowColor +ComboBox.buttonArrowColor = #0A1C38 ComboBox.buttonDisabledArrowColor = @buttonDisabledArrowColor -ComboBox.buttonHoverArrowColor = @buttonHoverArrowColor -ComboBox.buttonPressedArrowColor = @buttonPressedArrowColor +ComboBox.buttonHoverArrowColor = #0A1C38 +ComboBox.buttonPressedArrowColor = #0A1C38 ComboBox.popupInsets = 0,0,0,0 ComboBox.selectionInsets = 0,0,0,0 ComboBox.selectionArc = 0 -ComboBox.borderCornerRadius = $Popup.borderCornerRadius - +ComboBox.borderCornerRadius = 3 +ComboBox.comboHeight = 24 #---- Component ---- @@ -1061,7 +1065,7 @@ Tree.icon.openColor = @icon Tree.hash = darken($Tree.background,10%) #---- West ---- -West.border = #DADEE7 +West.border = $defaultBorderColor #---- ExpandablePane ---- ExpandablePane.HeaderPane.borderInsets=0, 6, 0, 6 ExpandablePane.HeaderPane.hGap=2 @@ -1070,7 +1074,7 @@ HeaderPane.width=248 HeaderPane.height=24 #---- East ---- -East.border = #DADEE7 +East.border = $defaultBorderColor East.TabSelectedColor = #B3CFF9 #---- South ---- @@ -1086,7 +1090,7 @@ South.SheetSelectedColor = #FFF North.userinfoLabel.borderMargins=2, 16, 2, 16 North.userinfoLabel.width=80 North.userinfoLabel.height=24 -North.border = #DADEE7 +North.border = $defaultBorderColor North.coverPane.background = #0a1c38 North.coverPane.radius = 8 From da6ad1d677a775eb81df8cd20c66e751c8f95a46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Thu, 7 Dec 2023 16:37:48 +0800 Subject: [PATCH 022/302] =?UTF-8?q?REPORT-107972=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0-UIComboBox?= =?UTF-8?q?=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineRoundBorder.java | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineRoundBorder.java diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineRoundBorder.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineRoundBorder.java new file mode 100644 index 0000000000..280f3ca746 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineRoundBorder.java @@ -0,0 +1,59 @@ +package com.fine.theme.light.ui; + +import com.formdev.flatlaf.ui.FlatRoundBorder; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.fr.design.event.HoverAware; + +import javax.swing.UIManager; +import java.awt.Color; +import java.awt.Component; +import java.awt.Paint; + + +/** + * 通用的Border类,具备hover、click、禁用等多种状态 + * + * @author Levy.Xie + * @since 11.0 + * Created on 2023/12/06 + */ +public class FineRoundBorder extends FlatRoundBorder { + + @Styleable(dot = true) + protected Color borderColor = UIManager.getColor("defaultBorderColor"); + @Styleable(dot = true) + protected Color disabledBorderColor = UIManager.getColor("defaultBorderColor"); + @Styleable(dot = true) + protected Color highlightBorderColor = UIManager.getColor("defaultHighlightBorderColor"); + @Styleable(dot = true) + protected Color focusColor = UIManager.getColor("defaultBorderFocusShadow"); + @Styleable(dot = true) + protected int focusWidth = UIManager.getInt("defaultBorderFocusWidth"); + + @Override + protected Paint getBorderColor(Component c) { + if (isEnabled(c)) { + if (c instanceof HoverAware && ((HoverAware) c).isHovered()) { + return getHoverBorderColor(); + } else { + return isFocused(c) ? focusedBorderColor : borderColor; + } + } + return disabledBorderColor; + } + + @Override + protected Color getFocusColor(Component c) { + return focusColor; + } + + @Override + protected int getFocusWidth(Component c) { + return focusWidth; + } + + protected Color getHoverBorderColor() { + return highlightBorderColor; + } + +} From 48041e6d5382ce96b5a452010b1e5af3b84f9f00 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Fri, 8 Dec 2023 09:36:39 +0800 Subject: [PATCH 023/302] =?UTF-8?q?REPORT-107973=20=E4=B8=BB=E9=A1=B5?= =?UTF-8?q?=E5=8F=8A=E7=BB=84=E4=BB=B6=E8=A7=86=E8=A7=89=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E7=BF=BB=E6=96=B0=20=E3=80=90=E9=97=AE=E9=A2=98=E5=8E=9F?= =?UTF-8?q?=E5=9B=A0=E3=80=91rt=20=E3=80=90=E6=94=B9=E5=8A=A8=E6=80=9D?= =?UTF-8?q?=E8=B7=AF=E3=80=91=E6=BB=91=E5=9D=97=E3=80=81=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E6=A1=86=E3=80=81=E6=96=87=E6=9C=AC=E5=9F=9F=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 6 +- .../fr/design/editor/editor/TextEditor.java | 2 - .../fr/design/foldablepane/HeaderPane.java | 2 +- .../fr/design/gui/itextarea/UITextArea.java | 87 ++++++++----------- .../fr/design/gui/itextfield/UITextField.java | 86 ++++++------------ .../fr/design/mainframe/JFormSliderPane.java | 12 ++- .../mainframe/loghandler/LogMessageBar.java | 2 +- .../com/fine/theme/icon/zoom/zoomIn.svg | 5 ++ .../fine/theme/icon/zoom/zoomIn_disable.svg | 5 ++ .../com/fine/theme/icon/zoom/zoomOut.svg | 4 + .../fine/theme/icon/zoom/zoomOut_disable.svg | 4 + .../light/ui/laf/FineLightLaf.properties | 50 ++++++----- .../fr/design/mainframe/bbs/UserInfoPane.java | 4 +- 13 files changed, 127 insertions(+), 142 deletions(-) create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/zoom/zoomIn.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/zoom/zoomIn_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/zoom/zoomOut.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/zoom/zoomOut_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 489c6d2219..38aa9fd0c0 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -151,7 +151,11 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("triangle_left", "com/fine/theme/icon/triangle/triangle_left.svg"), new SvgIconSource("triangle_left_small", "com/fine/theme/icon/triangle/triangle_left_small.svg"), new SvgIconSource("triangle_right", "com/fine/theme/icon/triangle/triangle_right.svg"), - new SvgIconSource("triangle_right_small", "com/fine/theme/icon/triangle/triangle_right_small.svg") + new SvgIconSource("triangle_right_small", "com/fine/theme/icon/triangle/triangle_right_small.svg"), + + // 滚动条 + new SvgIconSource("zoomIn", "com/fine/theme/icon/zoom/zoomIn.svg", true), + new SvgIconSource("zoomOut", "com/fine/theme/icon/zoom/zoomOut.svg", true) ); } } diff --git a/designer-base/src/main/java/com/fr/design/editor/editor/TextEditor.java b/designer-base/src/main/java/com/fr/design/editor/editor/TextEditor.java index 7084fbcc45..26bd7cad0a 100644 --- a/designer-base/src/main/java/com/fr/design/editor/editor/TextEditor.java +++ b/designer-base/src/main/java/com/fr/design/editor/editor/TextEditor.java @@ -5,7 +5,6 @@ package com.fr.design.editor.editor; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; - import com.fr.stable.StringUtils; import java.awt.BorderLayout; @@ -40,7 +39,6 @@ public class TextEditor extends Editor { public TextEditor(String value) { this.setLayout(FRGUIPaneFactory.createBorderLayout()); textField = new UITextField(); - textField.setBorder(null); this.add(textField, BorderLayout.CENTER); this.textField.addKeyListener(textKeyListener); diff --git a/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java b/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java index a71cc5204f..a0a60a00a0 100644 --- a/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java +++ b/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java @@ -91,7 +91,7 @@ public class HeaderPane extends JPanel { this.hGap = UIManager.getInt("ExpandablePane.HeaderPane.hGap"); this.setPreferredSize(new Dimension(UIManager.getInt("HeaderPane.width"), UIManager.getInt("HeaderPane.height"))); Insets insets = UIManager.getInsets("ExpandablePane.HeaderPane.borderInsets"); - this.setForeground(UIManager.getColor("color.text.highlight")); + this.setForeground(UIManager.getColor("ExpandablePane.HeaderPane.foreground")); this.setFont(getFont().deriveFont(Font.BOLD)); this.setBorder(BorderFactory.createEmptyBorder(insets.top, insets.left, insets.bottom, insets.right)); } diff --git a/designer-base/src/main/java/com/fr/design/gui/itextarea/UITextArea.java b/designer-base/src/main/java/com/fr/design/gui/itextarea/UITextArea.java index 5f788e0621..f50ae90d8a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itextarea/UITextArea.java +++ b/designer-base/src/main/java/com/fr/design/gui/itextarea/UITextArea.java @@ -1,18 +1,31 @@ package com.fr.design.gui.itextarea; import com.fr.common.inputevent.InputEventBaseOnOS; +import com.fr.design.event.HoverAware; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; -import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.stable.Constants; -import javax.swing.*; +import javax.swing.JTextArea; +import javax.swing.UIManager; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import java.awt.*; - -public class UITextArea extends JTextArea implements UIObserver { +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +/** + * 文本域 + * + * @author + * @create on 2016 + * @since + */ +public class UITextArea extends JTextArea implements UIObserver, HoverAware { private UIObserverListener uiObserverListener; + private boolean hover; + private Dimension preferredSize; + private final int HEIGHT = UIManager.getInt("TextArea.height"); public UITextArea(int i, int j) { super(i, j); @@ -20,11 +33,6 @@ public class UITextArea extends JTextArea implements UIObserver { initComponents(); } - @Override - public Insets getInsets() { - return new Insets(5, 5, 5, 5); - } - public UITextArea() { super(); InputEventBaseOnOS.addBasicEditInputMap(this); @@ -40,6 +48,7 @@ public class UITextArea extends JTextArea implements UIObserver { private void initComponents() { setLineWrap(true); setWrapStyleWord(true); + setMinimumSize(new Dimension(getMinimumSize().width, HEIGHT)); initListener(); } @@ -73,6 +82,20 @@ public class UITextArea extends JTextArea implements UIObserver { }); } }); + + this.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + hover = true; + repaint(); + } + + @Override + public void mouseExited(MouseEvent e) { + hover = false; + repaint(); + } + }); } } @@ -83,32 +106,6 @@ public class UITextArea extends JTextArea implements UIObserver { } @Override - /** - * - */ - public UITextAreaUI getUI() { - return (UITextAreaUI) ui; - } - - @Override - /** - * - */ - public void updateUI() { - this.setUI(new UITextAreaUI(this)); - } - - @Override - protected void paintBorder(Graphics g) { - if (getBorder() != null) { - getUI().paintBorder((Graphics2D) g, getWidth(), getHeight(), true, Constants.NULL); - } - } - - @Override - /** - * - */ public void registerChangeListener(UIObserverListener listener) { uiObserverListener = listener; } @@ -120,18 +117,8 @@ public class UITextArea extends JTextArea implements UIObserver { return true; } - /** - * @param args - */ - public static void main(String... args) { -// JFrame jf = new JFrame("test"); -// jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); -// JPanel content = (JPanel) jf.getContentPane(); -// content.setLayout(new BorderLayout()); -// UITextArea bb = new UITextArea("123455weoijweio reiwj kewl jfejkfljds kl jfldk jfk jdskfjkdsfklj dkl jfsdjf"); -// content.add(bb, BorderLayout.CENTER); -// GUICoreUtils.centerWindow(jf); -// jf.setSize(400, 400); -// jf.setVisible(true); + @Override + public boolean isHovered() { + return hover; } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/itextfield/UITextField.java b/designer-base/src/main/java/com/fr/design/gui/itextfield/UITextField.java index 5be57fb018..b9e8e3351c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itextfield/UITextField.java +++ b/designer-base/src/main/java/com/fr/design/gui/itextfield/UITextField.java @@ -3,6 +3,7 @@ package com.fr.design.gui.itextfield; import com.fr.common.inputevent.InputEventBaseOnOS; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; +import com.fr.design.event.HoverAware; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; import com.fr.design.utils.gui.GUICoreUtils; @@ -12,22 +13,21 @@ import com.fr.stable.StringUtils; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; +import javax.swing.UIManager; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.Document; import java.awt.Color; import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Insets; import java.awt.LayoutManager; -import java.awt.RenderingHints; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; /** * @author Jerry */ -public class UITextField extends JTextField implements UIObserver, GlobalNameObserver { +public class UITextField extends JTextField implements UIObserver, GlobalNameObserver, HoverAware { private boolean isBorderPainted = true; private boolean isRoundBorder = true; private int rectDirection = Constants.NULL; @@ -36,10 +36,13 @@ public class UITextField extends JTextField implements UIObserver, GlobalNameObs private GlobalNameListener globalNameListener = null; private Dimension preferredSize = null; private String placeholder = StringUtils.EMPTY; + private final int HEIGHT = UIManager.getInt("TextField.height"); //有些情况下setText的时候不希望触发attributeChange,添加一个属性标识 private boolean isSetting = false; + private boolean hover = false; + public UITextField() { super(); init(); @@ -70,6 +73,7 @@ public class UITextField extends JTextField implements UIObserver, GlobalNameObs */ public void init() { InputEventBaseOnOS.addBasicEditInputMap(this); + setPreferredSize(new Dimension(getPreferredSize().width, HEIGHT)); initListener(); } @@ -91,6 +95,20 @@ public class UITextField extends JTextField implements UIObserver, GlobalNameObs attributeChange(); } }); + + this.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + hover = true; + repaint(); + } + + @Override + public void mouseExited(MouseEvent e) { + hover = false; + repaint(); + } + }); } } @@ -111,10 +129,6 @@ public class UITextField extends JTextField implements UIObserver, GlobalNameObs isSetting = setting; } - public void setPreferredSize(Dimension preferredSize) { - this.preferredSize = preferredSize; - } - public void setGlobalName(String name) { textFieldName = name; } @@ -131,59 +145,11 @@ public class UITextField extends JTextField implements UIObserver, GlobalNameObs } } - @Override - public Insets getInsets() { - return new Insets(0, 4, 0, 4); - } - - @Override - public Dimension getPreferredSize() { - if (preferredSize == null) { - return new Dimension(super.getPreferredSize().width, 20); - } - return preferredSize; - } - -// @Override -// public UITextFieldUI getUI() { -// return (UITextFieldUI) ui; -// } - /** * 设置变化的背景颜色 */ public void setBackgroundUIColor(Color color) { - ((UITextFieldUI) this.ui).setBackgroundColor4NoGiveNumber(color); - } - - /** - * 更新UI - */ -// public void updateUI() { -// this.setUI(new UITextFieldUI(this)); -// } - - @Override - protected void paintComponent(final Graphics pG) { - super.paintComponent(pG); - if (placeholder.length() == 0 || getText().length() > 0) { - return; - } - final Graphics2D g = (Graphics2D) pG; - g.setRenderingHint( - RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - g.setColor(getDisabledTextColor()); - g.drawString(placeholder, getInsets().left, pG.getFontMetrics() - .getMaxAscent() + getInsets().top + 1); - } - - @Override - protected void paintBorder(Graphics g) { - if (!isBorderPainted) { - return; - } -// getUI().paintBorder((Graphics2D) g, getWidth(), getHeight(), isRoundBorder, rectDirection); +// ((UITextFieldUI) this.ui).setBackgroundColor4NoGiveNumber(color); } /** @@ -262,4 +228,8 @@ public class UITextField extends JTextField implements UIObserver, GlobalNameObs this.isBorderPainted = isBorderPainted; } + @Override + public boolean isHovered() { + return hover; + } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java b/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java index 71702a0d5e..4629b60681 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe; +import com.fine.theme.icon.LazyIcon; import com.formdev.flatlaf.FlatDarculaLaf; import com.fr.base.BaseUtils; import com.fr.design.gui.ibutton.UIButton; @@ -47,7 +48,7 @@ public class JFormSliderPane extends JPanel { private static final int HUNDRED = 100; private static final int TWO_HUNDRED = 200; private static final int FOUR_HUNDRED = 400; - private static final int SHOWVALBUTTON_WIDTH = 35; + private static final int SHOWVALBUTTON_WIDTH = 40; private static final int SHOWVALBUTTON_HEIGHTH = 20; private static final String SUFFIX = "%"; private static final int TOOLTIP_Y = 30; @@ -91,7 +92,6 @@ public class JFormSliderPane extends JPanel { } }; slider.setValue(HALF_HUNDRED); -// slider.setUI(new JSliderPaneUI(slider)); slider.addChangeListener(listener); slider.setPreferredSize(new Dimension(220, 20)); //去掉虚线框 @@ -101,21 +101,19 @@ public class JFormSliderPane extends JPanel { private void initDownUpButton() { - downButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/data/source/normalDown20.png"), BaseUtils.readIcon("com/fr/design/images/data/source/hoverDown20.png"), BaseUtils.readIcon("com/fr/design/images/data/source/hoverDown20.png")) { + downButton = new UIButton(new LazyIcon("zoomOut")) { public Point getToolTipLocation(MouseEvent event) { return new Point(event.getX(), event.getY() - TOOLTIP_Y); } }; -// downButton.setOpaque(false); downButton.setBorderPainted(false); downButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Scale_Down")); - upButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/data/source/normalUp20.png"), BaseUtils.readIcon("com/fr/design/images/data/source/hoverUp20.png"), BaseUtils.readIcon("com/fr/design/images/data/source/hoverUp20.png")) { + upButton = new UIButton(new LazyIcon("zoomIn")) { public Point getToolTipLocation(MouseEvent event) { return new Point(event.getX(), event.getY() - TOOLTIP_Y); } }; -// upButton.setOpaque(false); -// upButton.setBorderPainted(false); + upButton.setBorderPainted(false); upButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Scale_Up")); downButton.setActionCommand("less"); upButton.setActionCommand("more"); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java index f94c9b94d9..21419fcb3e 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java @@ -41,7 +41,7 @@ public class LogMessageBar extends JPanel { messageLabel = new UILabel(); setLayout(new BorderLayout()); add(messageLabel, BorderLayout.CENTER); - messageLabel.setForeground(UIManager.getColor("color.text.placeholder")); + messageLabel.setForeground(UIManager.getColor("North.messageLabel.foreground")); addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { diff --git a/designer-base/src/main/resources/com/fine/theme/icon/zoom/zoomIn.svg b/designer-base/src/main/resources/com/fine/theme/icon/zoom/zoomIn.svg new file mode 100755 index 0000000000..790d769618 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/zoom/zoomIn.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/zoom/zoomIn_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/zoom/zoomIn_disable.svg new file mode 100755 index 0000000000..2b0be23758 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/zoom/zoomIn_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/zoom/zoomOut.svg b/designer-base/src/main/resources/com/fine/theme/icon/zoom/zoomOut.svg new file mode 100755 index 0000000000..9fdc2c5839 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/zoom/zoomOut.svg @@ -0,0 +1,4 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/zoom/zoomOut_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/zoom/zoomOut_disable.svg new file mode 100755 index 0000000000..e37d2a4521 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/zoom/zoomOut_disable.svg @@ -0,0 +1,4 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index a81e07fbad..f85fd82a16 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -89,15 +89,11 @@ ViewportUI = com.formdev.flatlaf.ui.FlatViewportUI #---- variables ---- -color.brand.normal=#2576EF -color.text.white=#ffffff -color.text.placeholder=#0A1C3878 -color.text.highlight=#0A1C38E6 - +Component.defaultHeight=24 # general background and foreground (text color) @background = #F6F8FA -@foreground = #0B1B39 +@foreground=#0A1C38 @disabledBackground = @background @disabledForeground = tint(@foreground,55%) @@ -165,6 +161,14 @@ defaultBorderColor = #DADEE7 defaultHighlightBorderColor = #2576EF defaultBorderFocusShadow = #2576ef19 defaultBorderFocusWidth = 1 +brand.normal=#2576EF +background.normal=#FFFFFF +text.white=#ffffff +text.placeholder=fade(@foreground, 40%) +text.highlight=fade(@foreground, 90%) +fill.hover=#E6E9EF +fill.normal=#FFFFFF +border.divider=#DADEE7 #---- Button ---- @@ -697,13 +701,14 @@ Slider.focusInsets = 0,0,0,0 Slider.trackWidth = 2 Slider.thumbSize = 12,12 Slider.focusWidth = 4 -Slider.trackValueColor = @accentSliderColor -Slider.trackColor = darken(@background,18%) -Slider.thumbColor = $Slider.trackValueColor +Slider.trackValueColor=$brand.normal +Slider.trackColor=$border.divider +Slider.thumbColor=$fill.normal +Slider.thumbBorderColor=$border.divider Slider.tickColor = @disabledForeground Slider.focusedColor = fade(changeLightness($Component.focusColor,75%,derived),50%,derived) -Slider.hoverThumbColor = darken($Slider.thumbColor,5%,derived) -Slider.pressedThumbColor = darken($Slider.thumbColor,8%,derived) +Slider.hoverThumbColor=$fill.hover +Slider.pressedThumbColor=$fill.hover Slider.disabledTrackColor = darken(@background,13%) Slider.disabledThumbColor = $Slider.disabledTrackColor @@ -864,10 +869,10 @@ TableHeader.bottomSeparatorColor = $TableHeader.separatorColor #---- TextArea ---- - -TextArea.border = com.formdev.flatlaf.ui.FlatMarginBorder +TextArea.border=com.fine.theme.light.ui.FineRoundBorder TextArea.margin = @componentMargin -TextArea.background = @componentBackground +TextArea.background=$background.normal +TextArea.height=$Component.defaultHeight #---- TextComponent ---- @@ -875,16 +880,17 @@ TextArea.background = @componentBackground # allowed values: never, once or always TextComponent.selectAllOnFocusPolicy = once TextComponent.selectAllOnMouseClick = false -TextComponent.arc = 0 +TextComponent.arc=$Component.arc #---- TextField ---- - -TextField.border = com.formdev.flatlaf.ui.FlatTextBorder +TextField.border=com.fine.theme.light.ui.FineRoundBorder TextField.margin = @componentMargin -TextField.background = @componentBackground +TextField.background=$background.normal TextField.placeholderForeground = @disabledForeground TextField.iconTextGap = 4 +TextField.height=$Component.defaultHeight + #---- TextPane ---- @@ -1069,9 +1075,10 @@ West.border = $defaultBorderColor #---- ExpandablePane ---- ExpandablePane.HeaderPane.borderInsets=0, 6, 0, 6 ExpandablePane.HeaderPane.hGap=2 -ExpandablePane.vGap=10 +ExpandablePane.HeaderPane.foreground=$text.highlight +ExpandablePane.vGap=5 HeaderPane.width=248 -HeaderPane.height=24 +HeaderPane.height=$Component.defaultHeight #---- East ---- East.border = $defaultBorderColor @@ -1091,6 +1098,9 @@ North.userinfoLabel.borderMargins=2, 16, 2, 16 North.userinfoLabel.width=80 North.userinfoLabel.height=24 North.border = $defaultBorderColor +North.userinfoLabel.foreground=$text.white +North.userinfoLabel.background=$brand.normal +North.messageLabel.foreground=$text.placeholder North.coverPane.background = #0a1c38 North.coverPane.radius = 8 diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java index 5220b8ef36..fc8fbc1d94 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java @@ -102,9 +102,9 @@ public class UserInfoPane extends BasicPane { */ public void markUnSignIn() { this.userInfoLabel.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Login_Onclick")); - this.userInfoLabel.setForeground(UIManager.getColor("color.text.white")); + this.userInfoLabel.setForeground(UIManager.getColor("North.userinfoLabel.foreground")); this.userInfoLabel.setOpaque(true); - this.userInfoLabel.setBackground(UIManager.getColor("color.brand.normal")); + this.userInfoLabel.setBackground(UIManager.getColor("North.userinfoLabel.background")); this.userInfoLabel.resetUserName(); } From 470b3d6e2131c3b9835ca5afe09b4a478f2fcdcb Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Fri, 8 Dec 2023 09:45:03 +0800 Subject: [PATCH 024/302] =?UTF-8?q?REPORT-107973=20=E4=B8=BB=E9=A1=B5?= =?UTF-8?q?=E5=8F=8A=E7=BB=84=E4=BB=B6=E8=A7=86=E8=A7=89=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E7=BF=BB=E6=96=B0=20=E3=80=90=E9=97=AE=E9=A2=98=E5=8E=9F?= =?UTF-8?q?=E5=9B=A0=E3=80=91rt=20=E3=80=90=E6=94=B9=E5=8A=A8=E6=80=9D?= =?UTF-8?q?=E8=B7=AF=E3=80=91=E6=BB=91=E5=9D=97=E3=80=81=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E6=A1=86=E3=80=81=E6=96=87=E6=9C=AC=E5=9F=9F=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/gui/itextarea/UITextArea.java | 6 +++--- .../main/java/com/fr/design/gui/itextfield/UITextField.java | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/itextarea/UITextArea.java b/designer-base/src/main/java/com/fr/design/gui/itextarea/UITextArea.java index f50ae90d8a..91534d95e7 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itextarea/UITextArea.java +++ b/designer-base/src/main/java/com/fr/design/gui/itextarea/UITextArea.java @@ -17,9 +17,9 @@ import java.awt.event.MouseEvent; /** * 文本域 * - * @author - * @create on 2016 - * @since + * @author anonymous + * @Created on 2016 + * @since 11.0 */ public class UITextArea extends JTextArea implements UIObserver, HoverAware { private UIObserverListener uiObserverListener; diff --git a/designer-base/src/main/java/com/fr/design/gui/itextfield/UITextField.java b/designer-base/src/main/java/com/fr/design/gui/itextfield/UITextField.java index b9e8e3351c..fa0d9c860a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itextfield/UITextField.java +++ b/designer-base/src/main/java/com/fr/design/gui/itextfield/UITextField.java @@ -25,7 +25,11 @@ import java.awt.event.MouseEvent; /** + * 文本框 + * * @author Jerry + * @Created on 2016 + * @since xxx */ public class UITextField extends JTextField implements UIObserver, GlobalNameObserver, HoverAware { private boolean isBorderPainted = true; From 857cdb3a3e239a9d5625066f1eb79585a68ffe63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Fri, 8 Dec 2023 15:57:51 +0800 Subject: [PATCH 025/302] =?UTF-8?q?REPORT-107972=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0-RadioButton?= =?UTF-8?q?=E5=92=8CScrollBar=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 4 + .../theme/light/ui/ReportScrollBarUI.java | 92 +++++++++++++++++++ .../fr/design/gui/ibutton/UIRadioButton.java | 13 ++- .../fr/design/gui/iscrollbar/UIScrollBar.java | 42 +-------- .../fine/theme/icon/radio/radio_selected.svg | 20 ++++ .../theme/icon/radio/radio_unselected.svg | 6 ++ .../light/ui/laf/FineLightLaf.properties | 46 ++++++---- .../fr/design/cell/bar/DynamicScrollBar.java | 7 +- 8 files changed, 167 insertions(+), 63 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/ReportScrollBarUI.java create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/radio/radio_selected.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/radio/radio_unselected.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 38aa9fd0c0..d54e531ace 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -111,6 +111,10 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("checkbox_part_checked", "com/fine/theme/icon/checkbox/part_checked.svg", true), new SvgIconSource("checkbox_hovered", "com/fine/theme/icon/checkbox/hovered.svg", true), + // radioButton相关icon + new SvgIconSource("radio_selected", "com/fine/theme/icon/radio/radio_selected.svg", true), + new SvgIconSource("radio_unselected", "com/fine/theme/icon/radio/radio_unselected.svg", true), + // 菜单栏Icon new SvgIconSource("bold", "com/fine/theme/icon/font/bold.svg"), new SvgIconSource("italic", "com/fine/theme/icon/font/italic.svg"), diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/ReportScrollBarUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/ReportScrollBarUI.java new file mode 100644 index 0000000000..650dccfbd6 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/ReportScrollBarUI.java @@ -0,0 +1,92 @@ +package com.fine.theme.light.ui; + +import com.formdev.flatlaf.ui.FlatScrollBarUI; +import com.formdev.flatlaf.ui.FlatUIUtils; + +import javax.swing.JComponent; +import javax.swing.JButton; +import javax.swing.UIManager; +import javax.swing.plaf.ComponentUI; +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; + +/** + * 应用于主面板报表工作区的滚动条UI,提供给 {@link com.fr.design.cell.bar.DynamicScrollBar} 的UI类 + * + * @author Levy.Xie + * @since 11.0` + * Created on 2023/12/08 + */ +public class ReportScrollBarUI extends FlatScrollBarUI { + + /** + * 创建UI类 + * + * @param c 组件 + * @return ReportScrollBarUI + */ + public static ComponentUI createUI(JComponent c) { + return new ReportScrollBarUI(); + } + + @Override + public void installUI(JComponent c) { + super.installUI(c); + scrollBarWidth = UIManager.getInt("ScrollBar.largeBar.width"); + thumbInsets = UIManager.getInsets("ScrollBar.largeBar.thumbInsets"); + showButtons = UIManager.getBoolean("ScrollBar.largeBar.showButtons"); + trackColor = UIManager.getColor("ScrollBar.largeBar.track"); + } + + @Override + public void uninstallUI(JComponent c) { + super.uninstallUI(c); + } + + @Override + protected JButton createDecreaseButton(int orientation) { + return new ReportScrollBarButton(orientation); + } + + @Override + protected JButton createIncreaseButton(int orientation) { + return new ReportScrollBarButton(orientation); + } + + protected class ReportScrollBarButton extends FlatScrollBarButton { + + protected final Color defaultButtonBackground = UIManager.getColor("ScrollBar.largeBar.buttonBackground"); + + protected ReportScrollBarButton(int direction) { + super(direction); + } + + @Override + public void paint(Graphics g) { + Object[] oldRenderingHints = FlatUIUtils.setRenderingHints(g); + + // paint hover or pressed background + if (isEnabled()) { + Color background = (pressedBackground != null && isPressed()) + ? pressedBackground + : (hoverBackground != null && isHover() + ? hoverBackground + : null); + + if (background == null) { + background = defaultButtonBackground; + } + g.setColor(deriveBackground(background)); + paintBackground((Graphics2D) g); + } + + // paint arrow + g.setColor(deriveForeground(getArrowColor())); + paintArrow((Graphics2D) g); + + FlatUIUtils.resetRenderingHints(g, oldRenderingHints); + } + } + +} diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIRadioButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIRadioButton.java index 7112e5d657..4f6114028b 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIRadioButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIRadioButton.java @@ -1,5 +1,6 @@ package com.fr.design.gui.ibutton; +import com.fine.theme.icon.LazyIcon; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; import com.fr.design.event.UIObserver; @@ -18,6 +19,11 @@ import java.awt.event.ItemListener; * Time: 下午5:04 */ public class UIRadioButton extends JRadioButton implements UIObserver, GlobalNameObserver { + + private static final Icon RADIO_SELECTED = new LazyIcon("radio_selected"); + private static final Icon RADIO_UNSELECTED = new LazyIcon("radio_unselected"); + private static final int RADIO_V_GAP = UIManager.getInt("RadioButton.vGap"); + private UIObserverListener uiObserverListener; private GlobalNameListener globalNameListener = null; private String radioButtonName = StringUtils.EMPTY; @@ -106,6 +112,9 @@ public class UIRadioButton extends JRadioButton implements UIObserver, GlobalNam private void initComponent() { this.setFocusPainted(false); + this.setIcon(RADIO_UNSELECTED); + this.setSelectedIcon(RADIO_SELECTED); + this.setBorder(BorderFactory.createEmptyBorder(RADIO_V_GAP, 0, RADIO_V_GAP, 0)); } /** @@ -137,6 +146,7 @@ public class UIRadioButton extends JRadioButton implements UIObserver, GlobalNam /** * 注册观察者监听事件 + * * @param listener 观察者监听事件 */ public void registerNameListener(GlobalNameListener listener) { @@ -144,7 +154,8 @@ public class UIRadioButton extends JRadioButton implements UIObserver, GlobalNam } /** - * 组件是否需要响应观察者事件 + * 组件是否需要响应观察者事件 + * * @return 如果需要响应观察者事件则返回true,否则返回false */ public boolean shouldResponseNameListener() { diff --git a/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBar.java b/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBar.java index d7ec3db936..f91670eef0 100644 --- a/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBar.java +++ b/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBar.java @@ -1,7 +1,6 @@ package com.fr.design.gui.iscrollbar; import javax.swing.*; -import java.awt.*; /** * UIScrollBar是没有下上的按钮的,宽为8像素 @@ -11,44 +10,13 @@ import java.awt.*; */ public class UIScrollBar extends JScrollBar { - /** - * - */ - private static final long serialVersionUID = 1L; - private int temp = 10; + private static final long serialVersionUID = 1L; - public UIScrollBar(){ + public UIScrollBar() { } - public UIScrollBar(int orientation) { - super(orientation); - } - - @Override - public Dimension getPreferredSize() { - return getOrientation() == UIScrollBar.VERTICAL ? - new Dimension(10, super.getPreferredSize().height) - : new Dimension(super.getPreferredSize().width, 10); - } - - @Override - public void setBackground(Color bg) { - super.setBackground(bg); - } - - @Override - /** - * 取得宽度 - */ - public int getWidth() { - return getOrientation() == UIScrollBar.VERTICAL ? temp : super.getWidth(); - } + public UIScrollBar(int orientation) { + super(orientation); + } - @Override - /** - * 取得高度 - */ - public int getHeight() { - return getOrientation() == UIScrollBar.HORIZONTAL ? temp : super.getHeight(); - } } \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fine/theme/icon/radio/radio_selected.svg b/designer-base/src/main/resources/com/fine/theme/icon/radio/radio_selected.svg new file mode 100644 index 0000000000..c80d9475ec --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/radio/radio_selected.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/radio/radio_unselected.svg b/designer-base/src/main/resources/com/fine/theme/icon/radio/radio_unselected.svg new file mode 100644 index 0000000000..f5d61b7597 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/radio/radio_unselected.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index f85fd82a16..dfbb032015 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -137,7 +137,7 @@ Component.defaultHeight=24 @accentButtonDefaultBorderColor = if(@accentColor, @accentColor, tint(@accentBase2Color,20%)) # for buttons within components (e.g. combobox or spinner) -@buttonArrowColor = tint(@foreground,40%) +@buttonArrowColor = #0A1C38 @buttonDisabledArrowColor = lighten(@buttonArrowColor,25%) @buttonHoverArrowColor = lighten(@buttonArrowColor,20%,derived noAutoInverse) @buttonPressedArrowColor = lighten(@buttonArrowColor,30%,derived noAutoInverse) @@ -298,7 +298,7 @@ ComboBox.buttonBackground = $ComboBox.background ComboBox.buttonEditableBackground = darken($ComboBox.background,2%) ComboBox.buttonSeparatorColor = $ComboBox.background ComboBox.buttonDisabledSeparatorColor = $Component.disabledBorderColor -ComboBox.buttonArrowColor = #0A1C38 +ComboBox.buttonArrowColor = @buttonArrowColor ComboBox.buttonDisabledArrowColor = @buttonDisabledArrowColor ComboBox.buttonHoverArrowColor = #0A1C38 ComboBox.buttonPressedArrowColor = #0A1C38 @@ -601,13 +601,14 @@ ProgressBar.selectionForeground = contrast($ProgressBar.foreground, @foreground, #---- RadioButton ---- -RadioButton.border = com.formdev.flatlaf.ui.FlatMarginBorder -RadioButton.icon = com.formdev.flatlaf.icons.FlatRadioButtonIcon -RadioButton.icon.centerDiameter = 8 -RadioButton.icon[filled].centerDiameter = 5 -RadioButton.margin = 2,2,2,2 +#RadioButton.border = com.formdev.flatlaf.ui.FlatMarginBorder +#RadioButton.icon = com.formdev.flatlaf.icons.FlatRadioButtonIcon +#RadioButton.icon.centerDiameter = 8 +#RadioButton.icon[filled].centerDiameter = 5 +#RadioButton.margin = 2,2,2,2 RadioButton.iconTextGap = 4 -RadioButton.rollover = true +RadioButton.vGap = 4 +#RadioButton.rollover = true #---- RadioButtonMenuItem ---- @@ -634,39 +635,44 @@ RootPane.inactiveBorderColor = darken(@background,30%,derived) #---- ScrollBar ---- -ScrollBar.width = 16 +ScrollBar.width = 10 ScrollBar.minimumButtonSize = 12,12 -ScrollBar.minimumThumbSize = 10,10 +ScrollBar.minimumThumbSize = 100,100 ScrollBar.maximumThumbSize = 100000,100000 ScrollBar.trackInsets = 0,0,0,0 -ScrollBar.thumbInsets = 0,0,0,0 +ScrollBar.thumbInsets = 0,2,0,2 ScrollBar.trackArc = 0 -ScrollBar.thumbArc = 0 +ScrollBar.thumbArc = 999 ScrollBar.hoverThumbWithTrack = false ScrollBar.pressedThumbWithTrack = false -ScrollBar.showButtons = true +ScrollBar.showButtons = false ScrollBar.squareButtons = false ScrollBar.buttonArrowColor = @buttonArrowColor ScrollBar.buttonDisabledArrowColor = @buttonDisabledArrowColor ScrollBar.allowsAbsolutePositioning = true -[mac]ScrollBar.minimumThumbSize = 18,18 -[mac]ScrollBar.thumbInsets = 2,2,2,2 +[mac]ScrollBar.minimumThumbSize = 6,12 +[mac]ScrollBar.thumbInsets = 0,2,0,2 [mac]ScrollBar.thumbArc = 999 [mac]ScrollBar.hoverThumbWithTrack = true -[linux]ScrollBar.minimumThumbSize = 18,18 -[linux]ScrollBar.thumbInsets = 2,2,2,2 +[linux]ScrollBar.minimumThumbSize = 6,12 +[linux]ScrollBar.thumbInsets = 2,0,2,0 [linux]ScrollBar.thumbArc = 999 -ScrollBar.track = lighten(@background,1%,derived noAutoInverse) -ScrollBar.thumb = darken($ScrollBar.track,10%,derived noAutoInverse) +ScrollBar.track = #00000000 +ScrollBar.thumb = #0a1c3833 ScrollBar.hoverTrackColor = darken($ScrollBar.track,3%,derived noAutoInverse) ScrollBar.hoverThumbColor = darken($ScrollBar.thumb,10%,derived noAutoInverse) -ScrollBar.pressedThumbColor = darken($ScrollBar.thumb,20%,derived noAutoInverse) +ScrollBar.pressedThumbColor = #0a1c3849 ScrollBar.hoverButtonBackground = darken(@background,5%,derived noAutoInverse) ScrollBar.pressedButtonBackground = darken(@background,10%,derived noAutoInverse) +ScrollBar.largeBar.width = 16 +ScrollBar.largeBar.track = #FFF +ScrollBar.largeBar.showButtons = true +ScrollBar.largeBar.thumbInsets = 0,4,0,4 +ScrollBar.largeBar.buttonBackground = $ScrollBar.track #---- ScrollPane ---- diff --git a/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollBar.java b/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollBar.java index 3476b08740..9829b4e0d9 100644 --- a/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollBar.java +++ b/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollBar.java @@ -3,6 +3,7 @@ */ package com.fr.design.cell.bar; +import com.fine.theme.light.ui.ReportScrollBarUI; import com.fr.base.DynamicUnitList; import com.fr.design.mainframe.ElementCasePane; import com.fr.grid.GridUtils; @@ -35,6 +36,7 @@ public class DynamicScrollBar extends JScrollBar { this.setMinimum(0); this.setUnitIncrement(1); this.setBlockIncrement(3); + this.setUI(new ReportScrollBarUI()); this.addComponentListener(new ComponentListener() { public void componentResized(ComponentEvent e) { @@ -98,11 +100,6 @@ public class DynamicScrollBar extends JScrollBar { } } - -// public void updateUI() { -// setUI(new DynamicScrollBarUI()); -// } - @Override public void setValue(int value) { if (reportPane == null) { From 44ac991ebc5ec49568bcd0353b12a98a0c4a685c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 13 Dec 2023 10:14:45 +0800 Subject: [PATCH 026/302] =?UTF-8?q?REPORT-107972=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0-=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../theme/icon/propertiestab/authorityedit.svg | 11 +++++------ .../propertiestab/authorityedit_disabled.svg | 14 +++++++------- .../propertiestab/authorityedit_selected.svg | 14 ++++++++------ .../theme/icon/propertiestab/configuredroles.svg | 15 +++++++++------ .../propertiestab/configuredroles_disabled.svg | 15 +++++++++------ .../propertiestab/configuredroles_selected.svg | 16 ++++++++++------ .../com/fine/theme/icon/toolbar/copy.svg | 5 +++++ .../com/fine/theme/icon/toolbar/copy_disable.svg | 5 +++++ .../com/fine/theme/icon/toolbar/edit.svg | 8 ++++++++ .../com/fine/theme/icon/toolbar/edit_disable.svg | 8 ++++++++ .../com/fine/theme/icon/toolbar/edit_white.svg | 5 +++++ .../com/fine/theme/icon/toolbar/move_down.svg | 5 +++++ .../theme/icon/toolbar/move_down_disable.svg | 5 +++++ .../com/fine/theme/icon/toolbar/move_up.svg | 3 +++ .../fine/theme/icon/toolbar/move_up_disable.svg | 3 +++ .../com/fine/theme/icon/toolbar/sort_asc.svg | 8 ++++++++ .../fine/theme/icon/toolbar/sort_asc_disable.svg | 8 ++++++++ 17 files changed, 111 insertions(+), 37 deletions(-) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/copy.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/copy_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/edit.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/edit_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/edit_white.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_down.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_down_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/sort_asc.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/sort_asc_disable.svg diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit.svg index b7000e6f96..4874792684 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit.svg @@ -1,7 +1,6 @@ - - - icon_属性_权限编辑_normal - - - + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit_disabled.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit_disabled.svg index 7df1acf348..bb6246b1e6 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit_disabled.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit_disabled.svg @@ -1,8 +1,8 @@ - - - icon_属性_权限编辑_disabled - - - - + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit_selected.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit_selected.svg index e70df0a896..a5883d9c60 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit_selected.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/authorityedit_selected.svg @@ -1,7 +1,9 @@ - - - icon_属性_权限编辑_selected - - - + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles.svg index 972f102b1d..637214022f 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles.svg @@ -1,7 +1,10 @@ - - - icon_属性_配置角色_normal - - - + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles_disabled.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles_disabled.svg index 61a2c84fea..31455704fc 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles_disabled.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles_disabled.svg @@ -1,7 +1,10 @@ - - - icon_属性_配置角色_disabled - - - + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles_selected.svg b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles_selected.svg index 74eef28bb3..dde6ad86ed 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles_selected.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/propertiestab/configuredroles_selected.svg @@ -1,7 +1,11 @@ - - - icon_属性_配置角色_selected - - - + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/copy.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/copy.svg new file mode 100644 index 0000000000..e972efa49f --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/copy.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/copy_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/copy_disable.svg new file mode 100644 index 0000000000..bc5d341caa --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/copy_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/edit.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/edit.svg new file mode 100644 index 0000000000..46522e6fa4 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/edit.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/edit_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/edit_disable.svg new file mode 100644 index 0000000000..9af18392d7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/edit_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/edit_white.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/edit_white.svg new file mode 100644 index 0000000000..f8147ee0dd --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/edit_white.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_down.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_down.svg new file mode 100644 index 0000000000..2bee4b2d77 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_down.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_down_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_down_disable.svg new file mode 100644 index 0000000000..832e2d7ddc --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_down_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up.svg new file mode 100644 index 0000000000..1da5e45a17 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up_disable.svg new file mode 100644 index 0000000000..cae74fbe52 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/sort_asc.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/sort_asc.svg new file mode 100644 index 0000000000..b6293907a6 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/sort_asc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/sort_asc_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/sort_asc_disable.svg new file mode 100644 index 0000000000..81bc040940 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/sort_asc_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + From e96abf764851351eb7f76ef2836bd06010ea369c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 13 Dec 2023 10:22:26 +0800 Subject: [PATCH 027/302] =?UTF-8?q?REPORT-107972=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0-=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E8=B6=85=E9=93=BE/=E6=8E=A7=E4=BB=B6=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 9 +++- .../design/gui/controlpane/UIControlPane.java | 9 ---- .../gui/controlpane/UIListControlPane.java | 12 +++--- .../controlpane/UIListGroupControlPane.java | 3 +- .../UINameableListCellRenderer.java | 43 ++++++++----------- .../AbstractShortCutFactory.java | 17 +++----- .../light/ui/laf/FineLightLaf.properties | 24 +++++++++-- .../design/sort/common/AbstractSortPane.java | 6 +-- 8 files changed, 65 insertions(+), 58 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index d54e531ace..36b6f8872a 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -91,7 +91,6 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("widgetsettings", "com/fine/theme/icon/propertiestab/widgetsettings.svg", false, 18), new SvgIconSource("widgetsettings_disabled", "com/fine/theme/icon/propertiestab/widgetsettings_disabled.svg", false, 18), new SvgIconSource("widgetsettings_selected", "com/fine/theme/icon/propertiestab/widgetsettings_selected.svg", false, 18), - // TODO: 视觉未提供,先用旧的,待视觉提供后替换 new SvgIconSource("configuredroles", "com/fine/theme/icon/propertiestab/configuredroles.svg", false, 18), new SvgIconSource("configuredroles_selected", "com/fine/theme/icon/propertiestab/configuredroles_selected.svg", false, 18), new SvgIconSource("configuredroles_disabled", "com/fine/theme/icon/propertiestab/configuredroles_disabled.svg", false, 18), @@ -139,6 +138,14 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("popup", "com/fine/theme/icon/popup/popup.svg", true), new SvgIconSource("clear", "com/fine/theme/icon/clear.svg", true), + // 工具栏 + new SvgIconSource("tool_copy", "com/fine/theme/icon/toolbar/copy.svg", true), + new SvgIconSource("move_down", "com/fine/theme/icon/toolbar/move_down.svg", true), + new SvgIconSource("move_up", "com/fine/theme/icon/toolbar/move_up.svg", true), + new SvgIconSource("sort_asc", "com/fine/theme/icon/toolbar/sort_asc.svg", true), + new SvgIconSource("tool_edit", "com/fine/theme/icon/toolbar/edit.svg", true), + new SvgIconSource("tool_edit_white", "com/fine/theme/icon/toolbar/edit_white.svg", true), + // 参数面板 new SvgIconSource("param_edit", "com/fine/theme/icon/param/edit.svg", true, 24), new SvgIconSource("param_edit_pressed", "com/fine/theme/icon/param/edit_pressed.svg", true, 24), diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java index c4fb03cfbe..f083f86f2c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java @@ -111,14 +111,6 @@ public abstract class UIControlPane extends JControlPane { @Override protected void initToolBar() { super.initToolBar(); -// toolBar.setUI(new UIToolBarUI() { -// @Override -// public void paint(Graphics g, JComponent c) { -// Graphics2D g2 = (Graphics2D) g; -// g2.setColor(Color.WHITE); -// g2.fillRect(0, 0, c.getWidth(), c.getHeight()); -// } -// }); } protected JPanel getLeftPane() { @@ -139,7 +131,6 @@ public abstract class UIControlPane extends JControlPane { // 封装一层,加边框 JPanel toolBarPane = new JPanel(new BorderLayout()); toolBarPane.add(toolBar, BorderLayout.CENTER); - toolBarPane.setBorder(BorderFactory.createMatteBorder(1, 1, 0, 1, UIConstants.RULER_LINE_COLOR)); leftContentPane.add(toolBarPane, BorderLayout.NORTH); diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java index 034847a704..581c101ed5 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java @@ -1,7 +1,7 @@ package com.fr.design.gui.controlpane; +import com.fine.theme.light.ui.FineRoundBorder; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.constants.UIConstants; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilist.JNameEdList; import com.fr.design.gui.ilist.ListModelElement; @@ -10,8 +10,10 @@ import com.fr.form.event.Listener; import com.fr.stable.ArrayUtils; import com.fr.stable.Nameable; +import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.JPanel; +import javax.swing.UIManager; import javax.swing.ListSelectionModel; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; @@ -40,7 +42,6 @@ public abstract class UIListControlPane extends UIControlPane implements ListCon public UIListControlPane() { super(); - } private ListControlPaneHelper getHelper() { @@ -75,9 +76,10 @@ public abstract class UIListControlPane extends UIControlPane implements ListCon protected void initLeftPane(JPanel leftPane) { nameableList = createJNameList(); nameableList.setName(LIST_NAME); - nameableList.setSelectionBackground(UIConstants.ATTRIBUTE_PRESS); - leftPane.add(new UIScrollPane(nameableList), BorderLayout.CENTER); - + UIScrollPane scrollPane = new UIScrollPane(nameableList); + scrollPane.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, UIManager.getColor("defaultBorderColor"))); + leftPane.add(scrollPane, BorderLayout.CENTER); + leftPane.setBorder(new FineRoundBorder()); nameableList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); nameableList.addMouseListener(getHelper().getListMouseListener(nameableList, this)); diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java index 47581fb626..8a1e5020e9 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java @@ -24,6 +24,7 @@ import javax.swing.DefaultListModel; import javax.swing.JPanel; import javax.swing.ListModel; import javax.swing.ListSelectionModel; +import javax.swing.UIManager; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import javax.swing.event.ListSelectionEvent; @@ -541,7 +542,7 @@ public abstract class UIListGroupControlPane extends UIControlPane implements Li label.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 0)); label.setOpaque(true); label.setBackground(Color.WHITE); - label.setForeground(Color.decode("#333334")); + label.setForeground(UIManager.getColor("List.wrapper.text.fontColor")); label.setFont(label.getFont().deriveFont(11F)); //预留 10px 的纵向滚动条的宽度 label.setPreferredSize(new Dimension(214, 26)); diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UINameableListCellRenderer.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UINameableListCellRenderer.java index 40d8d98fa7..5cea0c98b1 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UINameableListCellRenderer.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UINameableListCellRenderer.java @@ -1,6 +1,6 @@ package com.fr.design.gui.controlpane; -import com.fr.design.constants.UIConstants; +import com.fine.theme.icon.LazyIcon; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilist.ListModelElement; import com.fr.stable.Nameable; @@ -8,7 +8,6 @@ import sun.swing.DefaultLookup; import javax.swing.*; import javax.swing.border.Border; -import javax.swing.border.EmptyBorder; import java.awt.*; /** @@ -19,18 +18,19 @@ import java.awt.*; public class UINameableListCellRenderer extends JPanel implements ListCellRenderer { - private static final Border SAFE_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1); - private static final Border DEFAULT_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1); - private static final Color BORDER_COLOR = new Color(201, 198, 184); - protected static Border noFocusBorder = DEFAULT_NO_FOCUS_BORDER; - private static final int BUTTON_WIDTH = 25; + private static final Color BORDER_COLOR = UIManager.getColor("defaultBorderColor"); + private static final int BUTTON_WIDTH = UIManager.getInt("List.cellRender.button.width"); + private static final int BUTTON_HEIGHT = UIManager.getInt("List.cellRender.button.height"); private UILabel editButton; // "编辑按钮",实际上是一个 UILabel,由列表项(UIListControlPane)统一处理点击事件 private UILabel label; private boolean isNewStyle; private NameableCreator[] creators; private Color initialLabelForeground; - public UINameableListCellRenderer( boolean isNewStyle, NameableCreator[] creators) { + private static final Icon LIST_EDIT_ICON = new LazyIcon("tool_edit"); + private static final Icon CPT_ICON = new LazyIcon("cpt_icon"); + + public UINameableListCellRenderer(boolean isNewStyle, NameableCreator[] creators) { super(); this.isNewStyle = isNewStyle; this.creators = creators; @@ -43,11 +43,11 @@ public class UINameableListCellRenderer extends private void initComponents() { editButton = new UILabel() { public Dimension getPreferredSize() { - return new Dimension(BUTTON_WIDTH, BUTTON_WIDTH); + return new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT); } }; - editButton.setIcon(isNewStyle ? UIConstants.LIST_EDIT_ICON : UIConstants.CPT_ICON); - editButton.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, UIConstants.LIST_ITEM_SPLIT_LINE)); + editButton.setIcon(isNewStyle ? LIST_EDIT_ICON : CPT_ICON); + editButton.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, BORDER_COLOR)); editButton.setHorizontalAlignment(SwingConstants.CENTER); label = new UILabel(); label.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); @@ -58,7 +58,7 @@ public class UINameableListCellRenderer extends } private Border getNoFocusBorder() { - return BorderFactory.createMatteBorder(0, 0, 1, 0, UIConstants.LIST_ITEM_SPLIT_LINE); + return BorderFactory.createMatteBorder(0, 0, 1, 0, BORDER_COLOR); } private void setText(String t) { @@ -87,18 +87,13 @@ public class UINameableListCellRenderer extends if (isSelected) { setBackground(bg == null ? list.getSelectionBackground() : bg); setForeground(fg == null ? list.getSelectionForeground() : fg); - label.setForeground(Color.WHITE); - if (isNewStyle) { - editButton.setIcon(UIConstants.LIST_EDIT_WHITE_ICON); - } - } - else { - setBackground(list.getBackground()); + } else { + setBackground(UIManager.getColor("List.cellRender.background")); setForeground(list.getForeground()); label.setForeground(initialLabelForeground); - if (isNewStyle) { - editButton.setIcon(UIConstants.LIST_EDIT_ICON); - } + } + if (isNewStyle) { + editButton.setIcon(LIST_EDIT_ICON); } setText((value == null) ? "" : value.toString()); @@ -107,11 +102,11 @@ public class UINameableListCellRenderer extends setFont(list.getFont()); if (value instanceof ListModelElement) { - Nameable wrappee = ((ListModelElement) value).wrapper; + Nameable wrapper = ((ListModelElement) value).wrapper; this.setText(((ListModelElement) value).wrapper.getName()); for (NameableCreator creator : creators) { - if (creator.menuIcon() != null && creator.acceptObject2Populate(wrappee) != null) { + if (creator.menuIcon() != null && creator.acceptObject2Populate(wrapper) != null) { this.setToolTipText(creator.createTooltip()); break; } diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/shortcutfactory/AbstractShortCutFactory.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/shortcutfactory/AbstractShortCutFactory.java index 8d837fcc09..673349e9bd 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/shortcutfactory/AbstractShortCutFactory.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/shortcutfactory/AbstractShortCutFactory.java @@ -1,6 +1,6 @@ package com.fr.design.gui.controlpane.shortcutfactory; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.gui.controlpane.NameableCreator; import com.fr.design.gui.controlpane.ShortCut4JControlPane; @@ -99,8 +99,7 @@ public abstract class AbstractShortCutFactory { RemoveItemAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText(("Fine-Design_Basic_Action_Remove"))); this.setMnemonic('R'); - this.setSmallIcon(BaseUtils - .readIcon("/com/fr/base/images/cell/control/remove.png")); + this.setSmallIcon(new LazyIcon("remove")); } @Override @@ -116,8 +115,7 @@ public abstract class AbstractShortCutFactory { CopyItemAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Action_Copy")); this.setMnemonic('C'); - this.setSmallIcon(BaseUtils - .readIcon("/com/fr/design/images/m_edit/copy.png")); + this.setSmallIcon(new LazyIcon("tool_copy")); } @Override @@ -133,8 +131,7 @@ public abstract class AbstractShortCutFactory { MoveUpItemAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Up")); this.setMnemonic('U'); - this.setSmallIcon(BaseUtils - .readIcon("/com/fr/design/images/control/up.png")); + this.setSmallIcon(new LazyIcon("move_up")); } @Override @@ -150,8 +147,7 @@ public abstract class AbstractShortCutFactory { MoveDownItemAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Down")); this.setMnemonic('D'); - this.setSmallIcon(BaseUtils - .readIcon("/com/fr/design/images/control/down.png")); + this.setSmallIcon(new LazyIcon("move_down")); } @Override @@ -166,8 +162,7 @@ public abstract class AbstractShortCutFactory { SortItemAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Action_Sort")); this.setMnemonic('S'); - this.setSmallIcon(BaseUtils - .readIcon("/com/fr/design/images/control/sortAsc.png")); + this.setSmallIcon(new LazyIcon("sort_asc")); } @Override diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index dfbb032015..1726ead3d2 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -103,8 +103,8 @@ Component.defaultHeight=24 @menuBackground = @background # selection -@selectionBackground = @accentSelectionBackground -@selectionForeground = contrast(@selectionBackground, @foreground, #fff) +@selectionBackground = #2576ef1e +@selectionForeground = @foreground @selectionInactiveBackground = shade(@background,13%) @selectionInactiveForeground = @foreground @@ -213,6 +213,13 @@ Button.toolbar.selectedBackground = $Button.selectedBackground Button.toolbar.margin = 3,3,3,3 Button.toolbar.spacingInsets = 1,2,1,2 +Button.group.background = #FFF +Button.group.selectedBackground = #2576EF +Button.group.pressedBackground = #2576EF +Button.group.selectedForeground = #FFF +Button.group.pressedForeground = #FFF +Button.group.minimumWidth = 32 +Button.group.minimumHeight = 20 #---- CheckBox ---- CheckBox.border = com.formdev.flatlaf.ui.FlatMarginBorder @@ -308,6 +315,7 @@ ComboBox.selectionInsets = 0,0,0,0 ComboBox.selectionArc = 0 ComboBox.borderCornerRadius = 3 ComboBox.comboHeight = 24 +ComboBox.selectBox.button.offsetX = 2 #---- Component ---- @@ -456,13 +464,16 @@ List.cellNoFocusBorder = com.formdev.flatlaf.ui.FlatListCellBorder$Default List.focusCellHighlightBorder = com.formdev.flatlaf.ui.FlatListCellBorder$Focused List.focusSelectedCellHighlightBorder = com.formdev.flatlaf.ui.FlatListCellBorder$Selected List.background = @componentBackground -List.selectionInactiveBackground = @selectionInactiveBackground +List.selectionInactiveBackground = @selectionBackground List.selectionInactiveForeground = @selectionInactiveForeground List.dropCellBackground = @dropCellBackground List.dropCellForeground = @dropCellForeground List.dropLineColor = @dropLineColor List.showCellFocusIndicator = false - +List.cellRender.background = #FFF +List.cellRender.button.width = 28 +List.cellRender.button.height = 24 +List.wrapper.text.fontColor = #0a1c3877 #---- Menu ---- Menu.icon.arrowColor = @buttonArrowColor @@ -542,6 +553,11 @@ OptionPane.informationIcon = com.formdev.flatlaf.icons.FlatOptionPaneInformation OptionPane.questionIcon = com.formdev.flatlaf.icons.FlatOptionPaneQuestionIcon OptionPane.warningIcon = com.formdev.flatlaf.icons.FlatOptionPaneWarningIcon +#---- SortPane ---- +SortPane.height = 24 +SortPane.vGap = 4 +SortPane.hGap = 14 + #---- PasswordField ---- PasswordField.capsLockIconColor = #00000064 diff --git a/designer-realize/src/main/java/com/fr/design/sort/common/AbstractSortPane.java b/designer-realize/src/main/java/com/fr/design/sort/common/AbstractSortPane.java index 281b365ac9..df56f188c5 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/common/AbstractSortPane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/common/AbstractSortPane.java @@ -18,13 +18,13 @@ import java.util.List; public abstract class AbstractSortPane extends JPanel { protected int sortPaneWidth; protected int sortPaneRightWidth; - public static final int PANE_COMPONENT_HEIGHT = 20; - public static final int PANE_COMPONENT_V_GAP = 4; - public static final int PANE_COMPONENT_H_GAP = 14; protected AbstractSortGroupPane sortGroupPane; protected SortHeaderPane sortHeaderPane; protected String selfSortArea; protected String defaultHeaderArea; + public static final int PANE_COMPONENT_HEIGHT = UIManager.getInt("SortPane.height"); + public static final int PANE_COMPONENT_V_GAP = UIManager.getInt("SortPane.vGap"); + public static final int PANE_COMPONENT_H_GAP = UIManager.getInt("SortPane.hGap"); public AbstractSortPane(Dimension dimension) { this(dimension.width, dimension.height); From 39cda96bd228cc9d5f1b17ac74f066c7e8bc6437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 13 Dec 2023 10:27:13 +0800 Subject: [PATCH 028/302] =?UTF-8?q?REPORT-107972=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0-=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E6=8C=89=E9=92=AE=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/style/AbstractSelectBox.java | 357 +++++++++--------- .../background/BackgroundJComponent.java | 5 - 2 files changed, 174 insertions(+), 188 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/style/AbstractSelectBox.java b/designer-base/src/main/java/com/fr/design/style/AbstractSelectBox.java index e59ddfa579..ea7b86edcc 100644 --- a/designer-base/src/main/java/com/fr/design/style/AbstractSelectBox.java +++ b/designer-base/src/main/java/com/fr/design/style/AbstractSelectBox.java @@ -1,29 +1,24 @@ package com.fr.design.style; -import com.fr.design.constants.UIConstants; -import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.ibutton.UIButtonUI; +import com.fine.theme.light.ui.FineRoundBorder; +import com.formdev.flatlaf.ui.FlatArrowButton; +import com.fr.design.event.HoverAware; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.style.background.BackgroundJComponent; -import com.fr.design.utils.gui.GUIPaintUtils; -import com.fr.stable.Constants; -import javax.swing.AbstractButton; import javax.swing.JPanel; -import javax.swing.JWindow; -import javax.swing.border.AbstractBorder; +import javax.swing.JButton; +import javax.swing.UIManager; import javax.swing.event.AncestorEvent; import javax.swing.event.AncestorListener; -import javax.swing.plaf.ButtonUI; +import javax.swing.SwingConstants; import java.awt.BorderLayout; -import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; -import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; -import java.awt.RenderingHints; +import java.awt.Color; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; @@ -33,175 +28,171 @@ import java.awt.event.MouseListener; * @version 创建时间:2011-10-31 下午03:28:31 类说明: 抽象出来的弹出box. 可以弹出颜色选择, 图案选择, 纹理选择. * 主要是 弹出界面的不同 */ -public abstract class AbstractSelectBox extends AbstractPopBox implements MouseListener { - private static final long serialVersionUID = 2355250206956896774L; - - private UIButton triggleButton; - - protected void initBox(int preWidth) { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - - displayComponent = new BackgroundJComponent(); - displayComponent.setEmptyBackground(); - triggleButton = new UIButton(UIConstants.ARROW_DOWN_ICON) { - public boolean shouldResponseChangeListener() { - return false; - } - - @Override - public ButtonUI getUI() { - return new UIButtonUI() { - @Override - protected boolean isPressed(AbstractButton b) { - return model.isArmed() && model.isPressed(); - } - - @Override - protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) { - if (isPressed(b) && b.isPressedPainted()) { - GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), UIConstants.COMBOBOX_BTN_PRESS); - } else if (isRollOver(b)) { - GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), UIConstants.COMBOBOX_BTN_ROLLOVER); - } else if (b.isNormalPainted()) { - GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), UIConstants.COMBOBOX_BTN_NORMAL); - } - } - }; - } - }; - triggleButton.setPreferredSize(new Dimension(20, 20)); - triggleButton.setRoundBorder(true, Constants.LEFT); - - JPanel displayPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - displayPane.add(displayComponent, BorderLayout.CENTER); - displayComponent.setPreferredSize(new Dimension(preWidth, displayPane.getPreferredSize().height)); - - displayComponent.addMouseListener(mouseListener); - triggleButton.addMouseListener(mouseListener); - displayComponent.addMouseListener(this); - triggleButton.addMouseListener(this); - - this.add(displayPane, BorderLayout.CENTER); - this.add(triggleButton, BorderLayout.EAST); - - this.addAncestorListener(new AncestorListener() { - public void ancestorAdded(AncestorEvent event) { - } - - public void ancestorRemoved(AncestorEvent evt) { - hidePopupMenu(); - } - - public void ancestorMoved(AncestorEvent event) { - hidePopupMenu(); - } - }); - - displayComponent.addMouseListener(new MouseAdapter() { - @Override - public void mouseExited(MouseEvent e) { - if (!isPopupVisible()) { - //如果弹出框==null 或者 弹出框不可见 直接return - return; - } - Point popMenuP = getControlWindow().getLocation(); - Point displayComponentP = displayComponent.getLocationOnScreen(); - if (popMenuP.getX() < displayComponentP.getX() - 1) { - //如果 弹出框横向超出屏幕 往左调整了 和displayComponent横向错开 就不处理了 - return; - } - - Rectangle rectangle = displayComponent.getBounds(); - boolean bottomPopAndExitTop = displayComponentP.getY() < popMenuP.getY() && e.getY() <= rectangle.y; - boolean topPopAndExitBottom = displayComponentP.getY() > popMenuP.getY() && e.getY() >= rectangle.y + rectangle.getHeight(); - boolean exitLeftOrRight = rectangle.x > e.getX() || rectangle.x + rectangle.getWidth() < e.getX(); - if (bottomPopAndExitTop || topPopAndExitBottom || exitLeftOrRight) { - //弹出框在displayComponent下面 且 鼠标是从displayComponent上面离开的,隐藏弹出界面。 - //弹出框在displayComponent上面 且 鼠标是从displayComponent下面离开的,隐藏弹出界面。 - //鼠标从displayComponent左边 或者 右边 离开,隐藏弹出界面。 - hidePopupMenu(); - } - - } - }); - } - - public void setEnabled(boolean enabled) { - super.setEnabled(enabled); - - displayComponent.setEnabled(enabled); - triggleButton.setEnabled(enabled); - } - - @Override - public JPanel initWindowPane(double preWidth) { - // TODO Auto-generated method stub - return null; - } - - @Override - public void paint(Graphics g) { - super.paint(g); - Graphics2D g2d = (Graphics2D)g; - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2d.setColor(UIConstants.POP_DIALOG_BORDER); - g2d.drawRoundRect(0, 0, this.getWidth() - 1 , this.getHeight() - 1, 4, 4); - triggleButton.setSelected(isPopupVisible()); - } - - - public void addDemoPaneMouseListener(MouseListener l) { - displayComponent.addMouseListener(l); - triggleButton.addMouseListener(l); - } - - public abstract T getSelectObject(); - - public abstract void setSelectObject(T t); - - private class TriggleLineBorder extends AbstractBorder { - private static final long serialVersionUID = 1065857667981063530L; - protected Insets borderInsets = new Insets(0, 0, 0, 0); - - public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { - g.translate(x, y); - - g.setColor(UIConstants.POP_DIALOG_BORDER); - - g.translate(-x, -y); - } - - public Insets getBorderInsets(Component c) { - return borderInsets; - } - } - - @Override - public void mouseEntered(MouseEvent e) { - triggleButton.getModel().setRollover(true); - } - - @Override - public void mouseExited(MouseEvent e) { - triggleButton.getModel().setRollover(false); - } - - @Override - public void mouseClicked(MouseEvent e) { - // TODO Auto-generated method stub - - } - - @Override - public void mousePressed(MouseEvent e) { - // TODO Auto-generated method stub - - } - - @Override - public void mouseReleased(MouseEvent e) { - // TODO Auto-generated method stub - - } - +public abstract class AbstractSelectBox extends AbstractPopBox implements MouseListener, HoverAware { + private static final long serialVersionUID = 2355250206956896774L; + + private boolean rollOver; + private JButton triggerButton; + private final int boxSize = UIManager.getInt("ComboBox.comboHeight"); + private final int buttonOffsetX = UIManager.getInt("ComboBox.selectBox.button.offsetX"); + + protected void initBox(int preWidth) { + // 初始化面板布局 + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.setBorder(new FineRoundBorder()); + this.setPreferredSize(new Dimension(getWidth(), boxSize)); + // 初始化组件 + displayComponent = new BackgroundJComponent(); + triggerButton = new SelectBoxButton(); + // 初始化组件布局 + JPanel displayPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + displayPane.setBorder(null); + displayPane.add(displayComponent, BorderLayout.CENTER); + displayComponent.setPreferredSize(new Dimension(preWidth, displayPane.getPreferredSize().height)); + // 添加事件监听 + displayComponent.addMouseListener(mouseListener); + triggerButton.addMouseListener(mouseListener); + displayComponent.addMouseListener(this); + triggerButton.addMouseListener(this); + + this.add(displayPane, BorderLayout.CENTER); + this.add(triggerButton, BorderLayout.EAST); + + this.addAncestorListener(new AncestorListener() { + public void ancestorAdded(AncestorEvent event) { + } + + public void ancestorRemoved(AncestorEvent evt) { + hidePopupMenu(); + } + + public void ancestorMoved(AncestorEvent event) { + hidePopupMenu(); + } + }); + + displayComponent.addMouseListener(new MouseAdapter() { + @Override + public void mouseExited(MouseEvent e) { + if (!isPopupVisible()) { + //如果弹出框==null 或者 弹出框不可见 直接return + return; + } + Point popMenuP = getControlWindow().getLocation(); + Point displayComponentP = displayComponent.getLocationOnScreen(); + if (popMenuP.getX() < displayComponentP.getX() - 1) { + //如果 弹出框横向超出屏幕 往左调整了 和displayComponent横向错开 就不处理了 + return; + } + + Rectangle rectangle = displayComponent.getBounds(); + boolean bottomPopAndExitTop = displayComponentP.getY() < popMenuP.getY() && e.getY() <= rectangle.y; + boolean topPopAndExitBottom = displayComponentP.getY() > popMenuP.getY() && e.getY() >= rectangle.y + rectangle.getHeight(); + boolean exitLeftOrRight = rectangle.x > e.getX() || rectangle.x + rectangle.getWidth() < e.getX(); + if (bottomPopAndExitTop || topPopAndExitBottom || exitLeftOrRight) { + //弹出框在displayComponent下面 且 鼠标是从displayComponent上面离开的,隐藏弹出界面。 + //弹出框在displayComponent上面 且 鼠标是从displayComponent下面离开的,隐藏弹出界面。 + //鼠标从displayComponent左边 或者 右边 离开,隐藏弹出界面。 + hidePopupMenu(); + } + + } + }); + } + + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + + displayComponent.setEnabled(enabled); + triggerButton.setEnabled(enabled); + } + + @Override + public JPanel initWindowPane(double preWidth) { + return null; + } + + @Override + public void paint(Graphics g) { + super.paint(g); + triggerButton.setSelected(isPopupVisible()); + } + + /** + * 应用于SelectBox的右侧按钮 + */ + protected class SelectBoxButton extends FlatArrowButton { + + protected SelectBoxButton() { + this(SwingConstants.SOUTH, + UIManager.getString("Component.arrowType"), + UIManager.getColor("ComboBox.buttonArrowColor"), + UIManager.getColor("ComboBox.buttonDisabledArrowColor"), + null, null, null, null); + } + + protected SelectBoxButton(int direction, String type, Color foreground, Color disabledForeground, + Color hoverForeground, Color hoverBackground, Color pressedForeground, Color pressedBackground) { + super(direction, type, foreground, disabledForeground, + hoverForeground, hoverBackground, pressedForeground, pressedBackground); + } + + @Override + protected void paintArrow(Graphics2D g) { + if (isPopupVisible()) { + setDirection(SwingConstants.NORTH); + } else { + setDirection(SwingConstants.SOUTH); + } + super.paintArrow(g); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(boxSize, boxSize); + } + + @Override + public float getXOffset() { + return buttonOffsetX; + } + } + + + public abstract T getSelectObject(); + + public abstract void setSelectObject(T t); + + + @Override + public void mouseEntered(MouseEvent e) { + rollOver = true; + repaint(); + } + + @Override + public void mouseExited(MouseEvent e) { + rollOver = false; + repaint(); + } + + @Override + public void mouseClicked(MouseEvent e) { + + } + + @Override + public void mousePressed(MouseEvent e) { + + } + + @Override + public void mouseReleased(MouseEvent e) { + + } + + @Override + public boolean isHovered() { + return rollOver; + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/style/background/BackgroundJComponent.java b/designer-base/src/main/java/com/fr/design/style/background/BackgroundJComponent.java index 611953a20b..66a6b9045c 100644 --- a/designer-base/src/main/java/com/fr/design/style/background/BackgroundJComponent.java +++ b/designer-base/src/main/java/com/fr/design/style/background/BackgroundJComponent.java @@ -1,12 +1,9 @@ package com.fr.design.style.background; -import java.awt.Color; import java.awt.Graphics; import java.awt.Insets; import java.awt.geom.Rectangle2D; - import javax.swing.JComponent; -import com.fr.design.border.UIRoundedBorder; import com.fr.general.Background; /** @@ -20,7 +17,6 @@ public class BackgroundJComponent extends JComponent { protected Background background ; public BackgroundJComponent() { - this.setBorder(new UIRoundedBorder(Color.decode("#999999"), 2, 2)); } public BackgroundJComponent(Background background) { @@ -37,7 +33,6 @@ public class BackgroundJComponent extends JComponent { } - public void setEmptyBackground() { this.background = null; } From 3930b44c708872e68aa2ffde2a3a26eb3d9cf0f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 13 Dec 2023 15:56:12 +0800 Subject: [PATCH 029/302] =?UTF-8?q?REPORT-107972=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0-=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E6=8C=89=E9=92=AE=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...tiesItemUI.java => RectangleButtonUI.java} | 16 +- .../fr/design/gui/ibutton/UIButtonGroup.java | 176 ++++++++++-------- .../com/fr/design/gui/ibutton/UITabGroup.java | 15 +- .../mainframe/EastRegionContainerPane.java | 4 +- .../theme/edit/cell/CellStyleEditPane.java | 3 - .../VanChartCustomPlotUITabGroup.java | 2 +- .../settingpane/style/CustomStylePane.java | 46 ++--- .../fr/design/report/ReportColumnsPane.java | 4 +- 8 files changed, 132 insertions(+), 134 deletions(-) rename designer-base/src/main/java/com/fine/theme/light/ui/{PropertiesItemUI.java => RectangleButtonUI.java} (57%) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/PropertiesItemUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/RectangleButtonUI.java similarity index 57% rename from designer-base/src/main/java/com/fine/theme/light/ui/PropertiesItemUI.java rename to designer-base/src/main/java/com/fine/theme/light/ui/RectangleButtonUI.java index 45ce82d352..c8523f455f 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/PropertiesItemUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/RectangleButtonUI.java @@ -7,31 +7,31 @@ import javax.swing.JComponent; import java.awt.*; /** - * 东区属性面板,属性按钮UI + * 矩形按钮UI,忽略圆角属性 * * @author Levy.Xie * @since 11.0 * Created on 2023/11/30 */ -public class PropertiesItemUI extends FlatButtonUI { +public class RectangleButtonUI extends FlatButtonUI { - public PropertiesItemUI(boolean shared) { + public RectangleButtonUI(boolean shared) { super(shared); } @Override protected void paintBackground(Graphics g, JComponent c) { - Color background = getBackground( c ); - if( background == null ) { + Color background = getBackground(c); + if (background == null) { return; } Graphics2D g2 = (Graphics2D) g.create(); try { - FlatUIUtils.setRenderingHints( g2 ); + FlatUIUtils.setRenderingHints(g2); g2.setColor(FlatUIUtils.deriveColor(background, getBackgroundBase(c, true))); - float focusWidth = FlatUIUtils.getBorderFocusWidth( c ); - FlatUIUtils.paintComponentBackground( g2, 0, 0, c.getWidth(), c.getHeight(), focusWidth, 0 ); + float focusWidth = FlatUIUtils.getBorderFocusWidth(c); + FlatUIUtils.paintComponentBackground(g2, 0, 0, c.getWidth(), c.getHeight(), focusWidth, 0); } finally { g2.dispose(); } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java index 822aee00da..01761e9a12 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java @@ -1,6 +1,8 @@ package com.fr.design.gui.ibutton; -import com.fr.design.constants.UIConstants; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.light.ui.RectangleButtonUI; +import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; import com.fr.design.event.UIObserver; @@ -15,14 +17,14 @@ import javax.swing.JPanel; import javax.swing.border.Border; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import javax.swing.UIManager; +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; -import java.awt.Insets; import java.awt.LayoutManager; -import java.awt.RenderingHints; -import java.awt.Shape; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -44,6 +46,7 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver, UIOb private String buttonGroupName = StringUtils.EMPTY; private boolean isToolBarComponent = false; private boolean isClick; + protected int totalButtonSize = 0; private UIObserverListener uiObserverListener; private boolean autoFireStateChanged = true; @@ -65,6 +68,7 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver, UIOb this.objectList = Arrays.asList(objects); } labelButtonList = new ArrayList(iconArray.length); + totalButtonSize = iconArray.length; this.setLayout(getGridLayout(iconArray.length)); this.setBorder(getGroupBorder()); for (int i = 0; i < iconArray.length; i++) { @@ -92,7 +96,7 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver, UIOb return false; } }; - initButton(labelButton); + initButton(labelButton, i); } } @@ -100,6 +104,7 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver, UIOb if (!ArrayUtils.isEmpty(objects) && iconArray.length == objects.length) { this.objectList = Arrays.asList(objects); } + totalButtonSize = iconArray.length; labelButtonList = new ArrayList(iconArray.length); this.setLayout(getGridLayout(iconArray.length)); this.setBorder(getGroupBorder()); @@ -128,7 +133,7 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver, UIOb return false; } }; - initButton(labelButton); + initButton(labelButton, i); } } @@ -143,15 +148,14 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver, UIOb public void setForToolBarButtonGroup(boolean isToolBarComponent) { this.isToolBarComponent = isToolBarComponent; if (isToolBarComponent) { - for (int i = 0; i < labelButtonList.size(); i++) { - labelButtonList.get(i).set4ToolbarButton(); + for (UIToggleButton uiToggleButton : labelButtonList) { + uiToggleButton.set4ToolbarButton(); } } repaint(); } - /** * setEnabled * @@ -168,6 +172,7 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver, UIOb if (!ArrayUtils.isEmpty(objects) && textArray.length == objects.length) { this.objectList = Arrays.asList(objects); } + totalButtonSize = textArray.length; currentButtonSize = textArray.length; labelButtonList = new ArrayList(textArray.length); this.setLayout(getGridLayout(textArray.length)); @@ -191,51 +196,102 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver, UIOb }; } - @Override - public Insets getInsets() { - return new Insets(0, 2, 0, 2); - } - public boolean shouldResponseNameListener() { return false; } }; -// labelButton.setUI(new UIButtonUI() { -// protected void paintText(Graphics g, AbstractButton b, String text, Rectangle textRec) { -// View v = (View) b.getClientProperty(BasicHTML.propertyKey); -// if (v != null) { -// v.paint(g, textRec); -// return; -// } -// FontMetrics fm = SwingUtilities2.getFontMetrics(b, g); -// int mnemonicIndex = b.getDisplayedMnemonicIndex(); -// if (isPressed(b)) { -// g.setColor(Color.white); -// } else { -// g.setColor(b.isEnabled() ? Color.black : UIConstants.LINE_COLOR); -// } -// -// SwingUtilities2.drawStringUnderlineCharAt(b, g, text, mnemonicIndex, textRec.x + getTextShiftOffset(), textRec.y + fm.getAscent() + getTextShiftOffset()); -// } -// }); - initButton(labelButton); + initButton(labelButton, i); } } + private static class TabButtonUI extends RectangleButtonUI { + + protected int minimumWidth; + protected int minimumHeight; + + protected TabButtonUI(boolean shared) { + super(shared); + } + + public static ComponentUI createUI(JComponent c) { + return new TabButtonUI(false); + } + + @Override + public void installUI(JComponent c) { + super.installUI(c); + background = UIManager.getColor("Button.group.background"); + pressedBackground = UIManager.getColor("Button.group.pressedBackground"); + selectedBackground = UIManager.getColor("Button.group.selectedBackground"); + pressedForeground = UIManager.getColor("Button.group.pressedForeground"); + selectedForeground = UIManager.getColor("Button.group.selectedForeground"); + minimumWidth = UIManager.getInt("Button.group.minimumWidth"); + minimumHeight = UIManager.getInt("Button.group.minimumHeight"); + } + + @Override + public Dimension getMinimumSize(JComponent c) { + return new Dimension(minimumWidth, minimumHeight); + } + } + + public void setGlobalName(String name) { buttonGroupName = name; } protected void initButton(UIToggleButton labelButton) { - labelButton.setBorderPainted(false); - adjustButton(labelButton); + initButton(labelButton, 0); + } + + protected void initButton(UIToggleButton labelButton, int buttonIndex) { + labelButton.setUI(new TabButtonUI(false)); + paintInnerBorder(labelButton, buttonIndex); + adjustButton(labelButton, buttonIndex); UIComponentUtils.setLineWrap(labelButton); labelButtonList.add(labelButton); this.add(labelButton); } - private void adjustButton(UIToggleButton labelButton) { + /** + * 绘制按钮组内边框 + * + * @param labelButton 按钮 + * @param index 按钮序号 + */ + protected void paintInnerBorder(UIToggleButton labelButton, int index) { + LayoutManager layout = getLayout(); + int leftBorder = 0; + int bottomBorder = 0; + + if (layout instanceof GridLayout) { + GridLayout gridLayout = (GridLayout) layout; + int rows = gridLayout.getRows(); + int columns = gridLayout.getColumns(); + rows = getActualColumnRow(rows, columns, totalButtonSize); + columns = getActualColumnRow(columns, rows, totalButtonSize); + + int columnIndex = index % columns; + int rowIndex = index / columns; + // 非首列,绘制左边框 + leftBorder = (columnIndex != 0) ? 1 : 0; + // 非末行,绘制底边框 + bottomBorder = (rows > 1 && rowIndex < rows - 1) ? 1 : 0; + } else { + leftBorder = (index != 0) ? 1 : 0; + } + labelButton.setBorderPainted((leftBorder | bottomBorder) != 0); + labelButton.setBorder((leftBorder | bottomBorder) != 0 ? + BorderFactory.createMatteBorder(0, leftBorder, bottomBorder, 0, UIManager.getColor("defaultBorderColor")) : + null); + } + + private int getActualColumnRow(int origin, int divider, int total) { + return (origin == 0 || divider == 0) ? (int) Math.ceil((double) total / divider) : origin; + } + + private void adjustButton(UIToggleButton labelButton, int index) { if (labelButton.getText().length() > TEXT_LENGTH && currentButtonSize > BUTTON_SIZE) { Dimension dimension = labelButton.getPreferredSize(); dimension.height <<= 1; @@ -244,24 +300,20 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver, UIOb } protected Border getGroupBorder() { - return BorderFactory.createEmptyBorder(1, 1, 1, 1); + return new FineRoundBorder(); } protected LayoutManager getGridLayout(int number) { return new GridLayout(0, number, 0, 0); } - /** - * paintComponent - * - * @param g - */ - public void paintComponents(Graphics g) { + @Override + public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) g; - Shape oldClip = g2d.getClip(); - g2d.clip(new RoundRectangle2D.Double(1, 1, getWidth(), getHeight(), UIConstants.ARC, UIConstants.ARC)); - super.paintComponents(g); - g2d.setClip(oldClip); + FlatUIUtils.setRenderingHints(g2d); + int arc = UIManager.getInt("Button.group.arc"); + g2d.clip(new RoundRectangle2D.Double(0, 0, getWidth(), getHeight(), arc, arc)); + super.paint(g); } public void setAutoFireStateChanged(boolean autoFireStateChanged) { @@ -353,7 +405,7 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver, UIOb /** * 给所有的Button添加Tips * - * @param tips + * @param tips 标签 */ public void setAllToolTips(String[] tips) { for (int i = 0; i < labelButtonList.size(); i++) { @@ -438,34 +490,6 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver, UIOb fireStateChanged(); } - /** - * 重载Border画法 - * - * @param g - */ - @Override - protected void paintBorder(Graphics g) { - if (isToolBarComponent) { - return; - } - Graphics2D g2d = (Graphics2D) g; - g2d.setColor(UIConstants.SHADOW_GREY); - - int width = 0; - for (int i = 0; i < labelButtonList.size() - 1; i++) { - width += labelButtonList.get(i).getWidth() + 1; - int height = labelButtonList.get(i).getHeight(); - g.drawLine(width, 0, width, height); - } - - width += labelButtonList.get(labelButtonList.size() - 1).getWidth() + 1; - - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2d.drawRoundRect(0, 0, width, getHeight() - 1, UIConstants.BUTTON_GROUP_ARC, UIConstants.BUTTON_GROUP_ARC); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); - - } - /** * main * diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UITabGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UITabGroup.java index 12ca005249..11acee5bcb 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UITabGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UITabGroup.java @@ -1,7 +1,6 @@ package com.fr.design.gui.ibutton; import javax.swing.*; -import javax.swing.border.Border; import java.awt.*; public class UITabGroup extends UIButtonGroup { @@ -9,8 +8,6 @@ public class UITabGroup extends UIButtonGroup { private boolean isDrawLine = true; private static final int BUTTON_NUMBER = 5; private static final int SEVEN_NUMBER = 7; - private static final int ORIGINAL_WIDTH = 10; - private static final int GAP = 11; /** * 标签页改变 @@ -18,7 +15,7 @@ public class UITabGroup extends UIButtonGroup { * @param index 序号 */ public void tabChanged(int index) { - return; + } public UITabGroup(Icon[] iconArray) { @@ -38,7 +35,7 @@ public class UITabGroup extends UIButtonGroup { } else if (number == BUTTON_NUMBER || number == SEVEN_NUMBER) { return new FiveButtonLayout(2); } else { - return new GridLayout(2, 3, 1, 1); + return new GridLayout(2, 3, 0, 0); } } @@ -54,14 +51,6 @@ public class UITabGroup extends UIButtonGroup { this.isDrawLine = isDrawLine; } - @Override - protected Border getGroupBorder() { - if (!isDrawLine) { - return BorderFactory.createEmptyBorder(0, 0, 0, 0); - } - return BorderFactory.createEmptyBorder(1, GAP, 1, GAP); - } - @Override public void setSelectedIndex(int newSelectedIndex, boolean fireChanged) { super.setSelectedIndex(newSelectedIndex, false); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index f11e37478b..4c736050e1 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -1,7 +1,7 @@ package com.fr.design.mainframe; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.light.ui.PropertiesItemUI; +import com.fine.theme.light.ui.RectangleButtonUI; import com.formdev.flatlaf.FlatDarkLaf; import com.formdev.flatlaf.ui.FlatLineBorder; import com.fr.base.FRContext; @@ -1004,7 +1004,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { }; button.setDisabledIcon(new LazyIcon(btnIconName + ICON_SUFFIX_DISABLED)); button.set4LargeToolbarButton(); - button.setUI(new PropertiesItemUI(false)); + button.setUI(new RectangleButtonUI(false)); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java index 846da26491..953f0070b3 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java @@ -4,10 +4,8 @@ import com.fr.base.CellBorderStyle; import com.fr.base.Style; import com.fr.base.theme.settings.ThemedCellStyle; import com.fr.design.cell.CellRectangleStylePreviewPane; -import com.fr.design.constants.UIConstants; import com.fr.design.dialog.AttrScrollPane; import com.fr.design.dialog.BasicPane; -import com.fr.design.dialog.BasicScrollPane; import com.fr.design.dialog.MultiTabPane; import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; import com.fr.design.gui.frpane.AttributeChangeListener; @@ -46,7 +44,6 @@ public class CellStyleEditPane extends MultiTabPane { super(); tabPane.setOneLineTab(true); tabPane.setDrawLine(false); - tabPane.setBorder(BorderFactory.createLineBorder(UIConstants.SHADOW_GREY)); tabPane.setLayout(new GridLayout(1, 3, 0, 0)); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartCustomPlotUITabGroup.java b/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartCustomPlotUITabGroup.java index 1c9fe9f9f4..2755a49b70 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartCustomPlotUITabGroup.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartCustomPlotUITabGroup.java @@ -53,7 +53,7 @@ public class VanChartCustomPlotUITabGroup extends UITabGroup{ } @Override - protected void initButton(UIToggleButton labelButton) { + protected void initButton(UIToggleButton labelButton, int buttonIndex) { int ButtonWidth = WIDTH / 3; if (listNum <= 1){ diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/style/CustomStylePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/style/CustomStylePane.java index e1e095cbfc..b5d6110d28 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/style/CustomStylePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/style/CustomStylePane.java @@ -4,14 +4,12 @@ import com.fr.base.CellBorderStyle; import com.fr.base.NameStyle; import com.fr.base.Style; import com.fr.design.actions.utils.ReportActionUtils; -import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.MultiTabPane; import com.fr.design.gui.style.*; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.style.BorderUtils; -import javax.swing.*; import javax.swing.event.ChangeListener; import java.awt.*; import java.util.ArrayList; @@ -38,7 +36,6 @@ public class CustomStylePane extends MultiTabPane

由于swing的布局生成机制,单一组件不能在不同布局中出现,因此无法存储构建好的布局,可以存储工厂方法,使用时调用

+ * + * @param key supplier标识 + * @param supplier 工厂方法 + * @return this + */ + public ReactiveCardPane addSupplier(String key, Supplier supplier) { + cardFactory.put(key, supplier); + return this; + } + + /** + * 选择布局 + * + * @param key supplier标识 + * @return this + */ + public ReactiveCardPane select(String key) { + this.selectKey = key; + return this; + } + + /** + * 渲染卡片 + * + * @throws IllegalArgumentException 非法key值 + */ + public void populate() throws IllegalArgumentException { + if (selectKey == null || !cardFactory.containsKey(selectKey)) { + throw new IllegalArgumentException("container select key is illegal!"); + } + removeAll(); + add(cardFactory.get(selectKey).get(), BorderLayout.CENTER); + revalidate(); + repaint(); + } + +} diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java index 15d50d00cb..57e4095ffd 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java @@ -1,5 +1,7 @@ package com.fr.design.gui.frpane; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; @@ -17,7 +19,6 @@ import java.awt.*; * 用于属性表中的面板,主要是为了给包含于这个面板内部的众多UI控件加监听事件,在UI控件改变的时候,通知模板做相应的变化 */ public abstract class AbstractAttrNoScrollPane extends BasicPane { - private static final int DEFAULT_HEIGHT = 250; private static boolean hasChangeListener; protected JPanel leftContentPane; @@ -59,7 +60,7 @@ public abstract class AbstractAttrNoScrollPane extends BasicPane { protected void initContentPane() { leftContentPane = createContentPane(); if (leftContentPane != null) { - leftContentPane.setBorder(BorderFactory.createMatteBorder(10, 10, 0, 0, original)); + leftContentPane.setBorder(new ScaledEmptyBorder(LayoutConstants.VERTICAL_GAP, 0, 0, 0)); this.add(leftContentPane, BorderLayout.CENTER); } } @@ -125,14 +126,6 @@ public abstract class AbstractAttrNoScrollPane extends BasicPane { return hasChangeListener; } - /** - * 返回预定义的大小. - */ - public Dimension getPreferredSize() { - return new Dimension(super.getPreferredSize().width, DEFAULT_HEIGHT); - } - - /** * 返回绑定的属性事件. * @param listener 增加监听 diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/UIComboBoxPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/UIComboBoxPane.java index de8a10b1cc..24c46449e8 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/UIComboBoxPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/UIComboBoxPane.java @@ -1,7 +1,9 @@ package com.fr.design.gui.frpane; +import com.fine.theme.utils.FineUIScale; import com.fr.design.beans.BasicBeanPane; import com.fr.design.beans.FurtherBasicBeanPane; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.icombobox.UIComboBox; import javax.swing.*; @@ -92,7 +94,7 @@ public abstract class UIComboBoxPane extends BasicBeanPane { * august 如果需要的布局有变化,覆盖之 */ protected void initLayout() { - this.setLayout(new BorderLayout(0, 6)); + this.setLayout(new BorderLayout(0, FineUIScale.scale(LayoutConstants.VERTICAL_GAP))); JPanel northPane = new JPanel(new BorderLayout()); northPane.add(jcb, BorderLayout.CENTER); this.add(northPane, BorderLayout.NORTH); diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/UINumberDragPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/UINumberDragPane.java index 99bc1205a5..053b5a56d6 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/UINumberDragPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/UINumberDragPane.java @@ -1,23 +1,26 @@ package com.fr.design.gui.frpane; +import com.fine.swing.ui.layout.Layouts; import com.fr.design.beans.BasicBeanPane; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; import com.fr.design.gui.islider.UISlider; import com.fr.design.gui.ispinner.UISpinner; -import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; import java.awt.Dimension; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; + public class UINumberDragPane extends BasicBeanPane implements GlobalNameObserver { private static final long serialVersionUID = -8681716725163358249L; private UISlider dragBar; private UISpinner spinner; private boolean isEditing = false; - private String numberDargPaneName = ""; + private String numberDragPaneName = ""; private GlobalNameListener globalNameListener = null; /** @@ -38,31 +41,26 @@ public class UINumberDragPane extends BasicBeanPane implements GlobalNam dragBar.setMajorTickSpacing((int) maxValue); spinner = createUISpinner(minValue, maxValue, dierta); spinner.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_StyleAlignment_Text_Rotation")); - this.setLayout(new BorderLayout(4, 0)); - this.add(spinner, BorderLayout.EAST); - this.add(dragBar, BorderLayout.CENTER); - dragBar.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - if (globalNameListener != null && shouldResponseNameListener()) { - globalNameListener.setGlobalName(numberDargPaneName); - } - spinner.setValue(dragBar.getValue()); - if (isEditing) { - userEvent(updateBean()); - } + this.setLayout(new BorderLayout()); + this.add(Layouts.row( + cell(dragBar).weight(0.7), flex(0.1), cell(spinner).weight(0.7) + ).getComponent()); + dragBar.addChangeListener(e -> { + if (globalNameListener != null && shouldResponseNameListener()) { + globalNameListener.setGlobalName(numberDragPaneName); + } + spinner.setValue(dragBar.getValue()); + if (isEditing) { + userEvent(updateBean()); } }); - spinner.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - if (globalNameListener != null && shouldResponseNameListener()) { - globalNameListener.setGlobalName(numberDargPaneName); - } - dragBar.setValue((int) spinner.getValue()); - if (isEditing) { - userEvent(updateBean()); - } + spinner.addChangeListener(e -> { + if (globalNameListener != null && shouldResponseNameListener()) { + globalNameListener.setGlobalName(numberDragPaneName); + } + dragBar.setValue((int) spinner.getValue()); + if (isEditing) { + userEvent(updateBean()); } }); } @@ -93,7 +91,7 @@ public class UINumberDragPane extends BasicBeanPane implements GlobalNam * @param name */ public void setGlobalName(String name) { - numberDargPaneName = name; + numberDragPaneName = name; } @Override diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/ExtendedComboBox.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/ExtendedComboBox.java index 9fc3d9e172..dd85ab5a4f 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombobox/ExtendedComboBox.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/ExtendedComboBox.java @@ -47,13 +47,6 @@ public class ExtendedComboBox extends UIComboBox { setUI(new ExtendedComboBoxUI()); } - @Override - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.width = VALUE120; - return dim; - } - static class ExtendedComboBoxUI extends FineComboBoxUI { public static ComponentUI createUI(JComponent c) { return new ExtendedComboBoxUI(); diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java index c997024146..994b7b4253 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java @@ -2,6 +2,7 @@ package com.fr.design.gui.icontainer; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIScale; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; @@ -33,13 +34,13 @@ import java.awt.event.MouseMotionListener; public class UIEastResizableContainer extends JPanel { private static final long serialVersionUID = 1854340560790476907L; - public static final int MAX_CONTAINER_WIDTH = 340; - public static final int MIN_CONTAINER_WIDTH = 286; + public static final int MAX_CONTAINER_WIDTH = FineUIScale.scale(340); + public static final int MIN_CONTAINER_WIDTH = FineUIScale.scale(286); - private int containerWidth = 240; - private int preferredWidth = 240; - private int topToolPaneHeight = 40; - private int leftPaneWidth = 42; + private int containerWidth = FineUIScale.scale(240); + private int preferredWidth = FineUIScale.scale(240); + private int topToolPaneHeight = FineUIScale.scale(40); + private int leftPaneWidth = FineUIScale.scale(42); private JComponent leftPane; private JComponent rightPane; @@ -47,8 +48,8 @@ public class UIEastResizableContainer extends JPanel { private TopToolPane topToolPane; - private static final int ARROW_MARGIN = 15; - private static final int ARROW_RANGE = 35; + private static final int ARROW_MARGIN = FineUIScale.scale(15); + private static final int ARROW_RANGE = FineUIScale.scale(35); public UIEastResizableContainer() { diff --git a/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableEditorPane.java b/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableEditorPane.java index f385874b51..53214b869b 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableEditorPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableEditorPane.java @@ -1,7 +1,6 @@ package com.fr.design.gui.itableeditorpane; -import com.fr.design.border.UIRoundedBorder; -import com.fr.design.constants.UIConstants; +import com.fine.theme.light.ui.FineRoundBorder; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icontainer.UIScrollPane; @@ -51,10 +50,9 @@ public class UITableEditorPane extends BasicPane { UILabel l = new UILabel(leftLabelName); editTable = tableModel.createTable(); -// editTable.getTableHeader().setBackground(UIConstants.DEFAULT_BG_RULER); UIScrollPane scrollPane = new UIScrollPane(editTable); - scrollPane.setBorder(new UIRoundedBorder(UIConstants.TITLED_BORDER_COLOR, 1, UIConstants.ARC)); + scrollPane.setBorder(new FineRoundBorder()); pane.add(scrollPane, BorderLayout.CENTER); initbuttonPane(action); JPanel controlPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); diff --git a/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableModelAdapter.java b/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableModelAdapter.java index 8b046f3d08..ae283a6591 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableModelAdapter.java +++ b/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableModelAdapter.java @@ -1,6 +1,6 @@ package com.fr.design.gui.itableeditorpane; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.mainframe.DesignerContext; import com.fr.log.FineLoggerFactory; @@ -198,7 +198,7 @@ public abstract class UITableModelAdapter extends AbstractTableModel implemen protected abstract class AddTableRowAction extends UITableEditAction { public AddTableRowAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Insert")); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/add.png")); + this.setSmallIcon(new LazyIcon("add")); } @Override @@ -215,7 +215,7 @@ public abstract class UITableModelAdapter extends AbstractTableModel implemen public EditAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Edit")); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/edit.png")); + this.setSmallIcon(new LazyIcon("edit")); } @Override @@ -239,13 +239,13 @@ public abstract class UITableModelAdapter extends AbstractTableModel implemen public DeleteAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Delete")); this.setDeleteTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + "?"); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); + this.setSmallIcon(new LazyIcon("remove")); } public DeleteAction(Component component){ this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Delete")); this.setDeleteTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + "?"); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); + this.setSmallIcon(new LazyIcon("remove")); this.component = component; } @@ -309,7 +309,7 @@ public abstract class UITableModelAdapter extends AbstractTableModel implemen protected class MoveUpAction extends UITableEditAction { public MoveUpAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Up")); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/up.png")); + this.setSmallIcon(new LazyIcon("move_up")); } @Override @@ -333,7 +333,7 @@ public abstract class UITableModelAdapter extends AbstractTableModel implemen public MoveDownAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Down")); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/down.png")); + this.setSmallIcon(new LazyIcon("move_down")); } @Override diff --git a/designer-base/src/main/java/com/fr/design/gui/style/AlignmentPane.java b/designer-base/src/main/java/com/fr/design/gui/style/AlignmentPane.java index eb72db81cc..4a9c4cee3d 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/AlignmentPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/AlignmentPane.java @@ -4,6 +4,8 @@ package com.fr.design.gui.style; * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. */ +import com.fine.swing.ui.layout.Layouts; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.BaseUtils; import com.fr.base.Style; import com.fr.design.ExtraDesignClassManager; @@ -12,15 +14,13 @@ import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.fun.IndentationUnitProcessor; +import com.fr.design.gui.core.ReactiveCardPane; import com.fr.design.gui.frpane.UINumberDragPane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.utils.gui.UIComponentUtils; import com.fr.event.EventDispatcher; import com.fr.general.ComparatorUtils; @@ -39,35 +39,28 @@ import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JPanel; import javax.swing.SwingConstants; +import javax.swing.UIManager; import java.awt.BorderLayout; -import java.awt.CardLayout; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.Arrays; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.fix; + /** * Pane to edit cell alignment. */ public class AlignmentPane extends AbstractBasicStylePane implements GlobalNameObserver { private static final int ANGEL = 90; - private static final int GAP = 23; - private static final int VERGAP = 3; - private static final Dimension SPINNER_DIMENSION = new Dimension(75, 20); private static final String[] TEXT = {Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Wrap_Text"), Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Single_Line"), Toolkit.i18nText("Fine-Design_Basic_StyleAlignment_Single_Line(Adjust_Font)"), Toolkit.i18nText("Fine-Design_Basic_StyleAlignment_Multi_Line(Adjust_Font)")}; private static final String[] LAYOUT = {Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Layout_Default"), Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Layout_Image_Titled"), Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Layout_Image_Extend"), Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Layout_Image_Adjust")}; - private JPanel hPaneContainer; - private JPanel vPaneContainer; - private JPanel rotationBarCC; - private JPanel basicPane; - private JPanel seniorPane; + private ReactiveCardPane rotationBarPane; private UIComboBox textComboBox; private UIComboBox textRotationComboBox; @@ -95,8 +88,9 @@ public class AlignmentPane extends AbstractBasicStylePane implements GlobalNameO protected void initComponents() { textComboBox = new UIComboBox(TEXT); imageLayoutComboBox = new UIComboBox(LAYOUT); - initTextRotationCombox(); + initTextRotationComboBox(); + // todo: 换新图标及反白问题 Icon[][] hAlignmentIconArray = {{IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal_white.png")}, {IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal_white.png")}, {IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal_white.png")}, @@ -106,9 +100,6 @@ public class AlignmentPane extends AbstractBasicStylePane implements GlobalNameO hAlignmentPane = new UIButtonGroup<>(hAlignmentIconArray, hAlignment); hAlignmentPane.setAllToolTips(new String[]{Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Left"), Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Center"), Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Right"), Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Distributed"), Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_DEFAULT")}); - hPaneContainer = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); - vPaneContainer = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); - Icon[][] vAlignmentIconArray = {{IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_top_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_top_normal_white.png")}, {IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_center_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_center_normal_white.png")}, {IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_down_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_down_normal_white.png")}}; @@ -146,8 +137,6 @@ public class AlignmentPane extends AbstractBasicStylePane implements GlobalNameO } private void initOtherComponent() { - hPaneContainer.add(hAlignmentPane); - vPaneContainer.add(vAlignmentPane); rotationPane = new UINumberDragPane(-ANGEL, ANGEL); leftIndentSpinner = new UISpinner(0, Integer.MAX_VALUE, 1, 0); @@ -157,24 +146,11 @@ public class AlignmentPane extends AbstractBasicStylePane implements GlobalNameO spaceAfterSpinner = new UISpinner(0, Integer.MAX_VALUE, 1, 0); lineSpaceSpinner = new UISpinner(0, Integer.MAX_VALUE, 1, 0); - rotationBarCC = new JPanel(new CardLayout()); - rotationBarCC.add(rotationPane, "show"); - rotationBarCC.add(new JPanel(), "hide"); - this.setLayout(new BorderLayout()); this.add(createPane(), BorderLayout.CENTER); - - textRotationComboBox.addItemListener(new ItemListener() { - - @Override - public void itemStateChanged(ItemEvent e) { - CardLayout cc = (CardLayout) rotationBarCC.getLayout(); - cc.show(rotationBarCC, textRotationComboBox.getSelectedIndex() == 0 ? "show" : "hide"); - } - }); } - private void initTextRotationCombox() { + private void initTextRotationComboBox() { ArrayList selectOption = new ArrayList<>(); selectOption.add(Toolkit.i18nText("Fine-Design_Basic_Custom_Angle")); VerticalTextProcessor processor = ExtraClassManager.getInstance().getSingle(VerticalTextProcessor.XML_TAG, DefaultVerticalTextProcessor.class); @@ -198,101 +174,118 @@ public class AlignmentPane extends AbstractBasicStylePane implements GlobalNameO } private JPanel createPane() { - JPanel jp1 = new JPanel(new BorderLayout()); - basicPane = new JPanel(); - seniorPane = new JPanel(); - basicPane = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Basic"), 290, 24, basicPane()); - seniorPane = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Basic_Advanced"), 290, 24, seniorPane()); - - jp1.add(basicPane, BorderLayout.NORTH); - jp1.add(seniorPane, BorderLayout.CENTER); - - return jp1; + JPanel basicPane = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Basic"), 290, 24, basicPane()); + JPanel seniorPane = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Basic_Advanced"), 290, 24, seniorPane()); + return Layouts.column( + cell(basicPane), + fix(1).with(it -> it.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIManager.getColor("defaultBorderColor")))), + cell(seniorPane) + ).getComponent(); } private JPanel basicPane() { - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; UILabel horizontalLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Pane_Horizontal") + " ", SwingConstants.LEFT); + UILabel verticalLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Pane_Vertical") + " ", SwingConstants.LEFT); UIComponentUtils.setLineWrap(horizontalLabel); - Component[][] components = new Component[][]{ - new Component[]{null, null}, - new Component[]{horizontalLabel, hPaneContainer}, - new Component[]{null, null}, - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Pane_Vertical") + " ", SwingConstants.RIGHT), vPaneContainer}, - new Component[]{null, null} - }; - double[] rowSize = {p, p, p, p, p, p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_MEDIUM, LayoutConstants.VGAP_MEDIUM); + UIComponentUtils.setLineWrap(verticalLabel); + return Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(horizontalLabel).weight(1.2), + cell(hAlignmentPane).weight(3)), + row( + cell(verticalLabel).weight(1.2), + cell(vAlignmentPane).weight(1.8), + flex(1.2)) + ).with(it -> it.setBorder(new ScaledEmptyBorder(0, 0, LayoutConstants.VERTICAL_GAP, 0))).getComponent(); } private JPanel seniorPane() { - JPanel senPane = new JPanel(new BorderLayout()); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - Component[][] components = new Component[][]{ - new Component[]{null, null}, - new Component[]{new UILabel((Toolkit.i18nText("Fine-Design_Basic_Image_Layout")) + " ", SwingConstants.LEFT), imageLayoutComboBox}, - new Component[]{null, null}, - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Text_Style") + " ", SwingConstants.LEFT), textComboBox}, - new Component[]{null, null}, - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_StyleAlignment_Text_Rotation") + " ", SwingConstants.LEFT), textRotationComboBox}, - new Component[]{null, rotationBarCC}, - new Component[]{null, null}, - }; - double[] rowSize = {p, p, p, p, p, p, p, p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; - JPanel tempPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_MEDIUM, LayoutConstants.VGAP_MEDIUM); - senPane.add(tempPane, BorderLayout.NORTH); - senPane.add(seniorDownPane(), BorderLayout.CENTER); - return senPane; + return Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(seniorUpPane()), + cell(seniorMiddlePane()), + cell(seniorDownPane()) + ).getComponent(); } - private JPanel seniorDownPane() { - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - leftIndentSpinner.setPreferredSize(SPINNER_DIMENSION); - rightIndentSpinner.setPreferredSize(SPINNER_DIMENSION); - spaceBeforeSpinner.setPreferredSize(SPINNER_DIMENSION); - spaceAfterSpinner.setPreferredSize(SPINNER_DIMENSION); - lineSpaceSpinner.setPreferredSize(SPINNER_DIMENSION); - - JPanel indentationPane = new JPanel(new BorderLayout()); - indentationPane.add(new UILabel((Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Style_Indentation")), SwingConstants.LEFT)); - indentationPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, GAP)); - JPanel partSpacingPane = new JPanel(new BorderLayout()); - partSpacingPane.add(new UILabel((Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Style_Part_Spacing")), SwingConstants.LEFT)); - partSpacingPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, GAP)); - JPanel spacingPane = new JPanel(new BorderLayout()); - spacingPane.add(new UILabel((Toolkit.i18nText("Fine-Design_Basic_Style_Line_Spacing")), SwingConstants.LEFT)); - spacingPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, GAP)); - - Component[][] components = new Component[][]{ - new Component[]{null, null, null}, - new Component[]{indentationPane, creatSpinnerPane(leftIndentSpinner), creatSpinnerPane(rightIndentSpinner)}, - new Component[]{null, new UILabel((Toolkit.i18nText("Fine-Design_Report_Left")), SwingConstants.CENTER), new UILabel((Toolkit.i18nText("Fine-Design_Basic_Right")), SwingConstants.CENTER)}, - new Component[]{null, null, null}, - new Component[]{null, null, null}, - new Component[]{partSpacingPane, creatSpinnerPane(spaceBeforeSpinner), creatSpinnerPane(spaceAfterSpinner)}, - new Component[]{null, new UILabel((Toolkit.i18nText("Fine-Design_Basic_Front")), SwingConstants.CENTER), new UILabel((Toolkit.i18nText("Fine-Design_Basic_Behind")), SwingConstants.CENTER)}, - new Component[]{null, null, null}, - new Component[]{null, null, null}, - new Component[]{spacingPane, creatSpinnerPane(lineSpaceSpinner), null}, - }; - double[] rowSize = {p, p, p, p, p, p, p, p, p, p}; - double[] columnSize = {p, f, f}; - int[][] rowCount = {{1, 1, 1}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}}; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_MEDIUM, VERGAP); + private JPanel seniorUpPane() { + return Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(new UILabel((Toolkit.i18nText("Fine-Design_Basic_Image_Layout")), SwingConstants.LEFT)).weight(1.2), + cell(imageLayoutComboBox).weight(3.0) + ), + row( + cell(new UILabel((Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Text_Style")), SwingConstants.LEFT)).weight(1.2), + cell(textComboBox).weight(3.0) + ) + ).getComponent(); } - private JPanel creatSpinnerPane(Component comp) { - JPanel jp = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - jp.add(comp); - return jp; + private JPanel seniorMiddlePane() { + rotationBarPane = ReactiveCardPane.create() + .addSupplier("hide", () -> Layouts.row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_StyleAlignment_Text_Rotation"), SwingConstants.LEFT)).weight(1.2), + cell(textRotationComboBox).weight(3) + ).getComponent()) + .addSupplier("show", () -> Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_StyleAlignment_Text_Rotation"), SwingConstants.LEFT)).weight(1.2), + cell(textRotationComboBox).weight(3) + ), + row( + flex(1.2), + cell(rotationPane).weight(3) + ) + ).getComponent()); + rotationBarPane.select("show").populate(); + + textRotationComboBox.addItemListener(e -> { + String key = (textRotationComboBox.getSelectedIndex() == 0) ? "show" : "hide"; + rotationBarPane.select(key).populate(); + }); + return rotationBarPane; + } + + private JPanel seniorDownPane() { + UILabel indentationLabel = new UILabel((Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Style_Indentation")), SwingConstants.LEFT); + UILabel partSpacingLabel = new UILabel((Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Style_Part_Spacing")), SwingConstants.LEFT); + UILabel spacingLabel = new UILabel((Toolkit.i18nText("Fine-Design_Basic_Style_Line_Spacing")), SwingConstants.LEFT); + + return Layouts.column( + row( + cell(indentationLabel).weight(1.2), + cell(leftIndentSpinner).weight(1.4), + flex(0.2), + cell(rightIndentSpinner).weight(1.4) + ), + fix(2), + row( + flex(1.2), + cell(new UILabel((Toolkit.i18nText("Fine-Design_Report_Left")), SwingConstants.CENTER)).weight(1.4), + flex(0.2), + cell(new UILabel((Toolkit.i18nText("Fine-Design_Basic_Right")), SwingConstants.CENTER)).weight(1.4) + ), + fix(10), + row( + cell(partSpacingLabel).weight(1.2), + cell(spaceBeforeSpinner).weight(1.4), + flex(0.2), + cell(spaceAfterSpinner).weight(1.4) + ), + fix(2), + row( + flex(1.2), + cell(new UILabel((Toolkit.i18nText("Fine-Design_Basic_Front")), SwingConstants.CENTER)).weight(1.4), + flex(0.2), + cell(new UILabel((Toolkit.i18nText("Fine-Design_Basic_Behind")), SwingConstants.CENTER)).weight(1.4) + ), + fix(10), + row( + cell(spacingLabel).weight(1.2), + cell(lineSpaceSpinner).weight(1.4), + flex(1.6) + ) + ).getComponent(); } /** diff --git a/designer-base/src/main/java/com/fr/design/gui/style/BackgroundPane.java b/designer-base/src/main/java/com/fr/design/gui/style/BackgroundPane.java index 3e0f6c2130..0b3f94f0a5 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/BackgroundPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/BackgroundPane.java @@ -1,13 +1,11 @@ package com.fr.design.gui.style; +import com.fine.swing.ui.layout.Layouts; import com.fr.base.Style; import com.fr.design.ExtraDesignClassManager; import com.fr.design.constants.LayoutConstants; import com.fr.design.fun.BackgroundQuickUIProvider; import com.fr.design.gui.icombobox.UIComboBox; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.backgroundpane.*; import com.fr.general.Background; @@ -21,6 +19,8 @@ import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.cell; + /** * @author zhou * @since 2012-5-28下午6:22:09 @@ -45,7 +45,7 @@ public class BackgroundPane extends AbstractBasicStylePane { } protected void initComponents() { - this.setLayout(new BorderLayout(0, 6)); + this.setLayout(new BorderLayout()); typeComboBox = new UIComboBox(); final CardLayout cardlayout = new CardLayout(); @@ -75,19 +75,9 @@ public class BackgroundPane extends AbstractBasicStylePane { } }); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - Component[][] components = new Component[][]{ - new Component[]{null}, - new Component[]{typeComboBox}, - new Component[]{centerPane} - }; - double[] rowSize = {p, p, p}; - double[] columnSize = {f}; - int[][] rowCount = {{1},{1},{1}}; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_LARGE, LayoutConstants.VGAP_MEDIUM); - this.add(panel, BorderLayout.CENTER); - + this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(typeComboBox), cell(centerPane) + ).getComponent(),BorderLayout.CENTER); } protected BackgroundQuickPane[] supportKindsOfBackgroundUI() { diff --git a/designer-base/src/main/java/com/fr/design/gui/style/BorderPane.java b/designer-base/src/main/java/com/fr/design/gui/style/BorderPane.java index d2a302ea01..2477d4e2e9 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/BorderPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/BorderPane.java @@ -4,6 +4,8 @@ package com.fr.design.gui.style; * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. */ +import com.fine.swing.ui.layout.Layouts; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.CellBorderStyle; import com.fr.base.Style; import com.fr.design.constants.LayoutConstants; @@ -13,8 +15,6 @@ import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.icombobox.LineComboBox; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.backgroundpane.NullBackgroundQuickPane; import com.fr.design.style.color.NewColorSelectBox; import com.fr.design.utils.gui.AdjustWorkBookDefaultStyleUtils; @@ -22,29 +22,33 @@ import com.fr.general.IOUtils; import com.fr.stable.Constants; import com.fr.stable.CoreConstants; +import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JPanel; import javax.swing.SwingConstants; +import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; import java.awt.GridLayout; import java.util.Arrays; import java.util.HashSet; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.fix; + /** * @author zhou * @since 2012-5-28下午6:22:04 */ public class BorderPane extends AbstractBasicStylePane implements GlobalNameObserver { - private static final String[] BORDERARRAY = {"currentLineCombo", "currentLineColorPane", "outerToggleButton", "topToggleButton", + private static final String[] BORDER_ARRAY = {"currentLineCombo", "currentLineColorPane", "outerToggleButton", "topToggleButton", "leftToggleButton", "bottomToggleButton", "rightToggleButton", "innerToggleButton", "horizontalToggleButton", "verticalToggleButton"}; - private static final Set BORDER_SET = new HashSet<>(Arrays.asList(BORDERARRAY)); + private static final Set BORDER_SET = new HashSet<>(Arrays.asList(BORDER_ARRAY)); private UIToggleButton topToggleButton; private UIToggleButton horizontalToggleButton; @@ -67,7 +71,22 @@ public class BorderPane extends AbstractBasicStylePane implements GlobalNameObse protected void initComponents() { initButtonsWithIcon(); - this.setLayout(new BorderLayout(0, 0)); + + JPanel borderPane = initBorderPane(); + JPanel backgroundPane = initBackgroundPane(); + this.setLayout(new BorderLayout()); + this.add(Layouts.column( + cell(new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Border"), 280, 24, borderPane)), + fix(1).with(it -> it.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIManager.getColor("defaultBorderColor")))), + cell(new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Background"), 280, 24, backgroundPane)) + ).getComponent()); + + initAllNames(); + outerToggleButton.addChangeListener(outerToggleButtonChangeListener); + innerToggleButton.addChangeListener(innerToggleButtonChangeListener); + } + + private JPanel initBorderPane() { JPanel externalPane = new JPanel(new GridLayout(0, 4)); externalPane.add(topToggleButton); externalPane.add(leftToggleButton); @@ -76,40 +95,42 @@ public class BorderPane extends AbstractBasicStylePane implements GlobalNameObse JPanel insidePane = new JPanel(new GridLayout(0, 2)); insidePane.add(horizontalToggleButton); insidePane.add(verticalToggleButton); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - Component[][] components = new Component[][]{ - new Component[]{null, null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Style") + " ", SwingConstants.LEFT), currentLineCombo}, - new Component[]{null, null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Color") + " ", SwingConstants.LEFT), currentLineColorPane}, - new Component[]{null, null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Out_Border") + " ", SwingConstants.LEFT), outerToggleButton = new UIToggleButton(new Icon[]{IOUtils.readIcon("com/fr/design/images/m_format/out.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/out_white.png")}, false)}, - new Component[]{null, externalPane}, - new Component[]{null, null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_In_Border") + " ", SwingConstants.LEFT), innerToggleButton = new UIToggleButton(new Icon[]{IOUtils.readIcon("com/fr/design/images/m_format/in.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/in_white.png")}, false)}, - new Component[]{null, insidePane}, - new Component[]{null, null} - }; - double[] rowSize = {p, p, p, p, p, p, p, p, p, p, p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_SMALL, LayoutConstants.VGAP_MEDIUM); - JPanel borderPanel = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Border"), 280, 24, panel); - this.add(borderPanel, BorderLayout.NORTH); + return Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Style"), SwingConstants.LEFT)).weight(1.2), + cell(currentLineCombo).weight(3)), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Color"), SwingConstants.LEFT)).weight(1.2), + cell(currentLineColorPane).weight(3)), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Out_Border"), SwingConstants.LEFT)).weight(1.2), + cell(outerToggleButton = new UIToggleButton(new Icon[]{IOUtils.readIcon("com/fr/design/images/m_format/out.png"), + IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/out_white.png")}, false)).weight(3)), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_In_Border"), SwingConstants.LEFT)).weight(1.2), + cell(externalPane).weight(3)), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_In_Border"), SwingConstants.LEFT)).weight(1.2), + cell(innerToggleButton = new UIToggleButton(new Icon[]{IOUtils.readIcon("com/fr/design/images/m_format/in.png"), + IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/in_white.png")}, false)).weight(3)), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_In_Border"), SwingConstants.LEFT)).weight(1.2), + cell(insidePane).weight(3)) + ).with(it -> it.setBorder(new ScaledEmptyBorder(0, 0, LayoutConstants.VERTICAL_GAP, 0))).getComponent(); + } + private JPanel initBackgroundPane() { UILabel backgroundFillLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Background_Fill")); - backgroundFillLabel.setPreferredSize(new Dimension(60, 20)); - backgroundPane = new BackgroundPane(); - JPanel backgroundContainPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{backgroundFillLabel, backgroundPane}}, - TableLayoutHelper.FILL_LASTCOLUMN, LayoutConstants.VGAP_SMALL, LayoutConstants.VGAP_MEDIUM); - - JPanel backgroundPanel = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Background"), 280, 24, backgroundContainPane); - this.add(backgroundPanel, BorderLayout.CENTER); - initAllNames(); - outerToggleButton.addChangeListener(outerToggleButtonChangeListener); - innerToggleButton.addChangeListener(innerToggleButtonChangeListener); + return Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(backgroundFillLabel).with(it -> { + it.setBorder(new ScaledEmptyBorder(LayoutConstants.VGAP_MEDIUM, 0, 0, 0)); + it.setVerticalAlignment(SwingConstants.TOP); + }).weight(1.2), + cell(backgroundPane).weight(3) + ) + ).getComponent(); } ChangeListener outerToggleButtonChangeListener = new ChangeListener() { @@ -133,6 +154,7 @@ public class BorderPane extends AbstractBasicStylePane implements GlobalNameObse }; private void initButtonsWithIcon() { + // todo: 暂缺视觉反白图标 topToggleButton = new UIToggleButton(new Icon[]{IOUtils.readIcon("/com/fr/base/images/dialog/border/top.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/top_white.png")}, false); leftToggleButton = new UIToggleButton(new Icon[]{IOUtils.readIcon("/com/fr/base/images/dialog/border/left.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/left_white.png")}, false); bottomToggleButton = new UIToggleButton(new Icon[]{IOUtils.readIcon("/com/fr/base/images/dialog/border/bottom.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bottom_white.png")}, false); diff --git a/designer-base/src/main/java/com/fr/design/gui/style/FRFontPane.java b/designer-base/src/main/java/com/fr/design/gui/style/FRFontPane.java index 8af5c08d40..8a7431fd2a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/FRFontPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/FRFontPane.java @@ -4,7 +4,8 @@ package com.fr.design.gui.style; * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. */ -import com.fr.base.BaseUtils; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.icon.LazyIcon; import com.fr.base.FRContext; import com.fr.base.Style; import com.fr.base.Utils; @@ -12,12 +13,11 @@ import com.fr.design.constants.LayoutConstants; import com.fr.design.constants.UIConstants; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; +import com.fr.design.gui.core.ReactiveCardPane; import com.fr.design.gui.ibutton.UIColorButton; import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.icombobox.LineComboBox; import com.fr.design.gui.icombobox.UIComboBox; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.utils.DesignUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; @@ -26,24 +26,19 @@ import com.fr.general.FRFont; import com.fr.stable.Constants; -import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; -import java.awt.CardLayout; import java.awt.Component; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.GridLayout; -import java.awt.RenderingHints; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; import java.util.Vector; +import static com.fine.swing.ui.layout.Layouts.Cell; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.column; + /** * Pane to edit Font. */ @@ -54,12 +49,7 @@ public class FRFontPane extends AbstractBasicStylePane implements GlobalNameObse 36, 38, 40, 48, 64, 72, 128 }; private static final int MAX_FONT_SIZE = 100; - private static final Dimension BUTTON_SIZE = new Dimension(20, 18); - private static final Dimension UNDER_LINE_SIZE = new Dimension(87, 20); - private static final Dimension HIDE_SIZE = new Dimension(0, 0); private final String[] fontSizeStyles = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FR_Font_Plain"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FR_Font_Bold"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FR_Font_Italic"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FR_Font_Bolditalic")}; - private JPanel buttonPane; - private JPanel isSuperOrSubPane; private UIComboBox fontNameComboBox; private UIComboBox fontSizeStyleComboBox; protected UIComboBox fontSizeComboBox; @@ -76,19 +66,14 @@ public class FRFontPane extends AbstractBasicStylePane implements GlobalNameObse private UIToggleButton isShadowCheckBox; private UIToggleButton superPane; private UIToggleButton subPane; - private JPanel linePane; - private int italic_bold; - /** - * LeftPane和RightPane之间的间隙,也是fontSizeStyleComboBox与fontSizeComboBox之间的间隙,之前的默认值为VGAP_LARGE - */ - private int hGapBetweenLeftPaneAndRightPane = LayoutConstants.VGAP_LARGE; + private ReactiveCardPane styleContainer; public FRFontPane() { this.initComponents(); } + @Deprecated public FRFontPane(int hGapBetweenLeftPaneAndRightPane) { - this.hGapBetweenLeftPaneAndRightPane = hGapBetweenLeftPaneAndRightPane; this.initComponents(); } @@ -123,17 +108,12 @@ public class FRFontPane extends AbstractBasicStylePane implements GlobalNameObse this.colorSelectPane.setColor(frFont.getForeground()); this.colorSelectPane.repaint(); // update frFont. - - CardLayout cly = (CardLayout) linePane.getLayout(); int line = frFont.getUnderline(); if (line == Constants.LINE_NONE) { underline.setSelected(false); - cly.show(linePane, "none"); - linePane.setPreferredSize(HIDE_SIZE); + styleContainer.removeAll(); } else { underline.setSelected(true); - cly.show(linePane, "combobox"); - linePane.setPreferredSize(UNDER_LINE_SIZE); this.underlineCombo.setSelectedLineStyle(line); } // effects @@ -149,6 +129,7 @@ public class FRFontPane extends AbstractBasicStylePane implements GlobalNameObse this.superPane.setSelected(false); this.subPane.setSelected(false); } + styleContainer.select(underline.isSelected() ? "showLine" : "hideLine").populate(); } /** @@ -231,7 +212,6 @@ public class FRFontPane extends AbstractBasicStylePane implements GlobalNameObse @Override public Style update(Style style) { - // TODO Auto-generated method stub FRFont frFont = style.getFRFont(); frFont = this.update(frFont); return style.deriveFRFont(frFont); @@ -248,44 +228,54 @@ public class FRFontPane extends AbstractBasicStylePane implements GlobalNameObse protected void initComponents() { fontSizeStyleComboBox = new UIComboBox(fontSizeStyles); fontNameComboBox = new UIComboBox(DesignUtils.getAvailableFontFamilyNames4Report()); - fontNameComboBox.setPreferredSize(new Dimension(144, 20)); fontSizeComboBox = new UIComboBox(getFontSizes()); fontSizeComboBox.setEditable(true); - this.underlineCombo = new LineComboBox(UIConstants.BORDER_LINE_STYLE_ARRAY); + underlineCombo = new LineComboBox(UIConstants.BORDER_LINE_STYLE_ARRAY); colorSelectPane = new UIColorButton(); - bold = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold.png")); - italic = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic.png")); - underline = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/underline.png")); - bold.setPreferredSize(BUTTON_SIZE); - italic.setPreferredSize(BUTTON_SIZE); - underline.setPreferredSize(BUTTON_SIZE); - isStrikethroughCheckBox = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/strikethrough.png")); - isStrikethroughCheckBox.setPreferredSize(BUTTON_SIZE); - isShadowCheckBox = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/shadow.png")); - isShadowCheckBox.setPreferredSize(BUTTON_SIZE); - superPane = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/sup.png")); - superPane.setPreferredSize(BUTTON_SIZE); - subPane = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/sub.png")); - subPane.setPreferredSize(BUTTON_SIZE); - Component[] SuperOrSubComponents = new Component[]{ - superPane, subPane - }; - isSuperOrSubPane = new JPanel(new BorderLayout()); - isSuperOrSubPane.add(GUICoreUtils.createFlowPane(SuperOrSubComponents, FlowLayout.LEFT, LayoutConstants.HGAP_SMALL)); - Component[] components_font = new Component[]{ - colorSelectPane, underline, isStrikethroughCheckBox, isShadowCheckBox - }; - buttonPane = new JPanel(new BorderLayout()); - buttonPane.add(GUICoreUtils.createFlowPane(components_font, FlowLayout.LEFT, LayoutConstants.HGAP_SMALL)); - linePane = new JPanel(new CardLayout()); + bold = new UIToggleButton(new LazyIcon("bold")); + italic = new UIToggleButton(new LazyIcon("italic")); + underline = new UIToggleButton(new LazyIcon("underline")); + isStrikethroughCheckBox = new UIToggleButton(new LazyIcon("strike")); + isShadowCheckBox = new UIToggleButton(new LazyIcon("shadow")); + superPane = new UIToggleButton(new LazyIcon("super")); + subPane = new UIToggleButton(new LazyIcon("sub")); + styleContainer = ReactiveCardPane.create() + .addSupplier("showLine", this::createContentWithLine) + .addSupplier("hideLine", this:: createContentNoLine); initAllNames(); setToolTips(); + initListeners(); + + styleContainer.select("hideLine").populate(); this.setLayout(new BorderLayout()); - this.add(createPane(), BorderLayout.CENTER); + this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(fontNameComboBox), + row(5, + cell(fontSizeStyleComboBox).weight(1), + cell(fontSizeComboBox).weight(1)), + cell(styleContainer) + ).getComponent(), BorderLayout.CENTER); + DefaultValues defaultValues = FRContext.getDefaultValues(); populateBean(defaultValues.getFRFont()); } + private Component createContentNoLine() { + return createFontButtonRow().getComponent(); + } + + private Component createContentWithLine() { + return column(LayoutConstants.VERTICAL_GAP, + createFontButtonRow(), + cell(underlineCombo) + ).getComponent(); + } + + private Cell createFontButtonRow() { + return row(3, cell(colorSelectPane), cell(underline), cell(isStrikethroughCheckBox), cell(isShadowCheckBox), + cell(superPane), cell(subPane)); + } + private void initAllNames() { fontSizeStyleComboBox.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FR_Font_Style")); fontNameComboBox.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Name")); @@ -312,63 +302,13 @@ public class FRFontPane extends AbstractBasicStylePane implements GlobalNameObse subPane.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FR_Font_Subscript")); } - - private JPanel createLinePane() { - linePane.add(new JPanel(), "none"); - JPanel gap = new JPanel(new GridLayout(0, 1)); - gap.add(underlineCombo); - linePane.add(gap, "combobox"); + private void initListeners() { underline.addChangeListener(new ChangeListener() { - @Override public void stateChanged(ChangeEvent e) { - CardLayout cly = (CardLayout) linePane.getLayout(); - cly.show(linePane, underline.isSelected() ? "combobox" : "none"); - if(underline.isSelected()){ - linePane.setPreferredSize(UNDER_LINE_SIZE); - }else{ - linePane.setPreferredSize(HIDE_SIZE); - } + styleContainer.select(underline.isSelected() ? "showLine" : "hideLine").populate(); } }); - - return linePane; - } - - private JPanel createLeftPane() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p}; - double[] rowSize = {p, p, p}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}}; - Component[][] components = new Component[][]{ - new Component[]{fontSizeStyleComboBox}, - new Component[]{buttonPane}, - new Component[]{createLinePane()} - }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_MEDIUM, LayoutConstants.VGAP_MEDIUM); - } - - protected JPanel createRightPane() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f}; - double[] rowSize = {p, p}; - int[][] rowCount = {{1, 1}, {1, 1}}; - Component[][] components = new Component[][]{ - new Component[]{fontSizeComboBox}, - new Component[]{isSuperOrSubPane} - }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_MEDIUM, LayoutConstants.VGAP_MEDIUM); - } - - private JPanel createPane() { - JPanel createPane = new JPanel(new BorderLayout()); - createPane.add(fontNameComboBox, BorderLayout.NORTH); - JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{createLeftPane(), createRightPane()}}, TableLayoutHelper.FILL_LASTCOLUMN, hGapBetweenLeftPaneAndRightPane, LayoutConstants.VGAP_LARGE); - jPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); - createPane.add(jPanel, BorderLayout.CENTER); - return createPane; } /** @@ -388,53 +328,4 @@ public class FRFontPane extends AbstractBasicStylePane implements GlobalNameObse public void setGlobalName(String name) { } - private class TwoButtonPane extends JPanel { - public UIToggleButton leftButton; - public UIToggleButton rightButton; - - public TwoButtonPane(UIToggleButton leftButton, UIToggleButton rightButton) { - this.leftButton = leftButton; - this.rightButton = rightButton; - this.setLayout(new FlowLayout(FlowLayout.LEFT, 1, 0)); - this.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); - initButton(leftButton); - initButton(rightButton); - initListener(); - } - - private void initListener() { - leftButton.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - rightButton.setSelected(false); - } - }); - rightButton.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - leftButton.setSelected(false); - } - }); - } - - private void initButton(UIToggleButton button) { - button.setRoundBorder(false); - button.setBorderPainted(false); - this.add(button); - } - - - protected void paintBorder(Graphics g) { - Graphics2D g2d = (Graphics2D) g; - g2d.setColor(UIConstants.LINE_COLOR); - int buttonX = getComponent(0).getX(); - int buttonY = getComponent(0).getY(); - int height = getComponent(0).getHeight(); - int width = getComponent(0).getWidth(); - g.drawLine(buttonX + width, 0, buttonX + width, height); - width += getComponent(1).getWidth(); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - - g2d.drawRoundRect(buttonX - 1, buttonY - 1, width + 2, getHeight() - 1, UIConstants.ARC, UIConstants.ARC); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); - } - } } diff --git a/designer-base/src/main/java/com/fr/design/gui/style/TextFontTippedPane.java b/designer-base/src/main/java/com/fr/design/gui/style/TextFontTippedPane.java index 7f11b0d4bf..0924eb7a7e 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/TextFontTippedPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/TextFontTippedPane.java @@ -1,21 +1,21 @@ package com.fr.design.gui.style; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.Style; import com.fr.design.constants.LayoutConstants; -import com.fr.design.designer.IntervalConstants; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.theme.edit.ui.LabelUtils; -import javax.swing.BorderFactory; +import javax.swing.SwingConstants; import javax.swing.JPanel; import javax.swing.JTextArea; import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; + +import static com.fine.swing.ui.layout.Layouts.cell; /** @@ -33,7 +33,7 @@ public class TextFontTippedPane extends AbstractBasicStylePane { private void initializePane(boolean showFormatTip) { setLayout(new BorderLayout()); - setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, 0, 0)); + setBorder(new ScaledEmptyBorder(LayoutConstants.VERTICAL_GAP, 0, 0, 0)); fontPane = new FRFontPane(); this.add(createLabeledPane(Toolkit.i18nText("Fine-Design_Form_FR_Font"), fontPane), BorderLayout.NORTH); @@ -45,24 +45,21 @@ public class TextFontTippedPane extends AbstractBasicStylePane { } private JPanel createLabeledPane(String text, JPanel panel) { - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] rowSize = { p }; - double[] columnSize = {p, f}; - UILabel uiLabel = new UILabel(text); - JPanel uiLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - uiLabelPane.add(uiLabel, BorderLayout.NORTH); - - return TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ - new Component[] { uiLabelPane, panel }, - }, rowSize, columnSize, LayoutConstants.VGAP_LARGE, LayoutConstants.VGAP_MEDIUM); + return Layouts.row( + cell(uiLabel).with(it -> { + it.setVerticalAlignment(SwingConstants.TOP); + it.setBorder(new ScaledEmptyBorder(5, 0, 0, 0)); + }).weight(1), + cell(panel).weight(3) + ).getComponent(); } private JPanel createFormatTipPane() { JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane(); - container.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, 0, 0)); - JTextArea formatMigratedTip = LabelUtils.createAutoWrapLabel(Toolkit.i18nText("Fine-Design_Report_Format_Style_Migrated_Tip"), new Color(153, 153, 153)); + container.setBorder(new ScaledEmptyBorder(LayoutConstants.VERTICAL_GAP, 0, 0, 0)); + JTextArea formatMigratedTip = LabelUtils.createAutoWrapLabel(Toolkit.i18nText("Fine-Design_Report_Format_Style_Migrated_Tip"), + FineUIUtils.getUIColor("Label.tipColor", "inactiveCaption")); container.add(formatMigratedTip, BorderLayout.NORTH); return container; diff --git a/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java b/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java index 27ae3d04b6..790208bb6f 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java @@ -1,5 +1,9 @@ package com.fr.design.gui.style; +import com.fine.swing.ui.layout.Column; +import com.fine.swing.ui.layout.Layouts; +import com.fine.swing.ui.layout.Row; +import com.fine.theme.utils.FineUIUtils; import com.fr.base.CoreDecimalFormat; import com.fr.base.GraphHelper; import com.fr.base.Style; @@ -7,10 +11,12 @@ import com.fr.base.TextFormat; import com.fr.data.core.FormatField; import com.fr.data.core.FormatField.FormatContents; import com.fr.design.border.UIRoundedBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.constants.UIConstants; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; import com.fr.design.event.UIObserverListener; +import com.fr.design.gui.core.ReactiveCardPane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icombobox.TextFontComboBox; import com.fr.design.gui.icombobox.UIComboBox; @@ -21,17 +27,14 @@ import com.fr.general.ComparatorUtils; import com.fr.stable.StringUtils; import javax.swing.BorderFactory; -import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; -import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.TitledBorder; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; -import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.event.ItemEvent; @@ -40,6 +43,10 @@ import java.math.RoundingMode; import java.text.Format; import java.text.SimpleDateFormat; +import static com.fine.swing.ui.layout.Layouts.Cell; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + /** * @author Starryi * @version 1.0 @@ -72,6 +79,7 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName private boolean isRightFormat; private boolean isDate = false; private GlobalNameListener globalNameListener = null; + protected ReactiveCardPane cardPane; public TextFormatPane() { @@ -81,10 +89,6 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName initPreviewLabel4GeneralFormat(); initLayout(); - - setTextFieldVisible(false); - setRoundingBoxVisible(false); - setPreviewLabelVisible(false); } private void initFormatTypesComboBox() { @@ -103,21 +107,15 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName private void initRoundingCheckBox4PercentFormat() { roundingBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Base_Option_Half_Up")); - roundingBox.setBorder(BorderFactory.createEmptyBorder(0, 30, 0, 0)); - roundingBox.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - } - }); roundingBox.setGlobalName("roundingBox"); } private void initPreviewLabel4GeneralFormat() { - Border interBorder = new UIRoundedBorder(UIConstants.LINE_COLOR, 1, 4); + Color labelColor = FineUIUtils.getUIColor("Label.tipColor", "inactiveCaption"); + Border interBorder = new UIRoundedBorder(UIConstants.LINE_COLOR, 0, 4); String title = Toolkit.i18nText("Fine-Design_Report_Base_StyleFormat_Sample"); - Border border = BorderFactory.createTitledBorder(interBorder, title, TitledBorder.LEFT, 0, null, UIConstants.LINE_COLOR); + Border border = BorderFactory.createTitledBorder(interBorder, title, TitledBorder.ABOVE_TOP, 0, null, labelColor); previewLabel = new UILabel(FormatField.getInstance().getFormatValue()) { - @Override public void paint(Graphics g) { super.paint(g); @@ -125,7 +123,7 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName Color original = g.getColor(); g.setColor(getBackground()); g.fillRect(LABEL_X, LABEL_Y, width - LABEL_DELTA_WIDTH, LABEL_HEIGHT); - g.setColor(UIConstants.LINE_COLOR); + g.setColor(labelColor); FontMetrics cellFM = g.getFontMetrics(); int textWidth = cellFM.stringWidth(getText()); GraphHelper.drawString(g, getText(), (width - textWidth) / 2F, 26); @@ -137,43 +135,42 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName } protected void initLayout() { - JPanel labeledFormatTypeComboBoxPane = new JPanel(new BorderLayout(20, 0)); - labeledFormatTypeComboBoxPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Report_Base_Format")), BorderLayout.WEST); - labeledFormatTypeComboBoxPane.add(typeComboBox, BorderLayout.CENTER); - - JPanel labeledRoundingCheckboxPane = new JPanel(new BorderLayout(0, 0)); - labeledRoundingCheckboxPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Report_Base_Option")), BorderLayout.WEST); - labeledRoundingCheckboxPane.add(roundingBox, BorderLayout.CENTER); - - addComponents(4, new JComponent[] { labeledFormatTypeComboBoxPane, textField, labeledRoundingCheckboxPane, previewLabel}); - } - - protected void setTextFieldVisible(boolean visible) { - textField.setVisible(visible); - } - - protected void setRoundingBoxVisible(boolean visible) { - roundingBox.getParent().setVisible(visible); - } - - protected void setPreviewLabelVisible(boolean visible) { - previewLabel.setVisible(visible); - } - - protected void addComponents(int gap, JComponent[] components) { - JPanel container = this; - container.setLayout(new BorderLayout(0, gap)); - for (JComponent component: components) { - if (component != null) { - container.add(component, BorderLayout.NORTH); - JPanel nextContainer = new JPanel(new BorderLayout(0, gap)); - container.add(nextContainer, BorderLayout.CENTER); - container = nextContainer; - } - } - if (container.getComponentCount() == 0) { - container.getParent().remove(container); - } + this.setLayout(new BorderLayout()); + cardPane = ReactiveCardPane.create() + .addSupplier("normal", () -> Layouts.column(LayoutConstants.VERTICAL_GAP, + createTypeRow() + ).getComponent()) + .addSupplier("preview", () -> Layouts.column(LayoutConstants.VERTICAL_GAP, + createTypeRow(), + createPreviewRow() + ).getComponent()) + .addSupplier("previewAndCheck", () -> Layouts.column(LayoutConstants.VERTICAL_GAP, + createTypeRow(), + createPreviewRow(), + createRoundBoxRow() + ).getComponent()); + cardPane.select("normal").populate(); + this.add(cardPane); + } + + private Cell createTypeRow() { + return row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Report_Base_Format"))).weight(1.2), + cell(typeComboBox).weight(3) + ); + } + + private Cell createRoundBoxRow() { + return row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Report_Base_Option"))).weight(1.2), + cell(roundingBox).with(it -> it.setBorder(null)).weight(3) + ); + } + + private Cell createPreviewRow() { + return row( + cell(previewLabel).weight(1) + ); } protected UIComboBoxRenderer createComBoxRender() { @@ -189,18 +186,6 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName }; } - - @Override - /** - * 得到合适的大小 - */ - public Dimension getPreferredSize() { - if (this.typeComboBox.getSelectedIndex() == FormatContents.NULL) { - return typeComboBox.getPreferredSize(); - } - return super.getPreferredSize(); - } - /** * 弹出框标题 * @@ -329,6 +314,11 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName return contents == FormatContents.TEXT || contents == FormatContents.NULL; } + private boolean isRoundFormat() { + int contents = getFormatContents(); + return contents == FormatContents.PERCENT || contents == FormatContents.THOUSANDTHS; + } + /** * Radio selection listener. */ @@ -338,16 +328,16 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { int contents = getFormatContents(); - + Column contentContainer; if (!isTextOrNull()) { textField.removeAllItems(); String[] items = FormatField.getInstance().getFormatArray(contents, false); textField.setItemArray(items); textField.setSelectedIndex(0); + cardPane.select(isRoundFormat() ? "previewAndCheck" : "preview").populate(); + } else { + cardPane.select("normal").populate(); } - setTextFieldVisible(!isTextOrNull()); - setPreviewLabelVisible(!isTextOrNull()); - setRoundingBoxVisible(getFormatContents() == FormatContents.PERCENT || getFormatContents() == FormatContents.THOUSANDTHS); } } @@ -363,17 +353,11 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName }; @Override - /** - * populate - */ public void populateBean(Style style) { this.populateBean(style.getFormat()); } @Override - /** - * update - */ public Style update(Style style) { return updateByGlobalNamedSetting(style); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 14a8f216fe..acf32c4ef1 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -79,14 +79,14 @@ public class EastRegionContainerPane extends UIEastResizableContainer { private FixedPopupPane currentPopupPane; private UIButton currentButton; private static final int CONTAINER_WIDTH = containerWidth(); - private static final int TAB_WIDTH = 42; - private static final int TAB_BUTTON_WIDTH = 40; - private static final int TAB_BUTTON_HEIGHT = 40; + private static final int TAB_WIDTH = FineUIScale.scale(42); + private static final int TAB_BUTTON_WIDTH = FineUIScale.scale(40); + private static final int TAB_BUTTON_HEIGHT = FineUIScale.scale(40); private static final int CONTENT_WIDTH = CONTAINER_WIDTH - TAB_WIDTH; - private static final int ARROW_RANGE_START = CONTENT_WIDTH - 30; + private static final int ARROW_RANGE_START = CONTENT_WIDTH - FineUIScale.scale(30); // 弹出对话框高度 - private static final int POPUP_MIN_HEIGHT = 145; - private static final int POPUP_DEFAULT_HEIGHT = 356; + private static final int POPUP_MIN_HEIGHT = FineUIScale.scale(145); + private static final int POPUP_DEFAULT_HEIGHT = FineUIScale.scale(356); public static final String KEY_CELL_ELEMENT = "cellElement"; public static final String KEY_CELL_ATTR = "cellAttr"; public static final String KEY_FLOAT_ELEMENT = "floatElement"; @@ -416,14 +416,14 @@ public class EastRegionContainerPane extends UIEastResizableContainer { // 左侧按钮面板 private void initLeftPane() { leftPane = new JPanel(); - leftPane.setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 1, 0)); + leftPane.setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 0, 0)); for (PropertyItem item : propertyItemMap.values()) { if (item.isPoppedOut() || !item.isVisible()) { continue; } leftPane.add(item.getButton()); } - leftPane.setBorder(new FlatLineBorder(new Insets(0,0,0,0), UIManager.getColor("East.border"))); + leftPane.setBorder(new FlatLineBorder(new Insets(0,1,0,1), UIManager.getColor("East.border"))); replaceLeftPane(leftPane); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/backgroundpane/GradientBackgroundQuickPane.java b/designer-base/src/main/java/com/fr/design/mainframe/backgroundpane/GradientBackgroundQuickPane.java index 6c3ea9e727..176cd9b8c5 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/backgroundpane/GradientBackgroundQuickPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/backgroundpane/GradientBackgroundQuickPane.java @@ -1,20 +1,20 @@ package com.fr.design.mainframe.backgroundpane; +import com.fine.swing.ui.layout.Layouts; import com.fr.base.background.GradientBackground; +import com.fr.design.constants.LayoutConstants; import com.fr.design.event.UIObserverListener; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.style.background.gradient.GradientBar; import com.fr.general.Background; -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import java.awt.*; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + /** * @author zhou * @since 2012-5-30上午10:36:21 @@ -39,24 +39,17 @@ public class GradientBackgroundQuickPane extends BackgroundQuickPane { } private void constructPane(){ - String[] textArray = {com.fr.design.i18n.Toolkit.i18nText("FIne-Design_Report_Utils_Left_To_Right"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Top_To_Bottom")}; + String[] textArray = {com.fr.design.i18n.Toolkit.i18nText("FIne-Design_Report_Utils_Left_To_Right"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Top_To_Bottom")}; Integer[] valueArray = {GradientBackground.LEFT2RIGHT, GradientBackground.TOP2BOTTOM}; - directionPane = new UIButtonGroup(textArray, valueArray); + directionPane = new UIButtonGroup<>(textArray, valueArray); directionPane.setSelectedIndex(0); gradientBar = new GradientBar(4, this.gradientBarWidth); - - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, f}; - double[] rowSize = {p, p,}; - - Component[][] components = new Component[][]{ - new Component[]{gradientBar, null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Gradient_Direction")), directionPane} - }; - JPanel Gradient = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); this.setLayout(new BorderLayout()); - this.add(Gradient, BorderLayout.CENTER); + this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(gradientBar), + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Gradient_Direction"))).weight(1), cell(directionPane).weight(2)) + ).getComponent(), BorderLayout.CENTER); } public void populateBean(Background background) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/backgroundpane/PatternBackgroundQuickPane.java b/designer-base/src/main/java/com/fr/design/mainframe/backgroundpane/PatternBackgroundQuickPane.java index 8f4c2ecfbf..789bcd16cf 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/backgroundpane/PatternBackgroundQuickPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/backgroundpane/PatternBackgroundQuickPane.java @@ -1,15 +1,16 @@ package com.fr.design.mainframe.backgroundpane; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.GraphHelper; import com.fr.base.background.PatternBackground; -import com.fr.design.border.UIRoundedBorder; import com.fr.design.constants.LayoutConstants; import com.fr.design.constants.UIConstants; import com.fr.design.event.UIObserverListener; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.style.color.ColorSelectBox; import com.fr.general.Background; @@ -22,6 +23,9 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.Rectangle2D; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + /** * @author zhou * @since 2012-5-29下午1:12:33 @@ -29,7 +33,6 @@ import java.awt.geom.Rectangle2D; public class PatternBackgroundQuickPane extends BackgroundQuickPane { private int patternIndex = 0; // pattern setIndex. - private final static int DEFAULT_DIM_HEIGHT = 210; private final static Color DEFAULT_FOREGROUND = Color.lightGray; private final static Color DEFAULT_BACKGROUND = Color.black; private ColorSelectBox foregroundColorPane; @@ -40,11 +43,11 @@ public class PatternBackgroundQuickPane extends BackgroundQuickPane { this.setLayout(new BorderLayout(0, 4)); JPanel contentPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); this.add(contentPane, BorderLayout.NORTH); - contentPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, 5)); + contentPane.setBorder(new FineRoundBorder()); JPanel typePane2 = new JPanel(); contentPane.add(typePane2); typePane2.setLayout(new GridLayout(0, 8, 1, 1)); - typePane2.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8)); + typePane2.setBorder(new ScaledEmptyBorder(8, 8, 8, 8)); ButtonGroup patternButtonGroup = new ButtonGroup(); patternButtonArray = new PatternButton[PatternBackground.PATTERN_COUNT]; for (int i = 0; i < PatternBackground.PATTERN_COUNT; i++) { @@ -52,41 +55,22 @@ public class PatternBackgroundQuickPane extends BackgroundQuickPane { patternButtonGroup.add(patternButtonArray[i]); typePane2.add(patternButtonArray[i]); } - foregroundColorPane = new ColorSelectBox(60); - backgroundColorPane = new ColorSelectBox(60); + foregroundColorPane = new ColorSelectBox(FineUIScale.scale(60)); + backgroundColorPane = new ColorSelectBox(FineUIScale.scale(60)); foregroundColorPane.setSelectObject(DEFAULT_FOREGROUND); foregroundColorPane.setSelectObject(DEFAULT_BACKGROUND); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - Component[][] components = new Component[][]{ - new Component[]{null, null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Foreground"), UILabel.LEFT), foregroundColorPane}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Background"), UILabel.LEFT), backgroundColorPane}, - }; - double[] rowSize = {p, p, p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}}; - JPanel colorPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_MEDIUM, LayoutConstants.VGAP_LARGE); - this.add(colorPane, BorderLayout.CENTER); + this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Foreground"), UILabel.LEFT)).weight(1), + cell(foregroundColorPane).weight(4)), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Background"), UILabel.LEFT)).weight(1), + cell(backgroundColorPane).weight(4)) + ).with(it -> it.setBorder(new ScaledEmptyBorder(LayoutConstants.VERTICAL_GAP, 0, 0, 0))).getComponent(), BorderLayout.CENTER); foregroundColorPane.addSelectChangeListener(colorChangeListener); backgroundColorPane.addSelectChangeListener(colorChangeListener); } - @Override - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.height = DEFAULT_DIM_HEIGHT; - return dim; - } - - private JPanel createLabelColorPane(String text, JComponent colorPane) { - JPanel labelColorPane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); - labelColorPane.add(new UILabel(text)); - labelColorPane.add(colorPane); - - return labelColorPane; - } - public void populateBean(Background background) { PatternBackground patternBackground = (PatternBackground) background; int patternIndex = patternBackground.getPatternIndex(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/ThemedCellStyleListPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/ThemedCellStyleListPane.java index b3362e5fb0..d57ab7f307 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/ThemedCellStyleListPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/ThemedCellStyleListPane.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.theme; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.theme.TemplateTheme; import com.fr.base.theme.settings.ThemedCellStyle; import com.fr.design.beans.FurtherBasicBeanPane; @@ -54,7 +55,7 @@ public class ThemedCellStyleListPane extends FurtherBasicBeanPane implements Previewable, UIObserver { /** * richer:数据字典和数据链面板 */ - private static final int GAP_HUGER = 32; protected com.fr.data.impl.Connection database; protected DoubleDeckValueEditorPane keyColumnPane; protected DoubleDeckValueEditorPane valueDictPane; @@ -60,31 +62,32 @@ public class DatabaseDictPane extends FurtherBasicBeanPane i private void initBasicComponet() { -// keyColumnPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()}); keyColumnPane = new DoubleDeckValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()}); FormulaEditor formulaEditor = new FormulaEditor(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Engine_Parameter_Formula")); formulaEditor.setEnabled(true); -// valueDictPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor(), formulaEditor}); valueDictPane = new DoubleDeckValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor(), formulaEditor}); } private void initComponet() { chooseTable = new VerticalChoosePane(this); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, f}; - double[] rowSize = {p, p, p, p, p}; - int[][] rowCount = {{1, 1}, {1, 3}, {1, 3}}; - - Component[][] components = new Component[][]{ - new Component[]{null, null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Actual_Value"), UILabel.LEFT), keyColumnPane}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Display_Value"), UILabel.LEFT), valueDictPane} - }; - JPanel dbDictPanel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, GAP_HUGER, LayoutConstants.VGAP_LARGE); - this.setLayout(new BorderLayout(0, 4)); - this.add(chooseTable, BorderLayout.NORTH); - this.add(dbDictPanel, BorderLayout.CENTER); + this.setLayout(new BorderLayout()); + this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(chooseTable), + row( + column(LayoutConstants.VERTICAL_GAP, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Actual_Value"), UILabel.LEFT)).weight(1), + flex(1) + ).weight(1), + cell(keyColumnPane).weight(2) + ), + row( + column(LayoutConstants.VERTICAL_GAP, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Display_Value"), UILabel.LEFT)).weight(1), + flex(1) + ).weight(1), + cell(valueDictPane).weight(2) + ) + ).getComponent(), BorderLayout.CENTER); } diff --git a/designer-base/src/main/java/com/fr/design/present/dict/DictionaryPane.java b/designer-base/src/main/java/com/fr/design/present/dict/DictionaryPane.java index 94e4b3f0ff..cfa9439d37 100644 --- a/designer-base/src/main/java/com/fr/design/present/dict/DictionaryPane.java +++ b/designer-base/src/main/java/com/fr/design/present/dict/DictionaryPane.java @@ -1,5 +1,6 @@ package com.fr.design.present.dict; +import com.fine.swing.ui.layout.Layouts; import com.fr.data.Dictionary; import com.fr.data.impl.DynamicSQLDict; import com.fr.design.beans.FurtherBasicBeanPane; @@ -8,8 +9,6 @@ import com.fr.design.data.DataCreatorUI; import com.fr.design.data.tabledata.Prepare4DataSourceChange; import com.fr.design.gui.frpane.UIComboBoxPane; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import javax.swing.*; @@ -17,6 +16,9 @@ import java.awt.*; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + /** * @author zhou * @since 2012-5-31下午12:20:41 @@ -29,20 +31,14 @@ public class DictionaryPane extends UIComboBoxPane implements DataCr @Override protected void initLayout() { - this.setLayout(new BorderLayout(0, 4)); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, f}; - double[] rowSize = {p, p}; - int[][] rowCount = {{1, 1}, {1, 1}}; - - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Type_Set"), UILabel.LEFT), jcb}, - new Component[]{null, null} - }; - JPanel northPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_HUGER, LayoutConstants.VGAP_MEDIUM); - this.add(northPane, BorderLayout.NORTH); - this.add(cardPane, BorderLayout.CENTER); + this.setLayout(new BorderLayout()); + this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Type_Set"), UILabel.LEFT)).weight(1), + cell(jcb).weight(2) + ), + cell(cardPane) + ).getComponent()); } @Override diff --git a/designer-base/src/main/java/com/fr/design/present/dict/FormulaDictPane.java b/designer-base/src/main/java/com/fr/design/present/dict/FormulaDictPane.java index 2eca81466b..c3083dc0c8 100644 --- a/designer-base/src/main/java/com/fr/design/present/dict/FormulaDictPane.java +++ b/designer-base/src/main/java/com/fr/design/present/dict/FormulaDictPane.java @@ -1,5 +1,6 @@ package com.fr.design.present.dict; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseFormula; import com.fr.base.BaseUtils; import com.fr.data.impl.FormulaDictionary; @@ -34,8 +35,7 @@ public class FormulaDictPane extends FurtherBasicBeanPane { keyFormulaEditor.setColumns(EDITOR_COLUMN); JPanel keyFormulaContainer = new JPanel(new FlowLayout(FlowLayout.RIGHT, LEFT_BORDER, 0)); keyFormulaContainer.setBorder(BorderFactory.createEmptyBorder(0, -LEFT_BORDER, 0, -LEFT_BORDER)); - keyFormulaEditor.setPreferredSize(new Dimension(144, 20)); - Icon icon = BaseUtils.readIcon("/com/fr/design/images/m_insert/formula.png"); + Icon icon = new LazyIcon("formula"); keyFormulaContainer.add(new JLabel(icon)); keyFormulaContainer.add(keyFormulaEditor); @@ -50,7 +50,6 @@ public class FormulaDictPane extends FurtherBasicBeanPane { UILabel tag = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula_Dictionary_Display_Examples_Html")); tag.setForeground(new Color(143, 143, 146)); - tag.setPreferredSize(new Dimension(225, 80)); JPanel t = new JPanel(new BorderLayout()); t.add(tag, BorderLayout.CENTER); @@ -59,7 +58,6 @@ public class FormulaDictPane extends FurtherBasicBeanPane { JPanel valueFormulaContainer = new JPanel(new FlowLayout(FlowLayout.RIGHT, LEFT_BORDER, 0)); valueFormulaContainer.setBorder(BorderFactory.createEmptyBorder(0, -LEFT_BORDER, 0, -LEFT_BORDER)); - valueFormulaEditor.setPreferredSize(new Dimension(144, 20)); valueFormulaContainer.add(new JLabel(icon)); valueFormulaContainer.add(valueFormulaEditor); diff --git a/designer-base/src/main/java/com/fr/design/present/dict/TableDataDictPane.java b/designer-base/src/main/java/com/fr/design/present/dict/TableDataDictPane.java index 5ebd426593..a651bbdbc8 100644 --- a/designer-base/src/main/java/com/fr/design/present/dict/TableDataDictPane.java +++ b/designer-base/src/main/java/com/fr/design/present/dict/TableDataDictPane.java @@ -1,5 +1,6 @@ package com.fr.design.present.dict; +import com.fine.swing.ui.layout.Layouts; import com.fr.base.BaseFormula; import com.fr.base.TableData; import com.fr.data.TableDataSource; @@ -27,24 +28,20 @@ import com.fr.design.editor.editor.FormulaEditor; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; -import com.fr.log.FineLoggerFactory; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; import javax.swing.JFrame; import javax.swing.JPanel; -import javax.swing.SwingWorker; import java.awt.BorderLayout; -import java.awt.Component; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; -import java.util.ArrayList; import java.util.List; -import java.util.concurrent.ExecutionException; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; /** * 数据字典的数据查询面板 @@ -55,9 +52,7 @@ import java.util.concurrent.ExecutionException; public class TableDataDictPane extends FurtherBasicBeanPane implements Previewable, UIObserver, Prepare4DataSourceChange { private static final int BEGIN = 1; private static final int END = 10; - private static final int VGAP = 24; private static final long serialVersionUID = -5469742115988153206L; - private static final int SELECTED_NO_TABLEDATA = -2; public TableDataComboBox tableDataNameComboBox; private DoubleDeckValueEditorPane keyColumnPane; private DoubleDeckValueEditorPane valueDictPane; @@ -89,35 +84,32 @@ public class TableDataDictPane extends FurtherBasicBeanPane tdChange(e); } }); -// keyColumnPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()}); keyColumnPane = new DoubleDeckValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()}); FormulaEditor formulaEditor = new FormulaEditor(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parameter_Formula")); formulaEditor.setEnabled(true); -// valueDictPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor(), formulaEditor}); valueDictPane = new DoubleDeckValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor(), formulaEditor}); } private void initComponents() { - - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, f}; - double[] rowSize = {p, p, p, p, p}; - int[][] rowCount = {{1, 1}, {1, 3}, {1, 3}}; - JPanel firstLine = new JPanel(new BorderLayout(4, 0)); firstLine.add(tableDataNameComboBox, BorderLayout.CENTER); firstLine.add(new PreviewLabel(this), BorderLayout.EAST); - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DS_Table_Data") + " ", UILabel.LEFT), firstLine}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Actual_Value") + " ", UILabel.LEFT), keyColumnPane}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Display_Value") + " ", UILabel.LEFT), valueDictPane}, - }; - - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, VGAP, LayoutConstants.VGAP_MEDIUM); this.setLayout(new BorderLayout()); - this.add(panel, BorderLayout.CENTER); + this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DS_Table_Data"), UILabel.LEFT)).weight(1), + cell(firstLine).weight(2) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Actual_Value"), UILabel.LEFT)).weight(1), + cell(keyColumnPane).weight(2) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Display_Value"), UILabel.LEFT)).weight(1), + cell(valueDictPane).weight(2) + ) + ).getComponent(), BorderLayout.CENTER); } @@ -195,9 +187,6 @@ public class TableDataDictPane extends FurtherBasicBeanPane } @Override - /** - * - */ public void populateBean(TableDataDictionary tableDataDict) { populate(tableDataDict, ""); } diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cellelement.svg b/designer-base/src/main/resources/com/fine/theme/icon/cellelement.svg new file mode 100644 index 0000000000..0f46244577 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cellelement.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cellelement_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/cellelement_disable.svg new file mode 100644 index 0000000000..c4f26a528b --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cellelement_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/close/close.svg b/designer-base/src/main/resources/com/fine/theme/icon/close/close.svg new file mode 100755 index 0000000000..3b296b0df9 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/close/close.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/close/close_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/close/close_disable.svg new file mode 100755 index 0000000000..b193f33216 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/close/close_disable.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/close/close_round.svg b/designer-base/src/main/resources/com/fine/theme/icon/close/close_round.svg new file mode 100755 index 0000000000..280c99d21c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/close/close_round.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/close/close_round_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/close/close_round_disable.svg new file mode 100755 index 0000000000..1512a9aff6 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/close/close_round_disable.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/add_parenthesis.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/add_parenthesis.svg new file mode 100644 index 0000000000..fd415fcb5f --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/add_parenthesis.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/add_parenthesis_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/add_parenthesis_disable.svg new file mode 100644 index 0000000000..ac60d55fe8 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/add_parenthesis_disable.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/remove_parenthesis.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/remove_parenthesis.svg new file mode 100644 index 0000000000..72c7c4ae3d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/remove_parenthesis.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/remove_parenthesis_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/remove_parenthesis_disable.svg new file mode 100644 index 0000000000..538bb9d9a5 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/remove_parenthesis_disable.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/shadow.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/shadow.svg new file mode 100644 index 0000000000..893dd69056 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/shadow.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/shadow_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/shadow_disable.svg new file mode 100644 index 0000000000..1db03fefab --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/shadow_disable.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/strike.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/strike.svg new file mode 100644 index 0000000000..36ea144a52 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/strike.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/strike_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/strike_disable.svg new file mode 100644 index 0000000000..77be0838e8 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/strike_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/sub.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/sub.svg new file mode 100644 index 0000000000..71f1a3caa7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/sub.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/sub_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/sub_disable.svg new file mode 100644 index 0000000000..559755ab66 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/sub_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/super.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/super.svg new file mode 100644 index 0000000000..9ee840c36d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/super.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/super_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/super_disable.svg new file mode 100644 index 0000000000..4e07a44a80 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/super_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/select.svg b/designer-base/src/main/resources/com/fine/theme/icon/select.svg new file mode 100644 index 0000000000..7eb7a4ee49 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/select.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/select_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/select_disable.svg new file mode 100644 index 0000000000..9a9ab1d2b2 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/select_disable.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/sort/fill/nosort.svg b/designer-base/src/main/resources/com/fine/theme/icon/sort/fill/nosort.svg new file mode 100644 index 0000000000..a23aaa88b9 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/sort/fill/nosort.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/sort/fill/sort_asc.svg b/designer-base/src/main/resources/com/fine/theme/icon/sort/fill/sort_asc.svg new file mode 100644 index 0000000000..a91d507015 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/sort/fill/sort_asc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/sort/fill/sort_desc.svg b/designer-base/src/main/resources/com/fine/theme/icon/sort/fill/sort_desc.svg new file mode 100644 index 0000000000..cb9b5d390e --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/sort/fill/sort_desc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/sort/nosort.svg b/designer-base/src/main/resources/com/fine/theme/icon/sort/nosort.svg new file mode 100644 index 0000000000..29fdee5e28 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/sort/nosort.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/sort/nosort_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/sort/nosort_disable.svg new file mode 100644 index 0000000000..446eb9106f --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/sort/nosort_disable.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/sort/sort_asc.svg b/designer-base/src/main/resources/com/fine/theme/icon/sort/sort_asc.svg new file mode 100644 index 0000000000..31d9cac71e --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/sort/sort_asc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/sort/sort_asc_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/sort/sort_asc_disable.svg new file mode 100644 index 0000000000..2b7f11e789 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/sort/sort_asc_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/sort_asc.svg b/designer-base/src/main/resources/com/fine/theme/icon/sort/sort_desc.svg similarity index 100% rename from designer-base/src/main/resources/com/fine/theme/icon/toolbar/sort_asc.svg rename to designer-base/src/main/resources/com/fine/theme/icon/sort/sort_desc.svg diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/sort_asc_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/sort/sort_desc_disable.svg similarity index 100% rename from designer-base/src/main/resources/com/fine/theme/icon/toolbar/sort_asc_disable.svg rename to designer-base/src/main/resources/com/fine/theme/icon/sort/sort_desc_disable.svg diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index d0241bc58e..51b2c52785 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -49,6 +49,7 @@ Component.defaultVGap=10 @BrandHoverColor = #5493F2 @BrandPressedColor = #105DD1 @BrandHoverColorSP = #2576EF 12% +@BrandTipColor = #0a1c3877 @marginSmall = 4 @marginLarge = 10 @@ -139,7 +140,7 @@ tooltip.disabled=#A3ADBD #---- Button ---- Button.border = com.formdev.flatlaf.ui.FlatButtonBorder -Button.arc = 3 +Button.arc = 6 Button.minimumWidth = 72 Button.margin = 2,12,2,12 Button.iconTextGap = 4 @@ -354,6 +355,9 @@ FormattedTextField.selectionBackground=$color.brand4 FormattedTextField.placeholderForeground = @disabledForeground FormattedTextField.iconTextGap = 4 +# ---- Label ---- +Label.tipColor = @BrandTipColor + #---- HelpButton ---- HelpButton.questionMarkColor = @accentCheckmarkColor @@ -993,7 +997,6 @@ ToggleButton.margin = $Button.margin ToggleButton.compact.margin = 2,0,2,0 ToggleButton.iconTextGap = $Button.iconTextGap ToggleButton.rollover = $Button.rollover - ToggleButton.background = $Button.background ToggleButton.pressedBackground = @BrandPressedColor ToggleButton.selectedBackground = @BrandColor @@ -1112,7 +1115,7 @@ Tree.hash = darken($Tree.background,10%) West.border = $defaultBorderColor #---- ExpandablePane ---- ExpandablePane.HeaderPane.borderInsets=0, 6, 0, 6 -ExpandablePane.HeaderPane.hGap=2 +ExpandablePane.HeaderPane.hGap=0 ExpandablePane.HeaderPane.foreground=$text.highlight ExpandablePane.vGap=5 HeaderPane.width=248 diff --git a/designer-realize/src/main/java/com/fr/design/expand/ExpandFatherPane.java b/designer-realize/src/main/java/com/fr/design/expand/ExpandFatherPane.java index de0580edbe..5a32b0e61d 100644 --- a/designer-realize/src/main/java/com/fr/design/expand/ExpandFatherPane.java +++ b/designer-realize/src/main/java/com/fr/design/expand/ExpandFatherPane.java @@ -1,10 +1,12 @@ package com.fr.design.expand; -import com.fr.base.BaseUtils; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.icon.LazyIcon; import com.fr.design.constants.LayoutConstants; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; import com.fr.design.gui.columnrow.ColumnRowPane; +import com.fr.design.gui.core.ReactiveCardPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.mainframe.ElementCasePane; @@ -20,8 +22,8 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; + +import static com.fine.swing.ui.layout.Layouts.cell; public abstract class ExpandFatherPane extends JPanel implements GlobalNameObserver { @@ -33,24 +35,15 @@ public abstract class ExpandFatherPane extends JPanel implements GlobalNameObser private String expandFatherName = ""; private GlobalNameListener globalNameListener = null; private boolean isAlreadyAddListener = false; - public JPanel customPane; - private CardLayout cardLayout; + private ReactiveCardPane cardPane; public ExpandFatherPane() { - this.setLayout(new BorderLayout(0, LayoutConstants.VGAP_SMALL)); + this.setLayout(new BorderLayout()); comboBox = new UIComboBox(new String[]{ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_None"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Custom")}); - cardLayout = new CardLayout(); - customPane = new JPanel(cardLayout); customParentColumnRowPane = new ColumnRowPane() { - - @Override - public Dimension getPreferredSize() { - return new Dimension(super.getPreferredSize().width, 20); - } - public void setGlobalName() { if (shouldResponseNameListener()) { globalNameListener.setGlobalName(expandFatherName); @@ -58,54 +51,31 @@ public abstract class ExpandFatherPane extends JPanel implements GlobalNameObser } }; - UIButton imageButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/buttonicon/select.png")); - imageButton.setPreferredSize(new Dimension(24, 20)); + UIButton imageButton = new UIButton(new LazyIcon("select")); JPanel cc = new JPanel(new BorderLayout(LayoutConstants.HGAP_SMALL, 0)); cc.add(customParentColumnRowPane, BorderLayout.CENTER); cc.add(imageButton, BorderLayout.EAST); - customPane.add(cc, "content"); - customPane.add(new JPanel(), "none"); - customPane.setPreferredSize(new Dimension(0, 0)); - this.add(comboBox, BorderLayout.NORTH); - this.add(customPane, BorderLayout.CENTER); - - comboBox.addItemListener(new ItemListener() { - - @Override - public void itemStateChanged(ItemEvent e) { - if (comboBox.getSelectedIndex() == 2) { - customPane.setPreferredSize(new Dimension(100, 20)); - cardLayout.show(customPane, "content"); - } else { - cardLayout.show(customPane, "none"); - customPane.setPreferredSize(new Dimension(0, 0)); - } -// cardLayout.show(customPane, comboBox.getSelectedIndex() == 2 ? "content" : "none"); - if (globalNameListener != null && shouldResponseNameListener()) { - globalNameListener.setGlobalName(expandFatherName); - } - } - }); - imageButton.addActionListener(imageActionListener); - comboBox.setSelectedIndex(1); - } - - ItemListener comboBoxItemListener = new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { + cardPane = ReactiveCardPane.create() + .addSupplier("content", () -> Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(comboBox), + cell(cc)).getComponent()) + .addSupplier("none", () -> Layouts.cell(comboBox).getComponent()); + cardPane.select("none").populate(); + this.add(cardPane); + comboBox.addItemListener(e -> { if (comboBox.getSelectedIndex() == 2) { - customPane.setPreferredSize(new Dimension(100, 20)); - cardLayout.show(customPane, "content"); + cardPane.select("content").populate(); } else { - cardLayout.show(customPane, "none"); - customPane.setPreferredSize(new Dimension(0, 0)); + cardPane.select("none").populate(); + } -// cardLayout.show(customPane, comboBox.getSelectedIndex() == 2 ? "content" : "none"); if (globalNameListener != null && shouldResponseNameListener()) { globalNameListener.setGlobalName(expandFatherName); } - } - }; + }); + imageButton.addActionListener(imageActionListener); + comboBox.setSelectedIndex(1); + } ActionListener imageActionListener = new ActionListener() { @Override diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/AbstractAttrPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/AbstractAttrPane.java index 82d6484e29..ea888a0b6f 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/AbstractAttrPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/AbstractAttrPane.java @@ -1,9 +1,9 @@ package com.fr.design.mainframe; +import com.fine.theme.utils.FineUIScale; import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; import com.fr.design.gui.iscrollbar.UIScrollBar; -import javax.swing.*; import java.awt.*; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; @@ -15,15 +15,12 @@ import java.awt.event.MouseWheelListener; * 几点:子类不需要写构造函数了,所有的组件都放在createContentPane()方法生成的pane里面,它不需要考虑border。 */ public abstract class AbstractAttrPane extends AbstractAttrNoScrollPane { - private static final int MAXVALUE = 100; - private static final int TITLE_HEIGHT = 50; - private static final int MOUSE_WHEEL_SPEED = 5; - private static final int CONTENTPANE_WIDTH_GAP = 4; - private static final int SCROLLBAR_WIDTH = 8; - private int maxHeight = 280; - private int beginY = 0; + private static final int MAXVALUE = FineUIScale.scale(100); + private static final int TITLE_HEIGHT = FineUIScale.scale(50); + private static final int MOUSE_WHEEL_SPEED = 5; + private int maxHeight = FineUIScale.scale(280); - private UIScrollBar scrollBar; + private final UIScrollBar scrollBar; public AbstractAttrPane() { this.setLayout(new BarLayout()); @@ -98,21 +95,16 @@ public abstract class AbstractAttrPane extends AbstractAttrNoScrollPane { @Override public void layoutContainer(Container parent) { maxHeight = getMaxHeight(); - if ((MAXVALUE - scrollBar.getVisibleAmount()) == 0) { - beginY = 0; - } else { + int beginY = 0; + if ((MAXVALUE - scrollBar.getVisibleAmount()) != 0) { int preferredHeight = leftContentPane.getPreferredSize().height; int value = scrollBar.getValue(); beginY = value * (preferredHeight - maxHeight) / (MAXVALUE - scrollBar.getVisibleAmount()); } int width = parent.getWidth(); int height = parent.getHeight(); - if (leftContentPane.getPreferredSize().height > maxHeight) { - leftContentPane.setBounds(0, -beginY, width - scrollBar.getWidth() - CONTENTPANE_WIDTH_GAP, height + beginY); - scrollBar.setBounds(width - scrollBar.getWidth() - 1, 0, scrollBar.getWidth(), height); - } else { - leftContentPane.setBounds(0, 0, width - SCROLLBAR_WIDTH - CONTENTPANE_WIDTH_GAP, height); - } + leftContentPane.setBounds(0, -beginY, width - scrollBar.getWidth(), height + beginY); + scrollBar.setBounds(width - scrollBar.getWidth() - 1, 0, scrollBar.getWidth(), height); leftContentPane.validate(); } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/CellElementEditPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/CellElementEditPane.java index 34c4ea8e18..bbf305d94f 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/CellElementEditPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/CellElementEditPane.java @@ -1,5 +1,7 @@ package com.fr.design.mainframe.cell; +import com.fine.swing.ui.layout.Layouts; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.ExtraDesignClassManager; import com.fr.design.dialog.BasicPane; import com.fr.design.fun.CellAttributeProvider; @@ -12,7 +14,6 @@ import com.fr.design.mainframe.cell.settingpane.CellExpandAttrPane; import com.fr.design.mainframe.cell.settingpane.CellOtherSetPane; import com.fr.design.mainframe.cell.settingpane.CellPresentPane; import com.fr.design.mainframe.cell.settingpane.CellStylePane; -import com.fr.design.mainframe.cell.settingpane.*; import com.fr.design.mainframe.theme.utils.DefaultThemedTemplateCellElementCase; import com.fr.design.utils.DesignUtils; import com.fr.design.utils.gui.AdjustWorkBookDefaultStyleUtils; @@ -23,14 +24,14 @@ import com.fr.report.cell.CellElement; import com.fr.report.cell.TemplateCellElement; import com.fr.report.elementcase.TemplateElementCase; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.CardLayout; -import java.awt.Dimension; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; + /** * the new 单元格属性表 !!!:只对当前选中的设置面板进行数据的populate和update操作 * @@ -38,8 +39,8 @@ import java.util.List; * @since 2012-5-8下午12:18:53 */ public class CellElementEditPane extends BasicPane { - private static final int LEFT_BORDER = -5; - private static final int RIGHT_BORDER = 5; + private static final int LEFT_BORDER = 10; + private static final int RIGHT_BORDER = 10; private List paneList; private TemplateCellElement cellelement; private ElementCasePane ePane; @@ -48,14 +49,12 @@ public class CellElementEditPane extends BasicPane { private boolean isEditing; private CardLayout card; private JPanel center; - private JPanel downTitle; private TitleChangeListener titleChangeListener = null; private CellAttributeProvider cellAttributeProvider = null; public CellElementEditPane() { - setLayout(new BorderLayout()); initPaneList(); String[] iconArray = new String[paneList.size()]; card = new CardLayout(); @@ -65,7 +64,6 @@ public class CellElementEditPane extends BasicPane { iconArray[i] = pane.getIconPath(); center.add(pane, pane.title4PopupWindow()); } - tabsHeaderIconPane = new UIHeadGroup(iconArray) { @Override public void tabChanged(int index) { @@ -76,22 +74,18 @@ public class CellElementEditPane extends BasicPane { } } }; - - downTitle = new JPanel(); - downTitle.setLayout(new BorderLayout()); - downTitle.add(tabsHeaderIconPane, BorderLayout.NORTH); - center.setBorder(BorderFactory.createEmptyBorder(0, LEFT_BORDER, 0, 0)); - downTitle.add(center, BorderLayout.CENTER); - - this.add(downTitle, BorderLayout.CENTER); - + this.setLayout(new BorderLayout()); + this.add(Layouts.column( + cell(tabsHeaderIconPane), + cell(center) + ).with(it -> it.setBorder(new ScaledEmptyBorder(0,LEFT_BORDER,0,RIGHT_BORDER))).getComponent()); } public void setSelectedIndex(String... id) { - String firstid = id[0]; + String firstId = id[0]; for (int i = 0; i < paneList.size(); i++) { - if (ComparatorUtils.equals(firstid, paneList.get(i).title4PopupWindow())) { + if (ComparatorUtils.equals(firstId, paneList.get(i).title4PopupWindow())) { tabsHeaderIconPane.setSelectedIndex(i); if (id.length == 2) { paneList.get(i).setSelectedByIds(1, id); @@ -178,13 +172,8 @@ public class CellElementEditPane extends BasicPane { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellElement_Property_Table"); } - @Override - public Dimension getPreferredSize() { - return new Dimension(240, 340); - } - private void initPaneList() { - paneList = new ArrayList(); + paneList = new ArrayList<>(); paneList.add(new CellExpandAttrPane()); paneList.add(new CellStylePane()); paneList.add(new CellPresentPane()); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellExpandAttrPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellExpandAttrPane.java index 9549a3a7e8..7cff6e11a3 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellExpandAttrPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellExpandAttrPane.java @@ -1,7 +1,8 @@ package com.fr.design.mainframe.cell.settingpane; +import com.fine.swing.ui.layout.Layouts; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.constants.LayoutConstants; -import com.fr.design.constants.UIConstants; import com.fr.design.expand.ExpandLeftFatherPane; import com.fr.design.expand.ExpandUpFatherPane; import com.fr.design.foldablepane.UIExpandablePane; @@ -9,8 +10,6 @@ import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.theme.utils.DefaultThemedTemplateCellElementCase; import com.fr.design.sort.cellexpand.CellExpandSortPane; import com.fr.general.ComparatorUtils; @@ -21,18 +20,21 @@ import com.fr.report.elementcase.TemplateElementCase; import com.fr.stable.Constants; import javax.swing.Icon; +import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingConstants; +import javax.swing.UIManager; import java.awt.BorderLayout; -import java.awt.Component; import java.awt.Rectangle; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.fix; + /** * 单元格扩展属性面板,是属性表面板的一个种类 */ public class CellExpandAttrPane extends AbstractCellAttrPane { - private static final int SENIOR_HORIZONTAL_GAP = 12; - private static final int BASIC_HORIZONTAL_GAP = 20; private UIButtonGroup expandDirectionButton; private ExpandLeftFatherPane leftFatherPane; private ExpandUpFatherPane rightFatherPane; @@ -66,6 +68,13 @@ public class CellExpandAttrPane extends AbstractCellAttrPane { return layoutPane(); } + protected void initContentPane() { + leftContentPane = createContentPane(); + if (leftContentPane != null) { + this.add(leftContentPane, BorderLayout.CENTER); + } + } + private void initAllNames() { expandDirectionButton.setGlobalName(Toolkit.i18nText("Fine-Design_Report_ExpandD_Expand_Direction")); leftFatherPane.setGlobalName(Toolkit.i18nText("Fine-Design_Report_LeftParent")); @@ -75,19 +84,19 @@ public class CellExpandAttrPane extends AbstractCellAttrPane { } private JPanel layoutPane() { - layoutPane = new JPanel(new BorderLayout()); - basicPane = new JPanel(); - seniorPane = new JPanel(); basicPane = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Basic"), 223, 24, basicPane()); seniorPane = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 223, 24, seniorPane()); JPanel sortUIExpandablePane = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Expend_Sort"), 223, 24, cellExpandSortPane = new CellExpandSortPane(this)); - layoutPane.add(basicPane, BorderLayout.NORTH); - layoutPane.add(seniorPane, BorderLayout.CENTER); - layoutPane.add(sortUIExpandablePane, BorderLayout.SOUTH); + layoutPane = Layouts.column( + cell(basicPane), + fix(1).with(it -> it.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIManager.getColor("defaultBorderColor")))), + cell(seniorPane), + fix(1).with(it -> it.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIManager.getColor("defaultBorderColor")))), + cell(sortUIExpandablePane) + ).getComponent(); extraPane = CellExpandExtraAttrPane.getInstance(); - JPanel content = new JPanel(new BorderLayout()); content.add(layoutPane, BorderLayout.NORTH); content.add(extraPane, BorderLayout.CENTER); @@ -95,43 +104,23 @@ public class CellExpandAttrPane extends AbstractCellAttrPane { } private JPanel basicPane() { - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; UILabel direction = new UILabel(Toolkit.i18nText("Fine-Design_Report_ExpandD_Expand_Direction"), SwingConstants.LEFT); - JPanel directionPane = new JPanel(new BorderLayout()); - directionPane.add(direction, BorderLayout.NORTH); UILabel left = new UILabel(Toolkit.i18nText("Fine-Design_Report_LeftParent"), SwingConstants.LEFT); - JPanel leftPane = new JPanel(new BorderLayout()); - leftPane.add(left, BorderLayout.NORTH); UILabel up = new UILabel(Toolkit.i18nText("Fine-Design_Report_ExpandD_Up_Father_Cell"), SwingConstants.LEFT); - JPanel upPane = new JPanel(new BorderLayout()); - upPane.add(up, BorderLayout.NORTH); - Component[][] components = new Component[][]{ - new Component[]{null, null}, - new Component[]{directionPane, expandDirectionButton}, - new Component[]{leftPane, leftFatherPane}, - new Component[]{upPane, rightFatherPane}, - }; - double[] rowSize = {p, p, p, p, p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}}; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, BASIC_HORIZONTAL_GAP, LayoutConstants.VGAP_LARGE); + return Layouts.column(LayoutConstants.VERTICAL_GAP, + row(cell(direction).weight(1.2), cell(expandDirectionButton).weight(3.0)), + row(cell(left).weight(1.2), cell(leftFatherPane).weight(3.0)), + row(cell(up).weight(1.2), cell(rightFatherPane).weight(3.0)) + ).with(it -> it.setBorder(new ScaledEmptyBorder(0, 0, 10, 0)) + ).getComponent(); } private JPanel seniorPane() { - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - horizontalExpandableCheckBox.setBorder(UIConstants.CELL_ATTR_ZEROBORDER); - verticalExpandableCheckBox.setBorder(UIConstants.CELL_ATTR_ZEROBORDER); - Component[][] components = new Component[][]{ - new Component[]{null, null}, - new Component[]{horizontalExpandableCheckBox, null}, - new Component[]{verticalExpandableCheckBox, null}, - }; - double[] rowSize = {p, p, p, p, p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}}; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, SENIOR_HORIZONTAL_GAP, LayoutConstants.VGAP_LARGE); + return Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(horizontalExpandableCheckBox), + cell(verticalExpandableCheckBox) + ).with(it -> it.setBorder(new ScaledEmptyBorder(0, 0, 10, 0)) + ).getComponent(); } @@ -174,7 +163,6 @@ public class CellExpandAttrPane extends AbstractCellAttrPane { @Override public String getIconPath() { -// return "com/fr/design/images/expand/cellAttr.gif"; return Toolkit.i18nText("Fine-Design_Report_Expand"); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java index 3578a7d643..150b4d8512 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java @@ -1,14 +1,16 @@ package com.fr.design.mainframe.cell.settingpane; -import com.fine.theme.utils.FineUIScale; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.Style; import com.fr.design.constants.LayoutConstants; -import com.fr.design.constants.UIConstants; import com.fr.design.dialog.link.MessageWithLink; import com.fr.design.editor.ValueEditorPane; import com.fr.design.editor.ValueEditorPaneFactory; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.foldablepane.UIExpandablePane; +import com.fr.design.gui.core.ReactiveCardPane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.icheckbox.UICheckBox; @@ -17,10 +19,6 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.layout.VerticalFlowLayout; import com.fr.design.locale.impl.DataMaskMark; import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.mainframe.JTemplate; @@ -46,19 +44,18 @@ import javax.swing.ButtonGroup; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.UIManager; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import java.awt.BorderLayout; -import java.awt.CardLayout; import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Insets; import java.awt.Rectangle; import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import java.util.ArrayList; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; + /** * @author zhou * @since 2012-5-11下午5:24:31 @@ -67,12 +64,7 @@ public class CellOtherSetPane extends AbstractCellAttrPane { private static final int HEAD_WDITH = 290; private static final int HEAD_HEIGTH = 24; - private static final int COMBO_WIDTH = 154; - private static final int BUTTON_GROUP_WIDTH = 140; - private static final double f = TableLayout.FILL; - private static final double p = TableLayout.PREFERRED; - // normal - private UIButtonGroup autoshrik; + private static final int DOWNLOAD_INDEX = 3; private UICheckBox previewCellContent; private UICheckBox printAndExportContent; @@ -81,22 +73,20 @@ public class CellOtherSetPane extends AbstractCellAttrPane { private UIComboBox showContent; //内容提示 + private ReactiveCardPane showContentPane; private UIButtonGroup tooltipButtonGroup; - private CardLayout tooltipLayout; - private JPanel tooltipPane; + private ReactiveCardPane tooltipPane; private UITextField tooltipTextField; + private UITextField fileNameTextField; //文本超出时隐藏 + private ReactiveCardPane overflowPane; private UICheckBox textOverflowCheckBox; private int curSelectedIndex; private UIComboBox showPartComboBox; - private CardLayout showPartLayout; - private JPanel showPartPane; private UISpinner showCharNums; private UIComboBox textOverflowTypeComboBox; - private UITextField fileNameTextField; - // 分页 private UICheckBox pageBeforeRowCheckBox; private UICheckBox pageAfterRowCheckBox; @@ -121,21 +111,22 @@ public class CellOtherSetPane extends AbstractCellAttrPane { // 插入行策略 private UIButtonGroup insertRowPolicyButtonGroup; private ValueEditorPane valueEditor; - private CardLayout insertRowLayout; - private JPanel insertRowPane; - private JPanel insertRowPolicyPane; - private JPanel defaultValuePane; + private ReactiveCardPane insertRowPolicyPane; + private UILabel insertRowPolicyLabel; - // 数据脱敏 - private UILabel scopeLabel; private UIRadioButton exportButton; private UIRadioButton previewAndExportButton; - private UIRadioButton[] desensitizationButtons; private CellDesensitizationGroupsPane groupsPane; private final int EXPORT_SCOPE = CellDesensitizationAttr.EXPORT_SCOPE; - private final int PREVIEW_AND_EXPORT_SCOPE = CellDesensitizationAttr.PREVIEW_AND_EXPORT_SCOPE; - private static final Color TIPS_FONT_COLOR = new Color(0x8f8f92); + private static Color TIPS_FONT_COLOR = FineUIUtils.getUIColor("Label.tipColor", "inactiveCaption"); + + protected void initContentPane() { + leftContentPane = createContentPane(); + if (leftContentPane != null) { + this.add(leftContentPane, BorderLayout.CENTER); + } + } /** * 初始化 @@ -143,18 +134,17 @@ public class CellOtherSetPane extends AbstractCellAttrPane { * @return 面板 */ public JPanel createContentPane() { - - Component[][] components = new Component[][]{ - new Component[]{new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Basic"), HEAD_WDITH, HEAD_HEIGTH, basicPane())}, - new Component[]{new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advaced"), HEAD_WDITH, HEAD_HEIGTH, seniorPane())}, - new Component[]{new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Pagination"), HEAD_WDITH, HEAD_HEIGTH, pagePane())}, - new Component[]{new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Desensitization"), HEAD_WDITH, HEAD_HEIGTH, desensitizePane())} - }; - - JPanel tableLayoutPane = TableLayoutHelper.createTableLayoutPane(components, new double[]{p, p, p, p}, new double[]{f}); - + JPanel pane = Layouts.column( + cell(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Basic"), HEAD_WDITH, HEAD_HEIGTH, basicPane())), + fix(1).with(it -> it.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIManager.getColor("defaultBorderColor")))), + cell(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advaced"), HEAD_WDITH, HEAD_HEIGTH, seniorPane())), + fix(1).with(it -> it.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIManager.getColor("defaultBorderColor")))), + cell(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Pagination"), HEAD_WDITH, HEAD_HEIGTH, pagePane())), + fix(1).with(it -> it.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIManager.getColor("defaultBorderColor")))), + cell(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Desensitization"), HEAD_WDITH, HEAD_HEIGTH, desensitizePane())) + ).getComponent(); initAllNames(); - return tableLayoutPane; + return pane; } private JPanel desensitizePane() { @@ -174,24 +164,22 @@ public class CellOtherSetPane extends AbstractCellAttrPane { ); groupsPane = new CellDesensitizationGroupsPane(this); - - JPanel contentPane = FRGUIPaneFactory.createVerticalFlowLayout_F_Pane(true, VerticalFlowLayout.TOP, 0, 10, true); - contentPane.add(scopePane); - contentPane.add(hyperlink); - contentPane.add(groupsPane); - - return contentPane; + return Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(scopePane), + cell(hyperlink), + cell(groupsPane) + ).getComponent(); } /** * 脱敏设置应用范围panel - * @return */ private JPanel initScopePane() { - scopeLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Desensitization_Scope")); + // 数据脱敏 + UILabel scopeLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Desensitization_Scope")); exportButton = new UIRadioButton(Toolkit.i18nText("Fine-Design_Report_Desensitization_Export")); previewAndExportButton = new UIRadioButton(Toolkit.i18nText("Fine-Design_Report_Desensitization_Preview_Export")); - desensitizationButtons = new UIRadioButton[]{ + UIRadioButton[] desensitizationButtons = new UIRadioButton[]{ exportButton, previewAndExportButton }; @@ -199,13 +187,9 @@ public class CellOtherSetPane extends AbstractCellAttrPane { for (UIRadioButton radioButton : desensitizationButtons) { buttonGroup.add(radioButton); } - - JPanel head = new JPanel(); - head.setLayout(new BorderLayout()); - head.add(scopeLabel, BorderLayout.NORTH); - head.add(exportButton, BorderLayout.CENTER); - head.add(previewAndExportButton, BorderLayout.SOUTH); - return head; + return row( + cell(scopeLabel).weight(1.2), cell(exportButton).weight(1.2), cell(previewAndExportButton).weight(1.8) + ).getComponent(); } private JPanel basicPane() { @@ -216,228 +200,211 @@ public class CellOtherSetPane extends AbstractCellAttrPane { adjustRadioButtons = new UIRadioButton[]{ defaultAutoRadioButton, noAutoRadioButton, autoHeightRadioButton, autoWidthRadioButton }; - // 指定分组 ButtonGroup autoBG = new ButtonGroup(); for (UIRadioButton radioButton : adjustRadioButtons) { autoBG.add(radioButton); } - - JPanel basicPane = new JPanel() { - @Override - public Insets getInsets() { - return new Insets(LayoutConstants.VGAP_MEDIUM, 0, LayoutConstants.VGAP_MEDIUM, 0); - } - }; - VerticalFlowLayout verticalFlowLayout = new VerticalFlowLayout(VerticalFlowLayout.CENTER, 0, 0); - verticalFlowLayout.setAlignLeft(true); - basicPane.setLayout(verticalFlowLayout); - basicPane.add(defaultAutoRadioButton); - basicPane.add(noAutoRadioButton); - basicPane.add(autoHeightRadioButton); - basicPane.add(autoWidthRadioButton); - - return basicPane; + return Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(defaultAutoRadioButton), + cell(noAutoRadioButton), + cell(autoHeightRadioButton), + cell(autoWidthRadioButton) + ).with(it -> it.setBorder(new ScaledEmptyBorder(0, 0, LayoutConstants.VERTICAL_GAP, 0)) + ).getComponent(); } private JPanel seniorPane() { initInsertRowPolicyPane(); - JPanel seniorPane = new JPanel(new BorderLayout()); - seniorPane.add(seniorUpPane(), BorderLayout.NORTH); - seniorPane.add(insertRowPolicyPane, BorderLayout.CENTER); - insertRowPolicyPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); - return seniorPane; + return Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(seniorUpPane()), + cell(insertRowPolicyPane) + ).with(it -> it.setBorder(new ScaledEmptyBorder(0, 0, LayoutConstants.VERTICAL_GAP, 0)) + ).getComponent(); } private void initInsertRowPolicyPane() { // 插入行策略 - insertRowPolicyButtonGroup = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_InsertRow_NULL"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Estate_Default_Text"), + insertRowPolicyButtonGroup = new UIButtonGroup(new String[]{ + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_InsertRow_NULL"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Estate_Default_Text"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_InsertRow_COPY")}); - defaultValuePane = new JPanel(new BorderLayout(4, 0)); valueEditor = ValueEditorPaneFactory.createBasicValueEditorPane(); - defaultValuePane.add(valueEditor, BorderLayout.CENTER); - insertRowLayout = new CardLayout(); - insertRowPane = new JPanel(insertRowLayout); - insertRowPane.add(new JPanel(), "none"); - insertRowPane.add(defaultValuePane, "content"); - insertRowPane.setPreferredSize(new Dimension(0, 0)); - insertRowPolicyButtonGroup.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - if (insertRowPolicyButtonGroup.getSelectedIndex() == 1) { - insertRowPane.setPreferredSize(new Dimension(100, FineUIScale.scale(UIManager.getInt("CellOtherSetPane.height")))); - insertRowLayout.show(insertRowPane, "content"); - } else { - insertRowLayout.show(insertRowPane, "none"); - insertRowPane.setPreferredSize(new Dimension(0, 0)); - } - } - }); - - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - UILabel insertRowPolicyLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_InsertRow_Policy", SwingConstants.LEFT)); + insertRowPolicyLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_InsertRow_Policy", SwingConstants.LEFT)); UIComponentUtils.setLineWrap(insertRowPolicyLabel); - // 如果右侧需要很宽的空间,就用3行1列的布局 - if (insertRowPolicyButtonGroup.getPreferredSize().getWidth() > BUTTON_GROUP_WIDTH) { - double[] rowSize = {p, p, p}; - double[] columnSize = {f}; - - Component[][] components = new Component[][]{ - new Component[]{insertRowPolicyLabel}, - new Component[]{insertRowPolicyButtonGroup}, - new Component[]{insertRowPane}, - }; - insertRowPolicyPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, LayoutConstants.VGAP_LARGE, LayoutConstants.VGAP_MEDIUM); - } else { - double[] rowSize = {p, p}; - double[] columnSize = {f, BUTTON_GROUP_WIDTH}; - Component[][] components = new Component[][]{ - new Component[]{insertRowPolicyLabel, insertRowPolicyButtonGroup}, - new Component[]{null, insertRowPane}, - }; - insertRowPolicyPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, LayoutConstants.VGAP_LARGE, LayoutConstants.VGAP_MEDIUM); - } + insertRowPolicyPane = ReactiveCardPane.create() + .addSupplier("empty", () -> Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(insertRowPolicyLabel).weight(1.2), + cell(insertRowPolicyButtonGroup).weight(3) + ) + ).getComponent()) + .addSupplier("default", () -> Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(insertRowPolicyLabel).weight(1.2), + cell(insertRowPolicyButtonGroup).weight(3) + ), + row( + flex(1.2), + cell(valueEditor).weight(3) + ) + ).getComponent() + ); + insertRowPolicyPane.select("empty").populate(); + + insertRowPolicyButtonGroup.addChangeListener(e -> { + String key = insertRowPolicyButtonGroup.getSelectedIndex() == 1 ? "default" : "empty"; + insertRowPolicyPane.select(key).populate(); + }); } private JPanel seniorUpPane() { - JPanel pane = new JPanel(new BorderLayout()); - // TODO: 方法之间的耦合还比较严重。现在必须先执行 createShowContentPane,再执行 createSeniorCheckPane。否则出现 npe。 - pane.add(createTextOverflowPane(), BorderLayout.SOUTH); - pane.add(createShowContentPane(), BorderLayout.CENTER); - pane.add(createSeniorCheckPane(), BorderLayout.NORTH); - return pane; + initTextOverflowPane(); + initShowContentPane(); + return Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(createSeniorCheckPane()), + cell(showContentPane), + cell(overflowPane) + ).getComponent(); } - private JPanel createShowContentPane() { - double[] rowSize = {p, p, p, p}; - double[] colSize = {f, COMBO_WIDTH}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}}; - - JPanel fileNamePane = createNormal(); - fileNamePane.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0)); + private void initShowContentPane() { + showContent = new UIComboBox(new String[]{ + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_Show_As_Image"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_Show_As_HTML"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_As_Download")}); + UILabel downloadLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_File_Name_For_Download")); + fileNameTextField = new UITextField(); UILabel showContentLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Content"), SwingConstants.LEFT); UIComponentUtils.setLineWrap(showContentLabel); - UILabel toolTipLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_ToolTip")); - tooltipLayout = new CardLayout(); - tooltipPane = new JPanel(tooltipLayout); - tooltipPane.add(new JPanel(), "none"); - tooltipPane.add(tooltipTextField, "content"); - tooltipPane.setPreferredSize(new Dimension(0, 0)); - tooltipButtonGroup = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Report_CellWrite_ToolTip_Custom"), Toolkit.i18nText("Fine-Design_Report_CellWrite_ToolTip_CellValue")}); - tooltipButtonGroup.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - if (tooltipButtonGroup.getSelectedIndex() == 0) { - tooltipPane.setPreferredSize(new Dimension(154, FineUIScale.scale(UIManager.getInt("CellOtherSetPane.height")))); - tooltipLayout.show(tooltipPane, "content"); + initTooltipPane(); + showContentPane = ReactiveCardPane.create() + .addSupplier("default", () -> column(LayoutConstants.VERTICAL_GAP, + row( + cell(showContentLabel).weight(1.2), cell(showContent).weight(3.0) + ), + cell(tooltipPane) + ).getComponent()) + .addSupplier("download", () -> column(LayoutConstants.VERTICAL_GAP, + row( + cell(showContentLabel).weight(1.2), cell(showContent).weight(3.0) + ), + row( + cell(downloadLabel).weight(1.2), cell(fileNameTextField).weight(3.0) + ), + cell(tooltipPane) + ).getComponent()); + showContentPane.select("default").populate(); + + showContent.addItemListener(e -> { + if (e.getStateChange() == ItemEvent.SELECTED) { + if (showContent.getSelectedIndex() == DOWNLOAD_INDEX) { + showContentPane.select("download").populate(); } else { - tooltipLayout.show(tooltipPane, "none"); - tooltipPane.setPreferredSize(new Dimension(0, 0)); + showContentPane.select("default").populate(); } + handleCellShowStyleChange(e); } }); + } - Component[][] components = new Component[][]{ - new Component[]{showContentLabel, UIComponentUtils.wrapWithBorderLayoutPane(showContent)}, - new Component[]{fileNamePane, null}, // 选择"用下载连接显示二进制内容"时,会显示这一行的面板 - new Component[]{toolTipLabel, tooltipButtonGroup}, // “自定义”or"单元格值" - new Component[]{null, tooltipPane} // 选择“自定义”时显示这一行 - }; - - JPanel showContentPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, colSize, rowCount, LayoutConstants.VGAP_LARGE, LayoutConstants.VGAP_MEDIUM); - showContentPane.setBorder(BorderFactory.createEmptyBorder(6, 0, 6, 0)); - - return showContentPane; + private void initTooltipPane() { + UILabel toolTipLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_ToolTip")); + tooltipButtonGroup = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Report_CellWrite_ToolTip_Custom"), + Toolkit.i18nText("Fine-Design_Report_CellWrite_ToolTip_CellValue")}); + tooltipTextField = new UITextField(); + tooltipPane = ReactiveCardPane.create() + .addSupplier("define", () -> column(LayoutConstants.VERTICAL_GAP, + row( + cell(toolTipLabel).weight(1.2), cell(tooltipButtonGroup).weight(3.0) + ), + row( + flex(1.2), cell(tooltipTextField).weight(3.0) + ) + ).getComponent()) + .addSupplier("cellValue", () -> column(LayoutConstants.VERTICAL_GAP, + row( + cell(toolTipLabel).weight(1.2), cell(tooltipButtonGroup).weight(3.0) + ) + ).getComponent()); + tooltipPane.select("define").populate(); + + tooltipButtonGroup.addChangeListener(e -> { + if (tooltipButtonGroup.getSelectedIndex() == 0) { + tooltipPane.select("define").populate(); + } else { + tooltipPane.select("cellValue").populate(); + } + }); } - private JPanel createTextOverflowPane() { - showPartLayout = new CardLayout(); - showPartPane = new JPanel(showPartLayout); + private void initTextOverflowPane() { showCharNums = new UISpinner(0, Integer.MAX_VALUE, 1, 10); - JPanel showPartNumPane = new JPanel(new BorderLayout(4, 0)); - showPartNumPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Report_CellWrite_TextOverflow_Nums")), BorderLayout.WEST); - showPartNumPane.add(showCharNums, BorderLayout.CENTER); - showPartPane.add(new JPanel(), "none"); - showPartPane.add(showPartNumPane, "content"); + UILabel numberLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_CellWrite_TextOverflow_Nums")); showPartComboBox = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Report_CellWrite_TextOverflow_CharNum"), Toolkit.i18nText("Fine-Design_Report_CellWrite_TextOverflow_CellWidth")}); - showPartComboBox.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { + textOverflowTypeComboBox = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Report_CellWrite_TextOverflow_Ellipsis"), Toolkit.i18nText("Fine-Design_Report_CellWrite_TextOverflow_NoneSymbol")}); + UILabel showPartLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_CellWrite_TextOverflow_ShowPart")); + UILabel hideTypeLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_CellWrite_TextOverflow_HideType")); + textOverflowCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_CellWrite_TextOverflow_HideWhenOverflow")); + + overflowPane = ReactiveCardPane.create() + .addSupplier("empty", () -> column(LayoutConstants.VERTICAL_GAP, + cell(textOverflowCheckBox) + ).getComponent()) + .addSupplier("showChar", () -> column(LayoutConstants.VERTICAL_GAP, + cell(textOverflowCheckBox), + row(cell(showPartLabel).weight(1.2), cell(showPartComboBox).weight(1.6), flex(0.1), cell(numberLabel).weight(0.5), cell(showCharNums).weight(0.8)), + row(cell(hideTypeLabel).weight(1.2), cell(textOverflowTypeComboBox).weight(3.0)) + ).getComponent()) + .addSupplier("showCell", () -> column(LayoutConstants.VERTICAL_GAP, + cell(textOverflowCheckBox), + row(cell(showPartLabel).weight(1.2), cell(showPartComboBox).weight(3.0)), + row(cell(hideTypeLabel).weight(1.2), cell(textOverflowTypeComboBox).weight(3.0)) + ).getComponent()); + overflowPane.select("empty").populate(); + showPartComboBox.addItemListener(e -> { + if (showPartComboBox.getSelectedIndex() == 0) { + overflowPane.select("showChar").populate(); + } else { + overflowPane.select("showCell").populate(); + } + }); + textOverflowCheckBox.addItemListener(e -> { + if (e.getStateChange() == ItemEvent.SELECTED) { if (showPartComboBox.getSelectedIndex() == 0) { - showPartPane.setPreferredSize(new Dimension(70, FineUIScale.scale(UIManager.getInt("CellOtherSetPane.height")))); - showPartLayout.show(showPartPane, "content"); + overflowPane.select("showChar").populate(); } else { - showPartLayout.show(showPartPane, "none"); - showPartPane.setPreferredSize(new Dimension(0, 0)); + overflowPane.select("showCell").populate(); } - } - }); - - textOverflowTypeComboBox = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Report_CellWrite_TextOverflow_Ellipsis"), Toolkit.i18nText("Fine-Design_Report_CellWrite_TextOverflow_NoneSymbol")}); - UILabel showPartLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_CellWrite_TextOverflow_ShowPart") + ":"); - UILabel hideTypeLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_CellWrite_TextOverflow_HideType") + ":"); - Component[][] textOverflowComponents = new Component[][]{ - new Component[]{showPartLabel, showPartComboBox, showPartPane}, - new Component[]{hideTypeLabel, textOverflowTypeComboBox, null} - }; - JPanel textOverflowComPane = TableLayoutHelper.createTableLayoutPane(textOverflowComponents, new double[]{p, p}, new double[]{p, f, p}); - textOverflowComPane.setVisible(false); - textOverflowCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_CellWrite_TextOverflow_HideWhenOverflow")); - textOverflowCheckBox.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - textOverflowComPane.setVisible(e.getStateChange() == ItemEvent.SELECTED); - if (e.getStateChange() == ItemEvent.SELECTED) { - if (showPartComboBox.getSelectedIndex() == 0) { - showPartPane.setPreferredSize(new Dimension(70, FineUIScale.scale(UIManager.getInt("CellOtherSetPane.height")))); - showPartLayout.show(showPartPane, "content"); - } else { - showPartLayout.show(showPartPane, "none"); - showPartPane.setPreferredSize(new Dimension(0, 0)); - } - // 记录目前自动调整哪个被选中 - for (int i = 0; i < adjustRadioButtons.length; i++) { - if (adjustRadioButtons[i].isSelected()) { - curSelectedIndex = i; - break; - } + // 记录目前自动调整哪个被选中 + for (int i = 0; i < adjustRadioButtons.length; i++) { + if (adjustRadioButtons[i].isSelected()) { + curSelectedIndex = i; + break; } - noAutoRadioButton.setSelected(true); - } else { - adjustRadioButtons[curSelectedIndex].setSelected(true); } + noAutoRadioButton.setSelected(true); + } else { + overflowPane.select("empty").populate(); + adjustRadioButtons[curSelectedIndex].setSelected(true); } }); - JPanel dynamicPaneWrapper = FRGUIPaneFactory.createBorderLayout_S_Pane(); - dynamicPaneWrapper.add(textOverflowComPane); - JPanel textOverflowPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - textOverflowPane.add(textOverflowCheckBox, BorderLayout.NORTH); - textOverflowPane.add(dynamicPaneWrapper, BorderLayout.CENTER); - textOverflowPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); - return textOverflowPane; } private JPanel createSeniorCheckPane() { - previewCellContent.setBorder(UIConstants.CELL_ATTR_ZEROBORDER); - printAndExportContent.setBorder(UIConstants.CELL_ATTR_ZEROBORDER); - printAndExportBackground.setBorder(UIConstants.CELL_ATTR_ZEROBORDER); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}}; - Component[][] components = new Component[][]{ - new Component[]{null, null}, - new Component[]{previewCellContent, null}, - new Component[]{printAndExportContent, null}, - new Component[]{printAndExportBackground, null}, - }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_MEDIUM, LayoutConstants.VGAP_LARGE); + previewCellContent = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_Preview_Cell_Content")); + printAndExportContent = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_Print_Content")); + printAndExportBackground = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_Print_Background")); + return Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(previewCellContent), + cell(printAndExportContent), + cell(printAndExportBackground) + ).getComponent(); } private JPanel pagePane() { @@ -451,73 +418,31 @@ public class CellOtherSetPane extends AbstractCellAttrPane { canBreakOnPaginateCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_CellPage_Can_Break_On_Paginate")); repeatCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_CellPage_Repeat_Content_When_Paging")); pageFixedRowDataCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_CellWrite_Page_Fixed_Row_Cell")); - currentPageFixedRowDataTipLabel = new UILabel(" (" + Toolkit.i18nText("Fine-Design_Report_CellWrite_No_Page_Fixed_Row_Cell") +")"); - - pageBeforeRowCheckBox.setBorder(UIConstants.CELL_ATTR_ZEROBORDER); - pageAfterRowCheckBox.setBorder(UIConstants.CELL_ATTR_ZEROBORDER); - pageBeforeColumnCheckBox.setBorder(UIConstants.CELL_ATTR_ZEROBORDER); - pageAfterColumnCheckBox.setBorder(UIConstants.CELL_ATTR_ZEROBORDER); - canBreakOnPaginateCheckBox.setBorder(UIConstants.CELL_ATTR_ZEROBORDER); - repeatCheckBox.setBorder(UIConstants.CELL_ATTR_ZEROBORDER); - pageFixedRowDataCheckBox.setBorder(UIConstants.CELL_ATTR_ZEROBORDER); - currentPageFixedRowDataTipLabel.setBorder(UIConstants.CELL_ATTR_ZEROBORDER); - currentPageFixedRowDataTipLabel.setForeground(TIPS_FONT_COLOR); - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p, p, p, p, p, p, p, p, p}; - double[] columnSize = {p}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; - Component[][] components = new Component[][]{ - new Component[]{null}, - new Component[]{pageBeforeRowCheckBox}, - new Component[]{pageAfterRowCheckBox}, - new Component[]{null}, - new Component[]{pageBeforeColumnCheckBox}, - new Component[]{pageAfterColumnCheckBox}, - new Component[]{null}, - new Component[]{canBreakOnPaginateCheckBox}, - new Component[]{repeatCheckBox}, - new Component[]{null}, - new Component[]{pageFixedRowDataCheckBox}, - new Component[]{currentPageFixedRowDataTipLabel} - }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_MEDIUM, LayoutConstants.VGAP_LARGE); + currentPageFixedRowDataTipLabel = new UILabel(" (" + Toolkit.i18nText("Fine-Design_Report_CellWrite_No_Page_Fixed_Row_Cell") +")", SwingConstants.LEFT); - } + currentPageFixedRowDataTipLabel.setForeground(TIPS_FONT_COLOR); + return Layouts.column( + cell(pageBeforeRowCheckBox), + fix(LayoutConstants.VERTICAL_GAP), + cell(pageAfterRowCheckBox), + fix(LayoutConstants.VGAP_SMALL + LayoutConstants.VERTICAL_GAP), + + cell(pageBeforeColumnCheckBox), + fix(LayoutConstants.VERTICAL_GAP), + cell(pageAfterColumnCheckBox), + fix(LayoutConstants.VGAP_SMALL + LayoutConstants.VERTICAL_GAP), + + cell(canBreakOnPaginateCheckBox), + fix(LayoutConstants.VERTICAL_GAP), + cell(repeatCheckBox), + fix(LayoutConstants.VGAP_SMALL + LayoutConstants.VERTICAL_GAP), + + cell(pageFixedRowDataCheckBox), + fix(LayoutConstants.VERTICAL_GAP), + cell(currentPageFixedRowDataTipLabel) + ).with(it -> it.setBorder(new ScaledEmptyBorder(0, 0, LayoutConstants.VERTICAL_GAP, 0)) + ).getComponent(); - private JPanel createNormal() { - previewCellContent = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_Preview_Cell_Content")); - printAndExportContent = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_Print_Content")); - printAndExportBackground = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_Print_Background")); - showContent = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_Show_As_Image"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CellWrite_Show_As_HTML"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_As_Download")}); - final CardLayout fileNameLayout = new CardLayout(); - final JPanel fileNamePane = new JPanel(fileNameLayout); - JPanel fileNameCCPane = new JPanel(new BorderLayout(4, 0)); - fileNameCCPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_File_Name_For_Download")), BorderLayout.WEST); - fileNameTextField = new UITextField(); - tooltipTextField = new UITextField(); - tooltipTextField.getUI(); - fileNamePane.add(new JPanel(), "none"); - fileNamePane.add(fileNameCCPane, "content"); - fileNamePane.setPreferredSize(new Dimension(0, 0)); - fileNameCCPane.add(fileNameTextField, BorderLayout.CENTER); - showContent.addItemListener(new ItemListener() { - - @Override - public void itemStateChanged(ItemEvent e) { - if (e.getStateChange() == ItemEvent.SELECTED) { - if (showContent.getSelectedIndex() == 3) { - fileNamePane.setPreferredSize(new Dimension(100, FineUIScale.scale(UIManager.getInt("CellOtherSetPane.height")))); - fileNameLayout.show(fileNamePane, "content"); - } else { - fileNameLayout.show(fileNamePane, "none"); - fileNamePane.setPreferredSize(new Dimension(0, 0)); - } - handleCellShowStyleChange(e); - } - } - }); - return fileNamePane; } private void handleCellShowStyleChange(ItemEvent itemEvent) { @@ -567,7 +492,6 @@ public class CellOtherSetPane extends AbstractCellAttrPane { @Override public String getIconPath() { -// return "com/fr/design/images/m_format/cellstyle/otherset.png"; return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Other"); } @@ -632,11 +556,9 @@ public class CellOtherSetPane extends AbstractCellAttrPane { tooltipButtonGroup.setSelectedIndex(1); } if (tooltipButtonGroup.getSelectedIndex() == 0) { - tooltipPane.setPreferredSize(new Dimension(100, FineUIScale.scale(UIManager.getInt("CellOtherSetPane.height")))); - tooltipLayout.show(tooltipPane, "content"); + tooltipPane.select("define").populate(); } else { - tooltipLayout.show(tooltipPane, "none"); - tooltipPane.setPreferredSize(new Dimension(0, 0)); + tooltipPane.select("cellValue").populate(); } tooltipPane.setVisible(true); if (cellGUIAttr.isHideTextWhenOverflow()) { @@ -647,7 +569,6 @@ public class CellOtherSetPane extends AbstractCellAttrPane { } else { showPartComboBox.setSelectedIndex(1); } - showPartPane.setVisible(true); if (cellGUIAttr.isTextOverflowEllipsis()) { textOverflowTypeComboBox.setSelectedItem(Toolkit.i18nText("Fine-Design_Report_CellWrite_TextOverflow_Ellipsis")); } else { @@ -684,19 +605,13 @@ public class CellOtherSetPane extends AbstractCellAttrPane { insertRowPolicyButtonGroup.setSelectedIndex(0); this.valueEditor.populate(StringUtils.EMPTY); } - if (insertRowPolicyButtonGroup.getSelectedIndex() == 1) { - insertRowPane.setPreferredSize(new Dimension(100, FineUIScale.scale(UIManager.getInt("CellOtherSetPane.height")))); - insertRowLayout.show(insertRowPane, "content"); - } else { - insertRowLayout.show(insertRowPane, "none"); - insertRowPane.setPreferredSize(new Dimension(0, 0)); - } + String key = insertRowPolicyButtonGroup.getSelectedIndex() == 1 ? "default" : "empty"; + insertRowPolicyPane.select(key).populate(); insertRowPolicyPane.setVisible(true); JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); if (!jTemplate.isJWorkBook()) { //表单中报表块编辑屏蔽掉 插入行策略 - insertRowPolicyPane.setVisible(false); + insertRowPolicyPane.select("empty").populate(); } - populateDesensitizationBean(cellElement); } @@ -816,7 +731,8 @@ public class CellOtherSetPane extends AbstractCellAttrPane { if (cellDesensitizationAttr == null) { cellDesensitizationAttr = new CellDesensitizationAttr(); } - cellDesensitizationAttr.setScope(exportButton.isSelected() ? EXPORT_SCOPE : PREVIEW_AND_EXPORT_SCOPE); + int previewAndExportScope = CellDesensitizationAttr.PREVIEW_AND_EXPORT_SCOPE; + cellDesensitizationAttr.setScope(exportButton.isSelected() ? EXPORT_SCOPE : previewAndExportScope); cellDesensitizationAttr.setDesensitizationBeans(new ArrayList<>(groupsPane.update())); cellElement.addCellAttr(cellDesensitizationAttr); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/CellDesensitizationGroupsPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/CellDesensitizationGroupsPane.java index de4e046b84..cf9617f2fc 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/CellDesensitizationGroupsPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/CellDesensitizationGroupsPane.java @@ -1,15 +1,14 @@ package com.fr.design.mainframe.cell.settingpane.desensitization; -import com.fr.design.constants.UIConstants; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itableeditorpane.UITableEditAction; import com.fr.design.gui.itableeditorpane.UITableEditorPane; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.layout.VerticalFlowLayout; import com.fr.design.mainframe.cell.settingpane.AbstractCellAttrPane; import com.fr.design.mainframe.cell.settingpane.desensitization.model.CellDesensitizationTableModel; import com.fr.report.cell.desensitization.CellDesensitizationBean; @@ -17,11 +16,11 @@ import com.fr.report.cell.desensitization.CellDesensitizationBean; import javax.swing.JPanel; import javax.swing.JTable; import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; import java.util.List; import java.util.Objects; +import static com.fine.swing.ui.layout.Layouts.cell; + /** * 数据脱敏规则设置面板 * @@ -40,18 +39,17 @@ public class CellDesensitizationGroupsPane extends JPanel { public CellDesensitizationGroupsPane(AbstractCellAttrPane pane) { model = new CellDesensitizationTableModel(pane, this); - initComponent(); } private void initComponent() { - this.setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 0, 10, true)); - + this.setLayout(new BorderLayout()); addRulePane = initAddPane(model); editorPane = initEditorPane(model); - - this.add(addRulePane); - this.add(editorPane); + this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(addRulePane), + cell(editorPane) + ).weight(1.0).getComponent()); } /** @@ -63,17 +61,10 @@ public class CellDesensitizationGroupsPane extends JPanel { private JPanel initAddPane(CellDesensitizationTableModel model) { UIButton addButton = new UIButton(model.getAction()); UILabel addLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Desensitization_Setting")); - - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, f}; - double[] rowSize = {p, p}; - - Component[][] components = new Component[][]{ - new Component[]{addLabel, addButton} - }; - - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 20, 0); + return Layouts.row( + cell(addLabel).weight(1.2), + cell(addButton).weight(3.0) + ).getComponent(); } /** @@ -89,14 +80,9 @@ public class CellDesensitizationGroupsPane extends JPanel { this.setLayout(FRGUIPaneFactory.createBorderLayout()); JTable editTable = getTableModel().createTable(); - editTable.getTableHeader().setBackground(UIConstants.DEFAULT_BG_RULER); setEditTable(editTable); - initbuttonPane(action); - getbuttonPane().setBackground(UIConstants.DEFAULT_BG_RULER); - JPanel controlPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - controlPane.setBackground(Color.WHITE); controlPane.add(getbuttonPane(), BorderLayout.WEST); JPanel pane = new JPanel(new BorderLayout(4, 4)); @@ -106,6 +92,7 @@ public class CellDesensitizationGroupsPane extends JPanel { this.add(pane, BorderLayout.CENTER); } }; + tableEditorPane.setBorder(new FineRoundBorder()); return tableEditorPane; } diff --git a/designer-realize/src/main/java/com/fr/design/present/BarCodePane.java b/designer-realize/src/main/java/com/fr/design/present/BarCodePane.java index b0df938db0..d5a76a23f7 100644 --- a/designer-realize/src/main/java/com/fr/design/present/BarCodePane.java +++ b/designer-realize/src/main/java/com/fr/design/present/BarCodePane.java @@ -1,10 +1,12 @@ package com.fr.design.present; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIScale; import com.fr.code.bar.core.BarcodeAttr; import com.fr.code.BarcodeImpl; import com.fr.code.bar.core.BarCodeUtils; import com.fr.design.beans.FurtherBasicBeanPane; -import com.fr.design.border.UIRoundedBorder; import com.fr.design.constants.LayoutConstants; import com.fr.design.constants.UIConstants; import com.fr.design.gui.icheckbox.UICheckBox; @@ -14,8 +16,6 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UINumberField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.report.cell.cellattr.BarcodePresent; @@ -38,6 +38,12 @@ import java.text.AttributedString; import java.util.HashMap; import java.util.Map; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.fix; + /** * @author zhou * @since 2012-6-4下午6:49:59 @@ -65,10 +71,8 @@ public class BarCodePane extends FurtherBasicBeanPane { barCodePreviewPane = new BarCodePreviewPane(); this.barWidthSpinner = new UISpinner(1,100.0,1.0,10.0); this.barHeightSpinner = new UISpinner(1,100.0,1.0,30); - this.barWidthSpinner.setPreferredSize(new Dimension(60, 20)); - this.barHeightSpinner.setPreferredSize(new Dimension(60, 20)); JPanel borderPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - TitledBorder titledBorder = new TitledBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, 5), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_StyleFormat_Sample"), 4, 2, this.getFont(), UIConstants.LINE_COLOR); + TitledBorder titledBorder = new TitledBorder(new FineRoundBorder(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_StyleFormat_Sample"), 4, 2, this.getFont(), UIConstants.LINE_COLOR); borderPane.setBorder(titledBorder); borderPane.add(barCodePreviewPane, BorderLayout.CENTER); setTypeComboBox(); @@ -82,21 +86,9 @@ public class BarCodePane extends FurtherBasicBeanPane { drawingTextCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bar_CodeD_Drawing_Text")); drawingTextCheckBox.setSelected(true); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, f}; - double[] rowSize = {p, p, p, p, p, p, p, p}; - int[][] rowCount = {{1, 1, 1}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}}; - barCodePreviewPane.setPreferredSize(new Dimension(0, 125)); - typeComboBox.setPreferredSize(new Dimension(155,20)); + drawingTextCheckBox.setBorder(null); + barCodePreviewPane.setPreferredSize(new Dimension(0, FineUIScale.scale(110))); final JPanel centerPane = new JPanel(new CardLayout()); - - Component[][] components = new Component[][]{ - new Component[]{typeSetLabel, typeComboBox}, - new Component[]{borderPane, null}, - new Component[]{centerPane, null} - }; - JPanel barCode = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_HUGER, LayoutConstants.VGAP_LARGE); centerPane.add(getNormalPane(), "normal"); centerPane.add(getSpecialPane(), "special"); typeComboBox.addItemListener(new ItemListener() { @@ -107,8 +99,15 @@ public class BarCodePane extends FurtherBasicBeanPane { repaintPreviewBarCode(); } }); + this.setLayout(new BorderLayout()); - this.add(barCode, BorderLayout.CENTER); + this.add(column(LayoutConstants.VERTICAL_GAP, + row( + cell(typeSetLabel).weight(1.2), cell(typeComboBox).weight(2.8) + ), + cell(borderPane), + cell(centerPane) + ).getComponent(), BorderLayout.CENTER); } private void setTypeComboBox() { @@ -135,51 +134,43 @@ public class BarCodePane extends FurtherBasicBeanPane { } private JPanel getNormalPane() { - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p, p, p, p, p}; - double[] columnSize = {p, f, f}; - int[][] rowCount = {{1, 1, 1}, {1, 1, 1}, {1, 1, 1}}; - JPanel barWidthContainer = new JPanel(new BorderLayout()); - barWidthContainer.add(barWidthSpinner); - JPanel barHeightContainer = new JPanel(new BorderLayout()); - barHeightContainer.add(barHeightSpinner); - UILabel uiLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tree_Width"), UILabel.RIGHT); - uiLabel.setPreferredSize(typeSetLabel.getPreferredSize()); - JPanel drawingTextCheckBoxPane = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - drawingTextCheckBox.setBorder(UIConstants.CELL_ATTR_ZEROBORDER); - drawingTextCheckBoxPane.add(drawingTextCheckBox); - Component[][] components_normal = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Barcode_Size"), UILabel.LEFT), barWidthContainer, barHeightContainer}, - new Component[]{null, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tree_Width"), UILabel.CENTER), new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tree_Height"), UILabel.CENTER)}, - new Component[]{drawingTextCheckBoxPane, null, null} - }; - - - JPanel normalPane = TableLayoutHelper.createGapTableLayoutPane(components_normal, rowSize, columnSize, rowCount, LayoutConstants.VGAP_LARGE, LayoutConstants.VGAP_LARGE); - return normalPane; + return Layouts.column( + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Barcode_Size"), UILabel.LEFT)).weight(1.2), + cell(barWidthSpinner).weight(1.4), + fix(4), + cell(barHeightSpinner).weight(1.4) + ), + fix(1), + row( + flex(1.2), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tree_Width"), UILabel.CENTER)).weight(1.4), + fix(4), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tree_Height"), UILabel.CENTER)).weight(1.4) + ), + fix(10), + row( + cell(drawingTextCheckBox) + ) + ).getComponent(); } private JPanel getSpecialPane() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, f}; - double[] rowSize = {p, p, p}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}}; - UILabel uiLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_RCode_Version"), UILabel.LEFT); - uiLabel.setPreferredSize(typeSetLabel.getPreferredSize()); - versionComboBox.setPreferredSize(new Dimension(155,20)); - errorCorrectComboBox.setPreferredSize(new Dimension(155,20)); - sizeSpinner.setPreferredSize(new Dimension(155,20)); - Component[][] components_special = new Component[][]{ - new Component[]{uiLabel, versionComboBox}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_RCode_Error_Correct"), UILabel.LEFT), errorCorrectComboBox}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_RCodeDrawPix"), UILabel.LEFT), sizeSpinner} - }; - - JPanel specialPane = TableLayoutHelper.createGapTableLayoutPane(components_special, rowSize, columnSize, rowCount, LayoutConstants.VGAP_HUGER, LayoutConstants.VGAP_LARGE); - return specialPane; + return Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_RCode_Version"), UILabel.LEFT)).weight(1.2), + cell(versionComboBox).weight(2.8) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_RCode_Error_Correct"), UILabel.LEFT)).weight(1.2), + cell(errorCorrectComboBox).weight(2.8) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_RCodeDrawPix"), UILabel.LEFT)).weight(1.2), + cell(sizeSpinner).weight(2.8) + ) + ).getComponent(); } private void addListener() { diff --git a/designer-realize/src/main/java/com/fr/design/present/CurrencyLinePane.java b/designer-realize/src/main/java/com/fr/design/present/CurrencyLinePane.java index 6a98189d9e..138929178f 100644 --- a/designer-realize/src/main/java/com/fr/design/present/CurrencyLinePane.java +++ b/designer-realize/src/main/java/com/fr/design/present/CurrencyLinePane.java @@ -1,16 +1,16 @@ package com.fr.design.present; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIScale; import com.fr.code.bar.BarcodeException; import com.fr.design.beans.FurtherBasicBeanPane; -import com.fr.design.border.UIRoundedBorder; import com.fr.design.constants.LayoutConstants; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.report.cell.cellattr.CurrencyLineAttr; @@ -25,27 +25,25 @@ import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.*; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + /** * @author zhou * @since 2012-6-4下午7:34:52 */ public class CurrencyLinePane extends FurtherBasicBeanPane { - private static final int VS_NUM = 4; - private static final int VG_NUM = 6; - private static final Dimension NORMAL_DIMENSION = new Dimension(155, 20); private UISpinner intPartSpinner; private UISpinner deciPartSpinner; private UITextField textField; - private CurrencyLinePreviewPane CurrencyLinePreviewPane; - private int intPart = 9; - private int deciPart = 3; + private CurrencyLinePreviewPane currencyLinePreviewPane; private static final int POSITION = 8; ChangeListener listener2 = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { - CurrencyLinePreviewPane.setObject(textField.getText(), update()); + currencyLinePreviewPane.setObject(textField.getText(), update()); } }; @@ -53,17 +51,17 @@ public class CurrencyLinePane extends FurtherBasicBeanPane DocumentListener listener = new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { - CurrencyLinePreviewPane.setObject(textField.getText(), update()); + currencyLinePreviewPane.setObject(textField.getText(), update()); } @Override public void removeUpdate(DocumentEvent e) { - CurrencyLinePreviewPane.setObject(textField.getText(), update()); + currencyLinePreviewPane.setObject(textField.getText(), update()); } @Override public void changedUpdate(DocumentEvent e) { - CurrencyLinePreviewPane.setObject(textField.getText(), update()); + currencyLinePreviewPane.setObject(textField.getText(), update()); } }; @@ -74,43 +72,36 @@ public class CurrencyLinePane extends FurtherBasicBeanPane protected void initComponents() { // 整数位选择 intPartSpinner = new UISpinner(1, 20, 1, 9); - intPartSpinner.setPreferredSize(NORMAL_DIMENSION); - // 小数位选择 deciPartSpinner = new UISpinner(1, 10, 1, 2); - deciPartSpinner.setPreferredSize(NORMAL_DIMENSION); // 预览区域 textField = new UITextField(10); - CurrencyLinePreviewPane = new CurrencyLinePreviewPane(); - CurrencyLinePreviewPane.setPreferredSize(new Dimension(0, 145)); + currencyLinePreviewPane = new CurrencyLinePreviewPane(); + currencyLinePreviewPane.setPreferredSize(new Dimension(0, FineUIScale.scale(145))); JPanel borderPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - TitledBorder titledBorder = new TitledBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, 5), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_StyleFormat_Sample"), 4, 2, this.getFont(), UIConstants.LINE_COLOR); + TitledBorder titledBorder = new TitledBorder(new FineRoundBorder(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_StyleFormat_Sample"), 4, 2, this.getFont(), UIConstants.LINE_COLOR); borderPane.setBorder(titledBorder); - borderPane.add(CurrencyLinePreviewPane, BorderLayout.CENTER); + borderPane.add(currencyLinePreviewPane, BorderLayout.CENTER); textField.requestFocus(); - double vs = VS_NUM; - double vg = VG_NUM; - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, f}; - double[] rowSize = {p, p, p, p}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}}; - - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Data"), UILabel.LEFT), textField}, - new Component[]{borderPane, null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_IntPart"), UILabel.LEFT), groupPane(intPartSpinner)}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Deci_Part"), UILabel.LEFT), groupPane(deciPartSpinner)} - - }; - - JPanel linePane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_HUGER, LayoutConstants.VGAP_LARGE); this.setLayout(new BorderLayout()); - this.add(linePane, BorderLayout.CENTER); - + this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Data"), UILabel.LEFT)).weight(1.2), + cell(textField).weight(3) + ), + cell(borderPane), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_IntPart"), UILabel.LEFT)).weight(1.2), + cell(intPartSpinner).weight(3) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Deci_Part"), UILabel.LEFT)).weight(1.2), + cell(deciPartSpinner).weight(3) + ) + ).getComponent(), BorderLayout.CENTER); textField.getDocument().addDocumentListener(listener); intPartSpinner.addChangeListener(listener2); @@ -141,14 +132,12 @@ public class CurrencyLinePane extends FurtherBasicBeanPane * */ public void setintPart(int intpart) { - this.intPart = intpart; } /** * */ public void setdeciPart(int decipart) { - this.deciPart = decipart; } private class CurrencyLinePreviewPane extends JPanel { @@ -156,7 +145,6 @@ public class CurrencyLinePane extends FurtherBasicBeanPane CurrencyLineAttr currencyLineAttr; public CurrencyLinePreviewPane() { -// setBackground(Color.WHITE); } public void setObject(String text, CurrencyLineAttr currencyLineAttr) { @@ -185,14 +173,6 @@ public class CurrencyLinePane extends FurtherBasicBeanPane } - protected static JPanel groupPane(JComponent comp) { - JPanel jp = new JPanel(); - jp.setBorder(null); - jp.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); - jp.add(comp); - return jp; - } - @Override /** * 是否为该类型 diff --git a/designer-realize/src/main/java/com/fr/design/sort/celldscolumn/CellDSColumnSortItemPane.java b/designer-realize/src/main/java/com/fr/design/sort/celldscolumn/CellDSColumnSortItemPane.java index 0c202fe0e2..a717c16408 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/celldscolumn/CellDSColumnSortItemPane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/celldscolumn/CellDSColumnSortItemPane.java @@ -2,7 +2,6 @@ package com.fr.design.sort.celldscolumn; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.sort.common.AbstractSortItemPane; -import com.fr.design.sort.common.AbstractSortPane; import com.fr.report.core.sort.sortexpression.SortExpression; import javax.swing.*; @@ -18,10 +17,9 @@ public class CellDSColumnSortItemPane extends AbstractSortItemPane { } @Override - public void initMainSortAreaPane(JPanel sortAreaPane) { + public Component getSortAreaComponent(JPanel sortAreaPane) { sortAreaUiComboBox = new UIComboBox(new String[0]); - sortAreaUiComboBox.setPreferredSize(new Dimension(sortItemPaneRightWidth, AbstractSortPane.PANE_COMPONENT_HEIGHT)); - sortAreaPane.add(sortAreaUiComboBox); + return sortAreaUiComboBox; } public void populateBean(SortExpression sortExpression) { diff --git a/designer-realize/src/main/java/com/fr/design/sort/cellexpand/CellExpandSortItemPane.java b/designer-realize/src/main/java/com/fr/design/sort/cellexpand/CellExpandSortItemPane.java index 4b14dc6929..18b0807753 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/cellexpand/CellExpandSortItemPane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/cellexpand/CellExpandSortItemPane.java @@ -1,12 +1,12 @@ package com.fr.design.sort.cellexpand; -import com.fr.design.sort.common.AbstractSortPane; import com.fr.design.sort.common.SortColumnRowPane; import com.fr.design.sort.common.AbstractSortItemPane; import com.fr.report.core.sort.sortexpression.SortExpression; import com.fr.stable.ColumnRow; import javax.swing.*; +import java.awt.Component; public class CellExpandSortItemPane extends AbstractSortItemPane { SortColumnRowPane columnRowPane; @@ -16,9 +16,9 @@ public class CellExpandSortItemPane extends AbstractSortItemPane { } @Override - public void initMainSortAreaPane(JPanel sortAreaPane) { - columnRowPane = new SortColumnRowPane(sortItemPaneRightWidth + 4, AbstractSortPane.PANE_COMPONENT_HEIGHT); - sortAreaPane.add(columnRowPane); + public Component getSortAreaComponent(JPanel sortAreaPane) { + columnRowPane = new SortColumnRowPane(); + return columnRowPane; } public void populateBean(SortExpression sortExpression) { diff --git a/designer-realize/src/main/java/com/fr/design/sort/common/AbstractSortGroupPane.java b/designer-realize/src/main/java/com/fr/design/sort/common/AbstractSortGroupPane.java index 8a90b960e0..0075d92b65 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/common/AbstractSortGroupPane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/common/AbstractSortGroupPane.java @@ -1,6 +1,7 @@ package com.fr.design.sort.common; -import com.fr.base.svg.IconUtils; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.icon.LazyIcon; import com.fr.design.event.ComponentChangeListener; import com.fr.design.event.ComponentChangeObserver; import com.fr.design.gui.ibutton.UIButton; @@ -15,6 +16,8 @@ import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; + public abstract class AbstractSortGroupPane extends JPanel implements ComponentChangeObserver { @@ -34,7 +37,6 @@ public abstract class AbstractSortGroupPane extends JPanel implements ComponentC public AbstractSortGroupPane(int sortGroupPaneWidth, int sortGroupPaneRightWidth) { this.sortGroupPaneRightWidth = sortGroupPaneRightWidth; this.sortGroupPaneWidth = sortGroupPaneWidth; - this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); initComponents(); } @@ -42,8 +44,11 @@ public abstract class AbstractSortGroupPane extends JPanel implements ComponentC addSortItemBar = new AddSortItemBar(this); sortItemListPane = new JPanel(); sortItemListPane.setLayout(new BoxLayout(sortItemListPane, BoxLayout.Y_AXIS)); - this.add(sortItemListPane); - this.add(addSortItemBar); + this.setLayout(new BorderLayout()); + this.add(Layouts.column( + cell(sortItemListPane), + cell(addSortItemBar) + ).getComponent(), BorderLayout.CENTER); } public void populateBean(List sortExpressions, String selfSortArea) { @@ -51,8 +56,8 @@ public abstract class AbstractSortGroupPane extends JPanel implements ComponentC this.selfSortArea = selfSortArea; this.sortExpressions = sortExpressions; this.sortUIExpandablePanes = new ArrayList<>(); - for (int i = 0; i < sortExpressions.size(); i++) { - addSortItem(sortExpressions.get(i)); + for (SortExpression sortExpression : sortExpressions) { + addSortItem(sortExpression); } refresh(); } @@ -153,19 +158,13 @@ public abstract class AbstractSortGroupPane extends JPanel implements ComponentC AddSortItemBar(AbstractSortGroupPane sortGroupPane) { init(); this.sortGroupPane = sortGroupPane; - this.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 5)); } void init() { - uiButton = new UIButton(Toolkit.i18nText("Fine-Design_Sort_Add_Second_Sort"), - IconUtils.readIcon("/com/fr/design/images/sort/add.png")); - uiButton.setPreferredSize(new Dimension(sortGroupPaneWidth - 4, AbstractSortPane.PANE_COMPONENT_HEIGHT)); + uiButton = new UIButton(Toolkit.i18nText("Fine-Design_Sort_Add_Second_Sort"),new LazyIcon("add")); + this.setLayout(new BorderLayout()); this.add(uiButton); - uiButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - sortGroupPane.addSortItem(null); - } - }); + uiButton.addActionListener(e -> sortGroupPane.addSortItem(null)); } } } diff --git a/designer-realize/src/main/java/com/fr/design/sort/common/AbstractSortItemPane.java b/designer-realize/src/main/java/com/fr/design/sort/common/AbstractSortItemPane.java index a5fec3f473..437f38fa7a 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/common/AbstractSortItemPane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/common/AbstractSortItemPane.java @@ -1,5 +1,9 @@ package com.fr.design.sort.common; +import com.fine.swing.ui.layout.Layouts; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.gui.core.ReactiveCardPane; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; @@ -14,11 +18,12 @@ import com.fr.stable.StringUtils; import javax.swing.*; import java.awt.*; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.cell; + public abstract class AbstractSortItemPane extends JPanel { protected int sortItemPaneWidth; protected int sortItemPaneRightWidth; @@ -29,13 +34,40 @@ public abstract class AbstractSortItemPane extends JPanel { UIComboBox sortBasisUiComboBox; JPanel sortAreaPane; JPanel sortRulePane; + SortExpressionPane formulaExpressionPane; + SortExpressionPane customExpressionPane; + ReactiveCardPane cardPane; public AbstractSortItemPane(int sortItemPaneWidth, int sortItemPaneRightWidth) { this.sortItemPaneWidth = sortItemPaneWidth; this.sortItemPaneRightWidth = sortItemPaneRightWidth; - this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); registerSortExpressionPanes(); initComponents(); + initLayouts(); + } + + private void initLayouts() { + cardPane = ReactiveCardPane.create() + .addSupplier("cell", () -> column(LayoutConstants.VERTICAL_GAP, + cell(sortAreaPane), + cell(sortBasisPanel), + cell(sortRulePane) + ).getComponent()) + .addSupplier("formula", () -> column(LayoutConstants.VERTICAL_GAP, + cell(sortBasisPanel), + cell(formulaExpressionPane), + cell(sortRulePane) + ).getComponent()) + .addSupplier("custom", () -> column(LayoutConstants.VERTICAL_GAP, + cell(sortAreaPane), + cell(sortBasisPanel), + cell(currentSortExpressionPane), + cell(sortRulePane) + ).getComponent()); + cardPane.select("cell").populate(); + cardPane.setBorder(new ScaledEmptyBorder(LayoutConstants.VERTICAL_GAP, 0, LayoutConstants.VERTICAL_GAP, 0)); + this.setLayout(new BorderLayout()); + this.add(cardPane, BorderLayout.CENTER); } private void initComponents() { @@ -46,54 +78,43 @@ public abstract class AbstractSortItemPane extends JPanel { private void registerSortExpressionPanes() { sortExpressionPanes.add(new CellSortExpressionPane(sortItemPaneRightWidth)); - sortExpressionPanes.add(new FormulaSortExpressionPane(sortItemPaneRightWidth)); - sortExpressionPanes.add(new CustomSequenceSortExpressionPane(sortItemPaneWidth, sortItemPaneRightWidth)); + sortExpressionPanes.add(formulaExpressionPane = new FormulaSortExpressionPane(sortItemPaneRightWidth)); + sortExpressionPanes.add(customExpressionPane = new CustomSequenceSortExpressionPane(sortItemPaneWidth, sortItemPaneRightWidth)); } void initSortAreaPane() { - sortAreaPane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, AbstractSortPane.PANE_COMPONENT_V_GAP)); - sortAreaPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Sort_Sort_Area"), SwingConstants.LEFT)); - sortAreaPane.add(AbstractSortPane.createIntervalUILabel()); - initMainSortAreaPane(sortAreaPane); - this.add(sortAreaPane); + sortAreaPane = new JPanel(new BorderLayout()); + Component component = getSortAreaComponent(sortAreaPane); + sortAreaPane.add(Layouts.row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Sort_Sort_Area"), SwingConstants.LEFT)).weight(1.2), + cell(component).weight(3) + ).getComponent()); } - public abstract void initMainSortAreaPane(JPanel sortAreaPane); + public abstract Component getSortAreaComponent(JPanel sortAreaPane); void initSortRulePane() { - sortRulePane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, AbstractSortPane.PANE_COMPONENT_V_GAP)); sortRuleUiComboBox = new UIComboBox(new String[]{SortRule.ASC.getDescription(), SortRule.DES.getDescription(), SortRule.NO_SORT.getDescription()}); sortRuleUiComboBox.setPreferredSize(new Dimension(sortItemPaneRightWidth, AbstractSortPane.PANE_COMPONENT_HEIGHT)); - sortRulePane.add(new UILabel(Toolkit.i18nText("Fine-Design_Sort_Sort_Rule"), SwingConstants.LEFT)); - sortRulePane.add(AbstractSortPane.createIntervalUILabel()); - sortRulePane.add(sortRuleUiComboBox); - this.add(sortRulePane); + sortRulePane = Layouts.row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Sort_Sort_Rule"), SwingConstants.LEFT)).weight(1.2), + cell(sortRuleUiComboBox).weight(3) + ).getComponent(); } void initSortBasisPanel() { - sortBasisPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, AbstractSortPane.PANE_COMPONENT_V_GAP)); sortBasisUiComboBox = new UIComboBox(getSortNames()); sortBasisUiComboBox.setPreferredSize(new Dimension(sortItemPaneRightWidth, AbstractSortPane.PANE_COMPONENT_HEIGHT)); - sortBasisUiComboBox.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - if (sortExpressionPanes.get(sortBasisUiComboBox.getSelectedIndex()) != currentSortExpressionPane) { - if (currentSortExpressionPane != null) { - currentSortExpressionPane.setVisible(false); - } - triggerItemChanged(sortBasisUiComboBox.getSelectedIndex()); - } + sortBasisUiComboBox.addItemListener(e -> { + if (sortExpressionPanes.get(sortBasisUiComboBox.getSelectedIndex()) != currentSortExpressionPane) { + triggerItemChanged(sortBasisUiComboBox.getSelectedIndex()); } }); - sortBasisPanel.add(new UILabel(Toolkit.i18nText("Fine-Design_Sort_Sort_Basis"), SwingConstants.LEFT)); - sortBasisPanel.add(AbstractSortPane.createIntervalUILabel()); - sortBasisPanel.add(sortBasisUiComboBox); - this.add(sortBasisPanel); - for (SortExpressionPane sortExpressionPane : sortExpressionPanes) { - this.add(sortExpressionPane); - sortExpressionPane.setVisible(false); - } + sortBasisPanel = Layouts.row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Sort_Sort_Basis"), SwingConstants.LEFT)).weight(1.2), + cell(sortBasisUiComboBox).weight(3) + ).getComponent(); } void triggerItemChanged(Integer index) { @@ -102,9 +123,13 @@ public abstract class AbstractSortItemPane extends JPanel { } private void refreshCurrentSortExpressionPane() { - currentSortExpressionPane.setVisible(true); - sortAreaPane.setVisible(currentSortExpressionPane.needSortArea()); - sortRulePane.setVisible(currentSortExpressionPane.needSortRule()); + if (currentSortExpressionPane instanceof FormulaSortExpressionPane) { + cardPane.select("formula").populate(); + } else if (currentSortExpressionPane instanceof CustomSequenceSortExpressionPane) { + cardPane.select("custom").populate(); + } else { + cardPane.select("cell").populate(); + } } private String[] getSortNames() { diff --git a/designer-realize/src/main/java/com/fr/design/sort/common/SortColumnRowPane.java b/designer-realize/src/main/java/com/fr/design/sort/common/SortColumnRowPane.java index 0db7af4a12..eaf2bbdd00 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/common/SortColumnRowPane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/common/SortColumnRowPane.java @@ -1,5 +1,7 @@ package com.fr.design.sort.common; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.icon.LazyIcon; import com.fr.base.Style; import com.fr.base.background.ColorBackground; import com.fr.base.svg.IconUtils; @@ -27,22 +29,21 @@ import com.fr.stable.StringUtils; import javax.swing.Icon; import javax.swing.JPanel; import javax.swing.JTextField; +import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import static com.fine.swing.ui.layout.Layouts.cell; + public class SortColumnRowPane extends JPanel implements UIObserver { - int paneWidth; - int paneHeight; - int jTextFieldWidth; JTextField colJTextField; JTextField rowJTextField; UIButton selectButton; + UILabel elementLabel; private boolean isAlreadyAddListener = false; private CellSelection oldSelection; private SelectionListener gridSelectionChangeListener; @@ -54,28 +55,30 @@ public class SortColumnRowPane extends JPanel implements UIObserver { HeaderAreaPane.CellSelectionManager cellSelectionManager; - public SortColumnRowPane(int paneWidth, int paneHeight) { - this.paneWidth = paneWidth; - this.paneHeight = paneHeight; + public SortColumnRowPane() { initComponents(); } private void initComponents() { - initSize(); - this.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); intUILabel(); initTextField(); initSelectButton(); - this.setSize(new Dimension(paneWidth, paneHeight)); + initLayout(); } - void initSize() { - jTextFieldWidth = (paneWidth - 40) / 2; + private void initLayout() { + this.setLayout(new BorderLayout()); + this.add(Layouts.row(2, + cell(elementLabel).weight(1), + cell(colJTextField).weight(2), + cell(rowJTextField).weight(2), + cell(selectButton).weight(1) + ).getComponent()); } + void intUILabel() { - UILabel uiLabel = new UILabel(IconUtils.readIcon("/com/fr/design/images/buttonicon/propertiestab/cellelement_normal.png")); - this.add(uiLabel); + elementLabel = new UILabel(new LazyIcon("cellelement_small")); } public static boolean isAvailableColumnRow(ColumnRow columnRow) { @@ -87,17 +90,12 @@ public class SortColumnRowPane extends JPanel implements UIObserver { colJTextField.setEditable(false); rowJTextField = new JTextField(); rowJTextField.setEditable(false); - colJTextField.setPreferredSize(new Dimension(jTextFieldWidth, paneHeight)); - rowJTextField.setPreferredSize(new Dimension(jTextFieldWidth, paneHeight)); - this.add(colJTextField); - this.add(rowJTextField); } void initSelectButton() { selectButton = new UIButton(ENABLE_ICON); selectActionListener = new SelectActionListener(this); selectButton.addMouseListener(selectActionListener); - this.add(selectButton); } public void populateBean(ColumnRow columnRow, boolean enabled, HeaderAreaPane.CellSelectionManager cellSelectionManager) { @@ -129,7 +127,9 @@ public class SortColumnRowPane extends JPanel implements UIObserver { public void setColumnRow(ColumnRow columnRow) { populateBean(columnRow); - uiObserverListener.doChange(); + if (uiObserverListener != null) { + uiObserverListener.doChange(); + } } public ColumnRow updateBean() { diff --git a/designer-realize/src/main/java/com/fr/design/sort/common/SortUIExpandablePane.java b/designer-realize/src/main/java/com/fr/design/sort/common/SortUIExpandablePane.java index 42a135298a..1b3ffd640c 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/common/SortUIExpandablePane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/common/SortUIExpandablePane.java @@ -1,12 +1,14 @@ package com.fr.design.sort.common; -import com.fr.base.BaseUtils; -import com.fr.base.svg.IconUtils; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; -import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.i18n.DesignSizeI18nManager; import com.fr.design.i18n.Toolkit; import javax.swing.*; @@ -14,6 +16,9 @@ import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; + public class SortUIExpandablePane extends JPanel { private static final long serialVersionUID = 1L; @@ -31,12 +36,12 @@ public class SortUIExpandablePane extends JPanel { public SortUIExpandablePane(AbstractSortItemPane contentPane, AbstractSortGroupPane sortGroupPane) { super(); + this.setLayout(new BorderLayout()); this.sortGroupPane = sortGroupPane; this.contentPane = contentPane; initComponents(); - wrapPane.setBorder(BorderFactory.createLineBorder(new Color(217, 218, 221), 1)); + wrapPane.setBorder(new FineRoundBorder()); wrapPane.setBackground(Color.WHITE); - this.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 5)); } @@ -51,11 +56,12 @@ public class SortUIExpandablePane extends JPanel { } }); headerPane.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, new Color(217, 218, 221))); - contentPane.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); + contentPane.setBorder(new ScaledEmptyBorder(0, 5, 0, 5)); wrapPane.add(headerPane, BorderLayout.NORTH); wrapPane.add(contentPane, BorderLayout.CENTER); setContentPanelShow(true); this.add(wrapPane); + this.setBorder(new ScaledEmptyBorder(0, 0, LayoutConstants.VERTICAL_GAP, 0)); } @@ -77,20 +83,14 @@ public class SortUIExpandablePane extends JPanel { HeaderPane(AbstractSortGroupPane sortGroupPane) { this.sortGroupPane = sortGroupPane; - this.setLayout(new FlowLayout(FlowLayout.LEFT, 3, 0)); initComponents(); + this.setBorder(new ScaledEmptyBorder(5, 0, 5, 0)); } private void initComponents() { iconUiLabel = new UILabel(); - this.add(iconUiLabel); tipUILabel = new UILabel(Toolkit.i18nText("Fine-Design_Sort_Second_Sort")); - this.add(tipUILabel); - this.add(AbstractSortPane.createIntervalUILabel( DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.sort.expand.header.pane"))); - - closeButton = new UILabel(IconUtils.readIcon("/com/fr/design/images/control/close.png")); - closeButton.setPreferredSize(new Dimension(16, 20)); - this.add(closeButton); + closeButton = new UILabel(new LazyIcon("close")); closeButton.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { @@ -100,14 +100,19 @@ public class SortUIExpandablePane extends JPanel { } } }); - this.setPreferredSize(new Dimension(contentPane.sortItemPaneWidth + 7, AbstractSortPane.PANE_COMPONENT_HEIGHT)); + this.setLayout(new BorderLayout()); + this.add(Layouts.row( + cell(iconUiLabel), cell(tipUILabel), flex(), cell(closeButton) + ) + .getComponent(), BorderLayout.CENTER); + this.setPreferredSize(new Dimension(contentPane.sortItemPaneWidth + FineUIScale.scale(7), FineUIScale.scale(24))); } public void setShow(boolean show) { if (show) { - iconUiLabel.setIcon(IconUtils.readIcon("/com/fr/design/images/sort/down_arrow.png")); + iconUiLabel.setIcon(new LazyIcon("triangle_down")); } else { - iconUiLabel.setIcon(IconUtils.readIcon("/com/fr/design/images/sort/left_arrow.png")); + iconUiLabel.setIcon(new LazyIcon("triangle_right")); } } diff --git a/designer-realize/src/main/java/com/fr/design/sort/expressionpane/CustomSequencePane.java b/designer-realize/src/main/java/com/fr/design/sort/expressionpane/CustomSequencePane.java index 3a5b9641fb..a67cd5aa6f 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/expressionpane/CustomSequencePane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/expressionpane/CustomSequencePane.java @@ -1,11 +1,12 @@ package com.fr.design.sort.expressionpane; -import com.fr.base.svg.IconUtils; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIScale; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.sort.common.AbstractSortPane; import com.fr.report.core.sort.sortexpression.CustomSequenceSortExpression; import javax.swing.*; @@ -14,27 +15,25 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; + public class CustomSequencePane extends JPanel { protected UITextField textField; protected UIButton button; List customSequence; - public CustomSequencePane(int width) { - this.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 0)); - this.initComponents(width); + public CustomSequencePane() { + this.setLayout(new BorderLayout()); + this.initComponents(); } - protected void initComponents(int width) { + protected void initComponents() { textField = new UITextField(); textField.setEditable(false); - textField.setPreferredSize(new Dimension(width - 20, AbstractSortPane.PANE_COMPONENT_HEIGHT)); - Icon icon = IconUtils.readIcon("/com/fr/design/images/sort/sequence.png"); - button = new UIButton(icon); - button.setBackground(Color.RED); + button = new UIButton(new LazyIcon("nosort")); button.setOpaque(false); button.setCursor(new Cursor(Cursor.HAND_CURSOR)); - button.setPreferredSize(new Dimension(20, AbstractSortPane.PANE_COMPONENT_HEIGHT)); MouseAdapter mouseAdapter = new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { @@ -46,13 +45,14 @@ public class CustomSequencePane extends JPanel { triggerOk(CustomSequenceSortExpression.customSequenceToString(customSequence, ","), CustomSequenceSortExpression.isReferenceCustomSequence(customSequence)); } - }, new Dimension(700, 400)).setVisible(true); + }, FineUIScale.scale(new Dimension(700, 400))).setVisible(true); } }; button.addMouseListener(mouseAdapter); textField.addMouseListener(mouseAdapter); - this.add(textField); - this.add(button); + this.add(Layouts.row( + cell(textField).weight(6), cell(button).weight(1) + ).getComponent()); } private void triggerOk(String customSequence, Boolean referenceCustomSequence) { diff --git a/designer-realize/src/main/java/com/fr/design/sort/expressionpane/CustomSequenceSortExpressionPane.java b/designer-realize/src/main/java/com/fr/design/sort/expressionpane/CustomSequenceSortExpressionPane.java index 69dac2a2ab..b56b60b904 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/expressionpane/CustomSequenceSortExpressionPane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/expressionpane/CustomSequenceSortExpressionPane.java @@ -1,21 +1,25 @@ package com.fr.design.sort.expressionpane; -import com.fr.design.sort.common.AbstractSortPane; +import com.fine.swing.ui.layout.Layouts; import com.fr.locale.InterProviderFactory; import com.fr.report.core.sort.sortexpression.CustomSequenceSortExpression; -import javax.swing.*; import java.awt.*; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; + public class CustomSequenceSortExpressionPane extends SortExpressionPane { CustomSequencePane customSequencePane; public CustomSequenceSortExpressionPane(int width, int rightWidth) { - this.setLayout(new FlowLayout(FlowLayout.RIGHT, 2, 0)); - customSequencePane = new CustomSequencePane(rightWidth + 5); - this.add(customSequencePane); + this.setLayout(new BorderLayout()); + customSequencePane = new CustomSequencePane(); + this.add(Layouts.row( + flex(1.2), cell(customSequencePane).weight(3) + ).getComponent()); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/sort/expressionpane/FormulaSortExpressionPane.java b/designer-realize/src/main/java/com/fr/design/sort/expressionpane/FormulaSortExpressionPane.java index 3785a7e973..dc27f2123b 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/expressionpane/FormulaSortExpressionPane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/expressionpane/FormulaSortExpressionPane.java @@ -1,21 +1,25 @@ package com.fr.design.sort.expressionpane; +import com.fine.swing.ui.layout.Layouts; import com.fr.design.formula.TinyFormulaPane; -import com.fr.design.sort.common.AbstractSortPane; import com.fr.locale.InterProviderFactory; import com.fr.report.core.sort.sortexpression.FormulaSortExpression; import java.awt.*; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; + public class FormulaSortExpressionPane extends SortExpressionPane { TinyFormulaPane tinyFormulaPane; public FormulaSortExpressionPane(int width) { - this.setLayout(new FlowLayout(FlowLayout.RIGHT, 2, 0)); + this.setLayout(new BorderLayout()); tinyFormulaPane = new TinyFormulaPane(); - tinyFormulaPane.setPreferredSize(new Dimension(width + 5, AbstractSortPane.PANE_COMPONENT_HEIGHT)); - this.add(tinyFormulaPane); + this.add(Layouts.row( + flex(1.2), cell(tinyFormulaPane).weight(3) + ).getComponent()); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/sort/header/HeaderAreaPane.java b/designer-realize/src/main/java/com/fr/design/sort/header/HeaderAreaPane.java index 831038758f..15ce26c674 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/header/HeaderAreaPane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/header/HeaderAreaPane.java @@ -1,35 +1,28 @@ package com.fr.design.sort.header; -import com.fr.design.designer.TargetComponent; -import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.gui.core.ReactiveCardPane; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.ElementCasePane; -import com.fr.design.sort.common.AbstractSortPane; import com.fr.design.sort.common.SortColumnRowPane; import com.fr.design.sort.common.SortUtils; -import com.fr.log.FineLoggerFactory; import com.fr.report.cell.TemplateCellElement; import com.fr.report.cell.cellattr.CellExpandAttr; -import com.fr.report.cell.cellattr.core.group.DSColumn; -import com.fr.report.core.sort.common.CellSortable; import com.fr.report.core.sort.header.SortHeader; import com.fr.report.elementcase.TemplateElementCase; import com.fr.stable.ColumnRow; import javax.swing.*; import java.awt.*; -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.HashMap; import java.util.Iterator; -import java.util.Map; + +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.flex; public class HeaderAreaPane extends JPanel { @@ -37,31 +30,63 @@ public class HeaderAreaPane extends JPanel { protected int headerAreaPaneRightWidth; private CellSelectionManager cellSelectionManager = new CellSelectionManager(); TemplateCellElement cellElement; - - - AreaJLayeredPane areaJLayeredPane; + SortColumnRowPane columnRowPane; + ReactiveCardPane cardPane; + UIComboBox uiComboBox; + UILabel headerLabel; HeaderAreaPane(int headerAreaPaneWidth, int headerAreaPaneRightWidth) { this.headerAreaPaneWidth = headerAreaPaneWidth; this.headerAreaPaneRightWidth = headerAreaPaneRightWidth; - this.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); initComponents(); } void initComponents() { - initUILabel(); - initLayeredPane(); + headerLabel = new UILabel(Toolkit.i18nText("Fine-Design_Sort_Header_Area"), SwingConstants.LEFT); + uiComboBox = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Basic_None"), Toolkit.i18nText("Fine-Design_Basic_Custom")}); + columnRowPane = new SortColumnRowPane(); + initCardPane(); + initChangeListener(); + this.setLayout(new BorderLayout()); + this.add(cardPane); } - void initUILabel() { - UILabel uiLabel = new UILabel(Toolkit.i18nText("Fine-Design_Sort_Header_Area"), SwingConstants.LEFT); - this.add(uiLabel); - this.add(AbstractSortPane.createIntervalUILabel()); + private void initChangeListener() { + uiComboBox.addItemListener(e -> { + if (uiComboBox.getSelectedIndex() == 0) { + cardPane.select("none").populate(); + cellSelectionManager.removeNotSelectables(columnRowPane.updateBean()); + columnRowPane.cancelSelectState(); + } else { + cardPane.select("custom").populate(); + ColumnRow columnRow = columnRowPane.updateBean(); + if (cellSelectionManager.isNotSelectables(columnRow)) { + columnRowPane.setColumnRow(ColumnRow.ERROR); + } else { + cellSelectionManager.addNotSelectables(columnRow); + } + } + }); + uiComboBox.setEnabled(false); } - void initLayeredPane() { - areaJLayeredPane = new AreaJLayeredPane(); - this.add(areaJLayeredPane); + private void initCardPane() { + cardPane = ReactiveCardPane.create() + .addSupplier("none", () -> column(LayoutConstants.VERTICAL_GAP, + row( + cell(headerLabel).weight(1.2), cell(uiComboBox).weight(3) + ) + ).getComponent()) + .addSupplier("custom", () -> column(LayoutConstants.VERTICAL_GAP, + row( + cell(headerLabel).weight(1.2), cell(uiComboBox).weight(3) + ), + row( + flex(1.2), cell(columnRowPane).weight(3) + ) + ).getComponent()); + + cardPane.select("none").populate(); } public void populateBean(ColumnRow columnRow, boolean showHeaderArea, TemplateCellElement cellElement) { @@ -71,7 +96,18 @@ public class HeaderAreaPane extends JPanel { if (elementCasePane != null) { enabled = elementCasePane.isSelectedOneCell(); } - areaJLayeredPane.populateBean(columnRow, showHeaderArea, enabled); + populateColumnRowPane(columnRow, showHeaderArea, enabled); + } + + private void populateColumnRowPane(ColumnRow columnRow, boolean showHeaderArea, boolean enabled) { + cellSelectionManager.build(cellElement, columnRow); + if(showHeaderArea){ + columnRow = cellSelectionManager.buildCurrentCell(cellElement, columnRow); + } + columnRowPane.populateBean(columnRow, enabled, cellSelectionManager); + uiComboBox.setSelectedIndex(showHeaderArea ? 1 : 0); + uiComboBox.setEnabled(enabled); + } public ColumnRow updateBean(TemplateCellElement cellElement) { @@ -81,7 +117,15 @@ public class HeaderAreaPane extends JPanel { return getOldColumnRow(cellElement); } } - return areaJLayeredPane.updateBean(); + return updateColumnRowBean(); + } + + private ColumnRow updateColumnRowBean() { + if (uiComboBox.getSelectedIndex() == 0) { + return null; + } else { + return columnRowPane.updateBean(); + } } private ColumnRow getOldColumnRow(TemplateCellElement cellElement) { @@ -99,100 +143,6 @@ public class HeaderAreaPane extends JPanel { } } - class AreaJLayeredPane extends JPanel { - SortColumnRowPane columnRowPane; - JLayeredPane jLayeredPane; - UIComboBox uiComboBox; - boolean showHeaderArea; - - AreaJLayeredPane() { - this.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); - initComponents(); - } - - private void initComponents() { - initUIComboBox(); - initJLayeredPane(); - } - - - void initUIComboBox() { - uiComboBox = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Basic_None"), Toolkit.i18nText("Fine-Design_Basic_Custom")}); - uiComboBox.setSize(new Dimension(headerAreaPaneRightWidth, AbstractSortPane.PANE_COMPONENT_HEIGHT)); - uiComboBox.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - if ((showHeaderArea ? 1 : 0) != uiComboBox.getSelectedIndex()) { - triggerItemChanged(uiComboBox.getSelectedIndex()); - } - } - }); - uiComboBox.setEnabled(false); - } - - void triggerItemChanged(Integer index) { - setSortColumnRowPaneShow(index == 1); - if (index == 1) { - ColumnRow columnRow = columnRowPane.updateBean(); - if (cellSelectionManager.isNotSelectables(columnRow)) { - columnRowPane.setColumnRow(ColumnRow.ERROR); - } else { - cellSelectionManager.addNotSelectables(columnRow); - } - } else { - cellSelectionManager.removeNotSelectables(columnRowPane.updateBean()); - columnRowPane.cancelSelectState(); - } - } - - void setSortColumnRowPaneShow(boolean show) { - if (show) { - jLayeredPane.setLayer(columnRowPane, JLayeredPane.POPUP_LAYER); - jLayeredPane.setLayer(uiComboBox, JLayeredPane.MODAL_LAYER); - } else { - jLayeredPane.setLayer(uiComboBox, JLayeredPane.POPUP_LAYER); - jLayeredPane.setLayer(columnRowPane, JLayeredPane.MODAL_LAYER); - } - showHeaderArea = show; - refresh(); - } - - void initJLayeredPane() { - jLayeredPane = new JLayeredPane(); - columnRowPane = new SortColumnRowPane(headerAreaPaneRightWidth - 18, AbstractSortPane.PANE_COMPONENT_HEIGHT); - jLayeredPane.setPreferredSize(new Dimension(headerAreaPaneRightWidth, AbstractSortPane.PANE_COMPONENT_HEIGHT)); - jLayeredPane.add(columnRowPane, JLayeredPane.MODAL_LAYER); - jLayeredPane.add(uiComboBox, JLayeredPane.POPUP_LAYER); - this.add(jLayeredPane); - } - - public void populateBean(ColumnRow columnRow, boolean showHeaderArea, boolean enabled) { - cellSelectionManager.build(cellElement, columnRow); - if(showHeaderArea){ - columnRow = cellSelectionManager.buildCurrentCell(cellElement, columnRow); - } - columnRowPane.populateBean(columnRow, enabled, cellSelectionManager); - setSortColumnRowPaneShow(showHeaderArea); - uiComboBox.setSelectedIndex(showHeaderArea ? 1 : 0); - uiComboBox.setEnabled(enabled); - } - - public ColumnRow updateBean() { - if (uiComboBox.getSelectedIndex() == 0) { - return null; - } else { - return columnRowPane.updateBean(); - } - } - - public void refresh() { - validate(); - repaint(); - revalidate(); - } - - } - public static class CellSelectionManager { ElementCasePane elementCase; java.util.List notSelectables = new ArrayList<>(); diff --git a/designer-realize/src/main/java/com/fr/design/sort/header/HeaderSettingPane.java b/designer-realize/src/main/java/com/fr/design/sort/header/HeaderSettingPane.java index 114300e662..5cd8ea7edf 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/header/HeaderSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/header/HeaderSettingPane.java @@ -1,9 +1,9 @@ package com.fr.design.sort.header; +import com.fine.swing.ui.layout.Column; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.sort.common.AbstractSortPane; import com.fr.general.GeneralContext; import com.fr.report.core.sort.header.SortHeader; @@ -13,6 +13,9 @@ import javax.swing.event.ChangeListener; import java.awt.*; import java.util.Locale; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + public class HeaderSettingPane extends JPanel { protected int headerSettingPaneWidth; protected int headerSettingPaneRightWidth; @@ -22,34 +25,30 @@ public class HeaderSettingPane extends JPanel { HeaderSettingPane(int headerSettingPaneWidth, int headerSettingPaneRightWidth) { this.headerSettingPaneWidth = headerSettingPaneWidth; this.headerSettingPaneRightWidth = headerSettingPaneRightWidth; - this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + this.setLayout(new BorderLayout()); initComponents(); } void initComponents() { - initUILabel(); - initHeaderSortRulePane(); - } - - void initUILabel() { - JPanel jPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 2)); UILabel uiLabel = new UILabel(Toolkit.i18nText("Fine-Design_Sort_Header_Setting")); - UILabel emptyUILabel = new UILabel(); - emptyUILabel.setPreferredSize(new Dimension(10, 10)); - uiCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Sort_Allow_User_Click_Sort_Order")); addToolTipText(); - uiCheckBox.setPreferredSize(new Dimension(headerSettingPaneRightWidth - 10, AbstractSortPane.PANE_COMPONENT_HEIGHT)); uiCheckBox.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { headerSortRulePane.setVisible(uiCheckBox.isSelected()); } }); - jPanel.add(uiLabel); - jPanel.add(emptyUILabel); - jPanel.add(uiCheckBox); - this.add(jPanel); + headerSortRulePane = new HeaderSortRulePane(); + headerSortRulePane.setVisible(false); + + Column corePane = new Column(); + corePane.setSpacing(10); + corePane.add( + row(cell(uiLabel).weight(1.2),cell(uiCheckBox).weight(3.0)), + row(cell(headerSortRulePane).weight(1)) + ); + this.add(corePane, BorderLayout.CENTER); } private void addToolTipText() { @@ -58,12 +57,6 @@ public class HeaderSettingPane extends JPanel { } } - void initHeaderSortRulePane() { - headerSortRulePane = new HeaderSortRulePane(); - this.add(headerSortRulePane); - headerSortRulePane.setVisible(false); - } - protected void refresh() { validate(); repaint(); diff --git a/designer-realize/src/main/java/com/fr/design/sort/header/HeaderSortRulePane.java b/designer-realize/src/main/java/com/fr/design/sort/header/HeaderSortRulePane.java index d18a73f5d3..4250150727 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/header/HeaderSortRulePane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/header/HeaderSortRulePane.java @@ -1,15 +1,16 @@ package com.fr.design.sort.header; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.light.ui.FineRoundBorder; import com.fr.base.FineColor; import com.fr.base.svg.SVGIcon; +import com.fr.design.constants.LayoutConstants; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ipoppane.PopupHider; -import com.fr.design.i18n.DesignSizeI18nManager; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.style.color.ColorControlWindow; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.report.core.sort.header.HeaderIconBuilder; @@ -25,6 +26,10 @@ import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.ArrayList; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.flex; + public class HeaderSortRulePane extends JPanel { IconButton ascIconButton; IconButton desIconButton; @@ -38,32 +43,23 @@ public class HeaderSortRulePane extends JPanel { HeaderSortRulePane() { initComponents(); initState(true); - this.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 15)); } void initComponents() { this.setLayout(new BorderLayout()); - initUILabel(); - initSortRuleItem(); - this.setPreferredSize(new Dimension(160, 160)); - } - - void initUILabel() { - UILabel uiLabel = new UILabel(Toolkit.i18nText("Fine-Design_Sort_Header_Sort_Basis"), SwingConstants.LEFT); - this.add(uiLabel, BorderLayout.NORTH); - } + UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Sort_Header_Sort_Basis"), SwingConstants.LEFT); + ascUICheckBox = new UICheckBox(SortRule.ASC.getDescription()); + ascIconButton = new IconButton(SortRule.ASC); + desUICheckBox = new UICheckBox(SortRule.DES.getDescription()); + desIconButton = new IconButton(SortRule.DES); + nosortUICheckBox = new UICheckBox(SortRule.NO_SORT.getDescription()); + nosortIconButton = new IconButton(SortRule.NO_SORT); + this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + row(cell(label).weight(1.5), cell(ascUICheckBox).weight(2), flex(), cell(ascIconButton)), + row(flex(1.5), cell(desUICheckBox).weight(2), flex(), cell(desIconButton)), + row(flex(1.5), cell(nosortUICheckBox).weight(2), flex(), cell(nosortIconButton)) + ).getComponent()); - void initSortRuleItem() { - Component[][] components = new Component[][]{ - new Component[]{ascUICheckBox = new UICheckBox(SortRule.ASC.getDescription()), ascIconButton = new IconButton(SortRule.ASC)}, - new Component[]{desUICheckBox = new UICheckBox(SortRule.DES.getDescription()), desIconButton = new IconButton(SortRule.DES)}, - new Component[]{nosortUICheckBox = new UICheckBox(SortRule.NO_SORT.getDescription()), nosortIconButton = new IconButton(SortRule.NO_SORT)}, - }; - double[] rowSize = {ICON_LENGTH + 10, ICON_LENGTH + 10, ICON_LENGTH + 10}; - double[] columnSize = - {DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.sort.rule.item").getWidth(), ICON_LENGTH + 10}; - JPanel sortRuleItem = TableLayoutHelper.createCommonTableLayoutPane(components, rowSize, columnSize, 0); - this.add(sortRuleItem, BorderLayout.CENTER); initUICheckBoxChange(ascUICheckBox, ascIconButton); initUICheckBoxChange(desUICheckBox, desIconButton); initUICheckBoxChange(nosortUICheckBox, nosortIconButton); @@ -108,7 +104,7 @@ public class HeaderSortRulePane extends JPanel { public void setActiveState(boolean activeState) { if (activeState) { - borderUiLabel.setBorder(BorderFactory.createLineBorder(Color.gray, 1)); + borderUiLabel.setBorder(new FineRoundBorder()); } else { borderUiLabel.setBorder(null); } @@ -145,8 +141,7 @@ public class HeaderSortRulePane extends JPanel { Icon getIcon(FineColor fineColor) { BufferedImage bufferedImage = HeaderIconBuilder.getIcon(sortRule, fineColor); - Icon icon = new SVGIcon(bufferedImage); - return icon; + return new SVGIcon(bufferedImage); } void refreshIconLabel(BufferedImage bufferedImage) { diff --git a/designer-realize/src/main/java/com/fr/design/sort/header/SortHeaderPane.java b/designer-realize/src/main/java/com/fr/design/sort/header/SortHeaderPane.java index 77802429ca..0c6f963aae 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/header/SortHeaderPane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/header/SortHeaderPane.java @@ -1,11 +1,16 @@ package com.fr.design.sort.header; -import com.fr.design.sort.common.SortColumnRowPane; +import com.fine.swing.ui.layout.Layouts; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.report.cell.TemplateCellElement; import com.fr.report.core.sort.header.SortHeader; import com.fr.stable.ColumnRow; import javax.swing.*; +import java.awt.BorderLayout; + +import static com.fine.swing.ui.layout.Layouts.cell; public class SortHeaderPane extends JPanel { int sortHeaderPaneWidth; @@ -16,22 +21,16 @@ public class SortHeaderPane extends JPanel { TemplateCellElement cellElement; public SortHeaderPane(int sortHeaderPaneWidth, int sortHeaderPaneRightWidth) { + this.setLayout(new BorderLayout()); this.sortHeaderPaneWidth = sortHeaderPaneWidth; this.sortHeaderPaneRightWidth = sortHeaderPaneRightWidth; - this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - initHeaderArea(); - initHeaderSetting(); - this.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); - } - - void initHeaderArea() { this.headerAreaPane = new HeaderAreaPane(sortHeaderPaneWidth, sortHeaderPaneRightWidth); - this.add(headerAreaPane); - } - - void initHeaderSetting() { this.headerSettingPane = new HeaderSettingPane(sortHeaderPaneWidth, sortHeaderPaneRightWidth); - this.add(headerSettingPane); + this.add( + Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(headerAreaPane), cell(headerSettingPane) + ).with(it -> it.setBorder(new ScaledEmptyBorder(10, 0, 0, 0))).getComponent(), + BorderLayout.CENTER); } public void populateBean(SortHeader sortHeader, String defaultHeaderArea,TemplateCellElement cellElement) { @@ -59,7 +58,6 @@ public class SortHeaderPane extends JPanel { if (columnRow != null) { headerArea = columnRow.toString(); } - SortHeader sortHeader = new SortHeader(headerArea, null, items); - return sortHeader; + return new SortHeader(headerArea, null, items); } } \ No newline at end of file diff --git a/designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java index 4419392f90..504dc1e4b9 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java @@ -1,9 +1,12 @@ package com.fr.quickeditor; +import com.fine.swing.ui.layout.Layouts; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.GraphHelper; import com.fr.base.Style; import com.fr.design.actions.UpdateAction; import com.fr.design.actions.core.ActionFactory; +import com.fr.design.constants.LayoutConstants; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.frpane.AttributeChangeListener; import com.fr.design.gui.icombobox.UIComboBox; @@ -12,8 +15,6 @@ import com.fr.design.gui.iscrollbar.UIScrollBar; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.gui.style.TextFormatPaneContainer; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.CellElementPropertyPane; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.ElementCasePane; @@ -36,7 +37,6 @@ import javax.swing.JPanel; import javax.swing.JScrollBar; import javax.swing.SwingUtilities; import java.awt.BorderLayout; -import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionEvent; @@ -50,6 +50,9 @@ import java.util.ArrayList; import java.util.Objects; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + /** * @author zhou, yaoh.wu * @version 2017年8月7日16点54分 @@ -116,23 +119,14 @@ public abstract class CellQuickEditor extends QuickEditor { } private void createPanelBody() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f}; + leftContentPane = Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(multipleLabelTip), + cell(topContentContainer), + cell(formatPane), + cell(centerBodyContainer)).getComponent(); if (isScrollAll()) { - double[] scrollAllRowSize = {p, p, p, p}; prepareScrollBar(); - multipleLabelTip.setBorder(BorderFactory.createMatteBorder(5, 10, 0, 0, this.getBackground())); - topContentContainer.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 0, this.getBackground())); - formatPane.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 0, this.getBackground())); - centerBodyContainer.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 0, this.getBackground())); - Component[][] components = new Component[][]{ - new Component[]{multipleLabelTip}, - new Component[]{topContentContainer}, - new Component[]{formatPane}, - new Component[]{centerBodyContainer} - }; - leftContentPane = TableLayoutHelper.createGapTableLayoutPane(components, scrollAllRowSize, columnSize, HGAP, VGAP); + leftContentPane.setBorder(new ScaledEmptyBorder(0, 10, 0, 0)); this.setLayout(new CellElementBarLayout(leftContentPane) { @Override public void layoutContainer(Container parent) { @@ -147,31 +141,17 @@ public abstract class CellQuickEditor extends QuickEditor { } int width = parent.getWidth(); int height = parent.getHeight(); - if (leftContentPane.getPreferredSize().height > maxHeight) { - leftContentPane.setBounds(0, -beginY, width - SCROLLBAR_WIDTH - CONTENT_PANE_WIDTH_GAP, height + beginY); - scrollBar.setBounds(width - SCROLLBAR_WIDTH - CONTENT_PANE_WIDTH_GAP, 0, SCROLLBAR_WIDTH + CONTENT_PANE_WIDTH_GAP, height); - } else { - leftContentPane.setBounds(0, 0, width - SCROLLBAR_WIDTH - CONTENT_PANE_WIDTH_GAP, height); - } + leftContentPane.setBounds(0, -beginY, width - SCROLLBAR_WIDTH, height + beginY); + scrollBar.setBounds(width - SCROLLBAR_WIDTH - CONTENT_PANE_WIDTH_GAP, 0, SCROLLBAR_WIDTH + CONTENT_PANE_WIDTH_GAP, height); leftContentPane.validate(); } }); this.add(scrollBar); this.add(leftContentPane); } else { - double[] scrollContentRowSize = {p, p, p, f}; - multipleLabelTip.setBorder(BorderFactory.createMatteBorder(5, 10, 0, 0, this.getBackground())); - topContentContainer.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 10, this.getBackground())); - formatPane.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 10, this.getBackground())); - centerBodyContainer.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 0, this.getBackground())); - Component[][] components = new Component[][]{ - new Component[]{multipleLabelTip}, - new Component[]{topContentContainer}, - new Component[]{formatPane}, - new Component[]{centerBodyContainer} - }; + leftContentPane.setBorder(new ScaledEmptyBorder(0, 10, 0, 10)); this.setLayout(new BorderLayout()); - this.add(TableLayoutHelper.createGapTableLayoutPane(components, scrollContentRowSize, columnSize, HGAP, VGAP), BorderLayout.CENTER); + this.add(leftContentPane, BorderLayout.CENTER); } } @@ -303,19 +283,20 @@ public abstract class CellQuickEditor extends QuickEditor { private JPanel initTopContent() { - - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {GraphHelper.getWidth(Toolkit.i18nText("Fine-Design_Report_Insert_Cell_Element")), f}; - double[] rowSize = {p, p}; cellLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Basic_Cell")); UILabel insertContentLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Report_Insert_Cell_Element")); + columnRowTextField = initColumnRowTextField(); initCellElementEditComboBox(); - Component[][] components = new Component[][]{ - new Component[]{cellLabel, columnRowTextField = initColumnRowTextField()}, - new Component[]{insertContentLabel, UIComponentUtils.wrapWithBorderLayoutPane(comboBox)}, - }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP); + return Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(cellLabel).weight(1.2), + cell(columnRowTextField).weight(3) + ), + row( + cell(insertContentLabel).weight(1.2), + cell(UIComponentUtils.wrapWithBorderLayoutPane(comboBox)).weight(3) + ) + ).getComponent(); } private void prepareScrollBar() { diff --git a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java index 9fcdecbe18..c8f813a4e7 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java @@ -1,9 +1,11 @@ package com.fr.quickeditor.cellquick; +import com.fine.swing.ui.layout.Layouts; import com.fr.base.BaseFormula; import com.fr.design.actions.columnrow.DSColumnConditionAction; import com.fr.design.actions.core.ActionFactory; import com.fr.design.actions.insert.cell.DSColumnCellAction; +import com.fr.design.constants.LayoutConstants; import com.fr.design.constants.UIConstants; import com.fr.design.data.DesignTableDataManager; import com.fr.design.dialog.DialogActionAdapter; @@ -60,6 +62,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.cell; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.BOTTOM; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.EVEN; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.ODD; @@ -120,12 +123,10 @@ public class CellDSColumnEditor extends CellQuickEditor { public JComponent createCenterBody() { this.createPanes(); this.createSwitchTab(); - JPanel dsColumnRegion = new JPanel(new BorderLayout()); - dsColumnRegion.add(tabsHeaderIconPane, BorderLayout.NORTH); - dsColumnRegion.add(cardContainer, BorderLayout.CENTER); - JPanel centerPane = new JPanel(new BorderLayout()); - centerPane.add(dsColumnRegion, BorderLayout.CENTER); - return centerPane; + return Layouts.column(10, + cell(tabsHeaderIconPane), + cell(cardContainer) + ).getComponent(); } @Override @@ -261,7 +262,6 @@ public class CellDSColumnEditor extends CellQuickEditor { dataPane.release(); } - /** * 创建有内容的面板显示信息 * @@ -270,24 +270,22 @@ public class CellDSColumnEditor extends CellQuickEditor { @Override protected JPanel createContentPane() { initComponents(); - double[] columnSize = {F}; - double[] rowSize = {P, P, P}; - Component[][] components = new Component[][]{ - //数据集列选择 - new Component[]{this.dataPane}, - //数据分组设置 - new Component[]{this.groupPane}, - //条件过滤 - new Component[]{this.conditionPane} - }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP); + return Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(dataPane), cell(groupPane), cell(conditionPane) + ).getComponent(); + } + + protected void initContentPane() { + leftContentPane = createContentPane(); + if (leftContentPane != null) { + this.add(leftContentPane, BorderLayout.CENTER); + } } private void initComponents(){ dataPane = new SelectedDataColumnPane(true, true); groupPane = new ResultSetGroupDockingPane(); initListener(); - double[] rowSize = {P}, columnSize = {60, F}; UILabel uiLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Report_Filter_Conditions")); condition = new DSColumnConditionAction(); if (tc != null) { @@ -297,11 +295,7 @@ public class CellDSColumnEditor extends CellQuickEditor { condition.setSmallIcon(UIConstants.EMPTY_ICON); condition.setName(Toolkit.i18nText("Fine-Design_Basic_Edit")); conditionUIButton = new UIButton(condition); - Component[][] components = new Component[][]{ - new Component[]{uiLabel, UIComponentUtils.wrapWithBorderLayoutPane(conditionUIButton)} - }; - conditionPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP); - this.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); + conditionPane = Layouts.row(cell(uiLabel).weight(1.2),cell(conditionUIButton).weight(3)).getComponent(); } private void initListener() { diff --git a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java index e57204920c..baf372a885 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java @@ -1,7 +1,7 @@ package com.fr.quickeditor.cellquick; +import com.fine.swing.ui.layout.Layouts; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.utils.FineUIScale; import com.fr.base.BaseFormula; import com.fr.base.Style; import com.fr.base.TextFormat; @@ -12,8 +12,6 @@ import com.fr.design.formula.FormulaFactory; import com.fr.design.formula.UIFormula; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.theme.utils.DefaultThemedTemplateCellElementCase; import com.fr.grid.selection.CellSelection; @@ -23,20 +21,16 @@ import com.fr.report.cell.TemplateCellElement; import com.fr.stable.ColumnRow; import com.fr.stable.StringUtils; -import javax.swing.BorderFactory; import javax.swing.JComponent; -import javax.swing.JPanel; -import javax.swing.UIManager; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; -import java.util.Arrays; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; /** * 公式快速编辑面板,同文本数字编辑拆分 @@ -88,7 +82,6 @@ public class CellFormulaQuickEditor extends CellQuickEditor { */ @Override public JComponent createCenterBody() { - JPanel content = new JPanel(new BorderLayout()); formulaTextField = new UITextField(); formulaTextField.addKeyListener(new KeyAdapter() { @Override @@ -98,14 +91,9 @@ public class CellFormulaQuickEditor extends CellQuickEditor { } } }); - JPanel textFieldPane = new JPanel(new BorderLayout()); - textFieldPane.add(formulaTextField, BorderLayout.CENTER); - textFieldPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); UIButton formulaButton = new UIButton(new LazyIcon("formula")); formulaButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula") + "..."); - Dimension dimension = new Dimension(UIManager.getInt("FormulaPane.buttonWidth"), UIManager.getInt("FormulaPane.buttonHeight")); - formulaButton.setPreferredSize(FineUIScale.scale(dimension)); formulaButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { final UIFormula formulaPane = FormulaFactory.createFormulaPaneWhenReserveFormula(); @@ -134,22 +122,9 @@ public class CellFormulaQuickEditor extends CellQuickEditor { } }); - JPanel pane = new JPanel(new BorderLayout()); - pane.add(textFieldPane, BorderLayout.CENTER); - pane.add(formulaButton, BorderLayout.EAST); - - content.add(pane, BorderLayout.NORTH); - - Component[][] componentLines = new Component[][] { - new Component[]{EMPTY_LABEL, content}, - }; - double[] rowSize = new double[componentLines.length]; - Arrays.fill(rowSize, TableLayout.PREFERRED); - double[] columnSize = new double[] {TableLayout.PREFERRED, TableLayout.FILL }; - return TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ - new Component[]{EMPTY_LABEL, content}, - }, - rowSize, columnSize, HGAP, VGAP); + return Layouts.row( + flex(1.2), cell(formulaTextField).weight(2.4), flex(0.1), cell(formulaButton).weight(0.5) + ).getComponent(); } diff --git a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellStringQuickEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellStringQuickEditor.java index 29ed7f22c6..91a531a116 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellStringQuickEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellStringQuickEditor.java @@ -3,7 +3,6 @@ package com.fr.quickeditor.cellquick; import com.fr.base.BaseFormula; import com.fr.base.Style; import com.fr.base.TextFormat; -import com.fr.design.designer.IntervalConstants; import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.mainframe.theme.utils.DefaultThemedTemplateCellElementCase; import com.fr.grid.GridKeyListener; @@ -61,7 +60,7 @@ public class CellStringQuickEditor extends CellQuickEditor { */ @Override public JComponent createCenterBody() { - JPanel content = new JPanel(new BorderLayout(0, IntervalConstants.INTERVAL_L1)); + JPanel content = new JPanel(new BorderLayout()); stringTextArea = new UITextArea(); stringTextArea.addKeyListener(new KeyAdapter() { @@ -89,7 +88,6 @@ public class CellStringQuickEditor extends CellQuickEditor { } }); content.add(stringTextArea, BorderLayout.NORTH); - return content; } From 431cadfd94432554fd7af99ead984330137e63e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Thu, 28 Dec 2023 10:05:36 +0800 Subject: [PATCH 062/302] =?UTF-8?q?REPORT-111995=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8UI=E7=BF=BB=E6=96=B0=20=E6=96=87=E4=BB=B6=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E5=9B=BE=E6=A0=87=E7=BF=BB=E6=96=B0=EF=BC=8C=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E5=9B=BE=E6=A0=87=E9=80=BB=E8=BE=91=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 25 ++++++++++++++++ .../gui/itree/filetree/FileTreeIcon.java | 30 +++++++++++-------- .../icon/filetree/filetype/add_report.svg | 6 ++++ .../filetree/filetype/add_report_disable.svg | 6 ++++ .../theme/icon/filetree/filetype/add_word.svg | 7 +++++ .../filetree/filetype/add_word_disable.svg | 7 +++++ .../theme/icon/filetree/filetype/bmpFile.svg | 8 +++++ .../filetree/filetype/bmpFile_disable.svg | 8 +++++ .../theme/icon/filetree/filetype/chtFile.svg | 4 +++ .../filetree/filetype/chtFile_disable.svg | 4 +++ .../icon/filetree/filetype/classFile.svg | 6 ++++ .../filetree/filetype/classFile_disable.svg | 6 ++++ .../icon/filetree/filetype/cpt_locked.svg | 6 ++++ .../filetree/filetype/cpt_locked_disable.svg | 6 ++++ .../icon/filetree/filetype/excelFile.svg | 6 ++++ .../filetree/filetype/excelFile_disable.svg | 6 ++++ .../icon/filetree/filetype/excel_import.svg | 7 +++++ .../filetype/excel_import_disable.svg | 7 +++++ .../icon/filetree/filetype/flashFile.svg | 8 +++++ .../filetree/filetype/flashFile_disable.svg | 7 +++++ .../icon/filetree/filetype/frm_locked.svg | 9 ++++++ .../filetree/filetype/frm_locked_disable.svg | 9 ++++++ .../theme/icon/filetree/filetype/gifFile.svg | 8 +++++ .../filetree/filetype/gifFile_disable.svg | 8 +++++ .../theme/icon/filetree/filetype/htmlFile.svg | 11 +++++++ .../filetree/filetype/htmlFile_disable.svg | 10 +++++++ .../theme/icon/filetree/filetype/jarFile.svg | 8 +++++ .../filetree/filetype/jarFile_disable.svg | 8 +++++ .../theme/icon/filetree/filetype/javaFile.svg | 9 ++++++ .../filetree/filetype/javaFile_disable.svg | 9 ++++++ .../theme/icon/filetree/filetype/jpgFile.svg | 8 +++++ .../filetree/filetype/jpgFile_disable.svg | 8 +++++ .../theme/icon/filetree/filetype/jsFile.svg | 7 +++++ .../icon/filetree/filetype/jsFile_disable.svg | 7 +++++ .../theme/icon/filetree/filetype/jspFile.svg | 8 +++++ .../filetree/filetype/jspFile_disable.svg | 8 +++++ .../theme/icon/filetree/filetype/pdfFile.svg | 8 +++++ .../filetree/filetype/pdfFile_disable.svg | 8 +++++ .../theme/icon/filetree/filetype/pngFile.svg | 8 +++++ .../filetree/filetype/pngFile_disable.svg | 8 +++++ .../theme/icon/filetree/filetype/sqlFile.svg | 11 +++++++ .../filetree/filetype/sqlFile_disable.svg | 10 +++++++ .../theme/icon/filetree/filetype/wordFile.svg | 6 ++++ .../filetree/filetype/wordFile_disable.svg | 6 ++++ .../theme/icon/filetree/filetype/xlsFile.svg | 7 +++++ .../filetree/filetype/xlsFile_disable.svg | 7 +++++ .../theme/icon/filetree/filetype/xmlFile.svg | 9 ++++++ .../filetree/filetype/xmlFile_disable.svg | 8 +++++ 48 files changed, 388 insertions(+), 13 deletions(-) create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 85c2ed651e..ccb9d9ef07 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -72,6 +72,31 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("refresh", "com/fine/theme/icon/filetree/refresh.svg", true), new SvgIconSource("new_folder", "com/fine/theme/icon/filetree/new_folder.svg", true), + // 文件类型 + new SvgIconSource("add_report", "com/fine/theme/icon/filetree/filetype/add_report.svg", true), + new SvgIconSource("add_word", "com/fine/theme/icon/filetree/filetype/add_word.svg", true), + new SvgIconSource("bmpFile", "com/fine/theme/icon/filetree/filetype/bmpFile.svg", true), + new SvgIconSource("chtFile", "com/fine/theme/icon/filetree/filetype/chtFile.svg", true), + new SvgIconSource("classFile", "com/fine/theme/icon/filetree/filetype/classFile.svg", true), + new SvgIconSource("cpt_locked", "com/fine/theme/icon/filetree/filetype/cpt_locked.svg", true), + new SvgIconSource("excel_import", "com/fine/theme/icon/filetree/filetype/excel_import.svg", true), + new SvgIconSource("excelFile", "com/fine/theme/icon/filetree/filetype/excelFile.svg", true), + new SvgIconSource("flashFile", "com/fine/theme/icon/filetree/filetype/flashFile.svg", true), + new SvgIconSource("frm_locked", "com/fine/theme/icon/filetree/filetype/frm_locked.svg", true), + new SvgIconSource("gifFile", "com/fine/theme/icon/filetree/filetype/gifFile.svg", true), + new SvgIconSource("htmlFile", "com/fine/theme/icon/filetree/filetype/htmlFile.svg", true), + new SvgIconSource("jarFile", "com/fine/theme/icon/filetree/filetype/jarFile.svg", true), + new SvgIconSource("javaFile", "com/fine/theme/icon/filetree/filetype/javaFile.svg", true), + new SvgIconSource("jpgFile", "com/fine/theme/icon/filetree/filetype/jpgFile.svg", true), + new SvgIconSource("jsFile", "com/fine/theme/icon/filetree/filetype/jsFile.svg", true), + new SvgIconSource("jspFile", "com/fine/theme/icon/filetree/filetype/jspFile.svg", true), + new SvgIconSource("pdfFile", "com/fine/theme/icon/filetree/filetype/pdfFile.svg", true), + new SvgIconSource("pngFile", "com/fine/theme/icon/filetree/filetype/pngFile.svg", true), + new SvgIconSource("sqlFile", "com/fine/theme/icon/filetree/filetype/sqlFile.svg", true), + new SvgIconSource("wordFile", "com/fine/theme/icon/filetree/filetype/wordFile.svg", true), + new SvgIconSource("xlsFile", "com/fine/theme/icon/filetree/filetype/xlsFile.svg", true), + new SvgIconSource("xmlFile", "com/fine/theme/icon/filetree/filetype/xmlFile.svg", true), + // 属性面板Icon new SvgIconSource("cellattr", "com/fine/theme/icon/propertiestab/cellattr.svg", false, 18), new SvgIconSource("cellattr_disabled", "com/fine/theme/icon/propertiestab/cellattr_disabled.svg", false, 18), diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java index 785bca06b4..e5e89bf72e 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java @@ -31,22 +31,21 @@ public class FileTreeIcon { public static final Icon FILE_IMAGE_ICON = UIManager.getIcon("FileView.fileIcon"); + public static final Icon JAVA_FILE_IMAGE_ICON = new LazyIcon("javaFile"); + public static final Icon CLASS_FILE_IMAGE_ICON = new LazyIcon("classFile"); + public static final Icon JSP_FILE_IMAGE_ICON = new LazyIcon("jspFile"); + public static final Icon JS_FILE_IMAGE_ICON = new LazyIcon("jsFile"); + public static final Icon XML_FILE_IMAGE_ICON = new LazyIcon("xmlFile"); + public static final Icon HTML_FILE_IMAGE_ICON = new LazyIcon("htmlFile"); + public static final Icon JAR_FILE_IMAGE_ICON = new LazyIcon("jarFile"); + public static final Icon GIF_FILE_IMAGE_ICON = new LazyIcon("gifFile"); + public static final Icon JPG_FILE_IMAGE_ICON = new LazyIcon("jpgFile"); + public static final Icon BMP_FILE_IMAGE_ICON = new LazyIcon("bmpFile"); + public static final Icon MODERN_CHT_FILE_IMAGE_ICON = new LazyIcon("chtFile"); + // TODO: 以下Icon视觉暂未提供,需提供后替换 public static final Icon BLANK_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/blank.gif"); public static final Icon FOLDER_HALF_IMAGE_ICON = IconUtils.readIcon("/com/fr/design/standard/fileicon/folder_half_authority.svg"); - public static final Icon JAVA_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/javaFile.gif"); - public static final Icon CLASS_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/classFile.gif"); - public static final Icon JSP_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/jspFile.gif"); - public static final Icon JS_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/jsFile.gif"); - public static final Icon XML_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/xmlFile.gif"); - public static final Icon HTML_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/htmlFile.gif"); - public static final Icon JAR_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/jarFile.gif"); - public static final Icon GIF_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/gifFile.gif"); - public static final Icon JPG_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/jpgFile.gif"); - public static final Icon BMP_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/bmpFile.gif"); - - public static final Icon MODERN_CHT_FILE_IMAGE_ICON = IconUtils.readIcon("/com/fr/design/standard/fileicon/cht_icon.svg"); - public static final Icon CPTX_ICON = IconUtils.readIcon("/com/fr/design/standard/fileicon/cptx_icon.svg"); public static final Icon CPTX_LOCKED_ICON = IconUtils.readIcon("/com/fr/design/standard/fileicon/cptx_icon_locked.svg"); @@ -188,6 +187,11 @@ public class FileTreeIcon { if (icon != null) { return icon; } + // 优先从本地已注册的文件图标读取;如读取到默认的文件图标(上锁及未上锁),再从本地读取系统文件图标 + icon = FileTreeIcon.getIcon(FileTreeIcon.getFileType(path), isShowLock); + if (icon != FileTreeIcon.FILE_LOCK_ICON && icon != FileTreeIcon.FILE_IMAGE_ICON) { + return icon; + } return new LocalFileIcon(FileSystemView.getFileSystemView().getSystemIcon(new File(path)), isShowLock); } diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report.svg new file mode 100755 index 0000000000..6cb73b6991 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report_disable.svg new file mode 100755 index 0000000000..ef5d8748b8 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report_disable.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word.svg new file mode 100755 index 0000000000..d2aa41ea80 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word_disable.svg new file mode 100755 index 0000000000..f8f711c520 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word_disable.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile.svg new file mode 100755 index 0000000000..fc346b19de --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile_disable.svg new file mode 100755 index 0000000000..ec09f32baa --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile.svg new file mode 100755 index 0000000000..cda2a6cb93 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile_disable.svg new file mode 100755 index 0000000000..abc7f19695 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile_disable.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile.svg new file mode 100755 index 0000000000..e3e9893bba --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile_disable.svg new file mode 100755 index 0000000000..3201b3d581 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile_disable.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked.svg new file mode 100755 index 0000000000..9c5f01a364 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked_disable.svg new file mode 100755 index 0000000000..86a33a5c38 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked_disable.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile.svg new file mode 100755 index 0000000000..8143080cac --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile_disable.svg new file mode 100755 index 0000000000..fad1fa2a1c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile_disable.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import.svg new file mode 100755 index 0000000000..3faf981f21 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import_disable.svg new file mode 100755 index 0000000000..04fd0b9b4a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import_disable.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile.svg new file mode 100755 index 0000000000..70e75f46c7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile_disable.svg new file mode 100755 index 0000000000..712692d1bd --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile_disable.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked.svg new file mode 100755 index 0000000000..8bd63be484 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked_disable.svg new file mode 100755 index 0000000000..b2fb1bc31a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked_disable.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile.svg new file mode 100755 index 0000000000..6c64fd7241 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile_disable.svg new file mode 100755 index 0000000000..709124b0d6 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile.svg new file mode 100755 index 0000000000..6a65b848ba --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile_disable.svg new file mode 100755 index 0000000000..809c5f12e7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile_disable.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile.svg new file mode 100755 index 0000000000..cb3bfd8924 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile_disable.svg new file mode 100755 index 0000000000..0b1d5f818b --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile.svg new file mode 100755 index 0000000000..f2e2e3c2f8 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile_disable.svg new file mode 100755 index 0000000000..53acf3252e --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile_disable.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile.svg new file mode 100755 index 0000000000..32e7d50fd2 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile_disable.svg new file mode 100755 index 0000000000..5ddc6a39cf --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile.svg new file mode 100755 index 0000000000..97756c235c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile_disable.svg new file mode 100755 index 0000000000..4c05097233 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile_disable.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile.svg new file mode 100755 index 0000000000..27be0dcb20 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile_disable.svg new file mode 100755 index 0000000000..dc1ad39412 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile.svg new file mode 100755 index 0000000000..9146d94cc6 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile_disable.svg new file mode 100755 index 0000000000..6f97ecfc05 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile.svg new file mode 100755 index 0000000000..527e0a204e --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile_disable.svg new file mode 100755 index 0000000000..37a41dc9d5 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile.svg new file mode 100755 index 0000000000..f24f8bb647 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile_disable.svg new file mode 100755 index 0000000000..441ed97a70 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile_disable.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile.svg new file mode 100755 index 0000000000..6dc5bab611 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile_disable.svg new file mode 100755 index 0000000000..80ae82c64d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile_disable.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile.svg new file mode 100755 index 0000000000..ea58c34918 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile_disable.svg new file mode 100755 index 0000000000..ccd9aae917 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile_disable.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile.svg new file mode 100755 index 0000000000..c5b68c24d0 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile_disable.svg new file mode 100755 index 0000000000..4aaa3dfc2c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + From 5afe8a59f33e5a6b8be6fa663edc73c43d4d41af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Thu, 28 Dec 2023 10:05:56 +0800 Subject: [PATCH 063/302] =?UTF-8?q?REPORT-111995=20=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=A0=BC=E7=BC=96=E8=BE=91=E9=9D=A2=E6=9D=BF=E5=B8=83=E5=B1=80?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/quickeditor/CellQuickEditor.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java index 504dc1e4b9..66d3047c45 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java @@ -1,6 +1,7 @@ package com.fr.quickeditor; import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.utils.FineUIScale; import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.GraphHelper; import com.fr.base.Style; @@ -69,14 +70,13 @@ public abstract class CellQuickEditor extends QuickEditor { /** * 滚动条相关配置 */ - private static final int MAXVALUE = 100; - private static final int CONTENT_PANE_WIDTH_GAP = 3; + private static final int MAXVALUE = FineUIScale.scale(100); + private static final int SCROLLBAR_WIDTH = FineUIScale.scale(10); private static final int MOUSE_WHEEL_SPEED = 5; - private static final int SCROLLBAR_WIDTH = 7; private UILabel cellLabel; - private int maxHeight = 280; - private static final int TITLE_HEIGHT = 50; + private int maxHeight = FineUIScale.scale(280); + private static final int TITLE_HEIGHT = FineUIScale.scale(50); /** * 面板配置 @@ -142,7 +142,7 @@ public abstract class CellQuickEditor extends QuickEditor { int width = parent.getWidth(); int height = parent.getHeight(); leftContentPane.setBounds(0, -beginY, width - SCROLLBAR_WIDTH, height + beginY); - scrollBar.setBounds(width - SCROLLBAR_WIDTH - CONTENT_PANE_WIDTH_GAP, 0, SCROLLBAR_WIDTH + CONTENT_PANE_WIDTH_GAP, height); + scrollBar.setBounds(width - SCROLLBAR_WIDTH, 0, SCROLLBAR_WIDTH, height); leftContentPane.validate(); } }); @@ -333,9 +333,9 @@ public abstract class CellQuickEditor extends QuickEditor { } }); - scrollBar.setPreferredSize(new Dimension(SCROLLBAR_WIDTH + CONTENT_PANE_WIDTH_GAP, this.getHeight())); - scrollBar.setBlockIncrement(SCROLLBAR_WIDTH + CONTENT_PANE_WIDTH_GAP); - scrollBar.setBorder(BorderFactory.createMatteBorder(0, CONTENT_PANE_WIDTH_GAP, 0, 0, this.getBackground())); + scrollBar.setPreferredSize(new Dimension(SCROLLBAR_WIDTH, this.getHeight())); + scrollBar.setBlockIncrement(SCROLLBAR_WIDTH); + scrollBar.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 0, this.getBackground())); } /** From 5b91851bc7cafee363c8021d8a00f538e1cd5431 Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 28 Dec 2023 10:34:55 +0800 Subject: [PATCH 064/302] REPORT-99485 buttonui --- .../fine/theme/light/ui/FineButtonBorder.java | 42 +++ .../com/fine/theme/light/ui/FineButtonUI.java | 114 +++++++ .../light/ui/FineCombinationButtonUI.java | 88 ++++++ .../fine/theme/light/ui/FineLightIconSet.java | 1 + .../theme/utils/FineClientProperties.java | 77 +++++ .../com/fine/theme/utils/FineUIUtils.java | 130 +++++++- .../gui/ibutton/UICombinationButton.java | 286 ++++++++++-------- .../theme/light/ui/laf/FineLaf.properties | 7 +- .../light/ui/laf/FineLightLaf.properties | 123 ++++++-- .../components/ButtonStoryBoard.java | 130 +++++++- 10 files changed, 833 insertions(+), 165 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineButtonBorder.java create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineButtonUI.java create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineCombinationButtonUI.java diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonBorder.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonBorder.java new file mode 100644 index 0000000000..16405a1552 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonBorder.java @@ -0,0 +1,42 @@ +package com.fine.theme.light.ui; + +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatButtonBorder; + +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Paint; + +import static com.fine.theme.light.ui.FineButtonUI.isPartRoundButton; + +/** + * 按钮边框 + * + * @author vito + * @since 11.0 + * Created on 2023/12/20 + */ +public class FineButtonBorder extends FlatButtonBorder { + + public FineButtonBorder() { + } + + + @Override + public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { + if (isPartRoundButton(c)) { + Graphics2D g2 = (Graphics2D) g.create(); + Paint borderPaint = getBorderColor(c); + if (borderPaint == null) { + return; + } + g2.setPaint(borderPaint); + FineUIUtils.paintPartRoundButtonBorder(c, g2, x, y, width, height, borderWidth, (float) getArc(c)); + } else { + super.paintBorder(c, g, x, y, width, height); + } + } + + +} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonUI.java new file mode 100644 index 0000000000..d5b3c17f74 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonUI.java @@ -0,0 +1,114 @@ +package com.fine.theme.light.ui; + +import com.fine.theme.utils.FineClientProperties; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatButtonUI; +import com.formdev.flatlaf.ui.FlatUIUtils; + +import javax.swing.AbstractButton; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.geom.Path2D; + +import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; + +/** + * 按钮UI + * + * @author vito + * @since 11.0 + * Created on 2023/12/20 + */ +public class FineButtonUI extends FlatButtonUI { + + /** + * @param shared + * @since 2 + */ + protected FineButtonUI(boolean shared) { + super(shared); + } + + /** + * 是否左圆角矩形 + * + * @param c 组件 + * @return 是否左圆角矩形 + */ + public static boolean isLeftRoundButton(Component c) { + return c instanceof JButton + && FineClientProperties.BUTTON_TYPE_LEFT_ROUND_RECT.equals(getButtonTypeStr((JButton) c)); + } + + /** + * 是否右圆角矩形 + * + * @param c 组件 + * @return 是否右圆角矩形 + */ + public static boolean isRightRoundButton(Component c) { + return c instanceof JButton + && FineClientProperties.BUTTON_TYPE_RIGHT_ROUND_RECT.equals(getButtonTypeStr((JButton) c)); + } + + /** + * 是否部分圆角矩形 + * + * @param c 组件 + * @return 是否部分圆角矩形 + */ + public static boolean isPartRoundButton(Component c) { + return isLeftRoundButton(c) || isRightRoundButton(c); + } + + protected void paintBackground(Graphics g, JComponent c) { + if (isPartRoundButton(c)) { + Color background = getBackground(c); + if (background == null) { + return; + } + + Graphics2D g2 = (Graphics2D) g.create(); + try { + FlatUIUtils.setRenderingHints(g2); + float arc = FlatUIUtils.getBorderArc(c); + int width = c.getWidth(); + int height = c.getHeight(); + + g2.setColor(FlatUIUtils.deriveColor(background, getBackgroundBase(c, false))); + Path2D path2DLeft; + if (isLeftRoundButton(c)) { + path2DLeft = FineUIUtils.createLeftRoundRectangle(0, 0, width, height, arc); + } else { + path2DLeft = FineUIUtils.createRightRoundRectangle(0, 0, width, height, arc); + } + g2.fill(path2DLeft); + } finally { + g2.dispose(); + } + } else { + super.paintBackground(g, c); + } + } + + /** + * 创建UI + */ + public static ComponentUI createUI(JComponent c) { + return new FineButtonUI(false); + } + + static String getButtonTypeStr(AbstractButton c) { + Object value = c.getClientProperty(BUTTON_TYPE); + if (value instanceof String) { + return (String) value; + } + return null; + } + +} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineCombinationButtonUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineCombinationButtonUI.java new file mode 100644 index 0000000000..ea617a090b --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineCombinationButtonUI.java @@ -0,0 +1,88 @@ +package com.fine.theme.light.ui; + +import com.fine.theme.utils.FineClientProperties; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatPanelUI; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.fr.design.gui.ibutton.UICombinationButton; + +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; +import java.awt.Color; +import java.awt.Graphics; +import java.beans.PropertyChangeEvent; + +import static com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; + +/** + * @author vito + * @since 11.0 + * Created on 2023/12/21 + */ +public class FineCombinationButtonUI extends FlatPanelUI { + @Styleable(dot = true) + protected Color background; + + @Styleable(dot = true) + protected int arc; + + @Styleable(dot = true) + protected Color borderColor; + + /** + * @param shared + * @since 2 + */ + protected FineCombinationButtonUI(boolean shared) { + super(shared); + } + + /** + * 创建UI + * + * @param c 组件 + * @return ComponentUI + */ + public static ComponentUI createUI(JComponent c) { + return new FineCombinationButtonUI(false); + } + + @Override + public void installUI(JComponent c) { + super.installUI(c); + background = FineUIUtils.getUIColor("CombinationButton.background", "desktop"); + borderColor = FineUIUtils.getUIColor("CombinationButton.borderColor", "CombinationButton.secondary.background"); + arc = FineUIUtils.getUIInt("CombinationButton.arc", "Component.arc"); + } + + @Override + public void uninstallUI(JComponent c) { + super.uninstallUI(c); + } + + @Override + public void paint(Graphics g, JComponent c) { + paintBackground(g, c); + super.paint(g, c); + } + + protected void paintBackground(Graphics g, JComponent c) { + FlatUIUtils.setRenderingHints(g); + g.setColor(background); + g.fillRoundRect(0, 0, c.getWidth(), c.getHeight(), arc, arc); + } + + @Override + public void propertyChange(PropertyChangeEvent e) { + super.propertyChange(e); + switch (e.getPropertyName()) { + case FineClientProperties.STYLE_CLASS: + UICombinationButton b = (UICombinationButton) e.getSource(); + b.setPrimary(); + b.repaint(); + break; + default: + break; + } + } +} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index b7fd93133b..28b9996671 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -147,6 +147,7 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("sort_asc", "com/fine/theme/icon/toolbar/sort_asc.svg", true), new SvgIconSource("tool_edit", "com/fine/theme/icon/toolbar/edit.svg", true), new SvgIconSource("tool_edit_white", "com/fine/theme/icon/toolbar/edit_white.svg", true), + new SvgIconSource("tool_more", "com/fine/theme/icon/toolbar/more.svg", true), // 参数面板 new SvgIconSource("param_edit", "com/fine/theme/icon/param/edit.svg", true, 24), diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java b/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java index ab6384aef6..72effbc10b 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java @@ -1,7 +1,10 @@ package com.fine.theme.utils; +import com.finebi.cbb.utils.StringUtils; import com.formdev.flatlaf.FlatClientProperties; +import javax.swing.JComponent; + /** * FR-UI中使用的各类属性 * @@ -13,4 +16,78 @@ public interface FineClientProperties extends FlatClientProperties { String BUTTON_TYPE_GROUP = "group"; + String STYLE_PRIMARY = "primary"; + String STYLE_SECONDARY = "secondary"; + String STYLE_SIZE_MEDIUM = "medium"; + String STYLE_SIZE_SMALL = "small"; + + String BUTTON_TYPE_LEFT_ROUND_RECT = "leftRoundRect"; + String BUTTON_TYPE_RIGHT_ROUND_RECT = "rightRoundRect"; + + /** + * 添加组件的样式类,类似css,该方法会接在原样式后方 + * + * FineClientProperties.appendStyle("primary small") + * + * + * @param it 组件 + * @param styleClass 样式字符串,支持连续添加类,用空格 + */ + static void appendStyle(JComponent it, String styleClass) { + Object oriProperty = it.getClientProperty(FineClientProperties.STYLE_CLASS); + if (oriProperty instanceof String && StringUtils.isNotBlank((String) oriProperty)) { + styleClass = oriProperty + " " + styleClass; + } + it.putClientProperty(FineClientProperties.STYLE_CLASS, styleClass); + } + + /** + * 设置组件的样式类,类似css,该方法会替换原样式 + * + * FineClientProperties.setStyle("primary small") + * + * + * @param jComponent 组件 + * @param styleClass 样式字符串,支持连续添加类,用空格 + */ + static void setStyle(JComponent jComponent, String styleClass) { + jComponent.putClientProperty(FineClientProperties.STYLE_CLASS, styleClass); + } + + /** + * 样式组合 + * + * @param styleClasses 所有样式 + * @return 样式列表 + */ + static String join(String... styleClasses) { + final StringBuilder sb = new StringBuilder(); + for (final String style : styleClasses) { + if (style == null) { + continue; + } + if (sb.length() > 0) { + sb.append(" "); + } + sb.append(style); + } + return sb.toString(); + } + + /** + * 包含样式 + * + * @param jComponent 组件 + * @param styleClass 样式 + * @return 是否包含指定的样式 + */ + static boolean hasStyle(JComponent jComponent, String styleClass) { + Object style = jComponent.getClientProperty(FineClientProperties.STYLE_CLASS); + if (style instanceof String && StringUtils.isNotBlank((String) style)) { + return ((String) style).contains(styleClass); + } + return false; + } + + } diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java index e3065c16fc..8a1e135097 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java @@ -6,15 +6,20 @@ import com.fr.value.AtomicClearableLazyValue; import javax.swing.UIManager; import java.awt.Color; +import java.awt.Component; import java.awt.Composite; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Insets; +import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; import java.lang.reflect.Field; +import static com.fine.theme.light.ui.FineButtonUI.isLeftRoundButton; +import static com.formdev.flatlaf.util.UIScale.scale; + /** * UI绘制的一些常用方法 * @@ -133,7 +138,7 @@ public class FineUIUtils { /** * 通过key获取UI的边距,如果没有则使用后备边距 * - * @param key 边距key + * @param key 边距key * @param defaultInsets 后备边距 * @return 边距 */ @@ -178,4 +183,127 @@ public class FineUIUtils { g2d.setComposite(oldComposite); } + + /** + * 绘制部分圆角矩形边框 + * + * @param g2 Graphics2D + * @param x x坐标 + * @param y y坐标 + * @param width 宽度 + * @param height 高度 + * @param borderWidth 边框宽度 + * @param arc 圆角 + */ + public static void paintPartRoundButtonBorder(Component c, Graphics2D g2, int x, int y, int width, int height, + float borderWidth, float arc) { + FlatUIUtils.setRenderingHints(g2); + arc = scale(arc); + float t = scale(borderWidth); + float t2x = t * 2; + Path2D path2D = new Path2D.Float(Path2D.WIND_EVEN_ODD); + if (isLeftRoundButton(c)) { + path2D.append(createLeftRoundRectangle(x, y, width, height, arc), false); + path2D.append(createLeftRoundRectangle(x + t, y + t, width - t, height - t2x, arc - t), false); + } else { + path2D.append(createRightRoundRectangle(x, y, width, height, arc), false); + path2D.append(createRightRoundRectangle(x, y + t, width - t, height - t2x, arc - t), false); + } + g2.fill(path2D); + } + + /** + * 绘制圆角tab边框 + * + * @param g2 Graphics2D + * @param x x坐标 + * @param y y坐标 + * @param width 宽度 + * @param height 高度 + * @param borderWidth 边框宽度 + * @param arc 圆角 + */ + public static void paintRoundTabBorder(Graphics2D g2, double x, double y, double width, double height, + float borderWidth, float arc) { + FlatUIUtils.setRenderingHints(g2); + arc = scale(arc); + float t = scale(borderWidth); + float t2x = t * 2; + Path2D path2D = new Path2D.Float(Path2D.WIND_EVEN_ODD); + path2D.append(createTopRoundRectangle(x, y, width, height, arc), false); + path2D.append(createTopRoundRectangle(x + t, y + t, width - t2x, height - t2x, arc - t), false); + g2.fill(path2D); + } + + + /** + * 创建一个左圆角矩形路径 + * + * @param x x坐标 + * @param y y坐标 + * @param width 矩形宽度 + * @param height 矩形高度 + * @param arc 圆角弧度 + * @return 路径 + */ + public static Path2D createLeftRoundRectangle(float x, float y, float width, float height, float arc) { + Path2D path = new Path2D.Float(Path2D.WIND_EVEN_ODD, 7); + path.moveTo(x, y + arc); + path.lineTo(x, y + height - arc); + path.quadTo(x, y + height, x + arc, y + height); + path.lineTo(x + width, y + height); + path.lineTo(x + width, y); + path.lineTo(x + arc, y); + path.quadTo(x, y, x, arc + y); + path.closePath(); + return path; + } + + + /** + * 创建一个右圆角矩形路径 + * + * @param x x坐标 + * @param y y坐标 + * @param width 矩形宽度 + * @param height 矩形高度 + * @param arc 圆角弧度 + * @return 路径 + */ + public static Path2D createRightRoundRectangle(float x, float y, float width, float height, float arc) { + Path2D path = new Path2D.Float(Path2D.WIND_EVEN_ODD, 7); + path.moveTo(x, y); + path.lineTo(x, y + height); + path.lineTo(x + width - arc, y + height); + path.quadTo(x + width, y + height, x + width, y + height - arc); + path.lineTo(x + width, y + arc); + path.quadTo(x + width, y, x + width - arc, y); + path.lineTo(x, y); + path.closePath(); + return path; + } + + /** + * 创建一个顶圆角矩形路径 + * + * @param x x坐标 + * @param y y坐标 + * @param width 矩形宽度 + * @param height 矩形高度 + * @param arc 圆角弧度 + * @return 路径 + */ + public static Path2D createTopRoundRectangle(double x, double y, double width, double height, double arc) { + Path2D path = new Path2D.Double(Path2D.WIND_EVEN_ODD, 7); + path.moveTo(x, y + height); + path.lineTo(x, y + arc); + path.quadTo(x, y, x + arc, y); + path.lineTo(x + width - arc, y); + path.quadTo(x + width, y, x + width, y + arc); + path.lineTo(x + width, y + height); + path.lineTo(x, y + height); + path.closePath(); + return path; + } + } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java index 4a24c8de25..da48b216d4 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java @@ -1,143 +1,163 @@ package com.fr.design.gui.ibutton; -import java.awt.BorderLayout; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; +import com.fr.design.constants.UIConstants; +import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.Icon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JPopupMenu; +import java.awt.BorderLayout; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.function.Consumer; -import com.fr.design.constants.UIConstants; -import com.fr.stable.Constants; -import com.fr.design.utils.gui.GUICoreUtils; +import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE_LEFT_ROUND_RECT; +import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE_RIGHT_ROUND_RECT; +import static com.fine.theme.utils.FineClientProperties.STYLE_PRIMARY; +import static com.fine.theme.utils.FineClientProperties.setStyle; +import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; + +public class UICombinationButton extends JPanel { + private static final String UI_CLASS_ID = "CombinationButtonUI"; + + protected UIButton leftButton; + protected UIButton rightButton; + + + private Consumer leftClickLister; + private Consumer rightClickLister; + + protected void leftButtonClickEvent() { + // 左边按钮点击事件 + } + + protected void rightButtonClickEvent() { + // 右边按钮点击事件 + } + + public UICombinationButton() { + this(new UIButton(), new UIButton()); + } + + + /** + * 添加左按钮监听器 + * + * @param lister 监听 + */ + public void addLeftClickLister(Consumer lister) { + this.leftClickLister = lister; + } + + /** + * 添加右按钮监听器 + * + * @param lister 监听 + */ + public void addRightClickLister(Consumer lister) { + this.rightClickLister = lister; + } + + public UICombinationButton(UIButton left, UIButton right) { + leftButton = left; + leftButton.putClientProperty(BUTTON_TYPE, BUTTON_TYPE_LEFT_ROUND_RECT); + rightButton = right; + rightButton.putClientProperty(BUTTON_TYPE, BUTTON_TYPE_RIGHT_ROUND_RECT); + leftButton.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (leftClickLister != null) { + leftClickLister.accept(e); + } else { + leftButtonClickEvent(); + } + } + }); + rightButton.addMouseListener(new MouseAdapter() { + + @Override + public void mouseClicked(MouseEvent e) { + if (rightClickLister != null) { + rightClickLister.accept(e); + } else { + rightButtonClickEvent(); + } + } + }); + + this.setLayout(new BorderLayout()); + this.add(leftButton, BorderLayout.WEST); + this.add(rightButton, BorderLayout.EAST); + } + + public UICombinationButton(String left, Icon right) { + this(); + leftButton.setText(left); + rightButton.setIcon(right); + } + + public UICombinationButton(String left, String right) { + this(); + leftButton.setText(left); + rightButton.setText(right); + } + + public UICombinationButton(Icon left, Icon right) { + this(); + leftButton.setIcon(left); + rightButton.setIcon(right); + } + + @Override + public String getUIClassID() { + return UI_CLASS_ID; + } + + public void setPrimary() { + setStyle(leftButton, STYLE_PRIMARY); + setStyle(rightButton, STYLE_PRIMARY); + } + + public UIButton getLeftButton() { + return leftButton; + } + + public void setExtraPainted(boolean isExtraPainted) { +// if (!isExtraPainted) { +// leftButton.setBackground(null); +// rightButton.setBackground(null); +// leftButton.setOpaque(false); +// rightButton.setOpaque(false); +// } + } + + public UIButton getRightButton() { + return rightButton; + } + + public void set4Toolbar() { + leftButton.setNormalPainted(false); + rightButton.setNormalPainted(false); + leftButton.setBorderPaintedOnlyWhenPressed(true); + rightButton.setBorderPaintedOnlyWhenPressed(true); + } + + protected void showPopWindow(JPopupMenu menu) { + GUICoreUtils.showPopupMenu(menu, this, 0, getY() + getHeight() - 3); + } + + public static void main(String... args) { + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(null); -public class UICombinationButton extends JPanel{ - protected UIButton leftButton; - protected UIButton rightButton; - - protected void leftButtonClickEvent() { - // 左边按钮点击事件 - } - - protected void rightButtonClickEvent() { - // 右边按钮点击事件 - } - - public UICombinationButton() { - this(new UIButton(), new UIButton()); - } - - public UICombinationButton(UIButton left, UIButton right) { - leftButton = left; - rightButton = right; - - leftButton.setRoundBorder(true, Constants.RIGHT); - rightButton.setRoundBorder(true, Constants.LEFT); - - leftButton.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - rightButton.getModel().setPressed(true); - rightButton.getModel().setSelected(true); - rightButton.repaint(); - } - - @Override - public void mouseReleased(MouseEvent e) { - rightButton.getModel().setPressed(false); - rightButton.getModel().setSelected(false); - rightButton.repaint(); - } - @Override - public void mouseClicked(MouseEvent e) { - leftButtonClickEvent(); - } - }); - rightButton.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - leftButton.getModel().setPressed(true); - leftButton.getModel().setSelected(true); - leftButton.repaint(); - } - - @Override - public void mouseReleased(MouseEvent e) { - leftButton.getModel().setPressed(false); - leftButton.getModel().setSelected(false); - leftButton.repaint(); - } - - @Override - public void mouseClicked(MouseEvent e) { - rightButtonClickEvent(); - } - }); - - this.setLayout(new BorderLayout()); - this.add(leftButton, BorderLayout.CENTER); - this.add(rightButton, BorderLayout.EAST); - } - - public UICombinationButton(String left, Icon right) { - this(); - leftButton.setText(left); - rightButton.setIcon(right); - } - - public UICombinationButton(String left, String right) { - this(); - leftButton.setText(left); - rightButton.setText(right); - } - - public UICombinationButton(Icon left, Icon right) { - this(); - leftButton.setIcon(left); - rightButton.setIcon(right); - } - - public UIButton getLeftButton() { - return leftButton; - } - - public void setExtraPainted(boolean isExtraPainted) { - if(!isExtraPainted) { - leftButton.setBackground(null); - rightButton.setBackground(null); - leftButton.setOpaque(false); - rightButton.setOpaque(false); - } - } - - public UIButton getRightButton() { - return rightButton; - } - - public void set4Toolbar() { - leftButton.setNormalPainted(false); - rightButton.setNormalPainted(false); - leftButton.setBorderPaintedOnlyWhenPressed(true); - rightButton.setBorderPaintedOnlyWhenPressed(true); - } - - protected void showPopWindow(JPopupMenu menu) { - GUICoreUtils.showPopupMenu(menu, this, 0, getY() + getHeight() - 3); - } - - public static void main(String... args) { - JFrame jf = new JFrame("test"); - jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JPanel content = (JPanel)jf.getContentPane(); - content.setLayout(null); - - UICombinationButton bb = new UICombinationButton("123455", UIConstants.ARROW_DOWN_ICON); - bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); - content.add(bb); - GUICoreUtils.centerWindow(jf); - jf.setSize(400, 400); - jf.setVisible(true); - } + UICombinationButton bb = new UICombinationButton("123455", UIConstants.ARROW_DOWN_ICON); + bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); + content.add(bb); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } } \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties index adb218b4a6..fd9df53c87 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties @@ -1,6 +1,6 @@ # \u516C\u5171\u5C5E\u6027\uFF0C\u5982UI\u7B49\uFF0C\u5176\u4ED6\u4E3B\u9898\u7EE7\u627F\u8BE5\u4E3B\u9898\uFF0C\u9632\u6B62\u51FA\u73B0UI\u4E0D\u5B58\u5728\u7B49\u95EE\u9898 #---- UI delegates ---- -ButtonUI=com.formdev.flatlaf.ui.FlatButtonUI +ButtonUI=com.fine.theme.light.ui.FineButtonUI CheckBoxUI=com.fine.theme.light.ui.FineCheckBoxUI CheckBoxMenuItemUI=com.formdev.flatlaf.ui.FlatCheckBoxMenuItemUI ColorChooserUI=com.formdev.flatlaf.ui.FlatColorChooserUI @@ -44,7 +44,8 @@ ToolTipUI=com.fine.theme.light.ui.FineTooltipUI TreeUI=com.fine.theme.light.ui.UIFlatTreeUI ViewportUI=com.formdev.flatlaf.ui.FlatViewportUI HeadGroupUI=com.fine.theme.light.ui.FineHeadGroupUI -ButtonGroupUI= com.fine.theme.light.ui.FineButtonGroupUI -SelectBoxUI= com.fine.theme.light.ui.FineSelectBoxUI +ButtonGroupUI=com.fine.theme.light.ui.FineButtonGroupUI +SelectBoxUI=com.fine.theme.light.ui.FineSelectBoxUI +CombinationButtonUI=com.fine.theme.light.ui.FineCombinationButtonUI InputUI=com.fine.theme.light.ui.FineInputUI GradientBarUI=com.fine.theme.light.ui.FineGradientBarUI \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index d0241bc58e..0184ae3b18 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -59,7 +59,7 @@ Component.defaultVGap=10 @disabledForeground = tint(@foreground,55%) # component background -@buttonBackground = lighten(@background,5%) +@buttonBackground = #FFF @componentBackground = @background @menuBackground = @background @@ -135,33 +135,50 @@ fill.disabled=#F2F4F8 border.divider=#DADEE7 tooltip.normal=#3F506A tooltip.disabled=#A3ADBD +hover.deep=#e2fbe6 #---- Button ---- -Button.border = com.formdev.flatlaf.ui.FlatButtonBorder -Button.arc = 3 -Button.minimumWidth = 72 +Button.border =com.fine.theme.light.ui.FineButtonBorder +Button.arc = 6 +Button.minimumWidth = 0 Button.margin = 2,12,2,12 Button.iconTextGap = 4 Button.rollover = true Button.defaultButtonFollowsFocus = false -Button.borderWidth = 1 +Button.borderWidth = 2 +Button.medium.margin = 2,12,2,12 +Button.small.margin = 0,10,0,10 Button.background = @buttonBackground -Button.focusedBackground = changeLightness($Component.focusColor,95%) -Button.hoverBackground = darken($Button.background,3%,derived) -Button.pressedBackground = darken($Button.background,10%,derived) +Button.focusedBackground = @buttonBackground +Button.hoverBackground = $fill.hover +Button.pressedBackground = $fill.click Button.selectedBackground = darken($Button.background,20%,derived) Button.selectedForeground = $Button.foreground Button.disabledSelectedBackground = darken($Button.background,13%,derived) +Button.disabledBackground = $fill.disabled Button.borderColor = $Component.borderColor Button.disabledBorderColor = $Component.disabledBorderColor -Button.focusedBorderColor = $Component.focusedBorderColor -Button.hoverBorderColor = $Button.focusedBorderColor +Button.focusedBorderColor = $border.divider +Button.hoverBorderColor = $border.divider Button.innerFocusWidth = 0 +Button.text.background = $Button.background +Button.text.foreground = $Button.foreground +Button.text.focusedBackground = $Button.focusedBackground +Button.text.hoverBackground = darken($Button.default.background,3%,derived) +Button.text.pressedBackground = darken($Button.default.background,10%,derived) +Button.text.borderColor = @accentButtonDefaultBorderColor +Button.text.hoverBorderColor = $Button.hoverBorderColor +Button.text.focusedBorderColor = $Button.focusedBorderColor +Button.text.focusColor = $Component.focusColor +Button.text.borderWidth = 2 + + + Button.default.background = $Button.background Button.default.foreground = $Button.foreground Button.default.focusedBackground = $Button.focusedBackground @@ -179,10 +196,29 @@ Button.toolbar.selectedBackground = $Button.selectedBackground Button.toolbar.margin = 3,3,3,3 Button.toolbar.spacingInsets = 1,2,1,2 +Button.group.background = #FFF +Button.group.selectedBackground = #2576EF +Button.group.pressedBackground = #2576EF +Button.group.selectedForeground = #FFF +Button.group.pressedForeground = #FFF +Button.group.minimumWidth = 32 +Button.group.minimumHeight = 20 +Button.group.arc = $Component.arc + +Button.tab.hoverBackground = darken($Button.background,12%,derived) +#Button.tab.pressedBackground = #DEEAFD +Button.tab.selectedBackground = #DEEAFD +Button.tab.margin = 3,3,3,3 +Button.tab.spacingInsets = 1,2,1,2 + +CombinationButton.background = $Button.background +CombinationButton.borderColor = $Component.borderColor +CombinationButton.arc = $Button.arc + #---- CheckBox ---- CheckBox.border = com.formdev.flatlaf.ui.FlatMarginBorder -CheckBox.icon = com.formdev.flatlaf.icons.FlatCheckBoxIcon +CheckBox.icon = com.fine.theme.icon.AnimatedSwitchIcon CheckBox.arc = 4 CheckBox.margin = 2,2,2,2 CheckBox.iconTextGap = 4 @@ -288,8 +324,8 @@ Component.minimumWidth = 64 Component.arrowType = chevron Component.hideMnemonics = true -Component.borderColor = shade(@background,20%) -Component.disabledBorderColor = tint($Component.borderColor,20%) +Component.borderColor = $defaultBorderColor +Component.disabledBorderColor = $defaultBorderColor Component.focusedBorderColor = shade($Component.focusColor,10%) Component.focusColor = @accentFocusColor Component.linkColor = @accentLinkColor @@ -774,19 +810,19 @@ SplitPaneDivider.draggingColor = $Component.borderColor #---- TabbedPane ---- -TabbedPane.tabHeight = 32 -TabbedPane.tabSelectionHeight = 3 -TabbedPane.cardTabSelectionHeight = 3 +TabbedPane.tabHeight = 30 +TabbedPane.tabSelectionHeight = 0 +TabbedPane.cardTabSelectionHeight = 0 TabbedPane.tabArc = 0 TabbedPane.tabSelectionArc = 0 TabbedPane.cardTabArc = 12 -TabbedPane.selectedInsets = 0,0,0,0 +TabbedPane.selectedInsets = 10,0,0,0 TabbedPane.tabSelectionInsets = 0,0,0,0 TabbedPane.contentSeparatorHeight = 1 -TabbedPane.showTabSeparators = false +TabbedPane.showTabSeparators = true TabbedPane.tabSeparatorsFullHeight = false TabbedPane.hasFullBorder = false -TabbedPane.tabInsets = 4,12,4,12 +TabbedPane.tabInsets = 4,6,4,6 TabbedPane.tabAreaInsets = 0,0,0,0 TabbedPane.selectedTabPadInsets = 0,0,0,0 TabbedPane.tabRunOverlay = 0 @@ -794,6 +830,9 @@ TabbedPane.tabsOverlapBorder = false TabbedPane.disabledForeground = @disabledForeground TabbedPane.shadow = @background TabbedPane.contentBorderInsets = null +TabbedPane.background = $fill.disabled +TabbedPane.selectedBackground = #fff +TabbedPane.tabSeparatorColor = $border.divider # allowed values: moreTabsButton or arrowButtons TabbedPane.hiddenTabsNavigation = moreTabsButton # allowed values: leading, trailing, center or fill @@ -830,21 +869,32 @@ TabbedPane.closeCrossLineWidth = 1 TabbedPane.underlineColor = @accentUnderlineColor TabbedPane.inactiveUnderlineColor = mix(@accentUnderlineColor,$TabbedPane.background,50%) TabbedPane.disabledUnderlineColor = darken(@background,28%) -TabbedPane.hoverColor = #DADEE7 +TabbedPane.hoverColor = $fill.hover TabbedPane.focusColor = mix(@selectionBackground,$TabbedPane.background,10%) -TabbedPane.contentAreaColor = $Component.borderColor +TabbedPane.contentAreaColor = $fill.hover TabbedPane.buttonHoverBackground = darken($TabbedPane.background,7%,derived) TabbedPane.buttonPressedBackground = darken($TabbedPane.background,10%,derived) TabbedPane.closeBackground = null TabbedPane.closeForeground = @disabledForeground -TabbedPane.closeHoverBackground = darken($TabbedPane.background,20%,derived) +TabbedPane.closeHoverBackground = $hover.deep TabbedPane.closeHoverForeground = @foreground TabbedPane.closePressedBackground = darken($TabbedPane.background,25%,derived) TabbedPane.closePressedForeground = $TabbedPane.closeHoverForeground - +#---- TemplateTabPane ---- +TemplateTabPane.tabHeight = 30 +TemplateTabPane.tabSelectionHeight = 0 +TemplateTabPane.cardTabSelectionHeight = 0 +TemplateTabPane.selectedInsets = 10,0,0,0 +TemplateTabPane.hoverColor = $fill.hover +TemplateTabPane.contentAreaColor = $fill.hover +TemplateTabPane.background = $fill.disabled +TemplateTabPane.selectedBackground = #fff +TemplateTabPane.tabSeparatorColor = $border.divider +TemplateTabPane.closeHoverBackground = $hover.deep +TemplateTabPane.tabInsets = 4,6,4,6 #---- Table ---- Table.rowHeight = 20 @@ -1175,6 +1225,33 @@ CellOtherSetPane.height=$Component.defaultHeight toolbar.pressedBackground: darken($TextField.background,8%); \ toolbar.selectedBackground: darken($TextField.background,12%) +[style]Button.primary = \ + background : @BrandColor; \ + foreground : #FFF; \ + focusedBackground : #5493F2; \ + hoverBackground : #5493F2; \ + pressedBackground : #105DD1; \ + disabledSelectedBackground : #F2F4F8; \ + borderWidth : 0 + +[style]Button.small = margin : 0,10,0,10; + +[style]Button.secondary = \ + background : $Button.background; \ + foreground : $Button.foreground; \ + focusedBackground : $Button.focusedBackground; \ + hoverBackground : darken($Button.default.background,3%,derived); \ + pressedBackground : darken($Button.default.background,10%,derived); \ + borderColor : @accentButtonDefaultBorderColor; \ + hoverBorderColor : $Button.hoverBorderColor; \ + focusedBorderColor : $Button.focusedBorderColor; \ + focusColor : $Component.focusColor; \ + borderWidth : 2 + +[style]CombinationButton.primary = \ + background : @BrandColor; \ + arc : 3 + #---- clearButton ---- # for clear/cancel button in text fields diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java index bc157a2f57..e0d0dad170 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java @@ -2,14 +2,21 @@ package com.fr.design.gui.storybook.components; import com.fine.theme.icon.LazyIcon; import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ibutton.UICombinationButton; +import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.storybook.Story; import com.fr.design.gui.storybook.StoryBoard; import javax.swing.JButton; import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; import static com.fine.swing.ui.layout.Layouts.flex; import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineClientProperties.STYLE_PRIMARY; +import static com.fine.theme.utils.FineClientProperties.STYLE_SIZE_SMALL; +import static com.fine.theme.utils.FineClientProperties.join; +import static com.fine.theme.utils.FineClientProperties.setStyle; /** * 按钮 @@ -23,14 +30,127 @@ public class ButtonStoryBoard extends StoryBoard { public ButtonStoryBoard() { super("按钮"); + setSpacing(16); add( - row(10, - cell(new UIButton("按钮")), - cell(new UIButton("保存", new LazyIcon("save"))), - cell(new UIButton(new LazyIcon("multi"))) + row(30, true, + column(16, + cell(new UILabel(STYLE_PRIMARY)).with(this::h2), + cell(new UILabel("medium")).with(this::h3), + row(20, + cell(new UILabel("正常")), + cell(new UIButton("按钮")) + .with(it -> setStyle(it, STYLE_PRIMARY)), + cell(new UIButton("按钮", new LazyIcon("add"))) + .with(it -> setStyle(it, STYLE_PRIMARY)), + cell(new UIButton(new LazyIcon("multi"))) + .with(it -> setStyle(it, STYLE_PRIMARY)) + ), + row(20, + cell(new UILabel("禁用")), + cell(new UIButton("按钮")).with(it -> { + setStyle(it, STYLE_PRIMARY); + it.setEnabled(false); + }), + cell(new UIButton("保存", new LazyIcon("save"))).with(it -> { + setStyle(it, STYLE_PRIMARY); + it.setEnabled(false); + }), + cell(new UIButton(new LazyIcon("add"))).with(it -> { + setStyle(it, STYLE_PRIMARY); + it.setEnabled(false); + }) + ), + cell(new UILabel("small")).with(this::h3), + row(20, + cell(new UILabel("正常")), + cell(new UIButton("按钮")) + .with(it -> setStyle(it, join(STYLE_PRIMARY, STYLE_SIZE_SMALL))), + cell(new UIButton("按钮", new LazyIcon("add"))) + .with(it -> setStyle(it, join(STYLE_PRIMARY, STYLE_SIZE_SMALL))), + cell(new UIButton(new LazyIcon("multi"))) + .with(it -> setStyle(it, join(STYLE_PRIMARY, STYLE_SIZE_SMALL))) + ), + row(20, + cell(new UILabel("禁用")), + cell(new UIButton("按钮")).with(it -> { + setStyle(it, join(STYLE_PRIMARY, STYLE_SIZE_SMALL)); + it.setEnabled(false); + }), + cell(new UIButton("保存", new LazyIcon("save"))).with(it -> { + setStyle(it, join(STYLE_PRIMARY, STYLE_SIZE_SMALL)); + it.setEnabled(false); + }), + cell(new UIButton(new LazyIcon("add"))).with(it -> { + setStyle(it, join(STYLE_PRIMARY, STYLE_SIZE_SMALL)); + it.setEnabled(false); + }) + ) + ), + column(16, + cell(new UILabel("Secondary")).with(this::h2), + cell(new UILabel("medium")).with(this::h3), + row(20, + cell(new UILabel("正常")).with(it -> setStyle(it, "secondary")), + cell(new UIButton("按钮")), + cell(new UIButton("按钮", new LazyIcon("add"))), + cell(new UIButton(new LazyIcon("multi"))) + ), + row(20, + cell(new UILabel("禁用")), + cell(new UIButton("按钮")).with(it -> it.setEnabled(false)), + cell(new UIButton("保存", new LazyIcon("save"))).with(it -> it.setEnabled(false)), + cell(new UIButton(new LazyIcon("add"))).with(it -> it.setEnabled(false)) + ), + cell(new UILabel("small")).with(this::h3), + row(20, + cell(new UILabel("正常")), + cell(new UIButton("按钮")) + .with(it -> setStyle(it, STYLE_SIZE_SMALL)), + cell(new UIButton("按钮", new LazyIcon("add"))) + .with(it -> setStyle(it, STYLE_SIZE_SMALL)), + cell(new UIButton(new LazyIcon("multi"))) + .with(it -> setStyle(it, STYLE_SIZE_SMALL)) + ), + row(20, + cell(new UILabel("禁用")), + cell(new UIButton("按钮")).with(it -> { + setStyle(it, STYLE_SIZE_SMALL); + it.setEnabled(false); + }), + cell(new UIButton("保存", new LazyIcon("save"))).with(it -> { + setStyle(it, STYLE_SIZE_SMALL); + it.setEnabled(false); + }), + cell(new UIButton(new LazyIcon("add"))).with(it -> { + setStyle(it, STYLE_SIZE_SMALL); + it.setEnabled(false); + }) + ) + ) ), - row(10, + cell(new UILabel("JButton")).with(this::h2), + row(20, + cell(new UILabel("medium")), cell(new JButton("按钮")), + cell(new JButton("按钮", new LazyIcon("add"))), + cell(new JButton(new LazyIcon("multi"))) + ), + row(20, + cell(new UILabel("medium")), + cell(new JButton("按钮")).with(it -> it.setEnabled(false)), + cell(new JButton("保存", new LazyIcon("save"))).with(it -> it.setEnabled(false)), + cell(new JButton(new LazyIcon("add"))).with(it -> it.setEnabled(false)) + ), + row(20, + cell(new UICombinationButton("按钮", new LazyIcon("triangle_down"))) + .with(it -> { + setStyle(it, STYLE_PRIMARY); + it.setExtraPainted(false); + }), + cell(new UICombinationButton("按钮", new LazyIcon("triangle_down"))) + .with(it -> setStyle(it, STYLE_PRIMARY)), + cell(new UICombinationButton("按钮2", new LazyIcon("triangle_down"))), + cell(new JButton("按钮", new LazyIcon("add"))), cell(new JButton(new LazyIcon("multi"))) ), flex() From 357866ce9c4a0fd8c1a679ecf08849de97dc8c1b Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 28 Dec 2023 22:27:18 +0800 Subject: [PATCH 065/302] =?UTF-8?q?REPORT-99485=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A8=A1=E7=89=88tab=E5=92=8C=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E6=A0=8F=E7=BB=98=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 1 + .../theme/light/ui/FineTemplateTabPaneUI.java | 407 +++++++++++ .../com/fine/theme/light/ui/laf/FineLaf.java | 2 +- .../com/fine/theme/utils/FineUIUtils.java | 2 +- .../fr/design/file/MultiTemplateTabPane.java | 690 ++++-------------- .../fr/design/gui/ibutton/UIHeadGroup.java | 1 + .../com/fr/design/gui/itoolbar/UIToolbar.java | 1 - .../mainframe/CenterRegionContainerPane.java | 47 +- .../com/fr/design/mainframe/JTemplate.java | 2 +- .../fr/design/mainframe/JVirtualTemplate.java | 6 +- .../com/fine/theme/icon/clear_hover.svg | 11 + .../com/fine/theme/icon/toolbar/more.svg | 3 + .../fine/theme/icon/toolbar/more_disable.svg | 3 + .../theme/light/ui/laf/FineLaf.properties | 3 +- .../light/ui/laf/FineLightLaf.properties | 7 +- .../storybook/components/JTestTemplate.java | 42 ++ .../components/TemplateTabStoryBoard.java | 36 + .../java/com/fr/design/mainframe/JForm.java | 3 +- .../com/fr/design/mainframe/JWorkBook.java | 3 +- .../main/java/com/fr/start/MainDesigner.java | 124 ++-- 20 files changed, 732 insertions(+), 662 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/clear_hover.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/more.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/more_disable.svg create mode 100644 designer-base/src/test/java/com/fr/design/gui/storybook/components/JTestTemplate.java create mode 100644 designer-base/src/test/java/com/fr/design/gui/storybook/components/TemplateTabStoryBoard.java diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 28b9996671..877eb5eafa 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -139,6 +139,7 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("chart_line", "com/fine/theme/icon/chart/chart_line.svg", true), new SvgIconSource("popup", "com/fine/theme/icon/popup/popup.svg", true), new SvgIconSource("clear", "com/fine/theme/icon/clear.svg", true), + new SvgIconSource("clear_hover", "com/fine/theme/icon/clear_hover.svg", true), // 工具栏 new SvgIconSource("tool_copy", "com/fine/theme/icon/toolbar/copy.svg", true), diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java new file mode 100644 index 0000000000..6a80036019 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java @@ -0,0 +1,407 @@ +package com.fine.theme.light.ui; + +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineClientProperties; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.fr.base.GraphHelper; +import com.fr.base.vcs.DesignerMode; +import com.fr.design.file.MultiTemplateTabPane; +import com.fr.stable.collections.combination.Pair; + +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.PanelUI; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.GradientPaint; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; +import java.awt.geom.Path2D; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; + +import static com.fine.theme.utils.FineUIScale.scale; +import static com.fine.theme.utils.FineUIUtils.paintRoundTabBorder; +import static com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; + +/** + * 文件Tab栏UI + * + * @author vito + * @since 11.0 + * Created on 2023/12/27 + */ +public class FineTemplateTabPaneUI extends PanelUI { + private MultiTemplateTabPane tabPane; + + private static final String ELLIPSIS = "..."; + private static final int iconTextGap = 4; + private static final int LEADING_WIDTH = 0; + private static final int TRAILING_WIDTH = 34; + + + @Styleable(dot = true) + protected Color background; + + @Styleable(dot = true) + protected Color selectedBackground; + + @Styleable(dot = true) + protected Color hoverColor; + + @Styleable(dot = true) + protected Color closeIconHoverBackground; + + @Styleable(dot = true) + protected Color closeHoverBackground; + + @Styleable(dot = true) + protected Color borderColor; + + @Styleable(dot = true) + protected int tabHeight; + + @Styleable(dot = true) + protected int separatorHeight; + + @Styleable(dot = true) + protected int borderWidth; + + @Styleable(dot = true) + protected int tabArc; + + @Styleable(dot = true) + protected Insets tabInsets; + + protected Icon fileIcon; + protected Icon moreAction; + protected Icon addAction; + protected Icon moreHoverAction; + + + private Icon closeIcon; + + private Icon closeHoverIcon; + + private int leadingWidth; + private int trailingWidth; + + protected FineTemplateTabPaneUI() { + + } + + /** + * 创建UI + * + * @param c 组件 + * @return ComponentUI + */ + public static ComponentUI createUI(JComponent c) { + return new FineTemplateTabPaneUI(); + } + + @Override + public void installUI(JComponent c) { + super.installUI(c); + this.tabPane = (MultiTemplateTabPane) c; + closeIcon = new LazyIcon("clear"); + closeHoverIcon = new LazyIcon("clear_hover"); + addAction = new LazyIcon("add_worksheet"); + moreAction = new LazyIcon("tool_more"); + moreHoverAction = new LazyIcon("clear_hover"); + fileIcon = new LazyIcon("cpt_icon"); + FineClientProperties.setStyle(tabPane, "Default"); + leadingWidth = scale(LEADING_WIDTH); + trailingWidth = scale(TRAILING_WIDTH); + + borderWidth = FineUIUtils.getUIInt("TemplateTabPane.borderWidth", "TemplateTabPane.borderWidth"); + tabArc = FineUIUtils.getUIInt("TemplateTabPane.tabArc", "TemplateTabPane.tabArc"); + background = FineUIUtils.getUIColor("TemplateTabPane.background", "TabbedPane.background"); + selectedBackground = FineUIUtils.getUIColor("TemplateTabPane.selectedBackground", "TemplateTabPane.selectedBackground"); + closeHoverBackground = FineUIUtils.getUIColor("TemplateTabPane.closeHoverBackground", "TemplateTabPane.closeHoverBackground"); + borderColor = FineUIUtils.getUIColor("TemplateTabPane.borderColor", "TabbedPane.tabSeparatorColor"); + hoverColor = FineUIUtils.getUIColor("TemplateTabPane.hoverColor", "TemplateTabPane.hoverColor"); + closeIconHoverBackground = FineUIUtils.getUIColor("TemplateTabPane.icon.hoverBackground ", "TemplateTabPane.icon.hoverBackground "); + // ---- scaled ---- + tabInsets = FineUIUtils.getAndScaleUIInsets("TemplateTabPane.tabInsets", new Insets(4, 6, 4, 6)); + tabHeight = FineUIUtils.getAndScaleInt("TemplateTabPane.tabHeight", "TabbedPane.tabHeight"); + separatorHeight = FineUIUtils.getAndScaleInt("TemplateTabPane.separatorHeight", "TemplateTabPane.separatorHeight"); + } + + @Override + public void uninstallUI(JComponent c) { + super.uninstallUI(c); + } + + + @Override + public void update(Graphics g, JComponent c) { + super.update(g, c); + double maxWidth = c.getWidth() - leadingWidth - trailingWidth; + Graphics2D g2d = (Graphics2D) g; + paintDefaultBackground(g2d); + paintPaneUnderLine(c.getWidth(), g2d); + paintTabs(g2d, maxWidth); + } + + private void paintDefaultBackground(Graphics2D g2d) { + //画默认背景 + g2d.setPaint(new GradientPaint(0, 0, tabPane.getBackground(), 1, (float) (tabHeight), tabPane.getBackground())); + g2d.fillRect(0, 0, tabPane.getWidth(), tabHeight); + } + + private void paintPaneUnderLine(float w, Graphics2D g2d) { + g2d.setPaint(borderColor); + float h = (float) tabHeight; + int t = scale(borderWidth); + Path2D border = new Path2D.Float(Path2D.WIND_EVEN_ODD); + border.append(FlatUIUtils.createComponentRectangle(0, 0, w, h, 0), false); + border.append(FlatUIUtils.createComponentRectangle(0, 0, w, h - t, 0), false); + g2d.fill(border); + } + + private void paintTabs(Graphics2D g2d, double maxWidth) { + + int maxStringlength = calculateStringMaxLength(); + if (tabPane.getSelectedIndex() >= tabPane.getTabCount()) { + tabPane.setSelectedIndex(tabPane.getTabCount() - 1); + } + if (tabPane.getSelectedIndex() < 0) { + tabPane.setSelectedIndex(0); + } + double templateStartX = leadingWidth; + + + //从可以开始展示在tab面板上的tab开始画 + Pair viewRange = tabPane.getViewRange(); + for (int i = viewRange.getFirst(); i <= viewRange.getSecond(); i++) { + Icon icon = tabPane.getTemplateIconByIndex(i); + String name = tabPane.getTemplateShowNameByIndex(i); + //如果tab名字的长度大于最大能显示的英文字符长度,则进行省略号处理 + if (getStringWidth(name) > maxStringlength) { + name = getEllipsisName(name, maxStringlength); + } + + + Icon tabcloseIcon = tabPane.isCloseCurrent(i) ? closeHoverIcon : closeIcon; + if (i == tabPane.getSelectedIndex()) { + paintSelectedTab(g2d, icon, templateStartX, name, tabcloseIcon); + } else { + paintUnSelectedTab(g2d, icon, templateStartX, name, tabcloseIcon, + tabPane.getHoverIndex(), i); + } + templateStartX += tabPane.getTabWidth(); + } + + paintSeparators(g2d); + + if (!DesignerMode.isVcsMode()) { + paintTrailingAction(g2d, maxWidth); + } + } + + private void paintSeparators(Graphics2D g2d) { + g2d.setPaint(borderColor); + float x = leadingWidth; + Pair viewRange = tabPane.getViewRange(); + for (int i = viewRange.getFirst(); i <= viewRange.getSecond(); i++) { + if (i != tabPane.getSelectedIndex() + && i + 1 != tabPane.getSelectedIndex()) { + paintSeparator(g2d, x); + } + x += tabPane.getTabWidth(); + } + } + + private void paintLeadingAction(Graphics2D g2d, double tabPaneWidth) { + int x = (leadingWidth - addAction.getIconWidth()) / 2; + int y = (tabHeight - addAction.getIconHeight()) / 2; + if (tabPane.isHoverMoreAction()) { + closeHoverIcon.paintIcon(tabPane, g2d, x, y); + } else { + addAction.paintIcon(tabPane, g2d, x, y); + } + + } + + + private void paintTrailingAction(Graphics2D g2d, double tabPaneWidth) { + int x = leadingWidth + (int) tabPaneWidth + (trailingWidth - moreAction.getIconWidth()) / 2; + int y = (tabHeight - moreAction.getIconHeight()) / 2; + if (tabPane.isHoverMoreAction()) { + closeHoverIcon.paintIcon(tabPane, g2d, x, y); + } else { + moreAction.paintIcon(tabPane, g2d, x, y); + } + + } + + /** + * 判断tab文字的长度大于能装下的最大文字长度,要用省略号 + * + * @param name + * @param maxStringlength + * @return + */ + private String getEllipsisName(String name, int maxStringlength) { + + int ellipsisWidth = getStringWidth(ELLIPSIS); + int leftkeyPoint = 0; + int rightKeyPoint = name.length() - 1; + int leftStrWidth = 0; + int rightStrWidth = 0; + while (leftStrWidth + rightStrWidth + ellipsisWidth < maxStringlength) { + if (leftStrWidth <= rightStrWidth) { + leftkeyPoint++; + } else { + rightKeyPoint--; + } + leftStrWidth = getStringWidth(name.substring(0, leftkeyPoint)); + rightStrWidth = getStringWidth(name.substring(rightKeyPoint)); + + if (leftStrWidth + rightStrWidth + ellipsisWidth > maxStringlength) { + if (leftStrWidth <= rightStrWidth) { + rightKeyPoint++; + } else { + leftkeyPoint--; + } + break; + } + } + return name.substring(0, leftkeyPoint) + ELLIPSIS + name.substring(rightKeyPoint); + } + + /** + * 计算过长度之后的每个tab的能接受的文字的英文字符数 + * + * @return + */ + private int calculateStringMaxLength() { + return tabPane.getTabWidth() + - tabInsets.left - tabInsets.right + - iconTextGap * 2 + - fileIcon.getIconWidth() - closeIcon.getIconWidth(); + + } + + private int getStringWidth(String str) { + FontMetrics fm = GraphHelper.getFontMetrics(tabPane.getFont()); + int size = 0; + for (int i = 0; i < str.length(); i++) { + size += fm.charWidth(str.codePointAt(i)); + } + return size; + } + + + /** + * 画选中的tab + * + * @param g2d + * @param sheeticon + * @param templateStartX + * @param sheetName + * @param closeIcon + * @return + */ + private void paintSelectedTab(Graphics2D g2d, Icon sheeticon, double templateStartX, String sheetName, Icon closeIcon) { + Object[] oriRenderingHints = FlatUIUtils.setRenderingHints(g2d); + // 绘制选中背景 + g2d.setPaint(selectedBackground); + Path2D tabShape = FineUIUtils.createTopRoundRectangle(templateStartX, 0, + tabPane.getTabWidth(), tabHeight, tabArc); + g2d.fill(tabShape); + // 绘制选中边框 + g2d.setPaint(borderColor); + paintRoundTabBorder(g2d, templateStartX, 0, + tabPane.getTabWidth(), tabHeight, borderWidth, (float) tabArc); + FlatUIUtils.resetRenderingHints(g2d, oriRenderingHints); + // 绘制图标 + int sheetIconY = (tabHeight - sheeticon.getIconHeight()) / 2; + sheeticon.paintIcon(tabPane, g2d, (int) templateStartX + tabInsets.left, sheetIconY); + // 绘制字符 + g2d.setPaint(tabPane.getForeground()); + Point2D.Double textPoint = calTextPoint(templateStartX, sheeticon.getIconWidth()); + g2d.drawString(sheetName, (int) textPoint.x, (int) textPoint.y); + int closePosition = (int) templateStartX + tabPane.getTabWidth() + - this.closeIcon.getIconWidth() - tabInsets.right; + int closeY = (tabHeight - closeIcon.getIconHeight()) / 2; + if (!DesignerMode.isVcsMode()) { + closeIcon.paintIcon(tabPane, g2d, closePosition, closeY); + } + } + + private Point2D.Double calTextPoint(double x, int iconWidth) { + FontMetrics fm = tabPane.getFontMetrics(tabPane.getFont()); + int ascent = fm.getAscent(); + int gap = (tabHeight - tabInsets.top - tabInsets.bottom - ascent) / 2; + double y = tabInsets.top + ascent + gap; + return new Point2D.Double(x + iconWidth + tabInsets.left + iconTextGap, y); + } + + + /** + * 画没有选中的tab + * + * @param g2d + * @param sheeticon + * @param templateStartX + * @param sheetName + * @param closeIcon + */ + private void paintUnSelectedTab(Graphics2D g2d, Icon sheeticon, double templateStartX, String sheetName, Icon closeIcon, int mouseOveredIndex, int selfIndex) { + if (selfIndex == mouseOveredIndex) { + g2d.setPaint(hoverColor); + } else { + g2d.setPaint(background); + } + + Object[] oriRenderingHints = FlatUIUtils.setRenderingHints(g2d); + + Path2D tabShape = FineUIUtils.createTopRoundRectangle(templateStartX, 0, + tabPane.getTabWidth(), tabHeight - scale(borderWidth), tabArc); + g2d.fill(tabShape); + + + FlatUIUtils.resetRenderingHints(g2d, oriRenderingHints); + + int sheetIconY = (tabHeight - sheeticon.getIconHeight()) / 2; + sheeticon.paintIcon(tabPane, g2d, (int) templateStartX + tabInsets.left, sheetIconY); + // 画字符 + g2d.setPaint(tabPane.getForeground()); + Point2D.Double textPoint = calTextPoint(templateStartX, sheeticon.getIconWidth()); + g2d.drawString(sheetName, (int) textPoint.x, (int) textPoint.y); + int closeY = (tabHeight - closeIcon.getIconHeight()) / 2; + int closePosition = (int) templateStartX + tabPane.getTabWidth() + - this.closeIcon.getIconWidth() - tabInsets.right; + if (!DesignerMode.isVcsMode()) { + closeIcon.paintIcon(tabPane, g2d, closePosition, closeY); + } + } + + private void paintSeparator(Graphics2D g2d, float templateStartX) { + float x = templateStartX + tabPane.getTabWidth(); + float gap = (tabHeight - separatorHeight) / 2.0f; + g2d.fill(new Rectangle2D.Float(x, gap, scale(borderWidth), tabHeight - gap * 2)); + } + + + @Override + public Dimension getPreferredSize(JComponent c) { + return new Dimension(c.getWidth(), tabHeight); + } + + @Override + public Dimension getMinimumSize(JComponent c) { + return new Dimension(0, tabHeight); + } + + @Override + public Dimension getMaximumSize(JComponent c) { + return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java index 7ab6d6c722..10d6456488 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java @@ -22,7 +22,7 @@ public abstract class FineLaf extends FlatLaf { public String getName() { return NAME; } - + @Override public String getDescription() { return "Fine New Look and Feel"; diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java index 8a1e135097..0448fa82f0 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java @@ -231,7 +231,7 @@ public class FineUIUtils { float t2x = t * 2; Path2D path2D = new Path2D.Float(Path2D.WIND_EVEN_ODD); path2D.append(createTopRoundRectangle(x, y, width, height, arc), false); - path2D.append(createTopRoundRectangle(x + t, y + t, width - t2x, height - t2x, arc - t), false); + path2D.append(createTopRoundRectangle(x + t, y + t, width - t2x, height - t, arc - t), false); g2.fill(path2D); } diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 670e3ca15f..f93cd22434 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -1,8 +1,7 @@ package com.fr.design.file; -import com.fr.base.GraphHelper; -import com.fr.base.svg.IconUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.base.vcs.DesignerMode; import com.fr.design.actions.UpdateAction; import com.fr.design.actions.file.LocateAction; @@ -15,67 +14,45 @@ import com.fr.design.i18n.DesignSizeI18nManager; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; -import com.fr.design.mainframe.TemplateSavingChecker; import com.fr.design.mainframe.manager.search.TemplateTreeSearchManager; -import com.fr.design.utils.DesignUtils; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.design.worker.WorkerManager; import com.fr.design.worker.save.CallbackSaveWorker; import com.fr.file.FILE; import com.fr.file.FileNodeFILE; import com.fr.general.ComparatorUtils; -import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; -import com.fr.stable.Constants; +import com.fr.stable.collections.combination.Pair; import com.fr.third.javax.annotation.Nonnull; import com.fr.workspace.WorkContext; import com.fr.workspace.server.lock.TplOperator; import javax.swing.BorderFactory; -import javax.swing.ButtonModel; import javax.swing.Icon; -import javax.swing.ImageIcon; -import javax.swing.JComponent; -import javax.swing.JMenu; -import javax.swing.JMenuItem; import javax.swing.JOptionPane; +import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.MenuElement; -import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.ToolTipManager; -import javax.swing.plaf.basic.BasicMenuItemUI; import java.awt.AWTEvent; -import java.awt.AlphaComposite; -import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; -import java.awt.GradientPaint; import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.RenderingHints; -import java.awt.event.AWTEventListener; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; -import java.awt.geom.GeneralPath; -import java.awt.geom.Line2D; -import java.awt.geom.Path2D; -import java.awt.geom.RoundRectangle2D; +import java.awt.event.MouseMotionAdapter; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import static com.fine.theme.utils.FineUIScale.scale; import static com.fr.design.dialog.FineJOptionPane.showConfirmDialog; import static javax.swing.JOptionPane.OK_CANCEL_OPTION; import static javax.swing.JOptionPane.OK_OPTION; import static javax.swing.JOptionPane.WARNING_MESSAGE; -// todo: 自己绘制组件 /** * 改个名字,一个拼写 n 个错误 * @@ -84,28 +61,14 @@ import static javax.swing.JOptionPane.WARNING_MESSAGE; *

* created by daisy on 2013/08/05 **/ -public class MultiTemplateTabPane extends JComponent { - - private static Icon LIST_DOWN = IconUtils.readIcon("/com/fr/design/standard/list/list"); - private static Icon MOUSE_OVER_LIST_DOWN = IconUtils.readIcon("/com/fr/design/standard/list/list_pressed.svg"); - private static Icon MOUSE_PRESS_LIST_DOWN = IconUtils.readIcon("/com/fr/design/standard/list/list_pressed.svg"); - private static Icon CLOSE = IconUtils.readIcon("/com/fr/design/standard/close/close"); - private static Icon MOUSE_OVER_CLOSE = IconUtils.readIcon("/com/fr/design/standard/close/close_mouseover.svg"); - private static Icon MOUSE_PRESS_CLOSE = IconUtils.readIcon("/com/fr/design/standard/close/close_press.svg"); - private static final Icon WHITE_SAVING_CLOSE_ICON = new ImageIcon(IOUtils.readImage("/com/fr/design/images/file/white_saving_close.gif")); - private static final Icon GREY_SAVING_CLOSE_ICON = new ImageIcon(IOUtils.readImage("/com/fr/design/images/file/grey_saving_close.gif")); - private static final String ELLIPSIS = "..."; - private static final int GAP = 5; - private static final int SMALLGAP = 3; - private static final int LIST_BUTTON_WIDTH = 34; - private static final int HEIGHT = 26; - private static final int LIST_DOWN_HEIGHT = 25; - private static final double CORNOR_RADIUS = 0.0; - //选了30度和60度的特殊角度的x,y作为经过的两个点的坐标 - private static final double SPECIAL_LOCATION_1 = 2.5; - private static final double SPECIAL_LOCATION_2 = 4.330127; - private static final int ICON_WIDTH = 22; +public class MultiTemplateTabPane extends JPanel { + private static final String UI_CLASS_ID = "TemplateTabPaneUI"; + private static final int GAP = 6; + private static final int SMALLGAP = 4; + private static final int TRAILING_WIDTH = 34; + + private static final int LEADING_WIDTH = 38; //每个标签页的最大的长度和最小长度。这些长度均为均分 @@ -122,8 +85,7 @@ public class MultiTemplateTabPane extends JComponent { private int mouseOveredIndex = -1; //tab栏可以放下的每个tab的实际宽度 - private int realWidth = MAXWIDTH; - + private int tabWidth; //当前标签页栏存放的所有标签页的index private int minPaintIndex = 0; @@ -132,13 +94,12 @@ public class MultiTemplateTabPane extends JComponent { //每个关闭图标的起始位置 private int[] startX; - private boolean[] isNeedToolTips; //记录关闭按钮的状态 private int closeIconIndex = -1; private boolean isCloseCurrent = false; - private Icon clodeMode = CLOSE; - private Icon listDownMode = LIST_DOWN; + private boolean hoverMoreAction = false; + private Icon clodeIcon = new LazyIcon("clear"); private boolean isShowList = false; //自动新建的模板B若没有进行任何编辑,切换到其他 @@ -146,9 +107,10 @@ public class MultiTemplateTabPane extends JComponent { // 模板时,模板B会自动关闭 private JTemplate temTemplate = null; -// private final Color selectedColor = UIManager.getColor("TabbedPane.hoverColor"); -// private Color hoverColor = UIManager.getColor("TabbedPane.inactiveUnderlineColor"); - + @Override + public String getUIClassID() { + return UI_CLASS_ID; + } public static MultiTemplateTabPane getInstance() { if (THIS == null) { @@ -162,27 +124,19 @@ public class MultiTemplateTabPane extends JComponent { * 多工作簿面板 */ public MultiTemplateTabPane() { - this.setLayout(new BorderLayout(0, 0)); this.addMouseListener(new MultiTemplateTabMouseListener()); this.addMouseMotionListener(new MultiTemplateTabMouseMotionListener()); this.setBorder(null); -// this.setForeground(new Color(58, 56, 58)); - this.setFont(DesignUtils.getDefaultGUIFont().applySize(12)); openedTemplate = HistoryTemplateListCache.getInstance().getHistoryList(); selectedIndex = openedTemplate.size() - 1; - AWTEventListener awt = new AWTEventListener() { - @Override - public void eventDispatched(AWTEvent event) { - if (event instanceof MouseEvent) { - MouseEvent mv = (MouseEvent) event; - if (mv.getClickCount() > 0 && !ComparatorUtils.equals(mv.getSource(), MultiTemplateTabPane.this)) { - isShowList = false; - } + java.awt.Toolkit.getDefaultToolkit().addAWTEventListener(event -> { + if (event instanceof MouseEvent) { + MouseEvent mv = (MouseEvent) event; + if (mv.getClickCount() > 0 && !ComparatorUtils.equals(mv.getSource(), MultiTemplateTabPane.this)) { + isShowList = false; } } - - }; - java.awt.Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); + }, AWTEvent.MOUSE_EVENT_MASK); addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { @@ -229,6 +183,7 @@ public class MultiTemplateTabPane extends JComponent { /** * 判断模板是否可以关闭,两个条件:1、是否满足CloseOption里面的条件(在左侧、在右侧等)2、是否和当前正在编辑模板属于同一种模板tab操作类型 + * * @param closeJTemplate * @param tplIndex * @param i @@ -369,7 +324,7 @@ public class MultiTemplateTabPane extends JComponent { if (openedTemplate.size() == 0) { DesignerContext.getDesignerFrame().addAndActivateJTemplate(); - } else if (option == CloseOption.All){ + } else if (option == CloseOption.All) { //openedTemplate(0)是JVirtualTemplate时需重新打开 openedTemplate.get(0).activeOldJTemplate(); } else { @@ -417,9 +372,10 @@ public class MultiTemplateTabPane extends JComponent { /** * 关闭所有指定模板tab操作类型的模板 + * * @param operatorType */ - public void closeOtherByOperatorType(String operatorType){ + public void closeOtherByOperatorType(String operatorType) { JTemplate currentEditingTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(false); if (saveSomeTempaltePane.showSavePane(null, false, true)) { @@ -438,6 +394,7 @@ public class MultiTemplateTabPane extends JComponent { /** * 关闭指定的非当前编辑模板 + * * @param templates * @param operatorType */ @@ -471,91 +428,19 @@ public class MultiTemplateTabPane extends JComponent { } - @Override - public Dimension getPreferredSize() { - Dimension dimension = super.getPreferredSize(); - dimension.height = HEIGHT; - return dimension; - } - private UIMenuItem initCloseOther() { - UIMenuItem closeOther = new UIMenuItem(Toolkit.i18nText("Fine-Design_Basic_FS_Close_Other_Templates")); - // Yvan: 英文下文本显示不全,后续发现如果将模板名设置的比较短,其它语言也会出现显示不全的问题,所以设置一下文本水平居中 - closeOther.setHorizontalAlignment(SwingConstants.CENTER); - setListDownItemPreferredSize(closeOther); - closeOther.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (openedTemplate.size() == 1) { - return; - } - if (!TemplateSavingChecker.check()) { - return; - } - SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(false); - //点击关闭其他模板,并且点击确定保存 - if (saveSomeTempaltePane.showSavePane()) { - JTemplate[] panes = new JTemplate[openedTemplate.size()]; - for (int i = 0; i < openedTemplate.size(); i++) { - panes[i] = openedTemplate.get(i); - } - for (int i = 0; i < panes.length; i++) { - if (i != selectedIndex) { - JTemplate jTemplate = panes[i]; - //判断关闭的模板是不是格式刷的被参照的模板 - openedTemplate.remove(jTemplate); - closeFormat(jTemplate); - HistoryTemplateListCache.getInstance().closeSelectedReport(jTemplate); - closeAndFreeLock(jTemplate); - } - } - JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - HistoryTemplateListCache.getInstance().removeAllHistory(); - DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate); - THIS.repaint(); - } - //如果取消保存了,则不关闭其他模板 - } - }); - if (openedTemplate.size() == 1) { - closeOther.setEnabled(false); - } - return closeOther; - } - - - private UIMenuItem[] createListDownTemplate() { - UIMenuItem[] templates = new UIMenuItem[openedTemplate.size()]; - for (int i = 0; i < openedTemplate.size(); i++) { - final int index = i; - final JTemplate tem = openedTemplate.get(i); - templates[i] = new UIMenuItem(tempalteShowName(tem), tem.getIcon()); -// templates[i].setUI(new UIListDownItemUI()); - setListDownItemPreferredSize(templates[i]); - if (i == selectedIndex) { - //画选中的高亮 -// templates[i].setBackground(UIConstants.SHADOW_CENTER); - } - templates[i].addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - selectedIndex = index; - tem.activeNewJTemplate(); - } - }); - } - return templates; + private String tempalteShowName(JTemplate template) { + return template.getTabShowName(template); } - private void setListDownItemPreferredSize(UIMenuItem item) { - Dimension dimension = item.getPreferredSize(); - dimension.height = LIST_DOWN_HEIGHT; - item.setPreferredSize(dimension); + public String getTemplateShowNameByIndex(int index) { + JTemplate template = openedTemplate.get(index); + return template.getTabShowName(template); } - - private String tempalteShowName(JTemplate template) { - return template.getTabShowName(template); + public Icon getTemplateIconByIndex(int index) { + JTemplate template = openedTemplate.get(index); + return template.getIcon(); } /** @@ -585,145 +470,23 @@ public class MultiTemplateTabPane extends JComponent { @Override public void paintComponent(Graphics g) { - super.paintComponent(g); - double maxWidth = getWidth() - LIST_BUTTON_WIDTH * 1.0D; //最大宽度 - Graphics2D g2d = (Graphics2D) g; - paintBackgroundAndLine(g2d, maxWidth); - } - - @Override - public void paint(Graphics g) { - //不可见时,按钮.4f透明 - AlphaComposite composite = DesignerMode.isVcsMode() - ? AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f) - : (AlphaComposite) ((Graphics2D) g).getComposite(); - ((Graphics2D) g).setComposite(composite); - super.paint(g); - } - - private void paintBackgroundAndLine(Graphics2D g2d, double maxWidth) { - paintDefaultBackground(g2d); - //最多能画的个数 - int maxTemplateNum = (int) (maxWidth) / MINWIDTH; - //计算开始画的最小模板index和最大模板index + double maxWidth = getWidth() - scale(TRAILING_WIDTH) - scale(LEADING_WIDTH); //最大宽度 + int maxTemplateNum = (int) (maxWidth) / scale(MINWIDTH); calMinAndMaxIndex(maxTemplateNum); calculateRealAverageWidth(maxWidth, maxTemplateNum); - int maxStringlength = calculateStringMaxLength(); - if (selectedIndex >= openedTemplate.size()) { - selectedIndex = openedTemplate.size() - 1; - } - if (selectedIndex < 0) { - selectedIndex = 0; - } - double templateStartX = 0; - startX = new int[maxPaintIndex - minPaintIndex + 1]; - isNeedToolTips = new boolean[maxPaintIndex - minPaintIndex + 1]; - - //从可以开始展示在tab面板上的tab开始画 - for (int i = minPaintIndex; i <= maxPaintIndex; i++) { - JTemplate template = openedTemplate.get(i); - if (!showJTemplateTab(template)){ - continue; - } - Icon icon = template.getIcon(); - String name = tempalteShowName(template); - //如果tab名字的长度大于最大能显示的英文字符长度,则进行省略号处理 - if (getStringWidth(name) > maxStringlength) { - name = getEllipsisName(name, maxStringlength); - isNeedToolTips[i - minPaintIndex] = true; - } else { - isNeedToolTips[i - minPaintIndex] = false; - } - - Icon selectedIcon; - if (i == closeIconIndex) { - selectedIcon = clodeMode; - } else { - selectedIcon = CLOSE; - } - if (i == selectedIndex) { - if (template.isSaving()) { - selectedIcon = WHITE_SAVING_CLOSE_ICON; - } - startX[i - minPaintIndex] = paintSelectedTab(g2d, icon, templateStartX, name, selectedIcon); - } else { - if (template.isSaving()) { - selectedIcon = GREY_SAVING_CLOSE_ICON; - } - boolean isLeft = i < selectedIndex; - startX[i - minPaintIndex] = paintUnSelectedTab(g2d, icon, templateStartX, name, selectedIcon, isLeft, mouseOveredIndex, i); - } - templateStartX += realWidth; - } - - if (!DesignerMode.isVcsMode()) { - paintListDown(g2d, maxWidth); - } - paintUnderLine(templateStartX, maxWidth, g2d); - } - - - private void paintUnderLine(double templateStartX, double maxWidth, Graphics2D g2d) { - //画下面的那条线 - if (templateStartX < maxWidth) { - GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, 2); - generalPath.moveTo((float) templateStartX, (float) (getHeight() - 1.0D)); - generalPath.lineTo((float) maxWidth, (float) (getHeight() - 1.0D)); - g2d.fill(generalPath); - //TODO hzzz delete -// g2d.setPaint(UIConstants.LINE_COLOR); -// g2d.draw(new Line2D.Double((float) templateStartX, getHeight() - 1, (float) maxWidth + LIST_BUTTON_WIDTH, getHeight() - 1)); - } - } - - private void paintDefaultBackground(Graphics2D g2d) { - //画默认背景 - g2d.setPaint(new GradientPaint(1, 1, getBackground(), 1, (float) (getHeight() - 1.0D), getBackground())); - g2d.fillRect(0, 0, getWidth(), getHeight()); - } - - - private void paintListDown(Graphics2D g2d, double maxWidth) { - int x = (int) maxWidth + (LIST_BUTTON_WIDTH - listDownMode.getIconWidth()) / 2; - int y = (getHeight() - listDownMode.getIconHeight()) / 2; - listDownMode.paintIcon(this, g2d, x, y); + calculateClosePosition(); + super.paintComponent(g); } - /** - * 判断tab文字的长度大于能装下的最大文字长度,要用省略号 - * - * @param name - * @param maxStringlength - * @return - */ - private String getEllipsisName(String name, int maxStringlength) { - - //若是名字长度大于能显示的长度,那能显示的文字的最大长度还要减去省略号的最大长度 -// int maxellipsislength = maxStringlength - ELLIPSIS.length(); - int ellipsisWidth = getStringWidth(ELLIPSIS); - int leftkeyPoint = 0; - int rightKeyPoint = name.length() - 1; - int leftStrWidth = 0; - int rightStrWidth = 0; - while (leftStrWidth + rightStrWidth + ellipsisWidth < maxStringlength) { - if (leftStrWidth <= rightStrWidth) { - leftkeyPoint++; - } else { - rightKeyPoint--; - } - leftStrWidth = getStringWidth(name.substring(0, leftkeyPoint)); - rightStrWidth = getStringWidth(name.substring(rightKeyPoint)); - - if (leftStrWidth + rightStrWidth + ellipsisWidth > maxStringlength) { - if (leftStrWidth <= rightStrWidth) { - rightKeyPoint++; - } - break; - } + private void calculateClosePosition() { + startX = new int[maxPaintIndex - minPaintIndex + 1]; + double templateStartX = scale(LEADING_WIDTH); + for (int i = getViewRange().getFirst(); i <= getViewRange().getSecond(); i++) { + int closePosition = (int) templateStartX + getTabWidth() - clodeIcon.getIconWidth() - GAP; + startX[i - minPaintIndex] = closePosition; + templateStartX += getTabWidth(); } - - return name.substring(0, leftkeyPoint) + ELLIPSIS + name.substring(rightKeyPoint); } private void calMinAndMaxIndex(int maxTemplateNum) { @@ -766,9 +529,10 @@ public class MultiTemplateTabPane extends JComponent { /** * 先计算出需要补充的tab个数 + * * @return */ - private int calTabCountComplemented(){ + private int calTabCountComplemented() { int a = 0; for (int i = minPaintIndex; i <= maxPaintIndex; i++) { JTemplate template = openedTemplate.get(i); @@ -783,9 +547,9 @@ public class MultiTemplateTabPane extends JComponent { /** * 由于可能存在宽度为0的tab,所以这边需要重新check下,先往后补,再往前补 */ - private void checkActualPaintIndex(){ + private void checkActualPaintIndex() { int tabCount = calTabCountComplemented(); - if (tabCount == 0){ + if (tabCount == 0) { return; } if (maxPaintIndex < openedTemplate.size() - 1) { @@ -795,19 +559,19 @@ public class MultiTemplateTabPane extends JComponent { tabCount--; } maxPaintIndex++; - if (tabCount == 0){ + if (tabCount == 0) { return; } } } - if (minPaintIndex > 0){ + if (minPaintIndex > 0) { for (int i = minPaintIndex - 1; i >= 0; i--) { JTemplate template = openedTemplate.get(i); if (showJTemplateTab(template)) { tabCount--; } minPaintIndex--; - if (tabCount == 0){ + if (tabCount == 0) { return; } } @@ -821,170 +585,15 @@ public class MultiTemplateTabPane extends JComponent { List> showTemplates = getOpenedJTemplatesByOperator(jTemplate.getTemplateTabOperatorType()); int num = Math.min(showTemplates.size(), templateNum); - realWidth = (int) (maxwidth / (num)); - if (realWidth > MAXWIDTH) { - realWidth = MAXWIDTH; - } else if (realWidth < MINWIDTH) { + tabWidth = (int) (maxwidth / (num)); + if (tabWidth > scale(MAXWIDTH)) { + tabWidth = scale(MAXWIDTH); + } else if (tabWidth < scale(MINWIDTH)) { //平均下来每个的宽度小于最小宽度 - realWidth = MINWIDTH; - } - } - - /** - * 计算过长度之后的每个tab的能接受的文字的英文字符数 - * - * @return - */ - private int calculateStringMaxLength() { - return realWidth - 3 * GAP - ICON_WIDTH - SMALLGAP - CLOSE.getIconWidth(); - - } - - private int getStringWidth(String str) { - return GraphHelper.getFontMetrics(this.getFont()).stringWidth(str); - } - - - /** - * 画选中的tab - * - * @param g2d - * @param sheeticon - * @param templateStartX - * @param sheetName - * @param closeIcon - * @return - */ - private int paintSelectedTab(Graphics2D g2d, Icon sheeticon, double templateStartX, String sheetName, Icon closeIcon) { - double[] x = {templateStartX, templateStartX, templateStartX + realWidth, templateStartX + realWidth, templateStartX}; - double[] y = {1, getHeight() + 1, getHeight() + 1, 1, 1}; - RoundRectangle2D.Double rect1 = new RoundRectangle2D.Double(templateStartX, 1, this.getWidth(), this.getHeight(), 7, 7); - g2d.setPaint(new GradientPaint(1, 1, getBackground(), (float) (getWidth() -1.0d), 1, getBackground())); - //选了30度和60度的特殊角度的x,y作为经过的两个点的坐标 - double specialLocation1 = 2.5; - double specialLocation2 = 4.330127; - GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, x.length); - generalPath.moveTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); - generalPath.curveTo(((float) x[0] + CORNOR_RADIUS - specialLocation1), (y[0] + CORNOR_RADIUS - specialLocation2), ((float) x[0] + CORNOR_RADIUS - specialLocation2), (y[0] + CORNOR_RADIUS - specialLocation1), x[0], y[0] + CORNOR_RADIUS); - - for (int index = 1; index <= 2; index++) { - generalPath.lineTo((float) x[index], (float) y[index]); + tabWidth = scale(MINWIDTH); } - - generalPath.lineTo((float) x[3], (float) y[3] + CORNOR_RADIUS); - generalPath.curveTo(((float) x[3] - CORNOR_RADIUS + specialLocation1), ((float) y[3] + CORNOR_RADIUS - specialLocation2), ((float) x[3] - CORNOR_RADIUS + specialLocation2), ((float) y[3] + CORNOR_RADIUS - specialLocation1), (float) x[3] - CORNOR_RADIUS, (float) y[3]); - generalPath.lineTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); - - generalPath.closePath(); - g2d.fill(generalPath); -// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); -// g2d.setPaint(Color.red); -// g2d.draw(new Arc2D.Double(x[0], y[0], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, 90, 0)); -// g2d.draw(new Line2D.Double(x[0], y[0] + CORNOR_RADIUS, x[1], y[1])); -// g2d.draw(new Line2D.Double(x[1], y[1], x[2], y[2])); -// g2d.draw(new Line2D.Double(x[2], y[2], x[3], y[3] + CORNOR_RADIUS)); -// g2d.draw(new Arc2D.Double(x[3] - CORNOR_RADIUS * 2, y[3], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, -90, 0)); -// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); - int sheetIconY = (getHeight() - sheeticon.getIconHeight()) / 2; - sheeticon.paintIcon(this, g2d, (int) templateStartX + GAP, sheetIconY); - // 画字符 - g2d.setPaint(getForeground()); - g2d.drawString(sheetName, (int) templateStartX + sheeticon.getIconWidth() + 2 * GAP, getHeight() - GAP * 2); - int closePosition = (int) templateStartX + realWidth - CLOSE.getIconWidth() - SMALLGAP; - int closeY = (getHeight() - closeIcon.getIconHeight()) / 2; - if (!DesignerMode.isVcsMode()) { - closeIcon.paintIcon(this, g2d, closePosition, closeY); - } - return closePosition; - - } - - /** - * 画没有选中的tab - * - * @param g2d - * @param sheeticon - * @param templateStartX - * @param sheetName - * @param closeIcon - * @param isLeft - * @return - */ - private int paintUnSelectedTab(Graphics2D g2d, Icon sheeticon, double templateStartX, String sheetName, Icon closeIcon, boolean isLeft, int mouseOveredIndex, int selfIndex) { - double[] x = {templateStartX, templateStartX, templateStartX + realWidth, templateStartX + realWidth, templateStartX}; - double[] y = {-1, getHeight() - 1, getHeight() - 1, -1, -1}; - if (selfIndex == mouseOveredIndex) { - g2d.setPaint(new GradientPaint(1, 1, getBackground(), 1, (float) (getHeight() - 1.0D), getBackground())); - } else { - g2d.setPaint(new GradientPaint(1, 1, getBackground(), 1, (float) (getHeight() - 1.0D), getBackground())); - } - - - GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, x.length); - - unSelectedClosedPath(generalPath, isLeft, x, y); - g2d.fill(generalPath); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2d.setPaint(UIConstants.TEMPLATE_TAB_PANE_BACKGROUND); - //TODO hzzz delete -// if (isLeft) { -// g2d.draw(new Arc2D.Double(x[0], y[0], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, 90, 0)); -// } else { -// g2d.draw(new Arc2D.Double(x[0] - CORNOR_RADIUS * 2, y[0], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, -90, 0)); -// } - -// g2d.draw(new Line2D.Double(x[0], y[0] + CORNOR_RADIUS, x[1], y[1] + 1)); -// g2d.draw(new Line2D.Double(x[1], y[1], x[2], y[2])); - g2d.draw(new Line2D.Double(x[2], y[2], x[3], y[3] + CORNOR_RADIUS)); -// if (isLeft) { -// g2d.draw(new Arc2D.Double(x[3], y[3], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, 90, 0)); -// } else { -// g2d.draw(new Arc2D.Double(x[3] - CORNOR_RADIUS * 2, y[3], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, -90, 0)); -// } - - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); - int sheetIconY = (getHeight() - sheeticon.getIconHeight()) / 2; - sheeticon.paintIcon(this, g2d, (int) templateStartX + GAP, sheetIconY); - // 画字符 - g2d.setPaint(getForeground()); - g2d.drawString(sheetName, (int) templateStartX + sheeticon.getIconWidth() + 2 * GAP, getHeight() - GAP * 2); - int closeY = (getHeight() - closeIcon.getIconHeight()) / 2; - int closePosition = (int) templateStartX + realWidth - CLOSE.getIconWidth() - SMALLGAP; - if (!DesignerMode.isVcsMode()) { - closeIcon.paintIcon(this, g2d, closePosition, closeY); - } - return closePosition; - } - - - private void unSelectedClosedPath(GeneralPath generalPath, boolean isLeft, double[] x, double[] y) { - - if (isLeft) { - generalPath.moveTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); - generalPath.curveTo(((float) x[0] + CORNOR_RADIUS - SPECIAL_LOCATION_1), (y[0] + CORNOR_RADIUS - SPECIAL_LOCATION_2), ((float) x[0] + CORNOR_RADIUS - SPECIAL_LOCATION_2), (y[0] + CORNOR_RADIUS - SPECIAL_LOCATION_1), x[0], y[0] + CORNOR_RADIUS); - } else { - generalPath.moveTo((float) x[0] - CORNOR_RADIUS, (float) y[0]); - generalPath.curveTo(((float) x[0] - CORNOR_RADIUS + SPECIAL_LOCATION_1), (y[0] + CORNOR_RADIUS - SPECIAL_LOCATION_2), ((float) x[0] - CORNOR_RADIUS + SPECIAL_LOCATION_2), (y[0] + CORNOR_RADIUS - SPECIAL_LOCATION_1), x[0], y[0] + CORNOR_RADIUS); - } - - for (int index = 1; index <= 2; index++) { - generalPath.lineTo((float) x[index], (float) y[index]); - } - - generalPath.lineTo((float) x[3], (float) y[3] + CORNOR_RADIUS); - - if (isLeft) { - generalPath.curveTo(((float) x[3] + CORNOR_RADIUS - SPECIAL_LOCATION_1), ((float) y[3] + CORNOR_RADIUS - SPECIAL_LOCATION_2), ((float) x[3] + CORNOR_RADIUS - SPECIAL_LOCATION_2), ((float) y[3] - CORNOR_RADIUS + SPECIAL_LOCATION_1), (float) x[3] + CORNOR_RADIUS, (float) y[3]); - generalPath.lineTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); - } else { - generalPath.curveTo(((float) x[3] - CORNOR_RADIUS + SPECIAL_LOCATION_1), ((float) y[3] + CORNOR_RADIUS - SPECIAL_LOCATION_2), ((float) x[3] - CORNOR_RADIUS + SPECIAL_LOCATION_2), ((float) y[3] + CORNOR_RADIUS - SPECIAL_LOCATION_1), (float) x[3] - CORNOR_RADIUS, (float) y[3]); - generalPath.lineTo((float) x[0] - CORNOR_RADIUS, (float) y[0]); - } - - generalPath.closePath(); } - public void setIsCloseCurrent(boolean isCloseCurrent) { this.isCloseCurrent = isCloseCurrent; @@ -1107,19 +716,21 @@ public class MultiTemplateTabPane extends JComponent { /** * 计算下一个可以展示的模板index + * * @param currentIndex * @return */ public int calNextShowJTemplateIndex(int currentIndex) { - JTemplate jTemplate= HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); return MultiTemplateTabUtils.calShowTemplateIndex(currentIndex, openedTemplate, jTemplate.getTemplateTabOperatorType()); } private boolean isOverCloseIcon(int evtX) { boolean isOverCloseIcon = false; + // todo for (int i = 0; i < startX.length; i++) { - if (evtX >= startX[i] && evtX <= startX[i] + CLOSE.getIconWidth()) { + if (evtX >= startX[i] && evtX <= startX[i] + clodeIcon.getIconWidth()) { isOverCloseIcon = true; break; } @@ -1129,15 +740,15 @@ public class MultiTemplateTabPane extends JComponent { private boolean isOverListDown(int evtX) { - int maxWidth = getWidth() - LIST_BUTTON_WIDTH; + int maxWidth = getWidth() - scale(TRAILING_WIDTH) - scale(LEADING_WIDTH); return evtX >= (maxWidth + SMALLGAP) && evtX <= (getWidth() - SMALLGAP); } private int getTemplateIndex(int evtX) { - int textX = 0; + int textX = scale(LEADING_WIDTH); for (int i = minPaintIndex; i <= maxPaintIndex; i++) { - int textWidth = showJTemplateTab(openedTemplate.get(i)) ? realWidth : 0; + int textWidth = showJTemplateTab(openedTemplate.get(i)) ? tabWidth : 0; if (evtX >= textX && evtX < textX + textWidth) { return i; } @@ -1169,35 +780,7 @@ public class MultiTemplateTabPane extends JComponent { } } - private class UIListDownItemUI extends BasicMenuItemUI { - @Override - protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) { - if (menuItem.getIcon() == null) { - super.paintBackground(g, menuItem, bgColor); - return; - } - ButtonModel model = menuItem.getModel(); - Color oldColor = g.getColor(); - int menuWidth = menuItem.getWidth(); - int menuHeight = menuItem.getHeight(); - g.setColor(getBackground()); - g.fillRect(0, 0, menuWidth, menuHeight); - boolean itemIsSelected = menuItem instanceof JMenu && model.isSelected(); - if (menuItem.isOpaque()) { - if (model.isArmed() || itemIsSelected) { - GUIPaintUtils.fillPaint((Graphics2D) g, GAP, 0, menuWidth - GAP, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, UIConstants.ARC); - } else { - GUIPaintUtils.fillPaint((Graphics2D) g, GAP, 0, menuWidth - GAP, menuHeight, true, Constants.NULL, menuItem.getBackground(), UIConstants.ARC); - } - g.setColor(oldColor); - } else if (model.isArmed() || itemIsSelected) { - GUIPaintUtils.fillPaint((Graphics2D) g, GAP, 0, menuWidth - GAP, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, UIConstants.ARC); - g.setColor(oldColor); - } - } - } - - private class MultiTemplateTabMouseListener implements MouseListener { + private class MultiTemplateTabMouseListener extends MouseAdapter { private boolean oldLightWeightPopupEnabled; @@ -1222,32 +805,12 @@ public class MultiTemplateTabPane extends JComponent { ToolTipManager.sharedInstance().setEnabled(false); ToolTipManager.sharedInstance().setEnabled(true); ToolTipManager.sharedInstance().setLightWeightPopupEnabled(this.oldLightWeightPopupEnabled); - listDownMode = LIST_DOWN; closeIconIndex = -1; mouseOveredIndex = -1; + hoverMoreAction = false; MultiTemplateTabPane.this.repaint(); } - /** - * 鼠标释放 - * - * @param e 鼠标事件 - */ - @Override - public void mouseReleased(MouseEvent e) { - // do nothing - } - - /** - * 点击 - * - * @param e 鼠标事件 - */ - @Override - public void mouseClicked(MouseEvent e) { - // do nothing - } - /** * 按下 * @@ -1264,8 +827,9 @@ public class MultiTemplateTabPane extends JComponent { //是否点击关闭按钮 如果点击了关闭按钮,则将点击的模板关闭,不需要切换,如果没有点击关闭按钮,则切换到点击的模板处 boolean isOverCloseIcon = isOverCloseIcon(evtX); - if (isOverListDown(evtX)) { - listDownMode = isOverListDown(evtX) ? MOUSE_PRESS_LIST_DOWN : LIST_DOWN; + hoverMoreAction = isOverListDown(evtX); + if (hoverMoreAction) { + if (!isShowList) { showListDown(); } @@ -1274,7 +838,6 @@ public class MultiTemplateTabPane extends JComponent { } else if (isOverCloseIcon) { //关闭按钮的图标变化 closeIconIndex = getTemplateIndex(evtX); - clodeMode = MOUSE_PRESS_CLOSE; //关闭close图标所在的模板{ JTemplate template = openedTemplate.get(closeIconIndex); if (template.isOpening()) { @@ -1298,7 +861,7 @@ public class MultiTemplateTabPane extends JComponent { } else { //没有点击关闭和ListDown按钮,则切换到点击的模板处 closeIconIndex = -1; - clodeMode = CLOSE; + clodeIcon = new LazyIcon("clear"); switchJTemplate(getTemplateIndex(evtX)); isShowList = false; } @@ -1308,6 +871,7 @@ public class MultiTemplateTabPane extends JComponent { /** * 切换到指定模板 + * * @param jTemplate */ public void switchJTemplate(JTemplate jTemplate) { @@ -1319,9 +883,10 @@ public class MultiTemplateTabPane extends JComponent { /** * 切换到指定index + * * @param switchIndex */ - private void switchJTemplate(int switchIndex){ + private void switchJTemplate(int switchIndex) { int tempSelectedIndex = selectedIndex; if (selectedIndex != switchIndex && switchIndex != -1) { openedTemplate.get(selectedIndex).stopEditing(); @@ -1344,17 +909,7 @@ public class MultiTemplateTabPane extends JComponent { return JTemplate.isValid(currentTemplate) && ComparatorUtils.equals(template.getPath(), currentTemplate.getPath()); } - private class MultiTemplateTabMouseMotionListener implements MouseMotionListener { - /** - * 鼠标拖拽 - * - * @param e 鼠标事件 - */ - @Override - public void mouseDragged(MouseEvent e) { - // do nothing - } - + private class MultiTemplateTabMouseMotionListener extends MouseMotionAdapter { /** * 鼠标移动 * @@ -1364,51 +919,106 @@ public class MultiTemplateTabPane extends JComponent { public void mouseMoved(MouseEvent e) { int evtX = e.getX(); mouseOveredIndex = getTemplateIndex(evtX); - - //看是否需要显示toolTip - if (mouseOveredIndex != -1 && isNeedToolTips[mouseOveredIndex - minPaintIndex]) { - setToolTipText(openedTemplate.get(mouseOveredIndex).getEditingFILE().getName()); - } else { - setToolTipText(null); - } - - listDownMode = isOverListDown(evtX) ? MOUSE_OVER_LIST_DOWN : LIST_DOWN; - - boolean isOverCloseIcon = isOverCloseIcon(evtX); - clodeMode = isOverCloseIcon ? MOUSE_OVER_CLOSE : CLOSE; - closeIconIndex = isOverCloseIcon ? mouseOveredIndex : -1; + setToolTipText(openedTemplate.get(mouseOveredIndex).getEditingFILE().getName()); + hoverMoreAction = isOverListDown(evtX); + closeIconIndex = isOverCloseIcon(evtX) ? mouseOveredIndex : -1; MultiTemplateTabPane.this.repaint(); } } /** * 判断是否显示在tab栏上 + * * @param jTemplate * @return */ - private boolean showJTemplateTab(JTemplate jTemplate){ + private boolean showJTemplateTab(JTemplate jTemplate) { JTemplate current = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); return ComparatorUtils.equals(current.getTemplateTabOperatorType(), jTemplate.getTemplateTabOperatorType()); } /** * 获取tab操作类型的模板 + * * @param operator * @return */ - public List> getOpenedJTemplatesByOperator(String operator) { + public List> getOpenedJTemplatesByOperator(String operator) { return openedTemplate.stream().filter((jTemplate) -> ComparatorUtils.equals(jTemplate.getTemplateTabOperatorType(), operator)) .collect(Collectors.toList()); } /** * 根据tab操作类型进行分类 + * * @return */ public Map>> getOpenedJTemplatesByCategory() { - return openedTemplate.stream() - .collect(Collectors.groupingBy(JTemplate::getTemplateTabOperatorType)); + return openedTemplate.stream() + .collect(Collectors.groupingBy(JTemplate::getTemplateTabOperatorType)); + } + + /** + * 返回当前tab数量 + * + * @return tab数量 + */ + public int getTabCount() { + return openedTemplate.size(); + } + + /** + * 获取选中的tab索引 + * + * @return tab索引 + */ + public int getSelectedIndex() { + return selectedIndex; + } + + /** + * 获取每个tab宽度 + * + * @return tab宽度 + */ + public int getTabWidth() { + return tabWidth; + } + + /** + * 是否悬浮在更多按钮上 + * + * @return 是否悬浮 + */ + public boolean isHoverMoreAction() { + return hoverMoreAction; } + /** + * 是否悬浮在关闭按钮上0 + * + * @param i 索引 + * @return 是否悬浮在关闭按钮上 + */ + public boolean isCloseCurrent(int i) { + return i == closeIconIndex; + } + /** + * 获取悬浮索引 + * + * @return 悬浮在第几个tab + */ + public int getHoverIndex() { + return mouseOveredIndex; + } + + /** + * 获取可视范围内的标签范围 + * + * @return 标签范围 + */ + public Pair getViewRange() { + return new Pair<>(minPaintIndex, maxPaintIndex); + } } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java index 4fa5cc4eba..4f6ee08cc8 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java @@ -61,6 +61,7 @@ public class UIHeadGroup extends Row { * @see JComponent#getUIClassID * @see UIDefaults#getUI */ + @Override public String getUIClassID() { return UI_CLASS_ID; } diff --git a/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java b/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java index 7b30e45d96..618f4c5510 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java +++ b/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java @@ -18,7 +18,6 @@ public class UIToolbar extends JToolBar { setFloatable(false); setRollover(true); setLayout(new FlowLayout(align, 4, 0)); -// setUI(uiToolBarUI); setBorderPainted(false); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java index 96265efcf1..9f36dfddd2 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java @@ -1,13 +1,13 @@ package com.fr.design.mainframe; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.DesignState; import com.fr.design.base.mode.DesignModeContext; -import com.fr.design.constants.UIConstants; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.file.NewTemplatePane; import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.itoolbar.UILargeToolbar; +import com.fr.design.gui.ibutton.UICombinationButton; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.toolbar.ToolBarMenuDock; @@ -16,14 +16,11 @@ import org.jetbrains.annotations.Nullable; import javax.swing.JComponent; import javax.swing.JPanel; -import javax.swing.BorderFactory; import javax.swing.UIManager; -import javax.swing.border.MatteBorder; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; -import java.awt.Insets; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -47,7 +44,7 @@ public class CenterRegionContainerPane extends JPanel { private JComponent toolbarComponent;//cpt 字体 等工具栏 private JPanel eastPane;//=largeToolbar+eastCenterPane - private UILargeToolbar largeToolbar;//预览 + private UICombinationButton largeToolbar;//预览 private JPanel eastCenterPane;//=combineUp + templateTabPane @@ -70,37 +67,28 @@ public class CenterRegionContainerPane extends JPanel { public CenterRegionContainerPane() { - toolbarPane = new JPanel() { - - @Override - public Dimension getPreferredSize() { - - Dimension dim = super.getPreferredSize(); - // dim.height = TOOLBAR_HEIGHT; - return dim; - } - }; - toolbarPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); + toolbarPane = new JPanel(); + toolbarPane.setBorder(new ScaledEmptyBorder(6, 0, 10, 0)); toolbarPane.setLayout(FRGUIPaneFactory.createBorderLayout()); toolbarPane.setBackground(UIManager.getColor("Center.SpaceColor")); eastPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - eastPane.add(largeToolbar = getToolBarMenuDock().createLargeToolbar(), BorderLayout.WEST); + largeToolbar = getToolBarMenuDock().createLargeToolbar(); eastCenterPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); combineUpTooBar(); - eastCenterPane.add(combineUp, BorderLayout.NORTH); templateTabPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - templateTabPane.add(newWorkBookPane = getToolBarMenuDock().getNewTemplatePane(), BorderLayout.WEST); - templateTabPane.add(MultiTemplateTabPane.getInstance(), BorderLayout.CENTER); - eastCenterPane.add(templateTabPane, BorderLayout.CENTER); + newWorkBookPane = getToolBarMenuDock().getNewTemplatePane(); + eastCenterPane.add(templateTabPane, BorderLayout.NORTH); + eastCenterPane.add(combineUp, BorderLayout.CENTER); eastPane.add(eastCenterPane, BorderLayout.CENTER); toolbarPane.add(eastPane, BorderLayout.NORTH); this.setLayout(new BorderLayout()); this.add(centerTemplateCardPane = new DesktopCardPane(), BorderLayout.CENTER); + centerTemplateCardPane.setBorder(new ScaledEmptyBorder(0, 10, 10, 10)); this.add(toolbarPane, BorderLayout.NORTH); this.setBackground(UIManager.getColor("Center.SpaceColor")); - this.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10)); + this.setBorder(new ScaledEmptyBorder(0, 0, 10, 0)); } public ToolBarMenuDock getToolBarMenuDock() { @@ -112,10 +100,9 @@ public class CenterRegionContainerPane extends JPanel { */ private void combineUpTooBar() { combineUp = new UIToolbar(FlowLayout.LEFT); - combineUp.setBorder(new MatteBorder(new Insets(0, LEFT_ALIGN_GAP, 1, 0), UIConstants.LINE_COLOR)); + combineUp.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); combineUp.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 2)); setUpUpToolBar(null); - } @@ -135,6 +122,7 @@ public class CenterRegionContainerPane extends JPanel { * @param toolbar4Form 目标组件 */ private void setUpUpToolBar(@Nullable JComponent[] toolbar4Form) { + combineUp.add(largeToolbar); UIButton[] fixButtons = getToolBarMenuDock().createUp(); for (UIButton fixButton : fixButtons) { combineUp.add(fixButton); @@ -233,19 +221,20 @@ public class CenterRegionContainerPane extends JPanel { // 颜色,字体那些按钮的工具栏 toolbarPane.add(toolbarComponent = ad.resetToolBar(toolbarComponent, plus), BorderLayout.CENTER); + toolbarComponent.setBorder(new ScaledEmptyBorder(0, 10, 10, 10)); JPanel customNorthPane = strategy.customNorthPane(toolbarPane, plus); if (!isExist(customNorthPane)) { this.removeNorth(); this.add(customNorthPane, BorderLayout.NORTH); } if (strategy.hasTemplateTabPane(plus)) { - eastCenterPane.add(templateTabPane, BorderLayout.CENTER); + eastCenterPane.add(templateTabPane, BorderLayout.NORTH); } else { eastCenterPane.remove(templateTabPane); } if (strategy.hasCombineUp(plus)) { - eastCenterPane.add(combineUp, BorderLayout.NORTH); + eastCenterPane.add(combineUp, BorderLayout.CENTER); } else { eastCenterPane.remove(combineUp); } @@ -274,11 +263,11 @@ public class CenterRegionContainerPane extends JPanel { private void resetByDesignMode() { if (DesignModeContext.isDuchampMode()) { - eastPane.remove(largeToolbar); +// eastPane.remove(largeToolbar); //移除新建模板按钮 templateTabPane.remove(newWorkBookPane); } else { - eastPane.add(largeToolbar, BorderLayout.WEST); +// eastPane.add(largeToolbar, BorderLayout.WEST); templateTabPane.add(newWorkBookPane, BorderLayout.WEST); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index e3742f8a31..685a31843a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -177,7 +177,7 @@ public abstract class JTemplate> private TemplateThemeConfig.ThemeConfigChangeListener themeConfigChangeListener; public JTemplate() { - initAndStartPlugin(); +// initAndStartPlugin(); startListenThemeConfig(); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JVirtualTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JVirtualTemplate.java index 911c0dc17a..04975208de 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JVirtualTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JVirtualTemplate.java @@ -1,6 +1,6 @@ package com.fr.design.mainframe; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.DesignModelAdapter; import com.fr.design.designer.TargetComponent; import com.fr.design.file.HistoryTemplateListPane; @@ -246,9 +246,9 @@ public class JVirtualTemplate extends JTemplate { @Override public Icon getIcon() { if (getPath().endsWith("cpt")) { - return BaseUtils.readIcon("/com/fr/design/images/buttonicon/newcpts.png"); + return new LazyIcon("cpt_icon"); } else { - return BaseUtils.readIcon("/com/fr/web/images/form/new_form3.png"); + return new LazyIcon("frm_icon"); } } diff --git a/designer-base/src/main/resources/com/fine/theme/icon/clear_hover.svg b/designer-base/src/main/resources/com/fine/theme/icon/clear_hover.svg new file mode 100644 index 0000000000..6981454e9e --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/clear_hover.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/more.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/more.svg new file mode 100644 index 0000000000..42f49767c8 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/more.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/more_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/more_disable.svg new file mode 100644 index 0000000000..6570607cd1 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/more_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties index fd9df53c87..41d855e279 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties @@ -48,4 +48,5 @@ ButtonGroupUI=com.fine.theme.light.ui.FineButtonGroupUI SelectBoxUI=com.fine.theme.light.ui.FineSelectBoxUI CombinationButtonUI=com.fine.theme.light.ui.FineCombinationButtonUI InputUI=com.fine.theme.light.ui.FineInputUI -GradientBarUI=com.fine.theme.light.ui.FineGradientBarUI \ No newline at end of file +GradientBarUI=com.fine.theme.light.ui.FineGradientBarUI +TemplateTabPaneUI=com.fine.theme.light.ui.FineTemplateTabPaneUI \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index 0184ae3b18..527fd4cc67 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -892,9 +892,13 @@ TemplateTabPane.hoverColor = $fill.hover TemplateTabPane.contentAreaColor = $fill.hover TemplateTabPane.background = $fill.disabled TemplateTabPane.selectedBackground = #fff -TemplateTabPane.tabSeparatorColor = $border.divider +TemplateTabPane.borderColor = $border.divider TemplateTabPane.closeHoverBackground = $hover.deep TemplateTabPane.tabInsets = 4,6,4,6 +TemplateTabPane.borderWidth = 1 +TemplateTabPane.tabArc = 5 +TemplateTabPane.separatorHeight = 14 +TemplateTabPane.icon.hoverBackground = #B8BFCB #---- Table ---- Table.rowHeight = 20 @@ -1085,6 +1089,7 @@ ToolBar.arrowKeysOnlyNavigation = true ToolBar.hoverButtonGroupArc = 8 ToolBar.floatable = false ToolBar.gripColor = @icon +ToolBar.background = #fff ToolBar.dockingBackground = darken($ToolBar.background,5%) ToolBar.dockingForeground = $Component.borderColor ToolBar.floatingBackground = $ToolBar.background diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/JTestTemplate.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/JTestTemplate.java new file mode 100644 index 0000000000..72a97c5d3f --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/JTestTemplate.java @@ -0,0 +1,42 @@ +package com.fr.design.gui.storybook.components; + +import com.fine.theme.icon.LazyIcon; +import com.fr.design.mainframe.JNullTemplate; +import com.fr.file.FILE; +import com.fr.file.MemFILE; + +import javax.swing.Icon; + +/** + * @author vito + * @since 11.0 + * Created on 2023/12/18 + */ +public class JTestTemplate extends JNullTemplate { + + private String name; + private FILE file; + + public JTestTemplate(String name) { + this.name = name; + this.file = new MemFILE(name); + } + + public String getTemplateName() { + return name; + } + + @Override + public Icon getIcon() { + return new LazyIcon("save"); + } + + public String getTemplateTabOperatorType(){ + return "DefaultTabOperator"; + } + + @Override + public FILE getEditingFILE() { + return file; + } +} diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/TemplateTabStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/TemplateTabStoryBoard.java new file mode 100644 index 0000000000..31e2406682 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/TemplateTabStoryBoard.java @@ -0,0 +1,36 @@ +package com.fr.design.gui.storybook.components; + +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.file.MultiTemplateTabPane; +import com.fr.design.gui.storybook.Story; +import com.fr.design.gui.storybook.StoryBoard; +import com.fr.value.NullableLazyValue; + +/** + * 新建模版Tab + * + * @author vito + * @since 11.0 + * Created on 2023/11/27 + */ +@Story +public class TemplateTabStoryBoard extends StoryBoard { + + final static NullableLazyValue init = NullableLazyValue.createValue(() -> { + HistoryTemplateListCache.getInstance().setCurrentEditingTemplate(new JTestTemplate("ghjffdhsakjfjdks.cpt")); + HistoryTemplateListCache.getInstance().setCurrentEditingTemplate(new JTestTemplate("模版1.cpt")); + HistoryTemplateListCache.getInstance().setCurrentEditingTemplate(new JTestTemplate("模版.cpt")); + HistoryTemplateListCache.getInstance().setCurrentEditingTemplate(new JTestTemplate("模版1.cpt")); + HistoryTemplateListCache.getInstance().setCurrentEditingTemplate(new JTestTemplate("模版模版模版模版.cpt")); + return null; + }); + + public TemplateTabStoryBoard() { + super("新建模版Tab"); + + init.getValue(); + add(MultiTemplateTabPane.getInstance()); + } + + +} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java index 97488e7d83..34603c59e0 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe; +import com.fine.theme.icon.LazyIcon; import com.fr.base.PaperSize; import com.fr.base.Parameter; import com.fr.base.Releasable; @@ -1067,7 +1068,7 @@ public class JForm extends JTemplate implements BaseJForm { @Override public Icon getIcon() { - return IconUtils.readIcon("/com/fr/design/images/buttonicon/newcpts.png"); + return new LazyIcon("cpt_icon"); } /** diff --git a/designer-realize/src/main/java/com/fr/start/MainDesigner.java b/designer-realize/src/main/java/com/fr/start/MainDesigner.java index 21b6c7eed4..8ab1ea9eb2 100644 --- a/designer-realize/src/main/java/com/fr/start/MainDesigner.java +++ b/designer-realize/src/main/java/com/fr/start/MainDesigner.java @@ -14,7 +14,6 @@ import com.fr.design.actions.server.TemplateThemeManagerAction; import com.fr.design.actions.server.WidgetManagerAction; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.carton.SwitchForSwingChecker; -import com.fr.design.constants.UIConstants; import com.fr.design.deeplink.DeepLinkManager; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; @@ -22,11 +21,10 @@ import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.fun.MenuHandler; import com.fr.design.fun.OemProcessor; import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.ibutton.UIPreviewButton; +import com.fr.design.gui.ibutton.UICombinationButton; import com.fr.design.gui.ibutton.UISaveForbiddenButton; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIPopupMenu; -import com.fr.design.gui.itoolbar.UILargeToolbar; import com.fr.design.mainframe.ActiveKeyGenerator; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.InformationCollector; @@ -79,13 +77,9 @@ import com.fr.workspace.WorkContext; import javax.swing.JComponent; import javax.swing.JPanel; -import javax.swing.border.MatteBorder; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.io.File; import java.util.ArrayList; import java.util.concurrent.LinkedBlockingQueue; @@ -106,7 +100,7 @@ public class MainDesigner extends BaseDesigner { private UIButton undo; private UIButton redo; private UIButton[] upToolBar; - private UIPreviewButton run; + private UICombinationButton run; public MainDesigner(String[] args) { super(args); @@ -268,15 +262,8 @@ public class MainDesigner extends BaseDesigner { * @return 返回大图标对应的工具栏 */ @Override - public UILargeToolbar createLargeToolbar() { - UILargeToolbar largeToolbar = super.createLargeToolbar(); - largeToolbar.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 4)); - largeToolbar.add(generateEmptyGap(1)); - createRunButton(largeToolbar); - largeToolbar.add(run); - largeToolbar.add(generateEmptyGap(GAP)); - largeToolbar.addSeparator(new Dimension(2, 42)); - largeToolbar.setBorder(new MatteBorder(new Insets(0, 0, 1, 0), UIConstants.LINE_COLOR)); + public UICombinationButton createLargeToolbar() { + UICombinationButton largeToolbar = createRunButton(); return largeToolbar; } @@ -315,15 +302,12 @@ public class MainDesigner extends BaseDesigner { saveButton = new UIButton(new LazyIcon("save")); saveButton.setToolTipText(KeySetUtils.SAVE_TEMPLATE.getMenuKeySetName()); saveButton.set4ToolbarButton(); - saveButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - jt.stopEditing(); - jt.saveDirectly(); - jt.requestFocus(); - SharableManager.saveTemplate(jt); - } + saveButton.addActionListener(e -> { + JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + jt.stopEditing(); + jt.saveDirectly(); + jt.requestFocus(); + SharableManager.saveTemplate(jt); }); } @@ -332,13 +316,10 @@ public class MainDesigner extends BaseDesigner { undo = new UIButton(new LazyIcon("undo")); undo.setToolTipText(KeySetUtils.UNDO.getMenuKeySetName()); undo.set4ToolbarButton(); - undo.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - JTemplate jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); - if (jt != null) { - jt.undo(); - } + undo.addActionListener(e -> { + JTemplate jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); + if (jt != null) { + jt.undo(); } }); } @@ -347,65 +328,44 @@ public class MainDesigner extends BaseDesigner { redo = new UIButton(new LazyIcon("redo")); redo.setToolTipText(KeySetUtils.REDO.getMenuKeySetName()); redo.set4ToolbarButton(); - redo.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - JTemplate jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); - if (jt != null) { - jt.redo(); - } + redo.addActionListener(e -> { + JTemplate jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); + if (jt != null) { + jt.redo(); } }); } - private void createRunButton(UILargeToolbar largeToolbar) { - run = new UIPreviewButton(new UISaveForbiddenButton(UIConstants.PAGE_BIG_ICON) { - @Override - public Dimension getPreferredSize() { - return new Dimension(34, 34); + private UICombinationButton createRunButton() { + run = new UICombinationButton(new UISaveForbiddenButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview"), new LazyIcon("add")), + new UISaveForbiddenButton(new LazyIcon("triangle_down"))); + run.addLeftClickLister(mouseEvent -> { + JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (jt == null || jt.isSaving()) { + return; } - }, new UISaveForbiddenButton(UIConstants.PREVIEW_DOWN) { - @Override - public Dimension getPreferredSize() { - return new Dimension(34, 10); - } - } - ) { - @Override - protected void upButtonClickEvent() { - JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - if (jt == null || jt.isSaving()) { - return; - } - WebPreviewUtils.preview(jt); + WebPreviewUtils.preview(jt); + }); + run.addRightClickLister(mouseEvent -> { + final JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (jt == null) { + return; } - @Override - protected void downButtonClickEvent() { - final JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - if (jt == null) { - return; - } - - UIPopupMenu menu = new UIPopupMenu(); + UIPopupMenu menu = new UIPopupMenu(); - UIMenuItem[] items = jt.createMenuItem4Preview(); - for (int i = 0; i < items.length; i++) { - menu.add(items[i]); - } - GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.getInstance(), MultiTemplateTabPane.getInstance().getX() - PREVIEW_DOWN_X_GAP, MultiTemplateTabPane.getInstance().getY() - 1 + MultiTemplateTabPane.getInstance().getHeight()); + UIMenuItem[] items = jt.createMenuItem4Preview(); + for (UIMenuItem item : items) { + menu.add(item); } - - @Override - public Dimension getPreferredSize() { - // TODO Auto-generated method stub - return new Dimension(34, 46); - } - }; + GUICoreUtils.showPopupMenu(menu, run, run.getX(), run.getY() - 1 + run.getHeight()); + }); + run.setPrimary(); run.setExtraPainted(false); run.set4Toolbar(); - run.getUpButton().setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview")); - run.getDownButton().setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Dropdown_More_Preview")); + run.getLeftButton().setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview")); + run.getRightButton().setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Dropdown_More_Preview")); + return run; } @Override @@ -425,7 +385,7 @@ public class MainDesigner extends BaseDesigner { redo.setEnabled(false); } - run.getUpButton().setIcon(jt.getPreviewLargeIcon()); +// run.getLeftButton().setIcon(jt.getPreviewLargeIcon()); } From 487ad3609844c38b396b99de86f3629412fb9a0c Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 28 Dec 2023 22:36:25 +0800 Subject: [PATCH 066/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../light/ui/FineCombinationButtonUI.java | 2 ++ .../theme/light/ui/FineTemplateTabPaneUI.java | 6 ++--- .../fr/design/file/MultiTemplateTabPane.java | 3 +++ .../gui/ibutton/UICombinationButton.java | 24 +++++++------------ 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineCombinationButtonUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineCombinationButtonUI.java index ea617a090b..6e61a1f79b 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineCombinationButtonUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineCombinationButtonUI.java @@ -15,6 +15,8 @@ import java.beans.PropertyChangeEvent; import static com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; /** + * 双组件按钮UI + * * @author vito * @since 11.0 * Created on 2023/12/21 diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java index 6a80036019..61fb25466d 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java @@ -39,7 +39,7 @@ public class FineTemplateTabPaneUI extends PanelUI { private MultiTemplateTabPane tabPane; private static final String ELLIPSIS = "..."; - private static final int iconTextGap = 4; + private static final int ICON_TEXT_GAP = 4; private static final int LEADING_WIDTH = 0; private static final int TRAILING_WIDTH = 34; @@ -283,7 +283,7 @@ public class FineTemplateTabPaneUI extends PanelUI { private int calculateStringMaxLength() { return tabPane.getTabWidth() - tabInsets.left - tabInsets.right - - iconTextGap * 2 + - ICON_TEXT_GAP * 2 - fileIcon.getIconWidth() - closeIcon.getIconWidth(); } @@ -340,7 +340,7 @@ public class FineTemplateTabPaneUI extends PanelUI { int ascent = fm.getAscent(); int gap = (tabHeight - tabInsets.top - tabInsets.bottom - ascent) / 2; double y = tabInsets.top + ascent + gap; - return new Point2D.Double(x + iconWidth + tabInsets.left + iconTextGap, y); + return new Point2D.Double(x + iconWidth + tabInsets.left + ICON_TEXT_GAP, y); } diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index f93cd22434..b89019cd43 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -112,6 +112,9 @@ public class MultiTemplateTabPane extends JPanel { return UI_CLASS_ID; } + /** + * 单例 + */ public static MultiTemplateTabPane getInstance() { if (THIS == null) { THIS = new MultiTemplateTabPane(); diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java index da48b216d4..ff3398077d 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java @@ -1,10 +1,8 @@ package com.fr.design.gui.ibutton; -import com.fr.design.constants.UIConstants; import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.Icon; -import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JPopupMenu; import java.awt.BorderLayout; @@ -18,6 +16,14 @@ import static com.fine.theme.utils.FineClientProperties.STYLE_PRIMARY; import static com.fine.theme.utils.FineClientProperties.setStyle; import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; +/** + * 双按钮组件 + * + * @author vito + * @since 11.0 + *

+ * created by vito on 2023/12/28 + **/ public class UICombinationButton extends JPanel { private static final String UI_CLASS_ID = "CombinationButtonUI"; @@ -146,18 +152,4 @@ public class UICombinationButton extends JPanel { protected void showPopWindow(JPopupMenu menu) { GUICoreUtils.showPopupMenu(menu, this, 0, getY() + getHeight() - 3); } - - public static void main(String... args) { - JFrame jf = new JFrame("test"); - jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JPanel content = (JPanel) jf.getContentPane(); - content.setLayout(null); - - UICombinationButton bb = new UICombinationButton("123455", UIConstants.ARROW_DOWN_ICON); - bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); - content.add(bb); - GUICoreUtils.centerWindow(jf); - jf.setSize(400, 400); - jf.setVisible(true); - } } \ No newline at end of file From 8ef70d89bf394207a92e77b0e135d34ba7dae72e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Fri, 29 Dec 2023 11:46:48 +0800 Subject: [PATCH 067/302] =?UTF-8?q?REPORT-111995=20=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E7=BB=84=E8=BE=B9=E7=BC=98=E5=9C=86=E8=A7=92=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../theme/light/ui/FineButtonGroupUI.java | 7 +- .../theme/light/ui/FineToggleButtonUI.java | 49 +++++++- .../theme/utils/FineClientProperties.java | 11 ++ .../com/fine/theme/utils/FineUIUtils.java | 118 +++++++++++++----- .../fr/design/gui/ibutton/UIButtonGroup.java | 72 +++++++---- .../com/fr/design/gui/ibutton/UITabGroup.java | 2 +- .../VanChartCustomPlotUITabGroup.java | 2 +- .../fr/design/report/ReportColumnsPane.java | 4 +- 8 files changed, 203 insertions(+), 62 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonGroupUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonGroupUI.java index cb406e8319..2035abf493 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonGroupUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonGroupUI.java @@ -1,14 +1,11 @@ package com.fine.theme.light.ui; -import com.fine.theme.utils.FineUIUtils; - import javax.swing.JComponent; -import javax.swing.border.LineBorder; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.PanelUI; /** - * 按钮组UI,应用于 + * 按钮组UI,应用于 {@link com.fr.design.gui.ibutton.UIButtonGroup} * * @author Levy.Xie * @since 11.0 @@ -29,7 +26,7 @@ public class FineButtonGroupUI extends PanelUI { @Override public void installUI(JComponent c) { super.installUI(c); - c.setBorder(new LineBorder(FineUIUtils.getUIColor("defaultBorderColor", "Component.borderColor"))); + c.setBorder(new FineRoundBorder()); } @Override diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineToggleButtonUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineToggleButtonUI.java index bb7a9cbb7e..149fd479cd 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineToggleButtonUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineToggleButtonUI.java @@ -17,12 +17,23 @@ import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.Shape; +import java.awt.Rectangle; import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE_GROUP; import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE; import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE_TAB; +import static com.fine.theme.utils.FineClientProperties.BUTTON_GROUP_POSITION; +import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_INNER; +import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_LEFT; +import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_LEFT_BOTTOM; +import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_LEFT_TOP; +import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_RIGHT; +import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_RIGHT_BOTTOM; +import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_RIGHT_TOP; import static com.fine.theme.utils.FineClientProperties.TAB_BUTTON_SELECTED_BACKGROUND; import static com.formdev.flatlaf.FlatClientProperties.clientPropertyColor; +import static com.formdev.flatlaf.FlatClientProperties.clientPropertyInt; /** * 提供 {@link javax.swing.JToggleButton} 的UI类 @@ -75,6 +86,10 @@ public class FineToggleButtonUI extends FlatToggleButtonUI { return null; } + static int getGroupButtonPosition(AbstractButton c) { + return clientPropertyInt(c, BUTTON_GROUP_POSITION, GROUP_BUTTON_POSITION_INNER); + } + static boolean isTabButton(Component c) { return c instanceof JToggleButton && BUTTON_TYPE_TAB.equals(getButtonTypeStr((JToggleButton) c)); } @@ -134,8 +149,38 @@ public class FineToggleButtonUI extends FlatToggleButtonUI { try { FlatUIUtils.setRenderingHints(g2); g2.setColor(FlatUIUtils.deriveColor(background, getBackgroundBase(c, true))); - float focusWidth = FlatUIUtils.getBorderFocusWidth(c); - FlatUIUtils.paintComponentBackground(g2, 0, 0, c.getWidth(), c.getHeight(), focusWidth, 0); + + int position = getGroupButtonPosition((AbstractButton) c); + if (position == GROUP_BUTTON_POSITION_INNER) { + float focusWidth = FlatUIUtils.getBorderFocusWidth(c); + FlatUIUtils.paintComponentBackground(g2, 0, 0, c.getWidth(), c.getHeight(), focusWidth, 0); + } else { + float arc = FlatUIUtils.getBorderArc( c ) / 2; + Shape path2D; + switch (position) { + case GROUP_BUTTON_POSITION_LEFT: + path2D = FineUIUtils.createLeftRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); + break; + case GROUP_BUTTON_POSITION_RIGHT: + path2D = FineUIUtils.createRightRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); + break; + case GROUP_BUTTON_POSITION_LEFT_TOP: + path2D = FineUIUtils.createTopLeftRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); + break; + case GROUP_BUTTON_POSITION_LEFT_BOTTOM: + path2D = FineUIUtils.createBottomLeftRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); + break; + case GROUP_BUTTON_POSITION_RIGHT_TOP: + path2D = FineUIUtils.createTopRightRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); + break; + case GROUP_BUTTON_POSITION_RIGHT_BOTTOM: + path2D = FineUIUtils.createBottomRightRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); + break; + default: + path2D = new Rectangle(); + } + g2.fill(path2D); + } } finally { g2.dispose(); } diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java b/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java index 72effbc10b..5015dd9d9d 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java @@ -14,6 +14,7 @@ import javax.swing.JComponent; */ public interface FineClientProperties extends FlatClientProperties { + //--------------------------- ButtonGroup ----------------------- String BUTTON_TYPE_GROUP = "group"; String STYLE_PRIMARY = "primary"; @@ -90,4 +91,14 @@ public interface FineClientProperties extends FlatClientProperties { } + String BUTTON_GROUP_POSITION = "group_position"; + + int GROUP_BUTTON_POSITION_INNER = 0; + int GROUP_BUTTON_POSITION_LEFT = 1; + int GROUP_BUTTON_POSITION_RIGHT = 2; + int GROUP_BUTTON_POSITION_LEFT_TOP = 3; + int GROUP_BUTTON_POSITION_LEFT_BOTTOM = 4; + int GROUP_BUTTON_POSITION_RIGHT_TOP = 5; + int GROUP_BUTTON_POSITION_RIGHT_BOTTOM = 6; + } diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java index 0448fa82f0..01b92af016 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java @@ -235,6 +235,35 @@ public class FineUIUtils { g2.fill(path2D); } + /** + * 创建一个部分圆角的矩形路径 + * + * @param x x坐标 + * @param y y坐标 + * @param width 矩形宽度 + * @param height 矩形高度 + * @param arcTopLeft 左上圆角弧度 + * @param arcTopRight 右上圆角弧度 + * @param arcBottomRight 右下圆角弧度 + * @param arcBottomLeft 左下圆角弧度 + * @return 路径 + */ + public static Path2D createPartRoundRectangle(double x, double y, double width, double height, + double arcTopLeft, double arcTopRight, double arcBottomRight, double arcBottomLeft) { + Path2D path = new Path2D.Double(Path2D.WIND_EVEN_ODD, 7); + path.moveTo(x + arcTopLeft, y); + path.lineTo(x + width - arcTopRight, y); + path.quadTo(x + width, y, x + width, y + arcTopRight); + path.lineTo(x + width, y + height - arcBottomRight); + path.quadTo(x + width, y + height, x + width - arcBottomRight, y + height); + path.lineTo(x + arcBottomLeft, y + height); + path.quadTo(x, y + height, x, y + height - arcBottomLeft); + path.lineTo(x, y + arcTopLeft); + path.quadTo(x, y, x + arcTopLeft, y); + path.closePath(); + return path; + } + /** * 创建一个左圆角矩形路径 @@ -247,16 +276,7 @@ public class FineUIUtils { * @return 路径 */ public static Path2D createLeftRoundRectangle(float x, float y, float width, float height, float arc) { - Path2D path = new Path2D.Float(Path2D.WIND_EVEN_ODD, 7); - path.moveTo(x, y + arc); - path.lineTo(x, y + height - arc); - path.quadTo(x, y + height, x + arc, y + height); - path.lineTo(x + width, y + height); - path.lineTo(x + width, y); - path.lineTo(x + arc, y); - path.quadTo(x, y, x, arc + y); - path.closePath(); - return path; + return createPartRoundRectangle(x, y, width, height, arc, 0, 0, arc); } @@ -271,16 +291,7 @@ public class FineUIUtils { * @return 路径 */ public static Path2D createRightRoundRectangle(float x, float y, float width, float height, float arc) { - Path2D path = new Path2D.Float(Path2D.WIND_EVEN_ODD, 7); - path.moveTo(x, y); - path.lineTo(x, y + height); - path.lineTo(x + width - arc, y + height); - path.quadTo(x + width, y + height, x + width, y + height - arc); - path.lineTo(x + width, y + arc); - path.quadTo(x + width, y, x + width - arc, y); - path.lineTo(x, y); - path.closePath(); - return path; + return createPartRoundRectangle(x, y, width, height, 0, arc, arc, 0); } /** @@ -294,16 +305,63 @@ public class FineUIUtils { * @return 路径 */ public static Path2D createTopRoundRectangle(double x, double y, double width, double height, double arc) { - Path2D path = new Path2D.Double(Path2D.WIND_EVEN_ODD, 7); - path.moveTo(x, y + height); - path.lineTo(x, y + arc); - path.quadTo(x, y, x + arc, y); - path.lineTo(x + width - arc, y); - path.quadTo(x + width, y, x + width, y + arc); - path.lineTo(x + width, y + height); - path.lineTo(x, y + height); - path.closePath(); - return path; + return createPartRoundRectangle(x, y, width, height, arc, arc, 0, 0); + } + + /** + * 创建一个左上圆角的矩形路径 + * + * @param x x坐标 + * @param y y坐标 + * @param width 矩形宽度 + * @param height 矩形高度 + * @param arc 圆角弧度 + * @return 路径 + */ + public static Path2D createTopLeftRoundRectangle(float x, float y, float width, float height, float arc) { + return createPartRoundRectangle(x, y, width, height, arc, 0, 0, 0); + } + + /** + * 创建一个左下圆角的矩形路径 + * + * @param x x坐标 + * @param y y坐标 + * @param width 矩形宽度 + * @param height 矩形高度 + * @param arc 圆角弧度 + * @return 路径 + */ + public static Path2D createBottomLeftRoundRectangle(float x, float y, float width, float height, float arc) { + return createPartRoundRectangle(x, y, width, height, 0, 0, 0, arc); + } + + /** + * 创建一个右上圆角的矩形路径 + * + * @param x x坐标 + * @param y y坐标 + * @param width 矩形宽度 + * @param height 矩形高度 + * @param arc 圆角弧度 + * @return 路径 + */ + public static Path2D createTopRightRoundRectangle(float x, float y, float width, float height, float arc) { + return createPartRoundRectangle(x, y, width, height, 0, arc, 0, 0); + } + + /** + * 创建一个右下圆角的矩形路径 + * + * @param x x坐标 + * @param y y坐标 + * @param width 矩形宽度 + * @param height 矩形高度 + * @param arc 圆角弧度 + * @return 路径 + */ + public static Path2D createBottomRightRoundRectangle(float x, float y, float width, float height, float arc) { + return createPartRoundRectangle(x, y, width, height, 0, 0, arc, 0); } } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java index 4906c3dbe5..4f5dadba45 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java @@ -3,13 +3,13 @@ package com.fr.design.gui.ibutton; import com.fine.swing.ui.layout.Column; import com.fine.swing.ui.layout.Row; import com.fine.swing.ui.layout.Spacer; +import com.fine.theme.light.ui.FineRoundBorder; import com.fine.theme.utils.FineUIScale; import com.fine.theme.utils.FineUIUtils; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; -import com.fr.design.utils.gui.UIComponentUtils; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; @@ -17,7 +17,6 @@ import javax.swing.Icon; import javax.swing.border.LineBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import java.awt.Dimension; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -29,19 +28,24 @@ import java.util.List; import static com.fine.swing.ui.layout.Layouts.cell; import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE_GROUP; import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE; +import static com.fine.theme.utils.FineClientProperties.BUTTON_GROUP_POSITION; +import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_INNER; +import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_LEFT; +import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_LEFT_BOTTOM; +import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_LEFT_TOP; +import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_RIGHT; +import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_RIGHT_BOTTOM; +import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_RIGHT_TOP; public class UIButtonGroup extends Column implements GlobalNameObserver, UIObserver { private static final String UI_CLASS_ID = "ButtonGroupUI"; private static final long serialVersionUID = 1L; - private static final int TEXT_LENGTH = 3; - private static final int BUTTON_SIZE = 2; - private int currentButtonSize = 0; protected List labelButtonList; + protected int totalButtonSize; protected int selectedIndex = -1; private List objectList;// 起到一个render的作用 private GlobalNameListener globalNameListener = null; private String buttonGroupName = StringUtils.EMPTY; - private boolean isToolBarComponent = false; private boolean isClick; private UIObserverListener uiObserverListener; @@ -64,6 +68,7 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb this.objectList = Arrays.asList(objects); } labelButtonList = new ArrayList<>(iconArray.length); + totalButtonSize = iconArray.length; for (int i = 0; i < iconArray.length; i++) { final int index = i; Icon icon = iconArray[i]; @@ -89,7 +94,7 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb return false; } }; - initButton(labelButton); + initButton(labelButton, index); } initLayout(getCols()); } @@ -98,6 +103,7 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb if (!ArrayUtils.isEmpty(objects) && iconArray.length == objects.length) { this.objectList = Arrays.asList(objects); } + totalButtonSize = iconArray.length; labelButtonList = new ArrayList<>(iconArray.length); for (int i = 0; i < iconArray.length; i++) { final int index = i; @@ -124,7 +130,7 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb return false; } }; - initButton(labelButton); + initButton(labelButton, index); } initLayout(getCols()); } @@ -133,8 +139,8 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb if (!ArrayUtils.isEmpty(objects) && textArray.length == objects.length) { this.objectList = Arrays.asList(objects); } - currentButtonSize = textArray.length; labelButtonList = new ArrayList<>(textArray.length); + totalButtonSize = textArray.length; for (int i = 0; i < textArray.length; i++) { final int index = i; final UIToggleButton labelButton = new UIToggleButton(textArray[i]) { @@ -159,7 +165,7 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb } }; - initButton(labelButton); + initButton(labelButton, index); } initLayout(getCols()); } @@ -169,8 +175,13 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb return UI_CLASS_ID; } + /** + * 计算按钮组的列布局 + * + * @return 列布局,形如[5,3] 即为两行,首行5个组件,次行3个组件 + */ protected int[] getCols() { - return new int[]{labelButtonList.size()}; + return new int[]{totalButtonSize}; } protected void initLayout(int[] cols) { @@ -198,21 +209,41 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb return spacer; } - protected void initButton(UIToggleButton labelButton) { + protected void initButton(UIToggleButton labelButton, int index) { + labelButton.setBorder(new FineRoundBorder()); labelButton.setBorderPainted(false); labelButton.putClientProperty(BUTTON_TYPE, BUTTON_TYPE_GROUP); - adjustButton(labelButton); - UIComponentUtils.setLineWrap(labelButton); + labelButton.putClientProperty(BUTTON_GROUP_POSITION, getGroupButtonPosition(index)); labelButtonList.add(labelButton); } - - private void adjustButton(UIToggleButton labelButton) { - if (labelButton.getText().length() > TEXT_LENGTH && currentButtonSize > BUTTON_SIZE) { - Dimension dimension = labelButton.getPreferredSize(); - dimension.height <<= 1; - labelButton.setPreferredSize(dimension); + /** + * 计算按钮位于整个按钮组件中的位置 + * @param index 按钮序号 + * @return 按钮位置,详见 {@link com.fine.theme.utils.FineClientProperties} + */ + protected int getGroupButtonPosition(int index) { + int[] cols = getCols(); + if (cols.length == 1) { + if (index == 0) { + return GROUP_BUTTON_POSITION_LEFT; + } else if (index == totalButtonSize - 1) { + return GROUP_BUTTON_POSITION_RIGHT; + } + } else { + int rightTopCorner = cols[0] - 1; + int leftBottomCorner = totalButtonSize - cols[cols.length - 1]; + if (index == 0) { + return GROUP_BUTTON_POSITION_LEFT_TOP; + } else if (index == totalButtonSize - 1) { + return GROUP_BUTTON_POSITION_RIGHT_BOTTOM; + } else if (index == rightTopCorner) { + return GROUP_BUTTON_POSITION_RIGHT_TOP; + } else if (index == leftBottomCorner) { + return GROUP_BUTTON_POSITION_LEFT_BOTTOM; + } } + return GROUP_BUTTON_POSITION_INNER; } public boolean hasClick() { @@ -224,7 +255,6 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb } public void setForToolBarButtonGroup(boolean isToolBarComponent) { - this.isToolBarComponent = isToolBarComponent; if (isToolBarComponent) { for (UIToggleButton uiToggleButton : labelButtonList) { uiToggleButton.set4ToolbarButton(); diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UITabGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UITabGroup.java index 148a0711ae..5352ddd3da 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UITabGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UITabGroup.java @@ -33,7 +33,7 @@ public class UITabGroup extends UIButtonGroup { @Override protected int[] getCols() { - int buttons = labelButtonList.size(); + int buttons = totalButtonSize; if (buttons < ROW_MAX_LIMIT) { return new int[]{buttons}; } diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartCustomPlotUITabGroup.java b/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartCustomPlotUITabGroup.java index f36eca435d..e4ce883912 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartCustomPlotUITabGroup.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartCustomPlotUITabGroup.java @@ -37,7 +37,7 @@ public class VanChartCustomPlotUITabGroup extends UITabGroup{ } @Override - protected void initButton(UIToggleButton labelButton) { + protected void initButton(UIToggleButton labelButton, int buttonIndex) { int ButtonWidth = WIDTH / 3; if (listNum <= 1){ diff --git a/designer-realize/src/main/java/com/fr/design/report/ReportColumnsPane.java b/designer-realize/src/main/java/com/fr/design/report/ReportColumnsPane.java index f1897e148e..3d9ba00e00 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ReportColumnsPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ReportColumnsPane.java @@ -99,10 +99,10 @@ public class ReportColumnsPane extends BasicPane{ onOffButtonGroup = new UIButtonGroup(textArray) { @Override - protected void initButton(UIToggleButton labelButton) { + protected void initButton(UIToggleButton labelButton, int index) { labelButton.setSize(new Dimension(60,20)); labelButton.setPreferredSize(new Dimension(60, 20)); - super.initButton(labelButton); + super.initButton(labelButton, index); } }; onOffButtonGroup.addActionListener(onOffListener); From 27955b258252ce4872e44d425a62d1dd3948dd38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Fri, 29 Dec 2023 11:47:14 +0800 Subject: [PATCH 068/302] =?UTF-8?q?REPORT-111995=20=E5=BD=A2=E6=80=81?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E8=BE=B9=E8=B7=9D=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/cell/settingpane/CellPresentPane.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellPresentPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellPresentPane.java index 881b8b0835..24c8ccb942 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellPresentPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellPresentPane.java @@ -1,7 +1,6 @@ package com.fr.design.mainframe.cell.settingpane; import com.fr.base.present.Present; -import com.fr.design.constants.UIConstants; import com.fr.design.mainframe.theme.utils.DefaultThemedTemplateCellElementCase; import com.fr.design.present.PresentPane; @@ -29,7 +28,6 @@ public class CellPresentPane extends AbstractCellAttrPane { presentPane = new PresentPane(); JPanel content = new JPanel(new BorderLayout()); content.add(presentPane, BorderLayout.CENTER); - presentPane.setBorder(UIConstants.CELL_ATTR_PRESENTBORDER); presentPane.addTabChangeListener(new ItemListener() { @Override @@ -42,7 +40,6 @@ public class CellPresentPane extends AbstractCellAttrPane { @Override public String getIconPath() { -// return "com/fr/design/images/data/source/dataDictionary.png"; return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Present"); } From 0b185b6e0982b3837bfcc39bc3fddb96302e5404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Fri, 29 Dec 2023 11:53:01 +0800 Subject: [PATCH 069/302] =?UTF-8?q?REPORT-111995=20=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E7=BB=84=E5=9C=86=E8=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../theme/light/ui/FineToggleButtonUI.java | 53 +++++++++++-------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineToggleButtonUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineToggleButtonUI.java index 149fd479cd..aab2766a03 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineToggleButtonUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineToggleButtonUI.java @@ -6,6 +6,7 @@ import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; import com.formdev.flatlaf.ui.FlatToggleButtonUI; import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.design.gui.ibutton.UIButton; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.AbstractButton; @@ -156,29 +157,7 @@ public class FineToggleButtonUI extends FlatToggleButtonUI { FlatUIUtils.paintComponentBackground(g2, 0, 0, c.getWidth(), c.getHeight(), focusWidth, 0); } else { float arc = FlatUIUtils.getBorderArc( c ) / 2; - Shape path2D; - switch (position) { - case GROUP_BUTTON_POSITION_LEFT: - path2D = FineUIUtils.createLeftRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); - break; - case GROUP_BUTTON_POSITION_RIGHT: - path2D = FineUIUtils.createRightRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); - break; - case GROUP_BUTTON_POSITION_LEFT_TOP: - path2D = FineUIUtils.createTopLeftRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); - break; - case GROUP_BUTTON_POSITION_LEFT_BOTTOM: - path2D = FineUIUtils.createBottomLeftRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); - break; - case GROUP_BUTTON_POSITION_RIGHT_TOP: - path2D = FineUIUtils.createTopRightRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); - break; - case GROUP_BUTTON_POSITION_RIGHT_BOTTOM: - path2D = FineUIUtils.createBottomRightRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); - break; - default: - path2D = new Rectangle(); - } + Shape path2D = getGroupButtonPath2D(c, position, arc); g2.fill(path2D); } } finally { @@ -186,6 +165,34 @@ public class FineToggleButtonUI extends FlatToggleButtonUI { } } + @NotNull + private static Shape getGroupButtonPath2D(JComponent c, int position, float arc) { + Shape path2D; + switch (position) { + case GROUP_BUTTON_POSITION_LEFT: + path2D = FineUIUtils.createLeftRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); + break; + case GROUP_BUTTON_POSITION_RIGHT: + path2D = FineUIUtils.createRightRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); + break; + case GROUP_BUTTON_POSITION_LEFT_TOP: + path2D = FineUIUtils.createTopLeftRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); + break; + case GROUP_BUTTON_POSITION_LEFT_BOTTOM: + path2D = FineUIUtils.createBottomLeftRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); + break; + case GROUP_BUTTON_POSITION_RIGHT_TOP: + path2D = FineUIUtils.createTopRightRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); + break; + case GROUP_BUTTON_POSITION_RIGHT_BOTTOM: + path2D = FineUIUtils.createBottomRightRoundRectangle(0, 0, c.getWidth(), c.getHeight(), arc); + break; + default: + path2D = new Rectangle(); + } + return path2D; + } + @Override protected Color getForeground(JComponent c) { if (isGroupButton(c) && ((AbstractButton)c).isSelected()) { From 42b35d346a3d3e1b42a3a56d7328dada218fbe6a Mon Sep 17 00:00:00 2001 From: vito Date: Fri, 29 Dec 2023 17:22:52 +0800 Subject: [PATCH 070/302] =?UTF-8?q?REPORT-99485=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E6=A0=8F=E5=BA=95=E8=89=B2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/data/datapane/TableDataTreePane.java | 10 ++-------- .../management/search/pane/TreeSearchToolbarPane.java | 2 -- .../fr/design/mainframe/CenterRegionContainerPane.java | 4 +++- .../design/mainframe/DesignerFrameFileDealerPane.java | 1 - .../control/pane/TemplateTreeSearchToolbarPane.java | 2 -- .../fr/design/mainframe/toolbar/ToolBarMenuDock.java | 7 +++---- .../fine/theme/light/ui/laf/FineLightLaf.properties | 4 +++- 7 files changed, 11 insertions(+), 19 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index cadb62550a..be8a8a2b12 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -10,7 +10,6 @@ import com.fr.design.DesignModelAdapter; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.UpdateAction; -import com.fr.design.constants.UIConstants; import com.fr.design.data.BasicTableDataTreePane; import com.fr.design.data.BasicTableDataUtils; import com.fr.design.data.DesignTableDataManager; @@ -70,7 +69,6 @@ import com.fr.stable.core.PropertyChangeAdapter; import com.fr.workspace.WorkContext; import org.jetbrains.annotations.NotNull; -import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JLabel; import javax.swing.JPanel; @@ -81,7 +79,6 @@ import javax.swing.border.EmptyBorder; import javax.swing.tree.TreePath; import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Dimension; import java.awt.GridLayout; import java.awt.dnd.DnDConstants; import java.awt.event.ActionEvent; @@ -252,10 +249,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { toolBar.setBorderPainted(true); toolbarDef.updateToolBar(toolBar); - TreeSearchToolbarPane searchLayerdPane = new TreeSearchToolbarPane(toolBar); - searchLayerdPane.setPreferredSize(new Dimension(this.getWidth(), 23)); - - return searchLayerdPane; + return new TreeSearchToolbarPane(toolBar); } /** @@ -276,7 +270,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { treePane.add(northPane, BorderLayout.NORTH); treePane.add(remindPane, BorderLayout.CENTER); - treePane.setBorder(new EmptyBorder(10, 10,10,10)); + treePane.setBorder(new EmptyBorder(10, 10, 10, 10)); return treePane; } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java index 8ee62bb219..29e2bca721 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java @@ -19,7 +19,6 @@ import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.BorderLayout; import java.awt.CardLayout; -import java.awt.Dimension; import java.awt.Insets; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; @@ -73,7 +72,6 @@ public class TreeSearchToolbarPane extends JPanel implements TreeSearchStatusCha initSearchPane(); initContentPane(); add(contentPane, BorderLayout.CENTER); - setPreferredSize(new Dimension(240, 30)); TableDataTreeSearchManager.getInstance().registerTreeSearchStatusChangeListener(this); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java index 9f36dfddd2..23199fb02d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe; +import com.fine.theme.utils.FineClientProperties; import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.DesignState; import com.fr.design.base.mode.DesignModeContext; @@ -88,7 +89,6 @@ public class CenterRegionContainerPane extends JPanel { centerTemplateCardPane.setBorder(new ScaledEmptyBorder(0, 10, 10, 10)); this.add(toolbarPane, BorderLayout.NORTH); this.setBackground(UIManager.getColor("Center.SpaceColor")); - this.setBorder(new ScaledEmptyBorder(0, 0, 10, 0)); } public ToolBarMenuDock getToolBarMenuDock() { @@ -100,6 +100,7 @@ public class CenterRegionContainerPane extends JPanel { */ private void combineUpTooBar() { combineUp = new UIToolbar(FlowLayout.LEFT); + FineClientProperties.setStyle(combineUp, "topTools"); combineUp.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); combineUp.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 2)); setUpUpToolBar(null); @@ -221,6 +222,7 @@ public class CenterRegionContainerPane extends JPanel { // 颜色,字体那些按钮的工具栏 toolbarPane.add(toolbarComponent = ad.resetToolBar(toolbarComponent, plus), BorderLayout.CENTER); + FineClientProperties.setStyle(toolbarComponent, "topTools"); toolbarComponent.setBorder(new ScaledEmptyBorder(0, 10, 10, 10)); JPanel customNorthPane = strategy.customNorthPane(toolbarPane, plus); if (!isExist(customNorthPane)) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index 901a37a9c1..387dfece15 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -175,7 +175,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt searchToolbarPane = new TemplateTreeSearchToolbarPane(toolBar); searchToolbarPane.add(createUpToolBarPane(), BorderLayout.EAST); - searchToolbarPane.setPreferredSize(new Dimension(this.getWidth(), 23)); add(searchToolbarPane, BorderLayout.NORTH); CardLayout card; JPanel cardPane = new JPanel(card = new CardLayout()); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateTreeSearchToolbarPane.java b/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateTreeSearchToolbarPane.java index e12050c18b..cfb0809130 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateTreeSearchToolbarPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateTreeSearchToolbarPane.java @@ -22,7 +22,6 @@ import javax.swing.event.DocumentListener; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; -import java.awt.Dimension; import java.awt.Insets; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; @@ -91,7 +90,6 @@ public class TemplateTreeSearchToolbarPane extends JPanel implements TreeSearchS initSearchPane(); initContentPane(); add(contentPane, BorderLayout.CENTER); - setPreferredSize(new Dimension(240, 30)); TemplateTreeSearchManager.getInstance().registerTreeSearchStatusChangeListener(this); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index ce7190102a..c147ccc4f7 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -52,10 +52,10 @@ import com.fr.design.fun.PluginManagerProvider; import com.fr.design.fun.TableDataPaneProcessor; import com.fr.design.gui.UILookAndFeel; import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ibutton.UICombinationButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.imenu.UIMenu; import com.fr.design.gui.imenu.UIMenuBar; -import com.fr.design.gui.itoolbar.UILargeToolbar; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.locale.impl.SupportLocaleImpl; import com.fr.design.mainframe.JTemplate; @@ -98,7 +98,6 @@ 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.util.ArrayList; import java.util.Arrays; @@ -766,8 +765,8 @@ public abstract class ToolBarMenuDock { * * @return 大的工具按钮 */ - public UILargeToolbar createLargeToolbar() { - return new UILargeToolbar(FlowLayout.LEFT); + public UICombinationButton createLargeToolbar() { + return new UICombinationButton(); } /** diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index 88e185f0ab..c07e64483b 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -1092,7 +1092,6 @@ ToolBar.arrowKeysOnlyNavigation = true ToolBar.hoverButtonGroupArc = 8 ToolBar.floatable = false ToolBar.gripColor = @icon -ToolBar.background = #fff ToolBar.dockingBackground = darken($ToolBar.background,5%) ToolBar.dockingForeground = $Component.borderColor ToolBar.floatingBackground = $ToolBar.background @@ -1260,6 +1259,9 @@ CellOtherSetPane.height=$Component.defaultHeight background : @BrandColor; \ arc : 3 +[style]ToolBar.topTools = \ + background: #fff + #---- clearButton ---- # for clear/cancel button in text fields From 68930250711dfc0a91d99a72f5ed696e6acd569f Mon Sep 17 00:00:00 2001 From: vito Date: Fri, 29 Dec 2023 17:25:03 +0800 Subject: [PATCH 071/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E8=A1=A5=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/file/MultiTemplateTabPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index b89019cd43..8659bcd95b 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -68,7 +68,7 @@ public class MultiTemplateTabPane extends JPanel { private static final int SMALLGAP = 4; private static final int TRAILING_WIDTH = 34; - private static final int LEADING_WIDTH = 38; + private static final int LEADING_WIDTH = 0; //每个标签页的最大的长度和最小长度。这些长度均为均分 From cea3024bc72a4ead090f48e78f76ab19f7b159aa Mon Sep 17 00:00:00 2001 From: vito Date: Wed, 3 Jan 2024 09:48:35 +0800 Subject: [PATCH 072/302] =?UTF-8?q?REPORT-99485=20HeadGroup=E6=82=AC?= =?UTF-8?q?=E6=B5=AE=E9=A2=9C=E8=89=B2=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/light/ui/laf/FineLightLaf.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index c07e64483b..b67d4b1087 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -1067,7 +1067,7 @@ ToggleButton.tab.underlineColor = $TabbedPane.underlineColor ToggleButton.tab.disabledUnderlineColor = $TabbedPane.disabledUnderlineColor ToggleButton.tab.selectedBackground = #FFFFFF ToggleButton.tab.selectedForeground = $?TabbedPane.selectedForeground -ToggleButton.tab.hoverBackground = $TabbedPane.hoverColor +ToggleButton.tab.hoverBackground = $fill.click ToggleButton.tab.focusBackground = #FFFFFF ToggleButton.tab.arc = $Component.arc From 598c6ee255161a53c82c513c408e4cafdacd6e3f Mon Sep 17 00:00:00 2001 From: vito Date: Wed, 3 Jan 2024 21:11:14 +0800 Subject: [PATCH 073/302] =?UTF-8?q?REPORT-99485=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=A8=A1=E7=89=88tab=E7=BB=84=E4=BB=B6=E9=BC=A0=E6=A0=87?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/file/MultiTemplateTabPane.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 8659bcd95b..e6e6155759 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -486,7 +486,7 @@ public class MultiTemplateTabPane extends JPanel { startX = new int[maxPaintIndex - minPaintIndex + 1]; double templateStartX = scale(LEADING_WIDTH); for (int i = getViewRange().getFirst(); i <= getViewRange().getSecond(); i++) { - int closePosition = (int) templateStartX + getTabWidth() - clodeIcon.getIconWidth() - GAP; + int closePosition = (int) templateStartX + getTabWidth() - clodeIcon.getIconWidth() - GAP; startX[i - minPaintIndex] = closePosition; templateStartX += getTabWidth(); } @@ -922,7 +922,9 @@ public class MultiTemplateTabPane extends JPanel { public void mouseMoved(MouseEvent e) { int evtX = e.getX(); mouseOveredIndex = getTemplateIndex(evtX); - setToolTipText(openedTemplate.get(mouseOveredIndex).getEditingFILE().getName()); + if (mouseOveredIndex > -1) { + setToolTipText(openedTemplate.get(mouseOveredIndex).getEditingFILE().getName()); + } hoverMoreAction = isOverListDown(evtX); closeIconIndex = isOverCloseIcon(evtX) ? mouseOveredIndex : -1; MultiTemplateTabPane.this.repaint(); From 91305cf1926dfd77d7a5d1b1c8aa599de848d160 Mon Sep 17 00:00:00 2001 From: vito Date: Wed, 3 Jan 2024 21:20:21 +0800 Subject: [PATCH 074/302] =?UTF-8?q?REPORT-99485=20=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E6=A0=8FUI=E8=B0=83=E6=95=B4=201.=20=E9=A2=9C=E8=89=B2?= =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E7=BB=98=E5=88=B6=202.=20=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E6=8C=89=E9=92=AE=E5=9C=A8=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E6=A0=8F=E7=9A=84=E7=BB=98=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../theme/light/ui/FineColorButtonUI.java | 66 ++++++++++++++++ .../light/ui/FineCombinationButtonUI.java | 7 +- .../theme/utils/FineClientProperties.java | 4 +- .../com/fr/design/gui/ibutton/UIButton.java | 53 +------------ .../fr/design/gui/ibutton/UIColorButton.java | 58 +++++--------- .../gui/ibutton/UIColorButtonWithAuto.java | 3 +- .../gui/ibutton/UICombinationButton.java | 18 ++--- .../style/color/UIToolbarColorButton.java | 21 +++-- .../theme/light/ui/laf/FineLaf.properties | 3 +- .../light/ui/laf/FineLightLaf.properties | 76 ++++++------------- .../components/ButtonStoryBoard.java | 19 ++++- .../actions/cell/UIToolbarBorderButton.java | 1 + .../main/java/com/fr/start/MainDesigner.java | 5 +- 13 files changed, 154 insertions(+), 180 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineColorButtonUI.java diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineColorButtonUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineColorButtonUI.java new file mode 100644 index 0000000000..9f23998a66 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineColorButtonUI.java @@ -0,0 +1,66 @@ +package com.fine.theme.light.ui; + +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.fr.base.Utils; +import com.fr.design.gui.ibutton.UIColorButton; + +import javax.swing.ButtonModel; +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.geom.RoundRectangle2D; + +import static com.fine.theme.utils.FineUIScale.scale; + +/** + * 颜色按钮 + * + * @author vito + * @since 11.0 + * Created on 2024/1/3 + */ +public class FineColorButtonUI extends FineButtonUI { + + public static final float HEIGHT = 1.5f; + public static final float WIDTH = 13; + public static final float Y = 13.5f; + + /** + * @param shared + * @since 2 + */ + protected FineColorButtonUI(boolean shared) { + super(shared); + } + + /** + * 创建UI + */ + public static ComponentUI createUI(JComponent c) { + return new FineColorButtonUI(false); + } + + @Override + protected void paintIcon(Graphics g, JComponent c, Rectangle iconRect) { + super.paintIcon(g, c, iconRect); + UIColorButton b = (UIColorButton) c; + ButtonModel model = b.getModel(); + if (model.isEnabled()) { + g.setColor(b.getColor()); + } else { + g.setColor(new Color(Utils.filterRGB(b.getColor().getRGB(), 50))); + } + FlatUIUtils.setRenderingHints(g); + Graphics2D g2d = (Graphics2D) g; + float height = scale(HEIGHT); + float width = scale(WIDTH); + // 计算实际大小与icon区域大小的偏移,用于居中调整 + float offsetX = (iconRect.width - width) / 2.0f; + RoundRectangle2D.Float colorRect = new RoundRectangle2D.Float( + iconRect.x + offsetX, iconRect.y + scale(Y), width, height, height, height); + g2d.fill(colorRect); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineCombinationButtonUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineCombinationButtonUI.java index 6e61a1f79b..e243f47e07 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineCombinationButtonUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineCombinationButtonUI.java @@ -28,8 +28,6 @@ public class FineCombinationButtonUI extends FlatPanelUI { @Styleable(dot = true) protected int arc; - @Styleable(dot = true) - protected Color borderColor; /** * @param shared @@ -53,7 +51,6 @@ public class FineCombinationButtonUI extends FlatPanelUI { public void installUI(JComponent c) { super.installUI(c); background = FineUIUtils.getUIColor("CombinationButton.background", "desktop"); - borderColor = FineUIUtils.getUIColor("CombinationButton.borderColor", "CombinationButton.secondary.background"); arc = FineUIUtils.getUIInt("CombinationButton.arc", "Component.arc"); } @@ -80,7 +77,9 @@ public class FineCombinationButtonUI extends FlatPanelUI { switch (e.getPropertyName()) { case FineClientProperties.STYLE_CLASS: UICombinationButton b = (UICombinationButton) e.getSource(); - b.setPrimary(); + if (FineClientProperties.STYLE_PRIMARY.equals(e.getNewValue())) { + b.setPrimary(); + } b.repaint(); break; default: diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java b/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java index 5015dd9d9d..7f2f501a7d 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java @@ -19,8 +19,8 @@ public interface FineClientProperties extends FlatClientProperties { String STYLE_PRIMARY = "primary"; String STYLE_SECONDARY = "secondary"; - String STYLE_SIZE_MEDIUM = "medium"; - String STYLE_SIZE_SMALL = "small"; + String STYLE_SIZE_MEDIUM = "mediumSize"; + String STYLE_SIZE_SMALL = "smallSize"; String BUTTON_TYPE_LEFT_ROUND_RECT = "leftRoundRect"; String BUTTON_TYPE_RIGHT_ROUND_RECT = "rightRoundRect"; diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java index f01c52cb7b..65e508ac3c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java @@ -1,32 +1,24 @@ package com.fr.design.gui.ibutton; -import com.fanruan.gui.UiInspector; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.light.ui.laf.FineLightLaf; -import com.fr.base.BaseUtils; +import com.fine.theme.utils.FineClientProperties; import com.fr.base.CellBorderStyle; import com.fr.base.svg.IconUtils; import com.fr.design.constants.UIConstants; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; import com.fr.design.gui.core.UITextComponent; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.Constants; import com.fr.stable.StringUtils; import javax.swing.Action; import javax.swing.Icon; import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JPanel; import javax.swing.ToolTipManager; -import javax.swing.UIManager; -import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; -import java.awt.Insets; import java.awt.Shape; import java.awt.Stroke; import java.awt.event.ActionEvent; @@ -163,8 +155,6 @@ public class UIButton extends JButton implements UIObserver, UITextComponent { private void init() { - setOpaque(false); - setBackground(null); setRolloverEnabled(true); initListener(); ToolTipManager.sharedInstance().setInitialDelay(TOOLTIP_INIT_DELAY); @@ -290,8 +280,8 @@ public class UIButton extends JButton implements UIObserver, UITextComponent { */ public void setNormalPainted(boolean isNormalPressed) { this.isNormalPainted = isNormalPressed; - if (!isNormalPressed) { - setBackground(null); + boolean isPrimary = FineClientProperties.hasStyle(this, FineClientProperties.STYLE_PRIMARY); + if (!isNormalPainted() && !isPrimary) { setOpaque(false); } } @@ -303,40 +293,6 @@ public class UIButton extends JButton implements UIObserver, UITextComponent { this.isBorderPaintedOnlyWhenPressed = value; } - /** - * 主函数 - * @param args 入口参数 - */ - public static void main(String... args) { - try { - UIManager.setLookAndFeel( new FineLightLaf() ); - } catch( Exception ex ) { - System.err.println( "Failed to initialize LaF" ); - } - JFrame jf = new JFrame("test"); - jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JPanel content = (JPanel) jf.getContentPane(); -// content.setLayout(new BorderLayout()); - - UIButton bb = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); - bb.setEnabled(true); - // bb.setBounds(20, 20,content.getSize().width, bb.getPreferredSize().height); -// bb.setPreferredSize(new Dimension(100, 30)); - bb.setBounds(0, 0, bb.getPreferredSize().width, bb.getPreferredSize().height); - bb.setMargin(new Insets(10,10,10,10)); - UIButton cc = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); - cc.setEnabled(true); -// cc.setPreferredSize(new Dimension(100, 30)); - cc.setBounds(0, 0, cc.getPreferredSize().width, cc.getPreferredSize().height); - cc.setMargin(new Insets(20,20,20,20)); - content.add(bb, BorderLayout.SOUTH); - content.add(cc,BorderLayout.NORTH); - GUICoreUtils.centerWindow(jf); - jf.setSize(400, 400); - new UiInspector(); - jf.setVisible(true); - } - /** * 给组件登记一个观察者监听事件 * @@ -355,7 +311,4 @@ public class UIButton extends JButton implements UIObserver, UITextComponent { return true; } - - - } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButton.java index 31a6d963d9..0129909b08 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButton.java @@ -1,7 +1,6 @@ package com.fr.design.gui.ibutton; -import com.fr.base.Utils; -import com.fr.design.constants.UIConstants; +import com.fine.theme.icon.LazyIcon; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; import com.fr.design.event.UIObserver; @@ -11,39 +10,38 @@ import com.fr.design.style.color.ColorControlWindow; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; -import javax.swing.AbstractButton; -import javax.swing.ButtonModel; import javax.swing.Icon; -import javax.swing.JComponent; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.EventListenerList; import java.awt.Color; -import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class UIColorButton extends UIButton implements PopupHider, UIObserver, GlobalNameObserver { - public static final int SIZE = 16; - public static final int SIZE_2 = 2; - public static final int SIZE_4 = 4; - public static final int SIZE_6 = 6; + + private static final String UI_CLASS_ID = "ColorButtonUI"; + private static final int POPUP_MENU_SHIFT = -70; private Color color = Color.BLACK; private ColorControlWindow popupWin; - private EventListenerList colorChangeListenerList = new EventListenerList(); + private final EventListenerList colorChangeListenerList = new EventListenerList(); private boolean isEventBanned = false; private String colorButtonName = ""; private UIObserverListener uiObserverListener; private GlobalNameListener globalNameListener = null; + @Override + public String getUIClassID() { + return UI_CLASS_ID; + } + public UIColorButton() { - this(UIConstants.FONT_ICON); + this(new LazyIcon("foreground")); } public UIColorButton(Icon icon) { super(icon); - setUI(getButtonUI()); addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { @@ -63,38 +61,18 @@ public class UIColorButton extends UIButton implements PopupHider, UIObserver, G private void iniListener() { if (shouldResponseChangeListener()) { - this.addColorChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - if (uiObserverListener == null) { - return; - } - if (globalNameListener != null && shouldResponseNameListener()) { - globalNameListener.setGlobalName(colorButtonName); - } - uiObserverListener.doChange(); + this.addColorChangeListener(e -> { + if (uiObserverListener == null) { + return; + } + if (globalNameListener != null && shouldResponseNameListener()) { + globalNameListener.setGlobalName(colorButtonName); } + uiObserverListener.doChange(); }); } } - private UIButtonUI getButtonUI() { - return new UIButtonUI() { - @Override - protected void paintIcon(Graphics g, JComponent c) { - super.paintIcon(g, c); - AbstractButton b = (AbstractButton) c; - ButtonModel model = b.getModel(); - if (model.isEnabled()) { - g.setColor(UIColorButton.this.getColor()); - } else { - g.setColor(new Color(Utils.filterRGB(UIColorButton.this.getColor().getRGB(), 50))); - } - g.fillRect((b.getWidth() - SIZE) / SIZE_2, b.getHeight() - SIZE_6, SIZE, SIZE_4); - } - }; - } - public void setEventBanned(boolean isEventBanned) { this.isEventBanned = isEventBanned; } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButtonWithAuto.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButtonWithAuto.java index a7dcad008a..b10b1d91f8 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButtonWithAuto.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButtonWithAuto.java @@ -1,5 +1,6 @@ package com.fr.design.gui.ibutton; +import com.fine.theme.icon.LazyIcon; import com.fr.chart.base.ChartConstants; import com.fr.design.constants.UIConstants; import com.fr.design.style.color.ColorControlWindow; @@ -12,7 +13,7 @@ public class UIColorButtonWithAuto extends UIColorButton { protected void checkColorChange(Color oldColor, Color newColor) { if (ComparatorUtils.equals(oldColor, ChartConstants.AUTO_FONT_COLOR) && !ComparatorUtils.equals(newColor, ChartConstants.AUTO_FONT_COLOR)) { - setIcon(UIConstants.FONT_ICON); + setIcon(new LazyIcon("foreground")); } if (!ComparatorUtils.equals(oldColor, ChartConstants.AUTO_FONT_COLOR) && ComparatorUtils.equals(newColor, ChartConstants.AUTO_FONT_COLOR)) { diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java index ff3398077d..0cb7d6af15 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java @@ -25,6 +25,7 @@ import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; * created by vito on 2023/12/28 **/ public class UICombinationButton extends JPanel { + private static final String UI_CLASS_ID = "CombinationButtonUI"; protected UIButton leftButton; @@ -129,24 +130,15 @@ public class UICombinationButton extends JPanel { return leftButton; } - public void setExtraPainted(boolean isExtraPainted) { -// if (!isExtraPainted) { -// leftButton.setBackground(null); -// rightButton.setBackground(null); -// leftButton.setOpaque(false); -// rightButton.setOpaque(false); -// } - } - public UIButton getRightButton() { return rightButton; } public void set4Toolbar() { - leftButton.setNormalPainted(false); - rightButton.setNormalPainted(false); - leftButton.setBorderPaintedOnlyWhenPressed(true); - rightButton.setBorderPaintedOnlyWhenPressed(true); + leftButton.setBorderPainted(false); + setStyle(leftButton, "inToolbarLeft"); + rightButton.setBorderPainted(false); + setStyle(rightButton, "inToolbarRight"); } protected void showPopWindow(JPopupMenu menu) { diff --git a/designer-base/src/main/java/com/fr/design/style/color/UIToolbarColorButton.java b/designer-base/src/main/java/com/fr/design/style/color/UIToolbarColorButton.java index 5c27bc58cb..d3f3600dfb 100644 --- a/designer-base/src/main/java/com/fr/design/style/color/UIToolbarColorButton.java +++ b/designer-base/src/main/java/com/fr/design/style/color/UIToolbarColorButton.java @@ -37,6 +37,12 @@ public class UIToolbarColorButton extends UICombinationButton implements PopupHi public UIToolbarColorButton(Icon icon) { super(new UIColorButton(icon), new UIButton(new LazyIcon("popup"))); getLeftButton().setEventBanned(true); + set4Toolbar(); + + initListener(); + } + + private void initListener() { getRightButton().addFocusListener(new FocusListener() { @Override @@ -48,19 +54,12 @@ public class UIToolbarColorButton extends UICombinationButton implements PopupHi hidePopupMenu(); } }); - iniListener(); - } - - private void iniListener() { if (shouldResponseChangeListener()) { - this.addColorChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - if (uiObserverListener == null) { - return; - } - uiObserverListener.doChange(); + this.addColorChangeListener(e -> { + if (uiObserverListener == null) { + return; } + uiObserverListener.doChange(); }); } } diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties index 41d855e279..ce1aaba19a 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties @@ -49,4 +49,5 @@ SelectBoxUI=com.fine.theme.light.ui.FineSelectBoxUI CombinationButtonUI=com.fine.theme.light.ui.FineCombinationButtonUI InputUI=com.fine.theme.light.ui.FineInputUI GradientBarUI=com.fine.theme.light.ui.FineGradientBarUI -TemplateTabPaneUI=com.fine.theme.light.ui.FineTemplateTabPaneUI \ No newline at end of file +TemplateTabPaneUI=com.fine.theme.light.ui.FineTemplateTabPaneUI +ColorButtonUI=com.fine.theme.light.ui.FineColorButtonUI diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index b67d4b1087..d6075c4480 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -147,7 +147,7 @@ Button.margin = 2,12,2,12 Button.iconTextGap = 4 Button.rollover = true Button.defaultButtonFollowsFocus = false -Button.borderWidth = 2 +Button.borderWidth = 1 Button.medium.margin = 2,12,2,12 Button.small.margin = 0,10,0,10 @@ -189,13 +189,15 @@ Button.default.borderColor = @accentButtonDefaultBorderColor Button.default.hoverBorderColor = $Button.hoverBorderColor Button.default.focusedBorderColor = $Button.focusedBorderColor Button.default.focusColor = $Component.focusColor -Button.default.borderWidth = 2 +Button.default.borderWidth = 1 -Button.toolbar.hoverBackground = darken($Button.background,12%,derived) -Button.toolbar.pressedBackground = darken($Button.background,15%,derived) -Button.toolbar.selectedBackground = $Button.selectedBackground -Button.toolbar.margin = 3,3,3,3 -Button.toolbar.spacingInsets = 1,2,1,2 +Button.toolbar.background = #fff +Button.toolbar.hoverBackground = $fill.hover +Button.toolbar.pressedBackground = $fill.click +Button.toolbar.selectedBackground = $fill.click +Button.toolbar.margin = 4,4,4,4 +Button.toolbar.borderWidth = 0 +Button.toolbar.spacingInsets = 0,0,0,0 Button.group.background = #FFF Button.group.selectedBackground = #2576EF @@ -414,47 +416,6 @@ HelpButton.borderWidth = $?Button.borderWidth HelpButton.innerFocusWidth = $?Button.innerFocusWidth -#---- InternalFrame ---- - -InternalFrame.border = com.formdev.flatlaf.ui.FlatInternalFrameUI$FlatInternalFrameBorder -InternalFrame.borderLineWidth = 1 -InternalFrame.borderMargins = 6,6,6,6 -InternalFrame.buttonSize = 24,24 -InternalFrame.closeIcon = com.formdev.flatlaf.icons.FlatInternalFrameCloseIcon -InternalFrame.iconifyIcon = com.formdev.flatlaf.icons.FlatInternalFrameIconifyIcon -InternalFrame.maximizeIcon = com.formdev.flatlaf.icons.FlatInternalFrameMaximizeIcon -InternalFrame.minimizeIcon = com.formdev.flatlaf.icons.FlatInternalFrameRestoreIcon -InternalFrame.windowBindings = null - -# drop shadow -InternalFrame.dropShadowPainted = true -InternalFrame.activeDropShadowColor = null -InternalFrame.activeDropShadowInsets = 5,5,6,6 -InternalFrame.inactiveDropShadowColor = null -InternalFrame.inactiveDropShadowInsets = 3,3,4,4 - -InternalFrame.activeTitleBackground = #fff -InternalFrame.activeTitleForeground = @foreground -InternalFrame.inactiveTitleBackground = darken($InternalFrame.activeTitleBackground,2%) -InternalFrame.inactiveTitleForeground = @disabledForeground - -InternalFrame.activeBorderColor = shade(@background,40%) -InternalFrame.inactiveBorderColor = shade(@background,20%) - -InternalFrame.buttonHoverBackground = darken($InternalFrame.activeTitleBackground,10%,derived) -InternalFrame.buttonPressedBackground = darken($InternalFrame.activeTitleBackground,20%,derived) -InternalFrame.closeHoverBackground = lazy(Actions.Red) -InternalFrame.closePressedBackground = darken(Actions.Red,10%,lazy) -InternalFrame.closeHoverForeground = #fff -InternalFrame.closePressedForeground = #fff - -InternalFrame.activeDropShadowOpacity = 0.25 -InternalFrame.inactiveDropShadowOpacity = 0.5 - -#---- InternalFrameTitlePane ---- - -InternalFrameTitlePane.border = 0,8,0,0 - #---- List ---- List.border = 0,0,0,0 @@ -1241,7 +1202,7 @@ CellOtherSetPane.height=$Component.defaultHeight disabledSelectedBackground : #F2F4F8; \ borderWidth : 0 -[style]Button.small = margin : 0,10,0,10; +[style]Button.abc = margin : 0,8,0,8 [style]Button.secondary = \ background : $Button.background; \ @@ -1253,14 +1214,23 @@ CellOtherSetPane.height=$Component.defaultHeight hoverBorderColor : $Button.hoverBorderColor; \ focusedBorderColor : $Button.focusedBorderColor; \ focusColor : $Component.focusColor; \ - borderWidth : 2 + borderWidth : 1 [style]CombinationButton.primary = \ - background : @BrandColor; \ - arc : 3 + background : @BrandColor; \ + arc : 3 + +[style]CombinationButton.toolbar = \ + background : #fff + +[style]Button.inToolbarLeft = \ + margin : 4,4,4,0 + +[style]Button.inToolbarRight = \ + margin : 1,1,1,1 [style]ToolBar.topTools = \ - background: #fff + background: #fff #---- clearButton ---- # for clear/cancel button in text fields diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java index e0d0dad170..2dad573779 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java @@ -6,8 +6,11 @@ import com.fr.design.gui.ibutton.UICombinationButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.storybook.Story; import com.fr.design.gui.storybook.StoryBoard; +import com.fr.design.style.color.UIToolbarColorButton; import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JToolBar; import static com.fine.swing.ui.layout.Layouts.cell; import static com.fine.swing.ui.layout.Layouts.column; @@ -145,7 +148,7 @@ public class ButtonStoryBoard extends StoryBoard { cell(new UICombinationButton("按钮", new LazyIcon("triangle_down"))) .with(it -> { setStyle(it, STYLE_PRIMARY); - it.setExtraPainted(false); +// it.setExtraPainted(false); }), cell(new UICombinationButton("按钮", new LazyIcon("triangle_down"))) .with(it -> setStyle(it, STYLE_PRIMARY)), @@ -153,7 +156,21 @@ public class ButtonStoryBoard extends StoryBoard { cell(new JButton("按钮", new LazyIcon("add"))), cell(new JButton(new LazyIcon("multi"))) ), + row(20, + cell(new UIToolbarColorButton(new LazyIcon("foreground"))), + cell(toolbar()) + .with(it -> { + }) + ), flex() ); } + + public JComponent toolbar(){ + JToolBar bar = new JToolBar(); + UIToolbarColorButton foreground = new UIToolbarColorButton(new LazyIcon("foreground")); + bar.add(foreground); + setStyle(bar, "topTools"); + return bar; + } } diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/UIToolbarBorderButton.java b/designer-realize/src/main/java/com/fr/design/actions/cell/UIToolbarBorderButton.java index a5c2c123b1..e6f940ea03 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/UIToolbarBorderButton.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/UIToolbarBorderButton.java @@ -47,6 +47,7 @@ public class UIToolbarBorderButton extends UICombinationButton implements PopupH public UIToolbarBorderButton(Icon icon, ElementCasePane reportPane) { super(new UIButton(icon), new UIButton(new LazyIcon("popup"))); + set4Toolbar(); this.reportPane = reportPane; } diff --git a/designer-realize/src/main/java/com/fr/start/MainDesigner.java b/designer-realize/src/main/java/com/fr/start/MainDesigner.java index 8ab1ea9eb2..e054956ea8 100644 --- a/designer-realize/src/main/java/com/fr/start/MainDesigner.java +++ b/designer-realize/src/main/java/com/fr/start/MainDesigner.java @@ -51,7 +51,6 @@ import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.DesignUtils; import com.fr.design.utils.DesignerPort; import com.fr.design.utils.concurrent.ThreadFactoryBuilder; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.env.utils.DesignerInteractionHistory; import com.fr.event.Event; import com.fr.event.EventDispatcher; @@ -358,11 +357,9 @@ public class MainDesigner extends BaseDesigner { for (UIMenuItem item : items) { menu.add(item); } - GUICoreUtils.showPopupMenu(menu, run, run.getX(), run.getY() - 1 + run.getHeight()); + menu.show(run, 0, run.getHeight() + 1); }); run.setPrimary(); - run.setExtraPainted(false); - run.set4Toolbar(); run.getLeftButton().setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview")); run.getRightButton().setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Dropdown_More_Preview")); return run; From 80f3e6d05a418b23ddb146af7697300c7ce385fc Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 4 Jan 2024 09:45:46 +0800 Subject: [PATCH 075/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/gui/ibutton/UIButton.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java index 65e508ac3c..9b89a90419 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java @@ -280,8 +280,8 @@ public class UIButton extends JButton implements UIObserver, UITextComponent { */ public void setNormalPainted(boolean isNormalPressed) { this.isNormalPainted = isNormalPressed; - boolean isPrimary = FineClientProperties.hasStyle(this, FineClientProperties.STYLE_PRIMARY); - if (!isNormalPainted() && !isPrimary) { + boolean primary = FineClientProperties.hasStyle(this, FineClientProperties.STYLE_PRIMARY); + if (!isNormalPainted() && !primary) { setOpaque(false); } } From cc1abc42d649a96afe71b291300bd31e2001d3f9 Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 4 Jan 2024 09:55:10 +0800 Subject: [PATCH 076/302] =?UTF-8?q?REPORT-99485=20=E4=BF=AE=E5=A4=8Dtoggle?= =?UTF-8?q?button=E5=9C=A8=E5=B7=A5=E5=85=B7=E6=A0=8F=E7=9A=84=E9=80=89?= =?UTF-8?q?=E4=B8=AD=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/light/ui/laf/FineLightLaf.properties | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index d6075c4480..7a7a852246 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -155,7 +155,7 @@ Button.background = @buttonBackground Button.focusedBackground = @buttonBackground Button.hoverBackground = $fill.hover Button.pressedBackground = $fill.click -Button.selectedBackground = darken($Button.background,20%,derived) +Button.selectedBackground = $fill.click Button.selectedForeground = $Button.foreground Button.disabledSelectedBackground = darken($Button.background,13%,derived) Button.disabledBackground = $fill.disabled @@ -415,7 +415,6 @@ HelpButton.pressedBackground = $?Button.pressedBackground HelpButton.borderWidth = $?Button.borderWidth HelpButton.innerFocusWidth = $?Button.innerFocusWidth - #---- List ---- List.border = 0,0,0,0 @@ -1020,7 +1019,7 @@ ToggleButton.disabledSelectedBackground = darken($ToggleButton.background,13%,de ToggleButton.toolbar.hoverBackground = $Button.toolbar.hoverBackground ToggleButton.toolbar.pressedBackground = $Button.toolbar.pressedBackground -ToggleButton.toolbar.selectedBackground = $ToggleButton.selectedBackground +ToggleButton.toolbar.selectedBackground = $Button.toolbar.selectedBackground # button type "tab" ToggleButton.tab.underlineHeight = 0 From 383d52bc30eb5066dace13044c79f5c3720ffb19 Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 4 Jan 2024 11:30:22 +0800 Subject: [PATCH 077/302] =?UTF-8?q?REPORT-99485=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=AD=97=E4=BD=93=E4=B8=BA=E5=B9=B3=E5=8F=B0=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/utils/DesignUtils.java | 13 ------------- .../theme/light/ui/laf/FineLightLaf.properties | 15 +++++++++------ 2 files changed, 9 insertions(+), 19 deletions(-) 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 2da9646639..1b9925be3c 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 @@ -36,7 +36,6 @@ import com.fr.workspace.WorkContext; import org.jetbrains.annotations.NotNull; import javax.swing.SwingUtilities; -import javax.swing.UIManager; import java.awt.Desktop; import java.awt.Font; import java.io.BufferedReader; @@ -51,7 +50,6 @@ import java.net.ServerSocket; import java.net.Socket; import java.net.URI; import java.nio.charset.StandardCharsets; -import java.util.Enumeration; import java.util.Locale; import java.util.Set; import java.util.concurrent.Callable; @@ -307,17 +305,6 @@ public class DesignUtils { */ public static void initLookAndFeel() { FineLightLaf.setup(); - //获取当前系统语言下设计器用的默认字体 - FRFont guiFRFont = getDefaultGUIFont(); - //指定UIManager中字体 - Enumeration keys = UIManager.getDefaults().keys(); - while (keys.hasMoreElements()) { - String key = keys.nextElement().toString(); - - if (key.endsWith(".font")) { - UIManager.put(key, isTextField(key) ? getNamedFont("Dialog") : guiFRFont); - } - } FlatUIDefaultsInspector.install( "ctrl shift alt Y" ); } diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index 7a7a852246..6ca738de61 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -32,14 +32,17 @@ # font weights # Windows -[win]light.font = "Microsoft YaHei", "Microsoft JhengHei", "MingLiU", "Arial" -[win]semibold.font = "Microsoft YaHei", "Microsoft JhengHei", "MingLiU", "Arial" +[win]defaultFont = "Microsoft YaHei", "Microsoft JhengHei", MingLiU, Arial +[win]light.font = "Microsoft YaHei", "Microsoft JhengHei", MingLiU, "Arial +[win]semibold.font = "Microsoft YaHei", "Microsoft JhengHei", MingLiU, Arial # macOS -[mac]light.font = "PingFang SC", "Apple LiGothic", "Apple LiSun", "Arial" -[mac]semibold.font = "PingFang SC", "Apple LiGothic", "Apple LiSun", "Arial" +[mac]defaultFont = 12 "PingFang SC", "Apple LiGothic", "Apple LiSun", Arial +[mac]light.font = "PingFang SC", "Apple LiGothic", "Apple LiSun", Arial +[mac]semibold.font = "PingFang SC", "Apple LiGothic", "Apple LiSun", Arial # Linux -[linux]light.font = "Noto SansCJK", "SimHei", "Arial", "Ubuntu" -[linux]semibold.font = "Noto SansCJK", "SimHei", "Arial", "Ubuntu" +[linux]defaultFont = 12 "Noto SansCJK", SimHei, Arial, Ubuntu +[linux]light.font = "Noto SansCJK", SimHei, Arial, Ubuntu +[linux]semibold.font = "Noto SansCJK", SimHei, Arial, Ubuntu #---- variables ---- Component.defaultHeight=24 From b3f8663e3b3e3f32ab2c8f6b3ed702bd2ffb15e8 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Thu, 4 Jan 2024 15:09:03 +0800 Subject: [PATCH 078/302] =?UTF-8?q?REPORT-107973=20=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=EF=BC=8C=E5=8C=97=E5=8C=BA=E8=83=8C=E6=99=AF?= =?UTF-8?q?=E3=80=81=E6=8A=A5=E8=A1=A8=E5=9D=97=E8=BE=B9=E6=A1=86=20?= =?UTF-8?q?=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 19 ++++- .../light/ui/FineReportComponentBorder.java | 28 ++++++++ .../ui/FineReportComponentCompositeUI.java | 40 +++++++++++ .../DefaultTemplateTreeDefineProcessor.java | 7 +- .../com/fr/design/gui/imenu/UIHeadMenu.java | 6 +- .../com/fr/design/gui/imenu/UIMenuItem.java | 5 -- .../mainframe/CenterRegionContainerPane.java | 15 ++-- .../fr/design/mainframe/DesktopCardPane.java | 1 + .../fr/design/mainframe/JFormSliderPane.java | 69 +++++------------- .../mainframe/NorthRegionContainerPane.java | 4 +- .../mainframe/loghandler/LogMessageBar.java | 60 +++++++--------- .../main/java/com/fr/design/menu/MenuDef.java | 14 +++- .../ui/NotificationCenterPane.java | 4 +- .../com/fine/theme/icon/cell/cellClear.svg | 5 ++ .../theme/icon/cell/cellClear_disable.svg | 5 ++ .../theme/icon/cell/cellConditionalAttr.svg | 5 ++ .../icon/cell/cellConditionalAttr_disable.svg | 5 ++ .../fine/theme/icon/cell/cellElementAttr.svg | 5 ++ .../icon/cell/cellElementAttr_disable.svg | 5 ++ .../fine/theme/icon/cell/cellExpandAttr.svg | 11 +++ .../icon/cell/cellExpandAttr_disable.svg | 11 +++ .../theme/icon/cell/cellHyperLinkAttr.svg | 14 ++++ .../icon/cell/cellHyperLinkAttr_disable.svg | 14 ++++ .../fine/theme/icon/cell/cellOtherAttr.svg | 5 ++ .../theme/icon/cell/cellOtherAttr_disable.svg | 5 ++ .../fine/theme/icon/cell/cellPresentAttr.svg | 5 ++ .../icon/cell/cellPresentAttr_disable.svg | 5 ++ .../fine/theme/icon/cell/cellStyleAttr.svg | 5 ++ .../theme/icon/cell/cellStyleAttr_disable.svg | 5 ++ .../fine/theme/icon/cell/cellWidgetAttr.svg | 7 ++ .../icon/cell/cellWidgetAttr_disable.svg | 7 ++ .../theme/icon/filetree/monochrome_copy.svg | 5 ++ .../icon/filetree/monochrome_copy_disable.svg | 5 ++ .../theme/icon/filetree/monochrome_paste.svg | 5 ++ .../filetree/monochrome_paste_disable.svg | 5 ++ .../com/fine/theme/icon/filetree/move.svg | 5 ++ .../fine/theme/icon/filetree/move_disable.svg | 5 ++ .../com/fine/theme/icon/log/logMsg.svg | 5 ++ .../fine/theme/icon/log/logMsg_disable.svg | 5 ++ .../com/fine/theme/icon/log/logMsg_dot.svg | 8 +++ .../theme/icon/log/logMsg_dot_disable.svg | 8 +++ .../theme/light/ui/laf/FineLaf.properties | 1 + .../light/ui/laf/FineLightLaf.properties | 27 +++++-- .../actions/cell/CellAttributeAction.java | 4 +- .../actions/cell/CellExpandAttrAction.java | 4 +- .../actions/cell/CellStyleAttrAction.java | 5 +- .../actions/cell/CellWidgetAttrAction.java | 4 +- .../cell/ConditionAttributesAction.java | 4 +- .../design/actions/cell/EditCellAction.java | 4 +- .../design/actions/edit/HyperlinkAction.java | 4 +- .../utils/DeprecatedActionManager.java | 12 ++-- .../fr/design/cell/bar/DynamicScrollBar.java | 1 + .../mainframe/ReportComponentComposite.java | 20 ++++-- .../fr/design/mainframe/SheetNameTabPane.java | 72 +++++++++++-------- .../alphafine/component/AlphaFinePane.java | 4 +- .../design/mainframe/bbs/UserInfoLabel.java | 15 ++-- .../fr/design/mainframe/bbs/UserInfoPane.java | 4 -- .../src/main/java/com/fr/grid/GridCorner.java | 12 ++-- 58 files changed, 445 insertions(+), 204 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineReportComponentBorder.java create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineReportComponentCompositeUI.java create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellClear.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellClear_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellConditionalAttr.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellConditionalAttr_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellElementAttr.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellElementAttr_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellExpandAttr.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellExpandAttr_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellHyperLinkAttr.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellHyperLinkAttr_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellOtherAttr.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellOtherAttr_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellPresentAttr.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellPresentAttr_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellStyleAttr.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellStyleAttr_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellWidgetAttr.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/cell/cellWidgetAttr_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_copy.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_copy_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_paste.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_paste_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/move.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/filetree/move_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/log/logMsg.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/log/logMsg_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/log/logMsg_dot.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/log/logMsg_dot_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index bd0c0157fd..17a5f62791 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -220,7 +220,24 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("dot", "com/fine/theme/icon/dot.svg", true), new SvgIconSource("expand_popup", "com/fine/theme/icon/popup/expand_popup.svg"), - new SvgIconSource("collapse_popup", "com/fine/theme/icon/popup/collapse_popup.svg") + new SvgIconSource("collapse_popup", "com/fine/theme/icon/popup/collapse_popup.svg"), + + new SvgIconSource("logMsg", "com/fine/theme/icon/log/logMsg.svg", true), + new SvgIconSource("logMsg_dot", "com/fine/theme/icon/log/logMsg_dot.svg", true), + + // 右键弹窗 + new SvgIconSource("cellClear", "com/fine/theme/icon/cell/cellClear.svg", true), + new SvgIconSource("cellExpandAttr", "com/fine/theme/icon/cell/cellExpandAttr.svg", true), + new SvgIconSource("cellStyleAttr", "com/fine/theme/icon/cell/cellStyleAttr.svg", true), + new SvgIconSource("cellOtherAttr", "com/fine/theme/icon/cell/cellOtherAttr.svg", true), + new SvgIconSource("cellWidgetAttr", "com/fine/theme/icon/cell/cellWidgetAttr.svg", true), + new SvgIconSource("cellConditionalAttr", "com/fine/theme/icon/cell/cellConditionalAttr.svg", true), + new SvgIconSource("cellHyperLinkAttr", "com/fine/theme/icon/cell/cellHyperLinkAttr.svg", true), + new SvgIconSource("cellPresentAttr", "com/fine/theme/icon/cell/cellPresentAttr.svg", true), + new SvgIconSource("cellElementAttr", "com/fine/theme/icon/cell/cellElementAttr.svg", true), + new SvgIconSource("move", "com/fine/theme/icon/filetree/move.svg", true), + new SvgIconSource("monochrome_copy", "com/fine/theme/icon/filetree/monochrome_copy.svg", true), + new SvgIconSource("monochrome_paste", "com/fine/theme/icon/filetree/monochrome_paste.svg", true) ); } } diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineReportComponentBorder.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineReportComponentBorder.java new file mode 100644 index 0000000000..6d381761ac --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineReportComponentBorder.java @@ -0,0 +1,28 @@ +package com.fine.theme.light.ui; + +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatRoundBorder; + +import javax.swing.UIManager; +import java.awt.Color; +import java.awt.Component; + +/** + * 报表编辑区域边框 + * + * @author Leo.Qin + * @since 11.0 + * Created on 2024/1/2 + */ +public class FineReportComponentBorder extends FlatRoundBorder { + + @Override + protected int getArc(Component c) { + return FineUIUtils.getAndScaleInt("Center.arc", 10); + } + + @Override + protected Color getBorderColor(Component c) { + return UIManager.getColor("Center.ZoneBorderColor"); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineReportComponentCompositeUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineReportComponentCompositeUI.java new file mode 100644 index 0000000000..7886af3c33 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineReportComponentCompositeUI.java @@ -0,0 +1,40 @@ +package com.fine.theme.light.ui; + +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatPanelUI; + +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.plaf.ComponentUI; + +/** + * 报表编辑区域UI + * + * @author Leo.Qin + * @since 11.0 + * Created on 2024/1/2 + */ +public class FineReportComponentCompositeUI extends FlatPanelUI { + /** + * @param shared + * @since 2 + */ + protected FineReportComponentCompositeUI(boolean shared) { + super(shared); + } + + /** + * 创建UI + */ + public static ComponentUI createUI(JComponent c) { + return new FineReportComponentCompositeUI(false); + } + + @Override + protected void installDefaults(JPanel p) { + super.installDefaults(p); + this.arc = FineUIUtils.getAndScaleInt("Center.arc", 10); + } + + +} diff --git a/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java b/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java index 1d2048fa28..39ce819dd6 100644 --- a/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java +++ b/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java @@ -1,5 +1,6 @@ package com.fr.design.file; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.actions.file.DelFileAction; import com.fr.design.actions.file.LocateAction; @@ -147,7 +148,7 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi public CopyAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Copy")); this.setMnemonic('C'); - this.setSmallIcon("/com/fr/design/images/m_edit/copy"); + this.setSmallIcon(new LazyIcon("monochrome_copy")); } @Override @@ -190,7 +191,7 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi public PasteAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Action_Paste_Name")); this.setMnemonic('P'); - this.setSmallIcon("/com/fr/design/images/m_edit/paste"); + this.setSmallIcon(new LazyIcon("monochrome_paste")); } @Override @@ -315,7 +316,7 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi public MoveAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Move")); - this.setSmallIcon("/com/fr/design/images/m_edit/move"); + this.setSmallIcon(new LazyIcon("move")); } @Override diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIHeadMenu.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIHeadMenu.java index 77974f67d2..f71abbaec8 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIHeadMenu.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIHeadMenu.java @@ -1,15 +1,15 @@ package com.fr.design.gui.imenu; -import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIUtils; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.MenuElement; -import javax.swing.UIManager; import javax.swing.border.EmptyBorder; import java.awt.Component; +import java.awt.Insets; /** * @author null @@ -20,7 +20,7 @@ public class UIHeadMenu extends UIMenu { public UIHeadMenu(String name) { super(name); - setBorder(new EmptyBorder(FineUIScale.scale(UIManager.getInsets("HeadMenu.borderMargins")))); + setBorder(new EmptyBorder(FineUIUtils.getAndScaleUIInsets("HeadMenu.borderMargins", new Insets(5, 9, 5, 10)))); } @Override diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuItem.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuItem.java index d5bd493bde..3d7a0b85ba 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuItem.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuItem.java @@ -33,9 +33,4 @@ public class UIMenuItem extends JMenuItem{ setAction(action); } - @Override - public String getText() { - return StringUtils.BLANK + super.getText(); - } - } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java index 23199fb02d..ea9a6110ec 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java @@ -1,6 +1,5 @@ package com.fr.design.mainframe; -import com.fine.theme.utils.FineClientProperties; import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.DesignState; import com.fr.design.base.mode.DesignModeContext; @@ -17,7 +16,6 @@ import org.jetbrains.annotations.Nullable; import javax.swing.JComponent; import javax.swing.JPanel; -import javax.swing.UIManager; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; @@ -26,6 +24,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import static com.fine.theme.utils.FineClientProperties.setStyle; + /** * @author shine @@ -69,9 +69,8 @@ public class CenterRegionContainerPane extends JPanel { public CenterRegionContainerPane() { toolbarPane = new JPanel(); - toolbarPane.setBorder(new ScaledEmptyBorder(6, 0, 10, 0)); + toolbarPane.setBorder(new ScaledEmptyBorder(6, 0, 0, 0)); toolbarPane.setLayout(FRGUIPaneFactory.createBorderLayout()); - toolbarPane.setBackground(UIManager.getColor("Center.SpaceColor")); eastPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); largeToolbar = getToolBarMenuDock().createLargeToolbar(); eastCenterPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); @@ -86,9 +85,9 @@ public class CenterRegionContainerPane extends JPanel { this.setLayout(new BorderLayout()); this.add(centerTemplateCardPane = new DesktopCardPane(), BorderLayout.CENTER); - centerTemplateCardPane.setBorder(new ScaledEmptyBorder(0, 10, 10, 10)); + centerTemplateCardPane.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); this.add(toolbarPane, BorderLayout.NORTH); - this.setBackground(UIManager.getColor("Center.SpaceColor")); + setStyle(this, "NormalColorPane"); } public ToolBarMenuDock getToolBarMenuDock() { @@ -100,7 +99,7 @@ public class CenterRegionContainerPane extends JPanel { */ private void combineUpTooBar() { combineUp = new UIToolbar(FlowLayout.LEFT); - FineClientProperties.setStyle(combineUp, "topTools"); + setStyle(combineUp, "topTools"); combineUp.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); combineUp.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 2)); setUpUpToolBar(null); @@ -222,7 +221,7 @@ public class CenterRegionContainerPane extends JPanel { // 颜色,字体那些按钮的工具栏 toolbarPane.add(toolbarComponent = ad.resetToolBar(toolbarComponent, plus), BorderLayout.CENTER); - FineClientProperties.setStyle(toolbarComponent, "topTools"); + setStyle(toolbarComponent, "topTools"); toolbarComponent.setBorder(new ScaledEmptyBorder(0, 10, 10, 10)); JPanel customNorthPane = strategy.customNorthPane(toolbarPane, plus); if (!isExist(customNorthPane)) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java index 9757b0f0b5..02fa561416 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java @@ -54,6 +54,7 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener protected DesktopCardPane() { setLayout(new BorderLayout()); + setOpaque(false); layeredPane.add(transparentPane, TRANSPARENT_LAYER); layeredPane.add(failedPane, FAILED_LAYER); layeredPane.add(forbiddenPane, FORBIDDEN_LAYER); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java b/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java index ec87157ca4..824dd08044 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java @@ -2,7 +2,9 @@ package com.fr.design.mainframe; import com.fine.theme.icon.LazyIcon; import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.FlatDarculaLaf; +import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.base.BaseUtils; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; @@ -16,7 +18,6 @@ import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import javax.swing.plaf.basic.BasicSliderUI; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; @@ -26,7 +27,6 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Point; -import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; @@ -34,8 +34,11 @@ import java.awt.event.FocusListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; +import java.awt.geom.Path2D; import java.math.BigDecimal; +import static com.fine.theme.utils.FineClientProperties.setStyle; + /** * Created by MoMeak on 2017/7/13. */ @@ -65,6 +68,7 @@ public class JFormSliderPane extends JPanel { public JFormSliderPane() { this.setLayout(new BorderLayout()); + setStyle(this, "LightGreyPanel"); initSlider(); initDownUpButton(); initShowValField(); @@ -76,7 +80,7 @@ public class JFormSliderPane extends JPanel { UILabel uiLabel = new UILabel(SUFFIX); uiLabel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4)); panel.add(uiLabel); -// panel.setBackground(BACK_COLOR); + panel.setOpaque(false); this.add(panel, BorderLayout.NORTH); } @@ -222,6 +226,15 @@ public class JFormSliderPane extends JPanel { return result; } + @Override + public void paintComponent(Graphics g) { + int arc = FineUIUtils.getAndScaleInt("Center.arc", 10) / 2; + Path2D roundedPath = FineUIUtils.createPartRoundRectangle(0, 0, this.getWidth(), this.getHeight(), 0, 0, arc, 0); + FlatUIUtils.setRenderingHints(g); + Graphics2D g2 = (Graphics2D) g; + g2.setColor(getBackground()); + g2.fill(roundedPath); + } public static double divide(double v1, double v2, int scale) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); @@ -282,56 +295,6 @@ public class JFormSliderPane extends JPanel { this.slider.addChangeListener(changeListener); } - class JSliderPaneUI extends BasicSliderUI { - - private static final int THUMB_XOFFSET = 8; - private static final int THUMB_YOFFSET = 3; - private static final int FOUR = 4; - private static final int FIVE = 5; - private static final int SIX = 6; - private static final int MID_X_SHIFT = 2; // 中点标记的水平位置偏移 - - public JSliderPaneUI(UISlider b) { - super(b); - } - - /** - * 绘制指示物 - */ - public void paintThumb(Graphics g) { - Rectangle knobBounds = thumbRect; - Graphics2D g2d = (Graphics2D) g; - g2d.drawImage(APPFIT_V0, knobBounds.x - THUMB_XOFFSET, knobBounds.y + THUMB_YOFFSET, null); - g2d.dispose(); - } - - /** - * 绘制刻度轨迹 - */ - public void paintTrack(Graphics g) { - int cy, cw; - Rectangle trackBounds = trackRect; - if (slider.getOrientation() == UISlider.HORIZONTAL) { - Graphics2D g2 = (Graphics2D) g; - cy = (trackBounds.height / 2); - cw = trackBounds.width; -// g2.setPaint(BACK_COLOR); - g2.fillRect(0, -cy, cw + 10, cy * 4); - g.setColor(new Color(216, 216, 216)); - g.drawLine(0, cy, cw + 3, cy); - g.drawLine(MID_X_SHIFT + cw / 2, cy - FOUR, MID_X_SHIFT + cw / 2, cy + FOUR); - } else { - super.paintTrack(g); - } - } - - public void setThumbLocation(int x, int y) { - super.setThumbLocation(x, y); - slider.repaint(); - } - - } - public static void main(String[] args) { try { UIManager.setLookAndFeel( new FlatDarculaLaf() ); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java index e1540f9a51..2da92be7a7 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java @@ -69,6 +69,7 @@ public class NorthRegionContainerPane extends JPanel { this.setLayout(new BorderLayout()); this.add(initNorthEastPane(ad), BorderLayout.EAST); this.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIManager.getColor("North.border"))); + setStyle(this, "MenuBar"); } /** @@ -79,6 +80,7 @@ public class NorthRegionContainerPane extends JPanel { //hugh: private修改为protected方便oem的时候修改右上的组件构成 //顶部日志+登陆按钮 final JPanel northEastPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + northEastPane.setOpaque(false); initPluginListener(northEastPane, ad); refreshNorthEastPane(northEastPane, ad); return northEastPane; @@ -142,7 +144,6 @@ public class NorthRegionContainerPane extends JPanel { northEastPane.removeAll(); northEastPane.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 0)); - northEastPane.add(LogMessageBar.getInstance()); TitlePlaceProcessor processor = ExtraDesignClassManager.getInstance().getSingle(TitlePlaceProcessor.MARK_STRING); if (processor != null) { final Component[] bbsLoginPane = {null}; @@ -161,6 +162,7 @@ public class NorthRegionContainerPane extends JPanel { /// 新手引导功能,暂时屏蔽 // northEastPane.add(ad.createGuideEntryPane()); northEastPane.add(ad.createNotificationCenterPane()); + northEastPane.add(LogMessageBar.getInstance()); OSSupportCenter.buildAction(new OSBasedAction() { @Override diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java index 21419fcb3e..0712327eca 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java @@ -1,22 +1,25 @@ package com.fr.design.mainframe.loghandler; -import com.fr.design.gui.ilable.UILabel; -import com.fr.stable.StringUtils; +import com.fine.theme.icon.LazyIcon; +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.ibutton.UIButton; import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.UIManager; import java.awt.BorderLayout; -import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -public class LogMessageBar extends JPanel { +/** + * 日志消息 + * + * @author Leo.Qin + * @Created on 2023/12/28 + * @since 11.0 + */ +public class LogMessageBar extends BasicPane { - private static final String LOG_MARK = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Log"); - private UILabel messageLabel; - private int width = 600; + private UIButton logButton; private static volatile LogMessageBar THIS; private JFrame dlg = new LogDetailPane().showDialog(); @@ -31,18 +34,14 @@ public class LogMessageBar extends JPanel { return THIS; } - public static LogMessageBar getInstance(int width) { - LogMessageBar bar = LogMessageBar.getInstance(); - bar.setLoggerBarWidth(width); - return bar; - } - private LogMessageBar() { - messageLabel = new UILabel(); setLayout(new BorderLayout()); - add(messageLabel, BorderLayout.CENTER); - messageLabel.setForeground(UIManager.getColor("North.messageLabel.foreground")); - addMouseListener(new MouseAdapter() { + setOpaque(false); + logButton = new UIButton(new LazyIcon("logMsg")); + logButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Show_Log_Message")); + logButton.set4ToolbarButton(); + add(logButton); + logButton.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (dlg != null && dlg.isVisible()) { @@ -57,25 +56,11 @@ public class LogMessageBar extends JPanel { } public void setMessage(String message) { - if (message == null) { - return; - } - messageLabel.setText(LOG_MARK + " | " + message); - repaint(); + logButton.setIcon(new LazyIcon("logMsg_dot")); } public void clear() { - messageLabel.setText(StringUtils.EMPTY); - repaint(); - } - - public void setLoggerBarWidth(int width) { - this.width = width; - } - - @Override - public Dimension getPreferredSize() { - return new Dimension(width, 24); + logButton.setIcon(new LazyIcon("logMsg")); } /** @@ -91,4 +76,9 @@ public class LogMessageBar extends JPanel { public JFrame getLogFrame() { return dlg; } + + @Override + protected String title4PopupWindow() { + return "LogCenter"; + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java index ee82d256ec..e523a18384 100644 --- a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java +++ b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java @@ -1,5 +1,6 @@ package com.fr.design.menu; +import com.fine.theme.icon.LazyIcon; import com.fr.base.svg.IconUtils; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.ibutton.UIButton; @@ -14,6 +15,7 @@ import com.fr.design.mainframe.JTemplate; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.StringUtils; +import javax.swing.Icon; import javax.swing.JMenu; import javax.swing.JPopupMenu; import javax.swing.JToolBar; @@ -64,6 +66,7 @@ public class MenuDef extends ShortCut { protected JPopupMenu popupMenu; protected boolean hasScrollSubMenu; protected boolean isHeadMenu; + private Icon icon; private String anchor; @@ -199,7 +202,9 @@ public class MenuDef extends ShortCut { */ public UIButton createUIButton() { if (createdButton == null) { - if (iconPath != null) { + if (icon != null) { + createdButton = new UIButton(icon); + } else if (iconPath != null) { createdButton = new UIButton(IconUtils.readIcon(iconPath)); if(needDisabled) { createdButton.setDisabledIcon(IconUtils.readIcon(iconPath + IconUtils.ICON_TYPE_DISABLED)); @@ -230,7 +235,9 @@ public class MenuDef extends ShortCut { if (createdJMenu == null) { createdJMenu = createJMenu0(); createdJMenu.setMnemonic(this.getMnemonic()); - if (this.iconPath != null) { + if (icon != null) { + createdJMenu.setIcon(icon); + } else if (this.iconPath != null) { createdJMenu.setIcon(IconUtils.readIcon(iconPath)); } MenuListener menuListener = createMenuListener(); @@ -510,4 +517,7 @@ public class MenuDef extends ShortCut { } + public void setIcon(LazyIcon icon) { + this.icon = icon; + } } diff --git a/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java b/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java index 7856b9b991..817afcdcd6 100644 --- a/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java +++ b/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java @@ -8,7 +8,6 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.notification.NotificationCenter; import java.awt.BorderLayout; -import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -17,13 +16,12 @@ public class NotificationCenterPane extends BasicPane { private static UIButton notificationCenterButton; private NotificationCenterPane() { - setPreferredSize(new Dimension(24, 24)); setLayout(new BorderLayout()); + setOpaque(false); notificationCenterButton = new UIButton(); notificationCenterButton.setIcon(new LazyIcon("notification")); notificationCenterButton.setToolTipText(Toolkit.i18nText("Fine-Design_Basic_Show_Notification")); notificationCenterButton.set4ToolbarButton(); - notificationCenterButton.setRolloverEnabled(false); this.add(notificationCenterButton); notificationCenterButton.addMouseListener(new MouseAdapter() { @Override diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellClear.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellClear.svg new file mode 100755 index 0000000000..df2c632f8e --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellClear.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellClear_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellClear_disable.svg new file mode 100755 index 0000000000..559e6856ec --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellClear_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellConditionalAttr.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellConditionalAttr.svg new file mode 100755 index 0000000000..2f88d20627 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellConditionalAttr.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellConditionalAttr_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellConditionalAttr_disable.svg new file mode 100755 index 0000000000..b6d8aff07b --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellConditionalAttr_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellElementAttr.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellElementAttr.svg new file mode 100755 index 0000000000..64367b9b29 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellElementAttr.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellElementAttr_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellElementAttr_disable.svg new file mode 100755 index 0000000000..623de600ec --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellElementAttr_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellExpandAttr.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellExpandAttr.svg new file mode 100755 index 0000000000..a2b023102d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellExpandAttr.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellExpandAttr_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellExpandAttr_disable.svg new file mode 100755 index 0000000000..e0d2bf1341 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellExpandAttr_disable.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellHyperLinkAttr.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellHyperLinkAttr.svg new file mode 100755 index 0000000000..317e1dd9a7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellHyperLinkAttr.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellHyperLinkAttr_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellHyperLinkAttr_disable.svg new file mode 100755 index 0000000000..24dbe0af7d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellHyperLinkAttr_disable.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellOtherAttr.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellOtherAttr.svg new file mode 100755 index 0000000000..73c33af502 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellOtherAttr.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellOtherAttr_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellOtherAttr_disable.svg new file mode 100755 index 0000000000..1b59fa856e --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellOtherAttr_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellPresentAttr.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellPresentAttr.svg new file mode 100755 index 0000000000..ad1acee124 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellPresentAttr.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellPresentAttr_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellPresentAttr_disable.svg new file mode 100755 index 0000000000..d5334fcdca --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellPresentAttr_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellStyleAttr.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellStyleAttr.svg new file mode 100755 index 0000000000..391906e7bf --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellStyleAttr.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellStyleAttr_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellStyleAttr_disable.svg new file mode 100755 index 0000000000..7e40dd5fef --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellStyleAttr_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellWidgetAttr.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellWidgetAttr.svg new file mode 100755 index 0000000000..c919716b53 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellWidgetAttr.svg @@ -0,0 +1,7 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cell/cellWidgetAttr_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellWidgetAttr_disable.svg new file mode 100755 index 0000000000..271256d571 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cell/cellWidgetAttr_disable.svg @@ -0,0 +1,7 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_copy.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_copy.svg new file mode 100755 index 0000000000..ef9dcf9c8e --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_copy.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_copy_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_copy_disable.svg new file mode 100755 index 0000000000..2a9e24ddaf --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_copy_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_paste.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_paste.svg new file mode 100755 index 0000000000..ba3d92d61e --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_paste.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_paste_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_paste_disable.svg new file mode 100755 index 0000000000..08caea5d7c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_paste_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/move.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/move.svg new file mode 100755 index 0000000000..0e664e067c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/move.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/move_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/move_disable.svg new file mode 100755 index 0000000000..e7318afdee --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/move_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/log/logMsg.svg b/designer-base/src/main/resources/com/fine/theme/icon/log/logMsg.svg new file mode 100755 index 0000000000..f6bafda5ca --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/log/logMsg.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/log/logMsg_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/log/logMsg_disable.svg new file mode 100755 index 0000000000..037846556c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/log/logMsg_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/log/logMsg_dot.svg b/designer-base/src/main/resources/com/fine/theme/icon/log/logMsg_dot.svg new file mode 100755 index 0000000000..7d89dafebe --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/log/logMsg_dot.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/log/logMsg_dot_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/log/logMsg_dot_disable.svg new file mode 100755 index 0000000000..9354463b17 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/log/logMsg_dot_disable.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties index ce1aaba19a..55596987fe 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties @@ -50,4 +50,5 @@ CombinationButtonUI=com.fine.theme.light.ui.FineCombinationButtonUI InputUI=com.fine.theme.light.ui.FineInputUI GradientBarUI=com.fine.theme.light.ui.FineGradientBarUI TemplateTabPaneUI=com.fine.theme.light.ui.FineTemplateTabPaneUI +ReportComponentCompositeUI=com.fine.theme.light.ui.FineReportComponentCompositeUI ColorButtonUI=com.fine.theme.light.ui.FineColorButtonUI diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index 7a7a852246..357d16e0ff 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -456,7 +456,7 @@ Menu.background = @menuBackground MenuBar.borderColor = $Separator.foreground MenuBar.border = com.formdev.flatlaf.ui.FlatMenuBarBorder -MenuBar.background = @menuBackground +MenuBar.background=#eaeff5 MenuBar.hoverBackground = @menuHoverBackground MenuBar.itemMargins = 3,8,3,8 MenuBar.selectionInsets = $MenuItem.selectionInsets @@ -468,7 +468,7 @@ MenuBar.selectionArc = $MenuItem.selectionArc MenuItem.border = com.formdev.flatlaf.ui.FlatMenuItemBorder MenuItem.arrowIcon = com.formdev.flatlaf.icons.FlatMenuItemArrowIcon MenuItem.checkIcon = null -MenuItem.margin = @menuItemMargin +MenuItem.margin=0,10,0,10 MenuItem.opaque = false MenuItem.borderPainted = true MenuItem.verticallyAlignText = true @@ -480,11 +480,14 @@ MenuItem.minimumIconSize = 16,16 MenuItem.iconTextGap = 6 MenuItem.textAcceleratorGap = 24 MenuItem.textNoAcceleratorGap = 6 -MenuItem.acceleratorArrowGap = 2 +MenuItem.acceleratorArrowGap=4 MenuItem.acceleratorDelimiter = "+" [mac]MenuItem.acceleratorDelimiter = "" MenuItem.selectionInsets = 0,0,0,0 MenuItem.selectionArc = 0 +MenuItem.selectionBackground=$brand.normal +MenuItem.selectionForeground=$text.white +MenuItem.disabledForeground=fade(@foreground,29%) # for MenuItem.selectionType = underline MenuItem.underlineSelectionBackground = @menuHoverBackground @@ -560,7 +563,7 @@ PopupMenu.arc=$Component.arc PopupMenuSeparator.height = 9 PopupMenuSeparator.stripeWidth = 1 -PopupMenuSeparator.stripeIndent = 4 +PopupMenuSeparator.stripeIndent=2 #---- ProgressBar ---- @@ -680,7 +683,7 @@ TreeSearchToolbarPane.borderInsets=0, 8, 0, 8 Separator.height = 3 Separator.stripeWidth = 1 Separator.stripeIndent = 1 -Separator.foreground = shade(@background,15%) +Separator.foreground=$fill.hover #---- Slider ---- @@ -1153,8 +1156,6 @@ North.userinfoLabel.borderMargins=2, 16, 2, 16 North.userinfoLabel.width=80 North.userinfoLabel.height=24 North.border = $defaultBorderColor -North.userinfoLabel.foreground=$text.white -North.userinfoLabel.background=$brand.normal North.messageLabel.foreground=$text.placeholder North.coverPane.background = #0a1c38 North.coverPane.radius = 8 @@ -1166,6 +1167,8 @@ Center.ZoneBorderColor = #E6E9EF Center.GridColumnRowColor = #F8F9FC Center.SpaceColor = #FFF Center.border = 0, 10, 10, 10 +Center.arc=10 + #---- CellOtherSetPane ---- CellOtherSetPane.height=$Component.defaultHeight @@ -1230,6 +1233,16 @@ CellOtherSetPane.height=$Component.defaultHeight [style]ToolBar.topTools = \ background: #fff +[style]Panel.NormalColorPane=\ + background: $fill.normal +[style]Panel.LightGreyPanel=\ + background: $Center.OuterShadowColor +[style]Panel.MenuBar=\ + background: $MenuBar.background +[style]Label.BrandColorLabel=\ + background: $brand.normal;\ + foreground: $text.white;\ + opaque: true #---- clearButton ---- # for clear/cancel button in text fields diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/CellAttributeAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/CellAttributeAction.java index 6dff89dfd8..c3f95ebe89 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/CellAttributeAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/CellAttributeAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.cell; -import com.fr.base.svg.IconUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.menu.KeySetUtils; @@ -12,7 +12,7 @@ public class CellAttributeAction extends CellAttributeTableAction { this.setMenuKeySet(KeySetUtils.CELL_OTHER_ATTR); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/m_format/cellAttr"); + this.setSmallIcon(new LazyIcon("cellOtherAttr")); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/CellExpandAttrAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/CellExpandAttrAction.java index 62f2db3125..74754f454c 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/CellExpandAttrAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/CellExpandAttrAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.cell; -import com.fr.base.svg.IconUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.menu.KeySetUtils; @@ -11,7 +11,7 @@ public class CellExpandAttrAction extends CellAttributeTableAction{ this.setMenuKeySet(KeySetUtils.CELL_EXPAND_ATTR); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/expand/cellAttr"); + this.setSmallIcon(new LazyIcon("cellExpandAttr")); } diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/CellStyleAttrAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/CellStyleAttrAction.java index a257ea95d6..2dc58c81d3 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/CellStyleAttrAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/CellStyleAttrAction.java @@ -1,9 +1,8 @@ package com.fr.design.actions.cell; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.i18n.Toolkit; import com.fr.design.menu.KeySetUtils; -import com.fr.general.IOUtils; /** * @author Starryi @@ -16,7 +15,7 @@ public class CellStyleAttrAction extends CellAttributeTableAction { this.setMenuKeySet(KeySetUtils.GLOBAL_STYLE); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon(IOUtils.readIcon("/com/fr/design/images/m_format/cell.png")); + this.setSmallIcon(new LazyIcon("cellStyleAttr")); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/CellWidgetAttrAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/CellWidgetAttrAction.java index f1110187a0..8bfeba521e 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/CellWidgetAttrAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/CellWidgetAttrAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.cell; -import com.fr.base.svg.IconUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.menu.KeySetUtils; @@ -16,7 +16,7 @@ public class CellWidgetAttrAction extends UpdateAction { this.setMenuKeySet(KeySetUtils.CELL_WIDGET_ATTR); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/m_format/modified"); + this.setSmallIcon(new LazyIcon("cellWidgetAttr")); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/ConditionAttributesAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/ConditionAttributesAction.java index d019c978b3..b976e6939f 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/ConditionAttributesAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/ConditionAttributesAction.java @@ -3,7 +3,7 @@ */ package com.fr.design.actions.cell; -import com.fr.base.svg.IconUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.menu.KeySetUtils; @@ -18,7 +18,7 @@ public class ConditionAttributesAction extends UpdateAction { this.setMenuKeySet(KeySetUtils.CONDITION_ATTR); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/m_format/highlight"); + this.setSmallIcon(new LazyIcon("cellConditionalAttr")); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/EditCellAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/EditCellAction.java index 81c7f3cfb2..0d9db1dd1d 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/EditCellAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/EditCellAction.java @@ -4,7 +4,7 @@ package com.fr.design.actions.cell; -import com.fr.base.svg.IconUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.ElementCaseAction; import com.fr.design.mainframe.ElementCasePane; @@ -20,7 +20,7 @@ public class EditCellAction extends ElementCaseAction { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Edit")); this.setMnemonic('I'); - this.setSmallIcon("/com/fr/design/images/control/edit"); + this.setSmallIcon(new LazyIcon("edit")); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/actions/edit/HyperlinkAction.java b/designer-realize/src/main/java/com/fr/design/actions/edit/HyperlinkAction.java index 41aba36880..bdf48d16aa 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/edit/HyperlinkAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/edit/HyperlinkAction.java @@ -3,7 +3,7 @@ */ package com.fr.design.actions.edit; -import com.fr.base.svg.IconUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.menu.KeySetUtils; @@ -19,7 +19,7 @@ public class HyperlinkAction extends UpdateAction { this.setMenuKeySet(KeySetUtils.HYPER_LINK); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/m_insert/hyperLink"); + this.setSmallIcon(new LazyIcon("cellHyperLinkAttr")); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/actions/utils/DeprecatedActionManager.java b/designer-realize/src/main/java/com/fr/design/actions/utils/DeprecatedActionManager.java index d12e88cf50..af19c26306 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/utils/DeprecatedActionManager.java +++ b/designer-realize/src/main/java/com/fr/design/actions/utils/DeprecatedActionManager.java @@ -1,7 +1,7 @@ package com.fr.design.actions.utils; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.base.present.DictPresent; import com.fr.base.present.FormulaPresent; import com.fr.design.ExtraDesignClassManager; @@ -46,7 +46,7 @@ public class DeprecatedActionManager { */ public static UIMenu getClearMenu(ElementCasePane ePane) { UIMenu clearMenu = new UIMenu(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_M_Edit_Clear")); - clearMenu.setIcon(BaseUtils.readIcon("/com/fr/design/images/control/clear.png")); + clearMenu.setIcon(new LazyIcon("cellClear")); clearMenu.setMnemonic('a'); ClearAction ReportComponentAction = new ClearAllAction(ePane); @@ -71,7 +71,7 @@ public class DeprecatedActionManager { public static MenuDef getCellMenu(final ElementCasePane ePane) { // 单元格菜单 final MenuDef subMenuDef = new MenuDef(KeySetUtils.CELL_ELEMENT.getMenuName()); - subMenuDef.setIconPath("/com/fr/design/images/m_insert/cell"); + subMenuDef.setIcon(new LazyIcon("cellElementAttr")); UpdateAction[] actions = ActionFactory.createCellInsertAction(ElementCasePane.class, ePane); for (UpdateAction action : actions) { @@ -95,7 +95,7 @@ public class DeprecatedActionManager { public static MenuDef getPresentMenu(final ElementCasePane ePane) { final MenuDef presentMenu = new MenuDef(KeySetUtils.PRESENT.getMenuKeySetName()); - presentMenu.setIconPath("com/fr/design/images/data/source/dataDictionary"); + presentMenu.setIcon(new LazyIcon("cellPresentAttr")); presentMenu.setMnemonic(KeySetUtils.PRESENT.getMnemonic()); NewPresentAction dataDictAction = new NewPresentAction(ePane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Format_Data_Map"), DictPresent.class.getName()); dataDictAction.setMnemonic('D'); @@ -138,7 +138,7 @@ public class DeprecatedActionManager { public static UIMenu getDeleteMenu(ElementCasePane ePane) { UIMenu deleteMenu = new UIMenu(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_M_Edit_Delete")); - deleteMenu.setIcon(BaseUtils.readIcon("/com/fr/design/images/control/remove.png")); + deleteMenu.setIcon(new LazyIcon("remove")); deleteMenu.setMnemonic('d'); deleteMenu.add(new DeleteRowAction(ePane).createMenuItem()); @@ -149,7 +149,7 @@ public class DeprecatedActionManager { public static UIMenu getInsertMenu(ElementCasePane ePane) { UIMenu deleteMenu = new UIMenu(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Insert") + "(I)"); - deleteMenu.setIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/add.png")); + deleteMenu.setIcon(new LazyIcon("add")); deleteMenu.setMnemonic('i'); deleteMenu.add(new InsertRowAction(ePane).createMenuItem()); diff --git a/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollBar.java b/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollBar.java index 9829b4e0d9..467b1be426 100644 --- a/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollBar.java +++ b/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollBar.java @@ -31,6 +31,7 @@ public class DynamicScrollBar extends JScrollBar { this.reportPane = reportPane; this.dpi = dpi; + this.setOpaque(false); //init some values.h this.setMinimum(0); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ReportComponentComposite.java b/designer-realize/src/main/java/com/fr/design/mainframe/ReportComponentComposite.java index 5bfc086f37..dd21ff1ed0 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ReportComponentComposite.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ReportComponentComposite.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe; +import com.fine.theme.light.ui.FineReportComponentBorder; import com.fr.base.ScreenResolution; import com.fr.base.TRL; import com.fr.design.actions.replace.ui.ITReplaceMainDialog; @@ -16,10 +17,8 @@ import com.fr.main.impl.WorkBook; import com.fr.report.report.TemplateReport; import com.fr.stable.StringUtils; -import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JPanel; -import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; @@ -28,10 +27,18 @@ import java.util.ArrayList; /** * 整个报表编辑区域 包括滚动条、中间的grid或者聚合块、下面的sheetTab * - * @editor zhou - * @since 2012-3-27下午12:12:05 + * @author zhou + * @since 11.0 + * Created on 2012-3-27 */ -public class ReportComponentComposite extends JComponent implements RemoveListener { +public class ReportComponentComposite extends JPanel implements RemoveListener { + + private static final String UI_CLASS_ID = "ReportComponentCompositeUI"; + + @Override + public String getUIClassID() { + return UI_CLASS_ID; + } private static final int MAX = 400; private static final int HUND = 100; @@ -65,7 +72,7 @@ public class ReportComponentComposite extends JComponent implements RemoveListen CellElementRegion = FRGUIPaneFactory.createBorderLayout_S_Pane(); this.add(CellElementRegion, BorderLayout.NORTH); this.add(createSouthControlPane(), BorderLayout.SOUTH); - this.setBorder(BorderFactory.createLineBorder(UIManager.getColor("Center.ZoneBorderColor"))); + this.setBorder(new FineReportComponentBorder()); jSliderContainer.addValueChangeListener(showValSpinnerChangeListener); } @@ -228,6 +235,7 @@ public class ReportComponentComposite extends JComponent implements RemoveListen southPane.add(sheetNameTab, BorderLayout.CENTER); } southPane.add(jSliderContainer, BorderLayout.EAST); + southPane.setOpaque(false); return southPane; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java index 531e3f08e6..49ad367532 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.base.GraphHelper; import com.fr.base.svg.IconUtils; @@ -27,17 +28,16 @@ import com.fr.report.report.TemplateReport; import com.fr.report.worksheet.WorkSheet; import javax.swing.Icon; -import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.SwingUtilities; import javax.swing.UIManager; +import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; -import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; @@ -49,22 +49,26 @@ import java.awt.event.ComponentListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; +import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; import java.util.ArrayList; import java.util.List; +import static com.fine.theme.utils.FineClientProperties.setStyle; + /** * NameTabPane of sheets * - * @editor zhou - * @since 2012-3-26下午1:45:53 + * @author zhou + * @since 11.0 + * Created on 2012-3-26 */ -public class SheetNameTabPane extends JComponent implements MouseListener, MouseMotionListener, RemoveListener { +public class SheetNameTabPane extends JPanel implements MouseListener, MouseMotionListener, RemoveListener { - private static final Color BORDER_COLOR = UIManager.getColor("Center.ZoneBorderColor"); - private static final Color BACKGROUND_COLOR = UIManager.getColor("Center.OuterShadowColor"); - private static final Color SELECTED_COLOR = UIManager.getColor("South.SheetSelectedColor"); - private static final Color FONT_COLOR = UIManager.getColor("DarkenedFontColor"); + private Color borderColor = UIManager.getColor("Center.ZoneBorderColor"); + private Color backgroundColor = UIManager.getColor("Center.OuterShadowColor"); + private Color selectedColor = UIManager.getColor("South.SheetSelectedColor"); + private Color fontColor = UIManager.getColor("DarkenedFontColor"); private static final Icon ADD_WORK_SHEET = new LazyIcon("add_worksheet"); protected static final Icon ADD_POLY_SHEET = new LazyIcon("add_polysheet"); @@ -81,12 +85,12 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse private static final int POLY_TOSHEET_LEFT = 30; // 添加poly按钮左侧距sheet面板右侧的距离 private static final int POLY_TOSHEET_RIGHT = 50; // 添加poly按钮右侧距sheet面板右侧的距离 - private static final int ICON_SEP_DISTANCE = UIManager.getInt("South.SheetIconSepDistance"); - private static final int SHEET_ICON_GAP = UIManager.getInt("South.SheetIconGap"); // 每个sheet图标之间的距离 - private static final int TOOLBAR_HEIGHT = UIManager.getInt("South.SheetBarHeight"); - private static final int ADD_WIDTH_BY_SHEETNAME = UIManager.getInt("South.SheetAddWidth"); //sheet名字的文本到图标边框的距离 - private static final int TAB_BUTTON_GAP = UIManager.getInt("South.SheetTabButtonGap"); // 两个添加按钮与其他组件预留的间隔 - private static final int SHEET_TAB_RADIUS = UIManager.getInt("South.SheetTabRadius"); // sheet标签栏圆角属性 + private int iconSepDistance = UIManager.getInt("South.SheetIconSepDistance"); + private int sheetIconGap = UIManager.getInt("South.SheetIconGap"); // 每个sheet图标之间的距离 + private int toolbarHeight = UIManager.getInt("South.SheetBarHeight"); + private int addWidthBySheetname = UIManager.getInt("South.SheetAddWidth"); //sheet名字的文本到图标边框的距离 + private int tabButtonGap = UIManager.getInt("South.SheetTabButtonGap"); // 两个添加按钮与其他组件预留的间隔 + private int sheetTabRadius = UIManager.getInt("South.SheetTabRadius"); // sheet标签栏圆角属性 /** * 左移和右移按钮 @@ -160,12 +164,12 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse this.addMouseListener(this); this.addMouseMotionListener(this); this.setBorder(null); - this.setForeground(FONT_COLOR); - this.setBackground(BACKGROUND_COLOR); + this.setForeground(fontColor); + setStyle(this, "LightGreyPanel"); leftButton = new UIButton(LEFT_ICON) { @Override public Dimension getPreferredSize() { - return new Dimension(super.getPreferredSize().width, TOOLBAR_HEIGHT); + return new Dimension(super.getPreferredSize().width, toolbarHeight); } }; leftButton.set4ToolbarButton(); @@ -173,7 +177,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse rightButton = new UIButton(RIGHT_ICON) { @Override public Dimension getPreferredSize() { - return new Dimension(super.getPreferredSize().width, TOOLBAR_HEIGHT); + return new Dimension(super.getPreferredSize().width, toolbarHeight); } }; rightButton.set4ToolbarButton(); @@ -332,7 +336,6 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse */ @Override public void paintComponent(Graphics g) { - super.paintComponent(g); isAuthorityEditing = DesignerMode.isAuthorityEditing(); showCount = 0; // 开始画那些Tab. @@ -343,7 +346,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse double textHeight = this.getSize().getHeight() - 1; widthArray = calculateWidthArray(); - int operationWidth = TAB_BUTTON_GAP + getAddWorkSheet().getIconWidth() + ICON_SEP_DISTANCE + ADD_POLY_SHEET.getIconWidth(); + int operationWidth = tabButtonGap + getAddWorkSheet().getIconWidth() + iconSepDistance + ADD_POLY_SHEET.getIconWidth(); double maxWidth = getWidth() - operationWidth - buttonPane.getWidth();// 最大宽度 paintBackgroundAndLine(g2d, textHeight, maxWidth, charWidth, textAscent); checkButton(showCount < widthArray.length); @@ -361,11 +364,18 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse } private void paintBackgroundAndLine(Graphics2D g2d, double textHeight, double maxWidth, int charWidth, int textAscent) { + + int arc = FineUIUtils.getAndScaleInt("Center.arc", 10) / 2; + Path2D roundedPath = FineUIUtils.createPartRoundRectangle(0, 0, this.getWidth(), this.getHeight(), 0, 0, 0, arc); + FlatUIUtils.setRenderingHints(g2d); + g2d.setColor(getBackground()); + g2d.fill(roundedPath); + showCount = 0; int addIconlocation = 0; WorkBook workBook = reportComposite.getEditingWorkBook(); int reportCount = workBook.getReportCount(); - double textX = SHEET_ICON_GAP; + double textX = sheetIconGap; for (int i = scrollIndex; i < reportCount; i++) { lastOneIndex = i; TemplateReport templateReport = workBook.getTemplateReport(i); @@ -397,20 +407,20 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse } // 画两个添加sheet图标 - iconLocation = isOvertakeWidth ? (int) (maxWidth) : addIconlocation + TAB_BUTTON_GAP; + iconLocation = isOvertakeWidth ? (int) (maxWidth) : addIconlocation + tabButtonGap; paintAddButton(g2d); } protected void paintAddButton(Graphics2D g2d){ getAddWorkSheet().paintIcon(this, g2d, iconLocation, 3); - ADD_POLY_SHEET.paintIcon(this, g2d, iconLocation + getAddWorkSheet().getIconWidth() + ICON_SEP_DISTANCE, 3); + ADD_POLY_SHEET.paintIcon(this, g2d, iconLocation + getAddWorkSheet().getIconWidth() + iconSepDistance, 3); } private void paintTab(Graphics2D g2d, double textHeight, double textX, String sheetName, int charWidth, int textAscent, int i, boolean isNeedPaintAuthority, boolean isSelected) { - Color backgroundColor = isSelected ? SELECTED_COLOR: (isNeedPaintAuthority ? UIConstants.AUTHORITY_SHEET_UNSELECTED : getBackground()); + Color backgroundColor = isSelected ? selectedColor : (isNeedPaintAuthority ? UIConstants.AUTHORITY_SHEET_UNSELECTED : getBackground()); g2d.setColor(backgroundColor); // 绘制圆角矩形背景 @@ -418,11 +428,11 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse FlatUIUtils.setRenderingHints(g2d); int width = widthArray[i]; - int height = (int) textHeight + SHEET_TAB_RADIUS; - RoundRectangle2D.Double backgroundRect = new RoundRectangle2D.Double(textX, -10, width, height, SHEET_TAB_RADIUS, SHEET_TAB_RADIUS); + int height = (int) textHeight + sheetTabRadius; + RoundRectangle2D.Double backgroundRect = new RoundRectangle2D.Double(textX, -10, width, height, sheetTabRadius, sheetTabRadius); g2d.fill(backgroundRect); - g2d.setColor(BORDER_COLOR); + g2d.setColor(borderColor); g2d.setStroke(new BasicStroke(1)); g2d.draw(backgroundRect); } @@ -475,7 +485,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse int[] widthArray = new int[reportCount]; for (int i = 0; i < reportCount; i++) { String sheetName = workBook.getReportName(i); - widthArray[i] = fm.stringWidth(sheetName) + charWidth * 2 - 1 + ADD_WIDTH_BY_SHEETNAME; + widthArray[i] = fm.stringWidth(sheetName) + charWidth * 2 - 1 + addWidthBySheetname; } return widthArray; } @@ -595,7 +605,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse this.setReleasedXY(e.getX(), e.getY()); int width = 0; for (int w : widthArray) { - width = width + w + SHEET_ICON_GAP; + width = width + w + sheetIconGap; } if (isAuthorityEditing) { return; @@ -759,7 +769,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse widthArray = calculateWidthArray(); int width = widthArray[i]; textX += width + 1; - int operationWidth = TAB_BUTTON_GAP + getAddWorkSheet().getIconWidth() + ICON_SEP_DISTANCE + ADD_POLY_SHEET.getIconWidth(); + int operationWidth = tabButtonGap + getAddWorkSheet().getIconWidth() + iconSepDistance + ADD_POLY_SHEET.getIconWidth(); double maxWidth = getWidth() - operationWidth - buttonPane.getWidth();// 最大宽度 if (i < widthArray.length - 1 && textX + widthArray[i + 1] + 1 > maxWidth) { isOvertakeWidth = true; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java index fcd652980f..34569667b2 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java @@ -9,7 +9,6 @@ import com.fr.design.mainframe.alphafine.AlphaFineHelper; import java.awt.AWTEvent; import java.awt.BorderLayout; -import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -25,13 +24,12 @@ public class AlphaFinePane extends BasicPane { } public AlphaFinePane() { - setPreferredSize(new Dimension(24, 24)); + setOpaque(false); setLayout(new BorderLayout()); UIButton refreshButton = new UIButton(); refreshButton.setIcon(new LazyIcon(("search"))); refreshButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Learn_More_About")); refreshButton.set4ToolbarButton(); - refreshButton.setRolloverEnabled(false); this.add(refreshButton); refreshButton.addActionListener(new ActionListener() { @Override diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoLabel.java b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoLabel.java index 3ba44743df..b77d9600a3 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoLabel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoLabel.java @@ -5,7 +5,6 @@ package com.fr.design.mainframe.bbs; import com.fr.design.DesignerEnvManager; import com.fr.design.bbs.BBSLoginUtils; -import com.fr.design.constants.UIConstants; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.extra.LoginContextListener; import com.fr.design.extra.UserLoginContext; @@ -31,6 +30,7 @@ import com.fr.general.locale.LocaleMark; import com.fr.log.FineLoggerFactory; import com.fr.stable.EncodeConstants; import com.fr.stable.StringUtils; + import javax.swing.JOptionPane; import javax.swing.SwingConstants; import java.awt.Cursor; @@ -48,6 +48,8 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import static com.fine.theme.utils.FineClientProperties.setStyle; + /** * @author neil * @date: 2015-3-4-上午9:05:52 @@ -78,16 +80,6 @@ public class UserInfoLabel extends UILabel { @Override public void mouseEntered(MouseEvent e) { UserInfoLabel.this.setCursor(new Cursor(Cursor.HAND_CURSOR)); - if (StringUtils.isEmpty(DesignerEnvManager.getEnvManager().getDesignerLoginUsername())) { - UserInfoLabel.this.setBackground(UIConstants.DESIGNER_LOGIN_BACKGROUND_ONCLICK); - } - } - - @Override - public void mouseExited(MouseEvent e) { - if (StringUtils.isEmpty(DesignerEnvManager.getEnvManager().getDesignerLoginUsername())) { - UserInfoLabel.this.setBackground(UIConstants.DESIGNER_LOGIN_BACKGROUND); - } } @Override @@ -159,6 +151,7 @@ public class UserInfoLabel extends UILabel { public UserInfoLabel(UserInfoPane userInfoPane) { init(userInfoPane); + setStyle(this, "BrandColorLabel"); } /** diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java index 1bb4ebf740..088a9ec79d 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java @@ -104,9 +104,6 @@ public class UserInfoPane extends BasicPane { */ public void markUnSignIn() { this.userInfoLabel.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Login_Onclick")); - this.userInfoLabel.setForeground(UIManager.getColor("North.userinfoLabel.foreground")); - this.userInfoLabel.setOpaque(true); - this.userInfoLabel.setBackground(UIManager.getColor("North.userinfoLabel.background")); this.userInfoLabel.resetUserName(); } @@ -118,7 +115,6 @@ public class UserInfoPane extends BasicPane { public void markSignIn(String userName) { this.userInfoLabel.setText(userName); this.userInfoLabel.setUserName(userName); - this.userInfoLabel.setOpaque(true); } @Override diff --git a/designer-realize/src/main/java/com/fr/grid/GridCorner.java b/designer-realize/src/main/java/com/fr/grid/GridCorner.java index 43ca7fbe5e..8776a11b6c 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridCorner.java +++ b/designer-realize/src/main/java/com/fr/grid/GridCorner.java @@ -4,14 +4,15 @@ package com.fr.grid; import com.fr.base.GraphHelper; - import com.fr.design.constants.UIConstants; import com.fr.design.mainframe.DesignerUIModeConfig; import com.fr.design.mainframe.ElementCasePane; import javax.swing.event.MouseInputListener; -import java.awt.*; -import java.awt.geom.Rectangle2D; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; /** * GridCorner used to paint and edit grid cornor. @@ -19,7 +20,7 @@ import java.awt.geom.Rectangle2D; public class GridCorner extends BaseGridComponent { public GridCorner() { - this.setOpaque(true); + this.setOpaque(false); //james 清除所有的Key Action this.getInputMap().clear(); this.getActionMap().clear(); @@ -39,9 +40,6 @@ public class GridCorner extends BaseGridComponent { float time = (float) reportPane.getResolution() / DesignerUIModeConfig.getInstance().getScreenResolution(); //size Dimension size = this.getSize(); - Rectangle2D rect2D = new Rectangle2D.Double(0, 0, size.getWidth(), size.getHeight()); - g2d.setPaint(reportPane.getGrid().getBackground()); - GraphHelper.fill(g2d, rect2D); paintArc(g2d, size, time); From 6045c6b8636fff1d4e0ce749180207485c519c8c Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 4 Jan 2024 15:12:15 +0800 Subject: [PATCH 079/302] =?UTF-8?q?REPORT-99485=20=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E6=A0=8FButtonGroup=E6=A0=B7=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../theme/light/ui/FineButtonGroupUI.java | 12 ++++++--- .../fine/theme/light/ui/FineRoundBorder.java | 11 ++++++++ .../com/fine/theme/utils/FineUIStyle.java | 15 +++++++++++ .../fr/design/gui/ibutton/UIButtonGroup.java | 25 ++++++++++++++++--- .../light/ui/laf/FineLightLaf.properties | 8 ++++-- .../components/ButtonGroupStoryBoard.java | 14 ++++++++++- .../fr/design/actions/ButtonGroupAction.java | 6 ++--- .../actions/cell/style/AlignmentAction.java | 7 ------ 8 files changed, 79 insertions(+), 19 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonGroupUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonGroupUI.java index 2035abf493..dc65b33e81 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonGroupUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonGroupUI.java @@ -1,8 +1,11 @@ package com.fine.theme.light.ui; +import com.fr.design.gui.ibutton.UIButtonGroup; + import javax.swing.JComponent; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.PanelUI; +import java.awt.Graphics; /** * 按钮组UI,应用于 {@link com.fr.design.gui.ibutton.UIButtonGroup} @@ -24,9 +27,12 @@ public class FineButtonGroupUI extends PanelUI { } @Override - public void installUI(JComponent c) { - super.installUI(c); - c.setBorder(new FineRoundBorder()); + public void update(Graphics g, JComponent c) { + UIButtonGroup group = (UIButtonGroup) c; + if (!group.isInToolbar()) { + c.setBorder(new FineRoundBorder()); + } + super.update(g, c); } @Override diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineRoundBorder.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineRoundBorder.java index 3fe2129049..9538079996 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineRoundBorder.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineRoundBorder.java @@ -8,6 +8,7 @@ import com.fr.design.event.HoverAware; import java.awt.Color; import java.awt.Component; import java.awt.Paint; +import java.util.StringJoiner; /** @@ -49,4 +50,14 @@ public class FineRoundBorder extends FlatRoundBorder { return highlightBorderColor; } + + @Override + public String toString() { + return new StringJoiner(", ", FineRoundBorder.class.getSimpleName() + "[", "]") + .add("borderColor=" + borderColor) + .add("arc=" + arc) + .add("roundRect=" + roundRect) + .add("borderWidth=" + borderWidth) + .toString(); + } } diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java new file mode 100644 index 0000000000..35f489399e --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java @@ -0,0 +1,15 @@ +package com.fine.theme.utils; + +/** + * UI样式工具 + * + * @author vito + * @since 11.0 + * Created on 2024/1/4 + */ +public interface FineUIStyle { + + String IN_TOOLBAR_GROUP = "inToolbarGroup"; + + +} diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java index 4f5dadba45..ad2ca580e4 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java @@ -4,6 +4,7 @@ import com.fine.swing.ui.layout.Column; import com.fine.swing.ui.layout.Row; import com.fine.swing.ui.layout.Spacer; import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineClientProperties; import com.fine.theme.utils.FineUIScale; import com.fine.theme.utils.FineUIUtils; import com.fr.design.event.GlobalNameListener; @@ -26,9 +27,9 @@ import java.util.Arrays; import java.util.List; import static com.fine.swing.ui.layout.Layouts.cell; -import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE_GROUP; -import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE; import static com.fine.theme.utils.FineClientProperties.BUTTON_GROUP_POSITION; +import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE; +import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE_GROUP; import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_INNER; import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_LEFT; import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_LEFT_BOTTOM; @@ -36,6 +37,8 @@ import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_LE import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_RIGHT; import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_RIGHT_BOTTOM; import static com.fine.theme.utils.FineClientProperties.GROUP_BUTTON_POSITION_RIGHT_TOP; +import static com.fine.theme.utils.FineUIStyle.IN_TOOLBAR_GROUP; +import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE_TOOLBAR_BUTTON; public class UIButtonGroup extends Column implements GlobalNameObserver, UIObserver { private static final String UI_CLASS_ID = "ButtonGroupUI"; @@ -51,6 +54,8 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb private UIObserverListener uiObserverListener; private boolean autoFireStateChanged = true; + private boolean inToolbar = false; + public UIButtonGroup(String[] textArray) { this(textArray, null); } @@ -100,6 +105,11 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb } public UIButtonGroup(Icon[][] iconArray, T[] objects) { + this(iconArray, objects, false); + } + + public UIButtonGroup(Icon[][] iconArray, T[] objects, boolean inToolbar) { + this.inToolbar = inToolbar; if (!ArrayUtils.isEmpty(objects) && iconArray.length == objects.length) { this.objectList = Arrays.asList(objects); } @@ -192,7 +202,7 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb for (int j = 0; j < col; j++) { rowContainer.add(cell(labelButtonList.get(currentIndex)).weight(1.0)); currentIndex++; - if (j != col - 1) { + if (j != col - 1 && !inToolbar) { rowContainer.add(createDivider()); } } @@ -219,6 +229,7 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb /** * 计算按钮位于整个按钮组件中的位置 + * * @param index 按钮序号 * @return 按钮位置,详见 {@link com.fine.theme.utils.FineClientProperties} */ @@ -256,13 +267,21 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb public void setForToolBarButtonGroup(boolean isToolBarComponent) { if (isToolBarComponent) { + inToolbar = true; for (UIToggleButton uiToggleButton : labelButtonList) { + uiToggleButton.putClientProperty(BUTTON_TYPE, BUTTON_TYPE_TOOLBAR_BUTTON); + FineClientProperties.setStyle(uiToggleButton, IN_TOOLBAR_GROUP); uiToggleButton.set4ToolbarButton(); + uiToggleButton.setBorderPainted(false); } } repaint(); } + public boolean isInToolbar() { + return inToolbar; + } + @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index 6ca738de61..e26fdd093a 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -1226,14 +1226,18 @@ CellOtherSetPane.height=$Component.defaultHeight background : #fff [style]Button.inToolbarLeft = \ - margin : 4,4,4,0 + margin : 3,3,3,3 [style]Button.inToolbarRight = \ - margin : 1,1,1,1 + margin : 0,0,0,0 [style]ToolBar.topTools = \ background: #fff +[style]ToggleButton.inToolbarGroup = \ + margin : 4,4,4,4; \ + background : #fff + #---- clearButton ---- # for clear/cancel button in text fields diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonGroupStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonGroupStoryBoard.java index 72fa9228a6..46ede30053 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonGroupStoryBoard.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonGroupStoryBoard.java @@ -4,11 +4,13 @@ import com.fine.theme.icon.LazyIcon; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ibutton.UITabGroup; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.gui.storybook.Story; import com.fr.design.gui.storybook.StoryBoard; import com.fr.stable.ArrayUtils; import javax.swing.Icon; +import java.awt.Component; import static com.fine.swing.ui.layout.Layouts.cell; import static com.fine.swing.ui.layout.Layouts.flex; @@ -41,10 +43,20 @@ public class ButtonGroupStoryBoard extends StoryBoard { cell(new UITabGroup(fiveTextArray())), cell(new UILabel("多行按钮-奇数场景-7按钮")).with(this::h3), cell(new UITabGroup(sevenTextArray())), + cell(new UILabel("单行按钮-工具栏")).with(this::h3), + cell(getToolbar()), flex() ); } + private static Component getToolbar(){ + UIToolbar toolbar = new UIToolbar(); + UIButtonGroup objectUIButtonGroup = new UIButtonGroup<>(iconArrayWithWhite(),null,true); + objectUIButtonGroup.setForToolBarButtonGroup(true); + toolbar.add(objectUIButtonGroup); + return toolbar; + } + private static Icon[] iconArray() { return ArrayUtils.toArray( new LazyIcon("edit"), @@ -53,7 +65,7 @@ public class ButtonGroupStoryBoard extends StoryBoard { ); } - private Icon[][] iconArrayWithWhite() { + private static Icon[][] iconArrayWithWhite() { return ArrayUtils.toArray( ArrayUtils.toArray(new LazyIcon("edit"), new LazyIcon("copy")), ArrayUtils.toArray(new LazyIcon("preview"), new LazyIcon("save")) diff --git a/designer-realize/src/main/java/com/fr/design/actions/ButtonGroupAction.java b/designer-realize/src/main/java/com/fr/design/actions/ButtonGroupAction.java index a0197fec96..5381fb3a3f 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/ButtonGroupAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/ButtonGroupAction.java @@ -1,10 +1,10 @@ package com.fr.design.actions; -import javax.swing.Icon; - import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.mainframe.ElementCasePane; +import javax.swing.Icon; + public abstract class ButtonGroupAction extends ElementCaseAction{ protected Icon[][] iconArray; protected Integer[] valueArray; @@ -48,7 +48,7 @@ public abstract class ButtonGroupAction extends ElementCaseAction{ @Override public UIButtonGroup createToolBarComponent() { if(group == null) { - group = new UIButtonGroup(iconArray, valueArray); + group = new UIButtonGroup(iconArray, valueArray, true); group.addActionListener(this); } return group; diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/style/AlignmentAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/style/AlignmentAction.java index 4a87155c26..9147b3d653 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/style/AlignmentAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/style/AlignmentAction.java @@ -6,7 +6,6 @@ import com.fr.base.Style; import com.fr.base.chart.BaseChartCollection; import com.fr.design.actions.ButtonGroupAction; import com.fr.design.actions.utils.ReportActionUtils; -import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.mainframe.ElementCasePane; import com.fr.grid.selection.FloatSelection; @@ -109,12 +108,6 @@ public class AlignmentAction extends ButtonGroupAction implements StyleActionInt group.setForToolBarButtonGroup(true); group.setAllToolTips(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_StyleAlignment_Left"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Center"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_StyleAlignment_Right")}); } - for (int i = 0; i < 3; i++) { - if (group != null) { - group.getButton(i).setRoundBorder(true, UIConstants.ARC); - group.getButton(i).setBorderPainted(true); - } - } return group; } From d3f565be26f1ec15afe8983008dcb61b1a6c8249 Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 4 Jan 2024 15:42:09 +0800 Subject: [PATCH 080/302] =?UTF-8?q?REPORT-99485=20=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E7=9B=B8=E5=85=B3=E6=96=B9=E6=B3=95=E5=B8=B8?= =?UTF-8?q?=E4=BA=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../light/ui/FineCombinationButtonUI.java | 3 +- .../theme/light/ui/FineTemplateTabPaneUI.java | 2 - .../theme/utils/FineClientProperties.java | 74 ----------------- .../com/fine/theme/utils/FineUIStyle.java | 80 +++++++++++++++++++ .../com/fr/design/gui/ibutton/UIButton.java | 6 +- .../fr/design/gui/ibutton/UIButtonGroup.java | 4 +- .../gui/ibutton/UICombinationButton.java | 11 ++- .../mainframe/CenterRegionContainerPane.java | 10 ++- .../fr/design/mainframe/JFormSliderPane.java | 29 +------ .../mainframe/NorthRegionContainerPane.java | 5 +- .../light/ui/laf/FineLightLaf.properties | 12 ++- .../components/ButtonStoryBoard.java | 20 ++--- .../fr/design/mainframe/SheetNameTabPane.java | 6 +- .../design/mainframe/bbs/UserInfoLabel.java | 5 +- 14 files changed, 133 insertions(+), 134 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineCombinationButtonUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineCombinationButtonUI.java index e243f47e07..b2ab0f30a4 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineCombinationButtonUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineCombinationButtonUI.java @@ -1,6 +1,7 @@ package com.fine.theme.light.ui; import com.fine.theme.utils.FineClientProperties; +import com.fine.theme.utils.FineUIStyle; import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.ui.FlatPanelUI; import com.formdev.flatlaf.ui.FlatUIUtils; @@ -77,7 +78,7 @@ public class FineCombinationButtonUI extends FlatPanelUI { switch (e.getPropertyName()) { case FineClientProperties.STYLE_CLASS: UICombinationButton b = (UICombinationButton) e.getSource(); - if (FineClientProperties.STYLE_PRIMARY.equals(e.getNewValue())) { + if (FineUIStyle.STYLE_PRIMARY.equals(e.getNewValue())) { b.setPrimary(); } b.repaint(); diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java index 61fb25466d..bc15747ed0 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java @@ -1,7 +1,6 @@ package com.fine.theme.light.ui; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.utils.FineClientProperties; import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.base.GraphHelper; @@ -114,7 +113,6 @@ public class FineTemplateTabPaneUI extends PanelUI { moreAction = new LazyIcon("tool_more"); moreHoverAction = new LazyIcon("clear_hover"); fileIcon = new LazyIcon("cpt_icon"); - FineClientProperties.setStyle(tabPane, "Default"); leadingWidth = scale(LEADING_WIDTH); trailingWidth = scale(TRAILING_WIDTH); diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java b/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java index 7f2f501a7d..aa50ebae8c 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java @@ -1,10 +1,7 @@ package com.fine.theme.utils; -import com.finebi.cbb.utils.StringUtils; import com.formdev.flatlaf.FlatClientProperties; -import javax.swing.JComponent; - /** * FR-UI中使用的各类属性 * @@ -17,80 +14,9 @@ public interface FineClientProperties extends FlatClientProperties { //--------------------------- ButtonGroup ----------------------- String BUTTON_TYPE_GROUP = "group"; - String STYLE_PRIMARY = "primary"; - String STYLE_SECONDARY = "secondary"; - String STYLE_SIZE_MEDIUM = "mediumSize"; - String STYLE_SIZE_SMALL = "smallSize"; - String BUTTON_TYPE_LEFT_ROUND_RECT = "leftRoundRect"; String BUTTON_TYPE_RIGHT_ROUND_RECT = "rightRoundRect"; - /** - * 添加组件的样式类,类似css,该方法会接在原样式后方 - * - * FineClientProperties.appendStyle("primary small") - * - * - * @param it 组件 - * @param styleClass 样式字符串,支持连续添加类,用空格 - */ - static void appendStyle(JComponent it, String styleClass) { - Object oriProperty = it.getClientProperty(FineClientProperties.STYLE_CLASS); - if (oriProperty instanceof String && StringUtils.isNotBlank((String) oriProperty)) { - styleClass = oriProperty + " " + styleClass; - } - it.putClientProperty(FineClientProperties.STYLE_CLASS, styleClass); - } - - /** - * 设置组件的样式类,类似css,该方法会替换原样式 - * - * FineClientProperties.setStyle("primary small") - * - * - * @param jComponent 组件 - * @param styleClass 样式字符串,支持连续添加类,用空格 - */ - static void setStyle(JComponent jComponent, String styleClass) { - jComponent.putClientProperty(FineClientProperties.STYLE_CLASS, styleClass); - } - - /** - * 样式组合 - * - * @param styleClasses 所有样式 - * @return 样式列表 - */ - static String join(String... styleClasses) { - final StringBuilder sb = new StringBuilder(); - for (final String style : styleClasses) { - if (style == null) { - continue; - } - if (sb.length() > 0) { - sb.append(" "); - } - sb.append(style); - } - return sb.toString(); - } - - /** - * 包含样式 - * - * @param jComponent 组件 - * @param styleClass 样式 - * @return 是否包含指定的样式 - */ - static boolean hasStyle(JComponent jComponent, String styleClass) { - Object style = jComponent.getClientProperty(FineClientProperties.STYLE_CLASS); - if (style instanceof String && StringUtils.isNotBlank((String) style)) { - return ((String) style).contains(styleClass); - } - return false; - } - - String BUTTON_GROUP_POSITION = "group_position"; int GROUP_BUTTON_POSITION_INNER = 0; diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java index 35f489399e..48a6490015 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java @@ -1,5 +1,9 @@ package com.fine.theme.utils; +import com.finebi.cbb.utils.StringUtils; + +import javax.swing.JComponent; + /** * UI样式工具 * @@ -10,6 +14,82 @@ package com.fine.theme.utils; public interface FineUIStyle { String IN_TOOLBAR_GROUP = "inToolbarGroup"; + String STYLE_PRIMARY = "primary"; + String STYLE_SECONDARY = "secondary"; + String STYLE_SIZE_MEDIUM = "mediumSize"; + String STYLE_SIZE_SMALL = "smallSize"; + String MENU_BAR = "menuBar"; + String LIGHT_GREY = "lightGrey"; + String IN_TOOLBAR_LEFT = "inToolbarLeft"; + String IN_TOOLBAR_RIGHT = "inToolbarRight"; + String NORMAL_COLOR = "normalColor"; + String TOP_TOOLS = "topTools"; + String BRAND_COLOR_LABEL = "brandColorLabel"; + + + /** + * 添加组件的样式类,类似css,该方法会接在原样式后方 + * + * FineClientProperties.appendStyle("primary small") + * + * + * @param it 组件 + * @param styleClass 样式字符串,支持连续添加类,用空格 + */ + static void appendStyle(JComponent it, String styleClass) { + Object oriProperty = it.getClientProperty(FineClientProperties.STYLE_CLASS); + if (oriProperty instanceof String && StringUtils.isNotBlank((String) oriProperty)) { + styleClass = oriProperty + " " + styleClass; + } + it.putClientProperty(FineClientProperties.STYLE_CLASS, styleClass); + } + + /** + * 设置组件的样式类,类似css,该方法会替换原样式 + * + * FineClientProperties.setStyle("primary small") + * + * + * @param jComponent 组件 + * @param styleClass 样式字符串,支持连续添加类,用空格 + */ + static void setStyle(JComponent jComponent, String styleClass) { + jComponent.putClientProperty(FineClientProperties.STYLE_CLASS, styleClass); + } + + /** + * 样式组合 + * + * @param styleClasses 所有样式 + * @return 样式列表 + */ + static String joinStyle(String... styleClasses) { + final StringBuilder sb = new StringBuilder(); + for (final String style : styleClasses) { + if (style == null) { + continue; + } + if (sb.length() > 0) { + sb.append(" "); + } + sb.append(style); + } + return sb.toString(); + } + /** + * 包含样式 + * + * @param jComponent 组件 + * @param styleClass 样式 + * @return 是否包含指定的样式 + */ + static boolean hasStyle(JComponent jComponent, String styleClass) { + Object style = jComponent.getClientProperty(FineClientProperties.STYLE_CLASS); + if (style instanceof String && StringUtils.isNotBlank((String) style)) { + return ((String) style).contains(styleClass); + } + return false; + } } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java index 9b89a90419..736a340297 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java @@ -1,7 +1,6 @@ package com.fr.design.gui.ibutton; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.utils.FineClientProperties; import com.fr.base.CellBorderStyle; import com.fr.base.svg.IconUtils; import com.fr.design.constants.UIConstants; @@ -25,6 +24,9 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.RoundRectangle2D; +import static com.fine.theme.utils.FineUIStyle.STYLE_PRIMARY; +import static com.fine.theme.utils.FineUIStyle.hasStyle; + public class UIButton extends JButton implements UIObserver, UITextComponent { private static final int TOOLTIP_INIT_DELAY = 300; // 延迟 0.3s 显示提示文字 @@ -280,7 +282,7 @@ public class UIButton extends JButton implements UIObserver, UITextComponent { */ public void setNormalPainted(boolean isNormalPressed) { this.isNormalPainted = isNormalPressed; - boolean primary = FineClientProperties.hasStyle(this, FineClientProperties.STYLE_PRIMARY); + boolean primary = hasStyle(this, STYLE_PRIMARY); if (!isNormalPainted() && !primary) { setOpaque(false); } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java index ad2ca580e4..20693ee80e 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java @@ -4,8 +4,8 @@ import com.fine.swing.ui.layout.Column; import com.fine.swing.ui.layout.Row; import com.fine.swing.ui.layout.Spacer; import com.fine.theme.light.ui.FineRoundBorder; -import com.fine.theme.utils.FineClientProperties; import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIStyle; import com.fine.theme.utils.FineUIUtils; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; @@ -270,7 +270,7 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb inToolbar = true; for (UIToggleButton uiToggleButton : labelButtonList) { uiToggleButton.putClientProperty(BUTTON_TYPE, BUTTON_TYPE_TOOLBAR_BUTTON); - FineClientProperties.setStyle(uiToggleButton, IN_TOOLBAR_GROUP); + FineUIStyle.setStyle(uiToggleButton, IN_TOOLBAR_GROUP); uiToggleButton.set4ToolbarButton(); uiToggleButton.setBorderPainted(false); } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java index 0cb7d6af15..80d74bcdc4 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java @@ -12,8 +12,10 @@ import java.util.function.Consumer; import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE_LEFT_ROUND_RECT; import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE_RIGHT_ROUND_RECT; -import static com.fine.theme.utils.FineClientProperties.STYLE_PRIMARY; -import static com.fine.theme.utils.FineClientProperties.setStyle; +import static com.fine.theme.utils.FineUIStyle.IN_TOOLBAR_LEFT; +import static com.fine.theme.utils.FineUIStyle.IN_TOOLBAR_RIGHT; +import static com.fine.theme.utils.FineUIStyle.STYLE_PRIMARY; +import static com.fine.theme.utils.FineUIStyle.setStyle; import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; /** @@ -123,6 +125,7 @@ public class UICombinationButton extends JPanel { public void setPrimary() { setStyle(leftButton, STYLE_PRIMARY); + setStyle(rightButton, STYLE_PRIMARY); } @@ -136,9 +139,9 @@ public class UICombinationButton extends JPanel { public void set4Toolbar() { leftButton.setBorderPainted(false); - setStyle(leftButton, "inToolbarLeft"); + setStyle(leftButton, IN_TOOLBAR_LEFT); rightButton.setBorderPainted(false); - setStyle(rightButton, "inToolbarRight"); + setStyle(rightButton, IN_TOOLBAR_RIGHT); } protected void showPopWindow(JPopupMenu menu) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java index ea9a6110ec..327e07c3c2 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java @@ -24,7 +24,9 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -import static com.fine.theme.utils.FineClientProperties.setStyle; +import static com.fine.theme.utils.FineUIStyle.NORMAL_COLOR; +import static com.fine.theme.utils.FineUIStyle.TOP_TOOLS; +import static com.fine.theme.utils.FineUIStyle.setStyle; /** @@ -87,7 +89,7 @@ public class CenterRegionContainerPane extends JPanel { this.add(centerTemplateCardPane = new DesktopCardPane(), BorderLayout.CENTER); centerTemplateCardPane.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); this.add(toolbarPane, BorderLayout.NORTH); - setStyle(this, "NormalColorPane"); + setStyle(this, NORMAL_COLOR); } public ToolBarMenuDock getToolBarMenuDock() { @@ -99,7 +101,7 @@ public class CenterRegionContainerPane extends JPanel { */ private void combineUpTooBar() { combineUp = new UIToolbar(FlowLayout.LEFT); - setStyle(combineUp, "topTools"); + setStyle(combineUp, TOP_TOOLS); combineUp.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); combineUp.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 2)); setUpUpToolBar(null); @@ -221,7 +223,7 @@ public class CenterRegionContainerPane extends JPanel { // 颜色,字体那些按钮的工具栏 toolbarPane.add(toolbarComponent = ad.resetToolBar(toolbarComponent, plus), BorderLayout.CENTER); - setStyle(toolbarComponent, "topTools"); + setStyle(toolbarComponent, TOP_TOOLS); toolbarComponent.setBorder(new ScaledEmptyBorder(0, 10, 10, 10)); JPanel customNorthPane = strategy.customNorthPane(toolbarPane, plus); if (!isExist(customNorthPane)) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java b/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java index 824dd08044..38a8d9d757 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java @@ -3,17 +3,13 @@ package com.fr.design.mainframe; import com.fine.theme.icon.LazyIcon; import com.fine.theme.utils.FineUIScale; import com.fine.theme.utils.FineUIUtils; -import com.formdev.flatlaf.FlatDarculaLaf; import com.formdev.flatlaf.ui.FlatUIUtils; -import com.fr.base.BaseUtils; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.islider.UISlider; import com.fr.design.gui.itextfield.UINumberField; -import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.BorderFactory; -import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.event.ChangeEvent; @@ -25,7 +21,6 @@ import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Graphics2D; -import java.awt.Image; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -37,13 +32,14 @@ import java.awt.event.MouseEvent; import java.awt.geom.Path2D; import java.math.BigDecimal; -import static com.fine.theme.utils.FineClientProperties.setStyle; +import static com.fine.theme.utils.FineUIStyle.LIGHT_GREY; +import static com.fine.theme.utils.FineUIStyle.setStyle; + /** * Created by MoMeak on 2017/7/13. */ public class JFormSliderPane extends JPanel { - public static final Image APPFIT_V0 = BaseUtils.readImage("com/fr/design/images/control/icon_thumb_normal.png"); private static final double ONEPOINTEIGHT = 1.8; private static final int SIX = 6; @@ -68,7 +64,7 @@ public class JFormSliderPane extends JPanel { public JFormSliderPane() { this.setLayout(new BorderLayout()); - setStyle(this, "LightGreyPanel"); + setStyle(this, LIGHT_GREY); initSlider(); initDownUpButton(); initShowValField(); @@ -294,22 +290,5 @@ public class JFormSliderPane extends JPanel { public void addValueChangeListener(ChangeListener changeListener){ this.slider.addChangeListener(changeListener); } - - public static void main(String[] args) { - try { - UIManager.setLookAndFeel( new FlatDarculaLaf() ); - } catch( Exception ex ) { - System.err.println( "Failed to initialize LaF" ); - } - JFrame jf = new JFrame("test"); - jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JPanel content = (JPanel) jf.getContentPane(); - content.setLayout(new BorderLayout()); - content.add(JFormSliderPane.getInstance(), BorderLayout.CENTER); - GUICoreUtils.centerWindow(jf); - jf.setSize(400, 80); - jf.setVisible(true); - - } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java index 2da92be7a7..79dfb5f68d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe; +import com.fine.theme.utils.FineUIStyle; import com.fr.design.DesignState; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; @@ -69,7 +70,7 @@ public class NorthRegionContainerPane extends JPanel { this.setLayout(new BorderLayout()); this.add(initNorthEastPane(ad), BorderLayout.EAST); this.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIManager.getColor("North.border"))); - setStyle(this, "MenuBar"); + FineUIStyle.setStyle(this, FineUIStyle.MENU_BAR); } /** @@ -152,7 +153,7 @@ public class NorthRegionContainerPane extends JPanel { public void execute(Object... objects) { bbsLoginPane[0] = ad.createBBSLoginPane(); } - }, SupportOSImpl. BBS_USER_LOGIN_PANE); + }, SupportOSImpl.BBS_USER_LOGIN_PANE); processor.hold(northEastPane, LogMessageBar.getInstance(), bbsLoginPane[0]); } northEastPane.add(ad.createAlphaFinePane()); diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index aaec48dfaa..fadbdfd33f 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -1236,13 +1236,17 @@ CellOtherSetPane.height=$Component.defaultHeight [style]ToolBar.topTools = \ background: #fff -[style]Panel.NormalColorPane=\ + +[style]Panel.normalColor=\ background: $fill.normal -[style]Panel.LightGreyPanel=\ + +[style]Panel.lightGrey=\ background: $Center.OuterShadowColor -[style]Panel.MenuBar=\ + +[style]Panel.menuBar=\ background: $MenuBar.background -[style]Label.BrandColorLabel=\ + +[style]Label.brandColorLabel=\ background: $brand.normal;\ foreground: $text.white;\ opaque: true diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java index 2dad573779..45d02df6cc 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java @@ -16,10 +16,10 @@ import static com.fine.swing.ui.layout.Layouts.cell; import static com.fine.swing.ui.layout.Layouts.column; import static com.fine.swing.ui.layout.Layouts.flex; import static com.fine.swing.ui.layout.Layouts.row; -import static com.fine.theme.utils.FineClientProperties.STYLE_PRIMARY; -import static com.fine.theme.utils.FineClientProperties.STYLE_SIZE_SMALL; -import static com.fine.theme.utils.FineClientProperties.join; -import static com.fine.theme.utils.FineClientProperties.setStyle; +import static com.fine.theme.utils.FineUIStyle.STYLE_PRIMARY; +import static com.fine.theme.utils.FineUIStyle.STYLE_SIZE_SMALL; +import static com.fine.theme.utils.FineUIStyle.joinStyle; +import static com.fine.theme.utils.FineUIStyle.setStyle; /** * 按钮 @@ -67,24 +67,24 @@ public class ButtonStoryBoard extends StoryBoard { row(20, cell(new UILabel("正常")), cell(new UIButton("按钮")) - .with(it -> setStyle(it, join(STYLE_PRIMARY, STYLE_SIZE_SMALL))), + .with(it -> setStyle(it, joinStyle(STYLE_PRIMARY, STYLE_SIZE_SMALL))), cell(new UIButton("按钮", new LazyIcon("add"))) - .with(it -> setStyle(it, join(STYLE_PRIMARY, STYLE_SIZE_SMALL))), + .with(it -> setStyle(it, joinStyle(STYLE_PRIMARY, STYLE_SIZE_SMALL))), cell(new UIButton(new LazyIcon("multi"))) - .with(it -> setStyle(it, join(STYLE_PRIMARY, STYLE_SIZE_SMALL))) + .with(it -> setStyle(it, joinStyle(STYLE_PRIMARY, STYLE_SIZE_SMALL))) ), row(20, cell(new UILabel("禁用")), cell(new UIButton("按钮")).with(it -> { - setStyle(it, join(STYLE_PRIMARY, STYLE_SIZE_SMALL)); + setStyle(it, joinStyle(STYLE_PRIMARY, STYLE_SIZE_SMALL)); it.setEnabled(false); }), cell(new UIButton("保存", new LazyIcon("save"))).with(it -> { - setStyle(it, join(STYLE_PRIMARY, STYLE_SIZE_SMALL)); + setStyle(it, joinStyle(STYLE_PRIMARY, STYLE_SIZE_SMALL)); it.setEnabled(false); }), cell(new UIButton(new LazyIcon("add"))).with(it -> { - setStyle(it, join(STYLE_PRIMARY, STYLE_SIZE_SMALL)); + setStyle(it, joinStyle(STYLE_PRIMARY, STYLE_SIZE_SMALL)); it.setEnabled(false); }) ) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java index 49ad367532..b815cc985f 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIStyle; import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.base.GraphHelper; @@ -54,7 +55,8 @@ import java.awt.geom.RoundRectangle2D; import java.util.ArrayList; import java.util.List; -import static com.fine.theme.utils.FineClientProperties.setStyle; +import static com.fine.theme.utils.FineUIStyle.LIGHT_GREY; + /** * NameTabPane of sheets @@ -165,7 +167,7 @@ public class SheetNameTabPane extends JPanel implements MouseListener, MouseMoti this.addMouseMotionListener(this); this.setBorder(null); this.setForeground(fontColor); - setStyle(this, "LightGreyPanel"); + FineUIStyle.setStyle(this, LIGHT_GREY); leftButton = new UIButton(LEFT_ICON) { @Override public Dimension getPreferredSize() { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoLabel.java b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoLabel.java index b77d9600a3..1d1ff9ad48 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoLabel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoLabel.java @@ -3,6 +3,7 @@ */ package com.fr.design.mainframe.bbs; +import com.fine.theme.utils.FineUIStyle; import com.fr.design.DesignerEnvManager; import com.fr.design.bbs.BBSLoginUtils; import com.fr.design.dialog.FineJOptionPane; @@ -48,7 +49,7 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import static com.fine.theme.utils.FineClientProperties.setStyle; +import static com.fine.theme.utils.FineUIStyle.BRAND_COLOR_LABEL; /** * @author neil @@ -151,7 +152,7 @@ public class UserInfoLabel extends UILabel { public UserInfoLabel(UserInfoPane userInfoPane) { init(userInfoPane); - setStyle(this, "BrandColorLabel"); + FineUIStyle.setStyle(this, BRAND_COLOR_LABEL); } /** From 3b86f775bbfc2e869f90dd6dd696272d8922163f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Thu, 4 Jan 2024 19:54:27 +0800 Subject: [PATCH 081/302] =?UTF-8?q?REPORT-111995=20=E3=80=90UI=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E3=80=91=E8=A5=BF=E5=8C=BA=E6=8B=96=E6=8B=BD=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E5=A4=84=E7=90=86/=E7=BD=91=E6=A0=BC=E8=89=B2?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/icontainer/UIResizableContainer.java | 143 +++++------------- .../fr/design/mainframe/ElementCasePane.java | 2 +- 2 files changed, 41 insertions(+), 104 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java index 535ba582ab..6cd8e8df4f 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java @@ -1,24 +1,23 @@ package com.fr.design.gui.icontainer; -import com.fr.base.vcs.DesignerMode; -import com.fr.design.constants.UIConstants; +import com.fine.theme.utils.FineUIScale; +import com.fr.design.base.mode.DesignModeContext; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.utils.SvgDrawUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.Constants; +import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; +import javax.swing.border.Border; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Image; import java.awt.LayoutManager; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -26,31 +25,28 @@ import java.awt.event.MouseMotionListener; public class UIResizableContainer extends JPanel { private static final long serialVersionUID = 1854340560790476907L; - private static final int MAX_PARA_HEIGHT = 240; - private int containerWidth = 240; - private int preferredWidth = 240; - private int toolPaneY = 300; - private int toolPaneHeight = 10; - private int bottomHeight = 30; + private int maxParaHeight = FineUIScale.scale(240); + private int containerWidth = FineUIScale.scale(240); + private int preferredWidth = FineUIScale.scale(240); + private int toolPaneY = FineUIScale.scale(300); + private int toolPaneHeight = FineUIScale.scale(5); + private int bottomHeight = FineUIScale.scale(30); private JComponent upPane; private JComponent downPane; //放参数面板 private JComponent parameterPane = new JPanel(); - private HorizotalToolPane horizontToolPane; + private HorizontalToolPane horizontalToolPane; private VerticalToolPane verticalToolPane; private int direction; private boolean hasParameterPane; - private static final int MAX_WIDTH = 300; - private static final int MIN_WIDTH = 165; + private static final int MAX_WIDTH = FineUIScale.scale(300); - private static final int ARROW_MARGIN = 15; - private static final int ARROW_MARGIN_VERTICAL = 7; - private static final int ARROW_RANGE = 35; - private static final int ARROW_RANGE_VERTICAL = 25; + private static final int ARROW_RANGE = FineUIScale.scale(35); + private static final int ARROW_RANGE_VERTICAL = FineUIScale.scale(25); private boolean isLeftRightDragEnabled = true; private boolean isDownPaneVisible = true ; @@ -95,12 +91,12 @@ public class UIResizableContainer extends JPanel { this.direction = direction; this.downPane = downPane; - this.horizontToolPane = new HorizotalToolPane(); + this.horizontalToolPane = new HorizontalToolPane(); this.verticalToolPane = new VerticalToolPane(); setLayout(containerLayout); add(upPane); - add(horizontToolPane); + add(horizontalToolPane); add(downPane); add(verticalToolPane); } @@ -110,10 +106,10 @@ public class UIResizableContainer extends JPanel { this.upPane = upPane; this.direction = direction; - this.horizontToolPane = new HorizotalToolPane(); + this.horizontalToolPane = new HorizontalToolPane(); setLayout(containerLayout); add(upPane); - add(horizontToolPane); + add(horizontalToolPane); } @@ -152,7 +148,7 @@ public class UIResizableContainer extends JPanel { * @param height */ public void setParameterHeight(int height) { - paraHeight = hasParameterPane? Math.min(height, MAX_PARA_HEIGHT) : 0; + paraHeight = hasParameterPane? Math.min(height, maxParaHeight) : 0; refreshContainer(); } @@ -220,7 +216,7 @@ public class UIResizableContainer extends JPanel { if (direction == Constants.RIGHT) { if(isDownPaneVisible){ upPane.setBounds(0, 0, containerWidth - toolPaneHeight, toolPaneY); - horizontToolPane.setBounds(0, toolPaneY, containerWidth - toolPaneHeight, toolPaneHeight); + horizontalToolPane.setBounds(0, toolPaneY, containerWidth, toolPaneHeight); downPane.setBounds(0, toolPaneY + toolPaneHeight, containerWidth - toolPaneHeight, parent.getHeight() - toolPaneY - toolPaneHeight - bottomHeight); verticalToolPane.setBounds(containerWidth - toolPaneHeight, 0, toolPaneHeight, getHeight()); }else{ @@ -232,13 +228,13 @@ public class UIResizableContainer extends JPanel { if (toolPaneY > getHeight() - toolPaneHeight - getParameterPaneHeight()) { toolPaneY = getHeight() - toolPaneHeight - getParameterPaneHeight(); } - parameterPane.setBounds(20, 0, 230, getParameterPaneHeight()); + parameterPane.setBounds(FineUIScale.scale(20), 0, FineUIScale.scale(230), getParameterPaneHeight()); upPane.setBounds(toolPaneHeight, getParameterPaneHeight(), containerWidth - toolPaneHeight, toolPaneY); - horizontToolPane.setBounds(toolPaneHeight, toolPaneY + getParameterPaneHeight(), containerWidth - toolPaneHeight, toolPaneHeight); + horizontalToolPane.setBounds(toolPaneHeight, toolPaneY + getParameterPaneHeight(), containerWidth, toolPaneHeight); downPane.setBounds(toolPaneHeight, toolPaneY + toolPaneHeight + getParameterPaneHeight(), containerWidth - toolPaneHeight, parent.getHeight() - toolPaneY - toolPaneHeight - getParameterPaneHeight()); verticalToolPane.setBounds(0, 0, toolPaneHeight, getHeight()); } else { - parameterPane.setBounds(20, 0, 230, getParameterPaneHeight()); + parameterPane.setBounds(FineUIScale.scale(20), 0, FineUIScale.scale(230), getParameterPaneHeight()); upPane.setBounds(toolPaneHeight, getParameterPaneHeight(), containerWidth - toolPaneHeight, getHeight() - getParameterPaneHeight()); verticalToolPane.setBounds(0, 0, toolPaneHeight, getHeight()); } @@ -251,7 +247,7 @@ public class UIResizableContainer extends JPanel { parentHeight = parent.getHeight(); } if (parentHeight != parent.getHeight() && (parent.getHeight() - toolPaneHeight) >= 0) { - // 调整toolPaneY,保证至少水平的拖拽条horizontToolPane不丢失 + // 调整toolPaneY,保证至少水平的拖拽条horizontalToolPane不丢失 toolPaneY = Math.min(toolPaneY, parent.getHeight() - toolPaneHeight); parentHeight = parent.getHeight(); } @@ -267,7 +263,7 @@ public class UIResizableContainer extends JPanel { * 得到最佳大小 */ public Dimension getPreferredSize() { - return new Dimension(containerWidth, 400); + return new Dimension(containerWidth, FineUIScale.scale(400)); } /** @@ -350,24 +346,24 @@ public class UIResizableContainer extends JPanel { } - private class HorizotalToolPane extends JPanel { - private int upModel = UIConstants.MODEL_NORMAL; - private int downModel = UIConstants.MODEL_NORMAL; + private class HorizontalToolPane extends JPanel { - public HorizotalToolPane() { + private Border paneBorder = BorderFactory.createMatteBorder(1, 0, 0, 1, UIManager.getColor("East.border")); + private Border hideBorder = BorderFactory.createMatteBorder(0, 0, 0, 1, UIManager.getColor("East.border")); + private final JPanel toolPane = this; + + public HorizontalToolPane() { super(); + this.setBorder(paneBorder); addMouseMotionListener(new MouseMotionListener() { @Override public void mouseMoved(MouseEvent e) { if (e.getX() <= ARROW_RANGE) { setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - upModel = UIConstants.MODEL_PRESS; } else if (e.getX() >= getWidth() - ARROW_RANGE) { setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - downModel = UIConstants.MODEL_PRESS; } else { - resetModel(); setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR)); } repaint(); @@ -376,8 +372,9 @@ public class UIResizableContainer extends JPanel { @Override public void mouseDragged(MouseEvent e) { toolPaneY = e.getYOnScreen() - UIResizableContainer.this.getLocationOnScreen().y; - toolPaneY = toolPaneY < 0 ? 0 : toolPaneY; + toolPaneY = Math.max(toolPaneY, 0); toolPaneY = toolPaneY > UIResizableContainer.this.getHeight() - toolPaneHeight ? UIResizableContainer.this.getHeight() - toolPaneHeight - getParameterPaneHeight() : toolPaneY - getParameterPaneHeight(); + toolPane.setBorder(toolPaneY == 0 ? hideBorder : paneBorder); refreshContainer(); } }); @@ -391,7 +388,6 @@ public class UIResizableContainer extends JPanel { @Override public void mouseExited(MouseEvent e) { setCursor(Cursor.getDefaultCursor()); - resetModel(); repaint(); } @@ -409,36 +405,20 @@ public class UIResizableContainer extends JPanel { }); } - private void resetModel() { - upModel = UIConstants.MODEL_NORMAL; - downModel = UIConstants.MODEL_NORMAL; - } - - @Override - public void paint(Graphics g) { - - Image upButton = (upModel == UIConstants.MODEL_NORMAL ? UIConstants.DRAG_UP_NORMAL : UIConstants.DRAG_UP_PRESS); - Image downButton = (downModel == UIConstants.MODEL_NORMAL ? UIConstants.DRAG_DOWN_NORMAL : UIConstants.DRAG_DOWN_PRESS); - g.setColor(UIManager.getColor("SplitPane.background")); - g.fillRect(0, 0, getWidth(), getHeight()); - SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, UIConstants.DRAG_LINE, (getWidth() - toolPaneHeight) / 2, 3, null)); - SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, upButton, ARROW_MARGIN, 0, null)); - SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, downButton, (getWidth() - toolPaneHeight - ARROW_MARGIN), 0, null)); - } } private class VerticalToolPane extends JPanel { - private int model = UIConstants.MODEL_NORMAL; public VerticalToolPane() { super(); + this.setOpaque(false); + this.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, UIManager.getColor("East.border"))); addMouseMotionListener(new MouseMotionListener() { @Override public void mouseMoved(MouseEvent e) { if (e.getY() <= ARROW_RANGE_VERTICAL) { setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - model = UIConstants.MODEL_PRESS; } else if (isLeftRightDragEnabled) { setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR)); } @@ -458,10 +438,10 @@ public class UIResizableContainer extends JPanel { containerWidth = UIResizableContainer.this.getWidth() + (UIResizableContainer.this.getLocationOnScreen().x - e.getXOnScreen()); } - containerWidth = containerWidth > MAX_WIDTH ? MAX_WIDTH : containerWidth; - containerWidth = containerWidth < MIN_WIDTH ? MIN_WIDTH : containerWidth; + containerWidth = Math.min(containerWidth, MAX_WIDTH); + containerWidth = Math.max(containerWidth, toolPaneHeight); refreshContainer(); - if (DesignerMode.isAuthorityEditing()) { + if (DesignModeContext.isAuthorityEditing()) { DesignerContext.getDesignerFrame().doResize(); } @@ -480,7 +460,6 @@ public class UIResizableContainer extends JPanel { @Override public void mouseExited(MouseEvent e) { setCursor(Cursor.getDefaultCursor()); - model = UIConstants.MODEL_NORMAL; repaint(); } @@ -494,7 +473,7 @@ public class UIResizableContainer extends JPanel { containerWidth = toolPaneHeight; } refreshContainer(); - if (DesignerMode.isAuthorityEditing()) { + if (DesignModeContext.isAuthorityEditing()) { DesignerContext.getDesignerFrame().doResize(); } } @@ -502,48 +481,6 @@ public class UIResizableContainer extends JPanel { }); } - @Override - public void paint(Graphics g) { - Image button; - g.setColor(UIManager.getColor("SplitPane.background")); - g.fillRect(0, 0, toolPaneHeight, getHeight()); - if (direction == Constants.RIGHT) { -// g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, toolPaneHeight, getHeight(), null); - if (containerWidth == toolPaneHeight) { - if (model == UIConstants.MODEL_NORMAL) { - button = UIConstants.DRAG_RIGHT_NORMAL; - } else { - button = UIConstants.DRAG_RIGHT_PRESS; - } - } else { - if (model == UIConstants.MODEL_NORMAL) { - button = UIConstants.DRAG_LEFT_NORMAL; - } else { - button = UIConstants.DRAG_LEFT_PRESS; - } - } - SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, button, -6, ARROW_MARGIN_VERTICAL, VerticalToolPane.this)); - } else { -// g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, toolPaneHeight, getHeight(), null); - if (containerWidth == toolPaneHeight) { - if (model == UIConstants.MODEL_NORMAL) { - button = UIConstants.DRAG_LEFT_NORMAL; - } else { - button = UIConstants.DRAG_LEFT_PRESS; - } - } else { - if (model == UIConstants.MODEL_NORMAL) { - button = UIConstants.DRAG_RIGHT_NORMAL; - } else { - button = UIConstants.DRAG_RIGHT_PRESS; - } - } - SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, button, 10, ARROW_MARGIN_VERTICAL, VerticalToolPane.this)); - } - if (isLeftRightDragEnabled) { - g.drawImage(UIConstants.DRAG_DOT_VERTICAL, 2, getHeight() / 2, 5, toolPaneHeight, null); - } - } } /** diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java index 0defeadfcd..2e8b0d5faa 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java @@ -3,6 +3,7 @@ */ package com.fr.design.mainframe; +import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.base.BaseFormula; import com.fr.base.DynamicUnitList; import com.fr.base.Formula; @@ -404,7 +405,6 @@ public abstract class ElementCasePane extends Tar grid.setDefaultFloatEditor(chartClass, new ChartFloatEditor()); } - addExtraCellEditor(grid); grid.setDefaultFloatEditor(Formula.class, new FormulaFloatEditor()); From 1233fc56b2911ad00f461726aaad6d51ea84bccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Thu, 4 Jan 2024 19:57:19 +0800 Subject: [PATCH 082/302] =?UTF-8?q?REPORT-111995=20=E3=80=90UI=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E3=80=91=E8=A5=BF=E5=8C=BA=E6=8B=96=E6=8B=BD=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E5=A4=84=E7=90=86/=E7=BD=91=E6=A0=BC=E8=89=B2?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/mainframe/ElementCasePane.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java index 2e8b0d5faa..163a5be638 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java @@ -7,7 +7,6 @@ import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.base.BaseFormula; import com.fr.base.DynamicUnitList; import com.fr.base.Formula; -import com.fr.base.NameStyle; import com.fr.base.Style; import com.fr.base.vcs.DesignerMode; import com.fr.design.DesignState; @@ -97,7 +96,6 @@ import com.fr.page.PageAttributeGetter; import com.fr.page.ReportPageAttrProvider; import com.fr.poly.creator.PolyElementCasePane; import com.fr.report.ReportHelper; -import com.fr.report.cell.CellElement; import com.fr.report.cell.FloatElement; import com.fr.report.cell.TemplateCellElement; import com.fr.report.cell.cellattr.core.RichText; @@ -134,7 +132,6 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.lang.reflect.Constructor; -import java.util.Iterator; import java.util.Set; import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; @@ -412,8 +409,9 @@ public abstract class ElementCasePane extends Tar grid.setDefaultFloatEditor(CellImagePainter.class, new ImageFloatEditor()); DesignerEnvManager designerEnvManager = DesignerEnvManager.getEnvManager(); - grid.setGridLineColor(designerEnvManager.getGridLineColor()); - grid.setPaginationLineColor(designerEnvManager.getPaginationLineColor()); + // todo: 主题化与env.xml内定义的属性优先级问题 + grid.setGridLineColor(FlatUIUtils.getUIColor("Center.ZoneBorderColor", designerEnvManager.getGridLineColor())); + grid.setPaginationLineColor(FlatUIUtils.getUIColor("Center.PageLineColor", designerEnvManager.getPaginationLineColor())); } private void addExtraCellEditor(Grid grid) { From 8fdd4ef718717ec8db2dcc1d447e59c0d4e22d31 Mon Sep 17 00:00:00 2001 From: vito Date: Mon, 8 Jan 2024 15:43:24 +0800 Subject: [PATCH 083/302] =?UTF-8?q?REPORT-99485=20=E6=A8=A1=E7=89=88tab?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=89=8D=E5=AF=BC=E6=8C=89=E9=92=AE=E7=BB=98?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 1 + .../theme/light/ui/FineTemplateTabPaneUI.java | 9 +- .../com/fine/theme/utils/FineUIStyle.java | 1 + .../fr/design/file/MultiTemplateTabPane.java | 47 ++++- .../com/fr/design/file/NewTemplatePane.java | 173 ------------------ .../mainframe/CenterRegionContainerPane.java | 37 ++-- .../mainframe/ToolBarNewTemplatePane.java | 36 ---- .../mainframe/toolbar/ToolBarMenuDock.java | 6 - .../mainframe/vcs/ui/FileVersionsPanel.java | 3 +- .../main/java/com/fr/start/BaseDesigner.java | 47 ++--- .../fine/theme/icon/toolbar/more_hover.svg | 4 + .../light/ui/laf/FineLightLaf.properties | 3 + 12 files changed, 92 insertions(+), 275 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java delete mode 100644 designer-base/src/main/java/com/fr/design/mainframe/ToolBarNewTemplatePane.java create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/more_hover.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 17a5f62791..a123f3540f 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -174,6 +174,7 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("tool_edit", "com/fine/theme/icon/toolbar/edit.svg", true), new SvgIconSource("tool_edit_white", "com/fine/theme/icon/toolbar/edit_white.svg", true), new SvgIconSource("tool_more", "com/fine/theme/icon/toolbar/more.svg", true), + new SvgIconSource("tool_more_hover", "com/fine/theme/icon/toolbar/more_hover.svg"), // 参数面板 new SvgIconSource("param_edit", "com/fine/theme/icon/param/edit.svg", true, 24), diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java index bc15747ed0..3290d5bd22 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java @@ -26,6 +26,8 @@ import java.awt.geom.Rectangle2D; import static com.fine.theme.utils.FineUIScale.scale; import static com.fine.theme.utils.FineUIUtils.paintRoundTabBorder; import static com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import static com.fr.design.file.MultiTemplateTabPane.LEADING_WIDTH; +import static com.fr.design.file.MultiTemplateTabPane.TRAILING_WIDTH; /** * 文件Tab栏UI @@ -39,9 +41,6 @@ public class FineTemplateTabPaneUI extends PanelUI { private static final String ELLIPSIS = "..."; private static final int ICON_TEXT_GAP = 4; - private static final int LEADING_WIDTH = 0; - private static final int TRAILING_WIDTH = 34; - @Styleable(dot = true) protected Color background; @@ -111,7 +110,7 @@ public class FineTemplateTabPaneUI extends PanelUI { closeHoverIcon = new LazyIcon("clear_hover"); addAction = new LazyIcon("add_worksheet"); moreAction = new LazyIcon("tool_more"); - moreHoverAction = new LazyIcon("clear_hover"); + moreHoverAction = new LazyIcon("tool_more_hover"); fileIcon = new LazyIcon("cpt_icon"); leadingWidth = scale(LEADING_WIDTH); trailingWidth = scale(TRAILING_WIDTH); @@ -231,7 +230,7 @@ public class FineTemplateTabPaneUI extends PanelUI { int x = leadingWidth + (int) tabPaneWidth + (trailingWidth - moreAction.getIconWidth()) / 2; int y = (tabHeight - moreAction.getIconHeight()) / 2; if (tabPane.isHoverMoreAction()) { - closeHoverIcon.paintIcon(tabPane, g2d, x, y); + moreHoverAction.paintIcon(tabPane, g2d, x, y); } else { moreAction.paintIcon(tabPane, g2d, x, y); } diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java index 48a6490015..1e029ed551 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java @@ -25,6 +25,7 @@ public interface FineUIStyle { String NORMAL_COLOR = "normalColor"; String TOP_TOOLS = "topTools"; String BRAND_COLOR_LABEL = "brandColorLabel"; + String BUTTON_TAB_ACTION = "tabAction"; /** diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index e6e6155759..9a0892d865 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -1,12 +1,16 @@ package com.fr.design.file; +import com.fine.swing.ui.layout.Layouts; +import com.fine.swing.ui.layout.Row; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIStyle; import com.fr.base.vcs.DesignerMode; import com.fr.design.actions.UpdateAction; import com.fr.design.actions.file.LocateAction; import com.fr.design.constants.UIConstants; import com.fr.design.dialog.FineJOptionPane; +import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.gui.imenu.UIScrollPopUpMenu; @@ -29,8 +33,8 @@ import com.fr.workspace.server.lock.TplOperator; import javax.swing.BorderFactory; import javax.swing.Icon; +import javax.swing.JButton; import javax.swing.JOptionPane; -import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.MenuElement; import javax.swing.SwingUtilities; @@ -40,6 +44,7 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; @@ -47,7 +52,10 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE_TOOLBAR_BUTTON; import static com.fine.theme.utils.FineUIScale.scale; +import static com.fine.theme.utils.FineUIStyle.BUTTON_TAB_ACTION; +import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; import static com.fr.design.dialog.FineJOptionPane.showConfirmDialog; import static javax.swing.JOptionPane.OK_CANCEL_OPTION; import static javax.swing.JOptionPane.OK_OPTION; @@ -61,14 +69,21 @@ import static javax.swing.JOptionPane.WARNING_MESSAGE; *

* created by daisy on 2013/08/05 **/ -public class MultiTemplateTabPane extends JPanel { +public class MultiTemplateTabPane extends Row { private static final String UI_CLASS_ID = "TemplateTabPaneUI"; private static final int GAP = 6; private static final int SMALLGAP = 4; - private static final int TRAILING_WIDTH = 34; - private static final int LEADING_WIDTH = 0; + /** + * 尾部动作区宽度 + */ + public static final int TRAILING_WIDTH = 34; + + /** + * 前导动作区宽度 + */ + public static final int LEADING_WIDTH = 38; //每个标签页的最大的长度和最小长度。这些长度均为均分 @@ -101,6 +116,7 @@ public class MultiTemplateTabPane extends JPanel { private boolean hoverMoreAction = false; private Icon clodeIcon = new LazyIcon("clear"); private boolean isShowList = false; + private JButton leadingActionButton; //自动新建的模板B若没有进行任何编辑,切换到其他 // @@ -127,6 +143,7 @@ public class MultiTemplateTabPane extends JPanel { * 多工作簿面板 */ public MultiTemplateTabPane() { + this.addMouseListener(new MultiTemplateTabMouseListener()); this.addMouseMotionListener(new MultiTemplateTabMouseMotionListener()); this.setBorder(null); @@ -171,6 +188,28 @@ public class MultiTemplateTabPane extends JPanel { } } }); + add( + Layouts.cell(new UIButton(new LazyIcon("add_worksheet"))).with(it -> { + it.putClientProperty(BUTTON_TYPE, BUTTON_TYPE_TOOLBAR_BUTTON); + FineUIStyle.setStyle(it, BUTTON_TAB_ACTION); + it.setFocusPainted(false); + leadingActionButton = it; + }) + ); + } + + /** + * 为前导动作添加监听 + * + * @param l 监听器 + */ + public void addLeadingAction(ActionListener l) { + leadingActionButton.removeActionListener(l); + leadingActionButton.addActionListener(l); + } + + public void setLeadingActionEnable(boolean enable){ + leadingActionButton.setEnabled(enable); } diff --git a/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java deleted file mode 100644 index 256ddccd27..0000000000 --- a/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java +++ /dev/null @@ -1,173 +0,0 @@ -package com.fr.design.file; - -import com.fr.base.BaseUtils; -import com.fr.base.vcs.DesignerMode; -import com.fr.design.constants.UIConstants; -import com.fr.design.mainframe.DesignerContext; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; -import java.awt.geom.Line2D; -import java.awt.geom.Rectangle2D; - -// todo: 自己绘制组件 -/** - * Author : daisy - * Date: 13-8-27 - * Time: 下午6:07 - */ -public abstract class NewTemplatePane extends JComponent implements MouseListener, MouseMotionListener { - - private static final Icon GRAY_NEW_CPT = BaseUtils.readIcon("/com/fr/design/images/buttonicon/additicon_grey.png"); - private static final int ICON_START_X = 5; - private static final int HEIGHT = 26; - private Graphics2D g2d; - private Icon newWorkBookIconMode = null; - - - public NewTemplatePane() { - newWorkBookIconMode = getNew(); - this.setLayout(new BorderLayout(0, 0)); - this.addMouseListener(this); - this.addMouseMotionListener(this); - this.setBorder(null); - } - - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.width = HEIGHT; - return dim; - } - - - public void paintComponent(Graphics g) { - super.paintComponent(g); - g2d = (Graphics2D) g; - g2d.setColor(getBackground()); - g2d.fill(new Rectangle2D.Double(0, 0, getWidth(),getHeight())); - int sheetIconY = (getHeight() - newWorkBookIconMode.getIconHeight()) / 2; - newWorkBookIconMode.paintIcon(this, g2d, ICON_START_X, sheetIconY); -// paintUnderLine(g2d); - } - - - private void paintUnderLine(Graphics2D g2d) { - //画下面的那条线 - g2d.setPaint(UIConstants.LINE_COLOR); - g2d.draw(new Line2D.Double((float) 0, (float) (getHeight()-1), getWidth(), (float) (getHeight()-1))); - } - - /** - *鼠标点击 - * @param e 事件 - */ - public void mouseClicked(MouseEvent e) { - if (needGrayNewCpt()) { - newWorkBookIconMode = GRAY_NEW_CPT; - } - } - - /** - *鼠标按下 - * @param e 事件 - */ - public void mousePressed(MouseEvent e) { - int evtX = e.getX(); - if (needGrayNewCpt()) { - newWorkBookIconMode = GRAY_NEW_CPT; - } - if (isOverNewIcon(evtX) && newWorkBookIconMode != GRAY_NEW_CPT) { - newWorkBookIconMode = getMousePressNew(); - createNewTemplate(); - } - this.repaint(); - } - - - /** - * 新建模板 - */ - protected void createNewTemplate() { - DesignerContext.getDesignerFrame().addAndActivateJTemplate(); - } - - /** - *鼠标松开 - * @param e 事件 - */ - public void mouseReleased(MouseEvent e) { - if (needGrayNewCpt()) { - newWorkBookIconMode = GRAY_NEW_CPT; - } - } - - /** - *鼠标进入 - * @param e 事件 - */ - public void mouseEntered(MouseEvent e) { - if (needGrayNewCpt()) { - newWorkBookIconMode = GRAY_NEW_CPT; - } - } - - /** - *鼠标离开 - * @param e 事件 - */ - public void mouseExited(MouseEvent e) { - if (needGrayNewCpt()) { - newWorkBookIconMode = GRAY_NEW_CPT; - } else { - newWorkBookIconMode = getNew(); - } - - this.repaint(); - } - - /** - *鼠标拖拽 - * @param e 事件 - */ - public void mouseDragged(MouseEvent e) { - } - - /** - *鼠标移动 - * @param e 事件 - */ - public void mouseMoved(MouseEvent e) { - int evtX = e.getX(); - if (needGrayNewCpt()) { - newWorkBookIconMode = GRAY_NEW_CPT; - } else if (isOverNewIcon(evtX)) { - newWorkBookIconMode = getMouseOverNew(); - } - - this.repaint(); - - } - - private boolean needGrayNewCpt() { - return DesignerMode.isAuthorityEditing() || DesignerMode.isVcsMode(); - } - - - private boolean isOverNewIcon(int evtX) { - return (evtX >= ICON_START_X && evtX <= ICON_START_X + newWorkBookIconMode.getIconWidth()); - } - - public void setButtonGray(boolean isGray) { - newWorkBookIconMode = isGray ? GRAY_NEW_CPT : getNew(); - } - - public abstract Icon getNew(); - - public abstract Icon getMouseOverNew(); - - public abstract Icon getMousePressNew(); - -} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java index 327e07c3c2..54944f2d30 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java @@ -5,7 +5,6 @@ import com.fr.design.DesignState; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.MultiTemplateTabPane; -import com.fr.design.file.NewTemplatePane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UICombinationButton; import com.fr.design.gui.itoolbar.UIToolbar; @@ -53,8 +52,7 @@ public class CenterRegionContainerPane extends JPanel { private UIToolbar combineUp;//撤销重做 等工具栏 - private JPanel templateTabPane;//新建模板 + 模板tab标签 - private NewTemplatePane newWorkBookPane;//新建模板button + private MultiTemplateTabPane templateTabPane;//新建模板 + 模板tab标签 public static CenterRegionContainerPane getInstance() { @@ -77,8 +75,7 @@ public class CenterRegionContainerPane extends JPanel { largeToolbar = getToolBarMenuDock().createLargeToolbar(); eastCenterPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); combineUpTooBar(); - templateTabPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - newWorkBookPane = getToolBarMenuDock().getNewTemplatePane(); + templateTabPane = initTemplateTabPane(); eastCenterPane.add(templateTabPane, BorderLayout.NORTH); eastCenterPane.add(combineUp, BorderLayout.CENTER); @@ -92,6 +89,13 @@ public class CenterRegionContainerPane extends JPanel { setStyle(this, NORMAL_COLOR); } + private MultiTemplateTabPane initTemplateTabPane() { + MultiTemplateTabPane templateTabPane = MultiTemplateTabPane.getInstance(); + templateTabPane.addLeadingAction(e -> + DesignerContext.getDesignerFrame().addAndActivateJTemplate()); + return templateTabPane; + } + public ToolBarMenuDock getToolBarMenuDock() { return DesignerContext.getDesignerFrame().getToolBarMenuDock(); } @@ -230,18 +234,12 @@ public class CenterRegionContainerPane extends JPanel { this.removeNorth(); this.add(customNorthPane, BorderLayout.NORTH); } - if (strategy.hasTemplateTabPane(plus)) { - eastCenterPane.add(templateTabPane, BorderLayout.NORTH); - } else { - eastCenterPane.remove(templateTabPane); - } if (strategy.hasCombineUp(plus)) { eastCenterPane.add(combineUp, BorderLayout.CENTER); } else { eastCenterPane.remove(combineUp); } - resetByDesignMode(); } private void removeNorth() { @@ -264,18 +262,6 @@ public class CenterRegionContainerPane extends JPanel { return false; } - private void resetByDesignMode() { - if (DesignModeContext.isDuchampMode()) { -// eastPane.remove(largeToolbar); - //移除新建模板按钮 - templateTabPane.remove(newWorkBookPane); - } else { -// eastPane.add(largeToolbar, BorderLayout.WEST); - templateTabPane.add(newWorkBookPane, BorderLayout.WEST); - - } - } - JComponent getToolbarComponent() { @@ -286,8 +272,7 @@ public class CenterRegionContainerPane extends JPanel { * 判断是否在权限编辑状态,若是在权限编辑状态,则需要有虚线框和关闭突变 */ protected void needToAddAuhtorityPaint() { - newWorkBookPane.setButtonGray(DesignModeContext.isAuthorityEditing()); - + MultiTemplateTabPane.getInstance().setLeadingActionEnable(DesignModeContext.isAuthorityEditing()); } @@ -309,7 +294,7 @@ public class CenterRegionContainerPane extends JPanel { * 重置下RegionContainerpane */ public void resetCenterRegionContainerPane() { - templateTabPane.add(MultiTemplateTabPane.getInstance(), BorderLayout.CENTER); + } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/ToolBarNewTemplatePane.java b/designer-base/src/main/java/com/fr/design/mainframe/ToolBarNewTemplatePane.java deleted file mode 100644 index 64d58bd8e5..0000000000 --- a/designer-base/src/main/java/com/fr/design/mainframe/ToolBarNewTemplatePane.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.fr.design.mainframe; - -import com.fr.base.svg.IconUtils; -import com.fr.design.file.NewTemplatePane; - -import javax.swing.Icon; - -/** - * Created by hzzz on 2017/12/26. - */ -public class ToolBarNewTemplatePane extends NewTemplatePane { - - private static final ToolBarNewTemplatePane instance = new ToolBarNewTemplatePane(); - - private ToolBarNewTemplatePane() { - } - - public static NewTemplatePane getInstance() { - return instance; - } - - @Override - public Icon getNew() { - return IconUtils.readIcon("/com/fr/design/standard/addicon/addicon"); - } - - @Override - public Icon getMouseOverNew() { - return IconUtils.readIcon("/com/fr/design/standard/addicon/add_press.svg"); - } - - @Override - public Icon getMousePressNew() { - return IconUtils.readIcon("/com/fr/design/standard/addicon/add_press.svg"); - } -} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index c147ccc4f7..b15e7f9ed6 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -45,7 +45,6 @@ import com.fr.design.actions.server.PlatformManagerAction; import com.fr.design.actions.server.PluginManagerAction; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.NewTemplatePane; import com.fr.design.fun.MenuHandler; import com.fr.design.fun.OemProcessor; import com.fr.design.fun.PluginManagerProvider; @@ -59,7 +58,6 @@ import com.fr.design.gui.imenu.UIMenuBar; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.locale.impl.SupportLocaleImpl; import com.fr.design.mainframe.JTemplate; -import com.fr.design.mainframe.ToolBarNewTemplatePane; import com.fr.design.mainframe.platform.ServicePlatformAction; import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; @@ -782,10 +780,6 @@ public abstract class ToolBarMenuDock { } - public NewTemplatePane getNewTemplatePane() { - return ToolBarNewTemplatePane.getInstance(); - } - protected void insertMenu(MenuDef menuDef, String anchor) { insertMenu(menuDef, anchor, new NoTargetAction()); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java index 4dd14bce6d..f97ec6803c 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java @@ -13,7 +13,6 @@ import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrameFileDealerPane; import com.fr.design.mainframe.JTemplate; -import com.fr.design.mainframe.ToolBarNewTemplatePane; import com.fr.design.mainframe.WestRegionContainerPane; import com.fr.design.mainframe.vcs.common.VcsHelper; import com.fr.design.menu.ToolBarDef; @@ -156,7 +155,7 @@ public class FileVersionsPanel extends BasicPane { DesignModeContext.switchTo(isExit ? DesignerMode.NORMAL : DesignerMode.VCS); // MutilTempalteTabPane & NewTemplatePane 是否可点 - ToolBarNewTemplatePane.getInstance().setButtonGray(!isExit); + MultiTemplateTabPane.getInstance().setLeadingActionEnable(!isExit); JTemplate currentEditingTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); if (currentEditingTemplate.isJWorkBook()) { diff --git a/designer-base/src/main/java/com/fr/start/BaseDesigner.java b/designer-base/src/main/java/com/fr/start/BaseDesigner.java index 44228c2a4a..0391b4dabc 100644 --- a/designer-base/src/main/java/com/fr/start/BaseDesigner.java +++ b/designer-base/src/main/java/com/fr/start/BaseDesigner.java @@ -147,47 +147,47 @@ public abstract class BaseDesigner extends ToolBarMenuDock { } } } - + @Nullable private FILE getLastOpenFile() { - + FILE file = DesignerStartupContext.getInstance().getStartingTemplateFile(); if (file == null) { file = FILEFactory.createFILE(FILEFactory.ENV_PREFIX + DesignerEnvManager.getEnvManager().getLastOpenFile()); } return file; } - + private boolean openFile(final DesignerFrame df, boolean isException, FILE file) { - + AtomicBoolean isExWrapper = new AtomicBoolean(isException); openTemplate(df, isExWrapper, file); - + if (OperatingSystem.isMacOS()) { enableFullScreenMode(df); } - + JTemplate selectedJTemplate = df.getSelectedJTemplate(); if (selectedJTemplate != null) { selectedJTemplate.requestGridFocus(); } return isExWrapper.get(); } - + private void openTemplate(DesignerFrame df, AtomicBoolean isException, FILE file) { - + // 如果是起始页启动中 if (openTemplateOnStartup(df, isException, file)) { return; } - + openTemplate0(df, isException, file); } - + private void openTemplate0(DesignerFrame df, AtomicBoolean isException, FILE file) { - + file = getExtraFILE(isException, file); - + if (file != null && file.exists() && !isException.get()) { df.openTemplate(file); } else { @@ -196,9 +196,9 @@ public abstract class BaseDesigner extends ToolBarMenuDock { MultiTemplateTabPane.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); } } - + private FILE getExtraFILE(AtomicBoolean isException, FILE file) { - + //启动时打开指定文件的接口 DesignerStartOpenFileProcessor processor = ExtraDesignClassManager.getInstance().getSingle(DesignerStartOpenFileProcessor.XML_TAG); // 如果插件没有,且又开启了启动时打开空文件,则使用启动时打开空文件 @@ -216,9 +216,9 @@ public abstract class BaseDesigner extends ToolBarMenuDock { } return file; } - + private boolean openTemplateOnStartup(DesignerFrame df, AtomicBoolean isException, FILE file) { - + boolean onStartup = DesignerStartupContext.getInstance().isSupport(); if (onStartup) { DesignerStartupContext context = DesignerStartupContext.getInstance(); @@ -234,29 +234,30 @@ public abstract class BaseDesigner extends ToolBarMenuDock { } return false; } - + private boolean isOpenTemplate(AtomicBoolean isException, FILE file, DesignerStartupContext context) { - + return context.isOpenLastFile() && file != null && file.exists() && !isException.get(); } - + private boolean openEmpty(DesignerFrame df) { df.showEmptyJTemplate(); return true; } - + private boolean openTemplate(DesignerFrame df, FILE file) { df.openTemplate(file); return true; } - + private boolean createNewTemplate(DesignerFrame df) { df.addAndActivateJTemplate(); // 如果没有模板,则需要确认一下 - MultiTemplateTabPane.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); + MultiTemplateTabPane.getInstance() + .setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); return true; } - + private void enableFullScreenMode(Window window) { String className = "com.apple.eawt.FullScreenUtilities"; String methodName = "setWindowCanFullScreen"; diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/more_hover.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/more_hover.svg new file mode 100644 index 0000000000..5ffca66be2 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/more_hover.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index fadbdfd33f..48e06977bd 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -1234,6 +1234,9 @@ CellOtherSetPane.height=$Component.defaultHeight [style]Button.inToolbarRight = \ margin : 0,0,0,0 +[style]Button.tabAction = \ + toolbar.margin : 5,11,5,11 + [style]ToolBar.topTools = \ background: #fff From 360ea6fa2476e745ce2f9dde2eec5c9477c251a1 Mon Sep 17 00:00:00 2001 From: vito Date: Mon, 8 Jan 2024 15:45:33 +0800 Subject: [PATCH 084/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineTemplateTabPaneUI.java | 11 ----------- .../java/com/fr/design/file/MultiTemplateTabPane.java | 8 ++++---- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java index 3290d5bd22..2de24c89c2 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java @@ -214,17 +214,6 @@ public class FineTemplateTabPaneUI extends PanelUI { } } - private void paintLeadingAction(Graphics2D g2d, double tabPaneWidth) { - int x = (leadingWidth - addAction.getIconWidth()) / 2; - int y = (tabHeight - addAction.getIconHeight()) / 2; - if (tabPane.isHoverMoreAction()) { - closeHoverIcon.paintIcon(tabPane, g2d, x, y); - } else { - addAction.paintIcon(tabPane, g2d, x, y); - } - - } - private void paintTrailingAction(Graphics2D g2d, double tabPaneWidth) { int x = leadingWidth + (int) tabPaneWidth + (trailingWidth - moreAction.getIconWidth()) / 2; diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 9a0892d865..6e719ac1a8 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -62,12 +62,12 @@ import static javax.swing.JOptionPane.OK_OPTION; import static javax.swing.JOptionPane.WARNING_MESSAGE; /** - * 改个名字,一个拼写 n 个错误 + * 模版Tab组件 * * @author daisy - * @version 11.0 + * @since 11.0 *

- * created by daisy on 2013/08/05 + * created on 2013/08/05 **/ public class MultiTemplateTabPane extends Row { @@ -208,7 +208,7 @@ public class MultiTemplateTabPane extends Row { leadingActionButton.addActionListener(l); } - public void setLeadingActionEnable(boolean enable){ + public void setLeadingActionEnable(boolean enable) { leadingActionButton.setEnabled(enable); } From fab38a8c33e00943fd5d7f5216cb981936ca6e06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Mon, 8 Jan 2024 17:24:19 +0800 Subject: [PATCH 085/302] =?UTF-8?q?REPORT-111995=20=E3=80=90UI=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E3=80=91=E7=BF=BB=E6=96=B0=E5=85=AC=E5=BC=8F=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E3=80=81=E8=A1=A5=E5=85=85=E9=83=A8=E5=88=86=E5=9B=BE?= =?UTF-8?q?=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 5 + .../data/datapane/TableDataTreePane.java | 2 +- .../java/com/fr/design/dialog/UIDialog.java | 11 +- .../com/fr/design/formula/FormulaPane.java | 190 ++++++++++-------- .../FormulaPaneWhenReserveFormula.java | 4 +- .../shortcutfactory/OldShortCutFactory.java | 5 +- .../shortcutfactory/ShortCutFactory.java | 5 +- .../design/gui/icontainer/UIScrollPane.java | 22 +- .../main/java/com/fr/design/menu/MenuDef.java | 5 +- .../com/fine/theme/icon/param/param.svg | 5 + .../fine/theme/icon/param/param_disable.svg | 5 + .../com/fine/theme/icon/toolbar/add_popup.svg | 4 + .../theme/icon/toolbar/add_popup_disable.svg | 4 + .../com/fine/theme/icon/toolbar/config.svg | 5 + .../theme/icon/toolbar/config_disable.svg | 5 + .../com/fine/theme/icon/toolbar/move_left.svg | 3 + .../theme/icon/toolbar/move_left_disable.svg | 3 + .../fine/theme/icon/toolbar/move_right.svg | 3 + .../theme/icon/toolbar/move_right_disable.svg | 3 + .../light/ui/laf/FineLightLaf.properties | 4 +- .../java/com/fr/design/webattr/EventPane.java | 8 +- 21 files changed, 179 insertions(+), 122 deletions(-) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/param/param.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/param/param_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/add_popup.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/add_popup_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/config.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/config_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_left.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_left_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_right.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_right_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index a123f3540f..1a6b4efd0e 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -171,10 +171,14 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("tool_copy", "com/fine/theme/icon/toolbar/copy.svg", true), new SvgIconSource("move_down", "com/fine/theme/icon/toolbar/move_down.svg", true), new SvgIconSource("move_up", "com/fine/theme/icon/toolbar/move_up.svg", true), + new SvgIconSource("move_left", "com/fine/theme/icon/toolbar/move_left.svg", true), + new SvgIconSource("move_right", "com/fine/theme/icon/toolbar/move_right.svg", true), new SvgIconSource("tool_edit", "com/fine/theme/icon/toolbar/edit.svg", true), new SvgIconSource("tool_edit_white", "com/fine/theme/icon/toolbar/edit_white.svg", true), new SvgIconSource("tool_more", "com/fine/theme/icon/toolbar/more.svg", true), new SvgIconSource("tool_more_hover", "com/fine/theme/icon/toolbar/more_hover.svg"), + new SvgIconSource("tool_config", "com/fine/theme/icon/toolbar/config.svg", true), + new SvgIconSource("add_popup", "com/fine/theme/icon/toolbar/add_popup.svg", true, 24), // 参数面板 new SvgIconSource("param_edit", "com/fine/theme/icon/param/edit.svg", true, 24), @@ -182,6 +186,7 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("param_hide", "com/fine/theme/icon/param/hide.svg", true, 24), new SvgIconSource("param_hide_pressed", "com/fine/theme/icon/param/hide_pressed.svg", true, 24), new SvgIconSource("param_view", "com/fine/theme/icon/param/view.svg", true, 18), + new SvgIconSource("param", "com/fine/theme/icon/param/param.svg", true), // 北区菜单栏 new SvgIconSource("notification", "com/fine/theme/icon/notification/notification.svg"), diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index be8a8a2b12..2f385d8a47 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -228,7 +228,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { private TreeSearchToolbarPane initToolBarPane() { // toolbar addMenuDef = new MenuDef(Toolkit.i18nText("Fine-Design_Basic_Action_Add")); - addMenuDef.setDisabledIcon("/com/fr/design/standard/addpopup/addPopup", true); + addMenuDef.setIcon(new LazyIcon("add_popup")); createAddMenuDef(); // 创建插件监听 createPluginListener(); diff --git a/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java b/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java index 63aea87c3c..9f3d4c5b94 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java +++ b/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java @@ -1,5 +1,9 @@ package com.fr.design.dialog; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; @@ -77,8 +81,8 @@ public abstract class UIDialog extends JDialog { private void initComponents(boolean isNeedButtonPane) { JPanel contentPane = (JPanel) this.getContentPane(); - contentPane.setBorder(BorderFactory.createEmptyBorder(2, 4, 4, 4)); - contentPane.setLayout(new BorderLayout(0, 4)); + contentPane.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); + contentPane.setLayout(new BorderLayout(0, 10)); this.applyClosingAction(); this.applyEscapeAction(); contentPane.add(pane, BorderLayout.CENTER); @@ -94,7 +98,7 @@ public abstract class UIDialog extends JDialog { private JPanel createControlButtonPane() { JPanel controlPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - JPanel buttonsPane = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 0)); + JPanel buttonsPane = Layouts.row(LayoutConstants.HORIZONTAL_GAP).getComponent(); controlPane.add(buttonsPane, BorderLayout.EAST); //增加一个自定义按钮, 可以用于eg: 设为全局配置 @@ -148,6 +152,7 @@ public abstract class UIDialog extends JDialog { okButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_OK")); okButton.setName(OK_BUTTON); okButton.setMnemonic('O'); + FineUIStyle.setStyle(okButton, FineUIStyle.STYLE_PRIMARY); buttonsPane.add(okButton); okButton.addActionListener(new ActionListener() { diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java index f53930602c..58cb2af5f5 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java @@ -1,5 +1,10 @@ package com.fr.design.formula; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.base.BaseFormula; import com.fr.base.BaseUtils; import com.fr.base.Parameter; @@ -10,6 +15,7 @@ import com.fr.base.io.IOFile; import com.fr.data.TableDataSource; import com.fr.design.actions.UpdateAction; import com.fr.design.border.UIRoundedBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicPane; @@ -66,7 +72,7 @@ import com.fr.stable.script.Tiny; import com.fr.stable.script.TinyHunter; import java.awt.Window; -import javax.swing.BorderFactory; +import javax.swing.SwingConstants; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.Icon; @@ -92,7 +98,6 @@ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; @@ -120,6 +125,10 @@ import java.util.List; import java.util.Map; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; + /** * 公式编辑面板 * @@ -128,13 +137,11 @@ import java.util.Set; */ @EnableMetrics public class FormulaPane extends BasicPane implements KeyListener, UIFormula { - public static final int DEFUAL_FOMULA_LENGTH = 103; + public static final int DEFUAL_FOMULA_LENGTH = FineUIScale.scale(103); public static final String ELLIPSIS = "..."; public static final char KEY_CODE_A = 'A'; public static final char KEY_CODE_Z = 'z'; public static final String NEWLINE = "\n"; - public static final String FORMULA_ICON = "/com/fr/design/images/m_file/formula.png"; - public static final String PARAM_ICON = "/com/fr/design/images/m_file/param.png"; private VariableTreeAndDescriptionArea variableTreeAndDescriptionArea; private RSyntaxTextArea formulaTextArea; private UITextField keyWordTextField = new UITextField(18); @@ -156,8 +163,6 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { private DefaultCompletionProvider completionProvider; private static final Map PARAM_PREFIX_MAP = new HashMap<>(); - public static final int DESCRIPTION_TEXT_AREA_ROW = 16, DESCRIPTION_TEXT_AREA_COLUMN = 27; - public FormulaPane() { initComponents(); } @@ -255,26 +260,17 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { }); } - private void initTipsPane() { + private JPanel initTipsPane() { // tipsPane - JPanel containerSPane = new JPanel(new BorderLayout(4, 1)); - JPanel labelPane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0), true); - JPanel searchPane = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0), true); - containerSPane.setPreferredSize(new Dimension(892, 23)); - this.add(containerSPane, BorderLayout.NORTH); - UIButton searchButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaPane_Search")); UILabel formulaLabel = new UILabel( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Input_Formula_In_The_Text_Area_Below") + ":"); - formulaLabel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); - - labelPane.add(formulaLabel, BorderLayout.WEST); - keyWordTextField.setPreferredSize(new Dimension(240, 23)); - searchPane.add(keyWordTextField, BorderLayout.EAST); - searchPane.add(searchButton, BorderLayout.EAST); - - containerSPane.add(labelPane, BorderLayout.WEST); - containerSPane.add(searchPane, BorderLayout.EAST); + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Input_Formula_In_The_Text_Area_Below") + ":", SwingConstants.LEFT); + JPanel containerSPane = row( + cell(formulaLabel), + flex(), + cell(keyWordTextField), + cell(searchButton) + ).getComponent(); initKeyWordTextFieldKeyListener(); tipsList = new JList(listModel); @@ -288,14 +284,22 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { fixFunctionNameList(tipsList.getSelectedValue().toString()); } }); + + return containerSPane; } protected void initComponents() { - this.setLayout(new BorderLayout(4, 4)); + this.setLayout(new BorderLayout()); - initTextPane(); - initTipsPane(); - initVariableTreeAndDescriptionArea(); + JPanel textPane = initTextPane(); + JPanel tipsPane = initTipsPane(); + JPanel variablePane = initVariableTreeAndDescriptionArea(); + + this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(tipsPane), + cell(textPane).weight(1), + cell(variablePane).weight(2) + ).getComponent()); refocusInWindow(); } @@ -303,37 +307,31 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { SwingUtilities.invokeLater(() -> formulaTextArea.requestFocusInWindow()); } - private void initVariableTreeAndDescriptionArea() { + private JPanel initVariableTreeAndDescriptionArea() { variableTreeAndDescriptionArea = new VariableTreeAndDescriptionArea(); - this.add(variableTreeAndDescriptionArea, BorderLayout.SOUTH); + return variableTreeAndDescriptionArea; } - private void initTextPane() { + private JPanel initTextPane() { + JPanel textPane = new JPanel(new BorderLayout(0, LayoutConstants.VERTICAL_GAP)); + JPanel checkBoxAndButtonPane = new JPanel(new BorderLayout()); + // text - JPanel textPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - this.add(textPane, BorderLayout.CENTER); - JPanel checkBoxandbuttonPane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); initFormulaTextArea(); - UIScrollPane formulaTextAreaScrollPane = new UIScrollPane(formulaTextArea); - formulaTextAreaScrollPane.setBorder(null); - textPane.add(formulaTextAreaScrollPane, BorderLayout.CENTER); - textPane.add(checkBoxandbuttonPane, BorderLayout.SOUTH); - + formulaTextAreaScrollPane.setBorder(new FineRoundBorder()); + // buttonPane + JPanel buttonPane = row(8).getComponent(); UIButton checkValidButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Check_Valid")); UIButton calButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Formula_Cal_Button")); checkValidButton.addActionListener(checkValidActionListener); calButton.addActionListener(calculateActionListener); + buttonPane.add(checkValidButton); + buttonPane.add(calButton); - //靠左流式布局 - JPanel checkBoxPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - checkBoxandbuttonPane.add(checkBoxPane, BorderLayout.WEST); - //靠右流式布局 - JPanel buttonPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - buttonPane.add(checkValidButton, BorderLayout.EAST); - buttonPane.add(calButton, BorderLayout.EAST); - checkBoxandbuttonPane.add(buttonPane, BorderLayout.EAST); + // checkBoxPane + JPanel checkBoxPane = row(8).getComponent(); if (autoCompletionCheck == null) { autoCompletionCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula_AutoCompletion")); autoCompletionCheck.setSelected(true); @@ -342,10 +340,16 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { checkBeforeColse = new UICheckBox(Toolkit.i18nText("Fine-Design_Basic_Formula_Check_Before_Closed")); checkBeforeColse.setSelected(true); } - checkBoxPane.add(autoCompletionCheck, BorderLayout.WEST); - checkBoxPane.add(checkBeforeColse, BorderLayout.WEST); + checkBoxPane.add(autoCompletionCheck); + checkBoxPane.add(checkBeforeColse); extendCheckBoxPane(checkBoxPane); + // layout + checkBoxAndButtonPane.add(checkBoxPane, BorderLayout.WEST); + checkBoxAndButtonPane.add(buttonPane, BorderLayout.EAST); + textPane.add(formulaTextAreaScrollPane, BorderLayout.CENTER); + textPane.add(checkBoxAndButtonPane, BorderLayout.SOUTH); + ParameterTableModel model = new ParameterTableModel(0); editor4CalPane = new UITableEditorPane<>(model); formulaTextArea.addFocusListener(new FocusListener() { @@ -363,6 +367,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { uninstallAutoCompletion(); } }); + return textPane; } private CompletionProvider createCompletionProvider() { @@ -370,7 +375,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { completionProvider = new DefaultCompletionProvider(); NameAndDescription[] nameAndDescriptions = FunctionConstants.ALL.getDescriptions(); for (NameAndDescription nameAndDescription : nameAndDescriptions) { - completionProvider.addCompletion(new FormulaCompletion(completionProvider, nameAndDescription.getName(), BaseUtils.readIcon(FORMULA_ICON))); + completionProvider.addCompletion(new FormulaCompletion(completionProvider, nameAndDescription.getName(), new LazyIcon("formula"))); } VariableResolver variableResolver = VariableResolver.DEFAULT; @@ -394,7 +399,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { paramWithoutPre = parameter; PARAM_PREFIX_MAP.put(paramWithoutPre, StringUtils.EMPTY); } - completionProvider.addCompletion(new FormulaCompletion(completionProvider, paramWithoutPre, BaseUtils.readIcon(PARAM_ICON))); + completionProvider.addCompletion(new FormulaCompletion(completionProvider, paramWithoutPre, new LazyIcon("param"))); } return completionProvider; @@ -645,7 +650,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { popupMenu = new JPopupMenu(); JScrollPane tipsScrollPane = new JScrollPane(tipsList); popupMenu.add(tipsScrollPane); - tipsScrollPane.setPreferredSize(new Dimension(240, 146)); + tipsScrollPane.setPreferredSize(new Dimension(FineUIScale.scale(240), FineUIScale.scale(146))); tipsScrollPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); popupMenu.show(keyWordTextField, 0, 23); } @@ -742,8 +747,10 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { } public BasicDialog showLargeWindow(Window window, DialogActionListener l) { - BasicDialog basicDialog = super.showWindowWithCustomSize(window, l, new Dimension(900, 600)); - basicDialog.setMinimumSize(new Dimension(900, 600)); + int width = FineUIScale.scale(900); + int height = FineUIScale.scale(600); + BasicDialog basicDialog = super.showWindowWithCustomSize(window, l, new Dimension(width, height)); + basicDialog.setMinimumSize(new Dimension(width, height)); basicDialog.setResizable(true); return basicDialog; } @@ -1066,15 +1073,15 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { this.initComponents(); } - private void initFunctionTypeList(JPanel functionPane) { + private JPanel initFunctionTypeList() { functionTypeList = new QuickList(functionTypeListModel); UIScrollPane functionTypeScrollPane = new UIScrollPane(functionTypeList); - functionTypeScrollPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); - functionTypeScrollPane.setPreferredSize(new Dimension(140, 200)); - functionPane.add(this.createNamePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Function_Category") + ":", functionTypeScrollPane), BorderLayout.WEST); + functionTypeScrollPane.setBorder(new FineRoundBorder()); + functionTypeList.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); initTypeListCellRenderer(); initGroupTypeModel(); initTypeListSelectionListener(); + return this.createNamePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Function_Category"), functionTypeScrollPane); } private void initTypeListCellRenderer() { @@ -1181,23 +1188,21 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { }); } - private void initFunctionNameList(JPanel functionPane) { + private JPanel initFunctionNameList() { functionNameList = new JList(new DefaultListModel()); UIScrollPane functionNameScrollPane = new UIScrollPane(functionNameList); - functionNameScrollPane.setPreferredSize(new Dimension(140, 200)); - functionPane.add( - this.createNamePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Function_Name") + ":", functionNameScrollPane), - BorderLayout.CENTER); - functionNameScrollPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); + functionNameScrollPane.setBorder(new FineRoundBorder()); + functionNameList.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); initFunctionNameListCellRenderer(); initFunctionNameListSelectionListener(); initFunctionNameListMouseListener(); + return this.createNamePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Function_Name"), functionNameScrollPane); } private void initDescriptionTextArea() { // Description - descriptionTextArea = new UITextArea(DESCRIPTION_TEXT_AREA_ROW,DESCRIPTION_TEXT_AREA_COLUMN); - descriptionTextArea.setBackground(Color.white); + descriptionTextArea = new UITextArea(); + descriptionTextArea.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); descriptionTextArea.setLineWrap(true); descriptionTextArea.setWrapStyleWord(true); descriptionTextArea.setEditable(false); @@ -1263,14 +1268,12 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { } - private void initVariablesTree() { - JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - // vairable. + private JPanel initVariablesTree() { + // variable variablesTree = new JTree(); UIScrollPane variablesTreePane = new UIScrollPane(variablesTree); - variablesTreePane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); - panel.add(this.createNamePane( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaPane_Variables") + ":", variablesTreePane), BorderLayout.WEST); + variablesTreePane.setBorder(new FineRoundBorder()); + variablesTree.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); variablesTree.setRootVisible(false); variablesTree.setShowsRootHandles(true); variablesTree.addMouseListener(applyTextMouseListener); @@ -1280,23 +1283,34 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { UIScrollPane desScrollPane = new UIScrollPane(descriptionTextArea); desScrollPane.setBorder(null); - panel.add(this.createNamePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaPane_Formula_Description") + ":", desScrollPane), BorderLayout.CENTER); initVariablesTreeSelectionListener(); - this.add(panel,BorderLayout.CENTER); + return Layouts.row(LayoutConstants.HORIZONTAL_GAP, + cell(this.createNamePane( + Toolkit.i18nText("Fine-Design_Basic_FormulaPane_Variables"), variablesTreePane) + ).weight(1), + cell(this.createNamePane( + Toolkit.i18nText("Fine-Design_Basic_FormulaPane_Formula_Description"), desScrollPane) + ).weight(1) + ).getComponent(); } private void initComponents() { - this.setLayout(new BorderLayout(4, 4)); - initVariablesTree(); - initFunctionPane(); - } - - private void initFunctionPane() { - JPanel functionPane = new JPanel(new BorderLayout(4, 4)); - this.add(functionPane, BorderLayout.WEST); - initFunctionTypeList(functionPane); - initFunctionNameList(functionPane); + this.setLayout(new BorderLayout()); + JPanel variablesTreePane = initVariablesTree(); + JPanel functionPane = initFunctionPane(); + this.add(Layouts.row(LayoutConstants.HORIZONTAL_GAP, + cell(functionPane).weight(1), + cell(variablesTreePane).weight(2) + ).getComponent()); + } + + private JPanel initFunctionPane() { + JPanel functionTypePane = initFunctionTypeList(); + JPanel functionNamePane = initFunctionNameList(); functionTypeList.setSelectedIndex(0); + return Layouts.row(LayoutConstants.HORIZONTAL_GAP, + cell(functionTypePane).weight(1), cell(functionNamePane).weight(1) + ).getComponent(); } @Override @@ -1312,7 +1326,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { public LookDetailAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaPane_Function_Detail")); this.setMnemonic('L'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/preview.png")); + this.setSmallIcon(new LazyIcon("preview")); } // 弹出的窗口中显示函数的用法明细 @@ -1345,7 +1359,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { } private JPanel createNamePane(String name, JComponent comp) { - JPanel namePane = new JPanel(new BorderLayout(4, 4)); + JPanel namePane = new JPanel(new BorderLayout(0, 4)); namePane.add(new UILabel(name), BorderLayout.NORTH); namePane.add(comp, BorderLayout.CENTER); return namePane; @@ -1419,7 +1433,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { DefaultMutableTreeNode bindCellNode = new DefaultMutableTreeNode(new TextUserObject("$$$")); rootNode.add(bindCellNode); } - + // todo: 缺一些icon rootNode.add(new TextFolderUserObject(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Data_Fields"), BaseUtils.readIcon("/com/fr/design/images/dialog/table.png"), variableResolver.resolveColumnNames()).createMutableTreeNode()); @@ -1434,7 +1448,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { variableResolver.resolveTableDataParameterVariables()).createMutableTreeNode()); rootNode.add(new TextFolderUserObject(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_ParameterD_Report_Parameter"), - BaseUtils.readIcon("/com/fr/design/images/m_report/p.gif"), + new LazyIcon("param"), variableResolver.resolveReportParameterVariables()).createMutableTreeNode()); rootNode.add(new TextFolderUserObject(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Server_Global_Parameters"), diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaPaneWhenReserveFormula.java b/designer-base/src/main/java/com/fr/design/formula/FormulaPaneWhenReserveFormula.java index ab49b605d4..901ea88976 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaPaneWhenReserveFormula.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaPaneWhenReserveFormula.java @@ -40,8 +40,8 @@ public class FormulaPaneWhenReserveFormula extends FormulaPane { reserveCheckBox4Write = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Write_Save_Formula")); reserveCheckBox4Write.setSelected(false); - checkBoxPane.add(reserveCheckBox4Result, BorderLayout.WEST); - checkBoxPane.add(reserveCheckBox4Write, BorderLayout.WEST); + checkBoxPane.add(reserveCheckBox4Result); + checkBoxPane.add(reserveCheckBox4Write); } @Override diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/shortcutfactory/OldShortCutFactory.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/shortcutfactory/OldShortCutFactory.java index 6d966a289a..b584822484 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/shortcutfactory/OldShortCutFactory.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/shortcutfactory/OldShortCutFactory.java @@ -1,5 +1,6 @@ package com.fr.design.gui.controlpane.shortcutfactory; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseUtils; import com.fr.design.actions.UpdateAction; import com.fr.design.gui.controlpane.NameableCreator; @@ -63,7 +64,7 @@ public class OldShortCutFactory extends AbstractShortCutFactory { this.creator = creators[0]; this.setName(com.fr.design.i18n.Toolkit.i18nText(("Fine-Design_Basic_Action_Add"))); this.setMnemonic('A'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); + this.setSmallIcon(new LazyIcon("add")); } @Override @@ -79,7 +80,7 @@ public class OldShortCutFactory extends AbstractShortCutFactory { AddItemMenuDef(NameableCreator[] creators) { this.setName(com.fr.design.i18n.Toolkit.i18nText(("Fine-Design_Basic_Action_Add"))); this.setMnemonic('A'); - this.setIconPath("addPopup"); + this.setIcon(new LazyIcon("add_popup")); wrapActionListener(creators); } diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/shortcutfactory/ShortCutFactory.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/shortcutfactory/ShortCutFactory.java index da0b552682..ede336116e 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/shortcutfactory/ShortCutFactory.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/shortcutfactory/ShortCutFactory.java @@ -1,5 +1,6 @@ package com.fr.design.gui.controlpane.shortcutfactory; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseUtils; import com.fr.design.actions.UpdateAction; import com.fr.design.actions.core.ActionFactory; @@ -66,7 +67,7 @@ public class ShortCutFactory extends AbstractShortCutFactory { this.creator = creators[0]; this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Action_Add")); this.setMnemonic('A'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); + this.setSmallIcon(new LazyIcon("add")); } /** @@ -120,7 +121,7 @@ public class ShortCutFactory extends AbstractShortCutFactory { super(true); this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Action_Add")); this.setMnemonic('A'); - this.setIconPath("/com/fr/design/images/control/addPopup.png"); + this.setIcon(new LazyIcon("add_popup")); wrapActionListener(creators); } diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIScrollPane.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIScrollPane.java index 7bb13af2d6..d7443a7620 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIScrollPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIScrollPane.java @@ -14,7 +14,7 @@ import java.awt.Component; public class UIScrollPane extends JScrollPane { private static final long serialVersionUID = 1L; - private static final int INCREAMENT = 30; + private static final int INCREMENT = 30; public UIScrollPane(Component c) { this(c, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); @@ -23,32 +23,24 @@ public class UIScrollPane extends JScrollPane { public UIScrollPane(Component c, int vertical, int horizontal) { super(c, vertical, horizontal); this.setHorizontalScrollBar(createHorizontalScrollBar()); - this.getVerticalScrollBar().setUnitIncrement(INCREAMENT); - this.getVerticalScrollBar().setBlockIncrement(INCREAMENT); -// this.getHorizontalScrollBar().setOpaque(true); -// this.getHorizontalScrollBar().setBackground(Color.WHITE); -// this.getVerticalScrollBar().setOpaque(true); -// this.getVerticalScrollBar().setBackground(Color.WHITE); + this.getVerticalScrollBar().setUnitIncrement(INCREMENT); + this.getVerticalScrollBar().setBlockIncrement(INCREMENT); } - @Override /** * 生成水平滚动条 */ + @Override public UIScrollBar createHorizontalScrollBar() { - UIScrollBar sbr = new UIScrollBar(JScrollBar.HORIZONTAL); -// sbr.setBackground(UIConstants.NORMAL_BACKGROUND); - return sbr; + return new UIScrollBar(JScrollBar.HORIZONTAL); } - @Override /** * 生成垂直滚动条 */ + @Override public UIScrollBar createVerticalScrollBar() { - UIScrollBar sbr = new UIScrollBar(JScrollBar.VERTICAL); -// sbr.setBackground(UIConstants.NORMAL_BACKGROUND); - return sbr; + return new UIScrollBar(JScrollBar.VERTICAL); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java index e523a18384..c46adb7997 100644 --- a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java +++ b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java @@ -118,10 +118,12 @@ public class MenuDef extends ShortCut { this.isHeadMenu = headMenu; } + @Deprecated public String getIconPath() { return iconPath; } + @Deprecated public void setIconPath(String iconPath) { setDisabledIcon(iconPath, false); } @@ -206,9 +208,6 @@ public class MenuDef extends ShortCut { createdButton = new UIButton(icon); } else if (iconPath != null) { createdButton = new UIButton(IconUtils.readIcon(iconPath)); - if(needDisabled) { - createdButton.setDisabledIcon(IconUtils.readIcon(iconPath + IconUtils.ICON_TYPE_DISABLED)); - } createdButton.set4ToolbarButton(); } else { createdButton = new UIButton(name); diff --git a/designer-base/src/main/resources/com/fine/theme/icon/param/param.svg b/designer-base/src/main/resources/com/fine/theme/icon/param/param.svg new file mode 100644 index 0000000000..cf8c4954e6 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/param/param.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/param/param_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/param/param_disable.svg new file mode 100644 index 0000000000..33f424067f --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/param/param_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/add_popup.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/add_popup.svg new file mode 100644 index 0000000000..a4456590ce --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/add_popup.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/add_popup_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/add_popup_disable.svg new file mode 100644 index 0000000000..7e7c898733 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/add_popup_disable.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/config.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/config.svg new file mode 100644 index 0000000000..f93629147c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/config.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/config_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/config_disable.svg new file mode 100644 index 0000000000..28b5444d6a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/config_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_left.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_left.svg new file mode 100644 index 0000000000..06f6281974 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_left.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_left_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_left_disable.svg new file mode 100644 index 0000000000..49c273bddd --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_left_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_right.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_right.svg new file mode 100644 index 0000000000..9e6d66b5d6 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_right.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_right_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_right_disable.svg new file mode 100644 index 0000000000..cb8ebd753d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_right_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index 48e06977bd..e492ad27db 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -420,7 +420,7 @@ HelpButton.innerFocusWidth = $?Button.innerFocusWidth #---- List ---- -List.border = 0,0,0,0 +List.border = 2,2,2,2 List.cellMargins = 1,6,1,6 List.selectionInsets = 0,0,0,0 List.selectionArc = 0 @@ -1020,7 +1020,7 @@ ToggleButton.rollover = $Button.rollover ToggleButton.background = $Button.background ToggleButton.pressedBackground = @BrandPressedColor ToggleButton.selectedBackground = @BrandColor -ToggleButton.selectedForeground = $ToggleButton.foreground +ToggleButton.selectedForeground = #FFF ToggleButton.disabledSelectedBackground = darken($ToggleButton.background,13%,derived) ToggleButton.toolbar.hoverBackground = $Button.toolbar.hoverBackground diff --git a/designer-realize/src/main/java/com/fr/design/webattr/EventPane.java b/designer-realize/src/main/java/com/fr/design/webattr/EventPane.java index b64eda37c1..ff4e4296db 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/EventPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/EventPane.java @@ -1,6 +1,6 @@ package com.fr.design.webattr; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.icontainer.UIScrollPane; @@ -163,7 +163,7 @@ public class EventPane extends BasicPane { public class RemoveAction extends UpdateAction { public RemoveAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Delete")); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); + this.setSmallIcon(new LazyIcon("remove")); } public void actionPerformed(ActionEvent e) { @@ -187,7 +187,7 @@ public class EventPane extends BasicPane { public class EditAction extends UpdateAction { public EditAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Edit")); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/edit.png")); + this.setSmallIcon(new LazyIcon("edit")); } public void actionPerformed(ActionEvent e) { @@ -227,7 +227,7 @@ public class EventPane extends BasicPane { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add")); this.setTooltip(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add")); this.setMnemonic('A'); - this.setIconPath("/com/fr/design/images/control/addPopup.png"); + this.setIcon(new LazyIcon("add_popup")); this.menuName = menuName; showMenu(); } From aaf71bd4f517cb13fd6bf4caa0f44848cecb41d6 Mon Sep 17 00:00:00 2001 From: vito Date: Mon, 8 Jan 2024 20:56:12 +0800 Subject: [PATCH 086/302] =?UTF-8?q?REPORT-99485=20=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=8F=8D=E7=99=BD=E5=9B=BE=E6=A0=87=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E5=8D=95=E5=B1=82=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/icon/AbstractIconSet.java | 11 +- .../com/fine/theme/icon/GraphicsFilter.java | 58 +++++++ .../java/com/fine/theme/icon/IconManager.java | 31 +++- .../java/com/fine/theme/icon/IconSet.java | 8 + .../java/com/fine/theme/icon/IconSource.java | 2 +- .../java/com/fine/theme/icon/LazyIcon.java | 14 +- .../java/com/fine/theme/icon/WhiteIcon.java | 22 +++ .../java/com/fine/theme/icon/svg/SvgIcon.java | 146 ++++++++---------- .../fine/theme/icon/svg/SvgIconSource.java | 6 + .../com/fine/theme/icon/svg/WhiteParser.java | 50 ++++++ .../light/ui/laf/FineLightLaf.properties | 2 +- .../components/ButtonStoryBoard.java | 13 +- .../storybook/components/IconStoryBoard.java | 60 +++++++ .../main/java/com/fr/start/MainDesigner.java | 7 +- 14 files changed, 334 insertions(+), 96 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/icon/GraphicsFilter.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/WhiteIcon.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/svg/WhiteParser.java create mode 100644 designer-base/src/test/java/com/fr/design/gui/storybook/components/IconStoryBoard.java diff --git a/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSet.java index f565077ffc..c207a99744 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSet.java @@ -46,7 +46,7 @@ public abstract class AbstractIconSet implements IconSet { @Override public void addIcon(@NotNull IconSource... icons) { - for (IconSource icon: icons){ + for (IconSource icon : icons) { map.put(icon.getId(), icon); } } @@ -64,6 +64,15 @@ public abstract class AbstractIconSet implements IconSet { return icon; } + @Override + public @Nullable Icon findWhiteIcon(@NotNull String id) { + IconSource iconSource = map.get(id); + if (iconSource != null) { + return iconSource.white(); + } + return null; + } + @Override public @Nullable Icon findDisableIcon(@NotNull String id) { Icon icon = disableCache.get(id); diff --git a/designer-base/src/main/java/com/fine/theme/icon/GraphicsFilter.java b/designer-base/src/main/java/com/fine/theme/icon/GraphicsFilter.java new file mode 100644 index 0000000000..63f86df5db --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/GraphicsFilter.java @@ -0,0 +1,58 @@ +package com.fine.theme.icon; + +import com.formdev.flatlaf.util.Graphics2DProxy; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Paint; +import java.awt.image.RGBImageFilter; + +/** + * 颜色过滤器画板 + * + * @author vito + * @since 11.0 + * Created on 2023/11/21 + */ +public class GraphicsFilter + extends Graphics2DProxy { + private final RGBImageFilter grayFilter; + + public GraphicsFilter(Graphics2D delegate, RGBImageFilter grayFilter) { + super(delegate); + this.grayFilter = grayFilter; + } + + @Override + public Graphics create() { + return new GraphicsFilter((Graphics2D) super.create(), grayFilter); + } + + @Override + public Graphics create(int x, int y, int width, int height) { + return new GraphicsFilter((Graphics2D) super.create(x, y, width, height), grayFilter); + } + + @Override + public void setColor(Color c) { + super.setColor(filterColor(c)); + } + + @Override + public void setPaint(Paint paint) { + if (paint instanceof Color) + paint = filterColor((Color) paint); + super.setPaint(paint); + } + + private Color filterColor(Color color) { + + if (grayFilter != null) { + int oldRGB = color.getRGB(); + int newRGB = grayFilter.filterRGB(0, 0, oldRGB); + color = (newRGB != oldRGB) ? new Color(newRGB, true) : color; + } + return color; + } +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconManager.java b/designer-base/src/main/java/com/fine/theme/icon/IconManager.java index 7800b4c1f9..5483ba7450 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/IconManager.java +++ b/designer-base/src/main/java/com/fine/theme/icon/IconManager.java @@ -25,8 +25,9 @@ public class IconManager { public static boolean initialized = false; public static ArrayList iconSets = new ArrayList<>(2); - public static HashMap> cache = new HashMap<>(60); - public static HashMap> disableCache = new HashMap<>(60); + public static HashMap> cache = new HashMap<>(64); + public static HashMap> disableCache = new HashMap<>(64); + public static HashMap> whiteCache = new HashMap<>(32); /** @@ -75,6 +76,32 @@ public class IconManager { return (I) icon; } + /** + * 获取灰化图标 + * + * @param id 图标ID + * @param 图标类型 + * @return 图标 + */ + @NotNull + public static I getWhiteIcon(String id) { + final WeakReference reference = whiteCache.get(id); + I icon = reference != null ? (I) reference.get() : null; + if (icon == null) { + for (IconSet set : iconSets) { + Icon f = set.findWhiteIcon(id); + if (f != null) { + icon = (I) f; + whiteCache.put(id, new WeakReference<>(icon)); + } + } + } + if (icon == null) { + throw new IconException("[IconManager] Can not find icon by id: " + id); + } + return icon; + } + /** * 获取灰化图标 * diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconSet.java b/designer-base/src/main/java/com/fine/theme/icon/IconSet.java index f5f92d6bab..0439243fa5 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/IconSet.java +++ b/designer-base/src/main/java/com/fine/theme/icon/IconSet.java @@ -51,6 +51,14 @@ public interface IconSet extends Identifiable { @Nullable Icon findIcon(@NotNull String id); + /** + * 返回指定 id 的 Icon。 + * + * @param id id + * @return Icon + */ + @Nullable + Icon findWhiteIcon(@NotNull String id); /** * 返回指定 id 的 Icon。 diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconSource.java b/designer-base/src/main/java/com/fine/theme/icon/IconSource.java index ed2d1c6b76..78de6e6584 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/IconSource.java +++ b/designer-base/src/main/java/com/fine/theme/icon/IconSource.java @@ -15,7 +15,7 @@ import java.io.Serializable; * Created on 2023/11/6 */ @Immutable -public interface IconSource extends Identifiable, DisabledIcon, Cloneable, Serializable { +public interface IconSource extends Identifiable, DisabledIcon, WhiteIcon, Cloneable, Serializable { /** * 获取图标资源 diff --git a/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java b/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java index aa77042fd4..f0e7fdcc5f 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java @@ -15,7 +15,7 @@ import java.awt.Graphics; * Created on 2023/11/6 */ @Immutable -public class LazyIcon implements Identifiable, DisabledIcon, Icon { +public class LazyIcon implements Identifiable, DisabledIcon, WhiteIcon, Icon { @NotNull private final String id; @@ -62,6 +62,18 @@ public class LazyIcon implements Identifiable, DisabledIcon, Icon { return IconManager.getDisableIcon(getId()); } + /** + * 创建一份白化图标 + * + * @return 白化图标 + */ + @NotNull + @Override + public Icon white() { + return IconManager.getWhiteIcon(getId()); + } + + @NotNull @Override public String toString() { diff --git a/designer-base/src/main/java/com/fine/theme/icon/WhiteIcon.java b/designer-base/src/main/java/com/fine/theme/icon/WhiteIcon.java new file mode 100644 index 0000000000..e7bdb9af8c --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/WhiteIcon.java @@ -0,0 +1,22 @@ +package com.fine.theme.icon; + +import org.jetbrains.annotations.NotNull; + +import javax.swing.Icon; + +/** + * 白化图像 + * + * @author vito + * @since 11.0 + * Created on 2024/1/8 + */ +public interface WhiteIcon { + /** + * 创建一份白化图标 + * + * @return 灰化图标 + */ + @NotNull + Icon white(); +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java index 385365d775..df5a52e787 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java @@ -1,29 +1,35 @@ package com.fine.theme.icon.svg; import com.fine.theme.icon.DisabledIcon; +import com.fine.theme.icon.GraphicsFilter; import com.fine.theme.icon.IconResource; +import com.fine.theme.icon.WhiteIcon; +import com.formdev.flatlaf.FlatLaf; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.GrayFilter; import com.fr.clone.cloning.Immutable; -import org.apache.batik.transcoder.TranscoderException; -import org.apache.batik.transcoder.TranscoderInput; +import com.fr.value.NullableLazyValue; +import com.github.weisj.jsvg.SVGDocument; +import com.github.weisj.jsvg.attributes.ViewBox; +import com.github.weisj.jsvg.parser.SVGLoader; import org.jetbrains.annotations.NotNull; import javax.swing.Icon; -import java.awt.Color; +import javax.swing.JComponent; +import javax.swing.UIManager; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; -import java.awt.image.BufferedImage; +import java.awt.image.RGBImageFilter; +import java.util.Objects; +import java.util.StringJoiner; import static com.fine.theme.utils.FineUIScale.scale; -import static com.fine.theme.utils.FineUIScale.unscale; -import static com.fine.theme.utils.FineUIUtils.RETINA_SCALE_FACTOR; -import static com.fine.theme.utils.FineUIUtils.getRetina; /** * svg图标 * 1.绘制长度会跟随DPI比率变化 - * 2.如果设备支持 Retina 则支持Retina绘制HIDPI图 * 1跟2的缩放原因不同,因此不能混淆,宽高测量等依旧 * 使用DPI缩放进行,只有绘制内容时使用Retina绘制(如果有) * Retina绘制不影响最终尺寸,注意区分 @@ -33,27 +39,32 @@ import static com.fine.theme.utils.FineUIUtils.getRetina; * Created on 2023/11/15 */ @Immutable -public class SvgIcon implements DisabledIcon, Icon { +public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { - protected transient BufferedImage cache; + public enum Type { + disable, white, origin + } private final Dimension size; private final IconResource resource; - private final boolean disable; + private final Type type; + + private final NullableLazyValue svgDocument = NullableLazyValue.createValue(() -> load(Type.origin)); + private final NullableLazyValue whiteSvgDocument = NullableLazyValue.createValue(() -> load(Type.white)); public SvgIcon(IconResource resource, Dimension size) { - this(resource, size, false); + this(resource, size, Type.origin); } - public SvgIcon(IconResource resource, Dimension size, boolean disable) { + public SvgIcon(IconResource resource, Dimension size, Type type) { this.resource = resource; // 根据dpi进行缩放 this.size = scale(size); - this.disable = disable; + this.type = type; } public SvgIcon(IconResource resource, int side) { - this(resource, new Dimension(side, side), false); + this(resource, new Dimension(side, side), Type.origin); } /** @@ -62,46 +73,21 @@ public class SvgIcon implements DisabledIcon, Icon { */ @Override public void paintIcon(Component c, Graphics g, int x, int y) { - if (isCacheValid()) { - if (cache != null) { - cache.flush(); - } - Dimension scale = scaleRetina(size); - if (disable && c != null) { - cache = toGrayImage(scale, c.getBackground()); - } else { - cache = toImage(scale); - } - } - if (getRetina()) { - // 高清绘制的原理:scale(1/2,1/2)的原理是坐标减半,底层是矩阵进行坐标变换,意思是坐标减半进行绘制, - // 这样就可以将两倍图绘制到一倍的大小,如果这时候设备支持Retina绘制(四个像素模拟一个像素), - // 正好就可以将4个像素利用起来,每个像素点都有不同的颜色,而不像之前只能是四个共用一个颜色。因此图像 - // 可以更加细腻当然,绘图之后,需要将这个坐标变换给恢复。 - ((Graphics2D) g).scale(1.0 / RETINA_SCALE_FACTOR, 1.0 / RETINA_SCALE_FACTOR); - g.drawImage(cache, x * RETINA_SCALE_FACTOR, y * RETINA_SCALE_FACTOR, null); - ((Graphics2D) g).scale(RETINA_SCALE_FACTOR, RETINA_SCALE_FACTOR); - } else { - g.drawImage(cache, x, y, null); + if (type == Type.disable) { + g = GrayGraphics(g); } + Object[] oldRenderingHints = FlatUIUtils.setRenderingHints(g); + render(c, g, x, y); + FlatUIUtils.resetRenderingHints(g, oldRenderingHints); } - private boolean isCacheValid() { - return cache == null - || cache.getWidth() != scaleRetina(size.width) - || cache.getHeight() != scaleRetina(size.height); - } + public Graphics2D GrayGraphics(Graphics g) { + Object grayFilterObj = UIManager.get("Component.grayFilter"); + RGBImageFilter grayFilter = (grayFilterObj instanceof RGBImageFilter) + ? (RGBImageFilter) grayFilterObj + : GrayFilter.createDisabledIconFilter(FlatLaf.isLafDark()); - private static int scaleRetina(int size) { - return getRetina() - ? size * RETINA_SCALE_FACTOR - : size; - } - - private static Dimension scaleRetina(Dimension dimension) { - return getRetina() - ? new Dimension(dimension.width * RETINA_SCALE_FACTOR, dimension.height * RETINA_SCALE_FACTOR) - : dimension; + return new GraphicsFilter((Graphics2D) g.create(), grayFilter); } @Override @@ -114,44 +100,48 @@ public class SvgIcon implements DisabledIcon, Icon { return size.height; } - /** - * 根据指定尺寸绘制图片,这里尺寸为结算后的尺寸, - * 因此不必进行缩放 - * - * @param size 图像尺寸 - * @return 图像 - */ - private BufferedImage toImage(Dimension size) { - SvgTranscoder transcoder = new SvgTranscoder(size); - TranscoderInput transcoderInput = new TranscoderInput(resource.getInputStream()); - try { - transcoder.transcode(transcoderInput, null); - return transcoder.getImage(); - } catch (TranscoderException e) { - throw new RuntimeException(e); + private void render(Component c, Graphics g, int x, int y) { + if (type == Type.white) { + Objects.requireNonNull(whiteSvgDocument.getValue()) + .render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, size.width, size.height)); + } else { + Objects.requireNonNull(svgDocument.getValue()) + .render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, size.width, size.height)); } } + + private SVGDocument load(Type type) { + SVGLoader loader = new SVGLoader(); + return type == Type.white + ? loader.load(resource.getInputStream(), new WhiteParser()) + : loader.load(resource.getInputStream()); + } + + + @Override + public String toString() { + return new StringJoiner(", ", SvgIcon.class.getSimpleName() + "[", "]") + .add("resource=" + resource) + .add("type=" + type) + .add("size=" + size) + .toString(); + } + /** - * 简单的灰化处理,不能有透明度,因此需要传入背景, - * 暂时用作灰度,后面再处理 + * 默认提供一个简单的灰化处理 */ - private BufferedImage toGrayImage(Dimension size, Color background) { - SvgTranscoder transcoder = new SvgTranscoder(size, background, true); - TranscoderInput transcoderInput = new TranscoderInput(resource.getInputStream()); - try { - transcoder.transcode(transcoderInput, null); - return transcoder.getImage(); - } catch (TranscoderException e) { - throw new RuntimeException(e); - } + @Override + public @NotNull SvgIcon white() { + return new SvgIcon(resource, size, Type.white); } + /** * 默认提供一个简单的灰化处理 */ @Override public @NotNull SvgIcon disabled() { - return new SvgIcon(resource, size, true); + return new SvgIcon(resource, size, Type.disable); } } diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIconSource.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIconSource.java index c7870a1037..e77a219b1f 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIconSource.java +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIconSource.java @@ -7,6 +7,7 @@ import com.fr.clone.cloning.Immutable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.swing.Icon; import java.awt.Dimension; /** @@ -71,4 +72,9 @@ public class SvgIconSource extends AbstractIconSource { public @NotNull SvgIcon loadDisableIcon() { return new SvgIcon(resource, size).disabled(); } + + @Override + public @NotNull Icon white() { + return new SvgIcon(resource, size).white(); + } } diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/WhiteParser.java b/designer-base/src/main/java/com/fine/theme/icon/svg/WhiteParser.java new file mode 100644 index 0000000000..1db3c987dc --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/WhiteParser.java @@ -0,0 +1,50 @@ +package com.fine.theme.icon.svg; + +import com.github.weisj.jsvg.attributes.paint.AwtSVGPaint; +import com.github.weisj.jsvg.attributes.paint.PaintParser; +import com.github.weisj.jsvg.attributes.paint.SVGPaint; +import com.github.weisj.jsvg.parser.AttributeNode; +import com.github.weisj.jsvg.parser.DefaultParserProvider; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.awt.Color; + +/** + * svg绘制白化转化器 + * + * @author vito + * @since 11.0 + * Created on 2024/1/8 + */ +public class WhiteParser extends DefaultParserProvider { + @Override + public @NotNull PaintParser createPaintParser() { + return new WhitePaintParser(super.createPaintParser()); + } + + + static class WhitePaintParser implements PaintParser { + + private final PaintParser delegate; + + WhitePaintParser(PaintParser delegate) { + this.delegate = delegate; + } + + @Override + public @Nullable Color parseColor(@NotNull String value, @NotNull AttributeNode attributeNode) { + return delegate.parseColor(value, attributeNode); + } + + @Override + public @Nullable SVGPaint parsePaint(@Nullable String value, @NotNull AttributeNode attributeNode) { + SVGPaint paint = delegate.parsePaint(value, attributeNode); + if (!(paint instanceof AwtSVGPaint)) { + return paint; + } + return new AwtSVGPaint(Color.WHITE); + } + } +} + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index e492ad27db..8f204787a6 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -224,7 +224,7 @@ CombinationButton.arc = $Button.arc #---- CheckBox ---- CheckBox.border = com.formdev.flatlaf.ui.FlatMarginBorder -CheckBox.icon = com.fine.theme.icon.AnimatedSwitchIcon +CheckBox.icon = com.formdev.flatlaf.icons.FlatCheckBoxIcon CheckBox.arc = 4 CheckBox.margin = 2,2,2,2 CheckBox.iconTextGap = 4 diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java index 45d02df6cc..67c369518a 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java @@ -43,7 +43,7 @@ public class ButtonStoryBoard extends StoryBoard { cell(new UILabel("正常")), cell(new UIButton("按钮")) .with(it -> setStyle(it, STYLE_PRIMARY)), - cell(new UIButton("按钮", new LazyIcon("add"))) + cell(new UIButton("按钮", new LazyIcon("add").white())) .with(it -> setStyle(it, STYLE_PRIMARY)), cell(new UIButton(new LazyIcon("multi"))) .with(it -> setStyle(it, STYLE_PRIMARY)) @@ -54,7 +54,7 @@ public class ButtonStoryBoard extends StoryBoard { setStyle(it, STYLE_PRIMARY); it.setEnabled(false); }), - cell(new UIButton("保存", new LazyIcon("save"))).with(it -> { + cell(new UIButton("保存", new LazyIcon("save").white())).with(it -> { setStyle(it, STYLE_PRIMARY); it.setEnabled(false); }), @@ -68,7 +68,7 @@ public class ButtonStoryBoard extends StoryBoard { cell(new UILabel("正常")), cell(new UIButton("按钮")) .with(it -> setStyle(it, joinStyle(STYLE_PRIMARY, STYLE_SIZE_SMALL))), - cell(new UIButton("按钮", new LazyIcon("add"))) + cell(new UIButton("按钮", new LazyIcon("add").white())) .with(it -> setStyle(it, joinStyle(STYLE_PRIMARY, STYLE_SIZE_SMALL))), cell(new UIButton(new LazyIcon("multi"))) .with(it -> setStyle(it, joinStyle(STYLE_PRIMARY, STYLE_SIZE_SMALL))) @@ -145,12 +145,7 @@ public class ButtonStoryBoard extends StoryBoard { cell(new JButton(new LazyIcon("add"))).with(it -> it.setEnabled(false)) ), row(20, - cell(new UICombinationButton("按钮", new LazyIcon("triangle_down"))) - .with(it -> { - setStyle(it, STYLE_PRIMARY); -// it.setExtraPainted(false); - }), - cell(new UICombinationButton("按钮", new LazyIcon("triangle_down"))) + cell(new UICombinationButton("按钮", new LazyIcon("triangle_down").white())) .with(it -> setStyle(it, STYLE_PRIMARY)), cell(new UICombinationButton("按钮2", new LazyIcon("triangle_down"))), cell(new JButton("按钮", new LazyIcon("add"))), diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/IconStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/IconStoryBoard.java new file mode 100644 index 0000000000..aefcb16d5a --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/IconStoryBoard.java @@ -0,0 +1,60 @@ +package com.fr.design.gui.storybook.components; + +import com.fine.theme.icon.LazyIcon; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.storybook.Story; +import com.fr.design.gui.storybook.StoryBoard; + +import javax.swing.JLabel; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + +/** + * @author vito + * @since 11.0 + * Created on 2024/1/8 + */ +@Story +public class IconStoryBoard extends StoryBoard { + public IconStoryBoard() { + super("图标"); + add( + cell(new UILabel("普通图标")).with(this::h3), + row(10, + cell(new JLabel(new LazyIcon("cut"))), + cell(new JLabel(new LazyIcon("save"))), + cell(new JLabel(new LazyIcon("copy"))), + cell(new JLabel(new LazyIcon("formatBrush"))), + cell(new JLabel(new LazyIcon("paste"))), + cell(new JLabel(new LazyIcon("undo"))), + cell(new JLabel(new LazyIcon("redo"))) + ), + fix(5), + cell(new UILabel("禁用图标")).with(this::h3), + row(10, + cell(new JLabel(new LazyIcon("cut").disabled())), + cell(new JLabel(new LazyIcon("save").disabled())), + cell(new JLabel(new LazyIcon("copy").disabled())), + cell(new JLabel(new LazyIcon("formatBrush").disabled())), + cell(new JLabel(new LazyIcon("paste").disabled())), + cell(new JLabel(new LazyIcon("undo").disabled())), + cell(new JLabel(new LazyIcon("redo").disabled())) + ), + fix(5), + cell(new UILabel("白化图标")).with(this::h3), + row(10, + cell(new JLabel(new LazyIcon("cut").white())), + cell(new JLabel(new LazyIcon("save").white())), + cell(new JLabel(new LazyIcon("copy").white())), + cell(new JLabel(new LazyIcon("formatBrush").white())), + cell(new JLabel(new LazyIcon("paste").white())), + cell(new JLabel(new LazyIcon("undo").white())), + cell(new JLabel(new LazyIcon("redo").white())) + ), + flex() + ); + } +} diff --git a/designer-realize/src/main/java/com/fr/start/MainDesigner.java b/designer-realize/src/main/java/com/fr/start/MainDesigner.java index e054956ea8..91c5d8e542 100644 --- a/designer-realize/src/main/java/com/fr/start/MainDesigner.java +++ b/designer-realize/src/main/java/com/fr/start/MainDesigner.java @@ -25,6 +25,7 @@ import com.fr.design.gui.ibutton.UICombinationButton; import com.fr.design.gui.ibutton.UISaveForbiddenButton; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIPopupMenu; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.ActiveKeyGenerator; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.InformationCollector; @@ -336,8 +337,8 @@ public class MainDesigner extends BaseDesigner { } private UICombinationButton createRunButton() { - run = new UICombinationButton(new UISaveForbiddenButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview"), new LazyIcon("add")), - new UISaveForbiddenButton(new LazyIcon("triangle_down"))); + run = new UICombinationButton(new UISaveForbiddenButton(Toolkit.i18nText("Fine-Design_Basic_Preview"), new LazyIcon("add").white()), + new UISaveForbiddenButton(new LazyIcon("triangle_down").white())); run.addLeftClickLister(mouseEvent -> { JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); if (jt == null || jt.isSaving()) { @@ -382,7 +383,7 @@ public class MainDesigner extends BaseDesigner { redo.setEnabled(false); } -// run.getLeftButton().setIcon(jt.getPreviewLargeIcon()); + run.getLeftButton().setText(jt.getPreviewType().nameForPopupItem()); } From 0c9c0b11e940ccf60fb1d257977384d8ca79b21f Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Mon, 8 Jan 2024 20:56:16 +0800 Subject: [PATCH 087/302] =?UTF-8?q?REPORT-107973=20=E7=BF=BB=E6=96=B0?= =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E6=96=87=E8=8F=9C=E5=8D=95=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineMenuItemUI.java | 50 +++++++++ .../com/fine/theme/light/ui/FineMenuUI.java | 49 +++++++++ .../light/ui/FinePopupMenuSeparatorUI.java | 70 ++++++++++++ .../fine/theme/light/ui/FinePopupMenuUI.java | 9 +- .../theme/utils/FineClientProperties.java | 6 ++ .../data/datapane/TableDataTreePane.java | 1 - .../fr/design/gui/imenu/UILockMenuItem.java | 3 +- .../com/fr/design/gui/imenu/UIMenuItem.java | 2 +- .../com/fr/design/menu/DottedSeparator.java | 28 ++--- .../com/fr/design/menu/LineSeparator.java | 24 ----- .../main/java/com/fr/design/menu/MenuDef.java | 38 ++++++- .../com/fr/design/menu/NameSeparator.java | 13 +-- .../fr/design/menu/SnapChatUpdateAction.java | 1 - .../theme/light/ui/laf/FineLaf.properties | 6 +- .../light/ui/laf/FineLightLaf.properties | 36 +++++-- .../components/PopupMenuStoryBoard.java | 102 ++++++++++++++++++ .../com/fr/grid/selection/CellSelection.java | 2 - .../java/com/fr/grid/selection/Selection.java | 5 + 18 files changed, 375 insertions(+), 70 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineMenuItemUI.java create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineMenuUI.java create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FinePopupMenuSeparatorUI.java create mode 100644 designer-base/src/test/java/com/fr/design/gui/storybook/components/PopupMenuStoryBoard.java diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuItemUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuItemUI.java new file mode 100644 index 0000000000..e5b28b382b --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuItemUI.java @@ -0,0 +1,50 @@ +package com.fine.theme.light.ui; + +import com.fine.theme.utils.FineClientProperties; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatMenuItemUI; +import com.fr.design.editlock.EditLockUtils; + +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; +import java.awt.Graphics; + +/** + * menuItem UI类 + * + * @author Leo.Qin + * @since 11.0 + * Created on 2024/1/8 + */ +public class FineMenuItemUI extends FlatMenuItemUI { + int iconSize = 16; + int rightMargin = 10; + + /** + * 创建UI + * + * @param c + * @return + */ + public static ComponentUI createUI(JComponent c) { + return new FineMenuItemUI(); + } + + @Override + public void paint(Graphics g, JComponent c) { + Object clientProperty = c.getClientProperty(FineClientProperties.POPUP_MENU_TYPE); + if (FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR.equals(clientProperty)) { + selectionBackground = FineUIUtils.getUIColor("Menu.toolbar.selectionBackground", "Menu.selectionBackground"); + selectionForeground = FineUIUtils.getUIColor("Menu.toolbar.selectionForeground", "Menu.selectionForeground"); + acceleratorForeground = FineUIUtils.getUIColor("Menu.toolbar.acceleratorForeground", "Menu.acceleratorForeground"); + acceleratorSelectionForeground = FineUIUtils.getUIColor("Menu.toolbar.acceleratorSelectionForeground", "Menu.acceleratorSelectionForeground"); + } + + super.paint(g, c); + + Object itemType = c.getClientProperty(FineClientProperties.MENU_ITEM_TYPE); + if (FineClientProperties.MENU_ITEM_TYPE_LOCK.equals(itemType)) { + g.drawImage(EditLockUtils.LOCKED_IMAGE, c.getWidth() - rightMargin - iconSize, (c.getHeight() - iconSize) / 2, iconSize, iconSize, null); + } + } +} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuUI.java new file mode 100644 index 0000000000..fafe6f78ae --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuUI.java @@ -0,0 +1,49 @@ +package com.fine.theme.light.ui; + +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineClientProperties; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatMenuUI; + +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; +import java.awt.Graphics; + +/** + * 弹窗菜单UI + * + * @author Leo.Qin + * @since 11.0 + * Created on 2024/1/8 + */ +public class FineMenuUI extends FlatMenuUI { + + + /** + * 创建UI + * + * @param c + * @return + */ + public static ComponentUI createUI(JComponent c) { + return new FineMenuUI(); + } + + @Override + protected void installDefaults() { + arrowIcon = new LazyIcon("triangle_right"); + super.installDefaults(); + } + + @Override + public void paint(Graphics g, JComponent c) { + Object clientProperty = c.getClientProperty(FineClientProperties.POPUP_MENU_TYPE); + if (FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR.equals(clientProperty)) { + selectionBackground = FineUIUtils.getUIColor("MenuItem.toolbar.selectionBackground", "MenuItem.selectionBackground"); + selectionForeground = FineUIUtils.getUIColor("MenuItem.toolbar.selectionForeground", "MenuItem.selectionForeground"); + acceleratorForeground = FineUIUtils.getUIColor("MenuItem.toolbar.acceleratorForeground", "MenuItem.acceleratorForeground"); + acceleratorSelectionForeground = FineUIUtils.getUIColor("MenuItem.toolbar.acceleratorSelectionForeground", "MenuItem.acceleratorSelectionForeground"); + } + super.paint(g, c); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FinePopupMenuSeparatorUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FinePopupMenuSeparatorUI.java new file mode 100644 index 0000000000..f5708005d6 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FinePopupMenuSeparatorUI.java @@ -0,0 +1,70 @@ +package com.fine.theme.light.ui; + +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatPopupMenuSeparatorUI; +import com.formdev.flatlaf.ui.FlatUIUtils; + +import javax.swing.JComponent; +import javax.swing.JSeparator; +import javax.swing.plaf.ComponentUI; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; +import java.awt.geom.Rectangle2D; + +import static com.formdev.flatlaf.util.UIScale.scale; + +/** + * popup弹窗分割线UI + * + * @author Leo.Qin + * @since 11.0 + * Created on 2024/1/8 + */ +public class FinePopupMenuSeparatorUI extends FlatPopupMenuSeparatorUI { + protected Insets insets; + + /** + * @param shared + * @since 2 + */ + protected FinePopupMenuSeparatorUI(boolean shared) { + super(shared); + } + + /** + * 创建UI类 + * + * @param c + * @return + */ + public static ComponentUI createUI(JComponent c) { + return new FinePopupMenuSeparatorUI(false); + } + + @Override + protected void installDefaults(JSeparator s) { + super.installDefaults(s); + insets = FineUIUtils.getAndScaleUIInsets("PopupMenuSeparator.Insets", new Insets(0, 10, 0, 10)); + } + + @Override + public void paint(Graphics g, JComponent c) { + Graphics2D g2 = (Graphics2D) g.create(); + try { + FlatUIUtils.setRenderingHints(g2); + g2.setColor(c.getForeground()); + + float width = scale((float) stripeWidth); + float indent = scale((float) stripeIndent); + + if (((JSeparator) c).getOrientation() == JSeparator.VERTICAL) { + g2.fill(new Rectangle2D.Float(indent, insets.left, width - (insets.left + insets.right), c.getHeight())); + } else { + g2.fill(new Rectangle2D.Float(insets.left, indent, c.getWidth() - (insets.left + insets.right), width)); + } + } finally { + g2.dispose(); + } + } +} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FinePopupMenuUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FinePopupMenuUI.java index 402734a77a..3a21e2cc44 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FinePopupMenuUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FinePopupMenuUI.java @@ -1,5 +1,6 @@ package com.fine.theme.light.ui; +import com.fine.theme.utils.FineClientProperties; import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.ui.FlatPopupMenuUI; @@ -19,7 +20,7 @@ import java.awt.geom.RoundRectangle2D; */ public class FinePopupMenuUI extends FlatPopupMenuUI { private int arc; - private final int DEFAULT_ARC = 5; + private final int DEFAULT_ARC = 10; /** * 创建UI @@ -39,6 +40,12 @@ public class FinePopupMenuUI extends FlatPopupMenuUI { @Override public void paint(Graphics g, JComponent c) { + + Object clientProperty = c.getClientProperty(FineClientProperties.POPUP_MENU_TYPE); + if (clientProperty != null && clientProperty.equals(FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR)) { + c.setBackground(FineUIUtils.getUIColor("PopupMenu.toolbar.background", "PopupMenu.background")); + } + // 绘制圆角矩形作为弹窗背景 Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java b/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java index aa50ebae8c..6d3ead4677 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java @@ -17,6 +17,12 @@ public interface FineClientProperties extends FlatClientProperties { String BUTTON_TYPE_LEFT_ROUND_RECT = "leftRoundRect"; String BUTTON_TYPE_RIGHT_ROUND_RECT = "rightRoundRect"; + //--------------------------- PopupMenu ----------------------- + String POPUP_MENU_TYPE = "popupMenuType"; + String MENU_ITEM_TYPE = "MenuItemType"; + String POPUP_MENU_TYPE_TOOL_BAR = "toolBar"; + String MENU_ITEM_TYPE_LOCK = "lock"; + String BUTTON_GROUP_POSITION = "group_position"; int GROUP_BUTTON_POSITION_INNER = 0; diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index 2f385d8a47..faf4de9e34 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -182,7 +182,6 @@ public class TableDataTreePane extends BasicTableDataTreePane { popupMenu.add(copyAction.createMenuItem()); popupMenu.add(pasteAction.createMenuItem()); popupMenu.add(removeAction.createMenuItem()); - popupMenu.addSeparator(); // 监听 tableDataTree.addMouseListener(new MouseAdapter() { @Override diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UILockMenuItem.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UILockMenuItem.java index c609e5d5c7..4127b3eec8 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UILockMenuItem.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UILockMenuItem.java @@ -1,5 +1,6 @@ package com.fr.design.gui.imenu; +import com.fine.theme.utils.FineClientProperties; import com.fr.design.editlock.EditLockChangeEvent; import com.fr.design.editlock.EditLockChangeListener; import com.fr.report.LockItem; @@ -32,7 +33,7 @@ public class UILockMenuItem extends UIMenuItem implements EditLockChangeListener this.lockedTooltips = lockedTooltips; this.normalTooltips = normalTooltips; this.lockItem = lockItem; - setUI(new UILockMenuItemUI()); + this.putClientProperty(FineClientProperties.MENU_ITEM_TYPE, FineClientProperties.MENU_ITEM_TYPE_LOCK); } public LockItem getLockItem() { diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuItem.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuItem.java index 3d7a0b85ba..337799dca3 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuItem.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIMenuItem.java @@ -8,7 +8,7 @@ import javax.swing.JMenuItem; public class UIMenuItem extends JMenuItem{ public UIMenuItem() { - this(StringUtils.BLANK); + this(StringUtils.EMPTY); } public UIMenuItem(String string) { diff --git a/designer-base/src/main/java/com/fr/design/menu/DottedSeparator.java b/designer-base/src/main/java/com/fr/design/menu/DottedSeparator.java index 7d1ec7b261..65dd153b6e 100644 --- a/designer-base/src/main/java/com/fr/design/menu/DottedSeparator.java +++ b/designer-base/src/main/java/com/fr/design/menu/DottedSeparator.java @@ -1,12 +1,15 @@ package com.fr.design.menu; +import com.fine.theme.utils.FineUIUtils; import com.fr.design.actions.UpdateAction; import com.fr.design.gui.imenu.UIMenuItem; +import javax.swing.UIManager; import java.awt.BasicStroke; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.Insets; import java.awt.Stroke; import java.awt.event.ActionEvent; @@ -42,31 +45,32 @@ public class DottedSeparator extends UpdateAction { } private class MenuItem extends UIMenuItem { + + + private final Insets insets; + private final int height; + public MenuItem() { - this.setUI(null); + this.setEnabled(false); this.removeAll(); + insets = FineUIUtils.getAndScaleUIInsets("PopupMenuSeparator.Insets", new Insets(0, 10, 0, 10)); + height = FineUIUtils.getAndScaleInt("PopupMenuSeparator.height", 5); } public void paint(Graphics g) { int w = this.getWidth(); int h = this.getHeight(); Graphics2D g2d = (Graphics2D)g; - g2d.setColor(getBackground()); - g2d.fillRect(0, 0, w, h); - g2d.setColor(getForeground()); + g2d.setColor(UIManager.getColor("Separator.background")); + Stroke bs = new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 2f, new float[] { 3, 1 }, 0); g2d.setStroke(bs); - g2d.drawLine(30, h / 2+1, w-4, h / 2+1); - this.setForeground(getForeground()); - super.paint(g); - } - - public Dimension getSize() { - return new Dimension(super.getSize().width, 8); + g2d.drawLine(insets.left, h / 2 + 1, w - insets.right, h / 2 + 1); } + @Override public Dimension getPreferredSize() { - return new Dimension(super.getPreferredSize().width, 8); + return new Dimension(super.getPreferredSize().width, height); } } diff --git a/designer-base/src/main/java/com/fr/design/menu/LineSeparator.java b/designer-base/src/main/java/com/fr/design/menu/LineSeparator.java index 1419d31d88..bfba89052a 100644 --- a/designer-base/src/main/java/com/fr/design/menu/LineSeparator.java +++ b/designer-base/src/main/java/com/fr/design/menu/LineSeparator.java @@ -4,9 +4,6 @@ import com.fr.design.actions.UpdateAction; import com.fr.design.gui.imenu.UIMenuItem; import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; import java.awt.event.ActionEvent; /** @@ -47,28 +44,7 @@ public class LineSeparator extends UpdateAction{ private class MenuItem extends UIMenuItem { public MenuItem() { - this.setUI(null); this.removeAll(); } - - public void paint(Graphics g) { - int w = this.getWidth(); - int h = this.getHeight(); - Graphics2D g2d = (Graphics2D)g; - g2d.setColor(getBackground()); - g2d.fillRect(0, 0, w, h); - g2d.setColor(getForeground()); - g2d.drawLine(4, h / 2+1, w-4, h / 2+1); -// this.setForeground(color); - super.paint(g); - } - - public Dimension getSize() { - return new Dimension(super.getSize().width, 8); - } - - public Dimension getPreferredSize() { - return new Dimension(super.getPreferredSize().width, 8); - } } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java index c46adb7997..17a0548561 100644 --- a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java +++ b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java @@ -1,6 +1,7 @@ package com.fr.design.menu; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineClientProperties; import com.fr.base.svg.IconUtils; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.ibutton.UIButton; @@ -17,8 +18,10 @@ import com.fr.stable.StringUtils; import javax.swing.Icon; import javax.swing.JMenu; +import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JToolBar; +import javax.swing.MenuElement; import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; import java.awt.Component; @@ -311,7 +314,13 @@ public class MenuDef extends ShortCut { */ public void updateMenu() { //peter:这个方法用来产生JMenu的孩子控件,但是不update,action. - this.updatePopupMenu(this.createJMenu().getPopupMenu()); + UIMenu jMenu = this.createJMenu(); + JPopupMenu jPopupMenu = jMenu.getPopupMenu(); + this.updatePopupMenu(jPopupMenu); + + if (jMenu instanceof UIHeadMenu) { + setToolBarClientProperty(jPopupMenu); + } //peter:需要设置JMenu的enabled属性. if (createdJMenu != null) { @@ -320,6 +329,26 @@ public class MenuDef extends ShortCut { } } + private void setToolBarClientProperty(JPopupMenu jPopupMenu) { + jPopupMenu.putClientProperty(FineClientProperties.POPUP_MENU_TYPE, FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR); + + MenuElement[] subElements = jPopupMenu.getSubElements(); + for (MenuElement subElement : subElements) { + if (subElement instanceof JMenu) { + JMenu jMenu = (JMenu) subElement; + jMenu.putClientProperty(FineClientProperties.POPUP_MENU_TYPE, FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR); + JPopupMenu childPopupMenu = jMenu.getPopupMenu(); + setToolBarClientProperty(childPopupMenu); + } else if (subElement instanceof JMenuItem) { + JMenuItem jMenuItem = (JMenuItem) subElement; + jMenuItem.putClientProperty(FineClientProperties.POPUP_MENU_TYPE, FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR); + } + } + } + + + + public void updateEnable() { setEnabled(checkEnable()); } @@ -350,8 +379,11 @@ public class MenuDef extends ShortCut { } nec_seperator = false; } - - shortcut.intoJPopupMenu(popupMenu); + if (shortcut instanceof LineSeparator) { + popupMenu.addSeparator(); + } else { + shortcut.intoJPopupMenu(popupMenu); + } isFirstItem = false; } diff --git a/designer-base/src/main/java/com/fr/design/menu/NameSeparator.java b/designer-base/src/main/java/com/fr/design/menu/NameSeparator.java index b22184eb8f..f5a0a1a756 100644 --- a/designer-base/src/main/java/com/fr/design/menu/NameSeparator.java +++ b/designer-base/src/main/java/com/fr/design/menu/NameSeparator.java @@ -5,6 +5,7 @@ import com.fr.design.actions.UpdateAction; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.imenu.UIMenuItem; +import javax.swing.UIManager; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FontMetrics; @@ -44,21 +45,12 @@ public class NameSeparator extends UpdateAction { private class MenuItem extends UIMenuItem { public MenuItem(String text) { - this.setUI(null); + this.setEnabled(false); this.removeAll(); this.setLayout(new BorderLayout()); this.add(new CustomerLable(text, UILabel.LEFT), BorderLayout.CENTER); } - public void paint(Graphics g) { - int w = this.getWidth(); - int h = this.getHeight(); - Graphics2D g2d = (Graphics2D)g; - g2d.setColor(getBackground()); - g2d.fillRect(0, 0, w, h); - super.paint(g); - } - public Dimension getSize() { return new Dimension(super.getSize().width, 20); } @@ -85,6 +77,7 @@ public class NameSeparator extends UpdateAction { for (int i = 0; i < str.length(); i++) { strwidth = strwidth + fm.charWidth(str.charAt(i)); } + g2d.setColor(UIManager.getColor("Separator.background")); g2d.drawLine(strwidth + 4, h / 2+2, w, h / 2+2); super.paint(g); } diff --git a/designer-base/src/main/java/com/fr/design/menu/SnapChatUpdateAction.java b/designer-base/src/main/java/com/fr/design/menu/SnapChatUpdateAction.java index 8cc0734371..d35972989c 100644 --- a/designer-base/src/main/java/com/fr/design/menu/SnapChatUpdateAction.java +++ b/designer-base/src/main/java/com/fr/design/menu/SnapChatUpdateAction.java @@ -57,7 +57,6 @@ public abstract class SnapChatUpdateAction extends UpdateAction implements SnapC UIMenuItem menuItem = new UIMenuItem(this); // 设置名字用作单元测 menuItem.setName(getName()); - menuItem.setUI(new SnapChatMenuItemUI(this)); object = menuItem; this.putValue(UIMenuItem.class.getName(), object); diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties index 55596987fe..8985e99dd0 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties @@ -13,14 +13,14 @@ FormattedTextFieldUI=com.formdev.flatlaf.ui.FlatFormattedTextFieldUI InternalFrameUI=com.formdev.flatlaf.ui.FlatInternalFrameUI LabelUI=com.formdev.flatlaf.ui.FlatLabelUI ListUI=com.formdev.flatlaf.ui.FlatListUI -MenuUI=com.formdev.flatlaf.ui.FlatMenuUI +MenuUI=com.fine.theme.light.ui.FineMenuUI MenuBarUI=com.formdev.flatlaf.ui.FlatMenuBarUI -MenuItemUI=com.formdev.flatlaf.ui.FlatMenuItemUI +MenuItemUI=com.fine.theme.light.ui.FineMenuItemUI OptionPaneUI=com.formdev.flatlaf.ui.FlatOptionPaneUI PanelUI=com.formdev.flatlaf.ui.FlatPanelUI PasswordFieldUI=com.formdev.flatlaf.ui.FlatPasswordFieldUI PopupMenuUI=com.fine.theme.light.ui.FinePopupMenuUI -PopupMenuSeparatorUI=com.formdev.flatlaf.ui.FlatPopupMenuSeparatorUI +PopupMenuSeparatorUI=com.fine.theme.light.ui.FinePopupMenuSeparatorUI ProgressBarUI=com.formdev.flatlaf.ui.FlatProgressBarUI RadioButtonUI=com.formdev.flatlaf.ui.FlatRadioButtonUI RadioButtonMenuItemUI=com.formdev.flatlaf.ui.FlatRadioButtonMenuItemUI diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index e492ad27db..cf3bebf167 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -135,6 +135,7 @@ text.highlight=fade(@foreground, 90%) fill.hover=#E6E9EF fill.click=#DADEE7 fill.normal=#FFFFFF +fill.gray=#F2F4F8 fill.disabled=#F2F4F8 border.divider=#DADEE7 tooltip.normal=#3F506A @@ -447,13 +448,17 @@ Menu.icon.disabledArrowColor = @buttonDisabledArrowColor Menu.border = com.formdev.flatlaf.ui.FlatMenuItemBorder Menu.arrowIcon = com.formdev.flatlaf.icons.FlatMenuArrowIcon Menu.checkIcon = null -Menu.margin = @menuItemMargin +Menu.margin=3,10,3,10 Menu.submenuPopupOffsetX = {scaledInteger}-4 Menu.submenuPopupOffsetY = {scaledInteger}-4 Menu.opaque = false Menu.borderPainted = true Menu.background = @menuBackground - +Menu.selectionBackground=$fill.hover +Menu.toolbar.selectionBackground=$brand.normal +Menu.toolbar.selectionForeground=$text.white +Menu.toolbar.acceleratorForeground=@foreground +Menu.toolbar.acceleratorSelectionForeground=$text.white #---- MenuBar ---- @@ -471,25 +476,31 @@ MenuBar.selectionArc = $MenuItem.selectionArc MenuItem.border = com.formdev.flatlaf.ui.FlatMenuItemBorder MenuItem.arrowIcon = com.formdev.flatlaf.icons.FlatMenuItemArrowIcon MenuItem.checkIcon = null -MenuItem.margin=0,10,0,10 +MenuItem.margin=3,10,3,10 MenuItem.opaque = false MenuItem.borderPainted = true MenuItem.verticallyAlignText = true MenuItem.background = @menuBackground MenuItem.checkBackground = @menuCheckBackground MenuItem.checkMargins = 2,2,2,2 -MenuItem.minimumWidth = 72 +MenuItem.minimumWidth=150 MenuItem.minimumIconSize = 16,16 MenuItem.iconTextGap = 6 MenuItem.textAcceleratorGap = 24 MenuItem.textNoAcceleratorGap = 6 MenuItem.acceleratorArrowGap=4 MenuItem.acceleratorDelimiter = "+" +MenuItem.acceleratorForeground=@foreground +MenuItem.acceleratorSelectionForeground=@foreground +MenuItem.toolbar.acceleratorForeground=@foreground +MenuItem.toolbar.acceleratorSelectionForeground=$text.white [mac]MenuItem.acceleratorDelimiter = "" -MenuItem.selectionInsets = 0,0,0,0 -MenuItem.selectionArc = 0 -MenuItem.selectionBackground=$brand.normal -MenuItem.selectionForeground=$text.white +MenuItem.selectionInsets=0,4,0,4 +MenuItem.selectionArc=4 +MenuItem.selectionBackground=$fill.hover +MenuItem.selectionForeground=@foreground +MenuItem.toolbar.selectionBackground=$brand.normal +MenuItem.toolbar.selectionForeground=$text.white MenuItem.disabledForeground=fade(@foreground,29%) # for MenuItem.selectionType = underline @@ -497,6 +508,8 @@ MenuItem.underlineSelectionBackground = @menuHoverBackground MenuItem.underlineSelectionCheckBackground = @menuCheckBackground MenuItem.underlineSelectionColor = @accentUnderlineColor MenuItem.underlineSelectionHeight = 3 +#---- Separator ---- +Separator.background=$border.divider #---- OptionPane ---- @@ -557,16 +570,17 @@ PopupMenu.border=com.fine.theme.light.ui.FinePopupMenuBorder PopupMenu.borderInsets=10,0,10,0 PopupMenu.borderCornerRadius = $Popup.borderCornerRadius PopupMenu.background=$background.normal +PopupMenu.toolbar.background=$fill.gray PopupMenu.scrollArrowColor = @buttonArrowColor PopupMenu.borderColor=$border.divider PopupMenu.hoverScrollArrowBackground = darken(@background,5%) -PopupMenu.arc=$Component.arc +PopupMenu.arc=10 #---- PopupMenuSeparator ---- - -PopupMenuSeparator.height = 9 +PopupMenuSeparator.height=5 PopupMenuSeparator.stripeWidth = 1 PopupMenuSeparator.stripeIndent=2 +PopupMenuSeparator.Insets=0,10,0,10 #---- ProgressBar ---- diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/PopupMenuStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/PopupMenuStoryBoard.java new file mode 100644 index 0000000000..21066949fa --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/PopupMenuStoryBoard.java @@ -0,0 +1,102 @@ +package com.fr.design.gui.storybook.components; + +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineClientProperties; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.imenu.UIMenuItem; +import com.fr.design.gui.imenu.UIPopupMenu; +import com.fr.design.gui.storybook.Story; +import com.fr.design.gui.storybook.StoryBoard; +import com.fr.design.menu.DottedSeparator; +import com.fr.design.menu.NameSeparator; + +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.MenuElement; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; + +/** + * 弹窗组件 + * + * @author Leo.Qin + * @since 11.0 + * Created on 2024/1/8 + */ +@Story +public class PopupMenuStoryBoard extends StoryBoard { + public PopupMenuStoryBoard() { + super("弹窗"); + add( + column(70, + cell(new UIButton("点击展示弹窗")).with(it -> { + UIPopupMenu popupMenu = new UIPopupMenu(); + popupMenu.add(new UIMenuItem("test1", new LazyIcon("edit"))); + popupMenu.add(new UIMenuItem("test2", new LazyIcon("cellHyperLinkAttr"))); + popupMenu.addSeparator(); + popupMenu.add(new UIMenuItem("test3", new LazyIcon("cellClear"))); + popupMenu.add(new NameSeparator("分割线").createMenuItem()); + popupMenu.add(new UIMenuItem("test4", new LazyIcon("cellOtherAttr"))); + popupMenu.add(new DottedSeparator().createMenuItem()); + popupMenu.add(new UIMenuItem("test5", new LazyIcon("cellExpandAttr"))); + + it.addMouseListener(new MouseAdapter() { + + + @Override + public void mouseClicked(MouseEvent e) { + popupMenu.show(it, e.getX(), e.getY()); + } + }); + }), + + cell(new UIButton("点击展示菜单栏弹窗")).with(it -> { + UIPopupMenu popupMenu = new UIPopupMenu(); + popupMenu.add(new UIMenuItem("test1", new LazyIcon("edit"))); + popupMenu.add(new UIMenuItem("test2", new LazyIcon("cellHyperLinkAttr"))); + popupMenu.addSeparator(); + popupMenu.add(new UIMenuItem("test3", new LazyIcon("cellClear"))); + popupMenu.add(new NameSeparator("分割线").createMenuItem()); + popupMenu.add(new UIMenuItem("test4", new LazyIcon("cellOtherAttr"))); + popupMenu.add(new DottedSeparator().createMenuItem()); + popupMenu.add(new UIMenuItem("test5", new LazyIcon("cellExpandAttr"))); + + it.addMouseListener(new MouseAdapter() { + + + @Override + public void mouseClicked(MouseEvent e) { + popupMenu.show(it, e.getX(), e.getY()); + } + }); + + setToolBarClientProperty(popupMenu); + }) + ) + ); + + } + + + private void setToolBarClientProperty(JPopupMenu jPopupMenu) { + jPopupMenu.putClientProperty(FineClientProperties.POPUP_MENU_TYPE, FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR); + + MenuElement[] subElements = jPopupMenu.getSubElements(); + for (MenuElement subElement : subElements) { + if (subElement instanceof JMenu) { + JMenu jMenu = (JMenu) subElement; + jMenu.putClientProperty(FineClientProperties.POPUP_MENU_TYPE, FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR); + JPopupMenu childPopupMenu = jMenu.getPopupMenu(); + setToolBarClientProperty(childPopupMenu); + } else if (subElement instanceof JMenuItem) { + JMenuItem jMenuItem = (JMenuItem) subElement; + jMenuItem.putClientProperty(FineClientProperties.POPUP_MENU_TYPE, FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR); + } + } + } + +} diff --git a/designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java b/designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java index 4d5fe8a62b..c5ec43463f 100644 --- a/designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java +++ b/designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java @@ -506,8 +506,6 @@ public class CellSelection extends Selection { popup.add(DeprecatedActionManager.getDeleteMenu(ePane)); popup.add(DeprecatedActionManager.getClearMenu(ePane)); - popup.addSeparator(); - addExtraMenu(ePane, popup); return popup; } diff --git a/designer-realize/src/main/java/com/fr/grid/selection/Selection.java b/designer-realize/src/main/java/com/fr/grid/selection/Selection.java index 1ddc54d432..d51707fb60 100644 --- a/designer-realize/src/main/java/com/fr/grid/selection/Selection.java +++ b/designer-realize/src/main/java/com/fr/grid/selection/Selection.java @@ -70,12 +70,17 @@ public abstract class Selection implements FCloneable, Serializable , Selectable * @param popupMenu */ public void addExtraMenu(ElementCasePane ePane, UIPopupMenu popupMenu) { + boolean existExtraMenu = false; Set selectionHandlerProviders = ExtraDesignClassManager.getInstance().getArray(RightSelectionHandlerProvider.XML_TAG); for (RightSelectionHandlerProvider handler : selectionHandlerProviders) { if (handler.accept(this)) { + existExtraMenu = true; handler.dmlMenu(ePane, popupMenu); } } + if (existExtraMenu) { + popupMenu.addSeparator(); + } } public abstract boolean clear(ElementCasePane.Clear type, ElementCasePane ePane); From edb588e7bf4f728342557645d3426744b7a1b108 Mon Sep 17 00:00:00 2001 From: vito Date: Mon, 8 Jan 2024 21:00:49 +0800 Subject: [PATCH 088/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/icon/GraphicsFilter.java | 3 ++- .../java/com/fine/theme/icon/svg/SvgIcon.java | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/icon/GraphicsFilter.java b/designer-base/src/main/java/com/fine/theme/icon/GraphicsFilter.java index 63f86df5db..f35c1b67f8 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/GraphicsFilter.java +++ b/designer-base/src/main/java/com/fine/theme/icon/GraphicsFilter.java @@ -41,8 +41,9 @@ public class GraphicsFilter @Override public void setPaint(Paint paint) { - if (paint instanceof Color) + if (paint instanceof Color) { paint = filterColor((Color) paint); + } super.setPaint(paint); } diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java index df5a52e787..37c399e5d4 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java @@ -42,7 +42,18 @@ import static com.fine.theme.utils.FineUIScale.scale; public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { public enum Type { - disable, white, origin + /** + * 灰化图 + */ + disable, + /** + * 白化图,用于反白场景 + */ + white, + /** + * 原始效果图 + */ + origin } private final Dimension size; @@ -74,14 +85,14 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { @Override public void paintIcon(Component c, Graphics g, int x, int y) { if (type == Type.disable) { - g = GrayGraphics(g); + g = grayGraphics(g); } Object[] oldRenderingHints = FlatUIUtils.setRenderingHints(g); render(c, g, x, y); FlatUIUtils.resetRenderingHints(g, oldRenderingHints); } - public Graphics2D GrayGraphics(Graphics g) { + public Graphics2D grayGraphics(Graphics g) { Object grayFilterObj = UIManager.get("Component.grayFilter"); RGBImageFilter grayFilter = (grayFilterObj instanceof RGBImageFilter) ? (RGBImageFilter) grayFilterObj From 13e48ca74331beee06ba048e066faed599225cbc Mon Sep 17 00:00:00 2001 From: vito Date: Mon, 8 Jan 2024 21:02:14 +0800 Subject: [PATCH 089/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fine/theme/icon/svg/SvgIcon.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java index 37c399e5d4..7e4cb9684f 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java @@ -92,7 +92,7 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { FlatUIUtils.resetRenderingHints(g, oldRenderingHints); } - public Graphics2D grayGraphics(Graphics g) { + private Graphics2D grayGraphics(Graphics g) { Object grayFilterObj = UIManager.get("Component.grayFilter"); RGBImageFilter grayFilter = (grayFilterObj instanceof RGBImageFilter) ? (RGBImageFilter) grayFilterObj From e48414f96100b56836168f4a74381803b6acdc5c Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Tue, 9 Jan 2024 09:46:02 +0800 Subject: [PATCH 090/302] =?UTF-8?q?REPORT-107973=20=E7=BF=BB=E6=96=B0?= =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E6=96=87=E8=8F=9C=E5=8D=95=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E3=80=82=E9=80=8F=E6=98=8E=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/light/ui/FineButtonUI.java | 53 +++++++++++++++++++ .../fine/theme/light/ui/FineMenuItemUI.java | 9 ---- .../com/fine/theme/light/ui/FineMenuUI.java | 9 ---- .../fine/theme/light/ui/FinePopupMenuUI.java | 6 --- .../theme/utils/FineClientProperties.java | 6 ++- .../com/fine/theme/utils/FineUIStyle.java | 4 ++ .../fr/design/mainframe/JFormSliderPane.java | 4 ++ .../mainframe/loghandler/LogMessageBar.java | 4 ++ .../main/java/com/fr/design/menu/MenuDef.java | 10 ++-- .../ui/NotificationCenterPane.java | 4 ++ .../light/ui/laf/FineLightLaf.properties | 24 +++++---- .../components/PopupMenuStoryBoard.java | 9 ++-- .../alphafine/component/AlphaFinePane.java | 4 ++ 13 files changed, 103 insertions(+), 43 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonUI.java index d5b3c17f74..420ab90d0a 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonUI.java @@ -6,6 +6,7 @@ import com.formdev.flatlaf.ui.FlatButtonUI; import com.formdev.flatlaf.ui.FlatUIUtils; import javax.swing.AbstractButton; +import javax.swing.ButtonModel; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.plaf.ComponentUI; @@ -96,6 +97,58 @@ public class FineButtonUI extends FlatButtonUI { } } + @Override + protected Color getBackground(JComponent c) { + if (isTransparentButton(c)) { + return buttonStateColor(c, + disabledBackground, + hoverBackground, + pressedBackground); + } else { + return super.getBackground(c); + } + } + + private boolean isTransparentButton(JComponent c) { + String buttonTypeStr = getButtonTypeStr((AbstractButton) c); + return FineClientProperties.BUTTON_TYPE_TRANSPARENT.equals(buttonTypeStr); + } + + /** + * 获取按钮状态颜色 + * + * @param c 组件 + * @param disabledColor 禁用颜色 + * @param hoverColor 鼠标悬停颜色 + * @param pressedColor 鼠标按下颜色 + * @return 按钮状态颜色 + */ + public static Color buttonStateColor(Component c, Color disabledColor, + Color hoverColor, Color pressedColor) { + + if (!c.isEnabled()) { + return disabledColor; + } + + ButtonModel model = ((AbstractButton) c).getModel(); + + if (pressedColor != null && model.isPressed()) { + return pressedColor; + } + + if (hoverColor != null && model.isRollover()) { + + return hoverColor; + } + + + if (c.isOpaque()) { + return c.getBackground(); + } + + return null; + } + /** * 创建UI */ diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuItemUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuItemUI.java index e5b28b382b..58237f59d9 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuItemUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuItemUI.java @@ -1,7 +1,6 @@ package com.fine.theme.light.ui; import com.fine.theme.utils.FineClientProperties; -import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.ui.FlatMenuItemUI; import com.fr.design.editlock.EditLockUtils; @@ -32,14 +31,6 @@ public class FineMenuItemUI extends FlatMenuItemUI { @Override public void paint(Graphics g, JComponent c) { - Object clientProperty = c.getClientProperty(FineClientProperties.POPUP_MENU_TYPE); - if (FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR.equals(clientProperty)) { - selectionBackground = FineUIUtils.getUIColor("Menu.toolbar.selectionBackground", "Menu.selectionBackground"); - selectionForeground = FineUIUtils.getUIColor("Menu.toolbar.selectionForeground", "Menu.selectionForeground"); - acceleratorForeground = FineUIUtils.getUIColor("Menu.toolbar.acceleratorForeground", "Menu.acceleratorForeground"); - acceleratorSelectionForeground = FineUIUtils.getUIColor("Menu.toolbar.acceleratorSelectionForeground", "Menu.acceleratorSelectionForeground"); - } - super.paint(g, c); Object itemType = c.getClientProperty(FineClientProperties.MENU_ITEM_TYPE); diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuUI.java index fafe6f78ae..b71b816a07 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuUI.java @@ -1,8 +1,6 @@ package com.fine.theme.light.ui; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.utils.FineClientProperties; -import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.ui.FlatMenuUI; import javax.swing.JComponent; @@ -37,13 +35,6 @@ public class FineMenuUI extends FlatMenuUI { @Override public void paint(Graphics g, JComponent c) { - Object clientProperty = c.getClientProperty(FineClientProperties.POPUP_MENU_TYPE); - if (FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR.equals(clientProperty)) { - selectionBackground = FineUIUtils.getUIColor("MenuItem.toolbar.selectionBackground", "MenuItem.selectionBackground"); - selectionForeground = FineUIUtils.getUIColor("MenuItem.toolbar.selectionForeground", "MenuItem.selectionForeground"); - acceleratorForeground = FineUIUtils.getUIColor("MenuItem.toolbar.acceleratorForeground", "MenuItem.acceleratorForeground"); - acceleratorSelectionForeground = FineUIUtils.getUIColor("MenuItem.toolbar.acceleratorSelectionForeground", "MenuItem.acceleratorSelectionForeground"); - } super.paint(g, c); } } diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FinePopupMenuUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FinePopupMenuUI.java index 3a21e2cc44..58a37da791 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FinePopupMenuUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FinePopupMenuUI.java @@ -1,6 +1,5 @@ package com.fine.theme.light.ui; -import com.fine.theme.utils.FineClientProperties; import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.ui.FlatPopupMenuUI; @@ -41,11 +40,6 @@ public class FinePopupMenuUI extends FlatPopupMenuUI { @Override public void paint(Graphics g, JComponent c) { - Object clientProperty = c.getClientProperty(FineClientProperties.POPUP_MENU_TYPE); - if (clientProperty != null && clientProperty.equals(FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR)) { - c.setBackground(FineUIUtils.getUIColor("PopupMenu.toolbar.background", "PopupMenu.background")); - } - // 绘制圆角矩形作为弹窗背景 Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java b/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java index 6d3ead4677..3aaf9615a3 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java @@ -16,11 +16,13 @@ public interface FineClientProperties extends FlatClientProperties { String BUTTON_TYPE_LEFT_ROUND_RECT = "leftRoundRect"; String BUTTON_TYPE_RIGHT_ROUND_RECT = "rightRoundRect"; + /** + * 背景透明按钮,仅初始化背景不生效,悬浮、点击仍然生效 + */ + String BUTTON_TYPE_TRANSPARENT = "transparentButton"; //--------------------------- PopupMenu ----------------------- - String POPUP_MENU_TYPE = "popupMenuType"; String MENU_ITEM_TYPE = "MenuItemType"; - String POPUP_MENU_TYPE_TOOL_BAR = "toolBar"; String MENU_ITEM_TYPE_LOCK = "lock"; String BUTTON_GROUP_POSITION = "group_position"; diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java index 1e029ed551..82172be6f7 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java @@ -27,6 +27,10 @@ public interface FineUIStyle { String BRAND_COLOR_LABEL = "brandColorLabel"; String BUTTON_TAB_ACTION = "tabAction"; + String MENU_TOOL_BAR = "menuToolBar"; + String MENU_ITEM_TOOL_BAR = "menuItemToolBar"; + String POPUP_MENU_TOOL_BAR = "popupMenuToolBar"; + /** * 添加组件的样式类,类似css,该方法会接在原样式后方 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java b/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java index 38a8d9d757..ec0bb70659 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineClientProperties; import com.fine.theme.utils.FineUIScale; import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.ui.FlatUIUtils; @@ -34,6 +35,7 @@ import java.math.BigDecimal; import static com.fine.theme.utils.FineUIStyle.LIGHT_GREY; import static com.fine.theme.utils.FineUIStyle.setStyle; +import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; /** @@ -106,6 +108,7 @@ public class JFormSliderPane extends JPanel { }; downButton.setBorderPainted(false); downButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Scale_Down")); + downButton.putClientProperty(BUTTON_TYPE, FineClientProperties.BUTTON_TYPE_TRANSPARENT); upButton = new UIButton(new LazyIcon("zoomIn")) { public Point getToolTipLocation(MouseEvent event) { return new Point(event.getX(), event.getY() - TOOLTIP_Y); @@ -117,6 +120,7 @@ public class JFormSliderPane extends JPanel { upButton.setActionCommand("more"); downButton.addActionListener(buttonActionListener); upButton.addActionListener(buttonActionListener); + upButton.putClientProperty(BUTTON_TYPE, FineClientProperties.BUTTON_TYPE_TRANSPARENT); } private void initShowValField() { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java index 0712327eca..6ccbad1463 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe.loghandler; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineClientProperties; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButton; @@ -9,6 +10,8 @@ import java.awt.BorderLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; + /** * 日志消息 * @@ -40,6 +43,7 @@ public class LogMessageBar extends BasicPane { logButton = new UIButton(new LazyIcon("logMsg")); logButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Show_Log_Message")); logButton.set4ToolbarButton(); + logButton.putClientProperty(BUTTON_TYPE, FineClientProperties.BUTTON_TYPE_TRANSPARENT); add(logButton); logButton.addMouseListener(new MouseAdapter() { @Override diff --git a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java index 17a0548561..5b82786abd 100644 --- a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java +++ b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java @@ -1,7 +1,7 @@ package com.fr.design.menu; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.utils.FineClientProperties; +import com.fine.theme.utils.FineUIStyle; import com.fr.base.svg.IconUtils; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.ibutton.UIButton; @@ -35,6 +35,8 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import static com.fine.theme.utils.FineUIStyle.setStyle; + /** * Define Menu. */ @@ -330,18 +332,18 @@ public class MenuDef extends ShortCut { } private void setToolBarClientProperty(JPopupMenu jPopupMenu) { - jPopupMenu.putClientProperty(FineClientProperties.POPUP_MENU_TYPE, FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR); + setStyle(jPopupMenu, FineUIStyle.POPUP_MENU_TOOL_BAR); MenuElement[] subElements = jPopupMenu.getSubElements(); for (MenuElement subElement : subElements) { if (subElement instanceof JMenu) { JMenu jMenu = (JMenu) subElement; - jMenu.putClientProperty(FineClientProperties.POPUP_MENU_TYPE, FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR); + setStyle(jMenu, FineUIStyle.MENU_TOOL_BAR); JPopupMenu childPopupMenu = jMenu.getPopupMenu(); setToolBarClientProperty(childPopupMenu); } else if (subElement instanceof JMenuItem) { JMenuItem jMenuItem = (JMenuItem) subElement; - jMenuItem.putClientProperty(FineClientProperties.POPUP_MENU_TYPE, FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR); + setStyle(jMenuItem, FineUIStyle.MENU_ITEM_TOOL_BAR); } } } diff --git a/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java b/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java index 817afcdcd6..b0fec9776f 100644 --- a/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java +++ b/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java @@ -1,6 +1,7 @@ package com.fr.design.notification.ui; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineClientProperties; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.i18n.Toolkit; @@ -11,6 +12,8 @@ import java.awt.BorderLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; + public class NotificationCenterPane extends BasicPane { private static NotificationCenterPane notificationCenterPane = new NotificationCenterPane(); private static UIButton notificationCenterButton; @@ -22,6 +25,7 @@ public class NotificationCenterPane extends BasicPane { notificationCenterButton.setIcon(new LazyIcon("notification")); notificationCenterButton.setToolTipText(Toolkit.i18nText("Fine-Design_Basic_Show_Notification")); notificationCenterButton.set4ToolbarButton(); + notificationCenterButton.putClientProperty(BUTTON_TYPE, FineClientProperties.BUTTON_TYPE_TRANSPARENT); this.add(notificationCenterButton); notificationCenterButton.addMouseListener(new MouseAdapter() { @Override diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index cf3bebf167..fd69ba49d3 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -455,10 +455,9 @@ Menu.opaque = false Menu.borderPainted = true Menu.background = @menuBackground Menu.selectionBackground=$fill.hover -Menu.toolbar.selectionBackground=$brand.normal -Menu.toolbar.selectionForeground=$text.white -Menu.toolbar.acceleratorForeground=@foreground -Menu.toolbar.acceleratorSelectionForeground=$text.white +#Menu.selectionForeground=$text.white +#Menu.acceleratorForeground=@foreground +#Menu.acceleratorSelectionForeground=$text.white #---- MenuBar ---- @@ -492,15 +491,11 @@ MenuItem.acceleratorArrowGap=4 MenuItem.acceleratorDelimiter = "+" MenuItem.acceleratorForeground=@foreground MenuItem.acceleratorSelectionForeground=@foreground -MenuItem.toolbar.acceleratorForeground=@foreground -MenuItem.toolbar.acceleratorSelectionForeground=$text.white [mac]MenuItem.acceleratorDelimiter = "" MenuItem.selectionInsets=0,4,0,4 MenuItem.selectionArc=4 MenuItem.selectionBackground=$fill.hover MenuItem.selectionForeground=@foreground -MenuItem.toolbar.selectionBackground=$brand.normal -MenuItem.toolbar.selectionForeground=$text.white MenuItem.disabledForeground=fade(@foreground,29%) # for MenuItem.selectionType = underline @@ -570,7 +565,6 @@ PopupMenu.border=com.fine.theme.light.ui.FinePopupMenuBorder PopupMenu.borderInsets=10,0,10,0 PopupMenu.borderCornerRadius = $Popup.borderCornerRadius PopupMenu.background=$background.normal -PopupMenu.toolbar.background=$fill.gray PopupMenu.scrollArrowColor = @buttonArrowColor PopupMenu.borderColor=$border.divider PopupMenu.hoverScrollArrowBackground = darken(@background,5%) @@ -1271,6 +1265,18 @@ CellOtherSetPane.height=$Component.defaultHeight [style]ToggleButton.inToolbarGroup = \ margin : 4,4,4,4; \ background : #fff +[style]Menu.menuToolBar=\ + selectionBackground : $brand.normal; \ + selectionForeground : $text.white; \ + acceleratorForeground : @foreground; \ + acceleratorSelectionForeground : $text.white +[style]MenuItem.menuItemToolBar=\ + selectionBackground : $brand.normal; \ + selectionForeground : $text.white; \ + acceleratorForeground : @foreground; \ + acceleratorSelectionForeground : $text.white +[style]PopupMenu.popupMenuToolBar=\ + background: $fill.gray #---- clearButton ---- # for clear/cancel button in text fields diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/PopupMenuStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/PopupMenuStoryBoard.java index 21066949fa..fb4354d3df 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/components/PopupMenuStoryBoard.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/PopupMenuStoryBoard.java @@ -1,7 +1,7 @@ package com.fr.design.gui.storybook.components; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.utils.FineClientProperties; +import com.fine.theme.utils.FineUIStyle; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIPopupMenu; @@ -19,6 +19,7 @@ import java.awt.event.MouseEvent; import static com.fine.swing.ui.layout.Layouts.cell; import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.theme.utils.FineUIStyle.setStyle; /** * 弹窗组件 @@ -83,18 +84,18 @@ public class PopupMenuStoryBoard extends StoryBoard { private void setToolBarClientProperty(JPopupMenu jPopupMenu) { - jPopupMenu.putClientProperty(FineClientProperties.POPUP_MENU_TYPE, FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR); + setStyle(jPopupMenu, FineUIStyle.POPUP_MENU_TOOL_BAR); MenuElement[] subElements = jPopupMenu.getSubElements(); for (MenuElement subElement : subElements) { if (subElement instanceof JMenu) { JMenu jMenu = (JMenu) subElement; - jMenu.putClientProperty(FineClientProperties.POPUP_MENU_TYPE, FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR); JPopupMenu childPopupMenu = jMenu.getPopupMenu(); + setStyle(jMenu, FineUIStyle.MENU_TOOL_BAR); setToolBarClientProperty(childPopupMenu); } else if (subElement instanceof JMenuItem) { JMenuItem jMenuItem = (JMenuItem) subElement; - jMenuItem.putClientProperty(FineClientProperties.POPUP_MENU_TYPE, FineClientProperties.POPUP_MENU_TYPE_TOOL_BAR); + setStyle(jMenuItem, FineUIStyle.MENU_ITEM_TOOL_BAR); } } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java index 34569667b2..676d2ddad0 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe.alphafine.component; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineClientProperties; import com.fr.design.actions.help.alphafine.AlphaFineContext; import com.fr.design.actions.help.alphafine.AlphaFineListener; import com.fr.design.dialog.BasicPane; @@ -13,6 +14,8 @@ import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; + /** * Created by XiaXiang on 2017/3/21. */ @@ -29,6 +32,7 @@ public class AlphaFinePane extends BasicPane { UIButton refreshButton = new UIButton(); refreshButton.setIcon(new LazyIcon(("search"))); refreshButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Learn_More_About")); + refreshButton.putClientProperty(BUTTON_TYPE, FineClientProperties.BUTTON_TYPE_TRANSPARENT); refreshButton.set4ToolbarButton(); this.add(refreshButton); refreshButton.addActionListener(new ActionListener() { From af5775815287bd35b08fe7cf27303bebb2bfd563 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Tue, 9 Jan 2024 10:07:23 +0800 Subject: [PATCH 091/302] =?UTF-8?q?REPORT-107973=20=E5=9B=9E=E9=80=80?= =?UTF-8?q?=E9=80=8F=E6=98=8E=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/light/ui/FineButtonUI.java | 53 ------------------- .../theme/utils/FineClientProperties.java | 4 -- .../fr/design/mainframe/JFormSliderPane.java | 4 -- .../mainframe/loghandler/LogMessageBar.java | 4 -- .../ui/NotificationCenterPane.java | 4 -- .../alphafine/component/AlphaFinePane.java | 4 -- 6 files changed, 73 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonUI.java index 420ab90d0a..d5b3c17f74 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonUI.java @@ -6,7 +6,6 @@ import com.formdev.flatlaf.ui.FlatButtonUI; import com.formdev.flatlaf.ui.FlatUIUtils; import javax.swing.AbstractButton; -import javax.swing.ButtonModel; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.plaf.ComponentUI; @@ -97,58 +96,6 @@ public class FineButtonUI extends FlatButtonUI { } } - @Override - protected Color getBackground(JComponent c) { - if (isTransparentButton(c)) { - return buttonStateColor(c, - disabledBackground, - hoverBackground, - pressedBackground); - } else { - return super.getBackground(c); - } - } - - private boolean isTransparentButton(JComponent c) { - String buttonTypeStr = getButtonTypeStr((AbstractButton) c); - return FineClientProperties.BUTTON_TYPE_TRANSPARENT.equals(buttonTypeStr); - } - - /** - * 获取按钮状态颜色 - * - * @param c 组件 - * @param disabledColor 禁用颜色 - * @param hoverColor 鼠标悬停颜色 - * @param pressedColor 鼠标按下颜色 - * @return 按钮状态颜色 - */ - public static Color buttonStateColor(Component c, Color disabledColor, - Color hoverColor, Color pressedColor) { - - if (!c.isEnabled()) { - return disabledColor; - } - - ButtonModel model = ((AbstractButton) c).getModel(); - - if (pressedColor != null && model.isPressed()) { - return pressedColor; - } - - if (hoverColor != null && model.isRollover()) { - - return hoverColor; - } - - - if (c.isOpaque()) { - return c.getBackground(); - } - - return null; - } - /** * 创建UI */ diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java b/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java index 3aaf9615a3..8883f88da4 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java @@ -16,10 +16,6 @@ public interface FineClientProperties extends FlatClientProperties { String BUTTON_TYPE_LEFT_ROUND_RECT = "leftRoundRect"; String BUTTON_TYPE_RIGHT_ROUND_RECT = "rightRoundRect"; - /** - * 背景透明按钮,仅初始化背景不生效,悬浮、点击仍然生效 - */ - String BUTTON_TYPE_TRANSPARENT = "transparentButton"; //--------------------------- PopupMenu ----------------------- String MENU_ITEM_TYPE = "MenuItemType"; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java b/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java index ec0bb70659..38a8d9d757 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java @@ -1,7 +1,6 @@ package com.fr.design.mainframe; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.utils.FineClientProperties; import com.fine.theme.utils.FineUIScale; import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.ui.FlatUIUtils; @@ -35,7 +34,6 @@ import java.math.BigDecimal; import static com.fine.theme.utils.FineUIStyle.LIGHT_GREY; import static com.fine.theme.utils.FineUIStyle.setStyle; -import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; /** @@ -108,7 +106,6 @@ public class JFormSliderPane extends JPanel { }; downButton.setBorderPainted(false); downButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Scale_Down")); - downButton.putClientProperty(BUTTON_TYPE, FineClientProperties.BUTTON_TYPE_TRANSPARENT); upButton = new UIButton(new LazyIcon("zoomIn")) { public Point getToolTipLocation(MouseEvent event) { return new Point(event.getX(), event.getY() - TOOLTIP_Y); @@ -120,7 +117,6 @@ public class JFormSliderPane extends JPanel { upButton.setActionCommand("more"); downButton.addActionListener(buttonActionListener); upButton.addActionListener(buttonActionListener); - upButton.putClientProperty(BUTTON_TYPE, FineClientProperties.BUTTON_TYPE_TRANSPARENT); } private void initShowValField() { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java index 6ccbad1463..0712327eca 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java @@ -1,7 +1,6 @@ package com.fr.design.mainframe.loghandler; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.utils.FineClientProperties; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButton; @@ -10,8 +9,6 @@ import java.awt.BorderLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; - /** * 日志消息 * @@ -43,7 +40,6 @@ public class LogMessageBar extends BasicPane { logButton = new UIButton(new LazyIcon("logMsg")); logButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Show_Log_Message")); logButton.set4ToolbarButton(); - logButton.putClientProperty(BUTTON_TYPE, FineClientProperties.BUTTON_TYPE_TRANSPARENT); add(logButton); logButton.addMouseListener(new MouseAdapter() { @Override diff --git a/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java b/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java index b0fec9776f..817afcdcd6 100644 --- a/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java +++ b/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java @@ -1,7 +1,6 @@ package com.fr.design.notification.ui; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.utils.FineClientProperties; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.i18n.Toolkit; @@ -12,8 +11,6 @@ import java.awt.BorderLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; - public class NotificationCenterPane extends BasicPane { private static NotificationCenterPane notificationCenterPane = new NotificationCenterPane(); private static UIButton notificationCenterButton; @@ -25,7 +22,6 @@ public class NotificationCenterPane extends BasicPane { notificationCenterButton.setIcon(new LazyIcon("notification")); notificationCenterButton.setToolTipText(Toolkit.i18nText("Fine-Design_Basic_Show_Notification")); notificationCenterButton.set4ToolbarButton(); - notificationCenterButton.putClientProperty(BUTTON_TYPE, FineClientProperties.BUTTON_TYPE_TRANSPARENT); this.add(notificationCenterButton); notificationCenterButton.addMouseListener(new MouseAdapter() { @Override diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java index 676d2ddad0..34569667b2 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java @@ -1,7 +1,6 @@ package com.fr.design.mainframe.alphafine.component; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.utils.FineClientProperties; import com.fr.design.actions.help.alphafine.AlphaFineContext; import com.fr.design.actions.help.alphafine.AlphaFineListener; import com.fr.design.dialog.BasicPane; @@ -14,8 +13,6 @@ import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; - /** * Created by XiaXiang on 2017/3/21. */ @@ -32,7 +29,6 @@ public class AlphaFinePane extends BasicPane { UIButton refreshButton = new UIButton(); refreshButton.setIcon(new LazyIcon(("search"))); refreshButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Learn_More_About")); - refreshButton.putClientProperty(BUTTON_TYPE, FineClientProperties.BUTTON_TYPE_TRANSPARENT); refreshButton.set4ToolbarButton(); this.add(refreshButton); refreshButton.addActionListener(new ActionListener() { From ccb798b5b57608a56bd8678612db3f33b1692a69 Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 9 Jan 2024 14:28:41 +0800 Subject: [PATCH 092/302] =?UTF-8?q?REPORT-99485=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E6=A0=8F=E9=83=A8=E5=88=86=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E6=9C=89=E5=BA=95=E8=89=B2=E9=97=AE=E9=A2=98=201.=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=B7=A5=E5=85=B7=E6=A0=8F=E9=83=A8=E5=88=86=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E6=9C=89=E5=BA=95=E8=89=B2=E9=97=AE=E9=A2=98=202.=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E7=9A=84svg=E7=BB=98=E5=88=B6?= =?UTF-8?q?=E5=BA=93=E4=BE=9D=E8=B5=96=203.=20=E5=B7=A6=E5=8F=B3=E5=8D=8A?= =?UTF-8?q?=E5=9C=86=E8=A7=92=E7=9F=A9=E5=BD=A2=E4=BB=8Etype=E8=A7=A3?= =?UTF-8?q?=E8=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + .../java/com/fine/theme/light/ui/FineButtonUI.java | 10 +++++----- .../com/fine/theme/utils/FineClientProperties.java | 5 +++-- .../com/fr/design/gui/ibutton/UIButtonGroup.java | 9 ++++----- .../fr/design/gui/ibutton/UICombinationButton.java | 13 +++++++++---- .../fine/theme/light/ui/laf/FineLightLaf.properties | 8 ++++---- 6 files changed, 26 insertions(+), 20 deletions(-) diff --git a/build.gradle b/build.gradle index 0ebf3e9cb6..9cabeff69e 100644 --- a/build.gradle +++ b/build.gradle @@ -89,6 +89,7 @@ allprojects { implementation 'com.fr.design:design-i18n:' + frDevVersion implementation 'com.formdev:flatlaf:3.2' implementation 'com.formdev:flatlaf-extras:3.2.1' + implementation 'com.github.weisj:jsvg:1.2.0' implementation 'com.fanruan.vito:gui-inspector:1.0.1' implementation 'com.fine.swing.ui:layout:1.0-SNAPSHOT' testImplementation 'org.easymock:easymock:3.5.1' diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonUI.java index d5b3c17f74..73fb532f9b 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonUI.java @@ -15,7 +15,7 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Path2D; -import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; +import static com.fine.theme.utils.FineClientProperties.BUTTON_BORDER; /** * 按钮UI @@ -42,7 +42,7 @@ public class FineButtonUI extends FlatButtonUI { */ public static boolean isLeftRoundButton(Component c) { return c instanceof JButton - && FineClientProperties.BUTTON_TYPE_LEFT_ROUND_RECT.equals(getButtonTypeStr((JButton) c)); + && FineClientProperties.BUTTON_BORDER_LEFT_ROUND_RECT.equals(getButtonBorderTypeStr((JButton) c)); } /** @@ -53,7 +53,7 @@ public class FineButtonUI extends FlatButtonUI { */ public static boolean isRightRoundButton(Component c) { return c instanceof JButton - && FineClientProperties.BUTTON_TYPE_RIGHT_ROUND_RECT.equals(getButtonTypeStr((JButton) c)); + && FineClientProperties.BUTTON_BORDER_RIGHT_ROUND_RECT.equals(getButtonBorderTypeStr((JButton) c)); } /** @@ -103,8 +103,8 @@ public class FineButtonUI extends FlatButtonUI { return new FineButtonUI(false); } - static String getButtonTypeStr(AbstractButton c) { - Object value = c.getClientProperty(BUTTON_TYPE); + static String getButtonBorderTypeStr(AbstractButton c) { + Object value = c.getClientProperty(BUTTON_BORDER); if (value instanceof String) { return (String) value; } diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java b/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java index 8883f88da4..acbbcb1577 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineClientProperties.java @@ -14,8 +14,9 @@ public interface FineClientProperties extends FlatClientProperties { //--------------------------- ButtonGroup ----------------------- String BUTTON_TYPE_GROUP = "group"; - String BUTTON_TYPE_LEFT_ROUND_RECT = "leftRoundRect"; - String BUTTON_TYPE_RIGHT_ROUND_RECT = "rightRoundRect"; + String BUTTON_BORDER = "buttonBorder"; + String BUTTON_BORDER_LEFT_ROUND_RECT = "leftRoundRect"; + String BUTTON_BORDER_RIGHT_ROUND_RECT = "rightRoundRect"; //--------------------------- PopupMenu ----------------------- String MENU_ITEM_TYPE = "MenuItemType"; diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java index 20693ee80e..7505eeb773 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java @@ -268,11 +268,10 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb public void setForToolBarButtonGroup(boolean isToolBarComponent) { if (isToolBarComponent) { inToolbar = true; - for (UIToggleButton uiToggleButton : labelButtonList) { - uiToggleButton.putClientProperty(BUTTON_TYPE, BUTTON_TYPE_TOOLBAR_BUTTON); - FineUIStyle.setStyle(uiToggleButton, IN_TOOLBAR_GROUP); - uiToggleButton.set4ToolbarButton(); - uiToggleButton.setBorderPainted(false); + for (UIToggleButton button : labelButtonList) { + button.putClientProperty(BUTTON_TYPE, BUTTON_TYPE_TOOLBAR_BUTTON); + FineUIStyle.setStyle(button, IN_TOOLBAR_GROUP); + button.setBorderPainted(false); } } repaint(); diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java index 80d74bcdc4..70f229d2a3 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UICombinationButton.java @@ -10,13 +10,15 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.function.Consumer; -import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE_LEFT_ROUND_RECT; -import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE_RIGHT_ROUND_RECT; +import static com.fine.theme.utils.FineClientProperties.BUTTON_BORDER; +import static com.fine.theme.utils.FineClientProperties.BUTTON_BORDER_LEFT_ROUND_RECT; +import static com.fine.theme.utils.FineClientProperties.BUTTON_BORDER_RIGHT_ROUND_RECT; import static com.fine.theme.utils.FineUIStyle.IN_TOOLBAR_LEFT; import static com.fine.theme.utils.FineUIStyle.IN_TOOLBAR_RIGHT; import static com.fine.theme.utils.FineUIStyle.STYLE_PRIMARY; import static com.fine.theme.utils.FineUIStyle.setStyle; import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE; +import static com.formdev.flatlaf.FlatClientProperties.BUTTON_TYPE_TOOLBAR_BUTTON; /** * 双按钮组件 @@ -69,10 +71,11 @@ public class UICombinationButton extends JPanel { } public UICombinationButton(UIButton left, UIButton right) { + setOpaque(false); leftButton = left; - leftButton.putClientProperty(BUTTON_TYPE, BUTTON_TYPE_LEFT_ROUND_RECT); + leftButton.putClientProperty(BUTTON_BORDER, BUTTON_BORDER_LEFT_ROUND_RECT); rightButton = right; - rightButton.putClientProperty(BUTTON_TYPE, BUTTON_TYPE_RIGHT_ROUND_RECT); + rightButton.putClientProperty(BUTTON_BORDER, BUTTON_BORDER_RIGHT_ROUND_RECT); leftButton.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { @@ -139,8 +142,10 @@ public class UICombinationButton extends JPanel { public void set4Toolbar() { leftButton.setBorderPainted(false); + leftButton.putClientProperty(BUTTON_TYPE, BUTTON_TYPE_TOOLBAR_BUTTON); setStyle(leftButton, IN_TOOLBAR_LEFT); rightButton.setBorderPainted(false); + rightButton.putClientProperty(BUTTON_TYPE, BUTTON_TYPE_TOOLBAR_BUTTON); setStyle(rightButton, IN_TOOLBAR_RIGHT); } diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index d6994d04cf..0cbfbeb31d 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -1237,10 +1237,10 @@ CellOtherSetPane.height=$Component.defaultHeight background : #fff [style]Button.inToolbarLeft = \ - margin : 3,3,3,3 + toolbar.margin : 4,4,4,4 [style]Button.inToolbarRight = \ - margin : 0,0,0,0 + toolbar.margin : 1,0,1,0 [style]Button.tabAction = \ toolbar.margin : 5,11,5,11 @@ -1263,8 +1263,8 @@ CellOtherSetPane.height=$Component.defaultHeight opaque: true [style]ToggleButton.inToolbarGroup = \ - margin : 4,4,4,4; \ - background : #fff + margin: 4,4,4,4; + [style]Menu.menuToolBar=\ selectionBackground : $brand.normal; \ selectionForeground : $text.white; \ From e133d4958947774279e82c988b676c246a24db95 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Tue, 9 Jan 2024 14:54:21 +0800 Subject: [PATCH 093/302] =?UTF-8?q?REPORT-107973=20=E8=83=8C=E6=99=AF?= =?UTF-8?q?=E8=89=B2=E9=80=8F=E6=98=8E=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/utils/FineUIStyle.java | 1 + .../mainframe/EastRegionContainerPane.java | 15 ++++------ .../fr/design/mainframe/JFormSliderPane.java | 3 ++ .../mainframe/loghandler/LogMessageBar.java | 4 +++ .../ui/NotificationCenterPane.java | 4 +++ .../light/ui/laf/FineLightLaf.properties | 4 +++ .../components/ButtonStoryBoard.java | 28 +++++++++++++++++++ .../alphafine/component/AlphaFinePane.java | 4 +++ 8 files changed, 54 insertions(+), 9 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java index 82172be6f7..e0bc20d5ca 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java @@ -16,6 +16,7 @@ public interface FineUIStyle { String IN_TOOLBAR_GROUP = "inToolbarGroup"; String STYLE_PRIMARY = "primary"; String STYLE_SECONDARY = "secondary"; + String STYLE_TEXT = "text"; String STYLE_SIZE_MEDIUM = "mediumSize"; String STYLE_SIZE_SMALL = "smallSize"; String MENU_BAR = "menuBar"; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index acf32c4ef1..1b782dd300 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -1,7 +1,6 @@ package com.fr.design.mainframe; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.light.ui.RectangleButtonUI; import com.fine.theme.utils.FineUIScale; import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.FlatDarkLaf; @@ -14,7 +13,6 @@ import com.fr.design.constants.UIConstants; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.fun.PropertyItemPaneProvider; import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.ibutton.UIButtonUI; import com.fr.design.gui.icontainer.UIEastResizableContainer; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.VerticalFlowLayout; @@ -70,6 +68,9 @@ import java.util.List; import java.util.Map; import java.util.Set; +import static com.fine.theme.utils.FineUIStyle.STYLE_TEXT; +import static com.fine.theme.utils.FineUIStyle.setStyle; + public class EastRegionContainerPane extends UIEastResizableContainer { private static volatile EastRegionContainerPane THIS; private Map propertyItemMap; @@ -974,7 +975,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } public void resetButtonIcon() { - button.setBackground(null); + button.setBackground(new Color(0, 0, 0, 0)); if (iconSuffix.equals(ICON_SUFFIX_SELECTED)) { iconSuffix = ICON_SUFFIX_NORMAL; button.setIcon(new LazyIcon(getBtnIconId())); @@ -1003,7 +1004,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { }; button.setDisabledIcon(new LazyIcon(btnIconName + ICON_SUFFIX_DISABLED)); button.set4LargeToolbarButton(); - button.setUI(new RectangleButtonUI(false)); + setStyle(button, STYLE_TEXT); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -1279,11 +1280,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } else if (StringUtils.equals(type, DOWN_BUTTON)) { popupButton = new UIButton(new LazyIcon("expand_popup")); } - popupButton.setUI(new UIButtonUI()); - popupButton.setBorderPainted(false); - popupButton.setBorder(null); - popupButton.setBackground(null); - popupButton.setExtraPainted(false); + setStyle(popupButton, STYLE_TEXT); popupButton.addActionListener(e -> { this.buttonType = type; onPop(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java b/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java index 38a8d9d757..78da7a6e63 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java @@ -2,6 +2,7 @@ package com.fr.design.mainframe; import com.fine.theme.icon.LazyIcon; import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIStyle; import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.design.gui.ibutton.UIButton; @@ -106,6 +107,7 @@ public class JFormSliderPane extends JPanel { }; downButton.setBorderPainted(false); downButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Scale_Down")); + setStyle(downButton, FineUIStyle.STYLE_TEXT); upButton = new UIButton(new LazyIcon("zoomIn")) { public Point getToolTipLocation(MouseEvent event) { return new Point(event.getX(), event.getY() - TOOLTIP_Y); @@ -117,6 +119,7 @@ public class JFormSliderPane extends JPanel { upButton.setActionCommand("more"); downButton.addActionListener(buttonActionListener); upButton.addActionListener(buttonActionListener); + setStyle(upButton, FineUIStyle.STYLE_TEXT); } private void initShowValField() { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java index 0712327eca..292c2d593f 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe.loghandler; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIStyle; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButton; @@ -9,6 +10,8 @@ import java.awt.BorderLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import static com.fine.theme.utils.FineUIStyle.setStyle; + /** * 日志消息 * @@ -40,6 +43,7 @@ public class LogMessageBar extends BasicPane { logButton = new UIButton(new LazyIcon("logMsg")); logButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Show_Log_Message")); logButton.set4ToolbarButton(); + setStyle(logButton, FineUIStyle.STYLE_TEXT); add(logButton); logButton.addMouseListener(new MouseAdapter() { @Override diff --git a/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java b/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java index 817afcdcd6..120535d313 100644 --- a/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java +++ b/designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java @@ -1,6 +1,7 @@ package com.fr.design.notification.ui; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIStyle; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.i18n.Toolkit; @@ -11,6 +12,8 @@ import java.awt.BorderLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import static com.fine.theme.utils.FineUIStyle.setStyle; + public class NotificationCenterPane extends BasicPane { private static NotificationCenterPane notificationCenterPane = new NotificationCenterPane(); private static UIButton notificationCenterButton; @@ -22,6 +25,7 @@ public class NotificationCenterPane extends BasicPane { notificationCenterButton.setIcon(new LazyIcon("notification")); notificationCenterButton.setToolTipText(Toolkit.i18nText("Fine-Design_Basic_Show_Notification")); notificationCenterButton.set4ToolbarButton(); + setStyle(notificationCenterButton, FineUIStyle.STYLE_TEXT); this.add(notificationCenterButton); notificationCenterButton.addMouseListener(new MouseAdapter() { @Override diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index d6994d04cf..d7801f8dc5 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -1228,6 +1228,10 @@ CellOtherSetPane.height=$Component.defaultHeight focusedBorderColor : $Button.focusedBorderColor; \ focusColor : $Component.focusColor; \ borderWidth : 1 +[style]Button.text=\ + background : fade($Button.background,0%); \ + borderWidth : 0; \ + disabledBackground : fade($Button.background,0%); [style]CombinationButton.primary = \ background : @BrandColor; \ diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java index 67c369518a..54181cf0d6 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonStoryBoard.java @@ -18,6 +18,7 @@ import static com.fine.swing.ui.layout.Layouts.flex; import static com.fine.swing.ui.layout.Layouts.row; import static com.fine.theme.utils.FineUIStyle.STYLE_PRIMARY; import static com.fine.theme.utils.FineUIStyle.STYLE_SIZE_SMALL; +import static com.fine.theme.utils.FineUIStyle.STYLE_TEXT; import static com.fine.theme.utils.FineUIStyle.joinStyle; import static com.fine.theme.utils.FineUIStyle.setStyle; @@ -131,6 +132,33 @@ public class ButtonStoryBoard extends StoryBoard { ) ) ), + column(16, + cell(new UILabel(STYLE_TEXT)).with(this::h2), + row(20, + cell(new UILabel("正常")), + cell(new UIButton("按钮")) + .with(it -> setStyle(it, STYLE_TEXT)), + cell(new UIButton("按钮", new LazyIcon("add"))) + .with(it -> setStyle(it, STYLE_TEXT)), + cell(new UIButton(new LazyIcon("multi"))) + .with(it -> setStyle(it, STYLE_TEXT)) + ), + row(20, + cell(new UILabel("禁用")), + cell(new UIButton("按钮")).with(it -> { + setStyle(it, STYLE_TEXT); + it.setEnabled(false); + }), + cell(new UIButton("保存", new LazyIcon("save").disabled())).with(it -> { + setStyle(it, STYLE_TEXT); + it.setEnabled(false); + }), + cell(new UIButton(new LazyIcon("add").disabled())).with(it -> { + setStyle(it, STYLE_TEXT); + it.setEnabled(false); + }) + ) + ), cell(new UILabel("JButton")).with(this::h2), row(20, cell(new UILabel("medium")), diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java index 34569667b2..151afd7580 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe.alphafine.component; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIStyle; import com.fr.design.actions.help.alphafine.AlphaFineContext; import com.fr.design.actions.help.alphafine.AlphaFineListener; import com.fr.design.dialog.BasicPane; @@ -13,6 +14,8 @@ import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.theme.utils.FineUIStyle.setStyle; + /** * Created by XiaXiang on 2017/3/21. */ @@ -30,6 +33,7 @@ public class AlphaFinePane extends BasicPane { refreshButton.setIcon(new LazyIcon(("search"))); refreshButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Learn_More_About")); refreshButton.set4ToolbarButton(); + setStyle(refreshButton, FineUIStyle.STYLE_TEXT); this.add(refreshButton); refreshButton.addActionListener(new ActionListener() { @Override From 00113dc9aee90f9a40729b44387299fa027ef910 Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 9 Jan 2024 19:21:12 +0800 Subject: [PATCH 094/302] =?UTF-8?q?REPORT-99485=20=E6=9A=82=E6=97=B6?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B8=A6=E6=9C=89filter=E7=9A=84svg=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=BB=A5=E6=AD=A3=E5=B8=B8=E6=98=BE=E7=A4=BA=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=EF=BC=88=E5=A4=B1=E5=8E=BB=E9=98=B4=E5=BD=B1=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fine/theme/icon/svg/SvgIcon.java | 17 +++++++++++------ .../com/fine/theme/icon/checkbox/checked.svg | 13 +------------ 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java index 7e4cb9684f..a10e3105ef 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java @@ -8,6 +8,7 @@ import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.ui.FlatUIUtils; import com.formdev.flatlaf.util.GrayFilter; import com.fr.clone.cloning.Immutable; +import com.fr.log.FineLoggerFactory; import com.fr.value.NullableLazyValue; import com.github.weisj.jsvg.SVGDocument; import com.github.weisj.jsvg.attributes.ViewBox; @@ -112,12 +113,16 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { } private void render(Component c, Graphics g, int x, int y) { - if (type == Type.white) { - Objects.requireNonNull(whiteSvgDocument.getValue()) - .render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, size.width, size.height)); - } else { - Objects.requireNonNull(svgDocument.getValue()) - .render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, size.width, size.height)); + try { + if (type == Type.white) { + Objects.requireNonNull(whiteSvgDocument.getValue()) + .render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, size.width, size.height)); + } else { + Objects.requireNonNull(svgDocument.getValue()) + .render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, size.width, size.height)); + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error("SvgIcon from url: " + resource + "can not paint.", e); } } diff --git a/designer-base/src/main/resources/com/fine/theme/icon/checkbox/checked.svg b/designer-base/src/main/resources/com/fine/theme/icon/checkbox/checked.svg index fa4b47ddd7..5323d23b6d 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/checkbox/checked.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/checkbox/checked.svg @@ -1,19 +1,8 @@ - + - - - - - - - - - - - From a27ad872c69163d1a20600679ed82ffdc0f44e45 Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 9 Jan 2024 19:47:39 +0800 Subject: [PATCH 095/302] =?UTF-8?q?REPORT-99485=20=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E5=B7=A5=E5=85=B7=E6=A0=8F=E5=B8=83=E5=B1=80?= =?UTF-8?q?=E8=B0=83=E6=95=B4&=E5=9B=BE=E6=A0=87=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/gui/core/WidgetOption.java | 79 +++-- .../design/gui/core/WidgetOptionFactory.java | 3 +- .../mainframe/CenterRegionContainerPane.java | 2 +- .../toolbar/ToolBarMenuDockPlus.java | 3 +- .../parameter/ParameterDesignerProvider.java | 2 +- .../com/fine/theme/icon/widget/button.svg | 6 + .../fine/theme/icon/widget/button_disable.svg | 6 + .../fine/theme/icon/widget/button_group.svg | 7 + .../icon/widget/button_group_disable.svg | 7 + .../com/fine/theme/icon/widget/checkbox.svg | 4 + .../theme/icon/widget/checkbox_disable.svg | 4 + .../fine/theme/icon/widget/checkbox_group.svg | 7 + .../icon/widget/checkbox_group_disable.svg | 7 + .../com/fine/theme/icon/widget/combo_box.svg | 11 + .../theme/icon/widget/combo_box_disable.svg | 11 + .../fine/theme/icon/widget/combo_check.svg | 7 + .../theme/icon/widget/combo_check_disable.svg | 7 + .../fine/theme/icon/widget/comboboxtree.svg | 7 + .../icon/widget/comboboxtree_disable.svg | 7 + .../com/fine/theme/icon/widget/date.svg | 8 + .../fine/theme/icon/widget/date_disable.svg | 8 + .../com/fine/theme/icon/widget/files_up.svg | 11 + .../theme/icon/widget/files_up_disable.svg | 11 + .../com/fine/theme/icon/widget/iframe.svg | 13 + .../fine/theme/icon/widget/iframe_disable.svg | 13 + .../com/fine/theme/icon/widget/label.svg | 4 + .../fine/theme/icon/widget/label_disable.svg | 4 + .../fine/theme/icon/widget/number_field.svg | 6 + .../icon/widget/number_field_disable.svg | 6 + .../fine/theme/icon/widget/password_field.svg | 4 + .../icon/widget/password_field_disable.svg | 4 + .../com/fine/theme/icon/widget/picture.svg | 11 + .../theme/icon/widget/picture_disable.svg | 11 + .../com/fine/theme/icon/widget/preview.svg | 11 + .../theme/icon/widget/preview_disable.svg | 11 + .../com/fine/theme/icon/widget/prewidget.svg | 13 + .../theme/icon/widget/prewidget_disable.svg | 13 + .../com/fine/theme/icon/widget/tab.svg | 3 + .../fine/theme/icon/widget/tab_disable.svg | 3 + .../com/fine/theme/icon/widget/text_area.svg | 11 + .../theme/icon/widget/text_area_disable.svg | 11 + .../com/fine/theme/icon/widget/text_field.svg | 3 + .../theme/icon/widget/text_field_disable.svg | 3 + .../com/fine/theme/icon/widget/tree.svg | 4 + .../fine/theme/icon/widget/tree_disable.svg | 4 + .../fr/design/gui/storybook/Storybook.java | 10 +- .../form/parameter/FormParaDesigner.java | 4 +- .../form/parameter/FormParaTargetMode.java | 16 +- .../com/fr/design/mainframe/FormDesigner.java | 8 +- .../com/fr/design/mainframe/FormParaPane.java | 90 ++---- .../design/mainframe/FormParaWidgetPane.java | 11 +- .../fr/design/mainframe/FormTargetMode.java | 13 +- .../design/mainframe/FormWidgetPopWindow.java | 251 +++++++-------- .../java/com/fr/design/mainframe/JForm.java | 6 +- .../fr/design/mainframe/ToolBarButton.java | 303 +++++++++--------- .../com/fr/design/mainframe/JWorkBook.java | 2 +- .../parameter/ParameterDefinitePane.java | 2 +- .../main/java/com/fr/start/MainDesigner.java | 27 +- 58 files changed, 703 insertions(+), 431 deletions(-) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/button.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/button_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/button_group.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/button_group_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/checkbox.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/checkbox_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/checkbox_group.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/checkbox_group_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/combo_box.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/combo_box_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/combo_check.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/combo_check_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/comboboxtree.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/comboboxtree_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/date.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/date_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/files_up.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/files_up_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/iframe.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/iframe_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/label.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/label_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/number_field.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/number_field_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/password_field.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/password_field_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/picture.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/picture_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/preview.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/preview_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/prewidget.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/prewidget_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/tab.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/tab_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/text_area.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/text_area_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/text_field.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/text_field_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/tree.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/widget/tree_disable.svg diff --git a/designer-base/src/main/java/com/fr/design/gui/core/WidgetOption.java b/designer-base/src/main/java/com/fr/design/gui/core/WidgetOption.java index 4c9db5a6a0..6dd9826fb7 100644 --- a/designer-base/src/main/java/com/fr/design/gui/core/WidgetOption.java +++ b/designer-base/src/main/java/com/fr/design/gui/core/WidgetOption.java @@ -1,7 +1,6 @@ package com.fr.design.gui.core; import com.fr.base.BaseUtils; -import com.fr.base.svg.IconUtils; import com.fr.form.ui.Button; import com.fr.form.ui.CheckBox; import com.fr.form.ui.CheckBoxGroup; @@ -26,9 +25,12 @@ import com.fr.form.ui.Widget; import com.fr.form.ui.WidgetConfig; import com.fr.form.ui.WidgetInfoConfig; import com.fr.general.ComparatorUtils; + +import javax.swing.Icon; import java.io.Serializable; import java.util.ArrayList; -import javax.swing.Icon; + +import static com.fr.design.i18n.Toolkit.i18nText; public abstract class WidgetOption implements Serializable { @@ -123,7 +125,7 @@ public abstract class WidgetOption implements Serializable { */ public static WidgetOption[] getReportWidgetInstance() { return new WidgetOption[]{TEXTEDITOR, TEXTAREA, NUMBEREDITOR, PASSWORD, BUTTON, CHECKBOX, RADIOGROUP, CHECKBOXGROUP, COMBOBOX, - COMBOCHECKBOX, DATEEDITOR, MULTI_FILEEDITOR, LIST, IFRAMEDITOR, TREECOMBOBOX, TREE}; + COMBOCHECKBOX, DATEEDITOR, MULTI_FILEEDITOR, LIST, IFRAMEDITOR, TREECOMBOBOX, TREE}; } @@ -144,79 +146,102 @@ public abstract class WidgetOption implements Serializable { */ public static WidgetOption[] getFormWidgetIntance() { return new WidgetOption[]{TEXTEDITOR, LABEL, FREEBUTTON, COMBOBOX, COMBOCHECKBOX, DATEEDITOR, - NUMBEREDITOR, TREECOMBOBOX, RADIOGROUP, CHECKBOXGROUP, TEXTAREA, PASSWORD, CHECKBOX, TREE, MULTI_FILEEDITOR,PICTURE}; + NUMBEREDITOR, TREECOMBOBOX, RADIOGROUP, CHECKBOXGROUP, TEXTAREA, PASSWORD, CHECKBOX, TREE, MULTI_FILEEDITOR, PICTURE}; } - public static final WidgetOption DATEEDITOR = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Date"), - "/com/fr/design/images/buttonicon/widget/date_16", + public static final WidgetOption DATEEDITOR = WidgetOptionFactory.createByWidgetClass( + i18nText("Fine-Design_Basic_Widget_Type_Date"), + "date", DateEditor.class); - public static final WidgetOption TREE = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_View_Tree"), - "/com/fr/design/images/buttonicon/widget/tree_16", TreeEditor.class); + public static final WidgetOption TREE = WidgetOptionFactory.createByWidgetClass( + i18nText("Fine-Design_Report_View_Tree"), + "tree", + TreeEditor.class); - public static final WidgetOption TREECOMBOBOX = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tree_ComboBox"), "/com/fr/design/images/buttonicon/widget/comboboxtree16", + public static final WidgetOption TREECOMBOBOX = WidgetOptionFactory.createByWidgetClass( + i18nText("Fine-Design_Report_Tree_ComboBox"), + "comboboxtree", TreeComboBoxEditor.class); public static final WidgetOption CHECKBOXGROUP = WidgetOptionFactory.createByWidgetClass( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Checkbox_Group"), "/com/fr/design/images/buttonicon/widget/checkbox_group_16", CheckBoxGroup.class); + i18nText("Fine-Design_Basic_Widget_Type_Checkbox_Group"), + "checkbox_group", + CheckBoxGroup.class); public static final WidgetOption RADIOGROUP = WidgetOptionFactory.createByWidgetClass( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Radio_Group"), "/com/fr/design/images/buttonicon/widget/button_group_16", + i18nText("Fine-Design_Basic_Widget_Type_Radio_Group"), + "button_group", RadioGroup.class); public static final WidgetOption NUMBEREDITOR = WidgetOptionFactory.createByWidgetClass( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Number"), "/com/fr/design/images/buttonicon/widget/number_field_16", NumberEditor.class); + i18nText("Fine-Design_Basic_Widget_Type_Number"), + "number_field", + NumberEditor.class); public static final WidgetOption LABEL = WidgetOptionFactory.createByWidgetClass( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Label"), "/com/fr/design/images/buttonicon/widget/label_16", + i18nText("Fine-Design_Basic_Widget_Type_Label"), + "label", Label.class); public static final WidgetOption BUTTON = WidgetOptionFactory.createByWidgetClass( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Button"), BaseUtils.readIcon("/com/fr/web/images/form/resources/button_16.png"), + i18nText("Fine-Design_Basic_Widget_Type_Button"), + "button", Button.class); public static final WidgetOption FREEBUTTON = WidgetOptionFactory.createByWidgetClass( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Button"), "/com/fr/design/images/buttonicon/widget/button_16", + i18nText("Fine-Design_Basic_Widget_Type_Button"), + "button", FreeButton.class); public static final WidgetOption MULTI_FILEEDITOR = WidgetOptionFactory.createByWidgetClass( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_File"), "/com/fr/design/images/buttonicon/widget/files_up", + i18nText("Fine-Design_Basic_Widget_Type_File"), + "files_up", MultiFileEditor.class); public static final WidgetOption COMBOBOX = WidgetOptionFactory.createByWidgetClass( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Combo_Box"), "/com/fr/design/images/buttonicon/widget/combo_box_16", + i18nText("Fine-Design_Basic_Widget_Type_Combo_Box"), + "combo_box", ComboBox.class); public static final WidgetOption COMBOCHECKBOX = WidgetOptionFactory.createByWidgetClass( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Combo_Checkbox"), "/com/fr/design/images/buttonicon/widget/combo_check_16", + i18nText("Fine-Design_Basic_Widget_Type_Combo_Checkbox"), + "combo_check", ComboCheckBox.class); public static final WidgetOption CHECKBOX = WidgetOptionFactory.createByWidgetClass( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Checkbox"), "/com/fr/design/images/buttonicon/widget/check_box_16", + i18nText("Fine-Design_Basic_Widget_Type_Checkbox"), + "check_box", CheckBox.class); public static final WidgetOption LIST = WidgetOptionFactory.createByWidgetClass( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_List"), BaseUtils.readIcon("/com/fr/web/images/form/resources/list_16.png"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_List"), + BaseUtils.readIcon("/com/fr/web/images/form/resources/list_16.png"), ListEditor.class); public static final WidgetOption TEXTEDITOR = WidgetOptionFactory.createByWidgetClass( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Text") - , "/com/fr/design/images/buttonicon/widget/text_field_16", + i18nText("Fine-Design_Basic_Widget_Type_Text"), + "text_field", TextEditor.class); public static final WidgetOption TEXTAREA = WidgetOptionFactory.createByWidgetClass( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Textarea"), "/com/fr/design/images/buttonicon/widget/text_area_16", + i18nText("Fine-Design_Basic_Widget_Type_Textarea"), + "text_area", TextArea.class); public static final WidgetOption PASSWORD = WidgetOptionFactory.createByWidgetClass( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Password"), - "/com/fr/design/images/buttonicon/widget/password_field_16", Password.class); + i18nText("Fine-Design_Basic_Widget_Type_Password"), + "password_field", Password.class); - public static final WidgetOption IFRAMEDITOR = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Form_Iframe"), BaseUtils.readIcon("/com/fr/web/images/form/resources/iframe_16.png"), + public static final WidgetOption IFRAMEDITOR = WidgetOptionFactory.createByWidgetClass( + i18nText("Fine-Design_Report_Form_Iframe"), + "iframe", IframeEditor.class); - public static final WidgetOption PICTURE = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Image"), IconUtils.readIcon("/com/fr/web/images/form/resources/picture_widget_16.png"), + public static final WidgetOption PICTURE = WidgetOptionFactory.createByWidgetClass( + i18nText("Fine-Design_Basic_Widget_Type_Image"), + "picture", PictureWidget.class); } diff --git a/designer-base/src/main/java/com/fr/design/gui/core/WidgetOptionFactory.java b/designer-base/src/main/java/com/fr/design/gui/core/WidgetOptionFactory.java index 8d290ac2a8..9834d995a2 100644 --- a/designer-base/src/main/java/com/fr/design/gui/core/WidgetOptionFactory.java +++ b/designer-base/src/main/java/com/fr/design/gui/core/WidgetOptionFactory.java @@ -1,5 +1,6 @@ package com.fr.design.gui.core; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseUtils; import com.fr.base.svg.IconUtils; import com.fr.form.ui.Widget; @@ -17,7 +18,7 @@ public class WidgetOptionFactory { } public static WidgetOption createByWidgetClass(String optionName, String resource, Class widgetClass) { - Icon optionIcon = IconUtils.readIcon(resource); + Icon optionIcon = resource.startsWith("/")? IconUtils.readIcon(resource):new LazyIcon(resource); return new CustomWidgetOption(optionName, optionIcon, widgetClass); } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java index 54944f2d30..bdb2989574 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java @@ -228,7 +228,7 @@ public class CenterRegionContainerPane extends JPanel { // 颜色,字体那些按钮的工具栏 toolbarPane.add(toolbarComponent = ad.resetToolBar(toolbarComponent, plus), BorderLayout.CENTER); setStyle(toolbarComponent, TOP_TOOLS); - toolbarComponent.setBorder(new ScaledEmptyBorder(0, 10, 10, 10)); + toolbarComponent.setBorder(new ScaledEmptyBorder(0, 10, 0, 10)); JPanel customNorthPane = strategy.customNorthPane(toolbarPane, plus); if (!isExist(customNorthPane)) { this.removeNorth(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDockPlus.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDockPlus.java index 4de9018ace..4c588009ea 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDockPlus.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDockPlus.java @@ -6,7 +6,6 @@ import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; import javax.swing.JComponent; -import javax.swing.JPanel; public interface ToolBarMenuDockPlus { /** @@ -35,7 +34,7 @@ public interface ToolBarMenuDockPlus { * * @return 表单工具栏 */ - JPanel[] toolbarPanes4Form(); + JComponent[] toolbarPanes4Form(); /** * 表单的工具按钮 diff --git a/designer-base/src/main/java/com/fr/design/parameter/ParameterDesignerProvider.java b/designer-base/src/main/java/com/fr/design/parameter/ParameterDesignerProvider.java index efafa7cb2e..c5dbd1ae84 100644 --- a/designer-base/src/main/java/com/fr/design/parameter/ParameterDesignerProvider.java +++ b/designer-base/src/main/java/com/fr/design/parameter/ParameterDesignerProvider.java @@ -54,7 +54,7 @@ public interface ParameterDesignerProvider { return 0; } - JPanel[] toolbarPanes4Form(); + JComponent[] toolbarPanes4Form(); JComponent[] toolBarButton4Form(); diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/button.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/button.svg new file mode 100644 index 0000000000..4bbdbe9cbb --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/button.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/button_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/button_disable.svg new file mode 100644 index 0000000000..37b41b3640 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/button_disable.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/button_group.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/button_group.svg new file mode 100644 index 0000000000..ed74e90966 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/button_group.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/button_group_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/button_group_disable.svg new file mode 100644 index 0000000000..c4c7f1d97f --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/button_group_disable.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/checkbox.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/checkbox.svg new file mode 100644 index 0000000000..bd379ea23d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/checkbox.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/checkbox_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/checkbox_disable.svg new file mode 100644 index 0000000000..be8f4bab16 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/checkbox_disable.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/checkbox_group.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/checkbox_group.svg new file mode 100644 index 0000000000..a06b362359 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/checkbox_group.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/checkbox_group_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/checkbox_group_disable.svg new file mode 100644 index 0000000000..caa279ab06 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/checkbox_group_disable.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/combo_box.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/combo_box.svg new file mode 100644 index 0000000000..2e7643d633 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/combo_box.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/combo_box_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/combo_box_disable.svg new file mode 100644 index 0000000000..96083244a6 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/combo_box_disable.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/combo_check.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/combo_check.svg new file mode 100644 index 0000000000..618338ab6c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/combo_check.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/combo_check_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/combo_check_disable.svg new file mode 100644 index 0000000000..4a0d769208 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/combo_check_disable.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/comboboxtree.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/comboboxtree.svg new file mode 100644 index 0000000000..e9fcf6aaf9 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/comboboxtree.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/comboboxtree_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/comboboxtree_disable.svg new file mode 100644 index 0000000000..1f928e1805 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/comboboxtree_disable.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/date.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/date.svg new file mode 100644 index 0000000000..9f3c24c5e8 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/date.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/date_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/date_disable.svg new file mode 100644 index 0000000000..b0d3e0d3cb --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/date_disable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/files_up.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/files_up.svg new file mode 100644 index 0000000000..0b8ff2b221 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/files_up.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/files_up_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/files_up_disable.svg new file mode 100644 index 0000000000..ed22586f86 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/files_up_disable.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/iframe.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/iframe.svg new file mode 100644 index 0000000000..bb08acb5bb --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/iframe.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/iframe_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/iframe_disable.svg new file mode 100644 index 0000000000..5c61541333 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/iframe_disable.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/label.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/label.svg new file mode 100644 index 0000000000..0cf19814a1 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/label.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/label_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/label_disable.svg new file mode 100644 index 0000000000..9090502566 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/label_disable.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/number_field.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/number_field.svg new file mode 100644 index 0000000000..20b147b1e7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/number_field.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/number_field_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/number_field_disable.svg new file mode 100644 index 0000000000..7c838a95cf --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/number_field_disable.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/password_field.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/password_field.svg new file mode 100644 index 0000000000..77c851a26b --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/password_field.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/password_field_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/password_field_disable.svg new file mode 100644 index 0000000000..281b7565e0 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/password_field_disable.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/picture.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/picture.svg new file mode 100644 index 0000000000..74ec505206 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/picture.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/picture_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/picture_disable.svg new file mode 100644 index 0000000000..3a35cfb7a0 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/picture_disable.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/preview.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/preview.svg new file mode 100644 index 0000000000..12dfadf802 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/preview.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/preview_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/preview_disable.svg new file mode 100644 index 0000000000..44841a7e29 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/preview_disable.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/prewidget.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/prewidget.svg new file mode 100644 index 0000000000..8bea108a5a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/prewidget.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/prewidget_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/prewidget_disable.svg new file mode 100644 index 0000000000..49cc4a0b8a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/prewidget_disable.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/tab.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/tab.svg new file mode 100644 index 0000000000..2ee4e3012d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/tab.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/tab_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/tab_disable.svg new file mode 100644 index 0000000000..db847114a9 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/tab_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/text_area.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/text_area.svg new file mode 100644 index 0000000000..5367bebf03 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/text_area.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/text_area_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/text_area_disable.svg new file mode 100644 index 0000000000..6120485025 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/text_area_disable.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/text_field.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/text_field.svg new file mode 100644 index 0000000000..cc3298da8c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/text_field.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/text_field_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/text_field_disable.svg new file mode 100644 index 0000000000..73d62a3439 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/text_field_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/tree.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/tree.svg new file mode 100644 index 0000000000..50b9ec8e46 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/tree.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/widget/tree_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/widget/tree_disable.svg new file mode 100644 index 0000000000..5c42bf7f4d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/widget/tree_disable.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/Storybook.java b/designer-base/src/test/java/com/fr/design/gui/storybook/Storybook.java index ee9f211b16..635b342c15 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/Storybook.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/Storybook.java @@ -143,12 +143,20 @@ public class Storybook { private static boolean isStory(String className) { try { Class aClass = Class.forName(COMPONENTS_PACKAGE + className); - return aClass.isAnnotationPresent(Story.class) || StoryBoard.class.isAssignableFrom(aClass); + return aClass.isAnnotationPresent(Story.class) + || StoryBoard.class.isAssignableFrom(aClass) + || isStoryboardByName(aClass); } catch (ClassNotFoundException e) { return false; } } + private static boolean isStoryboardByName(Class aClass) { + return aClass.getName().toLowerCase().contains("storyboard") + && !aClass.isMemberClass() + && !aClass.isAnonymousClass(); + } + /** * 应用主题 */ diff --git a/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java b/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java index 20f8203ace..d3321e8b14 100644 --- a/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java +++ b/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java @@ -726,8 +726,8 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP * * @return 工具栏面板 g */ - public JPanel[] toolbarPanes4Form() { - return new JPanel[]{FormParaPane.getInstance(this)}; + public JComponent[] toolbarPanes4Form() { + return new JComponent[]{FormParaPane.getInstance(this)}; } /** diff --git a/designer-form/src/main/java/com/fr/design/form/parameter/FormParaTargetMode.java b/designer-form/src/main/java/com/fr/design/form/parameter/FormParaTargetMode.java index 02ea653f2b..0169921bce 100644 --- a/designer-form/src/main/java/com/fr/design/form/parameter/FormParaTargetMode.java +++ b/designer-form/src/main/java/com/fr/design/form/parameter/FormParaTargetMode.java @@ -6,12 +6,12 @@ import com.fr.design.designer.properties.WidgetPropertyTable; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.core.WidgetOptionFactory; import com.fr.design.gui.itable.PropertyGroup; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.FormDesignerModeForSpecial; import com.fr.form.main.parameter.FormParameterUI; import com.fr.form.parameter.FormSubmitButton; - - import com.fr.form.ui.PageFixedRowComboBox; + import java.util.ArrayList; public class FormParaTargetMode extends FormDesignerModeForSpecial { @@ -27,10 +27,14 @@ public class FormParaTargetMode extends FormDesignerModeForSpecial implements TreeSelection }); - DesignerContext.getDesignerFrame().addDesignerOpenedListener(new DesignerOpenedListener() { - @Override - public void designerOpened() { - setToolbarButtons(); - } - }); + DesignerContext.getDesignerFrame().addDesignerOpenedListener(this::setToolbarButtons); } /** diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormParaPane.java b/designer-form/src/main/java/com/fr/design/mainframe/FormParaPane.java index 784a8ecf59..a683e3f7d4 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormParaPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormParaPane.java @@ -7,25 +7,24 @@ import com.fr.design.gui.core.UserDefinedWidgetOption; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.utils.gui.LayoutUtils; -import com.fr.form.ui.*; +import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.i18n.Toolkit; +import com.fr.form.ui.UserDefinedWidgetConfig; +import com.fr.form.ui.Widget; +import com.fr.form.ui.WidgetConfig; +import com.fr.form.ui.WidgetInfoConfig; 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 com.fr.stable.ArrayUtils; -import javax.swing.*; -import java.awt.*; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; +import java.util.List; /** * Created with IntelliJ IDEA. @@ -35,15 +34,13 @@ import java.util.Iterator; * To change this template use File | Settings | File Templates. */ -public class FormParaPane extends JPanel { - private static final int PANE_HEIGHT = 24; +public class FormParaPane extends UIToolbar { private static final int TOOLTIP_X = 5; - private static final int TOOLTIP_Y = 10; - private static Dimension originalSize; private static volatile FormParaPane THIS; - private java.util.List predifinedwidgeList = new ArrayList(); - private UIButton predefineButton; + private final List predifinedwidgeList = new ArrayList<>(); + private final UIButton predefineButton; + private final ArrayList componentsList4Para = new ArrayList<>(); private FormWidgetPopWindow predifinedWindow; @@ -57,41 +54,22 @@ public class FormParaPane extends JPanel { THIS = null; } - }, new PluginFilter() { - - @Override - public boolean accept(PluginContext context) { - - return context.contain(PluginModule.ExtraDesign); - } - }); + }, context -> context.contain(PluginModule.ExtraDesign)); } - public static final FormParaPane getInstance(FormDesigner designer) { - if(THIS == null) { + public static FormParaPane getInstance(FormDesigner designer) { + if (THIS == null) { THIS = new FormParaPane(); } THIS.designer = designer; THIS.setTarget(designer); - if (originalSize != null) { - THIS.setPreferredSize(originalSize); - } return THIS; } - private ArrayList componentsList4Para = new ArrayList(); - public FormParaPane() { - predefineButton = new UIButton(UIConstants.PRE_WIDGET_NORMAL_ICON) { - @Override - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.width = PANE_HEIGHT; - return dim; - } - }; + predefineButton = new UIButton(UIConstants.PRE_WIDGET_NORMAL_ICON); predefineButton.set4ToolbarButton(); - predefineButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_User_Defined_Widget_Config")); + predefineButton.setToolTipText(Toolkit.i18nText("Fine-Design_Basic_Widget_User_Defined_Widget_Config")); predefineButton.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { @@ -99,22 +77,10 @@ public class FormParaPane extends JPanel { predifinedWindow = new FormWidgetPopWindow(); } loadPredifinedWidget(); - predifinedWindow.showToolTip(predefineButton.getLocationOnScreen().x + predefineButton.getWidth() + TOOLTIP_X, predefineButton.getLocationOnScreen().y - TOOLTIP_Y, (WidgetOption[])predifinedwidgeList.toArray(new WidgetOption[predifinedwidgeList.size()])); - } - }); - setLayout(new FlowLayout(FlowLayout.LEFT)); - DesignerContext.getDesignerFrame().getCenterTemplateCardPane().addComponentListener(new ComponentAdapter() { - public void componentResized(ComponentEvent e) { - if (FormParaPane.this.getParent() != null) { - JPanel fother = (JPanel)FormParaPane.this.getParent(); - Dimension d = fother.getSize(); - int delta_wdith = 0; - for (int i = 0; i < fother.getComponentCount() - 1; i ++) { - delta_wdith += fother.getComponent(i).getWidth(); - } - setPreferredSize(new Dimension(d.width - delta_wdith, d.height)); - LayoutUtils.layoutContainer(fother); - } + predifinedWindow.showToolTip( + predefineButton.getLocationOnScreen().x + predefineButton.getWidth() + TOOLTIP_X, + predefineButton.getLocationOnScreen().y, + predifinedwidgeList.toArray(new WidgetOption[predifinedwidgeList.size()])); } }); initParaComponent(); @@ -132,9 +98,9 @@ public class FormParaPane extends JPanel { private void loadPredifinedWidget() { predifinedwidgeList.clear(); - if(designer != null) { + if (designer != null) { WidgetOption[] designerPre = designer.getDesignerMode().getPredefinedWidgetOptions(); - for(int i = 0; i < designerPre.length; i++) { + for (int i = 0; i < designerPre.length; i++) { predifinedwidgeList.add(designerPre[i]); } } @@ -150,7 +116,7 @@ public class FormParaPane extends JPanel { // ... continue; } - if (!XCreatorUtils.createXCreator(widget).canEnterIntoParaPane()){ + if (!XCreatorUtils.createXCreator(widget).canEnterIntoParaPane()) { //预定义控件工具栏这儿不显示工具栏中没有的预定义控件 continue; } @@ -172,17 +138,15 @@ public class FormParaPane extends JPanel { private void initParaButtons() { - if(componentsList4Para.isEmpty()) { + if (componentsList4Para.isEmpty()) { WidgetOption[] options = WidgetOption.getReportParaWidgetIntance(); - WidgetOption[] basicWidgetArray = (WidgetOption[]) ArrayUtils.addAll( + WidgetOption[] basicWidgetArray = ArrayUtils.addAll( options, ExtraDesignClassManager.getInstance().getParameterWidgetOptions() ); - for (WidgetOption no : basicWidgetArray) { - this.componentsList4Para.add(no); - } + Collections.addAll(this.componentsList4Para, basicWidgetArray); } } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormParaWidgetPane.java b/designer-form/src/main/java/com/fr/design/mainframe/FormParaWidgetPane.java index 57e49780cf..27df0600e5 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormParaWidgetPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormParaWidgetPane.java @@ -17,6 +17,7 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.imenu.UIPopupMenu; +import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.share.ComponentShareUtil; import com.fr.design.mainframe.share.ui.online.OnlineWidgetRepoPane; @@ -44,10 +45,6 @@ import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.SwingConstants; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; @@ -58,11 +55,15 @@ import java.awt.event.ComponentEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; /** * @author null */ -public class FormParaWidgetPane extends JPanel { +public class FormParaWidgetPane extends UIToolbar { private static FormParaWidgetPane THIS; private final static int BORDER = 5; private final static int WIDGET_WIDTHGAP = 4; diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormTargetMode.java b/designer-form/src/main/java/com/fr/design/mainframe/FormTargetMode.java index 948796f494..dcdff4e1fc 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormTargetMode.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormTargetMode.java @@ -1,15 +1,14 @@ package com.fr.design.mainframe; -import java.util.ArrayList; - - -import com.fr.base.svg.IconUtils; +import com.fr.design.designer.properties.WidgetPropertyTable; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.core.WidgetOptionFactory; import com.fr.design.gui.itable.PropertyGroup; -import com.fr.design.designer.properties.WidgetPropertyTable; +import com.fr.design.i18n.Toolkit; import com.fr.form.parameter.FormSubmitButton; +import java.util.ArrayList; + public class FormTargetMode extends FormDesignerModeForSpecial { @@ -22,8 +21,8 @@ public class FormTargetMode extends FormDesignerModeForSpecial { */ public WidgetOption[] getPredefinedWidgetOptions() { return new WidgetOption[]{ - WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Query_Button"), - "/com/fr/web/images/form/resources/preview_16", FormSubmitButton.class)}; + WidgetOptionFactory.createByWidgetClass(Toolkit.i18nText("Fine-Design_Form_Query_Button"), + "preview", FormSubmitButton.class)}; } public ArrayList createRootDesignerPropertyGroup() { diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormWidgetPopWindow.java b/designer-form/src/main/java/com/fr/design/mainframe/FormWidgetPopWindow.java index 7f1304d3a1..8a33aa3c0f 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormWidgetPopWindow.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormWidgetPopWindow.java @@ -1,10 +1,14 @@ package com.fr.design.mainframe; +import com.fr.design.gui.core.WidgetOption; +import com.fr.stable.os.OperatingSystem; + +import javax.swing.JPanel; +import javax.swing.JWindow; import java.awt.AWTEvent; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; -import java.awt.Graphics; import java.awt.Insets; import java.awt.LayoutManager; import java.awt.Point; @@ -12,137 +16,122 @@ import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.AWTEventListener; import java.awt.event.MouseEvent; -import javax.swing.JPanel; -import javax.swing.JWindow; -import com.fr.design.constants.UIConstants; -import com.fr.design.gui.core.WidgetOption; -import com.fr.stable.os.OperatingSystem; //august: public class FormWidgetPopWindow extends JWindow { - private WidgetOption[] options; - private EditorChoosePane pane; - public FormWidgetPopWindow() { - super(); - } - - private void initComp() { - if(pane != null) { - this.remove(pane); - } - pane = new EditorChoosePane(); - this.getContentPane().add(pane); - this.setSize(pane.getPreferredSize()); - } - - public void showToolTip(int xAbs, int yAbs, WidgetOption[] options) { - Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); - this.setLocation(xAbs, yAbs); - this.options = options; - initComp(); - this.setVisible(true); - this.doLayout(); - } - - private AWTEventListener awt = new AWTEventListener() { - public void eventDispatched(AWTEvent event) { - if (event instanceof MouseEvent) { - MouseEvent mv = (MouseEvent) event; - if (mv.getClickCount() > 0) { - hideWindow(mv); - } - } - } - }; - - private void hideWindow(MouseEvent mv){ - Point point = new Point((int) (mv.getLocationOnScreen().getX()), (int) mv.getLocationOnScreen().getY()); - if (OperatingSystem.isWindows()) { - if (!FormWidgetPopWindow.this.contains(point)) { - FormWidgetPopWindow.this.setVisible(false); - } - }else if(OperatingSystem.isMacos() || OperatingSystem.isLinux()){ - Dimension d = FormWidgetPopWindow.this.getSize(); - Point p = FormWidgetPopWindow.this.getLocation(); - Rectangle rect = new Rectangle(p, d); - if (!rect.contains(point)) { - FormWidgetPopWindow.this.setVisible(false); - } - } - } - - private class EditorChoosePane extends JPanel { - public EditorChoosePane() { - super(); - this.setLayout(new EditorLayout()); - this.initComponents(); - } - - @Override - public void paintComponent(Graphics g) { - Rectangle r = this.getBounds(); - g.setColor(UIConstants.NORMAL_BACKGROUND); - g.fillRoundRect(r.x, r.y, r.width, r.height, UIConstants.ARC, UIConstants.ARC); - g.setColor(UIConstants.LINE_COLOR); - g.drawRoundRect(r.x, r.y, r.width - 1, r.height - 1, UIConstants.ARC, UIConstants.ARC); - } - - protected void initComponents() { - for (WidgetOption o : options) { - ToolBarButton toolBarButton = new ToolBarButton(o); - this.add(toolBarButton); - } - } - } - - private static class EditorLayout implements LayoutManager { - - int top = 4; - int left = 4; - int right = 4; - int bottom = 4; - int hgap = 5; - int vgap = 4; - int maxLine = 8; - - @Override - public void addLayoutComponent(String name, Component comp) { - - } - - @Override - public void layoutContainer(Container target) { - synchronized (target.getTreeLock()) { - Insets insets = target.getInsets(); - int nmembers = target.getComponentCount(); - for (int i = 0; i < nmembers; i++) { - Component m = target.getComponent(i); - if (m.isVisible()) { - Dimension d = m.getPreferredSize(); - m.setBounds(insets.left + left + i % maxLine * (hgap + d.width), top + insets.top + i / maxLine - * (vgap + d.height), d.width, d.height); - } - } - } - } - - @Override - public Dimension minimumLayoutSize(Container parent) { - return new Dimension(0, 0); - } - - @Override - public Dimension preferredLayoutSize(Container parent) { - Insets insets = parent.getInsets(); - int nmembers = parent.getComponentCount(); - return new Dimension(maxLine * 28 + insets.left + insets.right + right + left, (nmembers / maxLine + 1) - * 24 + insets.top + insets.bottom + top + bottom); - } - - @Override - public void removeLayoutComponent(Component comp) { - - } - - } + private WidgetOption[] options; + private EditorChoosePane pane; + + public FormWidgetPopWindow() { + super(); + } + + private void initComp() { + if (pane != null) { + this.remove(pane); + } + pane = new EditorChoosePane(); + this.getContentPane().add(pane); + this.setSize(pane.getPreferredSize()); + } + + public void showToolTip(int xAbs, int yAbs, WidgetOption[] options) { + Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); + this.setLocation(xAbs, yAbs); + this.options = options; + initComp(); + this.setVisible(true); + this.doLayout(); + } + + private final AWTEventListener awt = event -> { + if (event instanceof MouseEvent) { + MouseEvent mv = (MouseEvent) event; + if (mv.getClickCount() > 0) { + hideWindow(mv); + } + } + }; + + private void hideWindow(MouseEvent mv) { + Point point = new Point((int) (mv.getLocationOnScreen().getX()), (int) mv.getLocationOnScreen().getY()); + if (OperatingSystem.isWindows()) { + if (!FormWidgetPopWindow.this.contains(point)) { + FormWidgetPopWindow.this.setVisible(false); + } + } else if (OperatingSystem.isMacos() || OperatingSystem.isLinux()) { + Dimension d = FormWidgetPopWindow.this.getSize(); + Point p = FormWidgetPopWindow.this.getLocation(); + Rectangle rect = new Rectangle(p, d); + if (!rect.contains(point)) { + FormWidgetPopWindow.this.setVisible(false); + } + } + } + + private class EditorChoosePane extends JPanel { + public EditorChoosePane() { + super(); + this.setLayout(new EditorLayout()); + this.initComponents(); + } + + protected void initComponents() { + for (WidgetOption o : options) { + ToolBarButton toolBarButton = new ToolBarButton(o); + this.add(toolBarButton); + } + } + } + + private static class EditorLayout implements LayoutManager { + + int top = 4; + int left = 4; + int right = 4; + int bottom = 4; + int hgap = 5; + int vgap = 4; + int maxLine = 8; + + @Override + public void addLayoutComponent(String name, Component comp) { + + } + + @Override + public void layoutContainer(Container target) { + synchronized (target.getTreeLock()) { + Insets insets = target.getInsets(); + int nmembers = target.getComponentCount(); + for (int i = 0; i < nmembers; i++) { + Component m = target.getComponent(i); + if (m.isVisible()) { + Dimension d = m.getPreferredSize(); + m.setBounds(insets.left + left + i % maxLine * (hgap + d.width), top + insets.top + i / maxLine + * (vgap + d.height), d.width, d.height); + } + } + } + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return new Dimension(0, 0); + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + Insets insets = parent.getInsets(); + int nmembers = parent.getComponentCount(); + return new Dimension(maxLine * 28 + insets.left + insets.right + right + left, (nmembers / maxLine + 1) + * 24 + insets.top + insets.bottom + top + bottom); + } + + @Override + public void removeLayoutComponent(Component comp) { + + } + + } } \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java index 34603c59e0..6f231c5a10 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java @@ -759,10 +759,10 @@ public class JForm extends JTemplate implements BaseJForm= 2) { - } - } - - - public void mousePressed(MouseEvent e) { - lastPressEvent = e; - } - - public void mouseReleased(MouseEvent e) { - } - - @Override - public void mouseDragged(MouseEvent e) { - if (!isEnabled()) { - return; - } - - if (DesignerMode.isAuthorityEditing()) { - return; - } - if (lastPressEvent == null) { - return; - } - getModel().setPressed(false); - getModel().setSelected(false); - getModel().setRollover(false); - - Object source = e.getSource(); - Widget creatorSource = null; - if (source instanceof ToolBarButton) { - ToolBarButton no = (ToolBarButton) e.getSource(); - if (no == null) { - return; - } - creatorSource = no.getNameOption().createWidget(); - } - if (creatorSource != null) { - XCreator xCreator = XCreatorUtils.createThemedXCreator(creatorSource); - WidgetToolBarPane.getTarget().startDraggingNewWidget(xCreator, lastPressEvent, e); - FormDesignerUtils.addWidgetProcessInfo(xCreator.toData()); - lastPressEvent = null; - this.setBorder(null); - } - } - - @Override - public void mouseMoved(MouseEvent e) { - } - - public class DragAndDropDragGestureListener extends DragSourceAdapter implements DragGestureListener { - private DragSource source; - - public DragAndDropDragGestureListener(ToolBarButton tt, int actions) { - source = new DragSource(); - source.createDefaultDragGestureRecognizer(tt, actions, this); - } - - public void dragGestureRecognized(DragGestureEvent dge) { - ToolBarButton toolBarButton = (ToolBarButton) dge.getComponent(); - if (toolBarButton != null) { - Widget widget = toolBarButton.getNameOption().createWidget(); - DragAndDropTransferable dragAndDropTransferable = new DragAndDropTransferable(widget); - dge.startDrag(DragSource.DefaultCopyDrop, dragAndDropTransferable, this); - } - } - - @Override - public void dragEnter(DragSourceDragEvent dragSourceDragEvent) { - - } - } - - public class DragAndDropTransferable implements Transferable { - private Widget widget; - - public DragAndDropTransferable(Widget widget) { - this.widget = widget; - } - - DataFlavor[] flavors = {new DataFlavor(Widget.class, "Widget")}; - - public DataFlavor[] getTransferDataFlavors() { - return flavors; - } - - public boolean isDataFlavorSupported(DataFlavor flavor) { - for (DataFlavor df : flavors) { - if (ComparatorUtils.equals(df, flavor)) { - return true; - } - } - return false; - } - - public Object getTransferData(DataFlavor df) throws UnsupportedFlavorException, IOException { - return widget; - } - } - - @Override - public void mouseEntered(MouseEvent e) { - - - } - - @Override - public void mouseExited(MouseEvent e) { - } - - @Override - public ButtonUI getUI() { - return new UIForbiddenButtonUI(); - } - - @Override - public boolean isEnabled() { - JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - boolean enable = true; - if (template != null) { - enable = super.isEnabled() && template.checkEnable(); - } - return enable; - } + private WidgetOption no; + private MouseEvent lastPressEvent; + + public ToolBarButton(WidgetOption no) { + super(no.optionIcon()); + this.no = no; + this.addMouseListener(this); + this.addMouseMotionListener(this); + this.setToolTipText(no.optionName()); + this.setRequestFocusEnabled(false); + putClientProperty(FineClientProperties.BUTTON_TYPE, FineClientProperties.BUTTON_TYPE_TOOLBAR_BUTTON); + // FormEditor那边用的DND的复杂方式 这边还必须也用,不然就方便多了 + new DragAndDropDragGestureListener(this, DnDConstants.ACTION_COPY_OR_MOVE); + } + + public WidgetOption getNameOption() { + return this.no; + } + + public void setNameOption(WidgetOption no) { + this.no = no; + } + + + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() >= 2) { + } + } + + + public void mousePressed(MouseEvent e) { + lastPressEvent = e; + } + + public void mouseReleased(MouseEvent e) { + } + + @Override + public void mouseDragged(MouseEvent e) { + if (!isEnabled()) { + return; + } + + if (DesignerMode.isAuthorityEditing()) { + return; + } + if (lastPressEvent == null) { + return; + } + getModel().setPressed(false); + getModel().setSelected(false); + getModel().setRollover(false); + + Object source = e.getSource(); + Widget creatorSource = null; + if (source instanceof ToolBarButton) { + ToolBarButton no = (ToolBarButton) e.getSource(); + if (no == null) { + return; + } + creatorSource = no.getNameOption().createWidget(); + } + if (creatorSource != null) { + XCreator xCreator = XCreatorUtils.createThemedXCreator(creatorSource); + WidgetToolBarPane.getTarget().startDraggingNewWidget(xCreator, lastPressEvent, e); + FormDesignerUtils.addWidgetProcessInfo(xCreator.toData()); + lastPressEvent = null; + } + } + + @Override + public void mouseMoved(MouseEvent e) { + } + + public class DragAndDropDragGestureListener extends DragSourceAdapter implements DragGestureListener { + private DragSource source; + + public DragAndDropDragGestureListener(ToolBarButton tt, int actions) { + source = new DragSource(); + source.createDefaultDragGestureRecognizer(tt, actions, this); + } + + public void dragGestureRecognized(DragGestureEvent dge) { + ToolBarButton toolBarButton = (ToolBarButton) dge.getComponent(); + if (toolBarButton != null) { + Widget widget = toolBarButton.getNameOption().createWidget(); + DragAndDropTransferable dragAndDropTransferable = new DragAndDropTransferable(widget); + dge.startDrag(DragSource.DefaultCopyDrop, dragAndDropTransferable, this); + } + } + + @Override + public void dragEnter(DragSourceDragEvent dragSourceDragEvent) { + + } + } + + public class DragAndDropTransferable implements Transferable { + private Widget widget; + + public DragAndDropTransferable(Widget widget) { + this.widget = widget; + } + + DataFlavor[] flavors = {new DataFlavor(Widget.class, "Widget")}; + + public DataFlavor[] getTransferDataFlavors() { + return flavors; + } + + public boolean isDataFlavorSupported(DataFlavor flavor) { + for (DataFlavor df : flavors) { + if (ComparatorUtils.equals(df, flavor)) { + return true; + } + } + return false; + } + + public Object getTransferData(DataFlavor df) throws UnsupportedFlavorException, IOException { + return widget; + } + } + + @Override + public void mouseEntered(MouseEvent e) { + + + } + + @Override + public void mouseExited(MouseEvent e) { + } + + @Override + public boolean isEnabled() { + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + boolean enable = true; + if (template != null) { + enable = super.isEnabled() && template.checkEnable(); + } + return enable; + } } 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 d82bda4659..f2f47935c7 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 @@ -928,7 +928,7 @@ public class JWorkBook extends JTemplate { * @return 表单工具栏 */ @Override - public JPanel[] toolbarPanes4Form() { + public JComponent[] toolbarPanes4Form() { if (centerPane.isUpEditMode() && hasParameterPane()) { return parameterPane.toolbarPanes4Form(); } diff --git a/designer-realize/src/main/java/com/fr/design/parameter/ParameterDefinitePane.java b/designer-realize/src/main/java/com/fr/design/parameter/ParameterDefinitePane.java index 049761417d..75ece02086 100644 --- a/designer-realize/src/main/java/com/fr/design/parameter/ParameterDefinitePane.java +++ b/designer-realize/src/main/java/com/fr/design/parameter/ParameterDefinitePane.java @@ -541,7 +541,7 @@ public class ParameterDefinitePane extends JPanel implements ToolBarMenuDockPlus * * @return 返回工具 */ - public JPanel[] toolbarPanes4Form() { + public JComponent[] toolbarPanes4Form() { return paraDesignEditor.toolbarPanes4Form(); } diff --git a/designer-realize/src/main/java/com/fr/start/MainDesigner.java b/designer-realize/src/main/java/com/fr/start/MainDesigner.java index 91c5d8e542..2f63cb62b3 100644 --- a/designer-realize/src/main/java/com/fr/start/MainDesigner.java +++ b/designer-realize/src/main/java/com/fr/start/MainDesigner.java @@ -406,20 +406,21 @@ public class MainDesigner extends BaseDesigner { } } - if (plus.toolbarPanes4Form().length == 0) { - return super.resetToolBar(toolbarComponent, plus); - } else { - JPanel toolbarPane; - toolbarPane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, TOOLBARPANEVGAP)); - Dimension dim = new Dimension(); - dim.height = plus.getToolBarHeight(); - toolbarPane.setPreferredSize(dim); - toolbarPane.setFocusable(true); - JPanel[] paneArray = plus.toolbarPanes4Form(); - for (int i = 0; i < paneArray.length; i++) { - toolbarPane.add(paneArray[i]); + switch (plus.toolbarPanes4Form().length) { + case 0: + return super.resetToolBar(toolbarComponent, plus); + case 1: + return plus.toolbarPanes4Form()[0]; + default: { + JPanel toolbarPane; + toolbarPane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); + toolbarPane.setFocusable(true); + JComponent[] paneArray = plus.toolbarPanes4Form(); + for (JComponent component : paneArray) { + toolbarPane.add(component); + } + return toolbarPane; } - return toolbarPane; } } From 5f3b2401aee651de9d4ee16c7596ea4a50e7ee1e Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 9 Jan 2024 19:59:28 +0800 Subject: [PATCH 096/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parameter/ParameterDesignerProvider.java | 5 +++ .../com/fr/design/mainframe/FormParaPane.java | 13 +++--- .../design/mainframe/FormParaWidgetPane.java | 4 ++ .../design/mainframe/FormWidgetPopWindow.java | 3 ++ .../fr/design/mainframe/ToolBarButton.java | 43 +++++++++++++------ 5 files changed, 51 insertions(+), 17 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/parameter/ParameterDesignerProvider.java b/designer-base/src/main/java/com/fr/design/parameter/ParameterDesignerProvider.java index c5dbd1ae84..12f4707032 100644 --- a/designer-base/src/main/java/com/fr/design/parameter/ParameterDesignerProvider.java +++ b/designer-base/src/main/java/com/fr/design/parameter/ParameterDesignerProvider.java @@ -54,6 +54,11 @@ public interface ParameterDesignerProvider { return 0; } + /** + * 参数界面工具栏 + * + * @return 工具栏组件 + */ JComponent[] toolbarPanes4Form(); JComponent[] toolBarButton4Form(); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormParaPane.java b/designer-form/src/main/java/com/fr/design/mainframe/FormParaPane.java index a683e3f7d4..8677b27096 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormParaPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormParaPane.java @@ -27,13 +27,13 @@ import java.util.Iterator; import java.util.List; /** - * Created with IntelliJ IDEA. - * User: zx - * Date: 14-7-8 - * Time: 上午10:09 * To change this template use File | Settings | File Templates. + * + * @author zx + * @since 7.0 + * Created on 14-7-8 + * Time: 上午10:09 */ - public class FormParaPane extends UIToolbar { private static final int TOOLTIP_X = 5; @@ -57,6 +57,9 @@ public class FormParaPane extends UIToolbar { }, context -> context.contain(PluginModule.ExtraDesign)); } + /** + * 单例。不合适,下次重构 + */ public static FormParaPane getInstance(FormDesigner designer) { if (THIS == null) { THIS = new FormParaPane(); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormParaWidgetPane.java b/designer-form/src/main/java/com/fr/design/mainframe/FormParaWidgetPane.java index 27df0600e5..33eae2a9f2 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormParaWidgetPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormParaWidgetPane.java @@ -61,7 +61,11 @@ import java.util.Iterator; import java.util.List; /** + * 参数面板控件工具栏 + * * @author null + * @since 7.0 + * Created on 2008 */ public class FormParaWidgetPane extends UIToolbar { private static FormParaWidgetPane THIS; diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormWidgetPopWindow.java b/designer-form/src/main/java/com/fr/design/mainframe/FormWidgetPopWindow.java index 8a33aa3c0f..e29548e57b 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormWidgetPopWindow.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormWidgetPopWindow.java @@ -35,6 +35,9 @@ public class FormWidgetPopWindow extends JWindow { this.setSize(pane.getPreferredSize()); } + /** + * 展示提示 + */ public void showToolTip(int xAbs, int yAbs, WidgetOption[] options) { Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); this.setLocation(xAbs, yAbs); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/ToolBarButton.java b/designer-form/src/main/java/com/fr/design/mainframe/ToolBarButton.java index d3ca5b0423..6229d3c6a0 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/ToolBarButton.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/ToolBarButton.java @@ -19,15 +19,18 @@ import java.awt.dnd.DragGestureEvent; import java.awt.dnd.DragGestureListener; import java.awt.dnd.DragSource; import java.awt.dnd.DragSourceAdapter; -import java.awt.dnd.DragSourceDragEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.io.IOException; import java.io.Serializable; -/* - *august: 控件按钮 +/** + * 控件按钮 + * + * @author august + * @since 7.0 + * Created on 2008 */ public class ToolBarButton extends UIButton implements MouseListener, MouseMotionListener, Serializable { @@ -46,25 +49,36 @@ public class ToolBarButton extends UIButton implements MouseListener, MouseMotio new DragAndDropDragGestureListener(this, DnDConstants.ACTION_COPY_OR_MOVE); } + /** + * 获取控件配置 + * + * @return 控件配置 + */ public WidgetOption getNameOption() { return this.no; } + /** + * 设置控件配置 + * + * @param no 控件配置 + */ public void setNameOption(WidgetOption no) { this.no = no; } + @Override public void mouseClicked(MouseEvent e) { - if (e.getClickCount() >= 2) { - } - } + } + @Override public void mousePressed(MouseEvent e) { lastPressEvent = e; } + @Override public void mouseReleased(MouseEvent e) { } @@ -105,7 +119,10 @@ public class ToolBarButton extends UIButton implements MouseListener, MouseMotio public void mouseMoved(MouseEvent e) { } - public class DragAndDropDragGestureListener extends DragSourceAdapter implements DragGestureListener { + /** + * 拖放拖动手势侦听器 + */ + public static class DragAndDropDragGestureListener extends DragSourceAdapter implements DragGestureListener { private DragSource source; public DragAndDropDragGestureListener(ToolBarButton tt, int actions) { @@ -113,6 +130,7 @@ public class ToolBarButton extends UIButton implements MouseListener, MouseMotio source.createDefaultDragGestureRecognizer(tt, actions, this); } + @Override public void dragGestureRecognized(DragGestureEvent dge) { ToolBarButton toolBarButton = (ToolBarButton) dge.getComponent(); if (toolBarButton != null) { @@ -122,13 +140,12 @@ public class ToolBarButton extends UIButton implements MouseListener, MouseMotio } } - @Override - public void dragEnter(DragSourceDragEvent dragSourceDragEvent) { - - } } - public class DragAndDropTransferable implements Transferable { + /** + * 拖放转换器 + */ + public static class DragAndDropTransferable implements Transferable { private Widget widget; public DragAndDropTransferable(Widget widget) { @@ -137,10 +154,12 @@ public class ToolBarButton extends UIButton implements MouseListener, MouseMotio DataFlavor[] flavors = {new DataFlavor(Widget.class, "Widget")}; + @Override public DataFlavor[] getTransferDataFlavors() { return flavors; } + @Override public boolean isDataFlavorSupported(DataFlavor flavor) { for (DataFlavor df : flavors) { if (ComparatorUtils.equals(df, flavor)) { From 7f52c27bad610e9645d341ed11e2b9ea3adf47e8 Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 9 Jan 2024 20:19:29 +0800 Subject: [PATCH 097/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E4=BB=A3=E7=A0=81=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-realize/src/main/java/com/fr/start/MainDesigner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/start/MainDesigner.java b/designer-realize/src/main/java/com/fr/start/MainDesigner.java index 8c93c64fb8..a49e5ba721 100644 --- a/designer-realize/src/main/java/com/fr/start/MainDesigner.java +++ b/designer-realize/src/main/java/com/fr/start/MainDesigner.java @@ -15,7 +15,6 @@ import com.fr.design.actions.server.WidgetManagerAction; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.carton.SwitchForSwingChecker; import com.fr.design.constants.DesignerLaunchStatus; -import com.fr.design.constants.UIConstants; import com.fr.design.deeplink.DeepLinkManager; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; @@ -85,6 +84,7 @@ import java.awt.Dimension; import java.awt.FlowLayout; import java.io.File; import java.util.ArrayList; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; From 638f66435ebb9ef8342d3ecda92256e06cdea35e Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 9 Jan 2024 20:45:27 +0800 Subject: [PATCH 098/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=9B=BE=E6=A0=87=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 1a6b4efd0e..2fcd182b14 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -243,7 +243,30 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("cellElementAttr", "com/fine/theme/icon/cell/cellElementAttr.svg", true), new SvgIconSource("move", "com/fine/theme/icon/filetree/move.svg", true), new SvgIconSource("monochrome_copy", "com/fine/theme/icon/filetree/monochrome_copy.svg", true), - new SvgIconSource("monochrome_paste", "com/fine/theme/icon/filetree/monochrome_paste.svg", true) + new SvgIconSource("monochrome_paste", "com/fine/theme/icon/filetree/monochrome_paste.svg", true), + + // 控件 + new SvgIconSource("button", "com/fine/theme/icon/widget/button.svg", true), + new SvgIconSource("button_group", "com/fine/theme/icon/widget/button_group.svg", true), + new SvgIconSource("check_box", "com/fine/theme/icon/widget/checkbox.svg", true), + new SvgIconSource("checkbox_group", "com/fine/theme/icon/widget/checkbox_group.svg", true), + new SvgIconSource("combo_box", "com/fine/theme/icon/widget/combo_box.svg", true), + new SvgIconSource("combo_check", "com/fine/theme/icon/widget/combo_check.svg", true), + new SvgIconSource("comboboxtree", "com/fine/theme/icon/widget/comboboxtree.svg", true), + new SvgIconSource("date", "com/fine/theme/icon/widget/date.svg", true), + new SvgIconSource("files_up", "com/fine/theme/icon/widget/files_up.svg", true), + new SvgIconSource("iframe", "com/fine/theme/icon/widget/iframe.svg", true), + new SvgIconSource("label", "com/fine/theme/icon/widget/label.svg", true), + new SvgIconSource("number_field", "com/fine/theme/icon/widget/number_field.svg", true), + new SvgIconSource("password_field", "com/fine/theme/icon/widget/password_field.svg", true), + new SvgIconSource("picture", "com/fine/theme/icon/widget/picture.svg", true), + new SvgIconSource("preview", "com/fine/theme/icon/widget/preview.svg", true), + new SvgIconSource("prewidget", "com/fine/theme/icon/widget/prewidget.svg", true), + new SvgIconSource("tab", "com/fine/theme/icon/widget/tab.svg", true), + new SvgIconSource("text_area", "com/fine/theme/icon/widget/text_area.svg", true), + new SvgIconSource("text_field", "com/fine/theme/icon/widget/text_field.svg", true), + new SvgIconSource("tree", "com/fine/theme/icon/widget/tree.svg", true) + ); } } From 397ba58db728d70f75e4f69732606cad3791f574 Mon Sep 17 00:00:00 2001 From: jinsihou <540097546@qq.com> Date: Tue, 9 Jan 2024 23:17:06 +0800 Subject: [PATCH 099/302] =?UTF-8?q?REPORT-99485=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=99=BD=E5=8C=96=E5=9B=BE=E6=A0=87=E9=AB=98DPI=E4=B8=8B?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=B8=8D=E6=AD=A3=E7=A1=AE=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fine/theme/icon/IconManager.java | 49 +++++++++-------- .../java/com/fine/theme/icon/IconType.java | 23 ++++++++ .../java/com/fine/theme/icon/LazyIcon.java | 29 +++++++--- .../java/com/fine/theme/icon/svg/SvgIcon.java | 53 ++++++++----------- .../fine/theme/light/ui/FineLightIconSet.java | 6 +-- .../components/ButtonGroupStoryBoard.java | 23 ++++---- 6 files changed, 110 insertions(+), 73 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/icon/IconType.java diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconManager.java b/designer-base/src/main/java/com/fine/theme/icon/IconManager.java index 5483ba7450..6f03eacc6a 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/IconManager.java +++ b/designer-base/src/main/java/com/fine/theme/icon/IconManager.java @@ -23,11 +23,11 @@ import java.util.HashMap; @Immutable public class IconManager { - public static boolean initialized = false; - public static ArrayList iconSets = new ArrayList<>(2); - public static HashMap> cache = new HashMap<>(64); - public static HashMap> disableCache = new HashMap<>(64); - public static HashMap> whiteCache = new HashMap<>(32); + private static final ArrayList ICON_SETS = new ArrayList<>(2); + + private static final HashMap> CACHE = new HashMap<>(64); + private static final HashMap> DISABLE_CACHE = new HashMap<>(64); + private static final HashMap> WHITE_CACHE = new HashMap<>(32); /** @@ -37,7 +37,7 @@ public class IconManager { * @return 图标集 */ public static IconSet getSet(String id) { - for (IconSet set : iconSets) { + for (IconSet set : ICON_SETS) { if (set.getId().equals(id)) { return set; } @@ -51,8 +51,8 @@ public class IconManager { * @param set 图标集 */ public static void addSet(@NotNull IconSet set) { - if (!iconSets.contains(set)) { - iconSets.add(set); + if (!ICON_SETS.contains(set)) { + ICON_SETS.add(set); // 清理可能来自其他图集相同名称图标 clearIconSetCache(set); } else { @@ -85,14 +85,14 @@ public class IconManager { */ @NotNull public static I getWhiteIcon(String id) { - final WeakReference reference = whiteCache.get(id); + final WeakReference reference = WHITE_CACHE.get(id); I icon = reference != null ? (I) reference.get() : null; if (icon == null) { - for (IconSet set : iconSets) { + for (IconSet set : ICON_SETS) { Icon f = set.findWhiteIcon(id); if (f != null) { icon = (I) f; - whiteCache.put(id, new WeakReference<>(icon)); + WHITE_CACHE.put(id, new WeakReference<>(icon)); } } } @@ -120,14 +120,14 @@ public class IconManager { @Nullable private static I findDisableIcon(String id) { - final WeakReference reference = disableCache.get(id); + final WeakReference reference = DISABLE_CACHE.get(id); I icon = reference != null ? (I) reference.get() : null; if (icon == null) { - for (IconSet set : iconSets) { + for (IconSet set : ICON_SETS) { Icon f = set.findDisableIcon(id); if (f != null) { icon = (I) f; - disableCache.put(id, new WeakReference<>(icon)); + DISABLE_CACHE.put(id, new WeakReference<>(icon)); } } } @@ -136,14 +136,14 @@ public class IconManager { @Nullable private static I findIcon(String id) { - final WeakReference reference = cache.get(id); + final WeakReference reference = CACHE.get(id); I icon = reference != null ? (I) reference.get() : null; if (icon == null) { - for (IconSet set : iconSets) { + for (IconSet set : ICON_SETS) { Icon f = set.findIcon(id); if (f != null) { icon = (I) f; - cache.put(id, new WeakReference<>(icon)); + CACHE.put(id, new WeakReference<>(icon)); } } } @@ -154,22 +154,25 @@ public class IconManager { * 清理所有缓存 */ public static void clearCache() { - cache.clear(); - disableCache.clear(); + CACHE.clear(); + DISABLE_CACHE.clear(); + WHITE_CACHE.clear(); } /** * 清理图标缓存 */ public static void clearIconCache(String id) { - cache.remove(id); - disableCache.remove(id); + CACHE.remove(id); + DISABLE_CACHE.remove(id); + WHITE_CACHE.clear(); } private static void clearIconSetCache(@NotNull IconSet set) { for (String id : set.getIds()) { - cache.remove(id); - disableCache.remove(id); + CACHE.remove(id); + DISABLE_CACHE.remove(id); + WHITE_CACHE.remove(id); } } } diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconType.java b/designer-base/src/main/java/com/fine/theme/icon/IconType.java new file mode 100644 index 0000000000..1f89331b3d --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/IconType.java @@ -0,0 +1,23 @@ +package com.fine.theme.icon; + +/** + * 图标类型 + * + * @author vito + * @since 11.0 + * Created on 2024/01/09 + */ +public enum IconType { + /** + * 灰化图 + */ + disable, + /** + * 白化图,用于反白场景 + */ + white, + /** + * 原始图 + */ + normal +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java b/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java index f0e7fdcc5f..0032ce258f 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; import javax.swing.Icon; import java.awt.Component; import java.awt.Graphics; +import java.util.StringJoiner; /** * 懒加载图标 @@ -19,8 +20,16 @@ public class LazyIcon implements Identifiable, DisabledIcon, WhiteIcon, Icon { @NotNull private final String id; + private final IconType type; + public LazyIcon(@NotNull final String id) { this.id = id; + this.type = IconType.normal; + } + + private LazyIcon(@NotNull final String id, IconType type) { + this.id = id; + this.type = type; } @@ -48,7 +57,14 @@ public class LazyIcon implements Identifiable, DisabledIcon, WhiteIcon, Icon { @NotNull public I getIcon() { - return IconManager.getIcon(getId()); + switch (type) { + case white: + return IconManager.getWhiteIcon(getId()); + case disable: + return IconManager.getDisableIcon(getId()); + default: + return IconManager.getIcon(getId()); + } } /** @@ -59,7 +75,7 @@ public class LazyIcon implements Identifiable, DisabledIcon, WhiteIcon, Icon { @NotNull @Override public Icon disabled() { - return IconManager.getDisableIcon(getId()); + return new LazyIcon(getId(), IconType.disable); } /** @@ -70,14 +86,15 @@ public class LazyIcon implements Identifiable, DisabledIcon, WhiteIcon, Icon { @NotNull @Override public Icon white() { - return IconManager.getWhiteIcon(getId()); + return new LazyIcon(getId(), IconType.white); } - @NotNull @Override public String toString() { - return getClass().getCanonicalName() + "[id=" + getId() + "]"; - + return new StringJoiner(", ", LazyIcon.class.getSimpleName() + "[", "]") + .add("id='" + id + "'") + .add("type=" + type) + .toString(); } } diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java index a10e3105ef..66b062e2e9 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java @@ -3,6 +3,7 @@ package com.fine.theme.icon.svg; import com.fine.theme.icon.DisabledIcon; import com.fine.theme.icon.GraphicsFilter; import com.fine.theme.icon.IconResource; +import com.fine.theme.icon.IconType; import com.fine.theme.icon.WhiteIcon; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.ui.FlatUIUtils; @@ -42,41 +43,28 @@ import static com.fine.theme.utils.FineUIScale.scale; @Immutable public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { - public enum Type { - /** - * 灰化图 - */ - disable, - /** - * 白化图,用于反白场景 - */ - white, - /** - * 原始效果图 - */ - origin - } - private final Dimension size; + private final Dimension scaleSize; private final IconResource resource; - private final Type type; + private final IconType type; - private final NullableLazyValue svgDocument = NullableLazyValue.createValue(() -> load(Type.origin)); - private final NullableLazyValue whiteSvgDocument = NullableLazyValue.createValue(() -> load(Type.white)); + private final NullableLazyValue svgDocument = NullableLazyValue.createValue(() -> load(IconType.normal)); + private final NullableLazyValue whiteSvgDocument = NullableLazyValue.createValue(() -> load(IconType.white)); public SvgIcon(IconResource resource, Dimension size) { - this(resource, size, Type.origin); + this(resource, size, IconType.normal); } - public SvgIcon(IconResource resource, Dimension size, Type type) { + public SvgIcon(IconResource resource, Dimension size, IconType type) { this.resource = resource; + this.size = size; // 根据dpi进行缩放 - this.size = scale(size); + this.scaleSize = scale(size); this.type = type; } public SvgIcon(IconResource resource, int side) { - this(resource, new Dimension(side, side), Type.origin); + this(resource, new Dimension(side, side), IconType.normal); } /** @@ -85,7 +73,7 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { */ @Override public void paintIcon(Component c, Graphics g, int x, int y) { - if (type == Type.disable) { + if (type == IconType.disable) { g = grayGraphics(g); } Object[] oldRenderingHints = FlatUIUtils.setRenderingHints(g); @@ -104,22 +92,22 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { @Override public int getIconWidth() { - return size.width; + return scaleSize.width; } @Override public int getIconHeight() { - return size.height; + return scaleSize.height; } private void render(Component c, Graphics g, int x, int y) { try { - if (type == Type.white) { + if (type == IconType.white) { Objects.requireNonNull(whiteSvgDocument.getValue()) - .render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, size.width, size.height)); + .render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, scaleSize.width, scaleSize.height)); } else { Objects.requireNonNull(svgDocument.getValue()) - .render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, size.width, size.height)); + .render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, scaleSize.width, scaleSize.height)); } } catch (Exception e) { FineLoggerFactory.getLogger().error("SvgIcon from url: " + resource + "can not paint.", e); @@ -127,9 +115,9 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { } - private SVGDocument load(Type type) { + private SVGDocument load(IconType type) { SVGLoader loader = new SVGLoader(); - return type == Type.white + return type == IconType.white ? loader.load(resource.getInputStream(), new WhiteParser()) : loader.load(resource.getInputStream()); } @@ -141,6 +129,7 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { .add("resource=" + resource) .add("type=" + type) .add("size=" + size) + .add("scaleSize=" + scaleSize) .toString(); } @@ -149,7 +138,7 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { */ @Override public @NotNull SvgIcon white() { - return new SvgIcon(resource, size, Type.white); + return new SvgIcon(resource, size, IconType.white); } @@ -158,6 +147,6 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { */ @Override public @NotNull SvgIcon disabled() { - return new SvgIcon(resource, size, Type.disable); + return new SvgIcon(resource, size, IconType.disable); } } diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 2fcd182b14..0a20946360 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -45,9 +45,9 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("connection", "com/fine/theme/icon/dataset/connection.svg"), new SvgIconSource("class_table_data", "com/fine/theme/icon/dataset/class_table_data.svg", true), new SvgIconSource("data_table", "com/fine/theme/icon/dataset/data_table.svg", true), - new SvgIconSource("multi", "com/fine/theme/icon/dataset/multi.svg", true), - new SvgIconSource("file", "com/fine/theme/icon/dataset/file.svg", true), - new SvgIconSource("tree", "com/fine/theme/icon/dataset/tree.svg", true), + new SvgIconSource("multi", "com/fine/theme/icon/dataset/multi.svg"), + new SvgIconSource("file", "com/fine/theme/icon/dataset/file.svg"), + new SvgIconSource("tree", "com/fine/theme/icon/dataset/tree.svg"), new SvgIconSource("store_procedure", "com/fine/theme/icon/dataset/store_procedure.svg", true), new SvgIconSource("batch_esd_on", "com/fine/theme/icon/dataset/batch_esd_on.svg", true), new SvgIconSource("batch_esd_off", "com/fine/theme/icon/dataset/batch_esd_off.svg", true), diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonGroupStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonGroupStoryBoard.java index 46ede30053..3c84e3371c 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonGroupStoryBoard.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonGroupStoryBoard.java @@ -8,6 +8,7 @@ import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.gui.storybook.Story; import com.fr.design.gui.storybook.StoryBoard; import com.fr.stable.ArrayUtils; +import com.fr.value.NotNullLazyValue; import javax.swing.Icon; import java.awt.Component; @@ -49,6 +50,17 @@ public class ButtonGroupStoryBoard extends StoryBoard { ); } + private static final NotNullLazyValue iconArray = NotNullLazyValue.createValue(() -> ArrayUtils.toArray( + new LazyIcon("edit"), + new LazyIcon("preview"), + new LazyIcon("connection") + )); + + private static final NotNullLazyValue iconArrayWithWhite = NotNullLazyValue.createValue(() -> ArrayUtils.toArray( + ArrayUtils.toArray(new LazyIcon("edit"), new LazyIcon("copy")), + ArrayUtils.toArray(new LazyIcon("preview"), new LazyIcon("save")) + )); + private static Component getToolbar(){ UIToolbar toolbar = new UIToolbar(); UIButtonGroup objectUIButtonGroup = new UIButtonGroup<>(iconArrayWithWhite(),null,true); @@ -58,18 +70,11 @@ public class ButtonGroupStoryBoard extends StoryBoard { } private static Icon[] iconArray() { - return ArrayUtils.toArray( - new LazyIcon("edit"), - new LazyIcon("preview"), - new LazyIcon("connection") - ); + return iconArray.getValue(); } private static Icon[][] iconArrayWithWhite() { - return ArrayUtils.toArray( - ArrayUtils.toArray(new LazyIcon("edit"), new LazyIcon("copy")), - ArrayUtils.toArray(new LazyIcon("preview"), new LazyIcon("save")) - ); + return iconArrayWithWhite.getValue(); } private String[] fiveTextArray() { From 213c9ed70023e8782a2e2e4b145876d67aa76e8f Mon Sep 17 00:00:00 2001 From: jinsihou <540097546@qq.com> Date: Wed, 10 Jan 2024 01:24:10 +0800 Subject: [PATCH 100/302] =?UTF-8?q?REPORT-99485=20=E4=BF=AE=E5=A4=8Dwindow?= =?UTF-8?q?s=E4=B8=8B=E7=BB=98=E5=88=B6=E6=96=87=E5=AD=97=E9=94=AF?= =?UTF-8?q?=E9=BD=BF=E4=B8=A5=E9=87=8D=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/foldablepane/HeaderPane.java | 7 +++--- .../main/java/com/fr/grid/GridColumnUI.java | 23 ++++++++++------- .../src/main/java/com/fr/grid/GridRowUI.java | 25 +++++++++++-------- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java b/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java index d339f85f4b..93ef7161cd 100644 --- a/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java +++ b/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java @@ -2,10 +2,9 @@ package com.fr.design.foldablepane; import com.fine.theme.icon.LazyIcon; import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.ui.FlatUIUtils; import com.formdev.flatlaf.util.ScaledEmptyBorder; -import com.fr.base.GraphHelper; -import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JFrame; import javax.swing.JPanel; @@ -13,7 +12,6 @@ import javax.swing.UIManager; import java.awt.AlphaComposite; import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; @@ -84,7 +82,8 @@ public class HeaderPane extends JPanel { int descent = metrics.getDescent(); double titleY = (double) (getHeight() - (ascent + descent)) / 2 + ascent; - GraphHelper.drawString(g2d, this.title, triangleDown.getIconWidth() + FineUIScale.scale(UIManager.getInt("ExpandablePane.HeaderPane.hGap")), titleY); + FlatUIUtils.setRenderingHints(g2d); + g2d.drawString(this.title, triangleDown.getIconWidth() + FineUIScale.scale(UIManager.getInt("ExpandablePane.HeaderPane.hGap")), (int) titleY); g2d.dispose(); } diff --git a/designer-realize/src/main/java/com/fr/grid/GridColumnUI.java b/designer-realize/src/main/java/com/fr/grid/GridColumnUI.java index d05f252d42..bf430f3226 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridColumnUI.java +++ b/designer-realize/src/main/java/com/fr/grid/GridColumnUI.java @@ -1,14 +1,6 @@ package com.fr.grid; -import java.awt.*; -import java.awt.font.FontRenderContext; -import java.awt.font.LineMetrics; -import java.awt.geom.Rectangle2D; - -import javax.swing.JComponent; -import javax.swing.UIManager; -import javax.swing.plaf.ComponentUI; - +import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.base.DynamicUnitList; import com.fr.base.GraphHelper; import com.fr.base.vcs.DesignerMode; @@ -22,6 +14,18 @@ import com.fr.privilege.finegrain.ColumnRowPrivilegeControl; import com.fr.report.ReportHelper; import com.fr.report.elementcase.ElementCase; +import javax.swing.JComponent; +import javax.swing.UIManager; +import javax.swing.plaf.ComponentUI; +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.font.FontRenderContext; +import java.awt.font.LineMetrics; +import java.awt.geom.Rectangle2D; + /** * @editor zhou * @since 2012-3-22下午5:51:10 @@ -77,6 +81,7 @@ public class GridColumnUI extends ComponentUI { // draw left border line. g2d.setPaint(gridColumn.getSeparatorLineColor()); GraphHelper.drawLine(g2d, 0, 0, 0, size.getHeight()); + FlatUIUtils.setRenderingHints(g2d); drawColumn(horizontalBeginValue, horizontalEndValue, columnWidthList, reportPane, g2d, gridColumn, size); } diff --git a/designer-realize/src/main/java/com/fr/grid/GridRowUI.java b/designer-realize/src/main/java/com/fr/grid/GridRowUI.java index 5f88c6c952..97d2eb9269 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridRowUI.java +++ b/designer-realize/src/main/java/com/fr/grid/GridRowUI.java @@ -1,26 +1,30 @@ package com.fr.grid; -import java.awt.*; -import java.awt.font.FontRenderContext; -import java.awt.geom.Rectangle2D; - -import javax.swing.JComponent; -import javax.swing.UIManager; -import javax.swing.plaf.ComponentUI; - -import com.fr.design.mainframe.DesignerUIModeConfig; -import com.fr.stable.AssistUtils; +import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.base.DynamicUnitList; import com.fr.base.GraphHelper; import com.fr.base.vcs.DesignerMode; import com.fr.cache.list.IntList; import com.fr.design.constants.UIConstants; +import com.fr.design.mainframe.DesignerUIModeConfig; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.roleAuthority.ReportAndFSManagePane; import com.fr.grid.selection.Selection; import com.fr.privilege.finegrain.ColumnRowPrivilegeControl; import com.fr.report.ReportHelper; import com.fr.report.elementcase.ElementCase; +import com.fr.stable.AssistUtils; + +import javax.swing.JComponent; +import javax.swing.UIManager; +import javax.swing.plaf.ComponentUI; +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.font.FontRenderContext; +import java.awt.geom.Rectangle2D; /** * @editor zhou @@ -77,6 +81,7 @@ public class GridRowUI extends ComponentUI { // draw top border line. g2d.setPaint(gridRow.getSeparatorLineColor()); GraphHelper.drawLine(g2d, 0, 0, size.getWidth(), 0); + FlatUIUtils.setRenderingHints(g2d); // draw row drawRow(verticalBeginValue, verticalEndValue, rowHeightList, resolution, gridRow, g2d); } From 1d8c8816ecb3aac6182ce9f5a3fbb3ee20badaf7 Mon Sep 17 00:00:00 2001 From: jinsihou <540097546@qq.com> Date: Wed, 10 Jan 2024 01:37:13 +0800 Subject: [PATCH 101/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/foldablepane/HeaderPane.java | 36 ++++--------------- 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java b/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java index 93ef7161cd..4d6a467860 100644 --- a/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java +++ b/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java @@ -6,29 +6,20 @@ import com.formdev.flatlaf.ui.FlatUIUtils; import com.formdev.flatlaf.util.ScaledEmptyBorder; import javax.swing.Icon; -import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; import java.awt.AlphaComposite; -import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; -import java.awt.Insets; /** * Created by MoMeak on 2017/7/5. */ public class HeaderPane extends JPanel { private static final long serialVersionUID = 1L; - private final Insets defaultInsets = new Insets(0, 6, 0, 6); - private final int defaultWidth = 248; - private final int defaultHeight = 24; - private int headWidth; - private int headHeight; - private Color bgColor; private boolean isShow; private boolean isPressed = false; private String title; @@ -39,6 +30,7 @@ public class HeaderPane extends JPanel { public void setPressed(boolean pressed) { this.isPressed = pressed; } + public void setShow(boolean isShow) { this.isShow = isShow; } @@ -47,14 +39,6 @@ public class HeaderPane extends JPanel { this.title = title; } - public void setHeadWidth(int headwidth) { - this.headWidth = headwidth; - } - - public void setheadHeight(int headHeight) { - this.headHeight = headHeight; - } - public void setFontSize(int fontSize) { this.fontSize = fontSize; } @@ -75,15 +59,17 @@ public class HeaderPane extends JPanel { g2d.setFont(getFont()); g2d.setPaint(getForeground()); - g2d.setComposite(AlphaComposite.SrcOver.derive((float) getForeground().getAlpha() / 255)); + g2d.setComposite(AlphaComposite.SrcOver.derive( getForeground().getAlpha() / 255f)); FontMetrics metrics = g2d.getFontMetrics(); int ascent = metrics.getAscent(); int descent = metrics.getDescent(); - double titleY = (double) (getHeight() - (ascent + descent)) / 2 + ascent; + float titleX = triangleDown.getIconWidth() + + FineUIScale.scale(UIManager.getInt("ExpandablePane.HeaderPane.hGap")); + float titleY = (getHeight() - (ascent + descent)) / 2.0f + ascent; FlatUIUtils.setRenderingHints(g2d); - g2d.drawString(this.title, triangleDown.getIconWidth() + FineUIScale.scale(UIManager.getInt("ExpandablePane.HeaderPane.hGap")), (int) titleY); + g2d.drawString(this.title, titleX, titleY); g2d.dispose(); } @@ -101,14 +87,4 @@ public class HeaderPane extends JPanel { this.title = title; } - public static void main(String[] args) { - JFrame mainFrame = new JFrame("UI Demo - Gloomyfish"); - mainFrame.getContentPane().setLayout(new BorderLayout()); - mainFrame.getContentPane().add(new HeaderPane(Color.black, "基本", 24), BorderLayout.CENTER); - mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - mainFrame.pack(); - mainFrame.setSize(300, 400); - mainFrame.setVisible(true); - } - } From d28151d50e9a7e1dbb3465d039ccdaab988ab345 Mon Sep 17 00:00:00 2001 From: vito Date: Wed, 10 Jan 2024 10:13:47 +0800 Subject: [PATCH 102/302] =?UTF-8?q?REPORT-99485=20windows=E4=B8=8B?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E6=81=A2=E5=A4=8D=E5=8E=9F=E7=94=9F=E7=AA=97?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fine/theme/light/ui/laf/FineLaf.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java index 10d6456488..fa29de7466 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java @@ -1,6 +1,7 @@ package com.fine.theme.light.ui.laf; import com.formdev.flatlaf.FlatLaf; +import com.formdev.flatlaf.util.SystemInfo; import javax.swing.PopupFactory; @@ -31,8 +32,19 @@ public abstract class FineLaf extends FlatLaf { @Override public void initialize() { super.initialize(); + resetWindowDecorations(); // flat默认使用系统弹窗,3.3 版本之前无法实现圆角弹窗。 // popup弹窗不使用flat提供的工具,使用swing原生自带的 PopupFactory.setSharedInstance(new PopupFactory()); } + + /** + * 在win10和win11下重置窗口装饰,恢复系统原生 + */ + private static void resetWindowDecorations() { + if (SystemInfo.isWindows_10_orLater) { + System.setProperty("flatlaf.useWindowDecorations", "false"); + System.setProperty("flatlaf.menuBarEmbedded", "false"); + } + } } From 48f6ba7af1132abc715f7113515f88e9778f7258 Mon Sep 17 00:00:00 2001 From: vito Date: Wed, 10 Jan 2024 11:01:40 +0800 Subject: [PATCH 103/302] =?UTF-8?q?REPORT-99485=20=E6=A8=A1=E7=89=88tab?= =?UTF-8?q?=E7=BB=84=E4=BB=B6windows=E4=B8=8B=E6=96=87=E5=AD=97=E6=8A=97?= =?UTF-8?q?=E9=94=AF=E9=BD=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../theme/light/ui/FineTemplateTabPaneUI.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java index 2de24c89c2..a1ecd9a5a8 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateTabPaneUI.java @@ -305,14 +305,18 @@ public class FineTemplateTabPaneUI extends PanelUI { g2d.setPaint(borderColor); paintRoundTabBorder(g2d, templateStartX, 0, tabPane.getTabWidth(), tabHeight, borderWidth, (float) tabArc); - FlatUIUtils.resetRenderingHints(g2d, oriRenderingHints); - // 绘制图标 - int sheetIconY = (tabHeight - sheeticon.getIconHeight()) / 2; - sheeticon.paintIcon(tabPane, g2d, (int) templateStartX + tabInsets.left, sheetIconY); + // 绘制字符 g2d.setPaint(tabPane.getForeground()); Point2D.Double textPoint = calTextPoint(templateStartX, sheeticon.getIconWidth()); g2d.drawString(sheetName, (int) textPoint.x, (int) textPoint.y); + + FlatUIUtils.resetRenderingHints(g2d, oriRenderingHints); + + // 绘制图标 + int sheetIconY = (tabHeight - sheeticon.getIconHeight()) / 2; + sheeticon.paintIcon(tabPane, g2d, (int) templateStartX + tabInsets.left, sheetIconY); + int closePosition = (int) templateStartX + tabPane.getTabWidth() - this.closeIcon.getIconWidth() - tabInsets.right; int closeY = (tabHeight - closeIcon.getIconHeight()) / 2; @@ -352,15 +356,16 @@ public class FineTemplateTabPaneUI extends PanelUI { tabPane.getTabWidth(), tabHeight - scale(borderWidth), tabArc); g2d.fill(tabShape); + // 画字符 + g2d.setPaint(tabPane.getForeground()); + Point2D.Double textPoint = calTextPoint(templateStartX, sheeticon.getIconWidth()); + g2d.drawString(sheetName, (int) textPoint.x, (int) textPoint.y); FlatUIUtils.resetRenderingHints(g2d, oriRenderingHints); + // 画图标 int sheetIconY = (tabHeight - sheeticon.getIconHeight()) / 2; sheeticon.paintIcon(tabPane, g2d, (int) templateStartX + tabInsets.left, sheetIconY); - // 画字符 - g2d.setPaint(tabPane.getForeground()); - Point2D.Double textPoint = calTextPoint(templateStartX, sheeticon.getIconWidth()); - g2d.drawString(sheetName, (int) textPoint.x, (int) textPoint.y); int closeY = (tabHeight - closeIcon.getIconHeight()) / 2; int closePosition = (int) templateStartX + tabPane.getTabWidth() - this.closeIcon.getIconWidth() - tabInsets.right; From f277e0984a6fc1f1d6a8dfed3e4632959ae31b8a Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Wed, 10 Jan 2024 11:40:01 +0800 Subject: [PATCH 104/302] =?UTF-8?q?REPORT-107973=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=83=A8=E5=88=86=E9=80=8F=E6=98=8E=E8=89=B2=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E3=80=81=E5=BC=B9=E7=AA=97=E8=BE=B9=E8=B7=9D=E3=80=81=E5=8F=AF?= =?UTF-8?q?=E6=8A=98=E5=8F=A0=E9=9D=A2=E6=9D=BF=E7=82=B9=E5=87=BB=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/light/ui/FineInputUI.java | 55 ------------------- .../com/fine/theme/utils/FineUIStyle.java | 2 + .../search/pane/FineSearchPane.java | 10 ++-- .../fr/design/foldablepane/HeaderPane.java | 7 ++- .../com/fr/design/gui/ispinner/UISpinner.java | 10 ++-- .../accessibles/BaseAccessibleEditor.java | 6 +- .../style/color/ColorControlWindow.java | 8 +-- .../light/ui/laf/FineLightLaf.properties | 10 ++-- .../actions/cell/UIToolbarBorderButton.java | 9 ++- 9 files changed, 37 insertions(+), 80 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineInputUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineInputUI.java index 2035d1c024..351dc98b59 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineInputUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineInputUI.java @@ -1,10 +1,8 @@ package com.fine.theme.light.ui; import com.fine.theme.utils.FineUIUtils; -import com.formdev.flatlaf.ui.FlatButtonUI; import com.formdev.flatlaf.ui.FlatPanelUI; -import javax.swing.AbstractButton; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.UIManager; @@ -67,57 +65,4 @@ public class FineInputUI extends FlatPanelUI { } } - /** - * input输入框中的Button UI类 - * - * @author Leo.Qin - * @since 11.0 - * Created on 2023/12/12 - */ - public static class FineInputButtonUI extends FlatButtonUI { - - public FineInputButtonUI(boolean shared) { - super(shared); - } - - /** - * 创建UI - */ - public static ComponentUI createUI(JComponent c) { - return new FineInputButtonUI(false); - } - - @Override - public void installUI(JComponent c) { - super.installUI(c); - c.setBorder(null); - c.setOpaque(false); - } - - @Override - protected void installDefaults(AbstractButton b) { - super.installDefaults(b); - hoverBackground = UIManager.getColor("InputButton.hoverBackground"); - pressedBackground = UIManager.getColor("InputButton.pressedBackground"); - background = UIManager.getColor("InputButton.background"); - } - - @Override - public void propertyChange(AbstractButton b, PropertyChangeEvent e) { - String propertyName = e.getPropertyName(); - if (EDITABLE.equals(propertyName) || ENABLED.equals(propertyName)) { - updateBackground(b, e); - } else { - super.propertyChange(b, e); - } - } - - private void updateBackground(AbstractButton b, PropertyChangeEvent e) { - if (e.getNewValue() == Boolean.FALSE) { - b.setBackground(UIManager.getColor("InputButton.disabledBackground")); - } else { - b.setBackground(UIManager.getColor("InputButton.background")); - } - } - } } diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java index e0bc20d5ca..68fa7a94c1 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java @@ -31,6 +31,8 @@ public interface FineUIStyle { String MENU_TOOL_BAR = "menuToolBar"; String MENU_ITEM_TOOL_BAR = "menuItemToolBar"; String POPUP_MENU_TOOL_BAR = "popupMenuToolBar"; + String POPUP_MENU_DROPDOWN = "dropdownPopupMenu"; + String TRANSPARENT_TEXT_FIELD = "transparentTextField"; /** diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/FineSearchPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/FineSearchPane.java index 9f3f98dfbe..4e50f695fb 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/FineSearchPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/FineSearchPane.java @@ -1,7 +1,6 @@ package com.fr.design.data.datapane.management.search.pane; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.light.ui.FineInputUI; import com.fine.theme.utils.FineUIUtils; import com.fr.design.event.HoverAware; import com.fr.design.gui.ibutton.UIButton; @@ -18,6 +17,10 @@ import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import static com.fine.theme.utils.FineUIStyle.STYLE_TEXT; +import static com.fine.theme.utils.FineUIStyle.TRANSPARENT_TEXT_FIELD; +import static com.fine.theme.utils.FineUIStyle.setStyle; + /** * 搜索面板 * @@ -56,8 +59,7 @@ public class FineSearchPane extends JPanel implements HoverAware { // 中间输入框 searchTextField = new UITextField(); - searchTextField.setBorder(null); - searchTextField.setOpaque(false); + setStyle(searchTextField, TRANSPARENT_TEXT_FIELD); searchTextField.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { @@ -74,7 +76,7 @@ public class FineSearchPane extends JPanel implements HoverAware { // 右侧返回图标 clearButton = new UIButton(new LazyIcon("clear")); - clearButton.setUI(new FineInputUI.FineInputButtonUI(false)); + setStyle(clearButton, STYLE_TEXT); Insets buttonInsets = FineUIUtils.getAndScaleUIInsets("SearchPanel.buttonBorderInsets", defaultButtonInsets); clearButton.setBorder(BorderFactory.createEmptyBorder(buttonInsets.top, buttonInsets.left, buttonInsets.bottom, buttonInsets.right)); diff --git a/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java b/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java index 4d6a467860..209a4195b4 100644 --- a/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java +++ b/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java @@ -14,6 +14,7 @@ import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.Insets; /** * Created by MoMeak on 2017/7/5. @@ -48,7 +49,11 @@ public class HeaderPane extends JPanel { protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); g2d.setColor(getBackground()); - g2d.fillRect(0, 0, this.getWidth(), this.getHeight()); + if (isPressed) { + g2d.setColor(UIManager.getColor("Button.pressedBackground")); + } + Insets insets = this.getInsets(); + g2d.fillRect(0, insets.top / 2, this.getWidth(), this.getHeight() - (insets.top + insets.bottom) / 2); int iconY = (this.getHeight() - triangleDown.getIconHeight()) / 2; if (this.isShow) { diff --git a/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java index 08ef5d8101..6f891afc7b 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java +++ b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java @@ -1,8 +1,6 @@ package com.fr.design.gui.ispinner; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.light.ui.FineInputUI; -import com.fine.theme.utils.FineUIScale; import com.fine.theme.utils.FineUIUtils; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; @@ -17,7 +15,6 @@ import com.fr.stable.StringUtils; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JPanel; -import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; @@ -36,6 +33,9 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; +import static com.fine.theme.utils.FineUIStyle.STYLE_TEXT; +import static com.fine.theme.utils.FineUIStyle.setStyle; + /** * Spinner类 * @@ -239,7 +239,7 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver, @Override public Dimension getPreferredSize() { Dimension dim = super.getPreferredSize(); - dim.height = FineUIScale.scale(UIManager.getInt("Input.height")); + dim.height = FineUIUtils.getAndScaleInt("Input.height", defaultButtonSize); return dim; } @@ -309,7 +309,7 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver, return false; } }; - arrowButton.setUI(new FineInputUI.FineInputButtonUI(false)); + setStyle(arrowButton, STYLE_TEXT); return arrowButton; } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/BaseAccessibleEditor.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/BaseAccessibleEditor.java index 99a1dc1f66..858f078cf5 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/BaseAccessibleEditor.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/BaseAccessibleEditor.java @@ -1,7 +1,6 @@ package com.fr.design.mainframe.widget.accessibles; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.light.ui.FineInputUI; import com.fine.theme.utils.FineUIScale; import com.fine.theme.utils.FineUIUtils; import com.fr.design.Exception.ValidationException; @@ -32,6 +31,9 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; +import static com.fine.theme.utils.FineUIStyle.STYLE_TEXT; +import static com.fine.theme.utils.FineUIStyle.setStyle; + /** * 编辑器 * @author anonymous @@ -126,7 +128,7 @@ public class BaseAccessibleEditor extends BasicPane implements AccessibleEditor, if (showButton) { btPopup = new UIButton(); initPopupButton(); - btPopup.setUI(new FineInputUI.FineInputButtonUI(false)); + setStyle(btPopup, STYLE_TEXT); btPopup.addActionListener(new ActionListener() { @Override diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorControlWindow.java b/designer-base/src/main/java/com/fr/design/style/color/ColorControlWindow.java index b84173f1db..d8e98965ae 100644 --- a/designer-base/src/main/java/com/fr/design/style/color/ColorControlWindow.java +++ b/designer-base/src/main/java/com/fr/design/style/color/ColorControlWindow.java @@ -9,6 +9,9 @@ import javax.swing.event.ChangeListener; import java.awt.BorderLayout; import java.awt.Color; +import static com.fine.theme.utils.FineUIStyle.POPUP_MENU_DROPDOWN; +import static com.fine.theme.utils.FineUIStyle.setStyle; + public abstract class ColorControlWindow extends JPopupMenu { private static final long serialVersionUID = 4317136753151221742L; private PopupHider popupHider; @@ -29,6 +32,7 @@ public abstract class ColorControlWindow extends JPopupMenu { public ColorControlWindow(boolean isSupportTransparent, PopupHider popupHider) { this.initComponents(isSupportTransparent); this.popupHider = popupHider; + setStyle(this, POPUP_MENU_DROPDOWN); } public Color getColor() { @@ -53,10 +57,6 @@ public abstract class ColorControlWindow extends JPopupMenu { setLightWeightPopupEnabled(JPopupMenu.getDefaultLightWeightPopupEnabled()); this.setLayout(FRGUIPaneFactory.createBorderLayout()); - setBorderPainted(false); - setOpaque(false); - setDoubleBuffered(true); - setFocusable(false); initSelectionPopupPane(isSupportTransparent); this.pack(); } diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index 820a3fad2b..266c1fd719 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -748,10 +748,6 @@ Spinner.editorBorderPainted = false # allowed values: button or none Spinner.buttonStyle = button #---- Input ---- -InputButton.background=$fill.normal -InputButton.hoverBackground=$fill.hover -InputButton.pressedBackground=$fill.click -InputButton.disabledBackground=$fill.disabled InputButton.width=$Component.defaultHeight InputButton.height=$Component.defaultHeight InputTextField.borderInsets=0, 6, 0, 6 @@ -1281,6 +1277,12 @@ CellOtherSetPane.height=$Component.defaultHeight acceleratorSelectionForeground : $text.white [style]PopupMenu.popupMenuToolBar=\ background: $fill.gray +[style]TextField.transparentTextField=\ + background: fade(@background, 0%); \ + border: null; +[style]PopupMenu.dropdownPopupMenu=\ + background: fade(@background, 0%); \ + borderInsets: 0,0,0,0; #---- clearButton ---- # for clear/cancel button in text fields diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/UIToolbarBorderButton.java b/designer-realize/src/main/java/com/fr/design/actions/cell/UIToolbarBorderButton.java index e6f940ea03..8ef66cb9fb 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/UIToolbarBorderButton.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/UIToolbarBorderButton.java @@ -23,7 +23,6 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JSeparator; import javax.swing.SwingUtilities; -import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.EventListenerList; @@ -33,6 +32,9 @@ import java.awt.GridLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import static com.fine.theme.utils.FineUIStyle.POPUP_MENU_DROPDOWN; +import static com.fine.theme.utils.FineUIStyle.setStyle; + /** * 这个Pane用来显示常用边框和设置自定义边框 * @@ -127,11 +129,8 @@ public class UIToolbarBorderButton extends UICombinationButton implements PopupH setLightWeightPopupEnabled(JPopupMenu.getDefaultLightWeightPopupEnabled()); this.setLayout(FRGUIPaneFactory.createBorderLayout()); - setBorderPainted(true); - setBorder(UIManager.getBorder("PopupMenu.border")); - setOpaque(false); - setDoubleBuffered(true); setFocusable(false); + setStyle(this, POPUP_MENU_DROPDOWN); this.add(new NormalBorderPane(isSupportTransparent, UIToolbarBorderButton.this), BorderLayout.CENTER); this.pack(); From fbc5dc08da163f289e3e6abe8b47eafeb2d8ae77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 10 Jan 2024 11:47:58 +0800 Subject: [PATCH 105/302] =?UTF-8?q?REPORT-111995=20=E3=80=90UI=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E3=80=91=E7=BF=BB=E6=96=B0=E6=95=B0=E6=8D=AE=E9=9B=86?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF;=E8=A1=A5=E5=85=85=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 3 + .../com/fine/theme/utils/FineUIStyle.java | 1 + .../com/fine/theme/utils/FineUIUtils.java | 12 + .../fr/design/border/FineBorderFactory.java | 37 +++ .../data/datapane/connect/AdvancePane.java | 70 +++-- .../connect/ConnectionManagerPane.java | 2 - .../data/datapane/connect/DBCPAttrPane.java | 104 ++++--- .../connect/DatabaseConnectionPane.java | 125 ++++---- .../data/datapane/connect/JDBCDefPane.java | 288 +++++++++--------- .../design/data/datapane/connect/SshPane.java | 207 +++++++------ .../design/data/datapane/connect/SslPane.java | 122 ++++---- .../com/fr/design/formula/FormulaPane.java | 5 +- .../design/gui/controlpane/JControlPane.java | 9 +- .../gui/controlpane/JListControlPane.java | 29 +- .../com/fr/design/gui/ilable/ActionLabel.java | 6 +- .../gui/itree/filetree/FileTreeIcon.java | 2 +- .../mainframe/WestRegionContainerPane.java | 5 +- .../com/fine/theme/icon/expand/forbid.svg | 3 + .../fine/theme/icon/expand/forbid_disable.svg | 3 + .../com/fine/theme/icon/expand/horizontal.svg | 6 + .../theme/icon/expand/horizontal_disable.svg | 6 + .../com/fine/theme/icon/expand/vertical.svg | 6 + .../theme/icon/expand/vertical_disable.svg | 6 + .../light/ui/laf/FineLightLaf.properties | 18 +- .../cell/settingpane/CellExpandAttrPane.java | 7 +- 25 files changed, 612 insertions(+), 470 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/border/FineBorderFactory.java create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/expand/forbid.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/expand/forbid_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/expand/horizontal.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/expand/horizontal_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/expand/vertical.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/expand/vertical_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 0a20946360..415b416e02 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -194,6 +194,9 @@ public class FineLightIconSet extends AbstractIconSet { //东区面板 new SvgIconSource("cellelement_small", "com/fine/theme/icon/cellelement.svg"), + new SvgIconSource("forbid", "com/fine/theme/icon/expand/forbid.svg"), + new SvgIconSource("horizontal_expand", "com/fine/theme/icon/expand/horizontal.svg"), + new SvgIconSource("vertical_expand", "com/fine/theme/icon/expand/vertical.svg"), // 三角 new SvgIconSource("triangle_down", "com/fine/theme/icon/triangle/triangle_down.svg"), diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java index 68fa7a94c1..0af3013ff2 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java @@ -27,6 +27,7 @@ public interface FineUIStyle { String TOP_TOOLS = "topTools"; String BRAND_COLOR_LABEL = "brandColorLabel"; String BUTTON_TAB_ACTION = "tabAction"; + String LABEL_BOLD = "boldLabel"; String MENU_TOOL_BAR = "menuToolBar"; String MENU_ITEM_TOOL_BAR = "menuItemToolBar"; diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java index 01b92af016..225fce4be5 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java @@ -1,10 +1,12 @@ package com.fine.theme.utils; import com.formdev.flatlaf.ui.FlatUIUtils; +import com.fr.design.border.FineBorderFactory; import com.fr.stable.os.OperatingSystem; import com.fr.value.AtomicClearableLazyValue; import javax.swing.UIManager; +import javax.swing.JLabel; import java.awt.Color; import java.awt.Component; import java.awt.Composite; @@ -364,4 +366,14 @@ public class FineUIUtils { return createPartRoundRectangle(x, y, width, height, 0, 0, arc, 0); } + /** + * 标签加粗显示,并设置下划线;适用于小标题 + * + * @param label 标签 + */ + public static void wrapBoldLabelWithUnderline(JLabel label) { + label.setBorder(FineBorderFactory.createDefaultUnderlineBorder()); + FineUIStyle.setStyle(label, FineUIStyle.LABEL_BOLD); + } + } diff --git a/designer-base/src/main/java/com/fr/design/border/FineBorderFactory.java b/designer-base/src/main/java/com/fr/design/border/FineBorderFactory.java new file mode 100644 index 0000000000..02cf2541af --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/border/FineBorderFactory.java @@ -0,0 +1,37 @@ +package com.fr.design.border; + +import com.fine.theme.utils.FineUIUtils; + +import javax.swing.BorderFactory; +import javax.swing.border.Border; +import java.awt.Color; + +/** + * 创建Border的工厂 + * + * @author Levy.Xie + * @since 11.0 + * Created on 2024/01/08 + */ +public class FineBorderFactory { + + /** + * 创建一个下划线边框 + * + * @param color 下划线颜色 + * @return 边框 + */ + public static Border createUnderlineBorder(Color color) { + return BorderFactory.createMatteBorder(0, 0, 1, 0, color); + } + + /** + * 创建默认的下划线边框 + * + * @return 边框 + */ + public static Border createDefaultUnderlineBorder() { + return createUnderlineBorder(FineUIUtils.getUIColor("Label.borderColor", "defaultBorderColor")); + } + +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/AdvancePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/AdvancePane.java index 7784aa5712..a2aadbb030 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/AdvancePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/AdvancePane.java @@ -1,55 +1,69 @@ package com.fr.design.data.datapane.connect; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.utils.FineUIUtils; import com.fr.data.impl.JDBCDatabaseConnection; import com.fr.data.pool.DBCPConnectionPoolAttr; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.editor.editor.IntegerEditor; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.stable.StringUtils; -import javax.swing.JPanel; import javax.swing.SwingConstants; import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Component; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.flex; + /** * @author xiqiu * @date 2021/11/22 * @description */ public class AdvancePane extends BasicPane { - private IntegerEditor DBCP_MAX_ACTIVE = new IntegerEditor(); - private UIComboBox DBCP_TESTONBORROW = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Basic_No"), Toolkit.i18nText("Fine-Design_Basic_Yes")}); - private IntegerEditor DBCP_MAX_WAIT = new IntegerEditor(); - private SpecialUITextField DBCP_VALIDATION_QUERY = new SpecialUITextField(); + private final IntegerEditor DBCP_MAX_ACTIVE = new IntegerEditor(); + private final UIComboBox DBCP_TEST_ON_BORROW = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Basic_No"), + Toolkit.i18nText("Fine-Design_Basic_Yes")}); + private final IntegerEditor DBCP_MAX_WAIT = new IntegerEditor(); + private final SpecialUITextField DBCP_VALIDATION_QUERY = new SpecialUITextField(); public AdvancePane() { - JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); DBCP_VALIDATION_QUERY.addFocusListener(new JTextFieldHintListener(DBCP_VALIDATION_QUERY)); - double p = TableLayout.PREFERRED; DBCP_VALIDATION_QUERY.setColumns(20); - double[] rowSizeDbcp = {p, p, p, p}; - double[] columnDbcp = {190, p}; - Component[][] comps = { - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Active") + ":", SwingConstants.RIGHT), DBCP_MAX_ACTIVE}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Validation_Query") + ":", SwingConstants.RIGHT), DBCP_VALIDATION_QUERY}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Borrow") + ":", SwingConstants.RIGHT), DBCP_TESTONBORROW}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Max_Wait_Time") + ":", SwingConstants.RIGHT), DBCP_MAX_WAIT} - }; - - JPanel contextPane = TableLayoutHelper.createGapTableLayoutPane(comps, rowSizeDbcp, columnDbcp, 11, 11); - jPanel.add(contextPane, BorderLayout.CENTER); - this.add(jPanel); + this.setLayout(new BorderLayout()); + this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Advanced"))).with(FineUIUtils::wrapBoldLabelWithUnderline), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Active"), SwingConstants.LEFT)).weight(1), + cell(DBCP_MAX_ACTIVE).weight(1.5), + flex(2) + ), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Validation_Query"), SwingConstants.LEFT)).weight(1), + cell(DBCP_VALIDATION_QUERY).weight(1.5), + flex(2) + ), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Borrow"), SwingConstants.LEFT)).weight(1), + cell(DBCP_TEST_ON_BORROW).weight(1.5), + flex(2) + ), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Max_Wait_Time"), SwingConstants.LEFT)).weight(1), + cell(DBCP_MAX_WAIT).weight(1.5), + flex(2) + ) + + ).getComponent(), BorderLayout.CENTER); } @@ -62,7 +76,7 @@ public class AdvancePane extends BasicPane { this.DBCP_MAX_ACTIVE.setValue(dbcpAttr.getMaxActive()); this.DBCP_MAX_WAIT.setValue(dbcpAttr.getMaxWait()); this.DBCP_VALIDATION_QUERY.setText(dbcpAttr.getValidationQuery()); - this.DBCP_TESTONBORROW.setSelectedIndex(dbcpAttr.isTestOnBorrow() ? 1 : 0); + this.DBCP_TEST_ON_BORROW.setSelectedIndex(dbcpAttr.isTestOnBorrow() ? 1 : 0); } @@ -75,7 +89,7 @@ public class AdvancePane extends BasicPane { dbcpAttr.setMaxActive(this.DBCP_MAX_ACTIVE.getValue().intValue()); dbcpAttr.setMaxWait(this.DBCP_MAX_WAIT.getValue().intValue()); dbcpAttr.setValidationQuery(this.DBCP_VALIDATION_QUERY.getText()); - dbcpAttr.setTestOnBorrow(this.DBCP_TESTONBORROW.getSelectedIndex() == 0 ? false : true); + dbcpAttr.setTestOnBorrow(this.DBCP_TEST_ON_BORROW.getSelectedIndex() != 0); } @Override @@ -84,8 +98,8 @@ public class AdvancePane extends BasicPane { } - private class JTextFieldHintListener implements FocusListener { - private SpecialUITextField textField; + private static class JTextFieldHintListener implements FocusListener { + private final SpecialUITextField textField; public JTextFieldHintListener(SpecialUITextField jTextField) { this.textField = jTextField; @@ -108,7 +122,7 @@ public class AdvancePane extends BasicPane { } } - private class SpecialUITextField extends UITextField { + private static class SpecialUITextField extends UITextField { @Override public String getText() { diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionManagerPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionManagerPane.java index eadf456e09..e23e4bb6e1 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionManagerPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionManagerPane.java @@ -33,8 +33,6 @@ public class ConnectionManagerPane extends LoadingBasicPane implements Connectio } public void populate(ConnectionConfig datasourceManager) { -// this.connectionTextField.setText(WorkContext.getCurrent().getPath() + File.separator + ProjectConstants.RESOURCES_NAME -// + File.separator + datasourceManager.fileName()); this.connectionListPane.populate(datasourceManager); } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DBCPAttrPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DBCPAttrPane.java index ebfd195d8e..67142a34a4 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DBCPAttrPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DBCPAttrPane.java @@ -1,9 +1,13 @@ package com.fr.design.data.datapane.connect; -import com.fr.base.GraphHelper; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.data.core.db.dialect.DialectFactory; import com.fr.data.impl.JDBCDatabaseConnection; import com.fr.data.pool.DBCPConnectionPoolAttr; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicPane; import com.fr.design.editor.editor.IntegerEditor; @@ -11,19 +15,13 @@ import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.general.ComparatorUtils; import com.fr.stable.StringUtils; import javax.swing.JPanel; import javax.swing.JTextField; -import javax.swing.SwingConstants; import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; import java.awt.Window; import java.awt.event.InputMethodEvent; import java.awt.event.InputMethodListener; @@ -36,6 +34,10 @@ import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.flex; + public class DBCPAttrPane extends BasicPane { public static final int TIME_MULTIPLE = 1000; private static final Pattern FETCHSIZE_PATTERN = Pattern.compile("^0$|^[1-9][\\d]*[\\d]*$");; @@ -70,37 +72,44 @@ public class DBCPAttrPane extends BasicPane { } public DBCPAttrPane() { - defaultPane = this; - + this.setLayout(new BorderLayout()); + defaultPane = Layouts.column(20) + .with(it -> it.setBorder(new ScaledEmptyBorder(10, 10, 10, 10))).getComponent(); // JPanel northFlowPane - northFlowPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane(Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr")); - northFlowPane.setPreferredSize(new Dimension(630, 330)); - defaultPane.add(northFlowPane, BorderLayout.NORTH); - - // ContextPane - - double f = TableLayout.FILL; - // double p = TableLayout.PREFERRED; - double[] rowSize = {f, f, f, f, f, f, f}; - double[] columnSize = {f, f}; - Component[][] comps = { - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Initial_Size") + ":", SwingConstants.RIGHT), DBCP_INITIAL_SIZE}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Min_Idle") + ":", SwingConstants.RIGHT), DBCP_MIN_IDLE}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Return") + ":", SwingConstants.RIGHT), DBCP_TESTONRETURN}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_While_Idle") + ":", SwingConstants.RIGHT), DBCP_TESTWHILEIDLE}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Evictionruns_millis") + ":", SwingConstants.RIGHT), - DBCP_TIMEBETWEENEVICTIONRUNSMILLS}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Num_Test_Per_Evction_Run") + ":", SwingConstants.RIGHT), DBCP_NUMTESTSPEREVICTIONRUN}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Mix_Evictable_Idle_Time_Millis") + ":", SwingConstants.RIGHT), - DBCP_MINEVICTABLEIDLETIMEMILLIS}}; - - JPanel contextPane = TableLayoutHelper.createGapTableLayoutPane(comps, rowSize, columnSize, 10, 10); - northFlowPane.add(contextPane); - JPanel boxFlowInnerContainer = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(0, 5, 5); - UILabel uiLabel = new UILabel(Toolkit.i18nText("Fine-Design_Dbcp_Warning")); - uiLabel.setForeground(Color.RED); - boxFlowInnerContainer.add(uiLabel); - northFlowPane.add(boxFlowInnerContainer); + northFlowPane = Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr"))).with(FineUIUtils::wrapBoldLabelWithUnderline), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Initial_Size"))).weight(1), + cell(DBCP_INITIAL_SIZE).weight(1), flex(1.2) + ), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Min_Idle"))).weight(1), + cell(DBCP_MIN_IDLE).weight(1), flex(1.2) + ), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Return"))).weight(1), + cell(DBCP_TESTONRETURN).weight(1), flex(1.2) + ), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_While_Idle"))).weight(1), + cell(DBCP_TESTWHILEIDLE).weight(1), flex(1.2) + ), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Evictionruns_millis"))).weight(1), + cell(DBCP_TIMEBETWEENEVICTIONRUNSMILLS).weight(1), flex(1.2) + ), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Num_Test_Per_Evction_Run"))).weight(1), + cell(DBCP_NUMTESTSPEREVICTIONRUN).weight(1), flex(1.2) + ), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Mix_Evictable_Idle_Time_Millis"))).weight(1), + cell(DBCP_MINEVICTABLEIDLETIMEMILLIS).weight(1), flex(1.2) + ), + cell(new UILabel(Toolkit.i18nText("Fine-Design_Dbcp_Warning"))).with(it -> it.setForeground(FlatUIUtils.getUIColor("Label.strongHintColor", Color.RED))) + ).getComponent(); + defaultPane.add(northFlowPane); + this.add(defaultPane); } public void populate(JDBCDatabaseConnection jdbcDatabase) { @@ -188,24 +197,19 @@ public class DBCPAttrPane extends BasicPane { public BasicDialog showWindow(Window window) { String databaseName = JDBCConnectionDef.getInstance().getDatabaseName(); if (showOtherConfig(databaseName)) { - southFlowPane = FRGUIPaneFactory.createTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Other")); - southFlowPane.setPreferredSize(new Dimension(630, 200)); - double f = TableLayout.FILL; - double[] rowSize = {f}; - double otherColumnSize = GraphHelper.getWidth(Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Evictionruns_millis")) + 6; - double[] columnSize = {otherColumnSize, otherColumnSize}; FETCHSIZE.addKeyListener(fetchSizeKeyListener); FETCHSIZE.addInputMethodListener(fetchSizeInputMethodListener); FETCHSIZE.setHorizontalAlignment(JTextField.RIGHT); - Component[][] comps = { - {new UILabel("Fetchsize:", SwingConstants.RIGHT), FETCHSIZE} - }; - JPanel otherConfigPane = TableLayoutHelper.createGapTableLayoutPane(comps, rowSize, columnSize, 10, 4); - southFlowPane.add(otherConfigPane); + southFlowPane = Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(new UILabel(Toolkit.i18nText("Fine-Design_Report_Other"))).with(FineUIUtils::wrapBoldLabelWithUnderline), + row( + cell(new UILabel("Fetchsize")).weight(1), cell(FETCHSIZE).weight(1), flex(1.2) + ) + ).getComponent(); defaultPane.removeAll(); - defaultPane.add(northFlowPane, BorderLayout.NORTH); - defaultPane.add(southFlowPane, BorderLayout.SOUTH); + defaultPane.add(northFlowPane); + defaultPane.add(southFlowPane); } else { if (southFlowPane != null) { defaultPane.remove(southFlowPane); diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java index 11c3f64d64..821c3fd482 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java @@ -3,6 +3,10 @@ */ package com.fr.design.data.datapane.connect; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.data.driver.util.JarFileParseUtil; import com.fr.data.impl.Connection; import com.fr.data.impl.JDBCDatabaseConnection; @@ -14,6 +18,7 @@ import com.fr.data.solution.entity.DriverPage; import com.fr.data.solution.processor.ClassNotFoundExceptionSolutionProcessor; import com.fr.data.solution.processor.SolutionProcessor; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icontainer.UIScrollPane; @@ -29,6 +34,7 @@ import com.fr.stable.ArrayUtils; import com.fr.stable.EncodeConstants; import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; +import org.jetbrains.annotations.NotNull; import javax.swing.BorderFactory; import javax.swing.BoxLayout; @@ -62,6 +68,10 @@ import java.io.File; import java.net.URI; import java.util.concurrent.ExecutionException; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.flex; + /** * Database Connection pane. */ @@ -124,11 +134,11 @@ public abstract class DatabaseConnectionPane it.setBorder(new ScaledEmptyBorder(0, 10, 0, 10))) + .getComponent(); + JPanel columnContainer = new JPanel(new BorderLayout()); + columnContainer.add(corePane); + UIScrollPane uiScrollPane = new UIScrollPane(columnContainer, + ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); this.add(uiScrollPane, BorderLayout.CENTER); - // 按钮. - JPanel testPane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); - northPane.add(testPane, BorderLayout.NORTH); - UIButton testButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Datasource_Test_Connection")); - testPane.add(testButton); - testButton.addActionListener(testConnectionActionListener); - testPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 3, 4)); + // 按钮 + JPanel testButtonPane = initTestButtonPane(); + corePane.add(testButtonPane); // Center mainPanel = mainPanel(); - JPanel advancedPanel = FRGUIPaneFactory.createTopVerticalTitledBorderPane(Toolkit.i18nText("Fine-Design_Basic_Advanced")); + JPanel advancedPanel = Layouts.column(LayoutConstants.VERTICAL_GAP).getComponent(); if (mainPanel instanceof JDBCDefPane) { - northPane.add(mainPanel, BorderLayout.CENTER); - ActionLabel actionLabel = new ActionLabel(Toolkit.i18nText("Fine-Design_Advanced_More_Settings")); - actionLabel.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent evt) { - JDialog wDialog = createJDialog(); - if (wDialog != null) { - wDialog.setVisible(true); - } - } - }); - JPanel actionLabelPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - actionLabelPanel.setBorder(BorderFactory.createEmptyBorder(2, 4, 4, 20)); - actionLabelPanel.add(actionLabel, BorderLayout.WEST); - JPanel advancePane = getAdvancePane(); - if (advancePane != null) { - advancedPanel.add(advancePane); - } - advancedPanel.add(actionLabelPanel); - northPane.add(getSshPane()); - northPane.add(getSslPane()); + initJDBCLayout(corePane, advancedPanel); } else { - //非jdbc配置布局保持不变 - advancedPanel.setPreferredSize(new Dimension(MAX_MAIN_PANEL_WIDTH, 60)); - if (mainPanel.getPreferredSize().height > MAX_MAIN_PANEL_HEIGHT || mainPanel.getPreferredSize().width > MAX_MAIN_PANEL_WIDTH) { - UIScrollPane jp = new - UIScrollPane(mainPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jp.setPreferredSize(new Dimension(MAX_MAIN_PANEL_WIDTH, MAX_MAIN_PANEL_HEIGHT)); - northPane.add(jp, BorderLayout.CENTER); - } else { - mainPanel.setPreferredSize(new Dimension(MAX_MAIN_PANEL_WIDTH, MAX_MAIN_PANEL_HEIGHT)); - northPane.add(mainPanel, BorderLayout.CENTER); + initJNDILayout(corePane, advancedPanel); + } + corePane.add(advancedPanel); + } + + @NotNull + private JPanel initTestButtonPane() { + JPanel testPane = new JPanel(new BorderLayout()); + UIButton testButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Datasource_Test_Connection")); + testButton.addActionListener(testConnectionActionListener); + testPane.add(testButton, BorderLayout.WEST); + return testPane; + } + + private void initJNDILayout(JPanel corePane, JPanel advancedPanel) { + corePane.add(mainPanel); + // ChartSet + String[] defaultEncode = new String[]{Toolkit.i18nText("Fine-Design_Encode_Auto")}; + charSetComboBox = new UIComboBox(ArrayUtils.addAll(defaultEncode, EncodeConstants.ENCODING_ARRAY)); + JPanel chartSetPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); + chartSetPane.add(GUICoreUtils.createNamedPane(charSetComboBox, Toolkit.i18nText("Fine-Design_Basic_Datasource_Charset") + ":")); + advancedPanel.add(chartSetPane); + } + + private void initJDBCLayout(JPanel corePane, JPanel advancedPanel) { + corePane.add(mainPanel); + ActionLabel actionLabel = new ActionLabel(Toolkit.i18nText("Fine-Design_Advanced_More_Settings")); + actionLabel.addActionListener(evt -> { + JDialog wDialog = createJDialog(); + if (wDialog != null) { + wDialog.setVisible(true); } - // ChartSet - String[] defaultEncode = new String[]{Toolkit.i18nText("Fine-Design_Encode_Auto")}; - charSetComboBox = new UIComboBox(ArrayUtils.addAll(defaultEncode, EncodeConstants.ENCODING_ARRAY)); - JPanel chartSetPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); - chartSetPane.add(GUICoreUtils.createNamedPane(charSetComboBox, Toolkit.i18nText("Fine-Design_Basic_Datasource_Charset") + ":")); - advancedPanel.add(chartSetPane); + }); + JPanel advancePane = getAdvancePane(); + if (advancePane != null) { + advancedPanel.add(advancePane); } - northPane.add(advancedPanel); + advancedPanel.add( + row(cell(actionLabel),flex()).getComponent()); + corePane.add(getSshPane()); + corePane.add(getSslPane()); } private JDialog createJDialog() { - return JDBC.getAdvancedAttrPane() != null ? JDBC.getAdvancedAttrPane().showWindow(SwingUtilities.getWindowAncestor(mainPanel)) : null; + return JDBC.getAdvancedAttrPane() != null ? + JDBC.getAdvancedAttrPane().showWindow(SwingUtilities.getWindowAncestor(mainPanel)) : null; } private void initDialogPane() { diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java index e8c7c17b8e..4646d4da8d 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java @@ -1,12 +1,14 @@ package com.fr.design.data.datapane.connect; -import com.fr.base.GraphHelper; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIUtils; import com.fr.data.driver.DriverLoader; import com.fr.data.driver.config.DriverLoaderConfig; import com.fr.data.impl.JDBCDatabaseConnection; import com.fr.data.solution.entity.DriverClasses; -import com.fr.design.border.UITitledBorder; -import com.fr.design.constants.UIConstants; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.gui.core.ReactiveCardPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icombobox.UIComboBoxUI; @@ -15,9 +17,6 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ipasswordfield.UIPasswordFieldWithFixedLength; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; import com.fr.design.utils.BrowseUtils; import com.fr.file.filter.ChooseFileFilter; @@ -29,8 +28,6 @@ import com.fr.stable.StringUtils; import com.fr.third.guava.collect.HashBiMap; import com.fr.workspace.WorkContext; -import javax.swing.BorderFactory; -import javax.swing.ImageIcon; import javax.swing.JFileChooser; import javax.swing.JPanel; import javax.swing.JPasswordField; @@ -39,10 +36,6 @@ import javax.swing.event.DocumentListener; import javax.swing.plaf.ComboBoxUI; import javax.swing.plaf.basic.ComboPopup; import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputMethodEvent; @@ -59,6 +52,10 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.flex; + public class JDBCDefPane extends JPanel { public static final String DRIVER_TYPE = "driver_type"; public static final String USER_NAME = "user_name"; @@ -104,9 +101,8 @@ public class JDBCDefPane extends JPanel { private JPasswordField passwordTextField; private UIComboBox charSetComboBox; private ActionLabel odbcTipsLink; - private JPanel centerPanel; - private Component[][] allComponents; - private Component[][] partComponents; + private ReactiveCardPane centerPanel; + private ReactiveCardPane driverSelectRow; // 请不要改动dbtype,只应该最后添加 private final String[] dbtype = {"Oracle", "DB2", "SQL Server", "MySQL", "Sybase", "Access", "Derby", "Postgre", "SQLite", "Inceptor", OTHER_DB}; @@ -116,16 +112,18 @@ public class JDBCDefPane extends JPanel { private UIComboBox driverManageBox; private ActionLabel driverManageLabel; private UIComboBox driverLoaderBox; - ActionListener driverManageListener = new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - boolean selectSelfDefine = isSelfDefine(); - driverManageLabel.setVisible(selectSelfDefine); - driverLoaderBox.setVisible(selectSelfDefine); - driverComboBox.setVisible(!selectSelfDefine); - odbcTipsLink.setVisible(driverComboBox.isVisible() && ComparatorUtils.equals("sun.jdbc.odbc.JdbcOdbcDriver", driverComboBox.getSelectedItem())); + ActionListener driverManageListener = e -> changeDriverRow(); + + private void changeDriverRow() { + if (isSelfDefine()) { + driverSelectRow.select("define").populate(); + } else if (ComparatorUtils.equals("sun.jdbc.odbc.JdbcOdbcDriver", driverComboBox.getSelectedItem())) { + driverSelectRow.select("odbc").populate(); + } else { + driverSelectRow.select("normal").populate(); } - }; + } + ActionListener dbtypeActionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { @@ -162,27 +160,24 @@ public class JDBCDefPane extends JPanel { public JDBCDefPane() { initMap(); - this.setBorder(UITitledBorder.createBorderWithTitle("JDBC" + ":")); - this.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); - JPanel innerthis = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - innerthis.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - this.add(innerthis); + this.setLayout(new BorderLayout()); dbtypeComboBox = new UIComboBox(); dbtypeComboBox.setName(DRIVER_TYPE); - for (int i = 0; i < dbtype.length; i++) { - dbtypeComboBox.addItem(dbtype[i]); + for (String s : dbtype) { + dbtypeComboBox.addItem(s); } dbtypeComboBox.addActionListener(dbtypeActionListener); dbtypeComboBox.setMaximumRowCount(10); + driverLoaderBox = new SpecialUIComboBox(); refreshDriverLoader(); - driverLoaderBox.setPreferredSize(new Dimension(200, driverLoaderBox.getPreferredSize().height)); driverLoaderBox.setEditable(false); + driverManageBox = new UIComboBox(); refreshDriverManage(true); driverManageBox.setEditable(false); driverManageBox.addActionListener(driverManageListener); - driverLoaderBox.setVisible(isSelfDefine()); + driverComboBox = new UIComboBox(); driverComboBox.setEditable(true); driverComboBox.addActionListener(driverListener); @@ -198,124 +193,117 @@ public class JDBCDefPane extends JPanel { userNameTextField.setName(USER_NAME); passwordTextField = new UIPasswordFieldWithFixedLength(15); dbtypeButton = new UIButton(); - dbtypeButton.setIcon(new ImageIcon(UIConstants.ACCESSIBLE_EDITOR_DOT)); - dbtypeButton.setPreferredSize(new Dimension(20, 20)); + dbtypeButton.setIcon(new LazyIcon("dot")); dbtypeButton.setToolTipText(Toolkit.i18nText("Fine-Design_Basic_Click_Get_Default_URL")); dbtypeButton.addActionListener(dbtypeButtonActionListener); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - JPanel dbtypePane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - dbtypePane.add(new UILabel((Toolkit.i18nText("Fine-Design_Basic_Database") + ":"))); - Component[][] dbtypeComComponents = {{dbtypeComboBox}}; - double[] dbtypeRowSize = {p}; - double[] dbtypeColumnSize = {p}; - JPanel dbtypeComPane = TableLayoutHelper.createTableLayoutPane(dbtypeComComponents, dbtypeRowSize, dbtypeColumnSize); - - JPanel driverPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - driverPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Driver") + ":")); + JPanel dbTypeRow = row( + cell(new UILabel((Toolkit.i18nText("Fine-Design_Basic_Database")))).weight(1.2), + cell(dbtypeComboBox).weight(2), + flex(5.8) + ).getComponent(); + // 选择ODBC数据源的时候的提示链接 - JPanel odbcTipsPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - odbcTipsLink = new ActionLabel(Toolkit.i18nText("Fine-Design_Basic_Odbc_Tips")) { - @Override - public void paintComponent(Graphics _gfx) { - super.paintComponent(_gfx); - _gfx.setColor(Color.blue); - _gfx.drawLine(0, this.getHeight() - 1, GraphHelper.getWidth(this.getText()), this.getHeight() - 1); - } - }; - odbcTipsPane.add(odbcTipsLink); - odbcTipsLink.setPreferredSize(new Dimension(GraphHelper.getWidth(Toolkit.i18nText("Fine-Design_Basic_Odbc_Tips")), odbcTipsLink.getPreferredSize().height)); - odbcTipsLink.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - String url = CloudCenter.getInstance().acquireUrlByKind("odbc.help"); - BrowseUtils.browser(url); - } + odbcTipsLink = new ActionLabel(Toolkit.i18nText("Fine-Design_Basic_Odbc_Tips")); + odbcTipsLink.addActionListener(evt -> { + String url = CloudCenter.getInstance().acquireUrlByKind("odbc.help"); + BrowseUtils.browser(url); }); - driverManageLabel = new ActionLabel(Toolkit.i18nText("Fine-Design_Driver_Manage_Add_Driver")) { - @Override - public void paintComponent(Graphics _gfx) { - super.paintComponent(_gfx); - _gfx.setColor(Color.blue); - _gfx.drawLine(0, this.getHeight() - 1, GraphHelper.getWidth(this.getText()), this.getHeight() - 1); - } - }; - driverManageLabel.setPreferredSize(new Dimension(GraphHelper.getWidth(Toolkit.i18nText("Fine-Design_Driver_Manage_Add_Driver")), driverManageLabel.getPreferredSize().height)); - driverManageLabel.setVisible(isSelfDefine()); - driverManageLabel.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent evt) { - String url = CloudCenter.getInstance().acquireUrlByKind("driver.add.help"); - BrowseUtils.browser(url); - } + driverManageLabel = new ActionLabel(Toolkit.i18nText("Fine-Design_Driver_Manage_Add_Driver")); + driverManageLabel.addActionListener(evt -> { + String url = CloudCenter.getInstance().acquireUrlByKind("driver.add.help"); + BrowseUtils.browser(url); }); - odbcTipsPane.add(driverManageLabel); - odbcTipsPane.add(odbcTipsLink); - - JPanel driverComboBoxAndTips = new JPanel(new BorderLayout()); - JPanel normalFlowInnerContainer_s_pane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(0, 5, 0); - normalFlowInnerContainer_s_pane.add(driverManageBox); - normalFlowInnerContainer_s_pane.add(driverComboBox); - normalFlowInnerContainer_s_pane.add(driverLoaderBox); - driverComboBoxAndTips.add(normalFlowInnerContainer_s_pane, BorderLayout.WEST); - driverComboBoxAndTips.add(odbcTipsPane, BorderLayout.CENTER); - - JPanel hostPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - hostPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Host") + ":")); - Component[][] hostComComponents = {{hostTextField}}; - double[] hostRowSize = {p}; - double[] hostColumnSize = {p}; - JPanel hostComPane = TableLayoutHelper.createTableLayoutPane(hostComComponents, hostRowSize, hostColumnSize); - - JPanel portPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - portPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Port") + ":")); - Component[][] portComComponents = {{portTextField}}; - double[] portRowSize = {p}; - double[] portColumnSize = {p}; - JPanel portComPane = TableLayoutHelper.createTableLayoutPane(portComComponents, portRowSize, portColumnSize); - - JPanel dbNamePane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - dbNamePane.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_DatabaseName") + ":")); - Component[][] dbNameComComponents = {{dbNameTextField}}; - double[] dbNameRowSize = {p}; - double[] dbNameColumnSize = {p}; - JPanel dbNameComPane = TableLayoutHelper.createTableLayoutPane(dbNameComComponents, dbNameRowSize, dbNameColumnSize); - - JPanel urlPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - urlPane.add(new UILabel("URL:")); - Component[][] urlComComponents = {{urlTextField, dbtypeButton}}; - double[] urlRowSize = {p}; - double[] urlColumnSize = {f, 21}; - JPanel urlComPane = TableLayoutHelper.createCommonTableLayoutPane(urlComComponents, urlRowSize, urlColumnSize, 4); - - JPanel userPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - userPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Report_UserName") + ":")); - Component[][] userComComponents = {{userNameTextField, new UILabel(Toolkit.i18nText("Fine-Design_Basic_Password") + ":"), passwordTextField}}; - double[] userRowSize = {p}; - double[] userColumnSize = {f, p, f}; - JPanel userComPane = TableLayoutHelper.createCommonTableLayoutPane(userComComponents, userRowSize, userColumnSize, 4); + driverSelectRow = ReactiveCardPane.create() + .addSupplier("normal", () -> row( + cell(driverComboBox).weight(3), flex(2) + ).getComponent()) + .addSupplier("odbc", () -> row( + cell(driverComboBox).weight(3), flex(0.2), cell(odbcTipsLink).weight(1.8) + ).getComponent()) + .addSupplier("define", () -> row( + cell(driverLoaderBox).weight(3), cell(driverManageLabel).weight(2) + ).getComponent()); + changeDriverRow(); + + JPanel driverRow = row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Driver"))).weight(1.2), + cell(driverManageBox).weight(1.2), + flex(0.2), + cell(driverSelectRow).weight(4.6), + flex(1.8) + ).getComponent(); + + // 以下布局比例为对齐计算而出 + JPanel hostRow = row( + cell(new UILabel((Toolkit.i18nText("Fine-Design_Basic_Host")))).weight(1.2), + cell(hostTextField).weight(4.16), + flex(3.64) + ).getComponent(); + + JPanel portRow = row( + cell(new UILabel((Toolkit.i18nText("Fine-Design_Basic_Port")))).weight(1.2), + cell(portTextField).weight(4.16), + flex(3.64) + ).getComponent(); + + JPanel dbNameRow = row( + cell(new UILabel((Toolkit.i18nText("Fine-Design_Basic_DatabaseName")))).weight(1.2), + cell(dbNameTextField).weight(4.16), + flex(3.64) + ).getComponent(); + + JPanel urlRow = row( + cell(new UILabel("URL")).weight(1.2), + cell(urlTextField).weight(5.6), + flex(0.1), + cell(dbtypeButton).weight(0.3), + flex(1.8) + ).getComponent(); + + JPanel userRow = row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Report_UserName"))).weight(1.2), + cell(userNameTextField).weight(2.3), + flex(0.2), + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Password"))).weight(1.2), + cell(passwordTextField).weight(2.3), + flex(1.8) + ).getComponent(); String[] defaultEncode = new String[]{Toolkit.i18nText("Fine-Design_Encode_Auto")}; charSetComboBox = new UIComboBox(ArrayUtils.addAll(defaultEncode, EncodeConstants.ENCODING_ARRAY)); - JPanel chartSetPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - chartSetPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Datasource_Charset") + ":")); - Component[][] charSetComComponents = {{charSetComboBox}}; - double[] charSetRowSize = {p}; - double[] charSetColumnSize = {f}; - JPanel charSetComPane = TableLayoutHelper.createTableLayoutPane(charSetComComponents, charSetRowSize, charSetColumnSize); + JPanel charSetRow = row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Datasource_Charset"))).weight(1.2), + cell(charSetComboBox).weight(6), + flex(1.8) + ).getComponent(); //这边调整的话注意下面的changePane - allComponents = new Component[][]{{dbtypePane, dbtypeComPane}, {driverPane, driverComboBoxAndTips}, {hostPane, hostComPane}, - {portPane, portComPane}, {dbNamePane, dbNameComPane}, {userPane, userComPane}, - {chartSetPane, charSetComPane}, {urlPane, urlComPane}}; - partComponents = new Component[][]{{dbtypePane, dbtypeComPane}, {driverPane, driverComboBoxAndTips}, {urlPane, urlComPane}, - {userPane, userComPane}, {chartSetPane, charSetComPane}}; - double[] rowSize = {p, p, p, p, p, p, p, p}; - double[] columnSize = {p, f, 22}; - // REPORT-41450 Windows环境的jdk11下dpi为125%时会因为缩放导致显示问题,因此加个水平gap值 - centerPanel = TableLayoutHelper.createGapTableLayoutPane(allComponents, rowSize, columnSize, 6, 6); - innerthis.add(centerPanel); + centerPanel = ReactiveCardPane.create() + .addSupplier("all", () -> Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(dbTypeRow), + cell(driverRow), + cell(hostRow), + cell(portRow), + cell(dbNameRow), + cell(userRow), + cell(charSetRow), + cell(urlRow) + ).getComponent()) + .addSupplier("part", () -> Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(dbTypeRow), + cell(driverRow), + cell(urlRow), + cell(userRow), + cell(charSetRow) + ).getComponent()); + centerPanel.select("all").populate(); + + this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(new UILabel("JDBC")).with(FineUIUtils::wrapBoldLabelWithUnderline), + cell(centerPanel) + ).getComponent()); } private void refreshDriverLoader() { @@ -365,17 +353,10 @@ public class JDBCDefPane extends JPanel { } private void changePane(Object dbType) { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, f, 22}; if (ComparatorUtils.equals(dbType, OTHER_DB) || ComparatorUtils.equals(dbType, "Access") || ComparatorUtils.equals(dbType, "SQLite")) { - if (this.centerPanel.getComponentCount() != partComponents.length * 2) { - centerPanel.removeAll(); - TableLayoutHelper.addComponent2ResultPane(partComponents, new double[]{p, p, p, p, p}, columnSize, centerPanel); - } - } else if (this.centerPanel.getComponentCount() != allComponents.length * 2) { - centerPanel.removeAll(); - TableLayoutHelper.addComponent2ResultPane(allComponents, new double[]{p, p, p, p, p, p, p, p}, columnSize, centerPanel); + centerPanel.select("part").populate(); + } else { + centerPanel.select("all").populate(); } } @@ -488,8 +469,13 @@ public class JDBCDefPane extends JPanel { linkPanel.setVisible(DriverClasses.MYSQL.toString().equalsIgnoreCase((String) dbtypeComboBox.getSelectedItem()) && driverComboBox.getSelectedItem() != null && ComparatorUtils.equals(DriverClasses.MYSQL.getDriverClass(), driverComboBox.getSelectedItem().toString().trim())); - odbcTipsLink.setVisible(driverComboBox.getSelectedItem() != null - && ComparatorUtils.equals("sun.jdbc.odbc.JdbcOdbcDriver", driverComboBox.getSelectedItem().toString().trim())); // 选择的如果是ODBC就显示提示 + if (driverComboBox.getSelectedItem() != null + && ComparatorUtils.equals("sun.jdbc.odbc.JdbcOdbcDriver", driverComboBox.getSelectedItem().toString().trim())) { + driverSelectRow.select("odbc").populate(); + } else { + driverSelectRow.select("normal").populate(); + + } if (driverComboBox.getSelectedItem() == null || ComparatorUtils.equals(driverComboBox.getSelectedItem(), StringUtils.EMPTY)) { return; } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/SshPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/SshPane.java index 48f710dfbf..c404078263 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/SshPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/SshPane.java @@ -1,5 +1,8 @@ package com.fr.design.data.datapane.connect; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIUtils; import com.fr.data.impl.JDBCDatabaseConnection; import com.fr.data.security.ssh.BaseSsh; import com.fr.data.security.ssh.Ssh; @@ -8,10 +11,10 @@ import com.fr.data.security.ssh.SshType; import com.fr.data.security.ssh.impl.KeyVerifySsh; import com.fr.data.security.ssh.impl.NormalSsh; import com.fr.data.security.ssl.SslUtils; -import com.fr.design.border.UITitledBorder; -import com.fr.design.constants.UIConstants; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.editor.editor.NotNegativeIntegerEditor; +import com.fr.design.gui.core.ReactiveCardPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icombobox.UIComboBox; @@ -19,29 +22,22 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ipasswordfield.UIPasswordFieldWithFixedLength; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.file.FILE; import com.fr.file.FILEChooserPane; import com.fr.file.filter.ChooseFileFilter; import com.fr.stable.StringUtils; import com.fr.third.guava.collect.HashBiMap; -import javax.swing.ImageIcon; -import javax.swing.JPanel; import javax.swing.JPasswordField; -import javax.swing.SwingConstants; import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.cell; import static com.fr.design.i18n.Toolkit.i18nText; /** @@ -58,114 +54,135 @@ public class SshPane extends BasicPane { typeMap.put(Toolkit.i18nText("Fine-Design_Basic_Ssh_Public_Key"), SshType.KEY); } - private UICheckBox usingSsh = new UICheckBox(i18nText("Fine-Design_Basic_Ssh_Using")); - private NotNegativeIntegerEditor port = new NotNegativeIntegerEditor(20); - private UITextField ip = new UITextField(20); - private UIComboBox type = new UIComboBox(); - private UITextField user = new UITextField(20); - private JPasswordField password = new UIPasswordFieldWithFixedLength(20); - private JPasswordField secret = new UIPasswordFieldWithFixedLength(20); - private KeyFileUITextField keyPath = new KeyFileUITextField(18); - private JPanel contextPane; - private Component[][] passwordComps; - private Component[][] keyComps; - private double p = TableLayout.PREFERRED; - private double f = TableLayout.FILL; - private JPanel jPanel; - private UIButton fileChooserButton = new UIButton(); - private double[] columnSize = new double[]{195, p}; + private final UICheckBox usingSsh = new UICheckBox(i18nText("Fine-Design_Basic_Ssh_Using")); + private final NotNegativeIntegerEditor port = new NotNegativeIntegerEditor(20); + private final UITextField ip = new UITextField(20); + private final UIComboBox type = new UIComboBox(); + private final UITextField user = new UITextField(20); + private final JPasswordField password = new UIPasswordFieldWithFixedLength(20); + private final JPasswordField secret = new UIPasswordFieldWithFixedLength(20); + private final KeyFileUITextField keyPath = new KeyFileUITextField(18); + private ReactiveCardPane coreCardPane; + private ReactiveCardPane verifyCardPane; + private final UIButton fileChooserButton = new UIButton(); + + private static final String USE_SSH = "useSSH"; + private static final String NOT_USE_SSH = "notUseSSH"; + private static final String USE_PASSWORD = "usePassword"; + private static final String USE_KEY = "useKey"; + public SshPane() { - fileChooserButton.setIcon(new ImageIcon(UIConstants.ACCESSIBLE_EDITOR_DOT)); - this.setBorder(UITitledBorder.createBorderWithTitle(Toolkit.i18nText("Fine-Design_Basic_Ssh_Settings"))); - this.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); + this.setLayout(new BorderLayout()); + + fileChooserButton.setIcon(new LazyIcon("dot")); typeMap.keySet().forEach(key -> type.addItem(key)); type.setSelectedItem(typeMap.inverse().get(SshType.KEY)); - jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - fileChooserButton.setPreferredSize(new Dimension(20, 20)); type.setEditable(false); type.setSelectedItem(Toolkit.i18nText("Fine-Design_Basic_Ssh_Private_Key")); - JPanel filePanel = TableLayoutHelper.createCommonTableLayoutPane(new Component[][]{{keyPath, fileChooserButton}}, new double[]{p}, new double[]{f, 20}, 0); - Component[] compIp = {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Host") + ":", SwingConstants.RIGHT), ip}; - Component[] compPort = {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Port") + ":", SwingConstants.RIGHT), port}; - Component[] compUserName = {new UILabel(Toolkit.i18nText("Fine-Design_Report_UserName") + ":", SwingConstants.RIGHT), user}; - Component[] compMethod = {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Ssh_Verify_Method") + ":", SwingConstants.RIGHT), type}; - Component[] compPassword = {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Password") + ":", SwingConstants.RIGHT), password}; - Component[] compKey = {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Ssh_Private_Key") + ":", SwingConstants.RIGHT), filePanel}; - Component[] comSecret = {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Ssh_Secret") + ":", SwingConstants.RIGHT), secret}; - - passwordComps = new Component[][]{ - compIp, - compPort, - compUserName, - compMethod, - compPassword - }; - keyComps = new Component[][]{ - compIp, - compPort, - compUserName, - compMethod, - compKey, - comSecret - }; - usingSsh.setSelected(true); - contextPane = TableLayoutHelper.createGapTableLayoutPane(keyComps, new double[]{p, p, p, p, p, p}, columnSize, 11, 11); - jPanel.add(usingSsh, BorderLayout.NORTH); - jPanel.add(contextPane, BorderLayout.CENTER); - this.add(jPanel); - - usingSsh.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - changePane(); - } - }); - type.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - changePaneForType(); - } - }); - fileChooserButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - FILEChooserPane fileChooser = FILEChooserPane.getInstanceWithDesignatePath(SslUtils.PREFIX, new ChooseFileFilter(true), SslUtils.CERTIFICATES); - int type = fileChooser.showOpenDialog(SshPane.this, StringUtils.EMPTY); - if (type == FILEChooserPane.OK_OPTION) { - final FILE file = fileChooser.getSelectedFILE(); - if (file == null) { - keyPath.setText(StringUtils.EMPTY); - } else { - keyPath.setText(file.getPath()); - } + initVerifyCardPane(); + initCoreCardPane(); + + initListeners(); + + this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Ssh_Settings"))).with(FineUIUtils::wrapBoldLabelWithUnderline), + cell(coreCardPane) + ).getComponent()); + } + + private void initListeners() { + usingSsh.addActionListener(e -> changePane()); + + type.addActionListener(e -> changePaneForType()); + fileChooserButton.addActionListener(e -> { + FILEChooserPane fileChooser = FILEChooserPane.getInstanceWithDesignatePath(SslUtils.PREFIX, new ChooseFileFilter(true), SslUtils.CERTIFICATES); + int type = fileChooser.showOpenDialog(SshPane.this, StringUtils.EMPTY); + if (type == FILEChooserPane.OK_OPTION) { + final FILE file = fileChooser.getSelectedFILE(); + if (file == null) { + keyPath.setText(StringUtils.EMPTY); + } else { + keyPath.setText(file.getPath()); } - fileChooser.removeAllFilter(); - fileChooser.removeTopPath(); } + fileChooser.removeAllFilter(); + fileChooser.removeTopPath(); }); } + private void initCoreCardPane() { + coreCardPane = ReactiveCardPane.create() + .addSupplier(NOT_USE_SSH, () -> cell(usingSsh).getComponent()) + .addSupplier(USE_SSH, () -> Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(usingSsh), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Host"))).weight(1), + cell(ip).weight(5), + flex(6) + ), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Port"))).weight(1), + cell(port).weight(5), + flex(6) + ), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Report_UserName"))).weight(1), + cell(user).weight(5), + flex(6) + ), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Ssh_Verify_Method"))).weight(1), + cell(type).weight(5), + flex(6) + ), + cell(verifyCardPane) + ).getComponent()); + coreCardPane.select(USE_SSH).populate(); + } + + private void initVerifyCardPane() { + verifyCardPane = ReactiveCardPane.create() + .addSupplier(USE_PASSWORD, () -> Layouts.row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Password"))).weight(1), + cell(password).weight(5), + flex(6) + ).getComponent()) + .addSupplier(USE_KEY, () -> Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Ssh_Private_Key"))).weight(1), + cell(keyPath).weight(4.5), + flex(0.1), + cell(fileChooserButton).weight(0.4), + flex(6) + ), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Ssh_Secret"))).weight(1), + cell(secret).weight(5), + flex(6) + ) + ).getComponent()); + + verifyCardPane.select(USE_KEY).populate(); + } + private void changePane() { - contextPane.setVisible(usingSsh.isSelected()); + coreCardPane.select(usingSsh.isSelected() ? USE_SSH: NOT_USE_SSH).populate(); } private void changePaneForType() { - contextPane.removeAll(); switch (typeMap.get(type.getSelectedItem())) { case NORMAL: - TableLayoutHelper.addComponent2ResultPane(passwordComps, new double[]{p, p, p, p, p}, columnSize, contextPane); + verifyCardPane.select(USE_PASSWORD).populate(); break; case KEY: - TableLayoutHelper.addComponent2ResultPane(keyComps, new double[]{p, p, p, p, p, p}, columnSize, contextPane); + verifyCardPane.select(USE_KEY).populate(); break; default: throw new SshException("un support ssh type"); } - jPanel.revalidate(); - jPanel.repaint(); } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/SslPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/SslPane.java index 8789a39a18..10cd4e5e2f 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/SslPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/SslPane.java @@ -1,37 +1,36 @@ package com.fr.design.data.datapane.connect; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIUtils; import com.fr.data.impl.JDBCDatabaseConnection; import com.fr.data.security.ssl.Ssl; import com.fr.data.security.ssl.SslException; import com.fr.data.security.ssl.SslType; import com.fr.data.security.ssl.SslUtils; import com.fr.data.security.ssl.impl.NormalSsl; -import com.fr.design.border.UITitledBorder; -import com.fr.design.constants.UIConstants; +import com.fr.design.constants.LayoutConstants; import com.fr.design.data.datapane.connect.SshPane.KeyFileUITextField; import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.core.ReactiveCardPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.file.FILE; import com.fr.file.FILEChooserPane; import com.fr.file.filter.ChooseFileFilter; import com.fr.stable.StringUtils; -import javax.swing.ImageIcon; -import javax.swing.JPanel; import javax.swing.SwingConstants; import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.cell; import static com.fr.design.i18n.Toolkit.i18nText; /** @@ -41,65 +40,66 @@ import static com.fr.design.i18n.Toolkit.i18nText; */ public class SslPane extends BasicPane { UICheckBox usingSsl = new UICheckBox(i18nText("Fine-Design_Basic_Ssl_Using")); - private KeyFileUITextField keyPathCa = new KeyFileUITextField(18); - private UIButton fileChooserButtonCa = new UIButton(); - private KeyFileUITextField keyPathClientCert = new KeyFileUITextField(18); - private UIButton fileChooserButtonClientCert = new UIButton(); - private KeyFileUITextField keyPathClientKey = new KeyFileUITextField(18); - private UIButton fileChooserButtonClientKey = new UIButton(); - private UICheckBox verifyCa = new UICheckBox(i18nText("Fine-Design_Basic_Ssl_Verify_Ca")); -// private UITextField cipher = new UITextField(20); - private JPanel jPanel; - private Component[][] usingComps; - private double p = TableLayout.PREFERRED; - private double f = TableLayout.FILL; - private JPanel contextPane; - private double[] columnSize = new double[]{195, p}; + private final KeyFileUITextField keyPathCa = new KeyFileUITextField(18); + private final UIButton fileChooserButtonCa = new UIButton(); + private final KeyFileUITextField keyPathClientCert = new KeyFileUITextField(18); + private final UIButton fileChooserButtonClientCert = new UIButton(); + private final KeyFileUITextField keyPathClientKey = new KeyFileUITextField(18); + private final UIButton fileChooserButtonClientKey = new UIButton(); + private final UICheckBox verifyCa = new UICheckBox(i18nText("Fine-Design_Basic_Ssl_Verify_Ca")); + private final ReactiveCardPane cardPane; public SslPane() { - fileChooserButtonCa.setIcon(new ImageIcon(UIConstants.ACCESSIBLE_EDITOR_DOT)); - fileChooserButtonClientCert.setIcon(new ImageIcon(UIConstants.ACCESSIBLE_EDITOR_DOT)); - fileChooserButtonClientKey.setIcon(new ImageIcon(UIConstants.ACCESSIBLE_EDITOR_DOT)); - this.setBorder(UITitledBorder.createBorderWithTitle(Toolkit.i18nText("Fine-Design_Basic_Ssl_Settings"))); - this.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); - jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - Dimension dimension = new Dimension(20, 20); - fileChooserButtonCa.setPreferredSize(dimension); - fileChooserButtonClientCert.setPreferredSize(dimension); - fileChooserButtonClientKey.setPreferredSize(dimension); - JPanel filePanelCa = TableLayoutHelper.createCommonTableLayoutPane(new Component[][]{{keyPathCa, fileChooserButtonCa}}, new double[]{p}, new double[]{f, 20}, 0); - Component[] compCa = {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Ssl_Ca") + ":", SwingConstants.RIGHT), filePanelCa}; - Component[] compVerifyCa = {null, verifyCa}; - JPanel filePanelClientKey = TableLayoutHelper.createCommonTableLayoutPane(new Component[][]{{keyPathClientKey, fileChooserButtonClientKey}}, new double[]{p}, new double[]{f, 20}, 0); - Component[] compClientKey = {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Ssl_Client_Key") + ":", SwingConstants.RIGHT), filePanelClientKey}; - JPanel filePanelClientCert = TableLayoutHelper.createCommonTableLayoutPane(new Component[][]{{keyPathClientCert, fileChooserButtonClientCert}}, new double[]{p}, new double[]{f, 20}, 0); - Component[] compClientCert = {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Ssl_Client_Cert") + ":", SwingConstants.RIGHT), filePanelClientCert}; -// Component[] comCipher = {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Ssl_Cipher") + ":", SwingConstants.RIGHT), cipher}; - usingComps = new Component[][]{ - compCa, - compVerifyCa, - compClientKey, - compClientCert -// comCipher - }; + initDotButtons(); + this.setLayout(new BorderLayout()); usingSsl.setSelected(true); - contextPane = TableLayoutHelper.createGapTableLayoutPane(usingComps, new double[]{p, p, p, p}, columnSize, 11, 11); - jPanel.add(usingSsl, BorderLayout.NORTH); - jPanel.add(contextPane, BorderLayout.CENTER); - this.add(jPanel); - usingSsl.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - changePane(); - } - }); + cardPane = ReactiveCardPane.create() + .addSupplier("notUseSSL", () -> cell(usingSsl).getComponent()) + .addSupplier("useSSL", () -> Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(usingSsl), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Ssl_Ca"), SwingConstants.LEFT)).weight(1), + cell(keyPathCa).weight(1.3), + flex(0.05), + cell(fileChooserButtonCa).weight(0.15), + flex(2) + ), + cell(verifyCa), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Ssl_Client_Key"), SwingConstants.LEFT)).weight(1), + cell(keyPathClientKey).weight(1.3), + flex(0.05), + cell(fileChooserButtonClientKey).weight(0.15), + flex(2) + ), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Ssl_Client_Cert"), SwingConstants.LEFT)).weight(1), + cell(keyPathClientCert).weight(1.3), + flex(0.05), + cell(fileChooserButtonClientCert).weight(0.15), + flex(2) + ) + ).getComponent() + ); + cardPane.select("useSSL").populate(); + this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Ssl_Settings"))).with(FineUIUtils::wrapBoldLabelWithUnderline), + cell(cardPane) + ).getComponent()); + usingSsl.addActionListener(e -> changePane()); + } + + private void initDotButtons() { + fileChooserButtonCa.setIcon(new LazyIcon("dot")); + fileChooserButtonClientCert.setIcon(new LazyIcon("dot")); + fileChooserButtonClientKey.setIcon(new LazyIcon("dot")); fileChooserButtonCa.addActionListener(new TextFieldActionListener(keyPathCa)); fileChooserButtonClientCert.addActionListener(new TextFieldActionListener(keyPathClientCert)); fileChooserButtonClientKey.addActionListener(new TextFieldActionListener(keyPathClientKey)); } private void changePane() { - contextPane.setVisible(usingSsl.isSelected()); + cardPane.select(usingSsl.isSelected() ? "useSSL" : "notUseSSL").populate(); } @@ -120,7 +120,6 @@ public class SslPane extends BasicPane { keyPathClientCert.setText(normalSsl.getClientCertificate()); keyPathClientKey.setText(normalSsl.getClientPrivateKey()); verifyCa.setSelected(normalSsl.isVerifyCa()); -// cipher.setText(normalSsl.getCipher()); } else { throw new SslException("un support ssl type"); } @@ -130,7 +129,6 @@ public class SslPane extends BasicPane { public void update(JDBCDatabaseConnection jdbcDatabase) { NormalSsl normalSsl = new NormalSsl(); -// normalSsl.setCipher(cipher.getText().trim()); normalSsl.setVerifyCa(verifyCa.isSelected()); normalSsl.setCaCertificate(keyPathCa.getText().trim()); normalSsl.setClientCertificate(keyPathClientCert.getText().trim()); @@ -140,7 +138,7 @@ public class SslPane extends BasicPane { } private class TextFieldActionListener implements ActionListener { - private UITextField textField; + private final UITextField textField; public TextFieldActionListener(UITextField textField) { this.textField = textField; diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java index dcfecd81cf..35c5a2c68f 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java @@ -4,6 +4,7 @@ import com.fine.swing.ui.layout.Layouts; import com.fine.theme.icon.LazyIcon; import com.fine.theme.light.ui.FineRoundBorder; import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIStyle; import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.base.BaseFormula; import com.fr.base.BaseUtils; @@ -1361,7 +1362,9 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { private JPanel createNamePane(String name, JComponent comp) { JPanel namePane = new JPanel(new BorderLayout(0, 4)); - namePane.add(new UILabel(name), BorderLayout.NORTH); + UILabel label = new UILabel(name); + FineUIStyle.setStyle(label, FineUIStyle.LABEL_BOLD); + namePane.add(label, BorderLayout.NORTH); namePane.add(comp, BorderLayout.CENTER); return namePane; } diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/JControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/JControlPane.java index 37fef509db..2f73936c7a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/JControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/JControlPane.java @@ -1,5 +1,7 @@ package com.fr.design.gui.controlpane; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.fr.design.border.FineBorderFactory; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.controlpane.shortcutfactory.AbstractShortCutFactory; import com.fr.design.gui.controlpane.shortcutfactory.OldShortCutFactory; @@ -7,16 +9,15 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.menu.ToolBarDef; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.ArrayUtils; import com.fr.stable.Filter; import com.fr.stable.Nameable; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.JSplitPane; import java.awt.BorderLayout; import java.awt.CardLayout; +import java.awt.Color; import java.util.Arrays; import java.util.stream.Stream; @@ -107,7 +108,6 @@ abstract class JControlPane extends BasicPane implements UnrepeatedNameHelper, S initCardPane(); // SplitPane JSplitPane mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, getLeftPane(), cardPane); - mainSplitPane.setBorder(BorderFactory.createLineBorder(GUICoreUtils.getTitleLineBorderColor())); mainSplitPane.setOneTouchExpandable(true); this.add(mainSplitPane, BorderLayout.CENTER); @@ -163,7 +163,8 @@ abstract class JControlPane extends BasicPane implements UnrepeatedNameHelper, S } initToolBar(); - + toolBar.setBorder(FineBorderFactory.createUnderlineBorder(FlatUIUtils.getUIColor("defaultBorderColor", Color.GRAY))); + toolBar.setBorderPainted(true); leftPane.add(toolBar, BorderLayout.NORTH); return leftPane; } diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java index dfece2e133..3dec4e1c32 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java @@ -1,6 +1,10 @@ package com.fr.design.gui.controlpane; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineRoundBorder; +import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.border.FineBorderFactory; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilist.JNameEdList; @@ -10,14 +14,12 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.form.event.Listener; import com.fr.general.ComparatorUtils; -import com.fr.general.IOUtils; import com.fr.invoke.Reflect; import com.fr.stable.ArrayUtils; import com.fr.stable.Nameable; import com.fr.stable.StringUtils; import com.fr.stable.core.PropertyChangeAdapter; -import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.Icon; import javax.swing.JLabel; @@ -87,8 +89,9 @@ public abstract class JListControlPane extends JControlPane implements ListContr protected void initLeftPane(JPanel leftPane) { nameableList = createJNameList(); nameableList.setName(LIST_NAME); + nameableList.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); leftPane.add(new UIScrollPane(nameableList), BorderLayout.CENTER); - + leftPane.setBorder(new FineRoundBorder()); nameableList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); nameableList.addMouseListener(listMouseListener); nameableList.addListSelectionListener(new ListSelectionListener() { @@ -107,6 +110,12 @@ public abstract class JListControlPane extends JControlPane implements ListContr }); } + @Override + protected void initToolBar() { + super.initToolBar(); + toolBar.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); + } + protected JNameEdList createJNameList() { JNameEdList nameEdList = new JNameEdList(new DefaultListModel()) { @Override @@ -355,19 +364,17 @@ public abstract class JListControlPane extends JControlPane implements ListContr /** * JList默认单元格渲染器的选中背景色 */ - private final Color selectedBgColor = new Color(65, 155, 249); protected NameableListCellRenderer() { setLayout(new BorderLayout()); this.textLabel = new JLabel(); this.iconLabel = new JLabel(); - this.textLabel.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 1)); - this.iconLabel.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 0)); add(this.textLabel, BorderLayout.CENTER); add(this.iconLabel, BorderLayout.WEST); - this.iconLabel.setBackground(Color.WHITE); + this.iconLabel.setBackground(FlatUIUtils.getUIColor("List.cellRender.background", Color.WHITE)); //iconLabel和textLabel的背景颜色不会被JList背景颜色覆盖,开发者自定义 this.textLabel.setOpaque(true); this.iconLabel.setOpaque(true); + this.setBorder(FineBorderFactory.createUnderlineBorder(FlatUIUtils.getUIColor("defaultBorderColor", Color.GRAY))); } @Override @@ -380,11 +387,9 @@ public abstract class JListControlPane extends JControlPane implements ListContr this.textLabel.setText(nameable.getName()); boolean iconSet = false; if(isSelected) { - this.textLabel.setBackground(selectedBgColor); - this.textLabel.setForeground(Color.WHITE); + this.textLabel.setBackground(FlatUIUtils.getUIColor("List.selectionInactiveBackground", Color.GRAY)); } else { - this.textLabel.setBackground(Color.WHITE); - this.textLabel.setForeground(Color.BLACK); + this.textLabel.setBackground(FlatUIUtils.getUIColor("List.cellRender.background", Color.WHITE)); } for (NameableCreator creator : JListControlPane.this.creators()) { if (creator.menuIcon() != null && creator.acceptObject2Populate(nameable) != null) { @@ -395,7 +400,7 @@ public abstract class JListControlPane extends JControlPane implements ListContr } } if (!iconSet) { - this.setIcon(IOUtils.readIcon("/com/fr/base/images/oem/cpt.png")); + this.setIcon(new LazyIcon("cpt_icon")); } } return this; diff --git a/designer-base/src/main/java/com/fr/design/gui/ilable/ActionLabel.java b/designer-base/src/main/java/com/fr/design/gui/ilable/ActionLabel.java index c98455a58f..b4dc77e923 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ilable/ActionLabel.java +++ b/designer-base/src/main/java/com/fr/design/gui/ilable/ActionLabel.java @@ -1,5 +1,7 @@ package com.fr.design.gui.ilable; +import com.formdev.flatlaf.ui.FlatUIUtils; + import javax.swing.event.MouseInputAdapter; import java.awt.Color; import java.awt.Cursor; @@ -13,12 +15,12 @@ import java.awt.event.MouseEvent; */ public class ActionLabel extends UILabel { private ActionListener actionListener; - private Color color; + private final Color color; // 文字是否有下划线 private boolean drawUnderLine = true; public ActionLabel(String text) { - this(text, Color.blue); + this(text, FlatUIUtils.getUIColor("Label.hyperLinkColor", Color.BLUE)); } public ActionLabel(String text, boolean drawUnderLine) { diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java index e5e89bf72e..4a2525d7c1 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java @@ -42,11 +42,11 @@ public class FileTreeIcon { public static final Icon JPG_FILE_IMAGE_ICON = new LazyIcon("jpgFile"); public static final Icon BMP_FILE_IMAGE_ICON = new LazyIcon("bmpFile"); public static final Icon MODERN_CHT_FILE_IMAGE_ICON = new LazyIcon("chtFile"); + public static final Icon CPTX_ICON = new LazyIcon("cpt_icon"); // TODO: 以下Icon视觉暂未提供,需提供后替换 public static final Icon BLANK_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/blank.gif"); public static final Icon FOLDER_HALF_IMAGE_ICON = IconUtils.readIcon("/com/fr/design/standard/fileicon/folder_half_authority.svg"); - public static final Icon CPTX_ICON = IconUtils.readIcon("/com/fr/design/standard/fileicon/cptx_icon.svg"); public static final Icon CPTX_LOCKED_ICON = IconUtils.readIcon("/com/fr/design/standard/fileicon/cptx_icon_locked.svg"); public static final LockIcon FOLDER_LOCK_ICON = diff --git a/designer-base/src/main/java/com/fr/design/mainframe/WestRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/WestRegionContainerPane.java index e1f5ff3ad1..8d037e330c 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/WestRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/WestRegionContainerPane.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe; +import com.fine.theme.utils.FineUIScale; import com.fr.design.DesignModelAdapter; import com.fr.design.DesignerEnvManager; import com.fr.design.data.datapane.TableDataTreePane; @@ -16,6 +17,7 @@ import com.fr.stable.Constants; public class WestRegionContainerPane extends UIResizableContainer { private static WestRegionContainerPane THIS; + private static final int WEST_CONTAINER_WIDTH = 165; /** * 得到实例 @@ -56,7 +58,6 @@ public class WestRegionContainerPane extends UIResizableContainer { } }); - setContainerWidth(165); -// setBackground(UIConstants.TREE_BACKGROUND); + setContainerWidth(FineUIScale.scale(WEST_CONTAINER_WIDTH)); } } diff --git a/designer-base/src/main/resources/com/fine/theme/icon/expand/forbid.svg b/designer-base/src/main/resources/com/fine/theme/icon/expand/forbid.svg new file mode 100755 index 0000000000..7196cbd02f --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/expand/forbid.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/expand/forbid_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/expand/forbid_disable.svg new file mode 100755 index 0000000000..9a161d213a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/expand/forbid_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/expand/horizontal.svg b/designer-base/src/main/resources/com/fine/theme/icon/expand/horizontal.svg new file mode 100755 index 0000000000..bce0ec62e2 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/expand/horizontal.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/expand/horizontal_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/expand/horizontal_disable.svg new file mode 100755 index 0000000000..a5fa259837 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/expand/horizontal_disable.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/expand/vertical.svg b/designer-base/src/main/resources/com/fine/theme/icon/expand/vertical.svg new file mode 100755 index 0000000000..52375c61c7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/expand/vertical.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/expand/vertical_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/expand/vertical_disable.svg new file mode 100755 index 0000000000..bbacb6db0f --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/expand/vertical_disable.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index 266c1fd719..d9deea101b 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -399,6 +399,9 @@ FormattedTextField.iconTextGap = 4 # ---- Label ---- Label.tipColor = @BrandTipColor +Label.borderColor = $defaultBorderColor +Label.hyperLinkColor = #2576EF +Label.strongHintColor = #FF0000 #---- HelpButton ---- @@ -421,8 +424,8 @@ HelpButton.innerFocusWidth = $?Button.innerFocusWidth #---- List ---- -List.border = 2,2,2,2 -List.cellMargins = 1,6,1,6 +List.border = 0,0,0,0 +List.cellMargins = 1,12,1,12 List.selectionInsets = 0,0,0,0 List.selectionArc = 0 List.cellFocusColor = @cellFocusColor @@ -540,7 +543,7 @@ PasswordField.capsLockIconColor = #00000064 PasswordField.revealIconColor = tint(@foreground,40%) PasswordField.border = com.formdev.flatlaf.ui.FlatTextBorder PasswordField.margin = @componentMargin -PasswordField.background = @componentBackground +PasswordField.background = $fill.normal PasswordField.placeholderForeground = @disabledForeground PasswordField.iconTextGap = 4 PasswordField.echoChar = \u2022 @@ -669,7 +672,7 @@ ScrollBar.largeBar.buttonBackground = $ScrollBar.track #---- ScrollPane ---- -ScrollPane.border = com.formdev.flatlaf.ui.FlatBorder +ScrollPane.border = null ScrollPane.background = $ScrollBar.track ScrollPane.fillUpperCorner = true ScrollPane.smoothScrolling = true @@ -765,6 +768,8 @@ FormulaPane.buttonHeight=$Component.defaultHeight SplitPane.dividerSize = 5 SplitPane.continuousLayout = true SplitPane.border = null +# \u5F71\u54CD\u89C6\u89C9\u6548\u679C\uFF0C\u4E34\u65F6\u5148\u5173\u6389 +SplitPane.supportsOneTouchButtons = false SplitPane.centerOneTouchButtons = true SplitPane.oneTouchButtonSize = {scaledInteger}6 SplitPane.oneTouchButtonOffset = {scaledInteger}2 @@ -1293,4 +1298,7 @@ CellOtherSetPane.height=$Component.defaultHeight toolbar.margin: 1,1,1,1; \ toolbar.spacingInsets: 1,1,1,1; \ toolbar.hoverBackground: null; \ - toolbar.pressedBackground: null \ No newline at end of file + toolbar.pressedBackground: null + +[style]Label.boldLabel = \ + font: bold $defaultFont \ No newline at end of file diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellExpandAttrPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellExpandAttrPane.java index 7cff6e11a3..0d04bb77a4 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellExpandAttrPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellExpandAttrPane.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe.cell.settingpane; import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.icon.LazyIcon; import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.constants.LayoutConstants; import com.fr.design.expand.ExpandLeftFatherPane; @@ -53,9 +54,9 @@ public class CellExpandAttrPane extends AbstractCellAttrPane { public JPanel createContentPane() { String[] nameArray = {Toolkit.i18nText("Fine-Design_Report_ExpandD_Not_Expand"), Toolkit.i18nText("Fine-Design_Report_Utils_Top_To_Bottom"), Toolkit.i18nText("FIne-Design_Report_Utils_Left_To_Right")}; Icon[][] iconArray = { - {IOUtils.readIcon("/com/fr/design/images/expand/none16x16.png"), IOUtils.readIcon("/com/fr/design/images/expand/none16x16_selected@1x.png")}, - {IOUtils.readIcon("/com/fr/design/images/expand/vertical.png"), IOUtils.readIcon("/com/fr/design/images/expand/vertical_selected@1x.png")}, - {IOUtils.readIcon("/com/fr/design/images/expand/landspace.png"), IOUtils.readIcon("/com/fr/design/images/expand/landspace_selected@1x.png")} + {new LazyIcon("forbid"), new LazyIcon("forbid").white()}, + {new LazyIcon("vertical_expand"), new LazyIcon("vertical_expand").white()}, + {new LazyIcon("horizontal_expand"), new LazyIcon("horizontal_expand").white()} }; Byte[] valueArray = {Constants.NONE, Constants.TOP_TO_BOTTOM, Constants.LEFT_TO_RIGHT}; expandDirectionButton = new UIButtonGroup(iconArray, valueArray); From 20fe69c9fe25d974e26a88563a5b798174e12c43 Mon Sep 17 00:00:00 2001 From: vito Date: Wed, 10 Jan 2024 12:36:51 +0800 Subject: [PATCH 106/302] =?UTF-8?q?REPORT-99485=20=E6=82=AC=E6=B5=AE?= =?UTF-8?q?=E5=85=83=E7=B4=A0=E6=8C=89=E9=92=AE=E7=BB=98=E5=88=B6=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/ReportFloatPane.java | 86 ++++++------------- 1 file changed, 25 insertions(+), 61 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ReportFloatPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/ReportFloatPane.java index 73f8aabba2..67b88766c5 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ReportFloatPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ReportFloatPane.java @@ -1,29 +1,30 @@ package com.fr.design.mainframe; +import com.fine.swing.ui.layout.Column; +import com.fine.theme.icon.LazyIcon; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.actions.UpdateAction; import com.fr.design.actions.core.ActionFactory; -import com.fr.design.constants.UIConstants; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.itoolbar.UIToolbar; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.i18n.Toolkit; import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.MenuDef; -import javax.swing.BorderFactory; import javax.swing.JComponent; -import javax.swing.JPanel; -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; /** * 悬浮元素 - * Created by MoMeak on 2017/7/27. + * + * @author vito + * @since 9.0 + * Created 2017/7/27. */ -public class ReportFloatPane extends JPanel { +public class ReportFloatPane extends Column { private static ReportFloatPane THIS; private MenuDef insertFloatMenu; @@ -48,72 +49,35 @@ public class ReportFloatPane extends JPanel { } private void initComponent() { - this.setLayout(new BorderLayout()); - - UIToolbar topToolBar = new UIToolbar(); - topToolBar.setLayout(new BorderLayout()); + setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); + setSpacing(10); initInsertToolBar(); - topToolBar.setPreferredSize(new Dimension(155,20)); - topToolBar.add(createButtonUI(), BorderLayout.CENTER); - topToolBar.setBorder(BorderFactory.createEmptyBorder(-1, -1, -1, -1)); + this.add( + row(10, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Add_FloatElement"))), + cell(createButtonUI()).weight(1.0) + ) + ); - JPanel toolBarPane = new JPanel(new BorderLayout()); - toolBarPane.add(topToolBar, BorderLayout.CENTER); - toolBarPane.setBorder(BorderFactory.createLineBorder(UIConstants.POP_DIALOG_BORDER)); - toolBarPane.setPreferredSize(new Dimension(155,20)); - UILabel emptyLabel = new UILabel(); - emptyLabel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 0)); - - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, p, p, f}; - double[] rowSize = {p}; - Component[][] components = new Component[][]{ - new Component[]{new UILabel(), new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Add_FloatElement")), emptyLabel, toolBarPane}, - }; - JPanel leftTopPane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); - leftTopPane.setBorder(BorderFactory.createEmptyBorder(12, 5, 0, 15)); - this.add(leftTopPane, BorderLayout.NORTH); } private void initInsertToolBar() { insertFloatMenu = new MenuDef(true); insertFloatMenu.setName(KeySetUtils.INSERT_FLOAT.getMenuKeySetName()); - insertFloatMenu.setTooltip(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_T_Insert_Float")); - insertFloatMenu.setIconPath("com/fr/design/images/control/addPopup.png"); + insertFloatMenu.setTooltip(Toolkit.i18nText("Fine-Design_Report_T_Insert_Float")); + insertFloatMenu.setIcon(new LazyIcon("add")); JTemplate editingTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); JComponent currentElementCasePane = editingTemplate.getCurrentElementCasePane(); if (currentElementCasePane != null) { insertFloatMenu.clearShortCuts(); UpdateAction[] actions = ActionFactory.createFloatInsertAction(ElementCasePane.class, currentElementCasePane); - for (int i = 0; i < actions.length; i++) { - insertFloatMenu.addShortCut(actions[i]); + for (UpdateAction action : actions) { + insertFloatMenu.addShortCut(action); } } } private UIButton createButtonUI() { - UIButton createdButton = insertFloatMenu.createUIButton(); - // 此按钮单独抽出,不应使用工具栏外观 -// if (!createdButton.isOpaque()) { -// createdButton.setOpaque(true); -// createdButton.setNormalPainted(true); -// createdButton.setBorderPaintedOnlyWhenPressed(false); -// } - return createdButton; - } - - - public static void main(String[] args) { -// JFrame jf = new JFrame("test"); -// jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); -// JPanel content = (JPanel) jf.getContentPane(); -// content.setLayout(new BorderLayout()); -// content.add(ReportFloatPane.getInstance(), BorderLayout.CENTER); -// GUICoreUtils.centerWindow(jf); -// jf.setSize(250, 400); -// jf.setVisible(true); + return insertFloatMenu.createNormalButton(); } - - } From a3d2efd73c32d891243ef675a422b5f1e253c0bd Mon Sep 17 00:00:00 2001 From: vito Date: Wed, 10 Jan 2024 15:35:23 +0800 Subject: [PATCH 107/302] =?UTF-8?q?REPORT-99485=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E6=B7=BB=E5=8A=A0=E6=8C=89=E9=92=AE=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/com/fine/theme/icon/toolbar/add_popup.svg | 6 +++--- .../com/fine/theme/icon/toolbar/add_popup_disable.svg | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/add_popup.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/add_popup.svg index a4456590ce..3c3bbffb36 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/add_popup.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/add_popup.svg @@ -1,4 +1,4 @@ - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/add_popup_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/add_popup_disable.svg index 7e7c898733..47c769a580 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/add_popup_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/add_popup_disable.svg @@ -1,4 +1,4 @@ - - - + + + From 174a4dbcd0bd06fbdf144855ddb90a131ec79e62 Mon Sep 17 00:00:00 2001 From: vito Date: Wed, 10 Jan 2024 15:36:07 +0800 Subject: [PATCH 108/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E8=B7=9F=E4=B8=8A=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fine/theme/light/ui/FineLightIconSet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 0a20946360..6ace8d6fd1 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -178,7 +178,7 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("tool_more", "com/fine/theme/icon/toolbar/more.svg", true), new SvgIconSource("tool_more_hover", "com/fine/theme/icon/toolbar/more_hover.svg"), new SvgIconSource("tool_config", "com/fine/theme/icon/toolbar/config.svg", true), - new SvgIconSource("add_popup", "com/fine/theme/icon/toolbar/add_popup.svg", true, 24), + new SvgIconSource("add_popup", "com/fine/theme/icon/toolbar/add_popup.svg", true), // 参数面板 new SvgIconSource("param_edit", "com/fine/theme/icon/param/edit.svg", true, 24), From ed16a1919166926a9e65d6ccf952edf17956a571 Mon Sep 17 00:00:00 2001 From: vito Date: Wed, 10 Jan 2024 15:38:39 +0800 Subject: [PATCH 109/302] =?UTF-8?q?REPORT-99485=20=E6=82=AC=E6=B5=AE?= =?UTF-8?q?=E5=85=83=E7=B4=A0FloatStringQuickEditor=E5=B8=83=E5=B1=80?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/menu/MenuDef.java | 31 ++++++++-- .../floatquick/FloatStringQuickEditor.java | 62 ++++++------------- 2 files changed, 45 insertions(+), 48 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java index 5b82786abd..1f5de9a2d1 100644 --- a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java +++ b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java @@ -137,12 +137,12 @@ public class MenuDef extends ShortCut { * 设置不可用图标时,注意传递路径问题,若路径为"view_normal.svg",请传递"view",不带后缀 * 读取disable图标的文件名应当为"xxx_disabled.svg",也是项目中的svg命名规范 * 注意必须是svg图标路径才能使用此函数设置正常和禁用状态 - * - * */ + */ public void setDisabledIcon(String iconPath, boolean needDisabled) { this.iconPath = iconPath; this.needDisabled = needDisabled; } + public int getShortCutCount() { return this.shortcutList.size(); } @@ -226,6 +226,29 @@ public class MenuDef extends ShortCut { return createdButton; } + /** + * 添加常规按钮 + * + * @return 按钮 + */ + public UIButton createNormalButton() { + if (createdButton == null) { + if (icon != null) { + createdButton = new UIButton(icon); + } else if (iconPath != null) { + createdButton = new UIButton(IconUtils.readIcon(iconPath)); + } else { + createdButton = new UIButton(name); + } + // 添加名字以作自动化测试 + createdButton.setName(name); + createdButton.setToolTipText(tooltip); + createdButton.addMouseListener(mouseListener); + } + + return createdButton; + } + public void setTooltip(String text) { this.tooltip = text; } @@ -260,7 +283,7 @@ public class MenuDef extends ShortCut { UIMenu createdJMenu; if (hasScrollSubMenu) { createdJMenu = new UIScrollMenu(this.getName()); - } else if (isHeadMenu){ + } else if (isHeadMenu) { createdJMenu = new UIHeadMenu(this.getName()); } else { createdJMenu = new UIMenu(this.getName()); @@ -349,8 +372,6 @@ public class MenuDef extends ShortCut { } - - public void updateEnable() { setEnabled(checkEnable()); } diff --git a/designer-realize/src/main/java/com/fr/quickeditor/floatquick/FloatStringQuickEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/floatquick/FloatStringQuickEditor.java index 5dc4140883..cef5fa54ff 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/floatquick/FloatStringQuickEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/floatquick/FloatStringQuickEditor.java @@ -1,39 +1,34 @@ package com.fr.quickeditor.floatquick; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseFormula; -import com.fr.base.BaseUtils; import com.fr.base.Style; import com.fr.base.TextFormat; -import com.fr.design.constants.UIConstants; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.mainframe.ElementCasePane; -import com.fr.design.utils.DesignUtils; import com.fr.quickeditor.FloatQuickEditor; import com.fr.report.ReportHelper; import com.fr.stable.StringUtils; import javax.swing.BorderFactory; -import javax.swing.JPanel; -import javax.swing.JTextArea; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; public class FloatStringQuickEditor extends FloatQuickEditor { - private JTextArea stringTextField; - private UIButton formulaButton; + private final UITextArea stringTextField; + private final UIButton formulaButton; // august:如果是原来编辑的是公式,要保留公式里的这些属性,不然在公式和字符串转化时,就会丢失这些属性设置 private boolean reserveInResult = false; private boolean reserveOnWriteOrAnaly = true; - private DocumentListener documentListener = new DocumentListener() { + private final DocumentListener documentListener = new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { @@ -54,36 +49,19 @@ public class FloatStringQuickEditor extends FloatQuickEditor { public FloatStringQuickEditor() { super(); - stringTextField = new JTextArea(); - initTextField(); + stringTextField = new UITextArea(); formulaButton = new UIButton(); - formulaButton.setPreferredSize(new Dimension(25, 23)); - formulaButton.setIcon(BaseUtils.readIcon("/com/fr/design/images/m_insert/formula.png")); - ActionListener getFormulaActionListener = new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - ((ElementCasePane) HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().getCurrentElementCasePane()).getGrid().startEditing(); - } - }; - formulaButton.addActionListener(getFormulaActionListener); - JPanel pane = new JPanel(new BorderLayout(5, 0)); - pane.add(stringTextField, BorderLayout.CENTER); - pane.add(formulaButton, BorderLayout.EAST); - pane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); + formulaButton.setIcon(new LazyIcon("formula")); + formulaButton.addActionListener(e -> ((ElementCasePane) HistoryTemplateListPane.getInstance() + .getCurrentEditingTemplate().getCurrentElementCasePane()) + .getGrid().startEditing()); formulaButton.setVisible(false); this.setLayout(new BorderLayout()); this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - this.add(pane, BorderLayout.NORTH); - } - - private void initTextField() { - stringTextField.setFont(DesignUtils.getDefaultGUIFont()); - stringTextField.setOpaque(true); - stringTextField.setLineWrap(true); - stringTextField.setWrapStyleWord(true); - stringTextField.setMargin(new Insets(5, 5, 5, 5)); - stringTextField.setBorder(BorderFactory.createLineBorder(UIConstants.POP_DIALOG_BORDER)); - stringTextField.setBackground(Color.WHITE); + add(row(10, + cell(stringTextField).weight(1), + cell(formulaButton) + ).getComponent(), BorderLayout.NORTH); } @@ -92,19 +70,17 @@ public class FloatStringQuickEditor extends FloatQuickEditor { String str; Object value = null; //处理撤销时npe - if (floatElement != null){ + if (floatElement != null) { value = floatElement.getValue(); } if (value == null) { str = StringUtils.EMPTY; } else if (value instanceof BaseFormula) { - //MoMeak: 没拆文本框和公式所以需要这么个玩意 formulaButton.setVisible(true); BaseFormula formula = (BaseFormula) value; str = formula.getContent(); stringTextField.setLineWrap(false); - this.setBorder(BorderFactory.createEmptyBorder(10, 75, 10, 10)); reserveInResult = formula.isReserveInResult(); reserveOnWriteOrAnaly = formula.isReserveOnWriteOrAnaly(); } else { @@ -121,7 +97,7 @@ public class FloatStringQuickEditor extends FloatQuickEditor { private void changeReportPaneCell(String tmpText) { - if (tmpText != null && (tmpText.length() > 0 && tmpText.charAt(0) == '=')) { + if (tmpText != null && (!tmpText.isEmpty() && tmpText.charAt(0) == '=')) { BaseFormula textFormula = BaseFormula.createFormulaBuilder().build(tmpText); textFormula.setReserveInResult(reserveInResult); textFormula.setReserveOnWriteOrAnaly(reserveOnWriteOrAnaly); From 7352c53c4851b06746e8e339d300ebd9c6141804 Mon Sep 17 00:00:00 2001 From: vito Date: Wed, 10 Jan 2024 16:20:47 +0800 Subject: [PATCH 110/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/mainframe/ReportFloatPane.java | 2 +- .../fr/quickeditor/floatquick/FloatStringQuickEditor.java | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ReportFloatPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/ReportFloatPane.java index 67b88766c5..0977d0aa11 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ReportFloatPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ReportFloatPane.java @@ -22,7 +22,7 @@ import static com.fine.swing.ui.layout.Layouts.row; * * @author vito * @since 9.0 - * Created 2017/7/27. + * Created on 2017/7/27. */ public class ReportFloatPane extends Column { diff --git a/designer-realize/src/main/java/com/fr/quickeditor/floatquick/FloatStringQuickEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/floatquick/FloatStringQuickEditor.java index cef5fa54ff..06d9380b54 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/floatquick/FloatStringQuickEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/floatquick/FloatStringQuickEditor.java @@ -21,6 +21,7 @@ import static com.fine.swing.ui.layout.Layouts.cell; import static com.fine.swing.ui.layout.Layouts.row; public class FloatStringQuickEditor extends FloatQuickEditor { + private static final char FORMULA_BEGINNING = '='; private final UITextArea stringTextField; private final UIButton formulaButton; @@ -97,7 +98,7 @@ public class FloatStringQuickEditor extends FloatQuickEditor { private void changeReportPaneCell(String tmpText) { - if (tmpText != null && (!tmpText.isEmpty() && tmpText.charAt(0) == '=')) { + if (isFormula(tmpText)) { BaseFormula textFormula = BaseFormula.createFormulaBuilder().build(tmpText); textFormula.setReserveInResult(reserveInResult); textFormula.setReserveOnWriteOrAnaly(reserveOnWriteOrAnaly); @@ -113,4 +114,9 @@ public class FloatStringQuickEditor extends FloatQuickEditor { fireTargetModified(); stringTextField.requestFocus(); } + + private static boolean isFormula(String tmpText) { + return StringUtils.isNotEmpty(tmpText) + && tmpText.charAt(0) == FORMULA_BEGINNING; + } } \ No newline at end of file From 43842743f19304c1c6dc0b02823052b651a765ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 10 Jan 2024 17:51:34 +0800 Subject: [PATCH 111/302] =?UTF-8?q?REPORT-111995=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=B8=89=E6=80=81=E5=A4=8D=E9=80=89=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../checkboxtree/NullTristateCheckBox.java | 1 + .../itree/checkboxtree/TristateCheckBox.java | 108 ++---------------- .../components/CheckBoxStoryBoard.java | 43 +++++++ 3 files changed, 51 insertions(+), 101 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/checkboxtree/NullTristateCheckBox.java b/designer-base/src/main/java/com/fr/design/gui/itree/checkboxtree/NullTristateCheckBox.java index 2d742165c3..d46b125539 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/checkboxtree/NullTristateCheckBox.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/checkboxtree/NullTristateCheckBox.java @@ -62,6 +62,7 @@ public class NullTristateCheckBox extends TristateCheckBox { @Override public void updateUI() { + super.updateUI(); clearAttribute(); } diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/checkboxtree/TristateCheckBox.java b/designer-base/src/main/java/com/fr/design/gui/itree/checkboxtree/TristateCheckBox.java index b821b0731a..dcf062703b 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/checkboxtree/TristateCheckBox.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/checkboxtree/TristateCheckBox.java @@ -1,33 +1,17 @@ package com.fr.design.gui.itree.checkboxtree; -import com.fr.design.constants.UIConstants; +import com.fine.theme.icon.LazyIcon; import com.fr.design.event.StateChangeListener; import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.utils.gui.GUIPaintUtils; -import com.fr.stable.Constants; -import sun.swing.SwingUtilities2; import javax.swing.AbstractAction; -import javax.swing.AbstractButton; import javax.swing.ActionMap; import javax.swing.ButtonGroup; import javax.swing.ButtonModel; import javax.swing.Icon; -import javax.swing.JComponent; import javax.swing.SwingUtilities; import javax.swing.event.ChangeListener; import javax.swing.plaf.ActionMapUIResource; -import javax.swing.plaf.basic.BasicHTML; -import javax.swing.plaf.metal.MetalCheckBoxUI; -import javax.swing.text.View; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Insets; -import java.awt.Rectangle; -import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemListener; @@ -54,6 +38,7 @@ import java.awt.event.MouseListener; * @author Dr. Heinz M. Kabutz */ public class TristateCheckBox extends UICheckBox { + /** * This is a type-safe enumerated type */ @@ -80,7 +65,6 @@ public class TristateCheckBox extends UICheckBox { public TristateCheckBox(String text, Icon icon, State initial) { super(text, icon); - setUI(new TristateCheckBoxUI()); // Add a listener for when the mouse is pressed super.addMouseListener(new MouseAdapter() { @Override @@ -106,19 +90,21 @@ public class TristateCheckBox extends UICheckBox { setState(initial); } + @Override + public Icon getSelectedIcon() { + return getState() == DO_NOT_CARE ? new LazyIcon("checkbox_part_checked") : super.getSelectedIcon(); + } + public TristateCheckBox(String text, State initial) { this(text, null, initial); - setUI(new TristateCheckBoxUI()); } public TristateCheckBox(String text) { this(text, DO_NOT_CARE); - setUI(new TristateCheckBoxUI()); } public TristateCheckBox() { this(null); - setUI(new TristateCheckBoxUI()); } /** @@ -359,84 +345,4 @@ public class TristateCheckBox extends UICheckBox { } } - private class TristateCheckBoxUI 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 (SELECTED.equals(getState())) { - 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() && !SELECTED.equals(getState())) { - 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); - } - - if (SELECTED.equals(getState())) { - UIConstants.YES_ICON.paintIcon(c, g, iconRect.x + 2, iconRect.y + 2); - } else if (DO_NOT_CARE.equals(getState())) { - g.setColor(UIConstants.CHECKBOX_HOVER_SELECTED); - g2d.fillRoundRect(iconRect.x + 2, iconRect.y + 2, iconRect.width - 4, iconRect.height - 4, UIConstants.ARC, UIConstants.ARC); - } - 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) { - if (text != null) { - View v = (View) c.getClientProperty(BasicHTML.propertyKey); - if (v != null) { - v.paint(g, textRect); - } else { - int mnemIndex = b.getDisplayedMnemonicIndex(); - if (model.isEnabled()) { - g.setColor(b.getForeground()); - } else { - g.setColor(getDisabledTextColor()); - } - SwingUtilities2.drawStringUnderlineCharAt(c, g, text, - mnemIndex, textRect.x, textRect.y + fm.getAscent()); - } - } - } - - } } \ No newline at end of file diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/CheckBoxStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/CheckBoxStoryBoard.java index a9f50a8ea0..6ce047d0e7 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/components/CheckBoxStoryBoard.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/CheckBoxStoryBoard.java @@ -3,10 +3,17 @@ package com.fr.design.gui.storybook.components; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itree.checkboxtree.NullTristateCheckBox; +import com.fr.design.gui.itree.checkboxtree.TristateCheckBox; import com.fr.design.gui.storybook.Story; import com.fr.design.gui.storybook.StoryBoard; +import javax.swing.AbstractButton; +import javax.swing.JPanel; import java.awt.Component; +import java.awt.event.ItemListener; +import java.util.Arrays; +import java.util.List; import static com.fine.swing.ui.layout.Layouts.cell; import static com.fine.swing.ui.layout.Layouts.column; @@ -46,10 +53,46 @@ public class CheckBoxStoryBoard extends StoryBoard { cell(getDisabledStatus(new UICheckBox("测试"))), cell(getDisabledSelectedStatus(new UICheckBox("测试"))) ), + cell(new UILabel("三态选择框")).with(this::h3), + row(10, + cell(initTristateCheckboxGroup()) + ), flex() ); } + private JPanel initTristateCheckboxGroup() { + TristateCheckBox parent = new NullTristateCheckBox("父选框", TristateCheckBox.NOT_SELECTED); + UICheckBox checkBoxA = new UICheckBox("子选框1"); + UICheckBox checkBoxB = new UICheckBox("子选框1"); + UICheckBox checkBoxC = new UICheckBox("子选框1"); + List childBoxes = Arrays.asList(checkBoxA, checkBoxB, checkBoxC); + ItemListener sonListener = e -> { + int selectedCount = (int) childBoxes.stream().filter(AbstractButton::isSelected).count(); + if (selectedCount == 0) { + parent.setState(TristateCheckBox.NOT_SELECTED); + } else if (selectedCount == childBoxes.size()) { + parent.setState(TristateCheckBox.SELECTED); + } else { + parent.setState(TristateCheckBox.DO_NOT_CARE); + } + }; + childBoxes.forEach(it -> it.addItemListener(sonListener)); + parent.addStateChangeListener(() -> { + childBoxes.forEach(it -> it.removeItemListener(sonListener)); + if (parent.getState() == TristateCheckBox.SELECTED) { + childBoxes.forEach(it -> it.setSelected(true)); + } else if (parent.getState() == TristateCheckBox.NOT_SELECTED) { + childBoxes.forEach(it -> it.setSelected(false)); + } + childBoxes.forEach(it -> it.addItemListener(sonListener)); + }); + + return row(10, + cell(parent), cell(checkBoxA), cell(checkBoxB), cell(checkBoxC) + ).getComponent(); + } + private Component getDisabledStatus(UICheckBox c) { c.setEnabled(false); return c; From ba45e6c59554401416a15410c140743644ee57ff Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Wed, 10 Jan 2024 20:22:37 +0800 Subject: [PATCH 112/302] =?UTF-8?q?=20REPORT-107973=20=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E6=A0=8F=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 56 +++++++++++++++++++ .../actions/AllowAuthorityEditAction.java | 12 ++-- .../design/actions/TableDataSourceAction.java | 14 ++--- .../design/actions/community/BBSAction.java | 3 +- .../design/actions/community/BugAction.java | 3 +- .../actions/community/BugNeedAction.java | 6 +- .../actions/community/CenterAction.java | 2 +- .../design/actions/community/NeedAction.java | 3 +- .../actions/community/QuestionAction.java | 3 +- .../design/actions/community/SignAction.java | 3 +- .../actions/community/StudyPlanAction.java | 3 +- .../actions/community/TechSolutionAction.java | 3 +- .../community/TemplateStoreAction.java | 4 +- .../design/actions/community/VideoAction.java | 5 +- .../community/WorkOrderCenterAction.java | 3 +- .../fr/design/actions/edit/RedoAction.java | 7 ++- .../fr/design/actions/edit/UndoAction.java | 6 +- .../actions/file/OpenTemplateAction.java | 8 +-- .../actions/file/SaveAsTemplateAction.java | 8 +-- .../actions/file/SaveTemplateAction.java | 7 ++- .../design/actions/file/SwitchExistEnv.java | 3 +- .../design/actions/help/TutorialAction.java | 3 +- .../fr/design/actions/help/WebDemoAction.java | 7 +-- .../help/alphafine/AlphaFineAction.java | 4 +- .../actions/server/ConnectionListAction.java | 7 ++- .../actions/server/FunctionManagerAction.java | 7 +-- .../actions/server/GlobalParameterAction.java | 5 +- .../actions/server/GlobalTableDataAction.java | 4 +- .../actions/server/PlatformManagerAction.java | 5 +- .../actions/server/PluginManagerAction.java | 6 +- .../platform/ServicePlatformAction.java | 6 +- .../fit/menupane/ReportFitAttrAction.java | 3 +- .../update/actions/SoftwareUpdateAction.java | 4 +- .../fr/env/detect/ui/EnvDetectorAction.java | 3 +- .../designer/WidgetThemeDisplayAction.java | 6 +- .../com/fine/theme/icon/toolbar/actCenter.svg | 5 ++ .../theme/icon/toolbar/actCenter_disable.svg | 5 ++ .../theme/icon/toolbar/allowAuthorityEdit.svg | 24 ++++++++ .../toolbar/allowAuthorityEdit_disable.svg | 24 ++++++++ .../com/fine/theme/icon/toolbar/bbs.svg | 5 ++ .../fine/theme/icon/toolbar/bbs_disable.svg | 5 ++ .../com/fine/theme/icon/toolbar/bug.svg | 5 ++ .../fine/theme/icon/toolbar/bug_disable.svg | 5 ++ .../fine/theme/icon/toolbar/charMapData.svg | 11 ++++ .../icon/toolbar/charMapData_disable.svg | 11 ++++ .../icon/toolbar/chartEmptyDataStyle.svg | 5 ++ .../toolbar/chartEmptyDataStyle_disable.svg | 5 ++ .../fine/theme/icon/toolbar/chartPreStyle.svg | 11 ++++ .../icon/toolbar/chartPreStyle_disable.svg | 11 ++++ .../com/fine/theme/icon/toolbar/createCpt.svg | 11 ++++ .../theme/icon/toolbar/createCpt_disable.svg | 11 ++++ .../fine/theme/icon/toolbar/createOther.svg | 13 +++++ .../icon/toolbar/createOther_disable.svg | 13 +++++ .../fine/theme/icon/toolbar/datasource.svg | 5 ++ .../theme/icon/toolbar/datasource_disable.svg | 5 ++ .../com/fine/theme/icon/toolbar/demo.svg | 5 ++ .../fine/theme/icon/toolbar/demo_disable.svg | 5 ++ .../com/fine/theme/icon/toolbar/envDetect.svg | 5 ++ .../theme/icon/toolbar/envDetect_disable.svg | 5 ++ .../com/fine/theme/icon/toolbar/export.svg | 5 ++ .../theme/icon/toolbar/export_disable.svg | 5 ++ .../theme/icon/toolbar/functionManager.svg | 5 ++ .../icon/toolbar/functionManager_disable.svg | 5 ++ .../com/fine/theme/icon/toolbar/help.svg | 5 ++ .../fine/theme/icon/toolbar/help_disable.svg | 5 ++ .../fine/theme/icon/toolbar/linearAttr.svg | 11 ++++ .../theme/icon/toolbar/linearAttr_disable.svg | 11 ++++ .../fine/theme/icon/toolbar/mobileAttr.svg | 5 ++ .../theme/icon/toolbar/mobileAttr_disable.svg | 5 ++ .../icon/toolbar/monochromeServerDatabase.svg | 5 ++ .../monochromeServerDatabase_disable.svg | 5 ++ .../theme/icon/toolbar/monochrome_redo.svg | 5 ++ .../icon/toolbar/monochrome_redo_disable.svg | 5 ++ .../theme/icon/toolbar/monochrome_undo.svg | 5 ++ .../icon/toolbar/monochrome_undo_disable.svg | 5 ++ .../com/fine/theme/icon/toolbar/need.svg | 11 ++++ .../fine/theme/icon/toolbar/need_disable.svg | 11 ++++ .../fine/theme/icon/toolbar/openTemplate.svg | 5 ++ .../icon/toolbar/openTemplate_disable.svg | 5 ++ .../com/fine/theme/icon/toolbar/pageSetup.svg | 5 ++ .../theme/icon/toolbar/pageSetup_disable.svg | 5 ++ .../com/fine/theme/icon/toolbar/platform.svg | 5 ++ .../theme/icon/toolbar/platform_disable.svg | 5 ++ .../fine/theme/icon/toolbar/pluginManager.svg | 8 +++ .../icon/toolbar/pluginManager_disable.svg | 8 +++ .../com/fine/theme/icon/toolbar/print.svg | 4 ++ .../fine/theme/icon/toolbar/print_disable.svg | 4 ++ .../com/fine/theme/icon/toolbar/question.svg | 7 +++ .../theme/icon/toolbar/question_disable.svg | 7 +++ .../theme/icon/toolbar/repeatAndFrozen.svg | 5 ++ .../icon/toolbar/repeatAndFrozen_disable.svg | 5 ++ .../com/fine/theme/icon/toolbar/replace.svg | 5 ++ .../theme/icon/toolbar/replace_disable.svg | 5 ++ .../theme/icon/toolbar/reportBackground.svg | 5 ++ .../icon/toolbar/reportBackground_disable.svg | 5 ++ .../theme/icon/toolbar/reportEngineAttr.svg | 14 +++++ .../icon/toolbar/reportEngineAttr_disable.svg | 14 +++++ .../com/fine/theme/icon/toolbar/reportFit.svg | 5 ++ .../theme/icon/toolbar/reportFit_disable.svg | 5 ++ .../fine/theme/icon/toolbar/reportFooter.svg | 9 +++ .../icon/toolbar/reportFooter_disable.svg | 9 +++ .../fine/theme/icon/toolbar/reportHeader.svg | 9 +++ .../icon/toolbar/reportHeader_disable.svg | 9 +++ .../theme/icon/toolbar/reportParameter.svg | 11 ++++ .../icon/toolbar/reportParameter_disable.svg | 11 ++++ .../theme/icon/toolbar/reportWriteAttr.svg | 5 ++ .../icon/toolbar/reportWriteAttr_disable.svg | 5 ++ .../com/fine/theme/icon/toolbar/saveAs.svg | 5 ++ .../theme/icon/toolbar/saveAs_disable.svg | 5 ++ .../icon/toolbar/serverConfigManager.svg | 12 ++++ .../toolbar/serverConfigManager_disable.svg | 12 ++++ .../com/fine/theme/icon/toolbar/sign.svg | 14 +++++ .../fine/theme/icon/toolbar/sign_disable.svg | 5 ++ .../com/fine/theme/icon/toolbar/solution.svg | 5 ++ .../theme/icon/toolbar/solution_disable.svg | 5 ++ .../com/fine/theme/icon/toolbar/studyPlan.svg | 5 ++ .../theme/icon/toolbar/studyPlan_disable.svg | 5 ++ .../com/fine/theme/icon/toolbar/switchEnv.svg | 5 ++ .../theme/icon/toolbar/switchEnv_disable.svg | 5 ++ .../fine/theme/icon/toolbar/templateStore.svg | 5 ++ .../icon/toolbar/templateStore_disable.svg | 5 ++ .../com/fine/theme/icon/toolbar/update.svg | 5 ++ .../theme/icon/toolbar/update_disable.svg | 5 ++ .../com/fine/theme/icon/toolbar/video.svg | 7 +++ .../fine/theme/icon/toolbar/video_disable.svg | 7 +++ .../com/fine/theme/icon/toolbar/watermark.svg | 5 ++ .../theme/icon/toolbar/watermark_disable.svg | 5 ++ .../theme/icon/toolbar/webReportAttribute.svg | 5 ++ .../toolbar/webReportAttribute_disable.svg | 5 ++ .../fine/theme/icon/toolbar/widgetManager.svg | 7 +++ .../icon/toolbar/widgetManager_disable.svg | 7 +++ .../theme/icon/toolbar/widgetThemeMenu.svg | 18 ++++++ .../icon/toolbar/widgetThemeMenu_disable.svg | 18 ++++++ .../theme/icon/toolbar/workOrderCenter.svg | 5 ++ .../icon/toolbar/workOrderCenter_disable.svg | 5 ++ .../module/ChartEmptyDataStyleAction.java | 4 +- .../fr/design/module/ChartPreStyleAction.java | 6 +- .../map/server/ChartMapEditorAction.java | 5 +- .../actions/file/export/PDFExportAction.java | 4 +- .../actions/file/export/WordExportAction.java | 4 +- .../file/newReport/NewWorkBookAction.java | 5 +- .../actions/insert/flot/ChartFloatAction.java | 4 +- .../insert/flot/FormulaFloatAction.java | 3 +- .../actions/insert/flot/ImageFloatAction.java | 5 +- .../insert/flot/TextBoxFloatAction.java | 3 +- .../actions/replace/ITReplaceAction.java | 12 ++-- .../report/ReportBackgroundAction.java | 4 +- .../actions/report/ReportColumnsAction.java | 6 +- .../report/ReportEngineAttrAction.java | 3 +- .../report/ReportExportAttrAction.java | 4 +- .../actions/report/ReportFooterAction.java | 4 +- .../actions/report/ReportHeaderAction.java | 4 +- .../report/ReportMobileAttrAction.java | 7 +-- .../actions/report/ReportPageAttrAction.java | 4 +- .../actions/report/ReportPageSetupAction.java | 6 +- .../actions/report/ReportParameterAction.java | 4 +- .../report/ReportPrintSettingAction.java | 6 +- .../actions/report/ReportWatermarkAction.java | 3 +- .../actions/report/ReportWebAttrAction.java | 4 +- .../actions/report/ReportWriteAttrAction.java | 4 +- .../server/ServerConfigManagerAction.java | 8 +-- .../actions/server/WidgetManagerAction.java | 3 +- .../com/fr/design/mainframe/JWorkBook.java | 4 +- .../main/java/com/fr/start/MainDesigner.java | 2 +- 164 files changed, 940 insertions(+), 152 deletions(-) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/actCenter.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/actCenter_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/allowAuthorityEdit.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/allowAuthorityEdit_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/bbs.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/bbs_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/bug.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/bug_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/charMapData.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/charMapData_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/chartEmptyDataStyle.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/chartEmptyDataStyle_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/chartPreStyle.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/chartPreStyle_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/toolbar/createCpt.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/toolbar/createCpt_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/toolbar/createOther.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/toolbar/createOther_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/datasource.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/datasource_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/demo.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/demo_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/envDetect.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/envDetect_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/export.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/export_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/functionManager.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/functionManager_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/help.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/help_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/linearAttr.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/linearAttr_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/mobileAttr.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/mobileAttr_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochromeServerDatabase.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochromeServerDatabase_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochrome_redo.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochrome_redo_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochrome_undo.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochrome_undo_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/need.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/need_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/openTemplate.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/openTemplate_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/pageSetup.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/pageSetup_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/platform.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/platform_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/pluginManager.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/pluginManager_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/toolbar/print.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/toolbar/print_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/question.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/question_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/repeatAndFrozen.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/repeatAndFrozen_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/replace.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/replace_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportBackground.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportBackground_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportEngineAttr.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportEngineAttr_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportFit.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportFit_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportFooter.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportFooter_disable.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportHeader.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportHeader_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportParameter.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportParameter_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportWriteAttr.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportWriteAttr_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/saveAs.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/saveAs_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/serverConfigManager.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/serverConfigManager_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/sign.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/sign_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/solution.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/solution_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/studyPlan.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/studyPlan_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/switchEnv.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/switchEnv_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/templateStore.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/templateStore_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/update.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/update_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/video.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/video_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/watermark.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/watermark_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/webReportAttribute.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/webReportAttribute_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/widgetManager.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/widgetManager_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/widgetThemeMenu.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/widgetThemeMenu_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/workOrderCenter.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/workOrderCenter_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index f61f362788..2409e92464 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -189,8 +189,64 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("param", "com/fine/theme/icon/param/param.svg", true), // 北区菜单栏 + //文件 new SvgIconSource("notification", "com/fine/theme/icon/notification/notification.svg"), new SvgIconSource("notification_dot", "com/fine/theme/icon/notification/notification_dot.svg"), + new SvgIconSource("createCpt", "com/fine/theme/icon/toolbar/createCpt.svg", true), + new SvgIconSource("createOther", "com/fine/theme/icon/toolbar/createOther.svg", true), + new SvgIconSource("openTemplate", "com/fine/theme/icon/toolbar/openTemplate.svg", true), + new SvgIconSource("switchEnv", "com/fine/theme/icon/toolbar/switchEnv.svg", true), + new SvgIconSource("export", "com/fine/theme/icon/toolbar/export.svg", true), + new SvgIconSource("monochrome_undo", "com/fine/theme/icon/toolbar/monochrome_undo.svg", true), + new SvgIconSource("monochrome_redo", "com/fine/theme/icon/toolbar/monochrome_redo.svg", true), + new SvgIconSource("saveAs", "com/fine/theme/icon/toolbar/saveAs.svg", true), + // 模板 + new SvgIconSource("widgetThemeMenu", "com/fine/theme/icon/toolbar/widgetThemeMenu.svg", true), + new SvgIconSource("datasource", "com/fine/theme/icon/toolbar/datasource.svg", true), + new SvgIconSource("webReportAttribute", "com/fine/theme/icon/toolbar/webReportAttribute.svg", true), + new SvgIconSource("reportParameter", "com/fine/theme/icon/toolbar/reportParameter.svg", true), + new SvgIconSource("reportFit", "com/fine/theme/icon/toolbar/reportFit.svg", true), + new SvgIconSource("mobileAttr", "com/fine/theme/icon/toolbar/mobileAttr.svg", true), + new SvgIconSource("watermark", "com/fine/theme/icon/toolbar/watermark.svg", true), + new SvgIconSource("print", "com/fine/theme/icon/toolbar/print.svg", true), + new SvgIconSource("pageSetup", "com/fine/theme/icon/toolbar/pageSetup.svg", true), + new SvgIconSource("reportHeader", "com/fine/theme/icon/toolbar/reportHeader.svg", true), + new SvgIconSource("reportFooter", "com/fine/theme/icon/toolbar/reportFooter.svg", true), + new SvgIconSource("reportBackground", "com/fine/theme/icon/toolbar/reportBackground.svg", true), + new SvgIconSource("reportWriteAttr", "com/fine/theme/icon/toolbar/reportWriteAttr.svg", true), + new SvgIconSource("linearAttr", "com/fine/theme/icon/toolbar/linearAttr.svg", true), + new SvgIconSource("repeatAndFrozen", "com/fine/theme/icon/toolbar/repeatAndFrozen.svg", true), + new SvgIconSource("reportEngineAttr", "com/fine/theme/icon/toolbar/reportEngineAttr.svg", true), + new SvgIconSource("allowAuthorityEdit", "com/fine/theme/icon/toolbar/allowAuthorityEdit.svg", true), + new SvgIconSource("replace", "com/fine/theme/icon/toolbar/replace.svg", true), + // 服务器 + new SvgIconSource("monochromeServerDatabase", "com/fine/theme/icon/toolbar/monochromeServerDatabase.svg", true), + new SvgIconSource("platform", "com/fine/theme/icon/toolbar/platform.svg", true), + new SvgIconSource("pluginManager", "com/fine/theme/icon/toolbar/pluginManager.svg", true), + new SvgIconSource("functionManager", "com/fine/theme/icon/toolbar/functionManager.svg", true), + new SvgIconSource("serverConfigManager", "com/fine/theme/icon/toolbar/serverConfigManager.svg", true), + new SvgIconSource("widgetManager", "com/fine/theme/icon/toolbar/widgetManager.svg", true), + new SvgIconSource("chartPreStyle", "com/fine/theme/icon/toolbar/chartPreStyle.svg", true), + new SvgIconSource("chartEmptyDataStyle", "com/fine/theme/icon/toolbar/chartEmptyDataStyle.svg", true), + new SvgIconSource("charMapData", "com/fine/theme/icon/toolbar/charMapData.svg", true), + // 帮助 + new SvgIconSource("demo", "com/fine/theme/icon/toolbar/demo.svg", true), + new SvgIconSource("update", "com/fine/theme/icon/toolbar/update.svg", true), + new SvgIconSource("envDetect", "com/fine/theme/icon/toolbar/envDetect.svg", true), + new SvgIconSource("servicePlatform", "com/fine/theme/icon/toolbar/servicePlatform.svg", true), + // 社区 + new SvgIconSource("bbs", "com/fine/theme/icon/toolbar/bbs.svg", true), + new SvgIconSource("video", "com/fine/theme/icon/toolbar/video.svg", true), + new SvgIconSource("help", "com/fine/theme/icon/toolbar/help.svg", true), + new SvgIconSource("studyPlan", "com/fine/theme/icon/toolbar/studyPlan.svg", true), + new SvgIconSource("question", "com/fine/theme/icon/toolbar/question.svg", true), + new SvgIconSource("solution", "com/fine/theme/icon/toolbar/solution.svg", true), + new SvgIconSource("templateStore", "com/fine/theme/icon/toolbar/templateStore.svg", true), + new SvgIconSource("bug", "com/fine/theme/icon/toolbar/bug.svg", true), + new SvgIconSource("need", "com/fine/theme/icon/toolbar/need.svg", true), + new SvgIconSource("workOrderCenter", "com/fine/theme/icon/toolbar/workOrderCenter.svg", true), + new SvgIconSource("actCenter", "com/fine/theme/icon/toolbar/actCenter.svg", true), + new SvgIconSource("sign", "com/fine/theme/icon/toolbar/sign.svg", true), //东区面板 new SvgIconSource("cellelement_small", "com/fine/theme/icon/cellelement.svg"), diff --git a/designer-base/src/main/java/com/fr/design/actions/AllowAuthorityEditAction.java b/designer-base/src/main/java/com/fr/design/actions/AllowAuthorityEditAction.java index 546a702979..7d5deaa066 100644 --- a/designer-base/src/main/java/com/fr/design/actions/AllowAuthorityEditAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/AllowAuthorityEditAction.java @@ -1,14 +1,18 @@ package com.fr.design.actions; +import com.fine.theme.icon.LazyIcon; import com.fr.base.vcs.DesignerMode; import com.fr.design.constants.UIConstants; +import com.fr.design.designer.TargetComponent; +import com.fr.design.file.HistoryTemplateListPane; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.EastRegionContainerPane; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.mainframe.WestRegionContainerPane; import com.fr.design.menu.KeySetUtils; import com.fr.design.module.DesignModuleFactory; import com.fr.design.roleAuthority.ReportAndFSManagePane; import com.fr.design.roleAuthority.RolesAlreadyEditedPane; -import com.fr.design.designer.TargetComponent; -import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.mainframe.*; /** * Author : daisy @@ -22,7 +26,7 @@ public class AllowAuthorityEditAction extends TemplateComponentAction { this.setMenuKeySet(KeySetUtils.ALLOW_AUTHORITY_EDIT); this.setName(getMenuKeySet().getMenuName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/m_report/allow_authority_edit"); + this.setSmallIcon(new LazyIcon("allowAuthorityEdit")); } /** diff --git a/designer-base/src/main/java/com/fr/design/actions/TableDataSourceAction.java b/designer-base/src/main/java/com/fr/design/actions/TableDataSourceAction.java index 8a6e7a7df9..dbc72adbd7 100644 --- a/designer-base/src/main/java/com/fr/design/actions/TableDataSourceAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/TableDataSourceAction.java @@ -1,18 +1,18 @@ package com.fr.design.actions; -import javax.swing.SwingUtilities; -import com.fr.base.svg.IconUtils; -import com.fr.design.data.DesignTableDataManager; +import com.fine.theme.icon.LazyIcon; import com.fr.data.TableDataSource; +import com.fr.design.DesignModelAdapter; +import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.ReportTableDataPane; import com.fr.design.data.datapane.TableDataTreePane; import com.fr.design.data.tabledata.ResponseDataSourceChange; -import com.fr.design.DesignModelAdapter; -import com.fr.design.mainframe.JTemplate; -import com.fr.design.menu.KeySetUtils; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.menu.KeySetUtils; +import javax.swing.SwingUtilities; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -26,7 +26,7 @@ public class TableDataSourceAction extends TemplateComponentAction> { this.setMenuKeySet(KeySetUtils.SAVE_AS_TEMPLATE); this.setName(getMenuKeySet().getMenuKeySetName() + "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/m_file/saveAs"); + this.setSmallIcon(new LazyIcon("saveAs")); } /** diff --git a/designer-base/src/main/java/com/fr/design/actions/file/SaveTemplateAction.java b/designer-base/src/main/java/com/fr/design/actions/file/SaveTemplateAction.java index 072a127aa9..9883034746 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/SaveTemplateAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/SaveTemplateAction.java @@ -3,12 +3,13 @@ */ package com.fr.design.actions.file; -import java.awt.event.ActionEvent; - +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.JTemplateAction; import com.fr.design.mainframe.JTemplate; import com.fr.design.menu.KeySetUtils; +import java.awt.event.ActionEvent; + /** * @author richer * @since 6.5.3 @@ -20,7 +21,7 @@ public class SaveTemplateAction extends JTemplateAction> { this.setMenuKeySet(KeySetUtils.SAVE_TEMPLATE); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/m_file/save"); + this.setSmallIcon(new LazyIcon("save")); this.setAccelerator(getMenuKeySet().getKeyStroke()); } diff --git a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java index 1a421c5fd0..accb907e20 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java @@ -1,5 +1,6 @@ package com.fr.design.actions.file; +import com.fine.theme.icon.LazyIcon; import com.fr.design.DesignerEnvManager; import com.fr.design.EnvChangeEntrance; import com.fr.design.actions.UpdateAction; @@ -28,7 +29,7 @@ public class SwitchExistEnv extends MenuDef { Iterator nameIt = DesignerEnvManager.getEnvManager().getEnvNameIterator(); while (nameIt.hasNext()) { String name = nameIt.next(); - this.setIconPath("com/fr/design/images/m_file/switch"); + this.setIcon(new LazyIcon("switchEnv")); this.addShortCut(new GetExistEnvAction(name)); } this.addShortCut(SeparatorDef.DEFAULT); diff --git a/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java b/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java index 1a4bccfa4a..9c0e7ebdab 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java @@ -1,5 +1,6 @@ package com.fr.design.actions.help; +import com.fine.theme.icon.LazyIcon; import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.login.AbstractDesignerSSO; @@ -32,7 +33,7 @@ public class TutorialAction extends AbstractDesignerSSO { this.setMenuKeySet(HELP_TUTORIAL); this.setName(getMenuKeySet().getMenuName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/bbs/help"); + this.setSmallIcon(new LazyIcon("help")); this.setAccelerator(getMenuKeySet().getKeyStroke()); } diff --git a/designer-base/src/main/java/com/fr/design/actions/help/WebDemoAction.java b/designer-base/src/main/java/com/fr/design/actions/help/WebDemoAction.java index 53ef796b34..4ba2a02926 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/WebDemoAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/WebDemoAction.java @@ -1,13 +1,12 @@ package com.fr.design.actions.help; -import com.fr.base.svg.IconUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.DesignerEnvManager; import com.fr.design.actions.UpdateAction; import com.fr.design.menu.MenuKeySet; - import com.fr.start.ServerStarter; -import javax.swing.*; +import javax.swing.KeyStroke; import java.awt.event.ActionEvent; @@ -16,7 +15,7 @@ public class WebDemoAction extends UpdateAction { this.setMenuKeySet(PRODUCT_DEMO); this.setName(getMenuKeySet().getMenuName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/m_help/demo"); + this.setSmallIcon(new LazyIcon("demo")); } /** 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 3dc951578a..ef4754c6a1 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,6 @@ package com.fr.design.actions.help.alphafine; -import com.fr.base.svg.SVGIcon; +import com.fine.theme.icon.LazyIcon; import com.fr.design.DesignerEnvManager; import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.BasicDialog; @@ -21,7 +21,7 @@ public class AlphaFineAction extends UpdateAction { this.setMenuKeySet(ALPHAFINE); this.setName(getMenuKeySet().getMenuName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("com/fr/design/mainframe/alphafine/images/smallsearch"); + this.setSmallIcon(new LazyIcon("search")); this.generateAndSetSearchText(AlphaFineConfigPane.class.getName()); } diff --git a/designer-base/src/main/java/com/fr/design/actions/server/ConnectionListAction.java b/designer-base/src/main/java/com/fr/design/actions/server/ConnectionListAction.java index 4742f337cd..216d7dd8ad 100644 --- a/designer-base/src/main/java/com/fr/design/actions/server/ConnectionListAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/server/ConnectionListAction.java @@ -1,5 +1,6 @@ package com.fr.design.actions.server; +import com.fine.theme.icon.LazyIcon; import com.fr.data.impl.Connection; import com.fr.design.actions.UpdateAction; import com.fr.design.data.datapane.connect.ConnectionShowPane; @@ -11,11 +12,11 @@ import com.fr.design.gui.NameInspector; import com.fr.design.gui.imenu.UILockMenuItem; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.menu.MenuKeySet; -import com.fr.stable.os.support.OSBasedAction; -import com.fr.stable.os.support.OSSupportCenter; import com.fr.design.os.impl.DatabaseDialogAction; import com.fr.file.ConnectionConfig; import com.fr.report.LockItem; +import com.fr.stable.os.support.OSBasedAction; +import com.fr.stable.os.support.OSSupportCenter; import javax.swing.KeyStroke; import java.awt.event.ActionEvent; @@ -30,7 +31,7 @@ public class ConnectionListAction extends UpdateAction { this.setMenuKeySet(DEFINE_DATA_CONNECTION); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/m_web/connection"); + this.setSmallIcon(new LazyIcon("connection")); this.generateAndSetSearchText(DatabaseConnectionPane.JDBC.class.getName()); } diff --git a/designer-base/src/main/java/com/fr/design/actions/server/FunctionManagerAction.java b/designer-base/src/main/java/com/fr/design/actions/server/FunctionManagerAction.java index d7f1cdbb7a..4cd2d78182 100644 --- a/designer-base/src/main/java/com/fr/design/actions/server/FunctionManagerAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/server/FunctionManagerAction.java @@ -4,7 +4,7 @@ package com.fr.design.actions.server; -import com.fr.base.svg.IconUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.config.Configuration; import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.BasicDialog; @@ -13,11 +13,10 @@ import com.fr.design.formula.FunctionManagerPane; import com.fr.design.mainframe.DesignerContext; import com.fr.design.menu.MenuKeySet; import com.fr.file.FunctionConfig; - import com.fr.transaction.Configurations; import com.fr.transaction.Worker; -import javax.swing.*; +import javax.swing.KeyStroke; import java.awt.event.ActionEvent; @@ -29,7 +28,7 @@ public class FunctionManagerAction extends UpdateAction { this.setMenuKeySet(FUNCTION_MANAGER); this.setName(getMenuKeySet().getMenuKeySetName()+"..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/m_web/function"); + this.setSmallIcon(new LazyIcon("functionManager")); this.generateAndSetSearchText(FunctionManagerPane.class.getName()); } diff --git a/designer-base/src/main/java/com/fr/design/actions/server/GlobalParameterAction.java b/designer-base/src/main/java/com/fr/design/actions/server/GlobalParameterAction.java index d3f035972c..d713b71ea3 100644 --- a/designer-base/src/main/java/com/fr/design/actions/server/GlobalParameterAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/server/GlobalParameterAction.java @@ -3,8 +3,8 @@ */ package com.fr.design.actions.server; +import com.fine.theme.icon.LazyIcon; import com.fr.base.ParameterConfig; -import com.fr.base.svg.IconUtils; import com.fr.config.ServerPreferenceConfig; import com.fr.design.DesignModelAdapter; import com.fr.design.actions.UpdateAction; @@ -14,7 +14,6 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrame; import com.fr.design.menu.MenuKeySet; import com.fr.design.parameter.ParameterManagerPane; - import com.fr.transaction.CallBackAdaptor; import com.fr.transaction.Configurations; import com.fr.transaction.WorkerFacade; @@ -31,7 +30,7 @@ public class GlobalParameterAction extends UpdateAction { this.setMenuKeySet(GLOBAL_PARAMETER); this.setName(getMenuKeySet().getMenuKeySetName() + "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/m_report/p"); + this.setSmallIcon(new LazyIcon("reportParameter")); } /** diff --git a/designer-base/src/main/java/com/fr/design/actions/server/GlobalTableDataAction.java b/designer-base/src/main/java/com/fr/design/actions/server/GlobalTableDataAction.java index 1457f0d111..c2c6d64b79 100644 --- a/designer-base/src/main/java/com/fr/design/actions/server/GlobalTableDataAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/server/GlobalTableDataAction.java @@ -3,6 +3,7 @@ */ package com.fr.design.actions.server; +import com.fine.theme.icon.LazyIcon; import com.fr.base.TableData; import com.fr.design.DesignModelAdapter; import com.fr.design.actions.UpdateAction; @@ -24,7 +25,6 @@ import com.fr.esd.event.DSMapping; import com.fr.esd.event.DsNameTarget; import com.fr.esd.event.StrategyEventsNotifier; import com.fr.file.TableDataConfig; - import com.fr.report.LockItem; import javax.swing.KeyStroke; @@ -44,7 +44,7 @@ public class GlobalTableDataAction extends UpdateAction implements ResponseDataS this.setMenuKeySet(SERVER_TABLEDATA); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/data/dock/serverdatabase"); + this.setSmallIcon(new LazyIcon("monochromeServerDatabase")); } public static final MenuKeySet SERVER_TABLEDATA = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/server/PlatformManagerAction.java b/designer-base/src/main/java/com/fr/design/actions/server/PlatformManagerAction.java index f62327ad9a..d1e2f6f52d 100644 --- a/designer-base/src/main/java/com/fr/design/actions/server/PlatformManagerAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/server/PlatformManagerAction.java @@ -1,12 +1,9 @@ package com.fr.design.actions.server; -import com.fr.base.svg.IconUtils; import com.fr.design.actions.UpdateAction; import com.fr.design.menu.MenuKeySet; import com.fr.design.utils.DesignUtils; - -import javax.swing.*; import java.awt.event.ActionEvent; public class PlatformManagerAction extends UpdateAction { @@ -14,7 +11,7 @@ public class PlatformManagerAction extends UpdateAction { this.setMenuKeySet(PLATEFORM_MANAGER); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/server/platform_16_16"); + this.setSmallIcon(new LazyIcon("platform")); } /** diff --git a/designer-base/src/main/java/com/fr/design/actions/server/PluginManagerAction.java b/designer-base/src/main/java/com/fr/design/actions/server/PluginManagerAction.java index bb9339568c..1f3f0d6045 100644 --- a/designer-base/src/main/java/com/fr/design/actions/server/PluginManagerAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/server/PluginManagerAction.java @@ -1,13 +1,13 @@ package com.fr.design.actions.server; -import com.fr.base.svg.IconUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.menu.MenuKeySet; import com.fr.design.os.impl.PMDialogAction; import com.fr.stable.os.support.OSBasedAction; import com.fr.stable.os.support.OSSupportCenter; -import javax.swing.*; +import javax.swing.KeyStroke; import java.awt.event.ActionEvent; /** @@ -20,7 +20,7 @@ public class PluginManagerAction extends UpdateAction { this.setMenuKeySet(PLUGIN_MANAGER); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/server/plugin"); + this.setSmallIcon(new LazyIcon("pluginManager")); } @Override public void actionPerformed(ActionEvent e) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/platform/ServicePlatformAction.java b/designer-base/src/main/java/com/fr/design/mainframe/platform/ServicePlatformAction.java index c6dc9a9b66..bff60f71d2 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/platform/ServicePlatformAction.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/platform/ServicePlatformAction.java @@ -1,14 +1,12 @@ package com.fr.design.mainframe.platform; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.i18n.Toolkit; import com.fr.design.utils.BrowseUtils; import com.fr.general.CloudCenter; -import com.fr.log.FineLoggerFactory; -import java.awt.Desktop; import java.awt.event.ActionEvent; -import java.net.URI; /** * 帮助-服务平台 @@ -20,7 +18,7 @@ import java.net.URI; public class ServicePlatformAction extends UpdateAction { public ServicePlatformAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Service_Platform_Title")); - this.setSmallIcon("/com/fr/design/images/platform/platform", false); + this.setSmallIcon(new LazyIcon("servicePlatform")); } @Override 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 ba37ea18b7..374da1c83d 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,5 +1,6 @@ package com.fr.design.report.fit.menupane; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.JTemplateAction; import com.fr.design.beans.BasicBeanPane; import com.fr.design.dialog.DialogActionAdapter; @@ -45,7 +46,7 @@ public class ReportFitAttrAction extends JTemplateAction { this.setMenuKeySet(REPORT_FIT_ATTR); this.setName(getMenuKeySet().getMenuKeySetName() + "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/reportfit/fit"); + this.setSmallIcon(new LazyIcon("reportFit")); } /** diff --git a/designer-base/src/main/java/com/fr/design/update/actions/SoftwareUpdateAction.java b/designer-base/src/main/java/com/fr/design/update/actions/SoftwareUpdateAction.java index 2b768d995b..de9e0564d5 100644 --- a/designer-base/src/main/java/com/fr/design/update/actions/SoftwareUpdateAction.java +++ b/designer-base/src/main/java/com/fr/design/update/actions/SoftwareUpdateAction.java @@ -1,6 +1,6 @@ package com.fr.design.update.actions; -import com.fr.base.svg.IconUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.os.impl.UpdateDialogAction; import com.fr.stable.os.support.OSBasedAction; @@ -15,7 +15,7 @@ public class SoftwareUpdateAction extends UpdateAction { public SoftwareUpdateAction() { setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_UpdateAndUpgrade")); - setSmallIcon("/com/fr/design/images/update/update_new"); + setSmallIcon(new LazyIcon("update")); } diff --git a/designer-base/src/main/java/com/fr/env/detect/ui/EnvDetectorAction.java b/designer-base/src/main/java/com/fr/env/detect/ui/EnvDetectorAction.java index 42ab6306ac..9052e99ae8 100644 --- a/designer-base/src/main/java/com/fr/env/detect/ui/EnvDetectorAction.java +++ b/designer-base/src/main/java/com/fr/env/detect/ui/EnvDetectorAction.java @@ -1,5 +1,6 @@ package com.fr.env.detect.ui; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; @@ -16,7 +17,7 @@ public class EnvDetectorAction extends UpdateAction { public EnvDetectorAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Carton_Toolbox_Title")); - this.setSmallIcon("com/fr/env/detect/detect_normal.svg"); + this.setSmallIcon(new LazyIcon("envDetect")); } @Override diff --git a/designer-base/src/main/java/com/fr/widgettheme/designer/WidgetThemeDisplayAction.java b/designer-base/src/main/java/com/fr/widgettheme/designer/WidgetThemeDisplayAction.java index 21c7f3ac93..1debda8e50 100644 --- a/designer-base/src/main/java/com/fr/widgettheme/designer/WidgetThemeDisplayAction.java +++ b/designer-base/src/main/java/com/fr/widgettheme/designer/WidgetThemeDisplayAction.java @@ -1,15 +1,15 @@ package com.fr.widgettheme.designer; +import com.fine.theme.icon.LazyIcon; import com.fr.base.io.BaseBook; -import com.fr.base.svg.IconUtils; import com.fr.design.actions.JTemplateAction; -import com.fr.widgettheme.util.WidgetThemeDesignerUtils; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.widgettheme.control.attr.WidgetDisplayEnhanceMarkAttr; +import com.fr.widgettheme.util.WidgetThemeDesignerUtils; import java.awt.event.ActionEvent; @@ -25,7 +25,7 @@ public class WidgetThemeDisplayAction> extends JTempla public WidgetThemeDisplayAction(T jwb) { super(jwb); setName(Toolkit.i18nText("Fine-Design_Widget_Display_Enhance")); - this.setSmallIcon(IconUtils.readIcon("/com/fr/widgettheme/menu.svg")); + this.setSmallIcon(new LazyIcon("widgetThemeMenu")); } @Override diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/actCenter.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/actCenter.svg new file mode 100644 index 0000000000..9c01e5ff5e --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/actCenter.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/actCenter_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/actCenter_disable.svg new file mode 100644 index 0000000000..d5fa0e46d9 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/actCenter_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/allowAuthorityEdit.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/allowAuthorityEdit.svg new file mode 100644 index 0000000000..f44b579ef3 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/allowAuthorityEdit.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/allowAuthorityEdit_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/allowAuthorityEdit_disable.svg new file mode 100644 index 0000000000..8dcd677a45 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/allowAuthorityEdit_disable.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bbs.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bbs.svg new file mode 100644 index 0000000000..6c01e3bc3f --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bbs.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bbs_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bbs_disable.svg new file mode 100644 index 0000000000..d77d19464d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bbs_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bug.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bug.svg new file mode 100644 index 0000000000..9ea08d02b7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bug.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bug_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bug_disable.svg new file mode 100644 index 0000000000..480a46eb13 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bug_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/charMapData.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/charMapData.svg new file mode 100644 index 0000000000..48a36d6be2 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/charMapData.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/charMapData_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/charMapData_disable.svg new file mode 100644 index 0000000000..5483d0537e --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/charMapData_disable.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/chartEmptyDataStyle.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/chartEmptyDataStyle.svg new file mode 100644 index 0000000000..578ad9d1ce --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/chartEmptyDataStyle.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/chartEmptyDataStyle_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/chartEmptyDataStyle_disable.svg new file mode 100644 index 0000000000..03fc5da621 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/chartEmptyDataStyle_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/chartPreStyle.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/chartPreStyle.svg new file mode 100644 index 0000000000..c84bcb704b --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/chartPreStyle.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/chartPreStyle_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/chartPreStyle_disable.svg new file mode 100644 index 0000000000..3018bf1999 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/chartPreStyle_disable.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/createCpt.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/createCpt.svg new file mode 100755 index 0000000000..819a90d662 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/createCpt.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/createCpt_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/createCpt_disable.svg new file mode 100755 index 0000000000..3fbc7e166d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/createCpt_disable.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/createOther.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/createOther.svg new file mode 100755 index 0000000000..4b84498db3 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/createOther.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/createOther_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/createOther_disable.svg new file mode 100755 index 0000000000..a31ec72292 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/createOther_disable.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/datasource.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/datasource.svg new file mode 100644 index 0000000000..85f677a337 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/datasource.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/datasource_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/datasource_disable.svg new file mode 100644 index 0000000000..9da578a790 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/datasource_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/demo.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/demo.svg new file mode 100644 index 0000000000..40cbc7f35a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/demo.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/demo_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/demo_disable.svg new file mode 100644 index 0000000000..70a51ebc32 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/demo_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/envDetect.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/envDetect.svg new file mode 100644 index 0000000000..ca309348c8 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/envDetect.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/envDetect_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/envDetect_disable.svg new file mode 100644 index 0000000000..47ec58aba5 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/envDetect_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/export.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/export.svg new file mode 100644 index 0000000000..6c14b39d27 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/export.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/export_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/export_disable.svg new file mode 100644 index 0000000000..7a15aff7c9 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/export_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/functionManager.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/functionManager.svg new file mode 100644 index 0000000000..95debb410a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/functionManager.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/functionManager_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/functionManager_disable.svg new file mode 100644 index 0000000000..c9a7a037f7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/functionManager_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/help.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/help.svg new file mode 100644 index 0000000000..53344f0633 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/help.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/help_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/help_disable.svg new file mode 100644 index 0000000000..6093ac8b77 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/help_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/linearAttr.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/linearAttr.svg new file mode 100644 index 0000000000..a2b6d3611c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/linearAttr.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/linearAttr_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/linearAttr_disable.svg new file mode 100644 index 0000000000..d5d2f90cbb --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/linearAttr_disable.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/mobileAttr.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/mobileAttr.svg new file mode 100644 index 0000000000..fde8b271b7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/mobileAttr.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/mobileAttr_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/mobileAttr_disable.svg new file mode 100644 index 0000000000..f3a4148cc7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/mobileAttr_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochromeServerDatabase.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochromeServerDatabase.svg new file mode 100644 index 0000000000..d4faa9d930 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochromeServerDatabase.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochromeServerDatabase_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochromeServerDatabase_disable.svg new file mode 100644 index 0000000000..9ac86f3182 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochromeServerDatabase_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochrome_redo.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochrome_redo.svg new file mode 100644 index 0000000000..248d6dcde5 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochrome_redo.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochrome_redo_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochrome_redo_disable.svg new file mode 100644 index 0000000000..86bc5fa285 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochrome_redo_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochrome_undo.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochrome_undo.svg new file mode 100644 index 0000000000..56757baec7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochrome_undo.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochrome_undo_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochrome_undo_disable.svg new file mode 100644 index 0000000000..fb28a62cbf --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/monochrome_undo_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/need.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/need.svg new file mode 100644 index 0000000000..e6af95c670 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/need.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/need_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/need_disable.svg new file mode 100644 index 0000000000..4130bdb0d7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/need_disable.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/openTemplate.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/openTemplate.svg new file mode 100644 index 0000000000..5f4af68e47 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/openTemplate.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/openTemplate_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/openTemplate_disable.svg new file mode 100644 index 0000000000..5a304c7bcd --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/openTemplate_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/pageSetup.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/pageSetup.svg new file mode 100644 index 0000000000..72fa857c3b --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/pageSetup.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/pageSetup_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/pageSetup_disable.svg new file mode 100644 index 0000000000..1f23b45f32 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/pageSetup_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/platform.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/platform.svg new file mode 100644 index 0000000000..743829f741 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/platform.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/platform_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/platform_disable.svg new file mode 100644 index 0000000000..873fb9f4d1 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/platform_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/pluginManager.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/pluginManager.svg new file mode 100644 index 0000000000..3d637f7a96 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/pluginManager.svg @@ -0,0 +1,8 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/pluginManager_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/pluginManager_disable.svg new file mode 100644 index 0000000000..afcb393ba9 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/pluginManager_disable.svg @@ -0,0 +1,8 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/print.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/print.svg new file mode 100755 index 0000000000..802cd701d6 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/print.svg @@ -0,0 +1,4 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/print_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/print_disable.svg new file mode 100755 index 0000000000..f4023c9788 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/print_disable.svg @@ -0,0 +1,4 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/question.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/question.svg new file mode 100644 index 0000000000..8fe8f7fa18 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/question.svg @@ -0,0 +1,7 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/question_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/question_disable.svg new file mode 100644 index 0000000000..3bb377af34 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/question_disable.svg @@ -0,0 +1,7 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/repeatAndFrozen.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/repeatAndFrozen.svg new file mode 100644 index 0000000000..057f0d46df --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/repeatAndFrozen.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/repeatAndFrozen_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/repeatAndFrozen_disable.svg new file mode 100644 index 0000000000..23db4a9bce --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/repeatAndFrozen_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/replace.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/replace.svg new file mode 100644 index 0000000000..4ce772e3da --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/replace.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/replace_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/replace_disable.svg new file mode 100644 index 0000000000..2b1513242c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/replace_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportBackground.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportBackground.svg new file mode 100644 index 0000000000..a37d52aefd --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportBackground.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportBackground_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportBackground_disable.svg new file mode 100644 index 0000000000..76bfd4103b --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportBackground_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportEngineAttr.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportEngineAttr.svg new file mode 100644 index 0000000000..c663fe3ce0 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportEngineAttr.svg @@ -0,0 +1,14 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportEngineAttr_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportEngineAttr_disable.svg new file mode 100644 index 0000000000..c6b016fa49 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportEngineAttr_disable.svg @@ -0,0 +1,14 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportFit.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportFit.svg new file mode 100644 index 0000000000..dfb5b3c9c9 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportFit.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportFit_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportFit_disable.svg new file mode 100644 index 0000000000..5e0b16c39f --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportFit_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportFooter.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportFooter.svg new file mode 100755 index 0000000000..0cf7ba674d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportFooter.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportFooter_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportFooter_disable.svg new file mode 100755 index 0000000000..c47e8346d2 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportFooter_disable.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportHeader.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportHeader.svg new file mode 100755 index 0000000000..483fa79587 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportHeader.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportHeader_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportHeader_disable.svg new file mode 100755 index 0000000000..704fe328fa --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportHeader_disable.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportParameter.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportParameter.svg new file mode 100644 index 0000000000..423882917c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportParameter.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportParameter_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportParameter_disable.svg new file mode 100644 index 0000000000..c4fed0bf28 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportParameter_disable.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportWriteAttr.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportWriteAttr.svg new file mode 100644 index 0000000000..2e39e4e9ee --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportWriteAttr.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportWriteAttr_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportWriteAttr_disable.svg new file mode 100644 index 0000000000..ab1ecde62a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/reportWriteAttr_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/saveAs.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/saveAs.svg new file mode 100644 index 0000000000..059e2e6b42 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/saveAs.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/saveAs_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/saveAs_disable.svg new file mode 100644 index 0000000000..fcfb30eaa4 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/saveAs_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/serverConfigManager.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/serverConfigManager.svg new file mode 100644 index 0000000000..36123b2b85 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/serverConfigManager.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/serverConfigManager_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/serverConfigManager_disable.svg new file mode 100644 index 0000000000..5d1803122c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/serverConfigManager_disable.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/sign.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/sign.svg new file mode 100644 index 0000000000..434ec48152 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/sign.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/sign_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/sign_disable.svg new file mode 100644 index 0000000000..1ea6b13052 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/sign_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/solution.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/solution.svg new file mode 100644 index 0000000000..09b8b3f297 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/solution.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/solution_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/solution_disable.svg new file mode 100644 index 0000000000..60491f447d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/solution_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/studyPlan.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/studyPlan.svg new file mode 100644 index 0000000000..19b01795a4 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/studyPlan.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/studyPlan_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/studyPlan_disable.svg new file mode 100644 index 0000000000..1a1640ad33 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/studyPlan_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/switchEnv.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/switchEnv.svg new file mode 100644 index 0000000000..1aabb99ff3 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/switchEnv.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/switchEnv_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/switchEnv_disable.svg new file mode 100644 index 0000000000..5edb4eacd5 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/switchEnv_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/templateStore.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/templateStore.svg new file mode 100644 index 0000000000..bfedf499d9 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/templateStore.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/templateStore_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/templateStore_disable.svg new file mode 100644 index 0000000000..d37287b27a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/templateStore_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/update.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/update.svg new file mode 100644 index 0000000000..6430a6bcf2 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/update.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/update_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/update_disable.svg new file mode 100644 index 0000000000..c69a417f9b --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/update_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/video.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/video.svg new file mode 100644 index 0000000000..6b83ecc90c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/video.svg @@ -0,0 +1,7 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/video_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/video_disable.svg new file mode 100644 index 0000000000..f0bd8cd911 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/video_disable.svg @@ -0,0 +1,7 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/watermark.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/watermark.svg new file mode 100644 index 0000000000..9b314c514c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/watermark.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/watermark_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/watermark_disable.svg new file mode 100644 index 0000000000..725c4b10ea --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/watermark_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/webReportAttribute.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/webReportAttribute.svg new file mode 100644 index 0000000000..f132dd570c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/webReportAttribute.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/webReportAttribute_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/webReportAttribute_disable.svg new file mode 100644 index 0000000000..318c15f130 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/webReportAttribute_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/widgetManager.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/widgetManager.svg new file mode 100644 index 0000000000..c919716b53 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/widgetManager.svg @@ -0,0 +1,7 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/widgetManager_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/widgetManager_disable.svg new file mode 100644 index 0000000000..271256d571 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/widgetManager_disable.svg @@ -0,0 +1,7 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/widgetThemeMenu.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/widgetThemeMenu.svg new file mode 100644 index 0000000000..359597af47 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/widgetThemeMenu.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/widgetThemeMenu_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/widgetThemeMenu_disable.svg new file mode 100644 index 0000000000..0f87deeaf4 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/widgetThemeMenu_disable.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/workOrderCenter.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/workOrderCenter.svg new file mode 100644 index 0000000000..4fc373159e --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/workOrderCenter.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/workOrderCenter_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/workOrderCenter_disable.svg new file mode 100644 index 0000000000..471d7c5cad --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/workOrderCenter_disable.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStyleAction.java b/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStyleAction.java index 2ed319249a..240aff93db 100644 --- a/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStyleAction.java +++ b/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStyleAction.java @@ -1,12 +1,12 @@ package com.fr.design.module; +import com.fine.theme.icon.LazyIcon; import com.fr.base.ChartEmptyDataStyleConf; import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrame; -import com.fr.general.IOUtils; import com.fr.transaction.CallBackAdaptor; import com.fr.transaction.Configurations; import com.fr.transaction.WorkerFacade; @@ -20,7 +20,7 @@ import java.awt.event.ActionEvent; public class ChartEmptyDataStyleAction extends UpdateAction { public ChartEmptyDataStyleAction() { - this.setSmallIcon(IOUtils.readIcon("com/fr/design/images/EmptyChart.png")); + this.setSmallIcon(new LazyIcon("chartEmptyDataStyle")); this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Empty_Data")); } diff --git a/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleAction.java b/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleAction.java index e989e1a364..50f07d2bb8 100644 --- a/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleAction.java +++ b/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleAction.java @@ -1,7 +1,7 @@ package com.fr.design.module; +import com.fine.theme.icon.LazyIcon; import com.fr.base.ChartPreStyleConfig; -import com.fr.base.svg.IconUtils; import com.fr.concurrent.NamedThreadFactory; import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.BasicDialog; @@ -16,10 +16,10 @@ import com.fr.transaction.WorkerFacade; import com.fr.van.chart.designer.component.VanChartFillStylePane; import javax.swing.KeyStroke; +import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.concurrent.ExecutorService; -import java.awt.event.ActionEvent; /** * 图表预定义样式Action. @@ -35,7 +35,7 @@ public class ChartPreStyleAction extends UpdateAction { this.setMenuKeySet(CHART_DEFAULT_STYLE); this.setName(getMenuKeySet().getMenuKeySetName()+ "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("com/fr/design/images/chart/ChartType"); + this.setSmallIcon(new LazyIcon("chartPreStyle")); this.generateAndSetSearchText(ChartPreStyleManagerPane.class.getName()); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/server/ChartMapEditorAction.java b/designer-chart/src/main/java/com/fr/van/chart/map/server/ChartMapEditorAction.java index e9b0373a83..4143b562b3 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/server/ChartMapEditorAction.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/server/ChartMapEditorAction.java @@ -1,11 +1,10 @@ package com.fr.van.chart.map.server; +import com.fine.theme.icon.LazyIcon; import com.fr.base.ServerConfig; -import com.fr.base.svg.IconUtils; import com.fr.design.DesignerEnvManager; import com.fr.design.actions.UpdateAction; import com.fr.general.GeneralContext; - import com.fr.start.ServerStarter; import com.fr.workspace.WorkContext; @@ -17,7 +16,7 @@ import java.awt.event.ActionEvent; public class ChartMapEditorAction extends UpdateAction { public ChartMapEditorAction(){ - this.setSmallIcon("/com/fr/van/chart/map/images/mapData"); + this.setSmallIcon(new LazyIcon("charMapData")); this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Map_Data")); } diff --git a/designer-realize/src/main/java/com/fr/design/actions/file/export/PDFExportAction.java b/designer-realize/src/main/java/com/fr/design/actions/file/export/PDFExportAction.java index e6fc6b5406..da969fc68a 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/file/export/PDFExportAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/file/export/PDFExportAction.java @@ -3,7 +3,7 @@ */ package com.fr.design.actions.file.export; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.base.extension.FileExtension; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.JWorkBook; @@ -23,7 +23,7 @@ public class PDFExportAction extends AbstractWorkBookExportAction { this.setMenuKeySet(KeySetUtils.PDF_EXPORT); this.setName(getMenuKeySet().getMenuKeySetName() + "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/pdf.png")); + this.setSmallIcon(new LazyIcon("pdfFile")); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/actions/file/export/WordExportAction.java b/designer-realize/src/main/java/com/fr/design/actions/file/export/WordExportAction.java index 9e1a919848..99090a4ffb 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/file/export/WordExportAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/file/export/WordExportAction.java @@ -3,7 +3,7 @@ */ package com.fr.design.actions.file.export; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.base.extension.FileExtension; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.JWorkBook; @@ -23,7 +23,7 @@ public class WordExportAction extends AbstractWorkBookExportAction { this.setMenuKeySet(KeySetUtils.WORD_EXPORT); this.setName(getMenuKeySet().getMenuKeySetName() + "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/word.png")); + this.setSmallIcon(new LazyIcon("wordFile")); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/actions/file/newReport/NewWorkBookAction.java b/designer-realize/src/main/java/com/fr/design/actions/file/newReport/NewWorkBookAction.java index 371e952baf..5f41bd5f89 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/file/newReport/NewWorkBookAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/file/newReport/NewWorkBookAction.java @@ -1,13 +1,12 @@ package com.fr.design.actions.file.newReport; -import com.fr.base.svg.IconUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JWorkBook; import com.fr.design.menu.MenuKeySet; - import javax.swing.Icon; import javax.swing.KeyStroke; import java.awt.event.ActionEvent; @@ -26,7 +25,7 @@ public class NewWorkBookAction extends UpdateAction { } protected Icon icon() { - return IconUtils.readIcon("/com/fr/design/images/buttonicon/newcpts"); + return new LazyIcon("createCpt"); } /** diff --git a/designer-realize/src/main/java/com/fr/design/actions/insert/flot/ChartFloatAction.java b/designer-realize/src/main/java/com/fr/design/actions/insert/flot/ChartFloatAction.java index db4a6b8be0..015db6f1c5 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/insert/flot/ChartFloatAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/insert/flot/ChartFloatAction.java @@ -3,10 +3,10 @@ */ package com.fr.design.actions.insert.flot; +import com.fine.theme.icon.LazyIcon; import com.fr.base.DynamicUnitList; import com.fr.base.Style; import com.fr.base.chart.BaseChartCollection; - import com.fr.design.actions.ElementCaseAction; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.file.HistoryTemplateListPane; @@ -49,7 +49,7 @@ public class ChartFloatAction extends ElementCaseAction { this.setMenuKeySet(FLOAT_INSERT_CHART); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/standard/chart/chart"); + this.setSmallIcon(new LazyIcon("chart")); } public static final MenuKeySet FLOAT_INSERT_CHART = new MenuKeySet() { diff --git a/designer-realize/src/main/java/com/fr/design/actions/insert/flot/FormulaFloatAction.java b/designer-realize/src/main/java/com/fr/design/actions/insert/flot/FormulaFloatAction.java index 616bf7c9d6..cdecd8b2de 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/insert/flot/FormulaFloatAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/insert/flot/FormulaFloatAction.java @@ -3,6 +3,7 @@ */ package com.fr.design.actions.insert.flot; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseFormula; import com.fr.base.DynamicUnitList; import com.fr.design.actions.ElementCaseAction; @@ -37,7 +38,7 @@ public class FormulaFloatAction extends ElementCaseAction { this.setMenuKeySet(FLOAT_INSERT_FORMULA); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/standard/formula/formula"); + this.setSmallIcon(new LazyIcon("formula")); } public static final MenuKeySet FLOAT_INSERT_FORMULA = new MenuKeySet() { diff --git a/designer-realize/src/main/java/com/fr/design/actions/insert/flot/ImageFloatAction.java b/designer-realize/src/main/java/com/fr/design/actions/insert/flot/ImageFloatAction.java index ca33b15e85..526f1b77c8 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/insert/flot/ImageFloatAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/insert/flot/ImageFloatAction.java @@ -3,8 +3,8 @@ */ package com.fr.design.actions.insert.flot; +import com.fine.theme.icon.LazyIcon; import com.fr.base.DynamicUnitList; - import com.fr.design.actions.ElementCaseAction; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; @@ -15,7 +15,6 @@ import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.theme.utils.DefaultThemedFloatElement; import com.fr.design.menu.MenuKeySet; import com.fr.design.report.SelectImagePane; - import com.fr.grid.Grid; import com.fr.grid.selection.FloatSelection; import com.fr.report.ReportHelper; @@ -40,7 +39,7 @@ public class ImageFloatAction extends ElementCaseAction { this.setMenuKeySet(FLOAT_INSERT_IMAGE); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/standard/image/image"); + this.setSmallIcon(new LazyIcon("image")); } public static final MenuKeySet FLOAT_INSERT_IMAGE = new MenuKeySet() { diff --git a/designer-realize/src/main/java/com/fr/design/actions/insert/flot/TextBoxFloatAction.java b/designer-realize/src/main/java/com/fr/design/actions/insert/flot/TextBoxFloatAction.java index 59c2a3b0bd..9ca346d386 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/insert/flot/TextBoxFloatAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/insert/flot/TextBoxFloatAction.java @@ -3,6 +3,7 @@ */ package com.fr.design.actions.insert.flot; +import com.fine.theme.icon.LazyIcon; import com.fr.base.DynamicUnitList; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.mainframe.ElementCasePane; @@ -28,7 +29,7 @@ public class TextBoxFloatAction extends AbstractShapeAction { this.setMenuKeySet(FLOAT_INSERT_TEXT); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/standard/text/text"); + this.setSmallIcon(new LazyIcon("text")); } public static final MenuKeySet FLOAT_INSERT_TEXT = new MenuKeySet() { diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/ITReplaceAction.java b/designer-realize/src/main/java/com/fr/design/actions/replace/ITReplaceAction.java index 6d085cbbdf..a4b30753c6 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/ITReplaceAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/ITReplaceAction.java @@ -1,17 +1,13 @@ package com.fr.design.actions.replace; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; -import com.fr.design.dialog.UIDialog; -import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.actions.replace.ui.ITReplaceMainDialog; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.menu.MenuKeySet; -import com.fr.design.actions.replace.ui.ITReplaceMainDialog; -import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.*; +import javax.swing.KeyStroke; import java.awt.event.ActionEvent; -import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; @@ -29,7 +25,7 @@ public class ITReplaceAction extends UpdateAction { this.setName(getMenuKeySet().getMenuName()); this.setMnemonic(getMenuKeySet().getMnemonic()); this.setAccelerator(getMenuKeySet().getKeyStroke()); - this.setSmallIcon("/com/fr/design/images/replace/replace"); + this.setSmallIcon(new LazyIcon("replace")); } private static final MenuKeySet IT_REPLACE = new MenuKeySet() { diff --git a/designer-realize/src/main/java/com/fr/design/actions/report/ReportBackgroundAction.java b/designer-realize/src/main/java/com/fr/design/actions/report/ReportBackgroundAction.java index 481d2e0941..2d6e6f0690 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/report/ReportBackgroundAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/report/ReportBackgroundAction.java @@ -4,6 +4,7 @@ package com.fr.design.actions.report; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.ReportComponentAction; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; @@ -12,7 +13,6 @@ import com.fr.design.mainframe.ReportComponent; import com.fr.design.menu.KeySetUtils; import com.fr.design.report.NewReportBackgroundPane; import com.fr.report.core.ReportUtils; -import com.fr.report.report.Report; /** * Background action. @@ -24,7 +24,7 @@ public class ReportBackgroundAction extends ReportComponentAction { @@ -17,7 +17,7 @@ public class ReportColumnsAction extends ReportComponentAction { this.setMenuKeySet(KeySetUtils.REPORT_FOOTER); this.setName(getMenuKeySet().getMenuKeySetName() + "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/m_report/footer"); + this.setSmallIcon(new LazyIcon("reportFooter")); } /** diff --git a/designer-realize/src/main/java/com/fr/design/actions/report/ReportHeaderAction.java b/designer-realize/src/main/java/com/fr/design/actions/report/ReportHeaderAction.java index c23ed10b53..2076aa510b 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/report/ReportHeaderAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/report/ReportHeaderAction.java @@ -4,7 +4,7 @@ package com.fr.design.actions.report; -import com.fr.base.svg.IconUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.ReportComponentAction; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.headerfooter.EditHeaderPane; @@ -33,7 +33,7 @@ public class ReportHeaderAction extends ReportComponentAction { this.setMenuKeySet(KeySetUtils.REPORT_HEADER); this.setName(getMenuKeySet().getMenuKeySetName() + "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/m_report/header"); + this.setSmallIcon(new LazyIcon("reportHeader")); } /** diff --git a/designer-realize/src/main/java/com/fr/design/actions/report/ReportMobileAttrAction.java b/designer-realize/src/main/java/com/fr/design/actions/report/ReportMobileAttrAction.java index b18c62b086..c620e11264 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/report/ReportMobileAttrAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/report/ReportMobileAttrAction.java @@ -1,8 +1,8 @@ package com.fr.design.actions.report; +import com.fine.theme.icon.LazyIcon; import com.fr.base.PaperSize; import com.fr.base.iofile.attr.MobileOnlyTemplateAttrMark; -import com.fr.base.svg.IconUtils; import com.fr.design.actions.JWorkBookAction; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; @@ -11,7 +11,6 @@ import com.fr.design.mainframe.JWorkBook; import com.fr.design.menu.MenuKeySet; import com.fr.design.report.mobile.ReportMobileAttrPane; import com.fr.file.FILE; - import com.fr.intelli.record.Focus; import com.fr.main.TemplateWorkBook; import com.fr.page.PaperSettingProvider; @@ -19,7 +18,7 @@ import com.fr.record.analyzer.EnableMetrics; import com.fr.report.mobile.ElementCaseMobileAttr; import com.fr.report.report.Report; -import javax.swing.*; +import javax.swing.KeyStroke; import java.awt.event.ActionEvent; /** @@ -35,7 +34,7 @@ public class ReportMobileAttrAction extends JWorkBookAction{ this.setMenuKeySet(REPORT_APP_ATTR); this.setName(getMenuKeySet().getMenuKeySetName() + "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("/com/fr/design/images/m_report/mobile"); + this.setSmallIcon(new LazyIcon("mobileAttr")); this.generateAndSetSearchText(ReportMobileAttrPane.class.getName()); } diff --git a/designer-realize/src/main/java/com/fr/design/actions/report/ReportPageAttrAction.java b/designer-realize/src/main/java/com/fr/design/actions/report/ReportPageAttrAction.java index 9177f4d307..33878960d8 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/report/ReportPageAttrAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/report/ReportPageAttrAction.java @@ -3,7 +3,7 @@ */ package com.fr.design.actions.report; -import com.fr.base.svg.IconUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.ReportComponentAction; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; @@ -27,7 +27,7 @@ public class ReportPageAttrAction extends ReportComponentAction { private MenuDef createWorkBookExportMenu() { MenuDef excelExportMenuDef = new MenuDef(KeySetUtils.EXCEL_EXPORT.getMenuKeySetName(), KeySetUtils.EXCEL_EXPORT.getMnemonic()); - excelExportMenuDef.setIconPath("/com/fr/design/images/m_file/excel.png"); + excelExportMenuDef.setIcon(new LazyIcon("excel_icon")); excelExportMenuDef .addShortCut(new PageExcelExportAction(this), new ExcelExportAction(this), new PageToSheetExcelExportAction(this)); // Export - MenuDef MenuDef exportMenuDef = new MenuDef(KeySetUtils.EXPORT.getMenuName()); - exportMenuDef.setIconPath("/com/fr/design/images/m_file/export"); + exportMenuDef.setIcon(new LazyIcon("export")); addShortCut(exportMenuDef, excelExportMenuDef); return exportMenuDef; } diff --git a/designer-realize/src/main/java/com/fr/start/MainDesigner.java b/designer-realize/src/main/java/com/fr/start/MainDesigner.java index a49e5ba721..315c624efa 100644 --- a/designer-realize/src/main/java/com/fr/start/MainDesigner.java +++ b/designer-realize/src/main/java/com/fr/start/MainDesigner.java @@ -217,7 +217,7 @@ public class MainDesigner extends BaseDesigner { shortCuts.add(new NewWorkBookAction()); // 决策报表、聚合报表归入其他 MenuDef newOtherFileMenuDef = new MenuDef(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_M_New_Other_Template")); - newOtherFileMenuDef.setIconPath("/com/fr/design/images/buttonicon/new_other"); + newOtherFileMenuDef.setIcon(new LazyIcon("createOther")); try { // todo:菜单 if (DesignModuleFactory.getNewFormAction() != null) { From b818ebb5d966e764dda8294930aef233916724fe Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Wed, 10 Jan 2024 20:23:53 +0800 Subject: [PATCH 113/302] =?UTF-8?q?REPORT-107973=20=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E6=A0=8F=E5=8F=8D=E7=99=BD=E5=9B=BE=E6=A0=87=E7=BB=98=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/light/ui/FineMenuUI.java | 40 ------------------- .../mainframe/EastRegionContainerPane.java | 2 + .../main/java/com/fr/design/menu/MenuDef.java | 8 ++++ .../theme/light/ui/laf/FineLaf.properties | 2 +- .../light/ui/laf/FineLightLaf.properties | 3 +- .../components/PopupMenuStoryBoard.java | 33 ++++++++++++--- 6 files changed, 40 insertions(+), 48 deletions(-) delete mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineMenuUI.java diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuUI.java deleted file mode 100644 index b71b816a07..0000000000 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineMenuUI.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fine.theme.light.ui; - -import com.fine.theme.icon.LazyIcon; -import com.formdev.flatlaf.ui.FlatMenuUI; - -import javax.swing.JComponent; -import javax.swing.plaf.ComponentUI; -import java.awt.Graphics; - -/** - * 弹窗菜单UI - * - * @author Leo.Qin - * @since 11.0 - * Created on 2024/1/8 - */ -public class FineMenuUI extends FlatMenuUI { - - - /** - * 创建UI - * - * @param c - * @return - */ - public static ComponentUI createUI(JComponent c) { - return new FineMenuUI(); - } - - @Override - protected void installDefaults() { - arrowIcon = new LazyIcon("triangle_right"); - super.installDefaults(); - } - - @Override - public void paint(Graphics g, JComponent c) { - super.paint(g, c); - } -} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 1b782dd300..f060bf0fff 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.RectangleButtonUI; import com.fine.theme.utils.FineUIScale; import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.FlatDarkLaf; @@ -1004,6 +1005,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { }; button.setDisabledIcon(new LazyIcon(btnIconName + ICON_SUFFIX_DISABLED)); button.set4LargeToolbarButton(); + button.setUI(new RectangleButtonUI(false)); setStyle(button, STYLE_TEXT); button.addActionListener(new ActionListener() { @Override diff --git a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java index 1f5de9a2d1..1de6b78b38 100644 --- a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java +++ b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java @@ -361,11 +361,19 @@ public class MenuDef extends ShortCut { for (MenuElement subElement : subElements) { if (subElement instanceof JMenu) { JMenu jMenu = (JMenu) subElement; + Icon icon = jMenu.getIcon(); + if (icon instanceof LazyIcon && jMenu.getSelectedIcon() == null) { + jMenu.setSelectedIcon(((LazyIcon) icon).white()); + } setStyle(jMenu, FineUIStyle.MENU_TOOL_BAR); JPopupMenu childPopupMenu = jMenu.getPopupMenu(); setToolBarClientProperty(childPopupMenu); } else if (subElement instanceof JMenuItem) { JMenuItem jMenuItem = (JMenuItem) subElement; + Icon icon = jMenuItem.getIcon(); + if (icon instanceof LazyIcon && jMenuItem.getSelectedIcon() == null) { + jMenuItem.setSelectedIcon(((LazyIcon) icon).white()); + } setStyle(jMenuItem, FineUIStyle.MENU_ITEM_TOOL_BAR); } } diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties index 8985e99dd0..7f26ba5f10 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties @@ -13,7 +13,7 @@ FormattedTextFieldUI=com.formdev.flatlaf.ui.FlatFormattedTextFieldUI InternalFrameUI=com.formdev.flatlaf.ui.FlatInternalFrameUI LabelUI=com.formdev.flatlaf.ui.FlatLabelUI ListUI=com.formdev.flatlaf.ui.FlatListUI -MenuUI=com.fine.theme.light.ui.FineMenuUI +MenuUI=com.formdev.flatlaf.ui.FlatMenuUI MenuBarUI=com.formdev.flatlaf.ui.FlatMenuBarUI MenuItemUI=com.fine.theme.light.ui.FineMenuItemUI OptionPaneUI=com.formdev.flatlaf.ui.FlatOptionPaneUI diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index d9deea101b..d3a8bc0066 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -1274,7 +1274,8 @@ CellOtherSetPane.height=$Component.defaultHeight selectionBackground : $brand.normal; \ selectionForeground : $text.white; \ acceleratorForeground : @foreground; \ - acceleratorSelectionForeground : $text.white + acceleratorSelectionForeground : $text.white; \ + icon.arrowType : triangle; [style]MenuItem.menuItemToolBar=\ selectionBackground : $brand.normal; \ selectionForeground : $text.white; \ diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/PopupMenuStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/PopupMenuStoryBoard.java index fb4354d3df..bd202b6f50 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/components/PopupMenuStoryBoard.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/PopupMenuStoryBoard.java @@ -10,16 +10,20 @@ import com.fr.design.gui.storybook.StoryBoard; import com.fr.design.menu.DottedSeparator; import com.fr.design.menu.NameSeparator; +import javax.swing.Icon; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; +import javax.swing.KeyStroke; import javax.swing.MenuElement; +import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import static com.fine.swing.ui.layout.Layouts.cell; import static com.fine.swing.ui.layout.Layouts.column; import static com.fine.theme.utils.FineUIStyle.setStyle; +import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; /** * 弹窗组件 @@ -36,14 +40,19 @@ public class PopupMenuStoryBoard extends StoryBoard { column(70, cell(new UIButton("点击展示弹窗")).with(it -> { UIPopupMenu popupMenu = new UIPopupMenu(); - popupMenu.add(new UIMenuItem("test1", new LazyIcon("edit"))); + popupMenu.add(new UIMenuItem("test1")); popupMenu.add(new UIMenuItem("test2", new LazyIcon("cellHyperLinkAttr"))); popupMenu.addSeparator(); popupMenu.add(new UIMenuItem("test3", new LazyIcon("cellClear"))); popupMenu.add(new NameSeparator("分割线").createMenuItem()); - popupMenu.add(new UIMenuItem("test4", new LazyIcon("cellOtherAttr"))); + UIMenuItem menuItem = new UIMenuItem("test4", new LazyIcon("cellOtherAttr")); + menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, DEFAULT_MODIFIER)); + popupMenu.add(menuItem); popupMenu.add(new DottedSeparator().createMenuItem()); - popupMenu.add(new UIMenuItem("test5", new LazyIcon("cellExpandAttr"))); + JMenu test5 = new JMenu("test5"); + test5.setIcon(new LazyIcon("cellExpandAttr")); + popupMenu.add(test5); + it.addMouseListener(new MouseAdapter() { @@ -57,14 +66,18 @@ public class PopupMenuStoryBoard extends StoryBoard { cell(new UIButton("点击展示菜单栏弹窗")).with(it -> { UIPopupMenu popupMenu = new UIPopupMenu(); - popupMenu.add(new UIMenuItem("test1", new LazyIcon("edit"))); + popupMenu.add(new UIMenuItem("test1")); popupMenu.add(new UIMenuItem("test2", new LazyIcon("cellHyperLinkAttr"))); popupMenu.addSeparator(); popupMenu.add(new UIMenuItem("test3", new LazyIcon("cellClear"))); popupMenu.add(new NameSeparator("分割线").createMenuItem()); - popupMenu.add(new UIMenuItem("test4", new LazyIcon("cellOtherAttr"))); + UIMenuItem menuItem = new UIMenuItem("test4", new LazyIcon("cellOtherAttr")); + menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, DEFAULT_MODIFIER)); + popupMenu.add(menuItem); popupMenu.add(new DottedSeparator().createMenuItem()); - popupMenu.add(new UIMenuItem("test5", new LazyIcon("cellExpandAttr"))); + JMenu test5 = new JMenu("test5"); + test5.setIcon(new LazyIcon("cellExpandAttr")); + popupMenu.add(test5); it.addMouseListener(new MouseAdapter() { @@ -90,11 +103,19 @@ public class PopupMenuStoryBoard extends StoryBoard { for (MenuElement subElement : subElements) { if (subElement instanceof JMenu) { JMenu jMenu = (JMenu) subElement; + Icon icon = jMenu.getIcon(); + if (icon instanceof LazyIcon && jMenu.getSelectedIcon() == null) { + jMenu.setSelectedIcon(((LazyIcon) icon).white()); + } JPopupMenu childPopupMenu = jMenu.getPopupMenu(); setStyle(jMenu, FineUIStyle.MENU_TOOL_BAR); setToolBarClientProperty(childPopupMenu); } else if (subElement instanceof JMenuItem) { JMenuItem jMenuItem = (JMenuItem) subElement; + Icon icon = jMenuItem.getIcon(); + if (icon instanceof LazyIcon && jMenuItem.getSelectedIcon() == null) { + jMenuItem.setSelectedIcon(((LazyIcon) icon).white()); + } setStyle(jMenuItem, FineUIStyle.MENU_ITEM_TOOL_BAR); } } From 93e8f7c81fc4c35a4d75a6dd98101904257234be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 10 Jan 2024 21:06:33 +0800 Subject: [PATCH 114/302] =?UTF-8?q?REPORT-111995=20=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=A0=BC=E5=B1=9E=E6=80=A7=3D>=E6=95=B0=E6=8D=AE=E5=88=97?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E5=B8=83=E5=B1=80=E9=87=8D=E7=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/gui/core/ReactiveCardPane.java | 1 + .../light/ui/laf/FineLightLaf.properties | 5 +- .../dscolumn/ResultSetGroupDockingPane.java | 133 +++----- .../dscolumn/SelectedDataColumnPane.java | 28 +- .../cell/AbstractDSCellEditorPane.java | 8 + .../design/sort/common/AbstractSortPane.java | 2 +- .../cellquick/CellDSColumnEditor.java | 309 +++++------------- 7 files changed, 156 insertions(+), 330 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/core/ReactiveCardPane.java b/designer-base/src/main/java/com/fr/design/gui/core/ReactiveCardPane.java index 9c05fb461f..8e2897c2b1 100644 --- a/designer-base/src/main/java/com/fr/design/gui/core/ReactiveCardPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/core/ReactiveCardPane.java @@ -65,6 +65,7 @@ public class ReactiveCardPane extends JPanel { } removeAll(); add(cardFactory.get(selectKey).get(), BorderLayout.CENTER); + setVisible(true); revalidate(); repaint(); } diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index d3a8bc0066..a6d558281f 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -223,11 +223,8 @@ CombinationButton.borderColor = $Component.borderColor CombinationButton.arc = $Button.arc #---- CheckBox ---- - -CheckBox.border = com.formdev.flatlaf.ui.FlatMarginBorder -CheckBox.icon = com.formdev.flatlaf.icons.FlatCheckBoxIcon CheckBox.arc = 4 -CheckBox.margin = 2,2,2,2 +CheckBox.margin = 2,0,2,0 CheckBox.iconTextGap = 4 CheckBox.rollover = true diff --git a/designer-realize/src/main/java/com/fr/design/dscolumn/ResultSetGroupDockingPane.java b/designer-realize/src/main/java/com/fr/design/dscolumn/ResultSetGroupDockingPane.java index 3a51af2844..afc76a1a44 100644 --- a/designer-realize/src/main/java/com/fr/design/dscolumn/ResultSetGroupDockingPane.java +++ b/designer-realize/src/main/java/com/fr/design/dscolumn/ResultSetGroupDockingPane.java @@ -1,14 +1,13 @@ package com.fr.design.dscolumn; +import com.fine.swing.ui.layout.Layouts; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.gui.core.ReactiveCardPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.FunctionComboBox; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.design.utils.gui.UIComponentUtils; import com.fr.design.widget.FRWidgetFactory; import com.fr.report.cell.TemplateCellElement; import com.fr.report.cell.cellattr.CellExpandAttr; @@ -21,13 +20,15 @@ import com.fr.stable.Constants; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.CardLayout; -import java.awt.Component; import java.awt.Dimension; -import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; + /** * 这个pane是选中数据列后,在上方QuickRegion处显示的pane * @@ -39,13 +40,11 @@ public class ResultSetGroupDockingPane extends ResultSetGroupPane { private static final int BIND_GROUP = 0; private static final int BIND_SELECTED = 1; private static final int BIND_SUMMARY = 2; - private static final int DATA_SET_LABEL_WIDTH = 60; private UIButton advancedButton; + private JPanel advancedButtonRow; private FunctionComboBox functionComboBox; - private JPanel contentPane; - private JPanel cardPane; - private CardLayout cardLayout; + private ReactiveCardPane cardPane; private UIComboBox goBox; private ItemListener listener; @@ -56,70 +55,52 @@ public class ResultSetGroupDockingPane extends ResultSetGroupPane { } public void initComponents() { - goBox = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Group"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Select"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Summary")}); + goBox = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Group"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Select"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Summary")}); initCardPane(); - contentPane = layoutPane(); this.setLayout(new BorderLayout()); - this.add(contentPane, BorderLayout.CENTER); + this.add(layoutPane(), BorderLayout.CENTER); } private JPanel layoutPane() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; UILabel dataSetLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_Setting")); - Component[][] components = new Component[][] - { - new Component[]{dataSetLabel, UIComponentUtils.wrapWithBorderLayoutPane(goBox)}, - new Component[]{null, cardPane} - }; - goBox.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent ee) { - int i = goBox.getSelectedIndex(); - if (i == BIND_GROUP) { - cardLayout.show(cardPane, "groupPane"); - cardPane.setPreferredSize(new Dimension(158, 20)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 2, 10); - } else if (i == BIND_SELECTED) { - cardLayout.show(cardPane, "listPane"); - cardPane.setPreferredSize(new Dimension(0, 0)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 2, 0); - } else if (i == BIND_SUMMARY) { - cardLayout.show(cardPane, "summaryPane"); - cardPane.setPreferredSize(new Dimension(158, 20)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 2, 10); - CellExpandAttr cellExpandAttr = cellElement.getCellExpandAttr(); - cellExpandAttr.setDirection(Constants.NONE); - } - checkButtonEnabled(); + goBox.addItemListener(ee -> { + int i = goBox.getSelectedIndex(); + if (i == BIND_GROUP) { + cardPane.select("groupPane").populate(); + } else if (i == BIND_SELECTED) { + cardPane.setVisible(false); + } else if (i == BIND_SUMMARY) { + cardPane.select("summaryPane").populate(); + CellExpandAttr cellExpandAttr = cellElement.getCellExpandAttr(); + cellExpandAttr.setDirection(Constants.NONE); } + checkButtonEnabled(); }); - - double[] columnSize = {DATA_SET_LABEL_WIDTH, f}; - double[] rowSize = {p, p}; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 8, 10); + return Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(dataSetLabel).weight(1.2), cell(goBox).weight(3) + ), + cell(cardPane) + ).getComponent(); } private void initCardPane() { - cardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); - cardLayout = new CardLayout(); - cardPane.setLayout(cardLayout); - - groupComboBox.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - checkButtonEnabled(); - } - }); + groupComboBox.addItemListener(e -> checkButtonEnabled()); advancedButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Custom")); advancedButton.addActionListener(groupAdvancedListener); - - JPanel pane = new JPanel(new BorderLayout(0, 10)); - pane.add(groupComboBox, BorderLayout.NORTH); - pane.add(advancedButton, BorderLayout.CENTER); - cardPane.add(pane, "groupPane"); - - cardPane.add(new JPanel(), "listPane"); - - cardPane.add(functionComboBox = new FunctionComboBox(GUICoreUtils.getFunctionArray()), "summaryPane"); + advancedButtonRow = row(flex(1.2), cell(advancedButton).weight(3)).getComponent(); + functionComboBox = new FunctionComboBox(GUICoreUtils.getFunctionArray()); + + cardPane = ReactiveCardPane.create() + .addSupplier("groupPane", () -> column(LayoutConstants.VERTICAL_GAP, + row(flex(1.2), cell(groupComboBox).weight(3)), + cell(advancedButtonRow) + ).getComponent()) + .addSupplier("summaryPane", () -> row( + flex(1.2), cell(functionComboBox).weight(3) + ).getComponent()); } @Override @@ -135,29 +116,29 @@ public class ResultSetGroupDockingPane extends ResultSetGroupPane { if (recordGrouper instanceof FunctionGrouper && !((FunctionGrouper) recordGrouper).isCustom()) { int mode = recordGrouper.getDivideMode(); if (mode == FunctionGrouper.GROUPING_MODE) { - cardLayout.show(cardPane, "groupPane"); + cardPane.select("groupPane").populate(); this.goBox.setSelectedIndex(BIND_GROUP); this.groupComboBox.setSelectedIndex(COMMON); } else if (mode == FunctionGrouper.CONTINUUM_MODE) { - cardLayout.show(cardPane, "groupPane"); + cardPane.select("groupPane").populate(); this.goBox.setSelectedIndex(BIND_GROUP); this.groupComboBox.setSelectedIndex(CONTINUUM); } else if (mode == FunctionGrouper.LIST_MODE) { - cardLayout.show(cardPane, "listPane"); + cardPane.setVisible(false); this.goBox.setSelectedIndex(BIND_SELECTED); } } else if (recordGrouper instanceof FunctionGrouper && ((FunctionGrouper) recordGrouper).isCustom()) { // 这种情况也放到自定义分组里面 - cardLayout.show(cardPane, "groupPane"); + cardPane.select("groupPane").populate(); this.goBox.setSelectedIndex(BIND_GROUP); this.groupComboBox.setSelectedIndex(ADVANCED); } else if (recordGrouper instanceof SummaryGrouper) { - cardLayout.show(cardPane, "summaryPane"); + cardPane.select("summaryPane").populate(); this.goBox.setSelectedIndex(BIND_SUMMARY); this.functionComboBox.setFunction(((SummaryGrouper) recordGrouper).getFunction()); } else if (recordGrouper instanceof CustomGrouper) { // 自定义分组 or 高级分组 - cardLayout.show(cardPane, "groupPane"); + cardPane.select("groupPane").populate(); this.goBox.setSelectedIndex(BIND_GROUP); this.groupComboBox.setSelectedIndex(ADVANCED); } @@ -206,21 +187,7 @@ public class ResultSetGroupDockingPane extends ResultSetGroupPane { advancedButton.setEnabled(true); } } - if (advancedButton.isEnabled()) { - cardPane.setPreferredSize(new Dimension(158, 50)); - cardPane.revalidate(); - cardPane.repaint(); - return; - } - if (groupComboBox.isEnabled() || functionComboBox.isEnabled()) { - cardPane.setPreferredSize(new Dimension(158, 20)); - cardPane.revalidate(); - cardPane.repaint(); - return; - } - cardPane.setPreferredSize(new Dimension(158, 0)); - cardPane.revalidate(); - cardPane.repaint(); + advancedButtonRow.setVisible(advancedButton.isEnabled()); } diff --git a/designer-realize/src/main/java/com/fr/design/dscolumn/SelectedDataColumnPane.java b/designer-realize/src/main/java/com/fr/design/dscolumn/SelectedDataColumnPane.java index 052fba9046..969946908d 100644 --- a/designer-realize/src/main/java/com/fr/design/dscolumn/SelectedDataColumnPane.java +++ b/designer-realize/src/main/java/com/fr/design/dscolumn/SelectedDataColumnPane.java @@ -1,8 +1,10 @@ package com.fr.design.dscolumn; +import com.fine.swing.ui.layout.Layouts; import com.fr.base.Parameter; import com.fr.data.SimpleDSColumn; import com.fr.data.TableDataSource; +import com.fr.design.constants.LayoutConstants; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.TableDataComboBox; import com.fr.design.data.tabledata.wrapper.TableDataWrapper; @@ -18,7 +20,6 @@ import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.ElementCasePane; -import com.fr.design.utils.gui.UIComponentUtils; import com.fr.design.widget.FRWidgetFactory; import com.fr.general.data.TableDataColumn; import com.fr.report.cell.CellElement; @@ -41,6 +42,9 @@ import java.util.List; import java.util.Objects; import java.util.regex.Pattern; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + /** * 数据集列动态参数设置组件 * @@ -192,20 +196,21 @@ public class SelectedDataColumnPane extends BasicPane { } }; columnNameComboBox.setEditable(true); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; UILabel dsLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_TableData")); UILabel dpLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Dynamic_Parameter")); UILabel dcLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Data_Column")); - double[] rowSize = new double[]{p, p, p}; - double[] colSize = new double[]{60, f}; - Component[][] components = { - {dsLabel, UIComponentUtils.wrapWithBorderLayoutPane(tableNameComboBox)}, - {dpLabel, UIComponentUtils.wrapWithBorderLayoutPane(paramButton)}, - {dcLabel, UIComponentUtils.wrapWithBorderLayoutPane(columnNameComboBox)} - }; this.setLayout(new BorderLayout()); - this.add(TableLayoutHelper.createGapTableLayoutPane(components, rowSize, colSize, 8, 10)); + this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(dsLabel).weight(1.2), cell(tableNameComboBox).weight(3) + ), + row( + cell(dpLabel).weight(1.2), cell(paramButton).weight(3) + ), + row( + cell(dcLabel).weight(1.2), cell(columnNameComboBox).weight(3) + ) + ).getComponent()); } @@ -331,7 +336,6 @@ public class SelectedDataColumnPane extends BasicPane { protected void initTableNameComboBox() { tableNameComboBox = new TableDataComboBox(DesignTableDataManager.getEditingTableDataSource()); - tableNameComboBox.setPreferredSize(new Dimension(100, 20)); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/AbstractDSCellEditorPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/AbstractDSCellEditorPane.java index dd7d3608c8..530d6b70fa 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/AbstractDSCellEditorPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/AbstractDSCellEditorPane.java @@ -3,6 +3,8 @@ package com.fr.design.mainframe.cell; import com.fr.design.gui.frpane.AttributeChangeListener; import com.fr.design.mainframe.AbstractAttrPane; +import java.awt.BorderLayout; + /** * 右侧单元格元素面板抽象类 * @@ -24,6 +26,12 @@ public abstract class AbstractDSCellEditorPane extends AbstractAttrPane { */ public abstract void populate(); + protected void initContentPane() { + leftContentPane = createContentPane(); + if (leftContentPane != null) { + this.add(leftContentPane, BorderLayout.CENTER); + } + } /** * 释放tc diff --git a/designer-realize/src/main/java/com/fr/design/sort/common/AbstractSortPane.java b/designer-realize/src/main/java/com/fr/design/sort/common/AbstractSortPane.java index df56f188c5..db93fda4de 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/common/AbstractSortPane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/common/AbstractSortPane.java @@ -4,7 +4,6 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.sort.header.SortHeaderPane; import com.fr.report.cell.TemplateCellElement; import com.fr.report.core.sort.common.CellSortAttr; -import com.fr.report.core.sort.sortexpression.CellSortExpression; import com.fr.report.core.sort.sortexpression.SortExpression; import com.fr.report.core.sort.header.SortHeader; import com.fr.stable.ColumnRow; @@ -33,6 +32,7 @@ public abstract class AbstractSortPane extends JPanel { public AbstractSortPane(int sortPaneWidth, int sortPaneRightWidth) { this.sortPaneWidth = sortPaneWidth; this.sortPaneRightWidth = sortPaneRightWidth; + this.setLayout(new BorderLayout()); initComponents(); } diff --git a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java index c8f813a4e7..092e536190 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java @@ -1,6 +1,9 @@ package com.fr.quickeditor.cellquick; import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.icon.LazyIcon; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.BaseFormula; import com.fr.design.actions.columnrow.DSColumnConditionAction; import com.fr.design.actions.core.ActionFactory; @@ -17,6 +20,7 @@ import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.formula.CustomVariableResolver; import com.fr.design.formula.FormulaFactory; import com.fr.design.formula.UIFormula; +import com.fr.design.gui.core.ReactiveCardPane; import com.fr.design.gui.frpane.AttributeChangeListener; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIHeadGroup; @@ -28,13 +32,9 @@ import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.cell.AbstractDSCellEditorPane; import com.fr.design.sort.celldscolumn.CellDSColumnSortPane; -import com.fr.design.utils.gui.UIComponentUtils; import com.fr.design.widget.FRWidgetFactory; -import com.fr.general.IOUtils; import com.fr.grid.selection.CellSelection; import com.fr.quickeditor.CellQuickEditor; import com.fr.report.cell.CellElement; @@ -45,15 +45,12 @@ import com.fr.report.cell.cellattr.core.group.FilterTypeEnum; import com.fr.report.cell.cellattr.core.group.SelectCount; import com.fr.stable.StringUtils; -import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.SwingUtilities; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; @@ -63,6 +60,9 @@ import java.util.Arrays; import java.util.Set; import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.BOTTOM; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.EVEN; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.ODD; @@ -79,9 +79,6 @@ import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.UNDEFINE; * @since 9.0 */ public class CellDSColumnEditor extends CellQuickEditor { - private static final double P = TableLayout.PREFERRED, F = TableLayout.FILL; - private static final Color TIP_FONT_COLOR = new Color(0x7F333334, true); - /** * 基本和高级设置 @@ -275,13 +272,6 @@ public class CellDSColumnEditor extends CellQuickEditor { ).getComponent(); } - protected void initContentPane() { - leftContentPane = createContentPane(); - if (leftContentPane != null) { - this.add(leftContentPane, BorderLayout.CENTER); - } - } - private void initComponents(){ dataPane = new SelectedDataColumnPane(true, true); groupPane = new ResultSetGroupDockingPane(); @@ -295,7 +285,7 @@ public class CellDSColumnEditor extends CellQuickEditor { condition.setSmallIcon(UIConstants.EMPTY_ICON); condition.setName(Toolkit.i18nText("Fine-Design_Basic_Edit")); conditionUIButton = new UIButton(condition); - conditionPane = Layouts.row(cell(uiLabel).weight(1.2),cell(conditionUIButton).weight(3)).getComponent(); + conditionPane = row(cell(uiLabel).weight(1.2),cell(conditionUIButton).weight(3)).getComponent(); } private void initListener() { @@ -411,10 +401,8 @@ public class CellDSColumnEditor extends CellQuickEditor { public DSColumnAdvancedEditorPane() { - this.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); } - @Override public String getIconPath() { return Toolkit.i18nText("Fine-Design_Report_Advanced"); @@ -425,8 +413,6 @@ public class CellDSColumnEditor extends CellQuickEditor { return Toolkit.i18nText("Fine-Design_Report_Advanced"); } - - @Override public void update() { if (cellElement != null) { @@ -548,49 +534,33 @@ public class CellDSColumnEditor extends CellQuickEditor { */ @Override protected JPanel createContentPane() { - JPanel contentPane = new JPanel(new BorderLayout()); this.setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel contentPane = new JPanel(new BorderLayout()); //结果筛选 filterPane = new ResultSetFilterConfigPane(); - //自定义值显示 valuePane = new CustomValuePane(); - - //可扩展性 - JPanel extendableDirectionPane = FRGUIPaneFactory.createYBoxEmptyBorderPane(); - extendableDirectionPane.add(heCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_ExpandD_Horizontal_Extendable"))); - extendableDirectionPane.add(veCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_ExpandD_Vertical_Extendable"))); - //补充空白数据 - JPanel multiNumPane = FRGUIPaneFactory.createYBoxEmptyBorderPane(); useMultiNumCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Fill_Blank_Data")); - JPanel checkBoxPane = new JPanel(new BorderLayout()); - checkBoxPane.add(useMultiNumCheckBox, BorderLayout.WEST); - multiNumPane.add(checkBoxPane); multiNumSpinner = new UISpinner(1, 10000, 1, 1); - //数据倍数 UILabel multipleLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Column_Multiple")); - multiPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ - new Component[]{ - multipleLabel, multiNumSpinner - } - }, new double[]{P}, new double[]{P, F}, HGAP, VGAP - ); - multiPane.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0)); - multiNumPane.add(multiPane); - - Component[][] components = new Component[][]{ - {filterPane}, - {valuePane}, - {extendableDirectionPane}, - {multiNumPane} - }; - - double[] rowSize = new double[components.length]; - Arrays.fill(rowSize, P); - double[] columnSize = {F}; - JPanel advancePropertyPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP); + multiPane = Layouts.row( + cell(multipleLabel).weight(1.2), cell(multiNumSpinner).weight(3) + ).getComponent(); + JPanel multiNumPane = Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(useMultiNumCheckBox), + cell(multiPane) + ).getComponent(); + + // 核心面板 + JPanel advancePropertyPane = Layouts.column(LayoutConstants.VERTICAL_GAP, + cell(filterPane), + cell(valuePane), + cell(heCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_ExpandD_Horizontal_Extendable"))), + cell(veCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_ExpandD_Vertical_Extendable"))), + cell(multiNumPane) + ).getComponent(); contentPane.add(advancePropertyPane, BorderLayout.NORTH); UIExpandablePane sortUIExpandablePane = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Sort_Data_Column_Sort"), @@ -619,8 +589,7 @@ public class CellDSColumnEditor extends CellQuickEditor { private JPanel contentPane; private UIComboBox rsComboBox; - private JPanel setCardPane; - private JPanel tipCardPane; + private ReactiveCardPane setTipCardPane; private UITextField serialTextField; private JFormulaField topFormulaPane; private JFormulaField bottomFormulaPane; @@ -629,63 +598,7 @@ public class CellDSColumnEditor extends CellQuickEditor { @Override public void actionPerformed(ActionEvent evt) { int selectIndex = rsComboBox.getSelectedIndex(); - CardLayout setCardPaneLayout = (CardLayout) setCardPane.getLayout(); - CardLayout tipCardPaneLayout = (CardLayout) tipCardPane.getLayout(); - if (selectIndex == TOP.getValue()) { - //前N个 - setCardPaneLayout.show(setCardPane, TOP.name()); - tipCardPaneLayout.show(tipCardPane, TOP.name()); - //隐藏tip 显示set - setCardPane.setPreferredSize(new Dimension(156, 20)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 2, VGAP); - tipCardPane.setPreferredSize(new Dimension(0, 0)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 4, 0); - } else if (selectIndex == BOTTOM.getValue()) { - //后N个 - setCardPaneLayout.show(setCardPane, BOTTOM.name()); - tipCardPaneLayout.show(tipCardPane, BOTTOM.name()); - //隐藏tip 显示set - setCardPane.setPreferredSize(new Dimension(156, 20)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 2, VGAP); - tipCardPane.setPreferredSize(new Dimension(0, 0)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 4, 0); - } else if (selectIndex == ODD.getValue()) { - //奇数 - setCardPaneLayout.show(setCardPane, ODD.name()); - tipCardPaneLayout.show(tipCardPane, ODD.name()); - //隐藏set 显示tip - setCardPane.setPreferredSize(new Dimension(0, 0)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 2, 0); - tipCardPane.setPreferredSize(new Dimension(224, 40)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 4, VGAP_INNER); - } else if (selectIndex == EVEN.getValue()) { - //偶数 - setCardPaneLayout.show(setCardPane, EVEN.name()); - tipCardPaneLayout.show(tipCardPane, EVEN.name()); - //隐藏set 显示tip - setCardPane.setPreferredSize(new Dimension(0, 0)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 2, 0); - tipCardPane.setPreferredSize(new Dimension(224, 40)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 4, VGAP_INNER); - } else if (selectIndex == SPECIFY.getValue()) { - //指定 - setCardPaneLayout.show(setCardPane, SPECIFY.name()); - tipCardPaneLayout.show(tipCardPane, SPECIFY.name()); - //显示set和tip - setCardPane.setPreferredSize(new Dimension(156, 20)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 2, VGAP); - tipCardPane.setPreferredSize(new Dimension(224, 50)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 4, VGAP_INNER); - } else { - //未定义 - setCardPaneLayout.show(setCardPane, UNDEFINE.name()); - tipCardPaneLayout.show(tipCardPane, UNDEFINE.name()); - //隐藏set和tip - setCardPane.setPreferredSize(new Dimension(0, 0)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 2, 0); - tipCardPane.setPreferredSize(new Dimension(0, 0)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 4, 0); - } + changeSetTipCardPane(selectIndex); } }; @@ -702,50 +615,47 @@ public class CellDSColumnEditor extends CellQuickEditor { Toolkit.i18nText("Fine-Design_Report_Specify") }); rsComboBox.addActionListener(actionListener); - //配置展示CardLayout - setCardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); - //提示信息展示CardLayout - tipCardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); + initSetTipCardPane(); + contentPane = Layouts.column(LayoutConstants.VERTICAL_GAP, + row( + cell(filterLabel).weight(1.2), cell(rsComboBox).weight(3) + ), + cell(setTipCardPane) + ).getComponent(); + this.add(contentPane, BorderLayout.CENTER); + } + private void initSetTipCardPane() { //前N个 topFormulaPane = new JFormulaField(DEFAULT_VALUE); - setCardPane.add(topFormulaPane, TOP.name()); - tipCardPane.add(new JPanel(), TOP.name()); - //后N个 bottomFormulaPane = new JFormulaField(DEFAULT_VALUE); - setCardPane.add(bottomFormulaPane, BOTTOM.name()); - tipCardPane.add(new JPanel(), BOTTOM.name()); - - //自定义值下方没有提示信息,也没有输入框 - setCardPane.add(new JPanel(), UNDEFINE.name()); - tipCardPane.add(new JPanel(), UNDEFINE.name()); + //自定义 + serialTextField = new UITextField(16); - //奇数 UILabel 占一行作为提示信息 - setCardPane.add(new JPanel(), ODD.name()); MultilineLabel oddTip = new MultilineLabel(Toolkit.i18nText("Fine-Design_Report_DS_Filter_Odd_Tip")); - oddTip.setForeground(TIP_FONT_COLOR); - tipCardPane.add(oddTip, ODD.name()); - - //偶数 UILabel 占一行作为提示信息 - setCardPane.add(new JPanel(), EVEN.name()); MultilineLabel evenTip = new MultilineLabel(Toolkit.i18nText("Fine-Design_Report_DS_Filter_Even_Tip")); - evenTip.setForeground(TIP_FONT_COLOR); - tipCardPane.add(evenTip, EVEN.name()); - - //输入框占用右半边,提示信息占一行 - serialTextField = new UITextField(16); - setCardPane.add(serialTextField, SPECIFY.name()); MultilineLabel specifyTip = new MultilineLabel(Toolkit.i18nText("Fine-Design_Report_DS_Filter_Specify_Tip")); - specifyTip.setForeground(TIP_FONT_COLOR); - tipCardPane.add(specifyTip, SPECIFY.name()); - contentPane = TableLayoutHelper.createDiffVGapTableLayoutPane(new Component[][]{ - {filterLabel, rsComboBox}, - {null, setCardPane}, - {tipCardPane, null} - }, new double[]{P, P, P}, new double[]{P, F}, HGAP, new double[]{VGAP, VGAP_INNER}); - - this.add(contentPane, BorderLayout.CENTER); + Color tipColor = FlatUIUtils.getUIColor("Label.tipColor", Color.GRAY); + Arrays.asList(oddTip, evenTip, specifyTip).forEach(it -> it.setForeground(tipColor)); + + setTipCardPane = ReactiveCardPane.create() + .addSupplier(TOP.name(), () -> row(flex(1.2), cell(topFormulaPane).weight(3)).getComponent()) + .addSupplier(BOTTOM.name(), () -> row(flex(1.2), cell(bottomFormulaPane).weight(3)).getComponent()) + .addSupplier(ODD.name(), () -> row( + flex(1.2), + cell(oddTip).weight(3) + ).getComponent()) + .addSupplier(EVEN.name(), () -> row( + flex(1.2), + cell(evenTip).weight(3) + ).getComponent()) + .addSupplier(SPECIFY.name(), () -> column(LayoutConstants.VERTICAL_GAP, + row(flex(1.2), cell(serialTextField).weight(3)), + row(flex(1.2), cell(specifyTip).weight(3)) + ).getComponent()); + // 未定义不显示 + setTipCardPane.setVisible(false); } public void populate(CellElement cellElement) { @@ -757,8 +667,6 @@ public class CellDSColumnEditor extends CellQuickEditor { SelectCount selectCount = dSColumn.getSelectCount(); this.topFormulaPane.populateElement(cellElement); this.bottomFormulaPane.populateElement(cellElement); - CardLayout setCardPaneLayout = (CardLayout) setCardPane.getLayout(); - CardLayout tipCardPaneLayout = (CardLayout) tipCardPane.getLayout(); // 重置默认值 this.topFormulaPane.populate(DEFAULT_VALUE); this.bottomFormulaPane.populate(DEFAULT_VALUE); @@ -767,86 +675,28 @@ public class CellDSColumnEditor extends CellQuickEditor { if (selectCount != null) { int selectCountType = selectCount.getType(); this.rsComboBox.setSelectedIndex(selectCountType); - switch (FilterTypeEnum.getFilterByValue(selectCountType)) { - case TOP: - this.topFormulaPane.populate(selectCount.getFormulaCount()); - //前N个 - setCardPaneLayout.show(setCardPane, TOP.name()); - tipCardPaneLayout.show(tipCardPane, TOP.name()); - //隐藏tip 显示set - setCardPane.setPreferredSize(new Dimension(156, 20)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 2, VGAP); - tipCardPane.setPreferredSize(new Dimension(0, 0)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 4, 0); - break; - case BOTTOM: - this.bottomFormulaPane.populate(selectCount.getFormulaCount()); - //后N个 - setCardPaneLayout.show(setCardPane, BOTTOM.name()); - tipCardPaneLayout.show(tipCardPane, BOTTOM.name()); - //隐藏tip 显示set - setCardPane.setPreferredSize(new Dimension(156, 20)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 2, VGAP); - tipCardPane.setPreferredSize(new Dimension(0, 0)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 4, 0); - break; - case SPECIFY: - this.serialTextField.setText(selectCount.getSerial()); - //指定 - setCardPaneLayout.show(setCardPane, SPECIFY.name()); - tipCardPaneLayout.show(tipCardPane, SPECIFY.name()); - //显示set和tip - setCardPane.setPreferredSize(new Dimension(156, 20)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 2, VGAP); - tipCardPane.setPreferredSize(new Dimension(224, 50)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 4, VGAP_INNER); - break; - case EVEN: - //偶数 - setCardPaneLayout.show(setCardPane, EVEN.name()); - tipCardPaneLayout.show(tipCardPane, EVEN.name()); - //隐藏set 显示tip - setCardPane.setPreferredSize(new Dimension(0, 0)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 2, 0); - tipCardPane.setPreferredSize(new Dimension(224, 40)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 4, VGAP_INNER); - break; - case ODD: - //奇数 - setCardPaneLayout.show(setCardPane, ODD.name()); - tipCardPaneLayout.show(tipCardPane, ODD.name()); - //隐藏set 显示tip - setCardPane.setPreferredSize(new Dimension(0, 0)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 2, 0); - tipCardPane.setPreferredSize(new Dimension(224, 40)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 4, VGAP_INNER); - break; - default: - //未定义 - setCardPaneLayout.show(setCardPane, UNDEFINE.name()); - tipCardPaneLayout.show(tipCardPane, UNDEFINE.name()); - //隐藏set和tip - setCardPane.setPreferredSize(new Dimension(0, 0)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 2, 0); - tipCardPane.setPreferredSize(new Dimension(0, 0)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 4, 0); - } + this.topFormulaPane.populate(selectCount.getFormulaCount()); + this.bottomFormulaPane.populate(selectCount.getFormulaCount()); + this.serialTextField.setText(selectCount.getSerial()); + changeSetTipCardPane(selectCountType); } else { this.rsComboBox.setSelectedIndex(0); - //未定义 - setCardPaneLayout.show(setCardPane, UNDEFINE.name()); - tipCardPaneLayout.show(tipCardPane, UNDEFINE.name()); - //隐藏set和tip - setCardPane.setPreferredSize(new Dimension(0, 0)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 2, 0); - tipCardPane.setPreferredSize(new Dimension(0, 0)); - TableLayoutHelper.modifyTableLayoutIndexVGap(contentPane, 4, 0); + setTipCardPane.setVisible(false); } } } rsComboBox.addActionListener(actionListener); } + private void changeSetTipCardPane(int index) { + FilterTypeEnum type = FilterTypeEnum.getFilterByValue(index); + if (type == UNDEFINE) { + setTipCardPane.setVisible(false); + } else { + setTipCardPane.select(type.name()).populate(); + } + } + public void update(CellElement cellElement) { if (cellElement != null) { Object value = cellElement.getValue(); @@ -912,10 +762,9 @@ public class CellDSColumnEditor extends CellQuickEditor { formulaTextField.setText(defaultValue); JPanel textFieldPane = new JPanel(new BorderLayout()); textFieldPane.add(formulaTextField, BorderLayout.CENTER); - textFieldPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); - UIButton formulaButton = new UIButton(IOUtils.readIcon("/com/fr/design/images/m_insert/formula.png")); + textFieldPane.setBorder(new ScaledEmptyBorder(0, 0, 0, 5)); + UIButton formulaButton = new UIButton(new LazyIcon("formula")); formulaButton.setToolTipText(Toolkit.i18nText("Fine-Design_Report_Formula") + "..."); - formulaButton.setPreferredSize(new Dimension(20, formulaTextField.getPreferredSize().height)); formulaButton.addActionListener(formulaButtonActionListener); JPanel pane = new JPanel(new BorderLayout()); @@ -1000,11 +849,11 @@ public class CellDSColumnEditor extends CellQuickEditor { public CustomValuePane() { this.setLayout(new BorderLayout()); UILabel customValueLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Display_Value")); - customValueLabel.setPreferredSize(LABEL_DIMENSION); formulaField = new JFormulaField(DEFAULT_VALUE); - this.add(TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ - new Component[]{customValueLabel, formulaField}, - }, new double[]{P}, new double[]{P, F}, HGAP, VGAP), BorderLayout.CENTER); + this.add(Layouts.row( + cell(customValueLabel).weight(1.2), + cell(formulaField).weight(3) + ).getComponent()); } public void populate(CellElement cellElement) { From 8046a7668fe57143b262c7562754a1108635a001 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 10 Jan 2024 21:14:22 +0800 Subject: [PATCH 115/302] =?UTF-8?q?REPORT-111995=20=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/server/PlatformManagerAction.java | 2 ++ .../dscolumn/ResultSetGroupDockingPane.java | 34 +++++++++++-------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/server/PlatformManagerAction.java b/designer-base/src/main/java/com/fr/design/actions/server/PlatformManagerAction.java index d1e2f6f52d..18a73cbbe9 100644 --- a/designer-base/src/main/java/com/fr/design/actions/server/PlatformManagerAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/server/PlatformManagerAction.java @@ -1,9 +1,11 @@ package com.fr.design.actions.server; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.menu.MenuKeySet; import com.fr.design.utils.DesignUtils; +import javax.swing.KeyStroke; import java.awt.event.ActionEvent; public class PlatformManagerAction extends UpdateAction { diff --git a/designer-realize/src/main/java/com/fr/design/dscolumn/ResultSetGroupDockingPane.java b/designer-realize/src/main/java/com/fr/design/dscolumn/ResultSetGroupDockingPane.java index afc76a1a44..f1c6f3d826 100644 --- a/designer-realize/src/main/java/com/fr/design/dscolumn/ResultSetGroupDockingPane.java +++ b/designer-realize/src/main/java/com/fr/design/dscolumn/ResultSetGroupDockingPane.java @@ -113,7 +113,25 @@ public class ResultSetGroupDockingPane extends ResultSetGroupPane { } DSColumn dSColumn = (DSColumn) cellElement.getValue(); recordGrouper = dSColumn.getGrouper(); - if (recordGrouper instanceof FunctionGrouper && !((FunctionGrouper) recordGrouper).isCustom()) { + if (recordGrouper instanceof FunctionGrouper) { + populateFunctionGrouper(); + } else if (recordGrouper instanceof SummaryGrouper) { + cardPane.select("summaryPane").populate(); + this.goBox.setSelectedIndex(BIND_SUMMARY); + this.functionComboBox.setFunction(((SummaryGrouper) recordGrouper).getFunction()); + } else if (recordGrouper instanceof CustomGrouper) { + // 自定义分组 or 高级分组 + cardPane.select("groupPane").populate(); + this.goBox.setSelectedIndex(BIND_GROUP); + this.groupComboBox.setSelectedIndex(ADVANCED); + } + checkButtonEnabled(); + //加上面板组件的交互事件监听 + this.addListener(); + } + + private void populateFunctionGrouper() { + if (!((FunctionGrouper) recordGrouper).isCustom()) { int mode = recordGrouper.getDivideMode(); if (mode == FunctionGrouper.GROUPING_MODE) { cardPane.select("groupPane").populate(); @@ -127,24 +145,12 @@ public class ResultSetGroupDockingPane extends ResultSetGroupPane { cardPane.setVisible(false); this.goBox.setSelectedIndex(BIND_SELECTED); } - } else if (recordGrouper instanceof FunctionGrouper && ((FunctionGrouper) recordGrouper).isCustom()) { + } else { // 这种情况也放到自定义分组里面 cardPane.select("groupPane").populate(); this.goBox.setSelectedIndex(BIND_GROUP); this.groupComboBox.setSelectedIndex(ADVANCED); - } else if (recordGrouper instanceof SummaryGrouper) { - cardPane.select("summaryPane").populate(); - this.goBox.setSelectedIndex(BIND_SUMMARY); - this.functionComboBox.setFunction(((SummaryGrouper) recordGrouper).getFunction()); - } else if (recordGrouper instanceof CustomGrouper) { - // 自定义分组 or 高级分组 - cardPane.select("groupPane").populate(); - this.goBox.setSelectedIndex(BIND_GROUP); - this.groupComboBox.setSelectedIndex(ADVANCED); } - checkButtonEnabled(); - //加上面板组件的交互事件监听 - this.addListener(); } @Override From fe2c6b6f3a2915ed8990ea1749ee092b2874d581 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Thu, 11 Jan 2024 09:33:38 +0800 Subject: [PATCH 116/302] =?UTF-8?q?=20REPORT-107973=20=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E6=A0=8F=E5=9B=BE=E6=A0=87=E6=BC=8F=E4=BA=86=E4=B8=80=E9=83=A8?= =?UTF-8?q?=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/actions/community/CenterAction.java | 3 ++- .../src/main/java/com/fr/design/actions/edit/UndoAction.java | 3 ++- .../com/fr/design/actions/server/PlatformManagerAction.java | 2 ++ .../com/fine/theme/icon/toolbar/servicePlatform.svg | 5 +++++ .../com/fine/theme/icon/toolbar/servicePlatform_disable.svg | 5 +++++ 5 files changed, 16 insertions(+), 2 deletions(-) create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/toolbar/servicePlatform.svg create mode 100755 designer-base/src/main/resources/com/fine/theme/icon/toolbar/servicePlatform_disable.svg diff --git a/designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java b/designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java index f3c5320bfd..ed5e0545a7 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java @@ -1,5 +1,6 @@ package com.fr.design.actions.community; +import com.fine.theme.icon.LazyIcon; import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.menu.MenuKeySet; @@ -24,7 +25,7 @@ public class CenterAction extends UpAction { this.setMenuKeySet(CENTER); this.setName(getMenuKeySet().getMenuName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("actCenter"); + this.setSmallIcon(new LazyIcon("actCenter")); } @Override diff --git a/designer-base/src/main/java/com/fr/design/actions/edit/UndoAction.java b/designer-base/src/main/java/com/fr/design/actions/edit/UndoAction.java index 553ec47a89..af980571d8 100644 --- a/designer-base/src/main/java/com/fr/design/actions/edit/UndoAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/edit/UndoAction.java @@ -3,6 +3,7 @@ */ package com.fr.design.actions.edit; +import com.fine.theme.icon.LazyIcon; import com.fr.design.DesignerEnvManager; import com.fr.design.actions.TemplateComponentActionInterface; import com.fr.design.actions.UpdateAction; @@ -22,7 +23,7 @@ public class UndoAction extends UpdateAction implements TemplateComponentActionI this.setMenuKeySet(KeySetUtils.UNDO); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon("monochrome_undo"); + this.setSmallIcon(new LazyIcon("monochrome_undo")); this.setAccelerator(getMenuKeySet().getKeyStroke()); } diff --git a/designer-base/src/main/java/com/fr/design/actions/server/PlatformManagerAction.java b/designer-base/src/main/java/com/fr/design/actions/server/PlatformManagerAction.java index d1e2f6f52d..18a73cbbe9 100644 --- a/designer-base/src/main/java/com/fr/design/actions/server/PlatformManagerAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/server/PlatformManagerAction.java @@ -1,9 +1,11 @@ package com.fr.design.actions.server; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.menu.MenuKeySet; import com.fr.design.utils.DesignUtils; +import javax.swing.KeyStroke; import java.awt.event.ActionEvent; public class PlatformManagerAction extends UpdateAction { diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/servicePlatform.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/servicePlatform.svg new file mode 100755 index 0000000000..28581feee0 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/servicePlatform.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/servicePlatform_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/servicePlatform_disable.svg new file mode 100755 index 0000000000..be8bc822b3 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/servicePlatform_disable.svg @@ -0,0 +1,5 @@ + + + From 4eef4fdf23c439a0333f0e81bf143bd0f693ac83 Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 11 Jan 2024 11:34:38 +0800 Subject: [PATCH 117/302] =?UTF-8?q?REPORT-99485=20=E6=A8=A1=E7=89=88tab?= =?UTF-8?q?=E4=B8=8B=E6=8B=89=E6=A1=86=E7=BB=98=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../light/ui/FineTemplateListMenuItemUI.java | 52 ++++ .../file/MultiTemplateTabMenuFactory.java | 248 +----------------- .../fr/design/file/MultiTemplateTabPane.java | 10 + .../fr/design/file/TemplateListMenuItem.java | 153 +++++++++++ .../design/gui/imenu/UIScrollPopUpMenu.java | 33 +-- .../theme/light/ui/laf/FineLaf.properties | 1 + 6 files changed, 235 insertions(+), 262 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateListMenuItemUI.java create mode 100644 designer-base/src/main/java/com/fr/design/file/TemplateListMenuItem.java diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateListMenuItemUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateListMenuItemUI.java new file mode 100644 index 0000000000..063b2982db --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineTemplateListMenuItemUI.java @@ -0,0 +1,52 @@ +package com.fine.theme.light.ui; + +import com.formdev.flatlaf.ui.FlatUIUtils; + +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.PanelUI; +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; +import java.awt.geom.RoundRectangle2D; + +/** + * 模版列表菜单ui + * + * @author vito + * @since 11.0 + * Created on 2024/1/11 + */ +public class FineTemplateListMenuItemUI extends PanelUI { + /** + * 创建UI + * + * @param c 组件 + * @return ComponentUI + */ + public static ComponentUI createUI(JComponent c) { + return new FineTemplateListMenuItemUI(); + } + + @Override + public void update(Graphics g, JComponent c) { + Color color = g.getColor(); + g.setColor(c.getBackground()); + Insets insets = c.getInsets(); + Object[] old = FlatUIUtils.setRenderingHints(g); + ((Graphics2D) g).fill(new RoundRectangle2D.Float( + insets.left, insets.top, + (float) c.getWidth() - insets.left - insets.right, + (float) c.getHeight() - insets.top - insets.bottom, + 3, 3)); + g.setColor(color); + FlatUIUtils.resetRenderingHints(g, old); + super.paint(g, c); + } + + @Override + public void uninstallUI(JComponent c) { + super.uninstallUI(c); + } +} diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java index 6210f7ba68..66b7b27af9 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java @@ -1,42 +1,27 @@ package com.fr.design.file; -import com.fr.base.svg.IconUtils; -import com.fr.design.constants.UIConstants; -import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIScrollPopUpMenu; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.JTemplate; -import com.fr.design.utils.TemplateUtils; -import com.fr.stable.StringUtils; import com.fr.stable.collections.CollectionUtils; -import javax.swing.BorderFactory; -import javax.swing.Icon; import javax.swing.JPanel; import javax.swing.SwingConstants; -import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; -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; + /** * 右侧下拉菜单的工厂类 + * * @author Carlson * @since 11.0 * created on 2023-04-14 **/ public class MultiTemplateTabMenuFactory { - private static final Icon CLOSE = IconUtils.readIcon("/com/fr/design/standard/close/close"); - private static final Icon MOUSE_OVER_CLOSE = IconUtils.readIcon("/com/fr/design/standard/close/close_mouseover.svg"); - private static final Icon MOUSE_PRESS_CLOSE = IconUtils.readIcon("/com/fr/design/standard/close/close_press.svg"); private static final int ITEM_SIZE = 25; @@ -50,6 +35,7 @@ public class MultiTemplateTabMenuFactory { /** * 返回右侧下拉菜单的工厂类 + * * @return */ public static MultiTemplateTabMenuFactory getInstance() { @@ -61,29 +47,12 @@ public class MultiTemplateTabMenuFactory { */ public UIScrollPopUpMenu createMenu() { menu = new UIScrollPopUpMenu(); - menu.setBorder(BorderFactory.createEmptyBorder(-3, 3, 3, 0)); - menu.add(initCloseOther()); - menu.add(createEmptyRow()); menu.addSeparator(); - menu.add(createEmptyRow()); - menu.add(createCategory(Toolkit.i18nText("Fine-Design_Basic_Tab_Current_Category_Templates"))); - Component[] items = createCurrentCategory(); + Component[] items = createCurrentTabs(); for (Component item : items) { menu.add(item); } - items = createOtherCategory(); - if (items.length > 0) { - menu.addSeparator(); - menu.add(createEmptyRow()); - menu.add(createCategory(Toolkit.i18nText("Fine-Design_Basic_Tab_Other_Category_Templates"))); - for (Component item : items) { - menu.add(item); - } - } - Dimension dimension = menu.getPreferredSize(); - dimension.width += ITEM_SIZE; - menu.setPreferredSize(dimension); return menu; } @@ -91,18 +60,10 @@ public class MultiTemplateTabMenuFactory { * 关闭其它按钮 */ private UIMenuItem initCloseOther() { - UIMenuItem closeOther = new UIMenuItem(Toolkit.i18nText("Fine-Design_Basic_Tab_Close_Other_Templates_Of_Current_Category")); + UIMenuItem closeOther = new UIMenuItem(Toolkit.i18nText("Fine-Design_Close_Other_templates")); closeOther.setHorizontalAlignment(SwingConstants.CENTER); - Dimension dimension = closeOther.getPreferredSize(); - dimension.height = ITEM_SIZE; - closeOther.setPreferredSize(dimension); String currentOperator = getCurrentTabOperatorType(); - closeOther.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - MultiTemplateTabPane.getInstance().closeOtherByOperatorType(currentOperator); - } - }); + closeOther.addActionListener(e -> MultiTemplateTabPane.getInstance().closeOtherByOperatorType(currentOperator)); if (MultiTemplateTabPane.getInstance().getOpenedJTemplatesByOperator(currentOperator).size() <= 1) { closeOther.setEnabled(false); } @@ -124,47 +85,18 @@ public class MultiTemplateTabMenuFactory { }; } - /** - * 模板分类item - */ - private UIButton createCategory(String categoryName) { - UIButton button = new UIButton(categoryName); - button.setBorderPainted(false); - button.setExtraPainted(false); - button.setPreferredSize(new Dimension(menu.getWidth(), ITEM_SIZE)); - button.setOpaque(true); - button.setBackground(UIConstants.NORMAL_BACKGROUND); - button.setHorizontalAlignment(SwingConstants.LEFT); - button.setForeground(UIConstants.FLESH_BLUE); - return button; - } - /** * 创建 当前分类模板 item数组 */ - private Component[] createCurrentCategory() { - return createListDownItem(MultiTemplateTabPane.getInstance().getOpenedJTemplatesByOperator(getCurrentTabOperatorType())); + private Component[] createCurrentTabs() { + return createListDownItem(MultiTemplateTabPane.getInstance().getOpenedJTemplates()); } - private String getCurrentTabOperatorType(){ - JTemplate jTemplate= HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + private String getCurrentTabOperatorType() { + JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); return jTemplate.getTemplateTabOperatorType(); } - /** - * 创建 其它分类模板 item数组 - */ - private Component[] createOtherCategory() { - String currentOperator = getCurrentTabOperatorType(); - List> openedTemplates = new ArrayList<>(); - Map>> map = MultiTemplateTabPane.getInstance().getOpenedJTemplatesByCategory(); - for (Map.Entry>> entry : map.entrySet()) { - if (!StringUtils.equals(currentOperator, entry.getKey())) { - openedTemplates.addAll(entry.getValue()); - } - } - return createListDownItem(openedTemplates); - } /** * 根据template列表创建多个item @@ -184,166 +116,8 @@ public class MultiTemplateTabMenuFactory { * 根据template对象创建item */ private Component createListDownMenuItem(JTemplate template) { - JPanel jPanel = new JPanel(); - jPanel.setPreferredSize(new Dimension(menu.getWidth(), ITEM_SIZE)); - jPanel.setLayout(new BorderLayout()); - - MenuItemButtonGroup menuItemButtonGroup = new MenuItemButtonGroup(template); - if (template == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()) { - menuItemButtonGroup.templateButton.setForeground(UIConstants.FLESH_BLUE); - } - - jPanel.add(menuItemButtonGroup.iconButton, BorderLayout.WEST); - jPanel.add(menuItemButtonGroup.templateButton, BorderLayout.CENTER); - jPanel.add(menuItemButtonGroup.closeButton, BorderLayout.EAST); - - return jPanel; + return new TemplateListMenuItem(menu, template); } - /** - * menu的item由模板图标、模板名、模板关闭按钮组成 - */ - private class MenuItemButtonGroup { - - private final UIButton iconButton; - private final UIButton templateButton; - private final UIButton closeButton; - - public MenuItemButtonGroup(JTemplate template) { - iconButton = createIconButton(template); - templateButton = createTemplateButton(template); - closeButton = createCloseButton(); - initListener(template); - } - - /** - * item[0] 模板图标按钮初始化 - */ - private UIButton createIconButton(JTemplate template) { - UIButton button = new UIButton(template.getIcon(), template.getIcon(), template.getIcon()); - button.setPreferredSize(new Dimension(ITEM_SIZE, ITEM_SIZE)); - button.setOpaque(true); - button.setBackground(UIConstants.NORMAL_BACKGROUND); - return button; - } - - /** - * item[1] 切换模板按钮初始化 - */ - private UIButton createTemplateButton(JTemplate template) { - UIButton button = new UIButton(TemplateUtils.createLockeTemplatedName(template, template.getTemplateName())); - button.setBorderPainted(false); - button.setExtraPainted(false); - button.setPreferredSize(new Dimension(menu.getWidth() - ITEM_SIZE * 2, ITEM_SIZE)); - button.setOpaque(true); - button.setBackground(UIConstants.NORMAL_BACKGROUND); - button.setHorizontalAlignment(SwingConstants.LEFT); - return button; - } - - /** - * item[2] 关闭模板图标按钮初始化 - */ - private UIButton createCloseButton() { - UIButton button = new UIButton(CLOSE, MOUSE_OVER_CLOSE, MOUSE_PRESS_CLOSE); - button.setPreferredSize(new Dimension(ITEM_SIZE, ITEM_SIZE)); - button.setOpaque(true); - button.setBackground(UIConstants.NORMAL_BACKGROUND); - button.setVisible(false); - return button; - } - - private void initListener(JTemplate template) { - initIconButtonListener(); - initTemplateButtonListener(template); - initCloseButtonListener(template); - } - - /** - * item[0] 模板图标按钮鼠标事件 - */ - private void initIconButtonListener() { - iconButton.addMouseListener(new MouseAdapter() { - @Override - public void mouseEntered(MouseEvent e) { - fireMouseEnteredEvent(); - } - - @Override - public void mouseExited(MouseEvent e) { - fireMouseExitedEvent(); - } - }); - } - - /** - * item[1] 切换模板按钮鼠标事件 - */ - private void initTemplateButtonListener(JTemplate template) { - templateButton.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - menu.setVisible(false); - MultiTemplateTabPane.getInstance().switchJTemplate(template); - } - - @Override - public void mouseEntered(MouseEvent e) { - fireMouseEnteredEvent(); - } - - @Override - public void mouseExited(MouseEvent e) { - fireMouseExitedEvent(); - } - }); - } - - /** - * item[2] 关闭模板按钮鼠标事件 - */ - private void initCloseButtonListener(JTemplate template) { - closeButton.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - menu.setVisible(false); - MultiTemplateTabPane.getInstance().setIsCloseCurrent(template == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); - MultiTemplateTabPane.getInstance().closeFormat(template); - MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(template); - } - - @Override - public void mouseEntered(MouseEvent e) { - fireMouseEnteredEvent(); - } - - @Override - public void mouseExited(MouseEvent e) { - fireMouseExitedEvent(); - } - }); - } - - /** - * mouse移入item范围 - */ - private void fireMouseEnteredEvent() { - iconButton.setBackground(UIConstants.HOVER_BLUE); - templateButton.setBackground(UIConstants.HOVER_BLUE); - closeButton.setBackground(UIConstants.HOVER_BLUE); - closeButton.setVisible(true); - } - - /** - * mouse移出item范围 - */ - private void fireMouseExitedEvent() { - iconButton.setBackground(UIConstants.NORMAL_BACKGROUND); - templateButton.setBackground(UIConstants.NORMAL_BACKGROUND); - closeButton.setBackground(UIConstants.NORMAL_BACKGROUND); - closeButton.setVisible(false); - } - - } } diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 6e719ac1a8..5d9e5bde74 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -48,6 +48,7 @@ import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -992,6 +993,15 @@ public class MultiTemplateTabPane extends Row { .collect(Collectors.toList()); } + /** + * 获取所有模板 + * + * @return 所有模板列表,不可修改 + */ + public List> getOpenedJTemplates() { + return Collections.unmodifiableList(openedTemplate); + } + /** * 根据tab操作类型进行分类 * diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateListMenuItem.java b/designer-base/src/main/java/com/fr/design/file/TemplateListMenuItem.java new file mode 100644 index 0000000000..f79c767fda --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/file/TemplateListMenuItem.java @@ -0,0 +1,153 @@ +package com.fr.design.file; + +/** + * @author vito + * @since 11.0 + * Created on 2024/1/11 + */ + +import com.fine.swing.ui.layout.Row; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.utils.TemplateUtils; + +import javax.swing.JPopupMenu; +import javax.swing.SwingConstants; +import javax.swing.UIManager; +import java.awt.Dimension; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import static com.fine.swing.ui.layout.Layouts.cell; + +/** + * menu的item由模板图标、模板名、模板关闭按钮组成 + * + * @author vito + * @since 9.0 + * Created on 2015.1 + */ +public class TemplateListMenuItem extends Row { + private static final String UI_CLASS_ID = "TemplateListMenuItemUI"; + + private static final int WIDTH = 200; + + private final UIButton templateButton; + private final UIButton closeButton; + private final JPopupMenu menu; + + public TemplateListMenuItem(JPopupMenu menu, JTemplate template) { + this.menu = menu; + templateButton = createTemplateButton(template); + closeButton = createCloseButton(); + add( + cell(templateButton).weight(1), + cell(closeButton) + ); + setBorder(new ScaledEmptyBorder(0, 4, 0, 4)); + setPreferredSize(new Dimension(FineUIScale.scale(WIDTH), templateButton.getPreferredSize().height)); + initListener(template); + } + + @Override + public String getUIClassID() { + return UI_CLASS_ID; + } + + /** + * item[1] 切换模板按钮初始化 + */ + private UIButton createTemplateButton(JTemplate template) { + UIButton button = new UIButton( + TemplateUtils.createLockeTemplatedName(template, template.getTemplateName()), template.getIcon()); + button.setContentAreaFilled(false); + button.setHorizontalAlignment(SwingConstants.LEFT); + return button; + } + + /** + * item[2] 关闭模板图标按钮初始化 + */ + private UIButton createCloseButton() { + UIButton button = new UIButton( + new LazyIcon("clear"), + new LazyIcon("clear_hover"), + new LazyIcon("clear_hover")); + button.setContentAreaFilled(false); + button.setVisible(false); + return button; + } + + private void initListener(JTemplate template) { + initTemplateButtonListener(template); + initCloseButtonListener(template); + } + + /** + * item[1] 切换模板按钮鼠标事件 + */ + private void initTemplateButtonListener(JTemplate template) { + templateButton.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + menu.setVisible(false); + MultiTemplateTabPane.getInstance().switchJTemplate(template); + } + + @Override + public void mouseEntered(MouseEvent e) { + fireMouseEnteredEvent(); + } + + @Override + public void mouseExited(MouseEvent e) { + fireMouseExitedEvent(); + } + }); + } + + /** + * item[2] 关闭模板按钮鼠标事件 + */ + private void initCloseButtonListener(JTemplate template) { + closeButton.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + menu.setVisible(false); + MultiTemplateTabPane.getInstance().setIsCloseCurrent(template == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); + MultiTemplateTabPane.getInstance().closeFormat(template); + MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(template); + } + + @Override + public void mouseEntered(MouseEvent e) { + fireMouseEnteredEvent(); + } + + @Override + public void mouseExited(MouseEvent e) { + fireMouseExitedEvent(); + } + }); + } + + /** + * mouse移入item范围 + */ + private void fireMouseEnteredEvent() { + TemplateListMenuItem.this.setBackground(UIManager.getColor("MenuItem.selectionBackground")); + closeButton.setVisible(true); + } + + /** + * mouse移出item范围 + */ + private void fireMouseExitedEvent() { + TemplateListMenuItem.this.setBackground(TemplateListMenuItem.this.getParent().getBackground()); + closeButton.setVisible(false); + } + +} diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIScrollPopUpMenu.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIScrollPopUpMenu.java index 4bedf626dd..d4f1815e99 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIScrollPopUpMenu.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIScrollPopUpMenu.java @@ -6,13 +6,11 @@ import com.fr.design.gui.iscrollbar.UIScrollBar; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; -import java.awt.Graphics; import java.awt.Insets; import java.awt.LayoutManager; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.MouseWheelEvent; -import java.awt.event.MouseWheelListener; /** * Author : daisy @@ -21,7 +19,6 @@ import java.awt.event.MouseWheelListener; */ public class UIScrollPopUpMenu extends UIPopupMenu { private static final int MAX_SHOW_NUM = 27; - private static final float REC = 8f; private UIScrollBar scrollBar; @@ -30,31 +27,17 @@ public class UIScrollPopUpMenu extends UIPopupMenu { setOpaque(false); setLayout(new ScrollPopupMenuLayout()); super.add(getScrollBar()); - addMouseWheelListener(new MouseWheelListener() { - public void mouseWheelMoved(MouseWheelEvent e) { - UIScrollBar scrollBar = getScrollBar(); - int amount = (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) - ? e.getUnitsToScroll() * scrollBar.getUnitIncrement() - : (e.getWheelRotation() < 0 ? -1 : 1) * scrollBar.getBlockIncrement(); - - scrollBar.setValue(scrollBar.getValue() + amount); - e.consume(); - } + addMouseWheelListener(e -> { + UIScrollBar scrollBar = getScrollBar(); + int amount = (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) + ? e.getUnitsToScroll() * scrollBar.getUnitIncrement() + : (e.getWheelRotation() < 0 ? -1 : 1) * scrollBar.getBlockIncrement(); + + scrollBar.setValue(scrollBar.getValue() + amount); + e.consume(); }); } - - public void paintChildren(Graphics g) { -// Graphics2D g2d = (Graphics2D) g; -// int rec = (int) REC; -// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); -// g2d.setColor(UIConstants.NORMAL_BACKGROUND); -// g2d.fillRoundRect(1, 1, getWidth() - 2, getHeight() - 2, rec, rec); -// Insets insets = getInsets(); -// g.clipRect(insets.left, insets.top, getWidth(), getHeight() - insets.top - insets.bottom); - super.paintChildren(g); - } - /** * 展现 popupmenu * @param invoker 组件 diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties index 7f26ba5f10..89fb2ec23a 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties @@ -16,6 +16,7 @@ ListUI=com.formdev.flatlaf.ui.FlatListUI MenuUI=com.formdev.flatlaf.ui.FlatMenuUI MenuBarUI=com.formdev.flatlaf.ui.FlatMenuBarUI MenuItemUI=com.fine.theme.light.ui.FineMenuItemUI +TemplateListMenuItemUI=com.fine.theme.light.ui.FineTemplateListMenuItemUI OptionPaneUI=com.formdev.flatlaf.ui.FlatOptionPaneUI PanelUI=com.formdev.flatlaf.ui.FlatPanelUI PasswordFieldUI=com.formdev.flatlaf.ui.FlatPasswordFieldUI From 3c89aa2a0ac7e1fae98142d4e949f795c995f547 Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 11 Jan 2024 11:36:33 +0800 Subject: [PATCH 118/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/file/TemplateListMenuItem.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateListMenuItem.java b/designer-base/src/main/java/com/fr/design/file/TemplateListMenuItem.java index f79c767fda..b2f24d7487 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateListMenuItem.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateListMenuItem.java @@ -1,11 +1,5 @@ package com.fr.design.file; -/** - * @author vito - * @since 11.0 - * Created on 2024/1/11 - */ - import com.fine.swing.ui.layout.Row; import com.fine.theme.icon.LazyIcon; import com.fine.theme.utils.FineUIScale; From e971ae2e82928e801e061cb65a8e540f2cf6c798 Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 11 Jan 2024 11:48:44 +0800 Subject: [PATCH 119/302] =?UTF-8?q?REPORT-99485=20=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E5=8E=BB=E9=99=A4=E9=98=B4=E5=BD=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/com/fine/theme/icon/font/shadow.svg | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/designer-base/src/main/resources/com/fine/theme/icon/font/shadow.svg b/designer-base/src/main/resources/com/fine/theme/icon/font/shadow.svg index 893dd69056..a543f20091 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/font/shadow.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/font/shadow.svg @@ -1,17 +1,5 @@ - + - - - - - - - - - - - - From a7fca6cfb6184b8f37ca881ee79bafc263dd96a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Thu, 11 Jan 2024 11:56:47 +0800 Subject: [PATCH 120/302] =?UTF-8?q?REPORT-111995=20=E3=80=90UI=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E3=80=91=E4=BC=98=E5=8C=96=E4=B8=9C=E5=8C=BA=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/gui/controlpane/UIControlPane.java | 50 +++++++------------ .../mainframe/EastRegionContainerPane.java | 15 +----- 2 files changed, 21 insertions(+), 44 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java index f083f86f2c..2ed774966b 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java @@ -1,11 +1,14 @@ package com.fr.design.gui.controlpane; +import com.fine.theme.light.ui.FineButtonBorder; +import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.design.constants.UIConstants; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.controlpane.shortcutfactory.ShortCutFactory; import com.fr.design.gui.ifilechooser.JavaFxNativeFileChooser; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.itoolbar.UIToolBarUI; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; @@ -46,15 +49,15 @@ import java.awt.event.MouseMotionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + /** * Created by plough on 2017/7/21. */ public abstract class UIControlPane extends JControlPane { private UIToolbar topToolBar; protected Window popupEditDialog; - private static final int TOP_TOOLBAR_HEIGHT = 20; - private static final int TOP_TOOLBAR_WIDTH = 156; // 可能因为用了tablelayout,要比其他地方多一个像素,看起来才正常 - private static final int TOP_TOOLBAR_WIDTH_SHORT = 76; UIControlPane() { super(); @@ -135,40 +138,26 @@ public abstract class UIControlPane extends JControlPane { leftContentPane.add(toolBarPane, BorderLayout.NORTH); // 顶部标签及add按钮 - topToolBar = new UIToolbar(FlowLayout.LEFT, new UIToolBarUI() { - @Override - public void paint(Graphics g, JComponent c) { - Graphics2D g2 = (Graphics2D) g; - g2.setColor(UIConstants.SELECT_TAB); - g2.fillRect(0, 0, c.getWidth(), c.getHeight()); - } - }); - topToolBar.setBorder(null); + topToolBar = new UIToolbar(); topToolBar.setLayout(new BorderLayout()); ShortCut addItem = shortCutFactory.addItemShortCut().getShortCut(); addItem.intoJToolBar(topToolBar); JPanel leftTopPane = getLeftTopPane(topToolBar); - leftTopPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 6, 0)); + leftTopPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); leftPane.add(leftTopPane, BorderLayout.NORTH); return leftPane; } protected JPanel getLeftTopPane(UIToolbar topToolBar) { - UILabel addItemLabel = FRWidgetFactory.createLineWrapLabel(getAddItemText()); - - topToolBar.setPreferredSize( - new Dimension( - isNewStyle() ? TOP_TOOLBAR_WIDTH : TOP_TOOLBAR_WIDTH_SHORT, - TOP_TOOLBAR_HEIGHT - )); - JPanel toolBarPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - toolBarPane.add(topToolBar, BorderLayout.NORTH); - - JPanel leftTopPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - leftTopPane.add(toolBarPane, BorderLayout.EAST); - leftTopPane.add(addItemLabel, BorderLayout.CENTER); - return leftTopPane; + return row(10, + cell(FRWidgetFactory.createLineWrapLabel(getAddItemText())), + cell(topToolBar).with(it -> { + it.setBorderPainted(true); + it.setBorder(new FineButtonBorder()); + it.setBackground(FlatUIUtils.getUIColor("fill.normal", Color.WHITE)); + }).weight(1.0) + ).getComponent(); } /** @@ -179,7 +168,6 @@ public abstract class UIControlPane extends JControlPane { } protected ShortCut4JControlPane[] createShortcuts() { -// return AbstractShortCutFactory.getInstance(this).createNewShortCuts(); return shortCutFactory.createShortCuts(); } @@ -219,8 +207,7 @@ public abstract class UIControlPane extends JControlPane { editPaneWrapper.add(editPane, BorderLayout.CENTER); editPaneWrapper.setBorder(BorderFactory.createLineBorder(UIConstants.POP_DIALOG_BORDER, 1)); this.getContentPane().add(editPaneWrapper, BorderLayout.CENTER); - setSize(WIDTH, HEIGHT); -// pack(); + setSize(FineUIScale.scale(new Dimension(WIDTH, HEIGHT))); this.setVisible(false); initListener(); } @@ -386,6 +373,7 @@ public abstract class UIControlPane extends JControlPane { contentPane.setBackground(originColor); contentPane.setLayout(new BorderLayout()); titleLabel = new UILabel(title); + FineUIStyle.setStyle(titleLabel, FineUIStyle.LABEL_BOLD); contentPane.add(titleLabel, BorderLayout.WEST); contentPane.setBorder(new EmptyBorder(5, 14, 6, 0)); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index f060bf0fff..ccfed418d1 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -3,6 +3,7 @@ package com.fr.design.mainframe; import com.fine.theme.icon.LazyIcon; import com.fine.theme.light.ui.RectangleButtonUI; import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIStyle; import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.FlatDarkLaf; import com.formdev.flatlaf.ui.FlatLineBorder; @@ -337,18 +338,6 @@ public class EastRegionContainerPane extends UIEastResizableContainer { "configuredroles", new PropertyMode[]{PropertyMode.AUTHORITY_EDITION_DISABLED}, new PropertyMode[]{PropertyMode.AUTHORITY_EDITION}); - PropertyItem aiChat = new PropertyItem( - KEY_AI_CHAT, - "设计器助手", - "widgetlib", - new PropertyMode[]{PropertyMode.REPORT}, - new PropertyMode[]{PropertyMode.REPORT}, - null, - null, - e -> { - - }); - propertyItemMap.put(KEY_CELL_ELEMENT, cellElement); propertyItemMap.put(KEY_CELL_ATTR, cellAttr); propertyItemMap.put(KEY_FLOAT_ELEMENT, floatElement); @@ -356,7 +345,6 @@ public class EastRegionContainerPane extends UIEastResizableContainer { propertyItemMap.put(KEY_CONDITION_ATTR, conditionAttr); propertyItemMap.put(KEY_HYPERLINK, hyperlink); propertyItemMap.put(KEY_WIDGET_LIB, widgetLib); - propertyItemMap.put(KEY_AI_CHAT, aiChat); propertyItemMap.put(KEY_AUTHORITY_EDITION, authorityEdition); propertyItemMap.put(KEY_CONFIGURED_ROLES, configuredRoles); } @@ -1264,6 +1252,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { contentPane = new JPanel(); contentPane.setLayout(new BorderLayout()); UILabel label = new UILabel(title); + FineUIStyle.setStyle(label, FineUIStyle.LABEL_BOLD); contentPane.add(label, BorderLayout.CENTER); popupButton = createPopupButton(buttonType); From e76877cb0ffee3400221fb023ed5c2f03985d47e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Thu, 11 Jan 2024 12:02:27 +0800 Subject: [PATCH 121/302] =?UTF-8?q?REPORT-111995=20=E3=80=90UI=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E3=80=91=E4=BC=98=E5=8C=96=E4=B8=9C=E5=8C=BA=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/foldablepane/HeaderPane.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java b/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java index 209a4195b4..7e5878922b 100644 --- a/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java +++ b/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java @@ -27,6 +27,7 @@ public class HeaderPane extends JPanel { private int fontSize; private final Icon triangleDown; private final Icon triangleRight; + private static final int ICON_FIX = -2; public void setPressed(boolean pressed) { this.isPressed = pressed; @@ -56,10 +57,11 @@ public class HeaderPane extends JPanel { g2d.fillRect(0, insets.top / 2, this.getWidth(), this.getHeight() - (insets.top + insets.bottom) / 2); int iconY = (this.getHeight() - triangleDown.getIconHeight()) / 2; + // 折叠面板需要icon显示左边缘对齐,fix一下 if (this.isShow) { - triangleDown.paintIcon(this, g2d, 0, iconY); + triangleDown.paintIcon(this, g2d, FineUIScale.scale(ICON_FIX), iconY); } else { - triangleRight.paintIcon(this, g2d, 0, iconY); + triangleRight.paintIcon(this, g2d, FineUIScale.scale(ICON_FIX), iconY); } g2d.setFont(getFont()); @@ -70,7 +72,7 @@ public class HeaderPane extends JPanel { int ascent = metrics.getAscent(); int descent = metrics.getDescent(); - float titleX = triangleDown.getIconWidth() + float titleX = triangleDown.getIconWidth() + FineUIScale.scale(ICON_FIX) + FineUIScale.scale(UIManager.getInt("ExpandablePane.HeaderPane.hGap")); float titleY = (getHeight() - (ascent + descent)) / 2.0f + ascent; FlatUIUtils.setRenderingHints(g2d); From 08c68d1bff9eb3454da46a618f90553dbfecd341 Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 11 Jan 2024 12:02:36 +0800 Subject: [PATCH 122/302] =?UTF-8?q?REPORT-99485=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=A8=A1=E7=89=88tab=E4=B8=8B=E6=8B=89=E6=A1=86=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E5=8C=BA=E5=A4=AA=E5=A4=A7=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/file/MultiTemplateTabPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 5d9e5bde74..3f1b05d42d 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -783,7 +783,7 @@ public class MultiTemplateTabPane extends Row { private boolean isOverListDown(int evtX) { - int maxWidth = getWidth() - scale(TRAILING_WIDTH) - scale(LEADING_WIDTH); + int maxWidth = getWidth() - scale(LEADING_WIDTH); return evtX >= (maxWidth + SMALLGAP) && evtX <= (getWidth() - SMALLGAP); } From 9311b2eeecc1f210cde3aa60f8f34e0dc9ec97c2 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Thu, 11 Jan 2024 14:31:20 +0800 Subject: [PATCH 123/302] =?UTF-8?q?=20REPORT-107973=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=20=E4=B8=9C=E5=8C=BA=E6=8C=89=E9=92=AE=E8=BE=B9=E6=A1=86?= =?UTF-8?q?=E3=80=81=E6=BB=91=E5=9D=97=E9=AB=98=E5=BA=A6=E3=80=81=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E9=85=8D=E7=BD=AE=E6=8C=89=E9=92=AE=E5=AE=BD=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/EastRegionContainerPane.java | 3 +-- .../fr/design/mainframe/JFormSliderPane.java | 21 +++++++++++++------ .../com/fr/design/mainframe/JTemplate.java | 11 +--------- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index f060bf0fff..1875c9fcd0 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -5,7 +5,6 @@ import com.fine.theme.light.ui.RectangleButtonUI; import com.fine.theme.utils.FineUIScale; import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.FlatDarkLaf; -import com.formdev.flatlaf.ui.FlatLineBorder; import com.fr.base.FRContext; import com.fr.base.vcs.DesignerMode; import com.fr.design.DesignerEnvManager; @@ -425,7 +424,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } leftPane.add(item.getButton()); } - leftPane.setBorder(new FlatLineBorder(new Insets(0,1,0,1), UIManager.getColor("East.border"))); + leftPane.setBorder(BorderFactory.createMatteBorder(0, 1, 0, 1, UIManager.getColor("East.border"))); replaceLeftPane(leftPane); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java b/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java index 78da7a6e63..cef7222edf 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JFormSliderPane.java @@ -1,7 +1,6 @@ package com.fr.design.mainframe; import com.fine.theme.icon.LazyIcon; -import com.fine.theme.utils.FineUIScale; import com.fine.theme.utils.FineUIStyle; import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.ui.FlatUIUtils; @@ -12,7 +11,6 @@ import com.fr.design.gui.itextfield.UINumberField; import javax.swing.BorderFactory; import javax.swing.JPanel; -import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; @@ -69,7 +67,7 @@ public class JFormSliderPane extends JPanel { initSlider(); initDownUpButton(); initShowValField(); - JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0)); + JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 2)); panel.add(downButton); panel.add(slider); panel.add(upButton); @@ -123,10 +121,15 @@ public class JFormSliderPane extends JPanel { } private void initShowValField() { - showValField = new UINumberField(); + showValField = new UINumberField() { + @Override + public Dimension getPreferredSize() { + int width = FineUIUtils.getAndScaleInt("FormSliderPane.showValueWidth", 40); + int height = FineUIUtils.getAndScaleInt("FormSliderPane.showValueHeight", 20); + return new Dimension(width, height); + } + }; showValField.setValue(showValue); - Dimension dimension = new Dimension(UIManager.getInt("FormSliderPane.showValueWidth"), UIManager.getInt("FormSliderPane.showValueHeight")); - showValField.setPreferredSize(FineUIScale.scale(dimension)); showValField.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) { @@ -293,5 +296,11 @@ public class JFormSliderPane extends JPanel { public void addValueChangeListener(ChangeListener changeListener){ this.slider.addChangeListener(changeListener); } + + @Override + public Dimension getPreferredSize() { + Dimension size = super.getPreferredSize(); + return new Dimension(size.width, FineUIUtils.getAndScaleInt("Component.defaultHeight", 24)); + } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index ae24c9ca1a..039ddbd782 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -115,8 +115,6 @@ import javax.swing.JOptionPane; import javax.swing.SwingConstants; import javax.swing.undo.UndoManager; import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.FontMetrics; import java.io.ByteArrayOutputStream; import java.nio.file.Paths; import java.util.Arrays; @@ -1610,14 +1608,7 @@ public abstract class JTemplate> } protected UIButton createTemplateThemeButton() { - UIButton button = new UIButton(new LazyIcon("template_theme")) { - @Override - public Dimension getPreferredSize() { - FontMetrics metrics = getFontMetrics(getFont()); - int width = Math.min(metrics.stringWidth(getText()) + PREDEFINED_ICON_WIDTH, 100); - return new Dimension(width, 20); - } - }; + UIButton button = new UIButton(new LazyIcon("template_theme")); button.setToolTipText(getTemplateTheme().getName()); button.setText(getTemplateTheme().getName()); button.setName(getTemplateTheme().getName()); From ba36ebec3108ff9a432fc4324a5f35f0c170f826 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Thu, 11 Jan 2024 16:58:29 +0800 Subject: [PATCH 124/302] =?UTF-8?q?=20REPORT-107973=20windows=E4=B8=8B?= =?UTF-8?q?=E9=A2=9C=E8=89=B2=E9=80=89=E6=8B=A9=E5=BC=B9=E7=AA=97=E7=AB=8B?= =?UTF-8?q?=E5=8D=B3=E6=B6=88=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/style/color/ColorControlWindow.java | 2 ++ .../java/com/fr/design/actions/cell/UIToolbarBorderButton.java | 1 + 2 files changed, 3 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorControlWindow.java b/designer-base/src/main/java/com/fr/design/style/color/ColorControlWindow.java index d8e98965ae..a112c00768 100644 --- a/designer-base/src/main/java/com/fr/design/style/color/ColorControlWindow.java +++ b/designer-base/src/main/java/com/fr/design/style/color/ColorControlWindow.java @@ -56,6 +56,8 @@ public abstract class ColorControlWindow extends JPopupMenu { private void initComponents(boolean isSupportTransparent) { setLightWeightPopupEnabled(JPopupMenu.getDefaultLightWeightPopupEnabled()); + // windows下 需要手动处理焦点,不去抢占焦点,防止菜单栏弹窗消失 + setFocusable(false); this.setLayout(FRGUIPaneFactory.createBorderLayout()); initSelectionPopupPane(isSupportTransparent); this.pack(); diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/UIToolbarBorderButton.java b/designer-realize/src/main/java/com/fr/design/actions/cell/UIToolbarBorderButton.java index 8ef66cb9fb..b5bf07e5ea 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/UIToolbarBorderButton.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/UIToolbarBorderButton.java @@ -129,6 +129,7 @@ public class UIToolbarBorderButton extends UICombinationButton implements PopupH setLightWeightPopupEnabled(JPopupMenu.getDefaultLightWeightPopupEnabled()); this.setLayout(FRGUIPaneFactory.createBorderLayout()); + // windows下 需要手动处理焦点,不去抢占焦点,防止菜单栏弹窗消失 setFocusable(false); setStyle(this, POPUP_MENU_DROPDOWN); From e9ac59ea0dfe87b14d0493dd16c28faa20d9cca2 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Thu, 11 Jan 2024 17:39:44 +0800 Subject: [PATCH 125/302] =?UTF-8?q?=20REPORT-107973=20=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/EastRegionContainerPane.java | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index d7fcf9e631..4466c27eda 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -7,6 +7,7 @@ import com.fine.theme.utils.FineUIStyle; import com.fine.theme.utils.FineUIUtils; import com.formdev.flatlaf.FlatDarkLaf; import com.fr.base.FRContext; +import com.fr.base.svg.IconUtils; import com.fr.base.vcs.DesignerMode; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; @@ -756,6 +757,14 @@ public class EastRegionContainerPane extends UIEastResizableContainer { // 完整icon路径为 ICON_BASE_DIR + btnIconName + iconSuffix private static final String ICON_BASE_DIR = "/com/fr/design/standard/propertiestab/"; + + @Deprecated + private static final String ICON_SUFFIX_NORMAL_DEPRECATED = "_normal.svg"; + @Deprecated + private static final String ICON_SUFFIX_DISABLED_DEPRECATED = "_disabled.svg"; + @Deprecated + private static final String ICON_SUFFIX_SELECTED_DEPRECATED = "_selected.svg"; + private static final String ICON_SUFFIX_NORMAL = StringUtils.EMPTY; private static final String ICON_SUFFIX_DISABLED = "_disabled"; private static final String ICON_SUFFIX_SELECTED = "_selected"; @@ -968,13 +977,22 @@ public class EastRegionContainerPane extends UIEastResizableContainer { iconSuffix = ICON_SUFFIX_NORMAL; button.setIcon(new LazyIcon(getBtnIconId())); button.setOpaque(false); + } else if (ICON_SUFFIX_SELECTED_DEPRECATED.equals(iconSuffix)) { + iconSuffix = ICON_SUFFIX_NORMAL_DEPRECATED; + button.setIcon(IconUtils.readIcon(getBtnIconUrl())); + button.setOpaque(false); } } public void setTabButtonSelected() { resetPropertyIcons(); - iconSuffix = ICON_SUFFIX_SELECTED; - button.setIcon(new LazyIcon(getBtnIconId())); + if (iconBaseDir == null || StringUtils.isEmpty(iconBaseDir)) { + button.setIcon(new LazyIcon(getBtnIconId())); + iconSuffix = ICON_SUFFIX_SELECTED; + } else { + iconSuffix = ICON_SUFFIX_SELECTED_DEPRECATED; + button.setIcon(IconUtils.readIcon(getBtnIconUrl())); + } button.setBackground(selectedBtnBackground); button.setOpaque(true); selectedItem = this; @@ -985,12 +1003,12 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } private void initButton() { - button = new UIButton(new LazyIcon(getBtnIconId())) { + button = new UIButton() { public Dimension getPreferredSize() { return new Dimension(TAB_BUTTON_WIDTH, TAB_BUTTON_HEIGHT); } }; - button.setDisabledIcon(new LazyIcon(btnIconName + ICON_SUFFIX_DISABLED)); + initButtonIcon(); button.set4LargeToolbarButton(); button.setUI(new RectangleButtonUI(false)); setStyle(button, STYLE_TEXT); @@ -1013,6 +1031,16 @@ public class EastRegionContainerPane extends UIEastResizableContainer { button.setName(name); } + private void initButtonIcon() { + if (iconBaseDir == null || StringUtils.isEmpty(iconBaseDir)) { + button.setIcon(new LazyIcon(getBtnIconId())); + button.setDisabledIcon(new LazyIcon(btnIconName + ICON_SUFFIX_DISABLED)); + } else { + button.setIcon(IconUtils.readIcon(getBtnIconUrl())); + button.setDisabledIcon(IconUtils.readIcon(getIconBaseDir() + btnIconName + ICON_SUFFIX_DISABLED_DEPRECATED)); + } + } + public void processSnapChat() { if (snapChat != null && !snapChat.hasRead()) { snapChat.markRead(); From 5b893778c59f78cd81cca80571a05d489a9ad8d6 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Fri, 12 Jan 2024 10:38:56 +0800 Subject: [PATCH 126/302] =?UTF-8?q?=20REPORT-107973=20=E4=B8=9C=E5=8C=BA?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E5=85=BC=E5=AE=B9=E6=8F=92=E4=BB=B6=E5=9B=BE?= =?UTF-8?q?=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/EastRegionContainerPane.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 4466c27eda..7a3e533ec8 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -778,15 +778,15 @@ public class EastRegionContainerPane extends UIEastResizableContainer { public PropertyItem(String name, String title, String btnIconName, PropertyMode[] visibleModes, PropertyMode[] enableModes) { - this(name, title, btnIconName, ICON_BASE_DIR, visibleModes, enableModes, null, null); + this(name, title, btnIconName, null, visibleModes, enableModes, null, null); } public PropertyItem(String name, String title, String btnIconName, PropertyMode[] visibleModes, PropertyMode[] enableModes, SnapChat snapChat, PromptWindow promptWindow, ActionListener actionListener) { - this(name, title, btnIconName, ICON_BASE_DIR, visibleModes, enableModes, snapChat, promptWindow, actionListener); + this(name, title, btnIconName, null, visibleModes, enableModes, snapChat, promptWindow, actionListener); } public PropertyItem(String name, String title, String btnIconName, PropertyMode[] visibleModes, PropertyMode[] enableModes, ActionListener actionListener) { - this(name, title, btnIconName, ICON_BASE_DIR, visibleModes, enableModes, null, null, actionListener); + this(name, title, btnIconName, null, visibleModes, enableModes, null, null, actionListener); } public PropertyItem(String name, String title, String btnIconName, String iconBaseDir, PropertyMode[] visibleModes, PropertyMode[] enableModes, SnapChat snapChat, PromptWindow promptWindow) { @@ -986,7 +986,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { public void setTabButtonSelected() { resetPropertyIcons(); - if (iconBaseDir == null || StringUtils.isEmpty(iconBaseDir)) { + if (StringUtils.isEmpty(iconBaseDir)) { button.setIcon(new LazyIcon(getBtnIconId())); iconSuffix = ICON_SUFFIX_SELECTED; } else { @@ -1032,7 +1032,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } private void initButtonIcon() { - if (iconBaseDir == null || StringUtils.isEmpty(iconBaseDir)) { + if (StringUtils.isEmpty(iconBaseDir)) { button.setIcon(new LazyIcon(getBtnIconId())); button.setDisabledIcon(new LazyIcon(btnIconName + ICON_SUFFIX_DISABLED)); } else { From bc891be86ad1a5e53d536167f2d630c08dc60237 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Fri, 12 Jan 2024 17:08:57 +0800 Subject: [PATCH 127/302] =?UTF-8?q?=20REPORT-107973=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=A5=BF=E5=8C=BA=E6=90=9C=E7=B4=A2=E9=9D=A2=E6=9D=BF=E4=BB=A5?= =?UTF-8?q?=E5=8F=8Atoolbar=E9=97=B4=E8=B7=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/pane/FineSearchPane.java | 30 +++--- .../fr/design/gui/itextfield/UITextField.java | 31 +------ .../com/fr/design/gui/itoolbar/UIToolbar.java | 5 +- .../pane/TemplateTreeSearchToolbarPane.java | 93 ++++--------------- .../java/com/fr/design/menu/ToolBarDef.java | 14 +-- 5 files changed, 54 insertions(+), 119 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/FineSearchPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/FineSearchPane.java index 4e50f695fb..ab199f3bc3 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/FineSearchPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/FineSearchPane.java @@ -8,6 +8,7 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import javax.swing.BorderFactory; +import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.event.DocumentListener; import java.awt.BorderLayout; @@ -60,7 +61,24 @@ public class FineSearchPane extends JPanel implements HoverAware { // 中间输入框 searchTextField = new UITextField(); setStyle(searchTextField, TRANSPARENT_TEXT_FIELD); - searchTextField.addMouseListener(new MouseAdapter() { + + // 右侧返回图标 + clearButton = new UIButton(new LazyIcon("clear")); + setStyle(clearButton, STYLE_TEXT); + Insets buttonInsets = FineUIUtils.getAndScaleUIInsets("SearchPanel.buttonBorderInsets", defaultButtonInsets); + clearButton.setBorder(BorderFactory.createEmptyBorder(buttonInsets.top, buttonInsets.left, buttonInsets.bottom, buttonInsets.right)); + + this.add(searchLabel, BorderLayout.WEST); + this.add(searchTextField, BorderLayout.CENTER); + this.add(clearButton, BorderLayout.EAST); + + addHoverStatusListener(searchLabel); + addHoverStatusListener(searchTextField); + addHoverStatusListener(clearButton); + } + + private void addHoverStatusListener(JComponent component) { + component.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { hover = true; @@ -73,16 +91,6 @@ public class FineSearchPane extends JPanel implements HoverAware { repaint(); } }); - - // 右侧返回图标 - clearButton = new UIButton(new LazyIcon("clear")); - setStyle(clearButton, STYLE_TEXT); - Insets buttonInsets = FineUIUtils.getAndScaleUIInsets("SearchPanel.buttonBorderInsets", defaultButtonInsets); - clearButton.setBorder(BorderFactory.createEmptyBorder(buttonInsets.top, buttonInsets.left, buttonInsets.bottom, buttonInsets.right)); - - this.add(searchLabel, BorderLayout.WEST); - this.add(searchTextField, BorderLayout.CENTER); - this.add(clearButton, BorderLayout.EAST); } @Override diff --git a/designer-base/src/main/java/com/fr/design/gui/itextfield/UITextField.java b/designer-base/src/main/java/com/fr/design/gui/itextfield/UITextField.java index b7bb6a5453..61f1b6b62c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itextfield/UITextField.java +++ b/designer-base/src/main/java/com/fr/design/gui/itextfield/UITextField.java @@ -7,22 +7,20 @@ import com.fr.design.event.GlobalNameObserver; import com.fr.design.event.HoverAware; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.Constants; import com.fr.stable.StringUtils; -import javax.swing.JFrame; -import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.Document; import java.awt.Color; import java.awt.Dimension; -import java.awt.LayoutManager; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import static com.formdev.flatlaf.FlatClientProperties.PLACEHOLDER_TEXT; + /** * 文本框 @@ -40,7 +38,6 @@ public class UITextField extends JTextField implements UIObserver, GlobalNameObs private String textFieldName = StringUtils.EMPTY; private GlobalNameListener globalNameListener = null; private Dimension preferredSize = null; - private String placeholder = StringUtils.EMPTY; //有些情况下setText的时候不希望触发attributeChange,添加一个属性标识 private boolean isSetting = false; @@ -121,11 +118,11 @@ public class UITextField extends JTextField implements UIObserver, GlobalNameObs } public String getPlaceholder() { - return placeholder; + return (String) this.getClientProperty(PLACEHOLDER_TEXT); } public void setPlaceholder(String placeholder) { - this.placeholder = placeholder; + this.putClientProperty(PLACEHOLDER_TEXT, placeholder); } @@ -212,26 +209,6 @@ public class UITextField extends JTextField implements UIObserver, GlobalNameObs return true; } - /** - * 主函数 - * - * @param args 参数 - */ - public static void main(String... args) { - LayoutManager layoutManager = null; - JFrame jf = new JFrame("test"); - jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JPanel content = (JPanel) jf.getContentPane(); - content.setLayout(layoutManager); - - UITextField bb = new UITextField(5); - bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); - content.add(bb); - GUICoreUtils.centerWindow(jf); - jf.setSize(400, 400); - jf.setVisible(true); - } - public void setBorderPainted(boolean isBorderPainted) { this.isBorderPainted = isBorderPainted; } diff --git a/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java b/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java index 618f4c5510..5fa997a214 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java +++ b/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java @@ -1,5 +1,7 @@ package com.fr.design.gui.itoolbar; +import com.fine.theme.utils.FineUIScale; + import javax.swing.JToolBar; import java.awt.Component; import java.awt.FlowLayout; @@ -8,6 +10,7 @@ import java.util.HashMap; import java.util.Map; public class UIToolbar extends JToolBar { + int hgap = 2; public UIToolbar() { this(FlowLayout.LEFT); @@ -17,7 +20,7 @@ public class UIToolbar extends JToolBar { super(); setFloatable(false); setRollover(true); - setLayout(new FlowLayout(align, 4, 0)); + setLayout(new FlowLayout(align, FineUIScale.scale(hgap), 0)); setBorderPainted(false); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateTreeSearchToolbarPane.java b/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateTreeSearchToolbarPane.java index cfb0809130..8cc747123f 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateTreeSearchToolbarPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateTreeSearchToolbarPane.java @@ -1,13 +1,9 @@ package com.fr.design.mainframe.manager.search.searcher.control.pane; -import com.fine.theme.icon.LazyIcon; -import com.fr.base.svg.IconUtils; -import com.fr.design.constants.UIConstants; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.data.datapane.management.search.pane.FineSearchPane; import com.fr.design.file.TemplateTreePane; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.itextfield.UITextField; import com.fr.design.gui.itoolbar.UIToolbar; -import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.manager.search.TemplateTreeSearchManager; import com.fr.design.search.TreeSearchStatus; @@ -15,20 +11,13 @@ import com.fr.design.search.event.TreeSearchStatusChangeEvent; import com.fr.design.search.event.TreeSearchStatusChangeListener; import com.fr.stable.StringUtils; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.BorderLayout; import java.awt.CardLayout; -import java.awt.Color; -import java.awt.Insets; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; /** * 模板搜索工具栏 @@ -57,12 +46,7 @@ public class TemplateTreeSearchToolbarPane extends JPanel implements TreeSearchS /** * 搜索面板 */ - private JPanel searchPane; - - /** - * 搜索输入框 - */ - private UITextField searchTextField; + private FineSearchPane searchPane; /** * 内容面板 @@ -78,7 +62,7 @@ public class TemplateTreeSearchToolbarPane extends JPanel implements TreeSearchS @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { - TemplateTreeSearchManager.getInstance().startSearch(searchTextField.getText()); + TemplateTreeSearchManager.getInstance().startSearch(searchPane.getText()); } } }; @@ -99,63 +83,24 @@ public class TemplateTreeSearchToolbarPane extends JPanel implements TreeSearchS contentPane.add(searchPane, SEARCH_PANE); contentPane.add(toolbarPane, TOOLBAR_PANE); cardLayout.show(contentPane, TOOLBAR_PANE); + contentPane.setBorder(new ScaledEmptyBorder(6, 8, 6, 8)); } private void initSearchPane() { - searchPane = new JPanel(FRGUIPaneFactory.createBorderLayout()); - searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.TOOLBAR_BORDER_COLOR)); - searchPane.setBackground(Color.WHITE); - // 左侧搜索图标 - UILabel searchLabel = new UILabel(new LazyIcon("search")); - searchLabel.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0)); - searchLabel.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - // do nothing - } - }); - // 中间输入框 - initSearchTextField(); - // 右侧返回图标 - UILabel returnLabel = new UILabel(IconUtils.readIcon("/com/fr/design/standard/clear")); - returnLabel.setToolTipText(Toolkit.i18nText("Fine-Design_Tree_Search_Return")); - returnLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 11)); - returnLabel.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - TemplateTreeSearchManager.getInstance().outOfSearchMode(); - TemplateTreePane.getInstance().refreshDockingView(); - } - }); - searchPane.add(searchLabel, BorderLayout.WEST); - searchPane.add(searchTextField, BorderLayout.CENTER); - searchPane.add(returnLabel, BorderLayout.EAST); - } + searchPane = new FineSearchPane(); + searchPane.setPlaceholder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Template_Search_Press_Enter_For_Search")); - private void initSearchTextField() { - searchTextField = new UITextField(){ - @Override - public Insets getInsets() { - return new Insets(2, 4, 0, 4); - } - }; - searchTextField.setBorderPainted(false); - searchTextField.setPlaceholder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Template_Search_Press_Enter_For_Search")); - searchTextField.addFocusListener(new FocusListener() { - @Override - public void focusGained(FocusEvent e) { - searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.NORMAL_BLUE)); - searchPane.repaint(); - } + initSearchTextFieldListener(); - @Override - public void focusLost(FocusEvent e) { - searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.TOOLBAR_BORDER_COLOR)); - searchPane.repaint(); - } + searchPane.addClearActionListener(e -> { + TemplateTreeSearchManager.getInstance().outOfSearchMode(); + TemplateTreePane.getInstance().refreshDockingView(); }); - this.searchTextField.getDocument().addDocumentListener(new DocumentListener() { + } + + private void initSearchTextFieldListener() { + searchPane.addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { } @@ -169,11 +114,11 @@ public class TemplateTreeSearchToolbarPane extends JPanel implements TreeSearchS public void changedUpdate(DocumentEvent e) { } }); - this.searchTextField.addKeyListener(enterPressed); + searchPane.addKeyListener(enterPressed); } private void dealWithTextChange() { - if (StringUtils.isEmpty(searchTextField.getText()) && TemplateTreeSearchManager.getInstance().isInSearchMode()) { + if (StringUtils.isEmpty(searchPane.getText()) && TemplateTreeSearchManager.getInstance().isInSearchMode()) { // 如果是搜索模式下,看作是用户删除输入框文字,仅复原TemplateTreePane TemplateTreeSearchManager.getInstance().restoreTreePane(); TemplateTreePane.getInstance().refreshDockingView(); @@ -195,7 +140,7 @@ public class TemplateTreeSearchToolbarPane extends JPanel implements TreeSearchS } public void setPlaceHolder(String placeHolder) { - this.searchTextField.setPlaceholder(placeHolder); + this.searchPane.setPlaceholder(placeHolder); } /** @@ -207,7 +152,7 @@ public class TemplateTreeSearchToolbarPane extends JPanel implements TreeSearchS public void updateTreeSearchChange(TreeSearchStatusChangeEvent event) { TreeSearchStatus treeSearchStatus = event.getTreeSearchStatus(); if (treeSearchStatus == TreeSearchStatus.NOT_IN_SEARCH_MODE) { - this.searchTextField.setText(StringUtils.EMPTY); + searchPane.setText(StringUtils.EMPTY); switchPane(TOOLBAR_PANE); } else { switchPane(SEARCH_PANE); diff --git a/designer-base/src/main/java/com/fr/design/menu/ToolBarDef.java b/designer-base/src/main/java/com/fr/design/menu/ToolBarDef.java index 8617ded9ba..b35818c614 100644 --- a/designer-base/src/main/java/com/fr/design/menu/ToolBarDef.java +++ b/designer-base/src/main/java/com/fr/design/menu/ToolBarDef.java @@ -5,14 +5,18 @@ import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.itoolbar.UIToolBarUI; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.mainframe.JTemplate; -import java.util.Set; import org.jetbrains.annotations.Nullable; -import javax.swing.*; -import java.awt.*; +import javax.swing.BorderFactory; +import javax.swing.JComponent; +import java.awt.Color; +import java.awt.FlowLayout; +import java.awt.Graphics; +import java.awt.Graphics2D; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; /** * Define toolbar.. @@ -43,9 +47,7 @@ public class ToolBarDef { * 一个static的方法生成一个JToolBar */ public static UIToolbar createJToolBar() { - UIToolbar toolbar = new UIToolbar(FlowLayout.LEFT); - toolbar.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0)); - return toolbar; + return new UIToolbar(FlowLayout.LEFT); } public ToolBarDef() { From 3c20c124644230da54a2dfd3bfa78c09fb7488dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Fri, 12 Jan 2024 18:52:42 +0800 Subject: [PATCH 128/302] =?UTF-8?q?REPORT-111995=20=E3=80=90UI=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E3=80=91=E6=8E=A7=E4=BB=B6=E9=9D=A2=E6=9D=BF=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E6=95=B4=E4=BD=93=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/utils/FineUIStyle.java | 1 + .../fr/design/border/FineBorderFactory.java | 19 ++ .../fr/design/constants/LayoutConstants.java | 10 + .../com/fr/design/dialog/BasicScrollPane.java | 16 +- .../design/gui/columnrow/ColumnRowPane.java | 19 +- .../fr/design/gui/frpane/RegFieldPane.java | 38 ++-- .../com/fr/design/gui/frpane/RegPane.java | 195 +++++++++--------- .../itree/refreshabletree/TreeRootPane.java | 41 ++-- .../btn/ButtonWithHotkeysDetailPane.java | 57 ++--- .../widget/component/DateValuePane.java | 51 +++-- .../component/NumberEditorValidatePane.java | 52 +++-- .../widget/component/ReturnTypePane.java | 46 +++-- .../widget/mobile/WidgetMobilePane.java | 4 +- .../light/ui/laf/FineLightLaf.properties | 5 +- .../ui/btn/AbstractExtraButtonPane.java | 20 +- .../MobileTextFieldInputSettingPane.java | 57 +++-- .../fr/design/widget/CellWidgetCardPane.java | 50 +++-- .../com/fr/design/widget/WidgetEventPane.java | 4 +- .../java/com/fr/design/widget/WidgetPane.java | 60 +++--- .../ui/BasicWidgetPropertySettingPane.java | 44 ++-- .../design/widget/ui/ButtonGroupDictPane.java | 71 ++++--- .../design/widget/ui/CheckBoxDefinePane.java | 40 ++-- .../widget/ui/CheckBoxGroupDefinePane.java | 42 ++-- .../design/widget/ui/ComboBoxDefinePane.java | 21 +- .../widget/ui/ComboCheckBoxDefinePane.java | 41 ++-- .../ui/CustomWritableRepeatEditorPane.java | 20 +- .../widget/ui/DateEditorDefinePane.java | 171 +++++++-------- .../ui/DirectWriteEditorDefinePane.java | 36 ++-- .../widget/ui/FieldEditorDefinePane.java | 77 ++++--- .../widget/ui/IframeEditorDefinePane.java | 57 +++-- .../widget/ui/ListEditorDefinePane.java | 14 +- .../design/widget/ui/MultiFileEditorPane.java | 42 ++-- .../widget/ui/NumberEditorDefinePane.java | 41 ++-- .../widget/ui/RadioGroupDefinePane.java | 29 +-- .../widget/ui/TextFieldEditorDefinePane.java | 40 ++-- .../ui/TreeComboBoxEditorDefinePane.java | 41 ++-- .../widget/ui/TreeEditorDefinePane.java | 60 +++--- .../design/widget/ui/WaterMarkDictPane.java | 30 ++- .../widget/ui/WritableRepeatEditorPane.java | 12 +- .../ui/WriteUnableRepeatEditorPane.java | 44 ++-- .../ui/btn/AppendRowButtonDefinePane.java | 13 -- .../widget/ui/btn/ButtonSytleDefinedPane.java | 52 +++-- .../ui/btn/DefineAppendColumnRowPane.java | 45 ++-- .../ui/btn/DefineDeleteColumnRowPane.java | 41 ++-- .../btn/TreeNodeToogleButtonDefinePane.java | 27 ++- .../ui/mobile/MultiFileEditorMobilePane.java | 30 +-- .../ui/mobile/TextEditorMobilePane.java | 10 +- 47 files changed, 934 insertions(+), 1002 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java index 0af3013ff2..873c0e4edd 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java @@ -28,6 +28,7 @@ public interface FineUIStyle { String BRAND_COLOR_LABEL = "brandColorLabel"; String BUTTON_TAB_ACTION = "tabAction"; String LABEL_BOLD = "boldLabel"; + String LABEL_TIP = "tipLabel"; String MENU_TOOL_BAR = "menuToolBar"; String MENU_ITEM_TOOL_BAR = "menuItemToolBar"; diff --git a/designer-base/src/main/java/com/fr/design/border/FineBorderFactory.java b/designer-base/src/main/java/com/fr/design/border/FineBorderFactory.java index 02cf2541af..7867055844 100644 --- a/designer-base/src/main/java/com/fr/design/border/FineBorderFactory.java +++ b/designer-base/src/main/java/com/fr/design/border/FineBorderFactory.java @@ -34,4 +34,23 @@ public class FineBorderFactory { return createUnderlineBorder(FineUIUtils.getUIColor("Label.borderColor", "defaultBorderColor")); } + /** + * 创建一个上边缘线边框 + * + * @param color 上边缘线颜色 + * @return 边框 + */ + public static Border createToplineBorder(Color color) { + return BorderFactory.createMatteBorder(1, 0, 0, 0, color); + } + + /** + * 创建默认的上划线边框 + * + * @return 边框 + */ + public static Border createDefaultTopBorder() { + return createToplineBorder(FineUIUtils.getUIColor("Label.borderColor", "defaultBorderColor")); + } + } diff --git a/designer-base/src/main/java/com/fr/design/constants/LayoutConstants.java b/designer-base/src/main/java/com/fr/design/constants/LayoutConstants.java index a4150dbfa1..13bf91003c 100644 --- a/designer-base/src/main/java/com/fr/design/constants/LayoutConstants.java +++ b/designer-base/src/main/java/com/fr/design/constants/LayoutConstants.java @@ -52,4 +52,14 @@ public class LayoutConstants { * 主题化布局:垂直间隙 */ public static final int VERTICAL_GAP = 10; + + /** + * 主题化布局:常规布局左侧比例 + */ + public static final double LEFT_WEIGHT = 1.2; + + /** + * 主题化布局:常规布局右侧比例 + */ + public static final double RIGHT_WEIGHT = 3; } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/dialog/BasicScrollPane.java b/designer-base/src/main/java/com/fr/design/dialog/BasicScrollPane.java index 0255748979..fbb602db38 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/BasicScrollPane.java +++ b/designer-base/src/main/java/com/fr/design/dialog/BasicScrollPane.java @@ -1,10 +1,17 @@ package com.fr.design.dialog; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.iscrollbar.UIScrollBar; -import javax.swing.*; -import java.awt.*; +import javax.swing.JPanel; +import javax.swing.JScrollBar; +import java.awt.AWTEvent; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.LayoutManager; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.MouseWheelEvent; @@ -104,7 +111,6 @@ public abstract class BasicScrollPane extends BasicBeanPane{ protected void layoutContentPane() { leftcontentPane = createContentPane(); - leftcontentPane.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 5, original)); this.add(leftcontentPane); } @@ -176,7 +182,7 @@ public abstract class BasicScrollPane extends BasicBeanPane{ scrollBar.setBounds(width - scrollBar.getWidth() - 1, 0, scrollBar.getWidth(), height); } else { int hideBarWidth = hideBarWidth() ? scrollBar.getWidth() : 0; - leftcontentPane.setBounds(0, 0, width - DET_WIDTH + hideBarWidth, height); + leftcontentPane.setBounds(0, 0, width + hideBarWidth, height); } } @@ -205,7 +211,7 @@ public abstract class BasicScrollPane extends BasicBeanPane{ this.setLayout(new BarLayout()); this.add(scrollBar); leftcontentPane = pane; - leftcontentPane.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 5, original)); + leftcontentPane.setBorder(new ScaledEmptyBorder(0, 6, 0, 6)); this.add(leftcontentPane); } } \ No newline at end of file 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 10ea21a9ae..4f76c2e69f 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 @@ -1,6 +1,5 @@ package com.fr.design.gui.columnrow; -import com.fr.design.designer.IntervalConstants; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; import com.fr.design.gui.ispinner.ColumnRowSpinner; @@ -15,8 +14,8 @@ import com.fr.stable.StringUtils; import javax.swing.JFormattedTextField; import javax.swing.JPanel; -import javax.swing.JSpinner.DefaultEditor; import javax.swing.SpinnerListModel; +import javax.swing.JSpinner.DefaultEditor; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; @@ -27,7 +26,10 @@ import javax.swing.text.BadLocationException; import javax.swing.text.DocumentFilter; import java.awt.BorderLayout; import java.awt.Dimension; -import java.awt.GridLayout; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.row; /** * the component to edit ColumnRow @@ -96,11 +98,16 @@ public class ColumnRowPane extends JPanel implements UIObserver { * 初始化元素 */ public void initComponents() { - this.setLayout(new GridLayout(0, 2, IntervalConstants.INTERVAL_L6, 0)); + this.setLayout(new BorderLayout()); initColSpinner(); - this.add(columnSpinner, BorderLayout.WEST); initRowSpinner(); - this.add(rowSpinner); + this.add( + row( + cell(columnSpinner).weight(1), + fix(2), + cell(rowSpinner).weight(1) + ).getComponent() + ); this.addDocumentListener(d); } diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/RegFieldPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/RegFieldPane.java index 38e33514bc..9020e1688c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/RegFieldPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/RegFieldPane.java @@ -3,23 +3,19 @@ package com.fr.design.gui.frpane; import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.ErrorMsgTextFieldAdapter; import com.fr.design.beans.UITextFieldAdapter; -import com.fr.design.constants.LayoutConstants; -import com.fr.design.designer.IntervalConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.fun.TextFieldAdapterProvider; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayoutHelper; import com.fr.form.ui.TextEditor; import com.fr.form.ui.reg.NoneReg; import com.fr.form.ui.reg.RegExp; import com.fr.log.FineLoggerFactory; -import javax.swing.BorderFactory; -import javax.swing.JPanel; -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; /** * Created by kerry on 2017/9/4. @@ -37,22 +33,17 @@ public class RegFieldPane extends RegPane { } public void initComponents() { - this.setBorder(BorderFactory.createEmptyBorder(0, 0, IntervalConstants.INTERVAL_L1, 0)); regErrorMsgPane = new RegErrorMsgPane(); - final RegChangeListener regChangeListener = new RegChangeListener() { - - @Override - public void regChangeAction() { - RegExp regExp = (RegExp) getRegComboBox().getSelectedItem(); - if (regExp instanceof NoneReg) { - regErrorMsgPane.setVisible(false); - return; - } - regErrorMsgPane.setVisible(true); + final RegChangeListener regChangeListener = () -> { + RegExp regExp = (RegExp) getRegComboBox().getSelectedItem(); + if (regExp instanceof NoneReg) { + regErrorMsgPane.setVisible(false); + return; } + regErrorMsgPane.setVisible(true); }; + corePane.add(regErrorMsgPane); this.addRegChangeListener(regChangeListener); - this.add(regErrorMsgPane, BorderLayout.CENTER); } @Override @@ -80,11 +71,10 @@ public class RegFieldPane extends RegPane { private void setStyle() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L6, IntervalConstants.INTERVAL_L5, 0, 0)); UILabel tipLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Error_Tip")); - tipLabel.setPreferredSize(new Dimension(60, 20)); - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{tipLabel, errorMsgTextFieldAdapter.getErrorMsgTextField()}}, TableLayoutHelper.FILL_LASTCOLUMN, 10, LayoutConstants.VGAP_MEDIUM); - this.add(panel); + this.add(row( + cell(tipLabel).weight(LEFT_WEIGHT), cell(errorMsgTextFieldAdapter.getErrorMsgTextField()).weight(RIGHT_WEIGHT) + ).getComponent()); } private void initRegErrorMsgField() { diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/RegPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/RegPane.java index ea92ee73ce..e378100567 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/RegPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/RegPane.java @@ -1,16 +1,14 @@ package com.fr.design.gui.frpane; import com.fr.design.constants.LayoutConstants; -import com.fr.design.designer.IntervalConstants; import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.core.ReactiveCardPane; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icombobox.UIComboBoxRenderer; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.form.ui.reg.*; import com.fr.general.ComparatorUtils; @@ -18,13 +16,14 @@ import com.fr.stable.StringUtils; import javax.swing.*; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import java.util.EventListener; import java.util.EventObject; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.column; + public class RegPane extends BasicPane { public static final RegExp[] ALL_REG_TYPE = { new NoneReg(), @@ -54,7 +53,7 @@ public class RegPane extends BasicPane { private RegPhonePane regPhonePane; private DefaultRegPane defaultRegPane; private CustomRegRexPane customRegRexPane; - + protected JPanel corePane; public UIComboBox getRegComboBox(){ return regComboBox; @@ -71,49 +70,51 @@ public class RegPane extends BasicPane { private void initComponents(){ this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + corePane = column(LayoutConstants.VERTICAL_GAP).getComponent(); + this.add(corePane); + regComboBox = new UIComboBox(regType); regComboBox.setRenderer(listCellRender); - JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Input_Rule")), regComboBox}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - - jPanel.add(contentPane, BorderLayout.NORTH); - JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - final JPanel cardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); - detailedCardLayout = new CardLayout(); - cardPane.setLayout(detailedCardLayout); - cardPane.add((defaultRegPane = new DefaultRegPane()), "Default"); - cardPane.add((regLengthPane = new RegLengthPane()), "Length"); - cardPane.add((regPhonePane = new RegPhonePane()), "Phone"); - cardPane.add((customRegRexPane = new CustomRegRexPane()), "Custom"); - centerPane.add(cardPane, BorderLayout.NORTH); - jPanel.add(centerPane, BorderLayout.CENTER); - this.add(jPanel, BorderLayout.NORTH); - regComboBox.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent e) { - RegExp regExp = (RegExp)regComboBox.getSelectedItem(); - if(regExp instanceof PhoneReg) { - cardPane.setPreferredSize(new Dimension(220, 30)); - Object selectItem = regPhonePane.dataTypeComboBox.getSelectedItem(); - String regString = selectItem == null ? StringUtils.EMPTY : selectItem.toString(); - firePhoneRegAction(regString); - detailedCardLayout.show(cardPane, "Phone"); + JPanel comboPane = row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Input_Rule"))).weight(1.2), + cell(regComboBox).weight(3) + ).getComponent(); + + defaultRegPane = new DefaultRegPane(); + regLengthPane = new RegLengthPane(); + regPhonePane = new RegPhonePane(); + customRegRexPane = new CustomRegRexPane(); + + final ReactiveCardPane cardPane = ReactiveCardPane.create() + .addSupplier("Length", () -> regLengthPane) + .addSupplier("Phone", () -> regPhonePane) + .addSupplier("Custom", () -> customRegRexPane); + cardPane.setVisible(false); + + corePane.add(comboPane); + corePane.add(cardPane); + initComboListener(cardPane); + } + + private void initComboListener(ReactiveCardPane cardPane) { + regComboBox.addActionListener(e -> { + RegExp regExp = (RegExp)regComboBox.getSelectedItem(); + if(regExp instanceof PhoneReg) { + Object selectItem = regPhonePane.dataTypeComboBox.getSelectedItem(); + String regString = selectItem == null ? StringUtils.EMPTY : selectItem.toString(); + firePhoneRegAction(regString); + cardPane.select("Phone").populate(); + } else { + if (regExp instanceof LengthReg){ + cardPane.select("Length").populate(); + } else if (regExp instanceof CustomReg){ + cardPane.select("Custom").populate(); } else { - if (regExp instanceof LengthReg){ - cardPane.setPreferredSize(new Dimension(220, 60)); - detailedCardLayout.show(cardPane, "Length"); - } else if (regExp instanceof CustomReg){ - cardPane.setPreferredSize(new Dimension(220, 30)); - detailedCardLayout.show(cardPane, "Custom"); - } else { - cardPane.setPreferredSize(new Dimension(0,0 )); - detailedCardLayout.show(cardPane, "Default"); - } + cardPane.setVisible(false); } - fireRegChangeAction(); } + fireRegChangeAction(); }); } @@ -174,16 +175,24 @@ public class RegPane extends BasicPane { public abstract void populate(RegExp regRex); public abstract RegExp update(); + + public DisplayPane() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.add(createContentPane(), BorderLayout.CENTER); + } + + protected JPanel createContentPane() { + return new JPanel(); + } } private static class DefaultRegPane extends DisplayPane { public RegExp regRex; public DefaultRegPane(){ - + this.setVisible(false); } - @Override protected String title4PopupWindow() { return "Default"; @@ -328,38 +337,40 @@ public class RegPane extends BasicPane { private static final String EMB_REG3 = "025 85679591"; private static final int LIMIT_LENGTH = 20; private static final String REG_PATTERN = "0123456789-*# "; + private static final int CUSTOM_OPTION_INDEX = 3; private UIComboBox dataTypeComboBox; - private final String[] dataType = {EMB_REG1, EMB_REG2, EMB_REG3, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Custom")}; - DefaultComboBoxModel DefaultComboBoxModel= new DefaultComboBoxModel(dataType); - public RegPhonePane() { - this.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L6, IntervalConstants.INTERVAL_L5, 0, 0)); - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - dataTypeComboBox = new UIComboBox(DefaultComboBoxModel); + private DefaultComboBoxModel defaultComboBoxModel; + + @Override + protected JPanel createContentPane() { + String[] dataType = {EMB_REG1, EMB_REG2, EMB_REG3, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Custom")}; + defaultComboBoxModel = new DefaultComboBoxModel(dataType); + dataTypeComboBox = new UIComboBox(defaultComboBoxModel); JTextField editFiled = (JTextField)(dataTypeComboBox.getEditor().getEditorComponent()); - UILabel dataTypeLable = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Data_Type")); - dataTypeLable.setPreferredSize(new Dimension(60, 20)); - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{dataTypeLable, dataTypeComboBox}}, TableLayoutHelper.FILL_LASTCOLUMN, 10, 0); - this.add(panel); + UILabel dataTypeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Data_Type")); + editFiled.setDocument(new LimitedDocument(LIMIT_LENGTH, REG_PATTERN)); - dataTypeComboBox.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - if(e.getStateChange() == ItemEvent.SELECTED) { - if(ComparatorUtils.equals(e.getItem(), dataType[3])) { - dataTypeComboBox.setSelectedItem(null); - dataTypeComboBox.setEditable(true); - firePhoneRegAction(EMB_REG1); - } else { - dataTypeComboBox.setEditable(false); - firePhoneRegAction(dataTypeComboBox.getSelectedItem().toString()); - } + dataTypeComboBox.addItemListener(e -> { + if(e.getStateChange() == ItemEvent.SELECTED) { + if(ComparatorUtils.equals(e.getItem(), dataType[CUSTOM_OPTION_INDEX])) { + dataTypeComboBox.setSelectedItem(null); + dataTypeComboBox.setEditable(true); + firePhoneRegAction(EMB_REG1); + } else { + dataTypeComboBox.setEditable(false); + firePhoneRegAction(dataTypeComboBox.getSelectedItem().toString()); } } }); dataTypeComboBox.setSelectedIndex(0); firePhoneRegAction(dataTypeComboBox.getSelectedItem().toString()); + + return row( + cell(dataTypeLabel).weight(1.2), cell(dataTypeComboBox).weight(3) + ).getComponent(); } + @Override protected String title4PopupWindow() { return "PHONE"; @@ -372,7 +383,7 @@ public class RegPane extends BasicPane { } String regstr = ((PhoneReg)regRex).getRegString(); if (checkEmbedded(regstr)){ - DefaultComboBoxModel.addElement(regstr); + defaultComboBoxModel.addElement(regstr); } dataTypeComboBox.setSelectedItem(((PhoneReg)regRex).getRegString()); } @@ -394,34 +405,21 @@ public class RegPane extends BasicPane { private static class RegLengthPane extends DisplayPane { private UISpinner minLenSpinner; private UISpinner maxLenSpinner; - private final int DEFAULT_WIDTH = 60; - public RegLengthPane(){ - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L6, IntervalConstants.INTERVAL_L5, 0, 0)); - this.setPreferredSize(new Dimension(210, 56)); + @Override + protected JPanel createContentPane() { minLenSpinner = new UISpinner(0, Integer.MAX_VALUE, 1, 0); maxLenSpinner = new UISpinner(0, Integer.MAX_VALUE, 1, 0); UILabel minLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Reg_Min_Length")); UILabel maxLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Reg_Max_Length")); - int minLabelWidth = Math.max(minLabel.getPreferredSize().width, DEFAULT_WIDTH); - int maxLabelWidth = Math.max(maxLabel.getPreferredSize().width, DEFAULT_WIDTH); - - minLabel.setPreferredSize(new Dimension(minLabelWidth, 20)); - maxLabel.setPreferredSize(new Dimension(maxLabelWidth, 20)); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - Component[][] components = new Component[][]{ - new Component[]{minLabel, minLenSpinner }, - new Component[]{maxLabel, maxLenSpinner}, - }; - double[] rowSize = {p, p}; - double[] columnSize = {p,f}; - int[][] rowCount = {{1, 1},{1, 1}}; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, 10, LayoutConstants.VGAP_MEDIUM); - this.add(panel); - - + return column(LayoutConstants.VERTICAL_GAP, + row( + cell(minLabel).weight(1.2), cell(minLenSpinner).weight(3) + ), + row( + cell(maxLabel).weight(1.2), cell(maxLenSpinner).weight(3) + ) + ).getComponent(); } @Override @@ -453,15 +451,16 @@ public class RegPane extends BasicPane { } } - private static class CustomRegRexPane extends DisplayPane{ + private static class CustomRegRexPane extends DisplayPane { private UITextField regTextField; - public CustomRegRexPane(){ - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L6, IntervalConstants.INTERVAL_L5, 0, 0)); + @Override + protected JPanel createContentPane() { regTextField = new UITextField(); - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Reg_Expressions")), regTextField}}, TableLayoutHelper.FILL_LASTCOLUMN, 10, LayoutConstants.VGAP_MEDIUM); - this.add(panel); + return row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Reg_Expressions"))).weight(1.2), + cell(regTextField).weight(3) + ).getComponent(); } @Override diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/TreeRootPane.java b/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/TreeRootPane.java index 691749fac6..9b1edf986f 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/TreeRootPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/TreeRootPane.java @@ -1,6 +1,7 @@ package com.fr.design.gui.itree.refreshabletree; import com.fr.data.impl.TreeAttr; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.layout.FRGUIPaneFactory; @@ -8,11 +9,15 @@ import com.fr.design.layout.FRGUIPaneFactory; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JPanel; +import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; + public class TreeRootPane extends BasicPane { @@ -30,38 +35,20 @@ public class TreeRootPane extends BasicPane { private final UICheckBox returnFullPathCheckBox; public TreeRootPane() { - this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - - JPanel checkTypePane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane_First0(); - checkTypePane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + this.setLayout(new BorderLayout()); checkTypeCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tree_Mutiple_Selection_Or_Not")); - checkTypeCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - - checkTypePane.add(checkTypeCheckBox); - this.add(checkTypePane); - - JPanel loadTypePane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane_First0(); - checkTypePane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); loadTypeCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Load_By_Async")); - loadTypeCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - - loadTypePane.add(loadTypeCheckBox); - this.add(loadTypePane); - - JPanel leafSelectPane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane_First0(); - checkTypePane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - leafSelectPane.add(layerTypeCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tree_Select_Leaf_Only"))); - layerTypeCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - - this.add(leafSelectPane); + layerTypeCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tree_Select_Leaf_Only")); + returnFullPathCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tree_Return_Full_Path")); - JPanel returnFullPathPane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane_First0(); - checkTypePane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - returnFullPathPane.add(returnFullPathCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tree_Return_Full_Path"))); - returnFullPathCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); addCheckBoxListener(); - this.add(returnFullPathPane); + this.add(column(LayoutConstants.VERTICAL_GAP, + cell(checkTypeCheckBox), + cell(loadTypeCheckBox), + cell(layerTypeCheckBox), + cell(returnFullPathCheckBox) + ).getComponent()); } diff --git a/designer-base/src/main/java/com/fr/design/widget/btn/ButtonWithHotkeysDetailPane.java b/designer-base/src/main/java/com/fr/design/widget/btn/ButtonWithHotkeysDetailPane.java index d146c73099..66994ef844 100644 --- a/designer-base/src/main/java/com/fr/design/widget/btn/ButtonWithHotkeysDetailPane.java +++ b/designer-base/src/main/java/com/fr/design/widget/btn/ButtonWithHotkeysDetailPane.java @@ -4,19 +4,22 @@ import java.awt.*; import javax.swing.*; -import com.fr.design.designer.IntervalConstants; import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.icombobox.DictionaryComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; -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.AccessibleIconEditor; import com.fr.form.ui.Button; import com.fr.stable.StableUtils; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; + /** * Created by IntelliJ IDEA. * Author : Richer @@ -34,32 +37,38 @@ public abstract class ButtonWithHotkeysDetailPane extends Butt } private void initComponents() { - this.setLayout(new BorderLayout(7, 7)); - JPanel advancePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double rowSize[] = {p, p, p, p}; - double columnSize[] = {p, f}; - JPanel labelPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + this.setLayout(new BorderLayout()); + JPanel advancePane = column(VERTICAL_GAP).getComponent(); + iconPane = new AccessibleIconEditor(); - labelPane.add(iconPane); - Component comp = createCenterPane(); - Component[][] n_components = { - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Button_Type")), createCustomButtonTypeComboBox()}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Button_Name")), buttonNameTextField = new UITextField()}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Button_Icon")), iconPane}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Button_Hot_keys")), hotkeysTextField = new UITextField()}, - }; + buttonNameTextField = new UITextField(); + hotkeysTextField = new UITextField(); hotkeysTextField.setToolTipText(StableUtils.join(ButtonConstants.HOTKEYS, ",")); - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(n_components, rowSize, columnSize, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); - advancePane.add(panel, BorderLayout.NORTH); + + Component comp = createCenterPane(); + advancePane.add(column(VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Button_Type"))).weight(LEFT_WEIGHT), + cell(createCustomButtonTypeComboBox()).weight(RIGHT_WEIGHT) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Button_Name"))).weight(LEFT_WEIGHT), + cell(buttonNameTextField).weight(RIGHT_WEIGHT) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Button_Icon"))).weight(LEFT_WEIGHT), + cell(iconPane).weight(RIGHT_WEIGHT) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Button_Hot_keys"))).weight(LEFT_WEIGHT), + cell(hotkeysTextField).weight(RIGHT_WEIGHT) + ) + ).getComponent()); if(comp != null ) { - advancePane.add(comp,BorderLayout.CENTER); + advancePane.add(comp); } UIExpandablePane uiExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Advanced"), 280, 20, advancePane); this.add(uiExpandablePane); - } protected abstract Component createCenterPane(); diff --git a/designer-base/src/main/java/com/fr/design/widget/component/DateValuePane.java b/designer-base/src/main/java/com/fr/design/widget/component/DateValuePane.java index 656b42283c..846bf6b3f0 100644 --- a/designer-base/src/main/java/com/fr/design/widget/component/DateValuePane.java +++ b/designer-base/src/main/java/com/fr/design/widget/component/DateValuePane.java @@ -1,5 +1,6 @@ package com.fr.design.widget.component; +import com.fine.swing.ui.layout.Column; import com.fr.base.BaseFormula; import com.fr.design.constants.LayoutConstants; import com.fr.design.editor.editor.DateEditor; @@ -7,55 +8,65 @@ import com.fr.design.editor.editor.Editor; import com.fr.design.editor.editor.FormulaEditor; import com.fr.design.editor.editor.NoneEditor; import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.design.gui.ilable.UILabel; import com.fr.general.ComparatorUtils; +import com.fr.stable.StringUtils; import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import java.awt.*; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.flex; + /** - * Created by ibm on 2017/8/8. + * 日期设置面板 + * + * @author ibm + * @since 10.0 + * Created on 2017/08/08 */ -public class DateValuePane extends JPanel { +public class DateValuePane extends Column { private UIButtonGroup widgetValueHead; private Editor[] editor; private static final String NONE_EDITOR_NAME = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_None"); private static final String DATE_EDITOR_NAME = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Date"); private static final String FORMULA_EDITOR_NAME = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Parameter_Formula"); - public DateValuePane() { + this(StringUtils.EMPTY); + } + + public DateValuePane(String title) { + setSpacing(LayoutConstants.VERTICAL_GAP); + UILabel titleLabel = new UILabel(title); editor = new Editor[]{ new NoneEditor(null, NONE_EDITOR_NAME), new DateEditor(true, DATE_EDITOR_NAME), new FormulaEditor(FORMULA_EDITOR_NAME) }; - this.setLayout(new BorderLayout(0, LayoutConstants.VGAP_SMALL)); final CardLayout cardLayout = new CardLayout(); final JPanel customPane = new JPanel(cardLayout); + final JPanel customRow = row(flex(1.2), cell(customPane).weight(3)).getComponent(); final String[] tabTitles = new String[editor.length]; for (int i = 0; i < editor.length; i++) { customPane.add(editor[i], editor[i].getName()); tabTitles[i] = editor[i].getName(); } widgetValueHead = new UIButtonGroup(tabTitles); - widgetValueHead.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - int index = widgetValueHead.getSelectedIndex(); - if (ComparatorUtils.equals(tabTitles[index], com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_None"))) { - customPane.setVisible(false); - } else { - customPane.setVisible(true); - } - cardLayout.show(customPane, tabTitles[index]); - } + widgetValueHead.addChangeListener(e -> { + int index = widgetValueHead.getSelectedIndex(); + customRow.setVisible(!ComparatorUtils.equals(tabTitles[index], + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_None"))); + cardLayout.show(customPane, tabTitles[index]); }); - this.add(widgetValueHead, BorderLayout.NORTH); - this.add(customPane, BorderLayout.CENTER); - + this.add( + row( + cell(titleLabel).weight(1.2), cell(widgetValueHead).weight(3) + ), + cell(customRow) + ); } diff --git a/designer-base/src/main/java/com/fr/design/widget/component/NumberEditorValidatePane.java b/designer-base/src/main/java/com/fr/design/widget/component/NumberEditorValidatePane.java index 7fd88dd957..7d5c817e16 100644 --- a/designer-base/src/main/java/com/fr/design/widget/component/NumberEditorValidatePane.java +++ b/designer-base/src/main/java/com/fr/design/widget/component/NumberEditorValidatePane.java @@ -3,30 +3,31 @@ package com.fr.design.widget.component; import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.ErrorMsgTextFieldAdapter; import com.fr.design.beans.UITextFieldAdapter; +import com.fr.design.constants.LayoutConstants; import com.fr.design.designer.IntervalConstants; import com.fr.design.fun.TextFieldAdapterProvider; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; -import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.form.ui.NumberEditor; import com.fr.log.FineLoggerFactory; import com.fr.stable.AssistUtils; import com.fr.stable.StringUtils; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.column; + /** * Created by kerry on 2017/9/10. */ @@ -63,45 +64,40 @@ public class NumberEditorValidatePane extends JPanel { private void initComponent() { initListeners(); this.allowDecimalsCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Allow_Decimals")); - allowDecimalsCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); this.allowDecimalsCheckBox.addActionListener(allowDecimalsListener); this.decimalLength = new UISpinner(0, Integer.MAX_VALUE, 1, 16); this.allowNegativeCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Allow_Negative")); this.allowNegativeCheckBox.addActionListener(allowNegativeListener); - allowNegativeCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); this.setMaxValueCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Need_Max_Value"), false); - setMaxValueCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); this.maxValueSpinner = new UISpinner(-Double.MAX_VALUE, Double.MAX_VALUE, 1D, 0D); this.setMaxValueCheckBox.addActionListener(setMaxListener); this.maxValueSpinner.addChangeListener(maxValueChangeListener); this.setMinValueCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Need_Min_Value"), false); this.minValueSpinner = new UISpinner(-Double.MAX_VALUE, Double.MAX_VALUE, 1D, 0D); - minValueSpinner.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); this.setMinValueCheckBox.addActionListener(setMinListener); this.minValueSpinner.addChangeListener(minValueChangeListener); - setMinValueCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); initErrorMsgPane(); JPanel errorMsgBorderPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - errorMsgBorderPane.setBorder(BorderFactory.createEmptyBorder(0, IntervalConstants.INTERVAL_L5, IntervalConstants.INTERVAL_L1, 0)); errorMsgBorderPane.add(errorMsgTextFieldPane, BorderLayout.CENTER); UILabel numberLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Decimal_Digits")); - limitNumberPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{numberLabel, decimalLength}}, TableLayoutHelper.FILL_LASTCOLUMN, 18, 7); - limitNumberPane.setBorder(BorderFactory.createEmptyBorder(0, IntervalConstants.INTERVAL_L5, 0, 0)); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - Component[][] components = new Component[][]{ - new Component[]{allowDecimalsCheckBox, null}, - new Component[]{limitNumberPane, null}, - new Component[]{allowNegativeCheckBox, null}, - new Component[]{setMaxValueCheckBox, maxValueSpinner}, - new Component[]{setMinValueCheckBox, minValueSpinner}, - new Component[]{errorMsgBorderPane, null}, - }; - 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}}; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_L2, IntervalConstants.INTERVAL_L1); - this.add(panel); + + limitNumberPane = row( + cell(numberLabel).weight(1.2), + cell(decimalLength).weight(3) + ).getComponent(); + + this.add(column(LayoutConstants.VERTICAL_GAP, + cell(allowDecimalsCheckBox), + cell(limitNumberPane), + cell(allowNegativeCheckBox), + row( + cell(setMaxValueCheckBox).weight(1), cell(maxValueSpinner).weight(1.5) + ), + row( + cell(setMinValueCheckBox).weight(1), cell(minValueSpinner).weight(1.5) + ), + cell(errorMsgBorderPane) + ).getComponent()); } private void initErrorMsgPane() { @@ -128,10 +124,8 @@ public class NumberEditorValidatePane extends JPanel { public void actionPerformed(ActionEvent e) { if (allowDecimalsCheckBox.isSelected()) { limitNumberPane.setVisible(true); - limitNumberPane.setPreferredSize(new Dimension(215, 20)); } else { limitNumberPane.setVisible(false); - limitNumberPane.setPreferredSize(new Dimension(0, 0)); } } }; diff --git a/designer-base/src/main/java/com/fr/design/widget/component/ReturnTypePane.java b/designer-base/src/main/java/com/fr/design/widget/component/ReturnTypePane.java index 4f3b93a539..0812c94783 100644 --- a/designer-base/src/main/java/com/fr/design/widget/component/ReturnTypePane.java +++ b/designer-base/src/main/java/com/fr/design/widget/component/ReturnTypePane.java @@ -1,18 +1,18 @@ package com.fr.design.widget.component; -import com.fr.design.designer.IntervalConstants; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.icombobox.DictionaryComboBox; import com.fr.design.gui.icombobox.DictionaryConstants; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayoutHelper; import com.fr.form.ui.ReturnTypeProvider; -import javax.swing.BorderFactory; import javax.swing.JPanel; -import java.awt.BorderLayout; -import java.awt.Component; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; public class ReturnTypePane extends JPanel { @@ -31,22 +31,32 @@ public class ReturnTypePane extends JPanel { startComboBox.setEditable(true); endComboBox = new DictionaryComboBox(DictionaryConstants.symbols, DictionaryConstants.symbolDisplays); endComboBox.setEditable(true); - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Delimiter")), delimiterComboBox}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Combo_CheckBox_Start_Symbol")), startComboBox}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Combo_CheckBox_End_Symbol")), endComboBox} - }; - returnStringPane = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W2, IntervalConstants.INTERVAL_L1); + + returnStringPane = column(LayoutConstants.VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Delimiter"))).weight(1.2), + cell(delimiterComboBox).weight(3) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Combo_CheckBox_Start_Symbol"))).weight(1.2), + cell(startComboBox).weight(3) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Combo_CheckBox_End_Symbol"))).weight(1.2), + cell(endComboBox).weight(3) + ) + ).getComponent(); returnTypeComboBox = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Array"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_String")}); returnTypeComboBox.addActionListener(e -> checkVisible(returnTypeComboBox.getSelectedIndex())); - JPanel headPane = TableLayoutHelper.createGapTableLayoutPane( - new Component[][]{new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Date_Selector_Return_Type")), returnTypeComboBox}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L2, IntervalConstants.INTERVAL_L1); - JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - jPanel.add(headPane, BorderLayout.NORTH); - jPanel.add(returnStringPane, BorderLayout.CENTER); - returnStringPane.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L5, 0, 0)); - this.add(jPanel); + + this.add(column(LayoutConstants.VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Date_Selector_Return_Type"))).weight(1.2), + cell(returnTypeComboBox).weight(3) + ), + cell(returnStringPane) + ).getComponent()); } public void setReturnType(ReturnType returnType) { diff --git a/designer-base/src/main/java/com/fr/design/widget/mobile/WidgetMobilePane.java b/designer-base/src/main/java/com/fr/design/widget/mobile/WidgetMobilePane.java index 20b82467bb..b2ebf896af 100644 --- a/designer-base/src/main/java/com/fr/design/widget/mobile/WidgetMobilePane.java +++ b/designer-base/src/main/java/com/fr/design/widget/mobile/WidgetMobilePane.java @@ -4,8 +4,6 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.form.ui.Widget; - -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingConstants; @@ -17,7 +15,7 @@ public class WidgetMobilePane extends JPanel { public static WidgetMobilePane DEFAULT_PANE = new WidgetMobilePane(); public WidgetMobilePane() { - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + this.setBorder(null); init(); } diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index a6d558281f..a03c97da7f 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -1299,4 +1299,7 @@ CellOtherSetPane.height=$Component.defaultHeight toolbar.pressedBackground: null [style]Label.boldLabel = \ - font: bold $defaultFont \ No newline at end of file + font: bold $defaultFont + +[style]Label.tipLabel = \ + foreground: $Label.tipColor \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/btn/AbstractExtraButtonPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/btn/AbstractExtraButtonPane.java index 79a71d56e0..bea7a1bfc4 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/btn/AbstractExtraButtonPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/btn/AbstractExtraButtonPane.java @@ -1,7 +1,9 @@ package com.fr.design.widget.ui.btn; +import com.fine.swing.ui.layout.Column; import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.fun.WidgetAdvancedPaneProvider; import com.fr.design.gui.icombobox.DictionaryComboBox; @@ -21,6 +23,8 @@ import javax.swing.JPanel; import java.awt.Component; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; /** @@ -116,14 +120,14 @@ public abstract class AbstractExtraButtonPane extends ButtonWi */ protected Component createExtraPane(@Nullable BasicPane pane) { initExtraPane(); - Component[][] components = new Component[][]{ - new Component[]{pane, null}, - new Component[]{extraPane, null} - }; - double[] rowSize = {P, P}; - double[] columnSize = {P, F}; - int[][] rowCount = {{1, 1},{1, 1}}; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, 10, 7); + Column column = column(VERTICAL_GAP).getComponent(); + if (pane != null) { + column.add(pane); + } + if (extraPane != null) { + column.add(extraPane); + } + return column; } } diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java index b7661f9f04..28a7db4aae 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java @@ -8,15 +8,15 @@ import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.layout.VerticalFlowLayout; import javax.swing.ButtonGroup; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; + +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.flex; /** * @author hades @@ -47,23 +47,23 @@ public class MobileTextFieldInputSettingPane extends BasicBeanPane it.setBorder(new ScaledEmptyBorder(0, 10, 0, 10))) + ).getComponent()); // 属性 attriTabPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); @@ -73,16 +94,19 @@ public class CellWidgetCardPane extends BasicPane { } }; widgetPropertyPane = new BasicWidgetPropertySettingPane(); - UIExpandablePane uiExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Basic"), 280, 24, widgetPropertyPane); - attriTabPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10)); - attriTabPane.add(uiExpandablePane, BorderLayout.NORTH); + UIExpandablePane basicPane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Basic"), 280, 24, widgetPropertyPane); attriCardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); - attriTabPane.add(attriCardPane, BorderLayout.CENTER); attriCardLayout = (CardLayout) attriCardPane.getLayout(); + attriTabPane.add(column( + cell(basicPane), + fix(1).with(it -> it.setBorder(FineBorderFactory.createDefaultUnderlineBorder())), + cell(attriCardPane) + ).getComponent() + ); + // 事件 eventTabPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - eventTabPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); eventPane = initWidgetEventPane(pane); eventTabPane.add(eventPane, BorderLayout.CENTER); @@ -97,16 +121,6 @@ public class CellWidgetCardPane extends BasicPane { center.add(mobileTabPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Widget_Mobile_Terminal")); initPaneList(); - - final String[] tabTitles = new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Attribute"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Widget_Mobile_Terminal")}; - tabsHeaderIconPane = new UIHeadGroup(tabTitles) { - @Override - public void tabChanged(int index) { - tabbedPane.show(center, tabTitles[index]); - } - }; - tabsHeaderIconPane.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, UIConstants.SHADOW_GREY)); - this.add(tabsHeaderIconPane, BorderLayout.NORTH); } private void initPaneList() { diff --git a/designer-realize/src/main/java/com/fr/design/widget/WidgetEventPane.java b/designer-realize/src/main/java/com/fr/design/widget/WidgetEventPane.java index b2b4f2fde7..41e5a99011 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/WidgetEventPane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/WidgetEventPane.java @@ -1,6 +1,7 @@ package com.fr.design.widget; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.controlpane.NameableCreator; import com.fr.design.gui.controlpane.UIListGroupControlPane; @@ -23,7 +24,6 @@ import com.fr.stable.AssistUtils; import com.fr.stable.Nameable; import com.fr.write.JavaScriptResourceInfo; -import javax.swing.BorderFactory; import java.lang.reflect.Constructor; public class WidgetEventPane extends UIListGroupControlPane { @@ -40,7 +40,7 @@ public class WidgetEventPane extends UIListGroupControlPane { if (pane != null) { selection = pane.getSelection(); } - setBorder(BorderFactory.createEmptyBorder(10, 0, 15, 0)); + setBorder(new ScaledEmptyBorder(10, 0, 10, 0)); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/widget/WidgetPane.java b/designer-realize/src/main/java/com/fr/design/widget/WidgetPane.java index 3a50c38705..9cbcc66b8d 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/WidgetPane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/WidgetPane.java @@ -1,5 +1,6 @@ package com.fr.design.widget; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.ExtraDesignClassManager; import com.fr.design.fun.WidgetDesignHandler; import com.fr.design.gui.core.WidgetOption; @@ -9,27 +10,36 @@ import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icombobox.UIComboBoxRenderer; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.CellWidgetPropertyPane; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.widget.btn.ButtonConstants; import com.fr.form.ui.Button; -import com.fr.form.ui.*; +import com.fr.form.ui.NameWidget; +import com.fr.form.ui.Widget; +import com.fr.form.ui.WidgetConfig; +import com.fr.form.ui.WidgetInfoConfig; import com.fr.general.ComparatorUtils; - import com.fr.stable.ArrayUtils; import com.fr.stable.AssistUtils; -import javax.swing.*; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JPanel; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; -import java.awt.*; +import java.awt.Component; +import java.awt.Dimension; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.Vector; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; + /** * CellEditorDef Pane. */ @@ -38,7 +48,7 @@ public class WidgetPane extends AbstractAttrNoScrollPane implements ItemListener private EditorTypeComboBox editorTypeComboBox; private CellWidgetCardPane cellEditorCardPane; private boolean shouldFireSelectedEvent = true; - private JPanel northPane; + private JComponent northPane; public WidgetPane() { this(null); @@ -58,36 +68,32 @@ public class WidgetPane extends AbstractAttrNoScrollPane implements ItemListener protected void initComponents(ElementCasePane pane) { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); editorTypeComboBox = new EditorTypeComboBox(pane != null); - editorTypeComboBox.setPreferredSize(new Dimension(155, 30)); editorTypeComboBox.setMaximumRowCount(16); northPane = initNorthPane(); - northPane.setBorder(BorderFactory.createEmptyBorder(12, 10, 10, 15)); - this.add(northPane, BorderLayout.NORTH); + northPane.setBorder(new ScaledEmptyBorder(10, 10, 0, 10)); editorTypeComboBox.addItemListener(this); - cellEditorCardPane = initWidgetCardPane(pane); - this.add(cellEditorCardPane, BorderLayout.CENTER); this.addAttributeChangeListener(listener); + + this.add(column( + 10, + cell(northPane), + cell(cellEditorCardPane) + ).getComponent() + ); } public JPanel initNorthPane() { - UILabel emptyLabel = new UILabel(); - emptyLabel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); - - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, p, f}; - double[] rowSize = {p}; - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Select_Widget")), emptyLabel, editorTypeComboBox}, - }; - JPanel jPanel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); - return jPanel; + + return column( + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Select_Widget"))).weight(LEFT_WEIGHT), + cell(editorTypeComboBox).weight(RIGHT_WEIGHT) + ) + ).getComponent(); } protected CellWidgetCardPane initWidgetCardPane(ElementCasePane pane) { diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/BasicWidgetPropertySettingPane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/BasicWidgetPropertySettingPane.java index 5bd91d038d..c7ff5fdddb 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/BasicWidgetPropertySettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/BasicWidgetPropertySettingPane.java @@ -1,21 +1,22 @@ package com.fr.design.widget.ui; -import com.fr.design.designer.IntervalConstants; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.dialog.BasicPane; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.utils.gui.GUICoreUtils; import com.fr.form.ui.NoneWidget; import com.fr.form.ui.Widget; -import com.fr.design.utils.gui.GUICoreUtils; - -import javax.swing.BorderFactory; -import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; public class BasicWidgetPropertySettingPane extends BasicPane { @@ -26,27 +27,20 @@ public class BasicWidgetPropertySettingPane extends BasicPane { public BasicWidgetPropertySettingPane() { this.setLayout(new BorderLayout()); + this.setBorder(new ScaledEmptyBorder(0, 0, 10, 0)); enableCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Enabled"), true); - enableCheckBox.setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); visibleCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Form_Widget_Visible"), true); - visibleCheckBox.setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); widgetNameComboBox = new ParameterTreeComboBox(); widgetNameComboBox.refreshTree(); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - Component[][] components = new Component[][]{ - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Widget_Name")), widgetNameComboBox}, - new Component[]{enableCheckBox, null}, - new Component[]{visibleCheckBox, null}, - }; - double[] rowSize = {p, p, p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1},{1, 1},{1, 1},{1, 1}}; - JPanel pane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W2, IntervalConstants.INTERVAL_L1); - pane.setBorder(BorderFactory.createEmptyBorder(10,0,10,0)); - - this.add(pane, BorderLayout.CENTER); + this.add(column(LayoutConstants.VERTICAL_GAP, + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Widget_Name"))).weight(LEFT_WEIGHT), + cell(widgetNameComboBox).weight(RIGHT_WEIGHT) + ), + cell(enableCheckBox), + cell(visibleCheckBox) + ).getComponent()); } @Override 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 049168da14..752b6e44c8 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 @@ -1,26 +1,27 @@ package com.fr.design.widget.ui; -import java.awt.*; -import java.awt.event.ActionEvent; - import com.fr.data.Dictionary; -import com.fr.design.designer.IntervalConstants; -import com.fr.design.gui.ispinner.UIBasicSpinner; -import java.awt.event.ActionListener; - -import com.fr.design.gui.ilable.UILabel; - -import javax.swing.*; - +import com.fr.design.gui.core.ReactiveCardPane; 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.mainframe.widget.accessibles.AccessibleDictionaryEditor; import com.fr.design.widget.FRWidgetFactory; import com.fr.form.ui.ButtonGroup; +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.SpinnerNumberModel; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; public class ButtonGroupDictPane extends JPanel { @@ -28,6 +29,7 @@ public class ButtonGroupDictPane extends JPanel { private UICheckBox adaptiveCheckbox; private UILabel columnLabel; private AccessibleDictionaryEditor dictPane; + private ReactiveCardPane reactiveCardPane; public ButtonGroupDictPane() { @@ -45,36 +47,45 @@ public class ButtonGroupDictPane extends JPanel { adaptiveCheckbox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - columnSpinner.setVisible(!adaptiveCheckbox.isSelected()); - columnLabel.setVisible(!adaptiveCheckbox.isSelected()); + boolean selected = adaptiveCheckbox.isSelected(); + if (selected) { + reactiveCardPane.select("adaptive").populate(); + } else { + reactiveCardPane.select("inadaptive").populate(); + } } }); 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, 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(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); - this.add(panel); + reactiveCardPane = ReactiveCardPane.create() + .addSupplier("adaptive", () -> column( + 10, + row(cell(dictLabel).weight(LEFT_WEIGHT), cell(dictPane).weight(RIGHT_WEIGHT)), + row(cell(adaptiveCheckbox)), + row(cell(columnLabel).weight(LEFT_WEIGHT), cell(columnSpinner).weight(RIGHT_WEIGHT)) + ).getComponent() + ).addSupplier("inadaptive", () -> column( + 10, + row(cell(dictLabel).weight(LEFT_WEIGHT), cell(dictPane).weight(RIGHT_WEIGHT)), + row(cell(adaptiveCheckbox)) + ).getComponent()); + reactiveCardPane.select("inadaptive").populate(); + this.add(reactiveCardPane); } public void populate(ButtonGroup buttonGroup) { dictPane.setValue(buttonGroup.getDictionary()); adaptiveCheckbox.setSelected(buttonGroup.isAdaptive()); - columnSpinner.setVisible(!adaptiveCheckbox.isSelected()); - columnLabel.setVisible(!adaptiveCheckbox.isSelected()); + boolean selected = adaptiveCheckbox.isSelected(); + if (selected) { + reactiveCardPane.select("adaptive").populate(); + } else { + reactiveCardPane.select("inadaptive").populate(); + } columnSpinner.setValue(buttonGroup.getColumnsInRow()); } diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/CheckBoxDefinePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/CheckBoxDefinePane.java index 324596bbe1..85e5272eb5 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/CheckBoxDefinePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/CheckBoxDefinePane.java @@ -2,26 +2,28 @@ package com.fr.design.widget.ui; import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.designer.IntervalConstants; import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.fun.WidgetAdvancedPaneProvider; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.widgettheme.processor.WidgetThemeCreatorPaneAdder; import com.fr.form.ui.CheckBox; import com.fr.general.GeneralContext; import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; import com.fr.stable.collections.CollectionUtils; -import javax.swing.BorderFactory; import javax.swing.JPanel; -import java.awt.Component; +import java.awt.BorderLayout; import java.util.ArrayList; import java.util.List; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; /** * 复选框pane @@ -46,18 +48,28 @@ public class CheckBoxDefinePane extends AbstractDataModify { this.setLayout(FRGUIPaneFactory.createBorderLayout()); text = new UITextField(); initExtraPane(); - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Text")), text}, - new Component[]{extraPane, null}, - }; - double[] rowSize = {P,P}; - double[] columnSize = {P, F}; - int[][] rowCount = {{1, 1}, {1, 1}}; - JPanel pane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W3, IntervalConstants.INTERVAL_L1); - UIExpandablePane uiExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 24, pane); - pane.setBorder(BorderFactory.createEmptyBorder(10, 5, 10, 0)); + JPanel content = new JPanel(new BorderLayout()); + if (extraPane == null) { + content.add( + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Text"))).weight(LEFT_WEIGHT), + cell(text).weight(RIGHT_WEIGHT) + ).getComponent() + ); + } else { + content.add( + column( + 10, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Text"))).weight(LEFT_WEIGHT), + cell(text)).weight(RIGHT_WEIGHT), + row(cell(extraPane)) + ).getComponent() + ); + } + UIExpandablePane uiExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 24, content); this.add(uiExpandablePane); } diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/CheckBoxGroupDefinePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/CheckBoxGroupDefinePane.java index ea7a774a49..083f92bd8b 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/CheckBoxGroupDefinePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/CheckBoxGroupDefinePane.java @@ -1,25 +1,16 @@ package com.fr.design.widget.ui; -import java.awt.*; -import java.util.Set; - -import javax.swing.BorderFactory; import javax.swing.JPanel; -import javax.swing.SwingConstants; -import com.fr.design.ExtraDesignClassManager; -import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.LayoutConstants; import com.fr.design.data.DataCreatorUI; -import com.fr.design.designer.IntervalConstants; -import com.fr.design.fun.WidgetAdvancedPaneProvider; import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.widget.component.ReturnTypePane; import com.fr.form.ui.CheckBoxGroup; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; + public class CheckBoxGroupDefinePane extends FieldEditorDefinePane { private ReturnTypePane returnTypePane; @@ -44,27 +35,18 @@ public class CheckBoxGroupDefinePane extends FieldEditorDefinePane { protected AccessibleDictionaryEditor dictPane; @@ -32,10 +27,10 @@ public class ComboBoxDefinePane extends CustomWritableRepeatEditorPane protected JPanel setForthContentPane () { dictPane = new AccessibleDictionaryEditor(); - JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane( - new Component[][]{new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_DS_Dictionary")), dictPane}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - jPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); - return jPanel; + return row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_DS_Dictionary"))).weight(LEFT_WEIGHT), + cell(dictPane).weight(RIGHT_WEIGHT) + ).getComponent(); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/ComboCheckBoxDefinePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/ComboCheckBoxDefinePane.java index 270377d427..d982809ff6 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/ComboCheckBoxDefinePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/ComboCheckBoxDefinePane.java @@ -1,24 +1,22 @@ package com.fr.design.widget.ui; import com.fr.data.Dictionary; -import com.fr.design.ExtraDesignClassManager; -import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.LayoutConstants; import com.fr.design.data.DataCreatorUI; -import com.fr.design.designer.IntervalConstants; -import com.fr.design.fun.WidgetAdvancedPaneProvider; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; -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.component.ReturnTypePane; import com.fr.form.ui.ComboCheckBox; import javax.swing.*; -import java.awt.*; -import java.util.Set; + +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; public class ComboCheckBoxDefinePane extends CustomWritableRepeatEditorPane { private ReturnTypePane returnTypePane; @@ -34,23 +32,14 @@ public class ComboCheckBoxDefinePane extends CustomWritableRepeatEditorPane extends WritableRepeatEditorPane { private UICheckBox customDataCheckBox; - private static final int CUSTOM_DATA_CHECK_BOX_WIDTH = GraphHelper.getWidth(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Allow_Custom_Data")) + 30; - private static final int CUSTOM_DATA_CHECK_BOX_HEIGHT = 30; public CustomWritableRepeatEditorPane() { this.initComponents(); @@ -27,21 +20,14 @@ public abstract class CustomWritableRepeatEditorPane { - private UIButtonGroup returnTypeComboBox; + private UIButtonGroup returnTypeButtonGroup; private DateValuePane startDv; private DateValuePane endDv; private UIComboBox currentFormatComboBox; - private UILabel currentSamplelabel; - private UIButtonGroup fomatHeadGroup; - private static final int SAMPLE_LABEL_PADDING = 4; - + private UILabel currentSampleLabel; + private UIButtonGroup formatButtonGroup; public DateEditorDefinePane() { } @@ -55,33 +54,22 @@ public class DateEditorDefinePane extends DirectWriteEditorDefinePane(new String[] {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Date") , com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_String")}); + returnTypeButtonGroup = new UIButtonGroup<>(new String[] {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Date") , + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_String")}); JPanel formatHead = createFormatHead(); - startDv = new DateValuePane(); - endDv = new DateValuePane(); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - UILabel formatLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Format")); - formatLabel.setVerticalAlignment(SwingConstants.TOP); - UILabel startDateLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_FS_Start_Date")); - startDateLabel.setVerticalAlignment(SwingConstants.TOP); - UILabel endDateLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_FS_End_Date")); - endDateLabel.setVerticalAlignment(SwingConstants.TOP); - Component[][] components = new Component[][]{ - new Component[]{formatLabel, formatHead}, - new Component[]{startDateLabel, startDv}, - new Component[]{endDateLabel, endDv}, - new Component[]{waterMarkDictPane, null}, - new Component[]{extraPane, null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Date_Selector_Return_Type")), returnTypeComboBox } - }; - double[] rowSize = {p, p, p, p, p, p, p, p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 3},{1, 1},{1, 1},{1, 1},{1, 1}, {1, 1}}; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_L2, IntervalConstants.INTERVAL_L1); - - - return panel; + startDv = new DateValuePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_FS_Start_Date")); + endDv = new DateValuePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_FS_End_Date")); + UILabel returnTypeLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Widget_Date_Selector_Return_Type")); + + return column(LayoutConstants.VERTICAL_GAP, + cell(formatHead), + cell(startDv), + cell(endDv), + cell(waterMarkDictPane), + row( + cell(returnTypeLabel).weight(LEFT_WEIGHT), cell(returnTypeButtonGroup).weight(RIGHT_WEIGHT) + ) + ).getComponent(); } @Override @@ -90,20 +78,19 @@ public class DateEditorDefinePane extends DirectWriteEditorDefinePane refreshPreviewLabel()); + timeFormatComboBox.addActionListener(e -> refreshPreviewLabel()); final UILabel dateSampleLabel = createSamplePane(); final UILabel timeSampleLabel = createSamplePane(); - JPanel fomatHeadPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); final CardLayout cardLayout = new CardLayout(); final JPanel customPane = new JPanel(cardLayout); JPanel dateFormatPane = createFormatPane(dateFormatComboBox, dateSampleLabel); JPanel timeFormatPane = createFormatPane(timeFormatComboBox, timeSampleLabel); customPane.add(dateFormatPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_StyleFormat_Date")); customPane.add(timeFormatPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_StyleFormat_Time")); - final String[] tabTitles = new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_StyleFormat_Date"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_StyleFormat_Time")}; - fomatHeadGroup = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_StyleFormat_Date"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_StyleFormat_Time")}); - fomatHeadGroup.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - int newSelectedIndex = fomatHeadGroup.getSelectedIndex(); - cardLayout.show(customPane, tabTitles[newSelectedIndex]); - if(newSelectedIndex == 0){ - currentFormatComboBox = dateFormatComboBox; - currentSamplelabel = dateSampleLabel; - }else{ - currentFormatComboBox = timeFormatComboBox; - currentSamplelabel = timeSampleLabel; - } - refreshPreviewLabel(); + final String[] tabTitles = new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_StyleFormat_Date"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_StyleFormat_Time")}; + formatButtonGroup = new UIButtonGroup<>(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_StyleFormat_Date"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_StyleFormat_Time")}); + formatButtonGroup.addChangeListener(e -> { + int newSelectedIndex = formatButtonGroup.getSelectedIndex(); + cardLayout.show(customPane, tabTitles[newSelectedIndex]); + if(newSelectedIndex == 0){ + currentFormatComboBox = dateFormatComboBox; + currentSampleLabel = dateSampleLabel; + }else{ + currentFormatComboBox = timeFormatComboBox; + currentSampleLabel = timeSampleLabel; } + refreshPreviewLabel(); }); - fomatHeadPane.add(fomatHeadGroup, BorderLayout.NORTH); - fomatHeadPane.add(customPane, BorderLayout.CENTER); - return fomatHeadPane; + return column(LayoutConstants.VERTICAL_GAP, + row( + cell(formatLabel).weight(LEFT_WEIGHT), cell(formatButtonGroup).weight(RIGHT_WEIGHT) + ), + row(flex(LEFT_WEIGHT), cell(customPane).weight(RIGHT_WEIGHT)) + ).getComponent(); } - - private void refreshPreviewLabel() { String text = (String) currentFormatComboBox.getSelectedItem(); if (text != null && text.length() > 0) { @@ -174,14 +153,14 @@ public class DateEditorDefinePane extends DirectWriteEditorDefinePane e super(); } - @Override protected JPanel setFirstContentPane() { - JPanel contentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - contentPane.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 0)); + JPanel contentPane = column(LayoutConstants.VERTICAL_GAP).getComponent(); directWriteCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Allow_Edit"), false); - directWriteCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); waterMarkDictPane = new WaterMarkDictPane(); initExtraPane(); - Component[][] components = new Component[][]{ - new Component[]{waterMarkDictPane, null}, - new Component[]{extraPane, null}, - }; - double[] rowSize = {P, P}; - double[] columnSize = {P, F}; - int[][] rowCount = {{1, 1}, {1, 1}}; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_L2, IntervalConstants.INTERVAL_L1); - contentPane.add(panel, BorderLayout.NORTH); + contentPane.add(column(LayoutConstants.VERTICAL_GAP, + cell(waterMarkDictPane), + cell(extraPane) + ).getComponent()); JPanel otherContentPane = this.setSecondContentPane(); if (otherContentPane != null) { - contentPane.add(otherContentPane, BorderLayout.CENTER); + contentPane.add(otherContentPane); } return contentPane; } public JPanel setValidatePane(){ - JPanel otherContentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - JPanel jPanel = GUICoreUtils.createFlowPane(new JComponent[]{directWriteCheckBox}, FlowLayout.LEFT, 0); - otherContentPane.add(jPanel, BorderLayout.NORTH); + JPanel otherContentPane = column(LayoutConstants.VERTICAL_GAP).getComponent(); + otherContentPane.add(directWriteCheckBox); return otherContentPane; } diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/FieldEditorDefinePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/FieldEditorDefinePane.java index 7195343767..f5a12312fb 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/FieldEditorDefinePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/FieldEditorDefinePane.java @@ -1,19 +1,20 @@ package com.fr.design.widget.ui; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicBeanPane; import com.fr.design.beans.ErrorMsgTextFieldAdapter; import com.fr.design.beans.UITextFieldAdapter; +import com.fr.design.border.FineBorderFactory; import com.fr.design.constants.LayoutConstants; -import com.fr.design.designer.IntervalConstants; import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.fun.TextFieldAdapterProvider; import com.fr.design.fun.WidgetAdvancedPaneProvider; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.widgettheme.processor.WidgetThemeCreatorPaneAdder; import com.fr.form.ui.FieldEditor; import com.fr.general.GeneralContext; @@ -22,16 +23,18 @@ import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; import com.fr.stable.collections.CollectionUtils; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.List; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; + /** * 字段编辑pane * @@ -47,6 +50,7 @@ public abstract class FieldEditorDefinePane extends Abstr protected final List> extraPaneList = new ArrayList<>(); protected JPanel extraPane; + protected JPanel corePane; protected static double F = TableLayout.FILL; protected static double P = TableLayout.PREFERRED; @@ -56,15 +60,15 @@ public abstract class FieldEditorDefinePane extends Abstr protected void initComponents() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); + corePane = column().getComponent(); JPanel contentPane = this.setFirstContentPane(); - JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - jPanel.add(contentPane, BorderLayout.CENTER); - contentPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); if (contentPane != null) { - UIExpandablePane uiExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 24, jPanel); - this.add(uiExpandablePane, BorderLayout.NORTH); + contentPane.setBorder(new ScaledEmptyBorder(0, 0, 10, 0)); + UIExpandablePane advancedPane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 24, contentPane); + corePane.add(advancedPane); } - this.addValidatePane(); + corePane.add(addValidatePane()); + this.add(corePane, BorderLayout.CENTER); } @@ -86,6 +90,10 @@ public abstract class FieldEditorDefinePane extends Abstr protected void initExtraPane() { initPluginListener(); refreshExtraAdvancedPane(); + if (extraPane == null) { + extraPane = new JPanel(); + extraPane.setVisible(false); + } } protected void refreshExtraAdvancedPane() { @@ -146,41 +154,30 @@ public abstract class FieldEditorDefinePane extends Abstr } - protected void addValidatePane() { - validatePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - final UILabel uiLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Error_Tip")); + protected JPanel addValidatePane() { + validatePane = column(LayoutConstants.VERTICAL_GAP).getComponent(); + final UILabel errorTipLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Error_Tip")); initErrorMsgPane(); allowBlankCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Allow_Null")); - allowBlankCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - JPanel borderPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - final JPanel errorTipPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{uiLabel, errorMsgTextField.getErrorMsgTextField()}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); - errorTipPane.setBorder(BorderFactory.createEmptyBorder(0, IntervalConstants.INTERVAL_L5, 0, 0)); - borderPane.add(errorTipPane, BorderLayout.CENTER); - allowBlankCheckBox.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - boolean isSelected = allowBlankCheckBox.isSelected(); - errorTipPane.setVisible(!isSelected); - } + final JPanel errorTipPane = row( + cell(errorTipLabel).weight(LEFT_WEIGHT), cell(errorMsgTextField.getErrorMsgTextField()).weight(RIGHT_WEIGHT) + ).getComponent(); + allowBlankCheckBox.addItemListener(e -> { + boolean selected = allowBlankCheckBox.isSelected(); + errorTipPane.setVisible(!selected); }); - - errorTipPane.setBorder(BorderFactory.createEmptyBorder(0, IntervalConstants.INTERVAL_L5, 0, 0)); - Component[][] components = new Component[][]{ - new Component[]{allowBlankCheckBox}, - new Component[]{borderPane}, - }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_LASTCOLUMN, 5, 5); - panel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, IntervalConstants.INTERVAL_L6, 0)); - validatePane.add(panel, BorderLayout.NORTH); + validatePane.add(column(LayoutConstants.VERTICAL_GAP, + cell(allowBlankCheckBox), + cell(errorTipPane) + ).getComponent()); JPanel contentPane = this.setValidatePane(); if (contentPane != null) { - validatePane.add(contentPane, BorderLayout.CENTER); + validatePane.add(contentPane); } - - - UIExpandablePane uiExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Validate"), 280, 24, validatePane); - this.add(uiExpandablePane, BorderLayout.CENTER); + UIExpandablePane expandValidatePane = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Basic_Validate"), 280, 24, validatePane); + expandValidatePane.setBorder(FineBorderFactory.createDefaultTopBorder()); + return expandValidatePane; } public JPanel setValidatePane() { diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/IframeEditorDefinePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/IframeEditorDefinePane.java index d97aa6e9fc..a617e2a310 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/IframeEditorDefinePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/IframeEditorDefinePane.java @@ -1,6 +1,7 @@ package com.fr.design.widget.ui; -import com.fr.design.designer.IntervalConstants; +import com.fine.theme.utils.FineUIScale; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.DialogActionListener; import com.fr.design.dialog.UIDialog; import com.fr.design.foldablepane.UIExpandablePane; @@ -10,21 +11,24 @@ import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.form.ui.IframeEditor; import com.fr.log.FineLoggerFactory; import com.fr.stable.ParameterProvider; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingUtilities; -import java.awt.BorderLayout; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; + public class IframeEditorDefinePane extends AbstractDataModify { private static final int P_W = 610; @@ -43,36 +47,29 @@ public class IframeEditorDefinePane extends AbstractDataModify { private void initComponents() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - JPanel contentPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - contentPane.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 0)); - JPanel attr = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); - attr.add(horizontalCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Preference_Horizontal_Scroll_Bar_Visible"))); - attr.add(verticalCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Preference_Vertical_Scroll_Bar_Visible"))); - contentPane.add(attr); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] rowSize = {p, p, p, p}; - double[] columnSize = {p, f}; + horizontalCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Preference_Horizontal_Scroll_Bar_Visible")); + verticalCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Preference_Vertical_Scroll_Bar_Visible")); parameterViewPaneButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit")); parameterViewPaneButton.addActionListener(parameterListener); parameterViewPane = new ReportletParameterViewPane(); - horizontalCheck.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - verticalCheck.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - java.awt.Component[][] coms = { - {horizontalCheck, null}, - {verticalCheck, null}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Form_Url")), srcTextField = new UITextField()}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parameters")), parameterViewPaneButton}}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}}; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(coms, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W3, IntervalConstants.INTERVAL_L1); - - - contentPane.add(panel); + srcTextField = new UITextField(); + + JPanel contentPane = column(LayoutConstants.VERTICAL_GAP, + cell(horizontalCheck), + cell(verticalCheck), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Form_Url"))).weight(LEFT_WEIGHT), + cell(srcTextField).weight(RIGHT_WEIGHT) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parameters"))).weight(LEFT_WEIGHT), + cell(parameterViewPaneButton).weight(RIGHT_WEIGHT) + ) + ).getComponent(); UIExpandablePane uiExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 24, contentPane); - this.add(uiExpandablePane, BorderLayout.NORTH); + this.add(uiExpandablePane); } @@ -101,7 +98,7 @@ public class IframeEditorDefinePane extends AbstractDataModify { parameterViewPane.update(list); } }); - dialog.setSize(P_W, P_H); + dialog.setSize(FineUIScale.scale(new Dimension(P_W, P_H))); dialog.setVisible(true); } }; diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/ListEditorDefinePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/ListEditorDefinePane.java index c198df96b1..d52c2f8ecc 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/ListEditorDefinePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/ListEditorDefinePane.java @@ -4,15 +4,17 @@ import com.fr.data.Dictionary; import com.fr.design.data.DataCreatorUI; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.widget.accessibles.AccessibleDictionaryEditor; import com.fr.form.ui.ListEditor; -import javax.swing.BorderFactory; import javax.swing.JPanel; -import java.awt.BorderLayout; import java.awt.Component; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.flex; + + public class ListEditorDefinePane extends WriteUnableRepeatEditorPane { private UICheckBox needHeadCheckBox; private AccessibleDictionaryEditor dictPane; @@ -34,12 +36,8 @@ public class ListEditorDefinePane extends WriteUnableRepeatEditorPane { private DictionaryComboBox acceptType; @@ -34,15 +34,12 @@ public class MultiFileEditorPane extends FieldEditorDefinePane @Override protected JPanel setFirstContentPane() { - JPanel contenter = new JPanel(new BorderLayout()); + JPanel center = new JPanel(new BorderLayout()); singleFileCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Single_File_Upload")); UIComponentUtils.setLineWrap(singleFileCheckBox); - singleFileCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); acceptType = new DictionaryComboBox(DictionaryConstants.acceptTypes, DictionaryConstants.fileTypeDisplays); -// acceptType.setPreferredSize(new Dimension(100, 20)); fileSizeField = new UISpinner(0, Integer.MAX_VALUE, 1, -1); - fileSizeField.setPreferredSize(new Dimension(140, 20)); JPanel fileSizePane = new JPanel(new BorderLayout()); UILabel fileTypeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_File_Type")); @@ -50,20 +47,17 @@ public class MultiFileEditorPane extends FieldEditorDefinePane fileSizePane.add(fileSizeField, BorderLayout.CENTER); fileSizePane.add(new UILabel(" KB"), BorderLayout.EAST); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - Component[][] components = new Component[][]{ - new Component[]{singleFileCheckBox, null}, - new Component[]{fileTypeLabel, acceptType}, - new Component[]{fileSizeLabel, fileSizePane}, - }; - double[] rowSize = {p, p, p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}}; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - contenter.add(panel, BorderLayout.CENTER); + center.add(column(LayoutConstants.VERTICAL_GAP, + cell(singleFileCheckBox), + row( + cell(fileTypeLabel).weight(LEFT_WEIGHT), cell(acceptType).weight(RIGHT_WEIGHT) + ), + row( + cell(fileSizeLabel).weight(LEFT_WEIGHT), cell(fileSizePane).weight(RIGHT_WEIGHT) + ) + ).getComponent()); - return contenter; + return center; } @Override diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/NumberEditorDefinePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/NumberEditorDefinePane.java index 8285abbf30..91fb5dc219 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/NumberEditorDefinePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/NumberEditorDefinePane.java @@ -1,19 +1,14 @@ package com.fr.design.widget.ui; -import javax.swing.JPanel; -import javax.swing.SwingConstants; - -import com.fr.design.ExtraDesignClassManager; -import com.fr.design.beans.BasicBeanPane; -import com.fr.design.designer.IntervalConstants; -import com.fr.design.fun.WidgetAdvancedPaneProvider; -import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.widget.component.NumberEditorValidatePane; import com.fr.form.ui.NumberEditor; -import java.awt.Component; -import java.util.Set; + +import javax.swing.JPanel; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; public class NumberEditorDefinePane extends FieldEditorDefinePane { /** @@ -38,15 +33,21 @@ public class NumberEditorDefinePane extends FieldEditorDefinePane JPanel content = FRGUIPaneFactory.createBorderLayout_S_Pane(); waterMarkDictPane = new WaterMarkDictPane(); initExtraPane(); - Component[][] components = new Component[][]{ - new Component[]{waterMarkDictPane, null}, - new Component[]{extraPane, null} - }; - double[] rowSize = {P, P}; - double[] columnSize = {P, F}; - int[][] rowCount = {{1, 1}, {1, 1}}; - final JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - content.add(panel); + + if (extraPane == null) { + content.add( + column(VERTICAL_GAP, + cell(waterMarkDictPane) + ).getComponent() + ); + } else { + content.add( + column(VERTICAL_GAP, + cell(waterMarkDictPane), + cell(extraPane) + ).getComponent() + ); + } return content; } diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/RadioGroupDefinePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/RadioGroupDefinePane.java index 22f7a31d5b..d2d0fd3cf8 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/RadioGroupDefinePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/RadioGroupDefinePane.java @@ -1,20 +1,13 @@ package com.fr.design.widget.ui; import javax.swing.JPanel; -import javax.swing.SwingConstants; -import com.fr.design.ExtraDesignClassManager; -import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.LayoutConstants; import com.fr.design.data.DataCreatorUI; -import com.fr.design.designer.IntervalConstants; -import com.fr.design.fun.WidgetAdvancedPaneProvider; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayoutHelper; import com.fr.form.ui.RadioGroup; -import java.awt.Component; -import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; public class RadioGroupDefinePane extends FieldEditorDefinePane { @@ -34,17 +27,11 @@ public class RadioGroupDefinePane extends FieldEditorDefinePane { protected JPanel setFirstContentPane() { buttonGroupDictPane = new ButtonGroupDictPane(); initExtraPane(); - Component[][] components = new Component[][]{ - new Component[]{buttonGroupDictPane, null}, - new Component[]{extraPane, null} - }; - double[] rowSize = {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, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - JPanel content = FRGUIPaneFactory.createBorderLayout_S_Pane(); - content.add(panel); - return content; + + return column(LayoutConstants.VERTICAL_GAP, + cell(buttonGroupDictPane), + cell(extraPane) + ).getComponent(); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/TextFieldEditorDefinePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/TextFieldEditorDefinePane.java index abc7a382d2..cef2f8849c 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/TextFieldEditorDefinePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/TextFieldEditorDefinePane.java @@ -1,23 +1,21 @@ package com.fr.design.widget.ui; import com.fr.design.ExtraDesignClassManager; -import com.fr.design.beans.BasicBeanPane; -import com.fr.design.designer.IntervalConstants; +import com.fr.design.constants.LayoutConstants; import com.fr.design.fun.RegPaneProvider; -import com.fr.design.fun.WidgetAdvancedPaneProvider; import com.fr.design.gui.frpane.RegFieldPane; import com.fr.design.gui.frpane.RegPane; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayoutHelper; import com.fr.form.ui.TextEditor; import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; import javax.swing.JPanel; -import java.awt.Component; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; -import java.util.Set; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; + public class TextFieldEditorDefinePane extends FieldEditorDefinePane { protected RegFieldPane regPane; @@ -38,13 +36,11 @@ public class TextFieldEditorDefinePane extends FieldEditorDefinePane regPane.removeRegChangeListener(this); } }; - final RegPane.PhoneRegListener pl = new RegPane.PhoneRegListener() { - public void phoneRegChangeAction(RegPane.PhoneRegEvent e) { - if (StringUtils.isNotEmpty(e.getPhoneRegString()) - && StringUtils.isEmpty(waterMarkDictPane.getWaterMark())) { - waterMarkDictPane.setWaterMark(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Example") + ":" + e.getPhoneRegString()); - regPane.addRegChangeListener(rl); - } + final RegPane.PhoneRegListener pl = e -> { + if (StringUtils.isNotEmpty(e.getPhoneRegString()) + && StringUtils.isEmpty(waterMarkDictPane.getWaterMark())) { + waterMarkDictPane.setWaterMark(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Example") + ":" + e.getPhoneRegString()); + regPane.addRegChangeListener(rl); } }; regPane.addPhoneRegListener(pl); @@ -57,17 +53,11 @@ public class TextFieldEditorDefinePane extends FieldEditorDefinePane } }); initExtraPane(); - Component[][] components = new Component[][]{ - new Component[]{waterMarkDictPane, null}, - new Component[]{extraPane, null} - }; - double[] rowSize = {P, P}; - double[] columnSize = {P, F}; - int[][] rowCount = {{1, 1}, {1, 1}}; - final JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - JPanel content = FRGUIPaneFactory.createBorderLayout_S_Pane(); - content.add(panel); - return content; + + return column(LayoutConstants.VERTICAL_GAP, + cell(waterMarkDictPane), + cell(extraPane) + ).getComponent(); } public JPanel setValidatePane() { diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/TreeComboBoxEditorDefinePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/TreeComboBoxEditorDefinePane.java index 54bf00a388..799c9699e8 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/TreeComboBoxEditorDefinePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/TreeComboBoxEditorDefinePane.java @@ -1,25 +1,21 @@ package com.fr.design.widget.ui; -import java.awt.*; -import java.util.Set; - -import javax.swing.BorderFactory; import javax.swing.JPanel; -import com.fr.design.ExtraDesignClassManager; -import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.LayoutConstants; import com.fr.design.data.DataCreatorUI; -import com.fr.design.designer.IntervalConstants; -import com.fr.design.fun.WidgetAdvancedPaneProvider; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itree.refreshabletree.TreeRootPane; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.widget.accessibles.AccessibleTreeModelEditor; import com.fr.design.widget.component.ReturnTypePane; import com.fr.form.ui.TreeComboBoxEditor; import com.fr.form.ui.TreeEditor; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; public class TreeComboBoxEditorDefinePane extends CustomWritableRepeatEditorPane { protected AccessibleTreeModelEditor treeSettingPane; @@ -34,12 +30,8 @@ public class TreeComboBoxEditorDefinePane extends CustomWritableRepeatEditorPane @Override protected JPanel setForthContentPane() { - JPanel content = FRGUIPaneFactory.createBorderLayout_L_Pane(); treeRootPane = new TreeRootPane(); returnTypePane = new ReturnTypePane(); - content.add(treeRootPane, BorderLayout.NORTH); - returnTypePane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); - content.add(returnTypePane, BorderLayout.CENTER); treeRootPane.addTreeAttrChangeListener(treeAttr -> { boolean showReturnTypePane = treeAttr.isMultipleSelection() && !treeAttr.isReturnFullPath(); returnTypePane.setVisible(showReturnTypePane); @@ -47,21 +39,22 @@ public class TreeComboBoxEditorDefinePane extends CustomWritableRepeatEditorPane returnTypePane.setReturnType(ReturnTypePane.ReturnType.ARRAY); } }); - content.add(treeRootPane, BorderLayout.NORTH); - return content; + return column(LayoutConstants.VERTICAL_GAP, + cell(treeRootPane), + cell(returnTypePane) + ).getComponent(); } @Override protected JPanel setFirstContentPane() { treeSettingPane = new AccessibleTreeModelEditor(); - JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - JPanel north = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Create_Tree")), treeSettingPane}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W2, IntervalConstants.INTERVAL_L1); - north.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); - JPanel center = super.setFirstContentPane(); - jPanel.add(north, BorderLayout.NORTH); - jPanel.add(center, BorderLayout.CENTER); - return jPanel; + return column(LayoutConstants.VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Create_Tree"))).weight(LEFT_WEIGHT), + cell(treeSettingPane).weight(RIGHT_WEIGHT) + ), + cell(super.setFirstContentPane()) + ).getComponent(); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/TreeEditorDefinePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/TreeEditorDefinePane.java index 1abc355f94..e722f72ebf 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/TreeEditorDefinePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/TreeEditorDefinePane.java @@ -1,23 +1,22 @@ package com.fr.design.widget.ui; -import com.fr.design.ExtraDesignClassManager; -import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.LayoutConstants; import com.fr.design.data.DataCreatorUI; -import com.fr.design.designer.IntervalConstants; -import com.fr.design.fun.WidgetAdvancedPaneProvider; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itree.refreshabletree.TreeRootPane; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.widget.accessibles.AccessibleTreeModelEditor; import com.fr.design.widget.component.ReturnTypePane; import com.fr.form.ui.TreeEditor; -import javax.swing.*; -import java.awt.*; -import java.util.Set; +import javax.swing.JPanel; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; /* @@ -63,29 +62,24 @@ public class TreeEditorDefinePane extends FieldEditorDefinePane { } protected JPanel setSecondContentPane() { + JPanel contentPane = column(LayoutConstants.VERTICAL_GAP).getComponent(); + accessibleTreeModelEditor = new AccessibleTreeModelEditor(); - JPanel createTree = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Create_Tree")), accessibleTreeModelEditor}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W2, IntervalConstants.INTERVAL_L1); - createTree.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); - JPanel contentPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); - JPanel contenter = FRGUIPaneFactory.createBorderLayout_S_Pane(); - initExtraPane(); - double[] rowSize = {P, P}; - double[] columnSize = {P, F}; - int[][] rowCount = {{1, 1},{1, 1}}; - Component[][] components = new Component[][]{ - new Component[]{createTree, null}, - new Component[]{extraPane, null}, - }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_L2, IntervalConstants.INTERVAL_L1); - contentPane.add(contenter,BorderLayout.NORTH); removeRepeatCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Remove_Repeat_Data"), false); - removeRepeatCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - contenter.add(panel, BorderLayout.NORTH); - contenter.add(removeRepeatCheckBox, BorderLayout.CENTER); + initExtraPane(); + + contentPane.add(column(LayoutConstants.VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Create_Tree"))).weight(LEFT_WEIGHT), + cell(accessibleTreeModelEditor).weight(RIGHT_WEIGHT) + ), + cell(extraPane), + cell(removeRepeatCheckBox) + ).getComponent()); + JPanel otherContentPane = this.setThirdContentPane(); if (otherContentPane != null) { - contentPane.add(otherContentPane,BorderLayout.CENTER); + contentPane.add(otherContentPane); } return contentPane; } @@ -96,12 +90,8 @@ public class TreeEditorDefinePane extends FieldEditorDefinePane { } protected JPanel setThirdContentPane() { - JPanel content = FRGUIPaneFactory.createBorderLayout_L_Pane(); treeRootPane = new TreeRootPane(); returnTypePane = new ReturnTypePane(); - content.add(treeRootPane, BorderLayout.NORTH); - returnTypePane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); - content.add(returnTypePane, BorderLayout.CENTER); treeRootPane.addTreeAttrChangeListener(treeAttr -> { boolean showReturnTypePane = treeAttr.isMultipleSelection() && !treeAttr.isReturnFullPath(); returnTypePane.setVisible(showReturnTypePane); @@ -109,8 +99,10 @@ public class TreeEditorDefinePane extends FieldEditorDefinePane { returnTypePane.setReturnType(ReturnTypePane.ReturnType.ARRAY); } }); - //content.add(treeRootPane, BorderLayout.NORTH); - return content; + return column(LayoutConstants.VERTICAL_GAP, + cell(treeRootPane), + cell(returnTypePane) + ).getComponent(); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/WaterMarkDictPane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/WaterMarkDictPane.java index dc1bf72ca0..11ef829032 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/WaterMarkDictPane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/WaterMarkDictPane.java @@ -1,17 +1,18 @@ package com.fr.design.widget.ui; -import com.fr.design.designer.IntervalConstants; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.form.ui.WaterMark; - -import javax.swing.*; -import java.awt.*; +import javax.swing.JPanel; +import java.awt.BorderLayout; import java.awt.event.KeyListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; + public class WaterMarkDictPane extends JPanel { private UITextField waterMarkTextField; @@ -21,17 +22,12 @@ public class WaterMarkDictPane extends JPanel { waterMarkTextField = new UITextField(); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_WaterMark")), waterMarkTextField}, - }; - double[] rowSize = {p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}}; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W3, IntervalConstants.INTERVAL_L1); -// panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); - this.add(panel, BorderLayout.CENTER); + this.add( + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_WaterMark"))).weight(LEFT_WEIGHT), + cell(waterMarkTextField).weight(RIGHT_WEIGHT) + ).getComponent() + ); } public void populate(WaterMark waterMark) { diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/WritableRepeatEditorPane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/WritableRepeatEditorPane.java index 8bb502d18c..750b2c47e2 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/WritableRepeatEditorPane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/WritableRepeatEditorPane.java @@ -1,10 +1,11 @@ package com.fr.design.widget.ui; -import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.constants.LayoutConstants; import com.fr.form.ui.WriteAbleRepeatEditor; -import javax.swing.*; -import java.awt.*; +import javax.swing.JPanel; + +import static com.fine.swing.ui.layout.Layouts.column; public abstract class WritableRepeatEditorPane extends DirectWriteEditorDefinePane { @@ -15,11 +16,10 @@ public abstract class WritableRepeatEditorPane @Override protected JPanel setSecondContentPane() { - JPanel contentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - contentPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + JPanel contentPane = column(LayoutConstants.VERTICAL_GAP).getComponent(); JPanel otherContentPane = this.setThirdContentPane(); if (otherContentPane != null) { - contentPane.add(otherContentPane,BorderLayout.CENTER); + contentPane.add(otherContentPane); } return contentPane; } diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/WriteUnableRepeatEditorPane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/WriteUnableRepeatEditorPane.java index fdfeb06a85..a65bc043fd 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/WriteUnableRepeatEditorPane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/WriteUnableRepeatEditorPane.java @@ -1,17 +1,18 @@ package com.fr.design.widget.ui; -import java.awt.*; - -import javax.swing.BorderFactory; +import java.awt.Component; import javax.swing.JPanel; -import com.fr.design.designer.IntervalConstants; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.form.ui.WriteUnableRepeatEditor; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; + public abstract class WriteUnableRepeatEditorPane extends FieldEditorDefinePane { // richer:是否去除重复的值 @@ -23,26 +24,21 @@ public abstract class WriteUnableRepeatEditorPane extends AbstractExtraButtonPane { private DefineAppendColumnRowPane defineColumnRowPane; -// @Override -// protected void initComponents() { -// super.initComponents(); -// defineColumnRowPane = new DefineAppendColumnRowPane(); -// add(defineColumnRowPane, BorderLayout.SOUTH); -// } - @Override protected Component createCenterPane() { defineColumnRowPane = new DefineAppendColumnRowPane(); diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/btn/ButtonSytleDefinedPane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/btn/ButtonSytleDefinedPane.java index 4483b3a842..830c2afe05 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/btn/ButtonSytleDefinedPane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/btn/ButtonSytleDefinedPane.java @@ -7,9 +7,8 @@ import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; 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.AccessibleBackgroundEditor; import com.fr.design.style.background.BackgroundButtonPane; import com.fr.form.ui.FreeButton; @@ -20,12 +19,19 @@ import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JPanel; import javax.swing.SwingUtilities; -import java.awt.BorderLayout; -import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; + public class ButtonSytleDefinedPane extends BasicPane { protected AccessibleBackgroundEditor initBackgroundPane; protected AccessibleBackgroundEditor overBackgroundPane; @@ -40,20 +46,30 @@ public class ButtonSytleDefinedPane extends BasicPane { initBackgroundPane = new AccessibleBackgroundEditor(); overBackgroundPane = new AccessibleBackgroundEditor(); clickBackgroundPane = new AccessibleBackgroundEditor(); - double f = TableLayout.FILL; - final double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1},{1, 1},{1, 1}}; - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Background_Initial")), initBackgroundPane}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Background_Over")), overBackgroundPane}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Background_Click")), clickBackgroundPane}, - }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, 7, 7); - panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); - this.add(panel, BorderLayout.CENTER); - + this.add(row( + column(VERTICAL_GAP, + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Style_Background_Setting"))).weight(1), + flex(1), + flex(1) + ).weight(LEFT_WEIGHT), + column(VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Background_Initial"))).weight(1), + fix(2), + cell(initBackgroundPane).weight(1) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Background_Over"))).weight(1), + fix(2), + cell(overBackgroundPane).weight(1) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Background_Click"))).weight(1), + fix(2), + cell(clickBackgroundPane).weight(1) + ) + ).weight(RIGHT_WEIGHT) + ).getComponent()); } public void populate(FreeButton button) { diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/btn/DefineAppendColumnRowPane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/btn/DefineAppendColumnRowPane.java index 66081305a8..41c6d7b518 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/btn/DefineAppendColumnRowPane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/btn/DefineAppendColumnRowPane.java @@ -1,23 +1,22 @@ package com.fr.design.widget.ui.btn; -import java.awt.Color; -import java.awt.Component; - -import javax.swing.BorderFactory; - -import com.fr.design.designer.IntervalConstants; +import com.fine.theme.utils.FineUIStyle; import com.fr.design.gui.ilable.UILabel; -import javax.swing.JPanel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.dialog.BasicPane; import com.fr.design.editor.editor.ColumnRowEditor; import com.fr.report.web.button.write.AppendRowButton; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; + /** * Created by IntelliJ IDEA. Author : Richer Version: 6.5.6 Date : 11-11-16 Time * : 上午9:34 @@ -32,27 +31,25 @@ public class DefineAppendColumnRowPane extends BasicPane { } private void initComponents() { - double f = TableLayout.FILL; - - double p = TableLayout.PREFERRED; - double rowSize[] = { p, p ,p}; - double columnSize[] = { p, f}; crEditor = new ColumnRowEditor(); jNumberEditor = new UISpinner(0, 100 , 1, 0); - rowCountLable = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Edit_Row_Count")); - JPanel lpane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - lpane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Append_Delete_Row_Message")); - label.setForeground(new Color(0x8F8F92)); - lpane.add(label); - Component[][] components = { { new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Specify_Cell")), crEditor }, { rowCountLable, jNumberEditor } ,{lpane,null}}; - JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L2, IntervalConstants.INTERVAL_L1); - contentPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); + UILabel tipLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Append_Delete_Row_Message")); + FineUIStyle.setStyle(tipLabel, FineUIStyle.LABEL_TIP); this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.add(contentPane); + this.add(column(VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Specify_Cell"))).weight(LEFT_WEIGHT), + cell(crEditor).weight(RIGHT_WEIGHT) + ), + row( + cell(rowCountLable).weight(LEFT_WEIGHT), + cell(jNumberEditor).weight(RIGHT_WEIGHT) + ), + cell(tipLabel) + ).getComponent()); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/btn/DefineDeleteColumnRowPane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/btn/DefineDeleteColumnRowPane.java index e4ef8c5af5..428148960c 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/btn/DefineDeleteColumnRowPane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/btn/DefineDeleteColumnRowPane.java @@ -1,26 +1,25 @@ package com.fr.design.widget.ui.btn; -import javax.swing.*; - -import com.fr.design.designer.IntervalConstants; +import com.fine.theme.utils.FineUIStyle; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.dialog.BasicPane; import com.fr.design.editor.editor.ColumnRowEditor; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; - import com.fr.report.web.button.write.DeleteRowButton; -import java.awt.*; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; /** * Created by IntelliJ IDEA. Author : Richer Version: 6.5.6 Date : 11-11-16 Time * : 上午10:56 */ public class DefineDeleteColumnRowPane extends BasicPane { - private static final int BORDER_LEFT = -10; private ColumnRowEditor crEditor; @@ -29,22 +28,20 @@ public class DefineDeleteColumnRowPane extends BasicPane { } private void initComponents() { - double f = TableLayout.FILL; - - double p = TableLayout.PREFERRED; - double rowSize[] = { p, p}; - double columnSize[] = { p, f}; + crEditor = new ColumnRowEditor(); crEditor = new ColumnRowEditor(); UILabel messageLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Append_Delete_Row_Message")); - messageLabel.setForeground(new Color(0x8F8F92)); - Component[][] components = { - { new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Specify_Cell")), crEditor }, - { messageLabel, null}}; - JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L2, IntervalConstants.INTERVAL_L1); - contentPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); - setLayout(FRGUIPaneFactory.createBorderLayout()); - - add(contentPane); + FineUIStyle.setStyle(messageLabel, FineUIStyle.LABEL_TIP); + + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.add(column(VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Specify_Cell"))).weight(LEFT_WEIGHT), + cell(crEditor).weight(RIGHT_WEIGHT) + ), + cell(messageLabel) + + ).getComponent()); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/btn/TreeNodeToogleButtonDefinePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/btn/TreeNodeToogleButtonDefinePane.java index 1796b3e054..5228a69d80 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/btn/TreeNodeToogleButtonDefinePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/btn/TreeNodeToogleButtonDefinePane.java @@ -1,11 +1,8 @@ package com.fr.design.widget.ui.btn; -import com.fr.design.designer.IntervalConstants; import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.form.ui.Button; import com.fr.report.web.button.form.TreeNodeToggleButton; @@ -13,6 +10,11 @@ import com.fr.report.web.button.form.TreeNodeToggleButton; import javax.swing.*; import java.awt.*; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; + /** * 树节点按钮 * @@ -28,19 +30,14 @@ public class TreeNodeToogleButtonDefinePane exte protected void initComponents() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double rowSize[] = {p}; - double columnSize[] = {p, f}; initExtraPane(); - Component[][] n_components = { - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Button_Type")), createCustomButtonTypeComboBox()}, - }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(n_components, rowSize, columnSize, IntervalConstants.INTERVAL_L2, 8); - JPanel borderPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - borderPanel.add(panel, BorderLayout.CENTER); - panel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, 0, 0)); - UIExpandablePane advancedPane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, borderPanel); + + JPanel panel = row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Button_Type"))).weight(LEFT_WEIGHT), + cell(createCustomButtonTypeComboBox()).weight(RIGHT_WEIGHT) + ).getComponent(); + + UIExpandablePane advancedPane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, panel); this.add(advancedPane); } diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/MultiFileEditorMobilePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/MultiFileEditorMobilePane.java index adfda17c2b..01c5254152 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/MultiFileEditorMobilePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/MultiFileEditorMobilePane.java @@ -2,24 +2,22 @@ package com.fr.design.widget.ui.mobile; import com.fr.base.mobile.FileUploadModeState; import com.fr.base.mobile.MultiFileUploaderMobileAttr; -import com.fr.design.constants.LayoutConstants; import com.fr.design.designer.properties.items.Item; import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.widget.mobile.WidgetMobilePane; import com.fr.form.ui.MultiFileEditor; import com.fr.form.ui.Widget; - -import javax.swing.BorderFactory; import javax.swing.JPanel; -import javax.swing.SwingConstants; import java.awt.BorderLayout; -import java.awt.Component; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; /** * Created by plough on 2018/4/25. @@ -60,20 +58,10 @@ public class MultiFileEditorMobilePane extends WidgetMobilePane { private UIExpandablePane getMobileSettingsPane() { initUploadModeComboBox(); - // 以后可能会扩展 - Component[][] components = new Component[][]{ - new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Upload_Mode"), SwingConstants.LEFT), uploadModeComboBox} - }; - - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] rowSize = {p}; - double[] columnSize = {p,f}; - int[][] rowCount = {{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); + final JPanel panelWrapper = row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Upload_Mode"))).weight(LEFT_WEIGHT), + cell(uploadModeComboBox).weight(RIGHT_WEIGHT) + ).getComponent(); return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Terminal"), 280, 20, panelWrapper); } diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextEditorMobilePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextEditorMobilePane.java index 7c836389d7..5f0fb2fb70 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextEditorMobilePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextEditorMobilePane.java @@ -12,6 +12,9 @@ import com.fr.form.ui.Widget; import javax.swing.JPanel; import java.awt.BorderLayout; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; + /** * 文本控件移动端属性面板 * @@ -32,12 +35,13 @@ public class TextEditorMobilePane extends WidgetMobilePane { @Override protected void init() { - JPanel container = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); this.setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane(); settingPane = new MobileTextFieldInputSettingPane(); textSettingPane = new MobileTextEditSettingPane(); - container.add(settingPane); - container.add(textSettingPane); + container.add(column( + cell(settingPane),cell(textSettingPane) + ).getComponent()); this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, container), BorderLayout.NORTH); } From 953ea6a77c7ab649a3dd185633ecf3d5ca9b6e15 Mon Sep 17 00:00:00 2001 From: vito Date: Mon, 15 Jan 2024 17:05:12 +0800 Subject: [PATCH 129/302] =?UTF-8?q?REPORT-99485=20=E9=80=82=E9=85=8DFVS?= =?UTF-8?q?=E6=9A=82=E6=97=B6=E7=BB=B4=E6=8C=81=E5=8F=AF=E7=94=A8=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/file/HistoryTemplateListCache.java | 4 +- .../file/MultiTemplateTabMenuFactory.java | 23 +-- .../fr/design/file/MultiTemplateTabPane.java | 158 +++--------------- .../fr/design/file/MultiTemplateTabUtils.java | 59 ------- .../fr/design/file/SaveSomeTemplatePane.java | 18 +- .../design/file/MultiTemplateTabPaneTest.java | 113 ++++++------- 6 files changed, 89 insertions(+), 286 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/design/file/MultiTemplateTabUtils.java 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 f895a4f5b4..ab5c485cc8 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 @@ -298,9 +298,7 @@ public class HistoryTemplateListCache implements CallbackEvent { int index = iterator.nextIndex(); if (size == index + 1 && index > 0) { //如果删除的是后一个Tab,则定位到前一个 - MultiTemplateTabPane.getInstance().setSelectedIndex( - MultiTemplateTabPane.getInstance().calNextShowJTemplateIndex(index - 1)); - + MultiTemplateTabPane.getInstance().setSelectedIndex(index - 1); } } } diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java index 66b7b27af9..251336b52c 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java @@ -6,10 +6,8 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.JTemplate; import com.fr.stable.collections.CollectionUtils; -import javax.swing.JPanel; import javax.swing.SwingConstants; import java.awt.Component; -import java.awt.Dimension; import java.util.List; @@ -23,8 +21,6 @@ import java.util.List; public class MultiTemplateTabMenuFactory { - private static final int ITEM_SIZE = 25; - private UIScrollPopUpMenu menu = null; private static MultiTemplateTabMenuFactory INSTANCE = new MultiTemplateTabMenuFactory(); @@ -62,29 +58,14 @@ public class MultiTemplateTabMenuFactory { private UIMenuItem initCloseOther() { UIMenuItem closeOther = new UIMenuItem(Toolkit.i18nText("Fine-Design_Close_Other_templates")); closeOther.setHorizontalAlignment(SwingConstants.CENTER); - String currentOperator = getCurrentTabOperatorType(); - closeOther.addActionListener(e -> MultiTemplateTabPane.getInstance().closeOtherByOperatorType(currentOperator)); - if (MultiTemplateTabPane.getInstance().getOpenedJTemplatesByOperator(currentOperator).size() <= 1) { + closeOther.addActionListener(e -> MultiTemplateTabPane.getInstance().closeOther()); + if (MultiTemplateTabPane.getInstance().getOpenedJTemplates().size() <= 1) { closeOther.setEnabled(false); } return closeOther; } - /** - * 美观用 - */ - private JPanel createEmptyRow() { - return new JPanel() { - @Override - public Dimension getPreferredSize() { - Dimension d = super.getPreferredSize(); - d.height = 1; - return d; - } - }; - } - /** * 创建 当前分类模板 item数组 */ diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 3f1b05d42d..069bbda57a 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -50,8 +50,6 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.util.Collections; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; import static com.fine.theme.utils.FineClientProperties.BUTTON_TYPE_TOOLBAR_BUTTON; import static com.fine.theme.utils.FineUIScale.scale; @@ -227,19 +225,17 @@ public class MultiTemplateTabPane extends Row { /** * 判断模板是否可以关闭,两个条件:1、是否满足CloseOption里面的条件(在左侧、在右侧等)2、是否和当前正在编辑模板属于同一种模板tab操作类型 * - * @param closeJTemplate * @param tplIndex * @param i * @return */ - public boolean shouldClose(JTemplate closeJTemplate, int tplIndex, int i) { + public boolean shouldClose(int tplIndex, int i) { boolean matchOption = this.closeOption.shouldClose(tplIndex, i); JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); if (!JTemplate.isValid(currentTemplate)) { return matchOption; } - return matchOption && ComparatorUtils.equals(closeJTemplate.getTemplateTabOperatorType(), - currentTemplate.getTemplateTabOperatorType()); + return matchOption; } } @@ -365,7 +361,7 @@ public class MultiTemplateTabPane extends Row { JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); closeTemplate(closeCondition, templates, currentTemplate); - if (openedTemplate.size() == 0) { + if (openedTemplate.isEmpty()) { DesignerContext.getDesignerFrame().addAndActivateJTemplate(); } else if (option == CloseOption.All) { //openedTemplate(0)是JVirtualTemplate时需重新打开 @@ -380,7 +376,7 @@ public class MultiTemplateTabPane extends Row { private void closeTemplate(CloseCondition closeCondition, JTemplate[] templates, JTemplate currentTemplate) { for (int i = 0; i < templates.length; i++) { - if (closeCondition.shouldClose(templates[i], tplIndex, i)) { + if (closeCondition.shouldClose(tplIndex, i)) { JTemplate jTemplate = templates[i]; if (jTemplate == currentTemplate) { currentTemplate = option == CloseOption.All ? null : templates[tplIndex]; @@ -415,20 +411,18 @@ public class MultiTemplateTabPane extends Row { /** * 关闭所有指定模板tab操作类型的模板 - * - * @param operatorType */ - public void closeOtherByOperatorType(String operatorType) { + public void closeOther() { JTemplate currentEditingTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(false); - if (saveSomeTempaltePane.showSavePane(null, false, true)) { + SaveSomeTemplatePane saveSomeTemplatePane = new SaveSomeTemplatePane(false); + if (saveSomeTemplatePane.showSavePane(null, false, true)) { List> openedTemplate = HistoryTemplateListCache.getInstance().getHistoryList(); JTemplate[] templates = new JTemplate[openedTemplate.size()]; for (int i = 0; i < openedTemplate.size(); i++) { templates[i] = openedTemplate.get(i); } - closeTemplate(templates, currentEditingTemplate, operatorType); + closeTemplate(templates, currentEditingTemplate); DesignerContext.getDesignerFrame().activateJTemplate(currentEditingTemplate); MultiTemplateTabPane.getInstance().repaint(); @@ -439,14 +433,10 @@ public class MultiTemplateTabPane extends Row { * 关闭指定的非当前编辑模板 * * @param templates - * @param operatorType */ - private static void closeTemplate(JTemplate[] templates, JTemplate currentEditingTemplate, String operatorType) { - for (int i = 0; i < templates.length; i++) { - JTemplate jTemplate = templates[i]; - boolean needClose = ComparatorUtils.equals(operatorType, jTemplate.getTemplateTabOperatorType()) - && jTemplate != currentEditingTemplate; - if (!needClose) { + private static void closeTemplate(JTemplate[] templates, JTemplate currentEditingTemplate) { + for (JTemplate jTemplate : templates) { + if (jTemplate == currentEditingTemplate) { continue; } MultiTemplateTabPane.getInstance().closeFormat(jTemplate); @@ -471,11 +461,6 @@ public class MultiTemplateTabPane extends Row { } - - private String tempalteShowName(JTemplate template) { - return template.getTabShowName(template); - } - public String getTemplateShowNameByIndex(int index) { JTemplate template = openedTemplate.get(index); return template.getTabShowName(template); @@ -566,67 +551,14 @@ public class MultiTemplateTabPane extends Row { minPaintIndex = 0; maxPaintIndex = openedTemplate.size() - 1; } - //需要根据每个tab的宽度重新check下实际的maxPaintIndex和minPaintIndex - checkActualPaintIndex(); - } - - /** - * 先计算出需要补充的tab个数 - * - * @return - */ - private int calTabCountComplemented() { - int a = 0; - for (int i = minPaintIndex; i <= maxPaintIndex; i++) { - JTemplate template = openedTemplate.get(i); - if (!showJTemplateTab(template)) { - a++; - } - } - return a; } /** - * 由于可能存在宽度为0的tab,所以这边需要重新check下,先往后补,再往前补 + * 个数小于最多能容纳的个数的情况下,看看宽度每个要画多少 */ - private void checkActualPaintIndex() { - int tabCount = calTabCountComplemented(); - if (tabCount == 0) { - return; - } - if (maxPaintIndex < openedTemplate.size() - 1) { - for (int i = maxPaintIndex + 1; i < openedTemplate.size(); i++) { - JTemplate template = openedTemplate.get(i); - if (showJTemplateTab(template)) { - tabCount--; - } - maxPaintIndex++; - if (tabCount == 0) { - return; - } - } - } - if (minPaintIndex > 0) { - for (int i = minPaintIndex - 1; i >= 0; i--) { - JTemplate template = openedTemplate.get(i); - if (showJTemplateTab(template)) { - tabCount--; - } - minPaintIndex--; - if (tabCount == 0) { - return; - } - } - } - } - - - //个数小于最多能容纳的个数的情况下,看看宽度每个要画多少 private void calculateRealAverageWidth(double maxwidth, int templateNum) { - JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - List> showTemplates = getOpenedJTemplatesByOperator(jTemplate.getTemplateTabOperatorType()); - + List> showTemplates = getOpenedJTemplates(); int num = Math.min(showTemplates.size(), templateNum); tabWidth = (int) (maxwidth / (num)); if (tabWidth > scale(MAXWIDTH)) { @@ -639,7 +571,6 @@ public class MultiTemplateTabPane extends Row { public void setIsCloseCurrent(boolean isCloseCurrent) { this.isCloseCurrent = isCloseCurrent; - } /** @@ -658,12 +589,9 @@ public class MultiTemplateTabPane extends Row { Toolkit.i18nText("Fine-Design_Basic_Dialog_Prompt"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (returnVal == JOptionPane.YES_OPTION) { CallbackSaveWorker worker = specifiedTemplate.save(); - worker.addSuccessCallback(new Runnable() { - @Override - public void run() { - FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); - closeTpl(specifiedTemplate); - } + worker.addSuccessCallback(() -> { + FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); + closeTpl(specifiedTemplate); }); worker.start(specifiedTemplate.getRuntimeId()); } else if (returnVal == JOptionPane.NO_OPTION) { @@ -738,9 +666,7 @@ public class MultiTemplateTabPane extends Row { // 关闭的模板是当前选中的模板时,需要重新计算下一个待展示的模板的index if (selectedIndex >= maxPaintIndex) { // selectIndex 不会 <0 因为如果关闭的是打开的最后一个模板,那么关闭之后 openedTemplate.isEmpty() = true - selectedIndex = calNextShowJTemplateIndex(selectedIndex - 1); - } else { - selectedIndex = calNextShowJTemplateIndex(selectedIndex); + selectedIndex--; } isCloseCurrent = false; } @@ -757,23 +683,11 @@ public class MultiTemplateTabPane extends Row { } } - /** - * 计算下一个可以展示的模板index - * - * @param currentIndex - * @return - */ - public int calNextShowJTemplateIndex(int currentIndex) { - JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - return MultiTemplateTabUtils.calShowTemplateIndex(currentIndex, openedTemplate, jTemplate.getTemplateTabOperatorType()); - } - private boolean isOverCloseIcon(int evtX) { boolean isOverCloseIcon = false; - // todo - for (int i = 0; i < startX.length; i++) { - if (evtX >= startX[i] && evtX <= startX[i] + clodeIcon.getIconWidth()) { + for (int x : startX) { + if (evtX >= x && evtX <= x + clodeIcon.getIconWidth()) { isOverCloseIcon = true; break; } @@ -791,7 +705,7 @@ public class MultiTemplateTabPane extends Row { private int getTemplateIndex(int evtX) { int textX = scale(LEADING_WIDTH); for (int i = minPaintIndex; i <= maxPaintIndex; i++) { - int textWidth = showJTemplateTab(openedTemplate.get(i)) ? tabWidth : 0; + int textWidth = tabWidth; if (evtX >= textX && evtX < textX + textWidth) { return i; } @@ -971,28 +885,6 @@ public class MultiTemplateTabPane extends Row { } } - /** - * 判断是否显示在tab栏上 - * - * @param jTemplate - * @return - */ - private boolean showJTemplateTab(JTemplate jTemplate) { - JTemplate current = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - return ComparatorUtils.equals(current.getTemplateTabOperatorType(), jTemplate.getTemplateTabOperatorType()); - } - - /** - * 获取tab操作类型的模板 - * - * @param operator - * @return - */ - public List> getOpenedJTemplatesByOperator(String operator) { - return openedTemplate.stream().filter((jTemplate) -> ComparatorUtils.equals(jTemplate.getTemplateTabOperatorType(), operator)) - .collect(Collectors.toList()); - } - /** * 获取所有模板 * @@ -1002,16 +894,6 @@ public class MultiTemplateTabPane extends Row { return Collections.unmodifiableList(openedTemplate); } - /** - * 根据tab操作类型进行分类 - * - * @return - */ - public Map>> getOpenedJTemplatesByCategory() { - return openedTemplate.stream() - .collect(Collectors.groupingBy(JTemplate::getTemplateTabOperatorType)); - } - /** * 返回当前tab数量 * diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabUtils.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabUtils.java deleted file mode 100644 index 344abe64f2..0000000000 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabUtils.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.fr.design.file; - -import com.fr.design.mainframe.JTemplate; -import com.fr.general.ComparatorUtils; - -import java.util.List; -import java.util.function.Predicate; - -public class MultiTemplateTabUtils { - /** - * 计算离currentIndex最近的相同模式的模板index值(优先左边) - * - * @param currentIndex 当前index - * @param openedTemplate 模板list - * @param type 当前显示模式 - * @return - */ - public static int calShowTemplateIndex(int currentIndex, List> openedTemplate, String type) { - if (currentIndex < 0 || currentIndex > openedTemplate.size() - 1) { - return -1; - } - int result = getShowJTemplateTab(currentIndex, openedTemplate, template -> showJTemplateTab(type, template)); - if (result != -1) return result; - return getShowJTemplateTab(currentIndex, openedTemplate, template -> !showJTemplateTab(type, template)); - } - - /** - * 先从左找,再从右找离得最近的满足条件的模板 - * - * @param currentIndex 当前index - * @param openedTemplate 模板list - * @param predicate - * @return - */ - private static int getShowJTemplateTab(int currentIndex, List> openedTemplate, Predicate> predicate) { - for (int i = currentIndex; i >= 0; i--) { - if (predicate.test(openedTemplate.get(i))) { - return i; - } - } - for (int i = currentIndex + 1; i < openedTemplate.size(); i++) { - if (predicate.test(openedTemplate.get(i))) { - return i; - } - } - return -1; - } - - /** - * 是否显示模板 - * - * @param type 模板类型 - * @param jTemplate 模板 - * @return - */ - private static boolean showJTemplateTab(String type, JTemplate jTemplate) { - return ComparatorUtils.equals(type, jTemplate.getTemplateTabOperatorType()); - } -} diff --git a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java index 1517309ef1..de8ca831d9 100644 --- a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java +++ b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java @@ -3,7 +3,6 @@ package com.fr.design.file; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; -import com.fr.design.dialog.FineJOptionPane; import com.fr.design.event.StateChangeListener; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icontainer.UIScrollPane; @@ -15,14 +14,19 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.general.ComparatorUtils; - import com.fr.log.FineLoggerFactory; import org.jetbrains.annotations.Nullable; -import javax.swing.*; -import javax.swing.border.EmptyBorder; -import java.awt.*; -import java.awt.event.*; +import javax.swing.AbstractListModel; +import javax.swing.BorderFactory; +import javax.swing.DefaultListCellRenderer; +import javax.swing.JList; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Window; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.util.ArrayList; /** @@ -215,7 +219,7 @@ public class SaveSomeTemplatePane extends BasicPane { int currentIndex = opendedTemplate.indexOf(currentTemplate); for (int i = 0; i < opendedTemplate.size(); i++) { //满足关闭条件的才继续判断文件是否发生了改动 - boolean needClose = option == null || option.shouldClose(opendedTemplate.get(i), currentIndex, i); + boolean needClose = option == null || option.shouldClose(currentIndex, i); if (judgeSameTabType) { needClose &= ComparatorUtils.equals(opendedTemplate.get(i).getTemplateTabOperatorType(), currentTemplate.getTemplateTabOperatorType()); } diff --git a/designer-base/src/test/java/com/fr/design/file/MultiTemplateTabPaneTest.java b/designer-base/src/test/java/com/fr/design/file/MultiTemplateTabPaneTest.java index c00976abb3..bae2b8ebdf 100644 --- a/designer-base/src/test/java/com/fr/design/file/MultiTemplateTabPaneTest.java +++ b/designer-base/src/test/java/com/fr/design/file/MultiTemplateTabPaneTest.java @@ -14,13 +14,10 @@ import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; import com.fr.plugin.injectable.PluginModule; import junit.framework.TestCase; -import org.junit.Assert; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JPanel; -import java.util.ArrayList; -import java.util.List; public class MultiTemplateTabPaneTest extends TestCase { @Override @@ -28,61 +25,61 @@ public class MultiTemplateTabPaneTest extends TestCase { PluginModule.registerAgent(PluginModule.ExtraDesign, new ExtraDesignClassManager()); } - /** - * 当前显示模式A,传入index左边(含当前)或右边有模式A的模板,返回最近的模式A模板index(优先左边) - */ - public void test_index_left_has_same_mode_temp() { - //当前显示模式A,传入index左边(含当前)有模式A的模板,返回左边最近的模式A模板index - List> openedTemplateList = new ArrayList<>(); - openedTemplateList.add(new A_Mode()); - Assert.assertEquals(0, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); - openedTemplateList.add(new A_Mode()); - Assert.assertEquals(1, MultiTemplateTabUtils.calShowTemplateIndex(1, openedTemplateList, "A_Mode")); - openedTemplateList.add(new B_Mode()); - Assert.assertEquals(1, MultiTemplateTabUtils.calShowTemplateIndex(1, openedTemplateList, "A_Mode")); - } - - public void test_index_left_has_not_but_right_has_same_mode_temp() { - //当前显示模式A,传入index左边没有但是右边有模式A的模板,返回右边最近的模式A模板index - List> openedTemplateList = new ArrayList<>(); - openedTemplateList.add(new B_Mode()); - openedTemplateList.add(new A_Mode()); - Assert.assertEquals(1, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); - openedTemplateList.add(1, new B_Mode()); - openedTemplateList.add(new A_Mode()); - Assert.assertEquals(2, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); - openedTemplateList.add(new A_Mode()); - Assert.assertEquals(2, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); - } - - /** - * 当前显示模式A,没有模式A的模板,左边(含当前)或者右边有其他模式的模板,返回最近的其他模式模式模板index(优先左边) - */ - public void test_no_same_mode_temp_but_index_left_has_other_mode_temp() { - //当前显示模式A,没有模式A的模板,左边(含当前)有其他模式模板,返回左边最近的其他模式模板index - List> openedTemplateList = new ArrayList<>(); - openedTemplateList.add(new B_Mode()); - Assert.assertEquals(0, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); - openedTemplateList.add(new B_Mode()); - Assert.assertEquals(1, MultiTemplateTabUtils.calShowTemplateIndex(1, openedTemplateList, "A_Mode")); - } - - - public void test_has_no_temp() { - //当前显示模式A,没有模式A的模板,也没有其他模式的模板,返回-1 - List> openedTemplateList = new ArrayList<>(); - Assert.assertEquals(-1, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); - } - - - public void test_if_index_less_than_zero_or_more_than_open_temp_size() { - //index<0 或者超出openTemplateList.size时,返回-1 - List> openedTemplateList = new ArrayList<>(); - Assert.assertEquals(-1, MultiTemplateTabUtils.calShowTemplateIndex(-1, openedTemplateList, "A_Mode")); - Assert.assertEquals(-1, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); - openedTemplateList.add(new A_Mode()); - Assert.assertEquals(-1, MultiTemplateTabUtils.calShowTemplateIndex(1, openedTemplateList, "A_Mode")); - } +// /** +// * 当前显示模式A,传入index左边(含当前)或右边有模式A的模板,返回最近的模式A模板index(优先左边) +// */ +// public void test_index_left_has_same_mode_temp() { +// //当前显示模式A,传入index左边(含当前)有模式A的模板,返回左边最近的模式A模板index +// List> openedTemplateList = new ArrayList<>(); +// openedTemplateList.add(new A_Mode()); +// Assert.assertEquals(0, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); +// openedTemplateList.add(new A_Mode()); +// Assert.assertEquals(1, MultiTemplateTabUtils.calShowTemplateIndex(1, openedTemplateList, "A_Mode")); +// openedTemplateList.add(new B_Mode()); +// Assert.assertEquals(1, MultiTemplateTabUtils.calShowTemplateIndex(1, openedTemplateList, "A_Mode")); +// } +// +// public void test_index_left_has_not_but_right_has_same_mode_temp() { +// //当前显示模式A,传入index左边没有但是右边有模式A的模板,返回右边最近的模式A模板index +// List> openedTemplateList = new ArrayList<>(); +// openedTemplateList.add(new B_Mode()); +// openedTemplateList.add(new A_Mode()); +// Assert.assertEquals(1, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); +// openedTemplateList.add(1, new B_Mode()); +// openedTemplateList.add(new A_Mode()); +// Assert.assertEquals(2, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); +// openedTemplateList.add(new A_Mode()); +// Assert.assertEquals(2, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); +// } +// +// /** +// * 当前显示模式A,没有模式A的模板,左边(含当前)或者右边有其他模式的模板,返回最近的其他模式模式模板index(优先左边) +// */ +// public void test_no_same_mode_temp_but_index_left_has_other_mode_temp() { +// //当前显示模式A,没有模式A的模板,左边(含当前)有其他模式模板,返回左边最近的其他模式模板index +// List> openedTemplateList = new ArrayList<>(); +// openedTemplateList.add(new B_Mode()); +// Assert.assertEquals(0, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); +// openedTemplateList.add(new B_Mode()); +// Assert.assertEquals(1, MultiTemplateTabUtils.calShowTemplateIndex(1, openedTemplateList, "A_Mode")); +// } + + +// public void test_has_no_temp() { +// //当前显示模式A,没有模式A的模板,也没有其他模式的模板,返回-1 +// List> openedTemplateList = new ArrayList<>(); +// Assert.assertEquals(-1, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); +// } +// +// +// public void test_if_index_less_than_zero_or_more_than_open_temp_size() { +// //index<0 或者超出openTemplateList.size时,返回-1 +// List> openedTemplateList = new ArrayList<>(); +// Assert.assertEquals(-1, MultiTemplateTabUtils.calShowTemplateIndex(-1, openedTemplateList, "A_Mode")); +// Assert.assertEquals(-1, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); +// openedTemplateList.add(new A_Mode()); +// Assert.assertEquals(-1, MultiTemplateTabUtils.calShowTemplateIndex(1, openedTemplateList, "A_Mode")); +// } private class A_Mode extends AbstractTestMode { public String getTemplateTabOperatorType() { From c320946574b1555a9c0104142b02c29b3df6157a Mon Sep 17 00:00:00 2001 From: vito Date: Mon, 15 Jan 2024 17:32:01 +0800 Subject: [PATCH 130/302] =?UTF-8?q?REPORT-99485=20=E6=A8=A1=E7=89=88tab?= =?UTF-8?q?=E5=8F=8C=E5=87=BB=E6=B7=BB=E5=8A=A0=E6=96=B0=E6=A8=A1=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/file/MultiTemplateTabPane.java | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 069bbda57a..10c0101877 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -73,6 +73,7 @@ public class MultiTemplateTabPane extends Row { private static final String UI_CLASS_ID = "TemplateTabPaneUI"; private static final int GAP = 6; private static final int SMALLGAP = 4; + private static final int DOUBLE_CLICK = 2; /** * 尾部动作区宽度 @@ -122,6 +123,8 @@ public class MultiTemplateTabPane extends Row { // 模板时,模板B会自动关闭 private JTemplate temTemplate = null; + private ActionListener newTemplateAction; + @Override public String getUIClassID() { return UI_CLASS_ID; @@ -203,8 +206,9 @@ public class MultiTemplateTabPane extends Row { * @param l 监听器 */ public void addLeadingAction(ActionListener l) { - leadingActionButton.removeActionListener(l); - leadingActionButton.addActionListener(l); + newTemplateAction = l; + leadingActionButton.removeActionListener(newTemplateAction); + leadingActionButton.addActionListener(newTemplateAction); } public void setLeadingActionEnable(boolean enable) { @@ -322,12 +326,7 @@ public class MultiTemplateTabPane extends Row { if (OK_OPTION == selVal) { CallbackSaveWorker worker = template.saveAs(); worker.start(template.getRuntimeId()); - worker.addSuccessCallback(new Runnable() { - @Override - public void run() { - gotoEditingTemplateLeaf(template.getPath()); - } - }); + worker.addSuccessCallback(() -> gotoEditingTemplateLeaf(template.getPath())); } } else { gotoEditingTemplateLeaf(template.getPath()); @@ -701,6 +700,18 @@ public class MultiTemplateTabPane extends Row { return evtX >= (maxWidth + SMALLGAP) && evtX <= (getWidth() - SMALLGAP); } + /** + * 判断是否在tab栏空白区 + * + * @param evtX x坐标 + * @return 是否在tab栏空白区 + */ + private boolean isOverBlank(int evtX) { + int tabWidths = (maxPaintIndex - minPaintIndex + 1) * tabWidth; + int leftX = tabWidths + scale(LEADING_WIDTH); + return evtX >= leftX && evtX <= getWidth() - scale(TRAILING_WIDTH); + } + private int getTemplateIndex(int evtX) { int textX = scale(LEADING_WIDTH); @@ -768,6 +779,15 @@ public class MultiTemplateTabPane extends Row { MultiTemplateTabPane.this.repaint(); } + @Override + public void mouseClicked(MouseEvent e) { + // 双击添加模板 + if (e.getClickCount() == DOUBLE_CLICK + && isOverBlank(e.getX())) { + newTemplateAction.actionPerformed(null); + } + } + /** * 按下 * From d41aca61440d2176a7082e9044146fc8823b7c03 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Tue, 16 Jan 2024 12:00:22 +0800 Subject: [PATCH 131/302] =?UTF-8?q?=20REPORT-107973=20=E4=BF=AE=E6=94=B9fr?= =?UTF-8?q?m=20=E5=B7=A5=E5=85=B7=E6=A0=8F=E8=83=8C=E6=99=AF=EF=BC=9Bfrm?= =?UTF-8?q?=E4=B8=8B=E7=82=B9=E5=87=BB=E6=8A=A5=E8=A1=A8=E5=9D=97=EF=BC=8C?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=9D=97=E4=B8=8B=E7=A7=BB=20=20=E3=80=90?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E5=8E=9F=E5=9B=A0=E3=80=91frm=E4=B8=8B?= =?UTF-8?q?=E7=82=B9=E5=87=BB=E6=8A=A5=E8=A1=A8=E5=9D=97=EF=BC=8C=E6=8A=A5?= =?UTF-8?q?=E8=A1=A8=E5=9D=97=E4=B8=8B=E7=A7=BB=EF=BC=9A=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BA=86frm=E7=9A=84=E5=B7=A5=E5=85=B7=E6=A0=8F=E5=B8=83?= =?UTF-8?q?=E5=B1=80=EF=BC=8C=E4=B9=8B=E5=89=8D=E7=9A=84=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E8=B0=83=E7=94=A8setPreferredSize=E5=AF=BC=E8=87=B4=20=20?= =?UTF-8?q?=E3=80=90=E6=94=B9=E5=8A=A8=E6=80=9D=E8=B7=AF=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 1 + .../com/fr/design/gui/ibutton/UIButton.java | 8 ++-- .../design/mainframe/FormParaWidgetPane.java | 39 +++++++------------ 3 files changed, 20 insertions(+), 28 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 2409e92464..8c9b68cc12 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -35,6 +35,7 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("drag_left", "com/fine/theme/icon/drag_left.svg", true), new SvgIconSource("drag_right", "com/fine/theme/icon/drag_right.svg", true), new SvgIconSource("down_arrow", "com/fine/theme/icon/down_arrow.svg", true), + new SvgIconSource("up_arrow", "com/fine/theme/icon/up_arrow.svg", true), new SvgIconSource("down_arrow_12", "com/fine/theme/icon/down_arrow.svg", true, 12), new SvgIconSource("up_arrow_12", "com/fine/theme/icon/up_arrow.svg", true, 12), new SvgIconSource("select", "com/fine/theme/icon/select.svg", true), diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java index 736a340297..c54c39cb4c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java @@ -25,7 +25,9 @@ import java.awt.event.ActionListener; import java.awt.geom.RoundRectangle2D; import static com.fine.theme.utils.FineUIStyle.STYLE_PRIMARY; +import static com.fine.theme.utils.FineUIStyle.STYLE_TEXT; import static com.fine.theme.utils.FineUIStyle.hasStyle; +import static com.fine.theme.utils.FineUIStyle.setStyle; public class UIButton extends JButton implements UIObserver, UITextComponent { @@ -91,7 +93,7 @@ public class UIButton extends JButton implements UIObserver, UITextComponent { setRolloverIcon(rollOver); setPressedIcon(pressed); setExtraPainted(false); - setBackground(null); + setStyle(this, STYLE_TEXT); setOpaque(false); initListener(); } @@ -132,7 +134,7 @@ public class UIButton extends JButton implements UIObserver, UITextComponent { public void set4ToolbarButton() { setNormalPainted(false); Dimension dim = getPreferredSize(); - setBackground(null); + setStyle(this, STYLE_TEXT); setOpaque(false); setSize(dim); setBorderPaintedOnlyWhenPressed(true); @@ -140,7 +142,7 @@ public class UIButton extends JButton implements UIObserver, UITextComponent { public void set4LargeToolbarButton() { setNormalPainted(false); - setBackground(null); + setStyle(this, STYLE_TEXT); setOpaque(false); setBorderPainted(false); setSize(new Dimension(40, 40)); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormParaWidgetPane.java b/designer-form/src/main/java/com/fr/design/mainframe/FormParaWidgetPane.java index 33eae2a9f2..42d6ea3777 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormParaWidgetPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormParaWidgetPane.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseUtils; import com.fr.base.svg.IconUtils; import com.fr.design.ExtraDesignClassManager; @@ -25,7 +26,6 @@ import com.fr.design.mainframe.share.ui.online.mini.MiniComponentShopDialog; import com.fr.design.mainframe.share.util.OnlineShopUtils; import com.fr.design.module.DesignModuleFactory; import com.fr.design.ui.util.UIUtil; -import com.fr.design.utils.gui.LayoutUtils; import com.fr.form.ui.UserDefinedWidgetConfig; import com.fr.form.ui.Widget; import com.fr.form.ui.WidgetConfig; @@ -50,8 +50,6 @@ import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FlowLayout; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; @@ -142,26 +140,6 @@ public class FormParaWidgetPane extends UIToolbar { public FormParaWidgetPane() { setLayout(new FlowLayout(FlowLayout.LEFT)); - DesignerContext.getDesignerFrame().getCenterTemplateCardPane().addComponentListener(new ComponentAdapter() { - @Override - public void componentResized(ComponentEvent e) { - if (FormParaWidgetPane.this.getParent() != null) { - JPanel parent = (JPanel) FormParaWidgetPane.this.getParent(); - int deltaWidth = 0; - for (int i = 0; i < parent.getComponentCount() - 1; i++) { - deltaWidth += parent.getComponent(i).getWidth(); - } - - if (deltaWidth == 0) { - return; - } - - Dimension d = parent.getSize(); - setPreferredSize(new Dimension(d.width - deltaWidth, d.height)); - LayoutUtils.layoutContainer(parent); - } - } - }); initFormParaComponent(); } @@ -306,6 +284,8 @@ public class FormParaWidgetPane extends UIToolbar { jPanel.add(uiLabel, BorderLayout.NORTH); jPanel.add(new UILabel(Toolkit.i18nText("Fine-Design_Component_Reuse_Apply_Widget")), BorderLayout.CENTER); jPanel.setToolTipText(Toolkit.i18nText("Fine-Design_Share_Component")); + jPanel.setOpaque(false); + uiLabel.setOpaque(false); return jPanel; } @@ -360,6 +340,9 @@ public class FormParaWidgetPane extends UIToolbar { labelPane.add(label, BorderLayout.CENTER); reportPane.add(labelPane, BorderLayout.SOUTH); reportPane.setPreferredSize(new Dimension((int) reportPane.getPreferredSize().getWidth(), (int) reportPane.getPreferredSize().getHeight())); + reportPane.setOpaque(false); + jComponent.setOpaque(false); + labelPane.setOpaque(false); return reportPane; } @@ -381,6 +364,9 @@ public class FormParaWidgetPane extends UIToolbar { }); labelPane.add(chartPopUpButton, BorderLayout.EAST); chartPane.add(labelPane, BorderLayout.SOUTH); + jComponent.setOpaque(false); + chartPane.setOpaque(false); + labelPane.setOpaque(false); return chartPane; } @@ -408,6 +394,9 @@ public class FormParaWidgetPane extends UIToolbar { }); labelPane.add(chartPopUpButton, BorderLayout.EAST); widgetPane.add(labelPane, BorderLayout.SOUTH); + jComponent.setOpaque(false); + widgetPane.setOpaque(false); + labelPane.setOpaque(false); return widgetPane; } @@ -435,13 +424,13 @@ public class FormParaWidgetPane extends UIToolbar { } private UIButton createPopUpButton() { - UIButton popUpButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/buttonicon/arrowdown.png")); + UIButton popUpButton = new UIButton(new LazyIcon("down_arrow")); popUpButton.set4ToolbarButton(); return popUpButton; } private UIButton createPopDownButton() { - UIButton popUpButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/buttonicon/arrowup.png")); + UIButton popUpButton = new UIButton(new LazyIcon("up_arrow")); popUpButton.set4ToolbarButton(); return popUpButton; } From 87182803b3ed552b0267962c794ecde64f087b50 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Tue, 16 Jan 2024 12:01:29 +0800 Subject: [PATCH 132/302] =?UTF-8?q?=20REPORT-107973=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=80=89=E4=B8=AD=E3=80=81=E5=B7=B2=E7=BC=96=E8=BE=91=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=A0=BC=E7=9A=84=E8=83=8C=E6=99=AF=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/laf/FineLightLaf.properties | 4 +++- .../src/main/java/com/fr/grid/GridColumnUI.java | 11 +++++++---- .../src/main/java/com/fr/grid/GridRowUI.java | 9 ++++++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index a03c97da7f..45378742e8 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -1173,7 +1173,9 @@ North.coverPane.radius = 8 Center.OuterShadowColor = #F2F4F8 Center.ZoneBorderColor = #E6E9EF -Center.GridColumnRowColor = #F8F9FC +Center.GridColumnRowColor=#e8e8e9 +Center.GridColumnRowSelectedColor=fade(@BrandColor, 12%) +Center.GridColumnRowEditedColor=#e9ecf1 Center.SpaceColor = #FFF Center.border = 0, 10, 10, 10 Center.arc=10 diff --git a/designer-realize/src/main/java/com/fr/grid/GridColumnUI.java b/designer-realize/src/main/java/com/fr/grid/GridColumnUI.java index bf430f3226..2918512194 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridColumnUI.java +++ b/designer-realize/src/main/java/com/fr/grid/GridColumnUI.java @@ -31,7 +31,10 @@ import java.awt.geom.Rectangle2D; * @since 2012-3-22下午5:51:10 */ public class GridColumnUI extends ComponentUI { - protected Color withoutDetailsBackground = UIManager.getColor("Center.GridColumnRowColor"); + protected Color backgroundColor = UIManager.getColor("Center.GridColumnRowColor"); + protected Color editedBackground = UIManager.getColor("Center.GridColumnRowEditedColor"); + protected Color selectedBackground = UIManager.getColor("Center.GridColumnRowSelectedColor"); + private int resolution ; public GridColumnUI(int resolution){ @@ -74,8 +77,8 @@ public class GridColumnUI extends ComponentUI { columnLeftWidth = columnWidthList.getRangeValue(horizontalBeginValue, columnCount).toPixD(resolution); } columnLeftWidth = Math.min(verticalLineWidth, columnLeftWidth); - if (gridColumn.getBackground() != null) { - g2d.setPaint(this.withoutDetailsBackground); + if (editedBackground != null) { + g2d.setPaint(editedBackground); GraphHelper.fill(g2d, new Rectangle2D.Double(0, 0, columnLeftWidth, size.getHeight())); } // draw left border line. @@ -114,7 +117,7 @@ public class GridColumnUI extends ComponentUI { Selection sel = reportPane.getSelection(); int[] selectedColumn = sel.getSelectedColumns(); if (IntList.asList(selectedColumn).contain(i)) { - g2d.setColor(gridColumn.getSelectedBackground()); + g2d.setColor(selectedBackground); GraphHelper.fill(g2d, new Rectangle2D.Double(tmpWidth1 + 1, 0, tmpIncreaseWidth - 1, size.height)); isSelectedBounds = true; } else { diff --git a/designer-realize/src/main/java/com/fr/grid/GridRowUI.java b/designer-realize/src/main/java/com/fr/grid/GridRowUI.java index 97d2eb9269..d2b7391f84 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridRowUI.java +++ b/designer-realize/src/main/java/com/fr/grid/GridRowUI.java @@ -32,6 +32,9 @@ import java.awt.geom.Rectangle2D; */ public class GridRowUI extends ComponentUI { private Color detailsBackground = UIManager.getColor("Center.GridColumnRowColor"); + protected Color editedBackground = UIManager.getColor("Center.GridColumnRowEditedColor"); + protected Color selectedBackground = UIManager.getColor("Center.GridColumnRowSelectedColor"); + private int resolution ; GridRowUI(int resolution){ @@ -74,8 +77,8 @@ public class GridRowUI extends ComponentUI { rowTopHeight = rowHeightList.getRangeValue(verticalBeginValue, rowCount).toPixD(resolution); } rowTopHeight = Math.min(horizontalLineHeight, rowTopHeight); - if (gridRow.getBackground() != null) { - g2d.setPaint(this.detailsBackground); + if (editedBackground != null) { + g2d.setPaint(editedBackground); GraphHelper.fill(g2d, new Rectangle2D.Double(0, 0, size.getWidth(), rowTopHeight)); } // draw top border line. @@ -110,7 +113,7 @@ public class GridRowUI extends ComponentUI { Selection sel = reportPane.getSelection(); int[] selectedRows = sel.getSelectedRows(); if (IntList.asList(selectedRows).contain(i)) { - g2d.setPaint(gridRow.getSelectedBackground()); + g2d.setPaint(selectedBackground); GraphHelper.fill(g2d, new Rectangle2D.Double(0, tmpHeight1 + 1, size.width, tmpIncreaseHeight - 1)); isSelectedBounds = true; } else { From f7bbaee0ba022ebcba0d73099146355af4774e16 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Tue, 16 Jan 2024 12:01:58 +0800 Subject: [PATCH 133/302] =?UTF-8?q?=20REPORT-107973=20=E8=A5=BF=E5=8C=BA?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E9=80=89=E4=B8=AD=E5=90=8E=EF=BC=8C=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E6=9C=AA=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/mainframe/EastRegionContainerPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 7a3e533ec8..0b564ced10 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -987,8 +987,8 @@ public class EastRegionContainerPane extends UIEastResizableContainer { public void setTabButtonSelected() { resetPropertyIcons(); if (StringUtils.isEmpty(iconBaseDir)) { - button.setIcon(new LazyIcon(getBtnIconId())); iconSuffix = ICON_SUFFIX_SELECTED; + button.setIcon(new LazyIcon(getBtnIconId())); } else { iconSuffix = ICON_SUFFIX_SELECTED_DEPRECATED; button.setIcon(IconUtils.readIcon(getBtnIconUrl())); From 09cc08ab53b474ff075cbba62d6ee3c21fad8838 Mon Sep 17 00:00:00 2001 From: vito Date: Wed, 17 Jan 2024 11:24:32 +0800 Subject: [PATCH 134/302] =?UTF-8?q?REPORT-99485=20=E4=BF=AE=E5=A4=8DUIButt?= =?UTF-8?q?onGroup=E6=A0=B7=E5=BC=8F=E5=AF=BC=E8=87=B4=E6=97=A0=E9=99=90?= =?UTF-8?q?=E7=BB=98=E5=88=B6=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../theme/light/ui/FineButtonGroupUI.java | 12 -------- .../fr/design/gui/ibutton/UIButtonGroup.java | 30 ++++++++++--------- .../components/ButtonGroupStoryBoard.java | 11 ++++--- .../fr/design/actions/ButtonGroupAction.java | 2 +- .../actions/cell/style/AlignmentAction.java | 8 +++-- 5 files changed, 28 insertions(+), 35 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonGroupUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonGroupUI.java index dc65b33e81..bf59dda3a5 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonGroupUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineButtonGroupUI.java @@ -1,11 +1,8 @@ package com.fine.theme.light.ui; -import com.fr.design.gui.ibutton.UIButtonGroup; - import javax.swing.JComponent; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.PanelUI; -import java.awt.Graphics; /** * 按钮组UI,应用于 {@link com.fr.design.gui.ibutton.UIButtonGroup} @@ -26,15 +23,6 @@ public class FineButtonGroupUI extends PanelUI { return new FineButtonGroupUI(); } - @Override - public void update(Graphics g, JComponent c) { - UIButtonGroup group = (UIButtonGroup) c; - if (!group.isInToolbar()) { - c.setBorder(new FineRoundBorder()); - } - super.update(g, c); - } - @Override public void uninstallUI(JComponent c) { super.uninstallUI(c); diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java index 7505eeb773..39dbc8a803 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java @@ -54,8 +54,6 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb private UIObserverListener uiObserverListener; private boolean autoFireStateChanged = true; - private boolean inToolbar = false; - public UIButtonGroup(String[] textArray) { this(textArray, null); } @@ -109,7 +107,6 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb } public UIButtonGroup(Icon[][] iconArray, T[] objects, boolean inToolbar) { - this.inToolbar = inToolbar; if (!ArrayUtils.isEmpty(objects) && iconArray.length == objects.length) { this.objectList = Arrays.asList(objects); } @@ -142,7 +139,8 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb }; initButton(labelButton, index); } - initLayout(getCols()); + setForToolBarButtonGroup(inToolbar); + initLayout(getCols(), inToolbar); } public UIButtonGroup(String[] textArray, T[] objects) { @@ -194,13 +192,17 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb return new int[]{totalButtonSize}; } - protected void initLayout(int[] cols) { + private void initLayout(int[] cols) { + initLayout(cols, false); + } + + protected void initLayout(int[] cols, boolean inToolbar) { int currentIndex = 0; for (int row = 0; row < cols.length; row++) { int col = cols[row]; Row rowContainer = new Row(); for (int j = 0; j < col; j++) { - rowContainer.add(cell(labelButtonList.get(currentIndex)).weight(1.0)); + rowContainer.add(cell(getLabelButtonList().get(currentIndex)).weight(1.0)); currentIndex++; if (j != col - 1 && !inToolbar) { rowContainer.add(createDivider()); @@ -213,6 +215,10 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb } } + private List getLabelButtonList() { + return labelButtonList; + } + private Spacer createDivider() { Spacer spacer = new Spacer(FineUIScale.scale(1)); spacer.setBorder(new LineBorder(FineUIUtils.getUIColor("defaultBorderColor", "Component.borderColor"))); @@ -265,20 +271,16 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb isClick = changeFlag; } - public void setForToolBarButtonGroup(boolean isToolBarComponent) { - if (isToolBarComponent) { - inToolbar = true; + private void setForToolBarButtonGroup(boolean inToolbar) { + if (inToolbar) { for (UIToggleButton button : labelButtonList) { button.putClientProperty(BUTTON_TYPE, BUTTON_TYPE_TOOLBAR_BUTTON); FineUIStyle.setStyle(button, IN_TOOLBAR_GROUP); button.setBorderPainted(false); } + } else { + setBorder(new FineRoundBorder()); } - repaint(); - } - - public boolean isInToolbar() { - return inToolbar; } @Override diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonGroupStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonGroupStoryBoard.java index 3c84e3371c..2b259dbe84 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonGroupStoryBoard.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ButtonGroupStoryBoard.java @@ -61,10 +61,9 @@ public class ButtonGroupStoryBoard extends StoryBoard { ArrayUtils.toArray(new LazyIcon("preview"), new LazyIcon("save")) )); - private static Component getToolbar(){ + private static Component getToolbar() { UIToolbar toolbar = new UIToolbar(); - UIButtonGroup objectUIButtonGroup = new UIButtonGroup<>(iconArrayWithWhite(),null,true); - objectUIButtonGroup.setForToolBarButtonGroup(true); + UIButtonGroup objectUIButtonGroup = new UIButtonGroup<>(iconArrayWithWhite(), null, true); toolbar.add(objectUIButtonGroup); return toolbar; } @@ -77,15 +76,15 @@ public class ButtonGroupStoryBoard extends StoryBoard { return iconArrayWithWhite.getValue(); } - private String[] fiveTextArray() { + private String[] fiveTextArray() { return ArrayUtils.toArray("按钮1", "按钮2", "按钮3", "按钮4", "按钮5"); } - private String[] sevenTextArray() { + private String[] sevenTextArray() { return ArrayUtils.toArray("按钮1", "按钮2", "按钮3", "按钮4", "按钮5", "按钮6", "按钮7"); } - private String[] sixTextArray() { + private String[] sixTextArray() { return ArrayUtils.toArray("按钮1", "按钮2", "按钮3", "按钮4", "按钮5", "按钮6"); } diff --git a/designer-realize/src/main/java/com/fr/design/actions/ButtonGroupAction.java b/designer-realize/src/main/java/com/fr/design/actions/ButtonGroupAction.java index 5381fb3a3f..ca15794bdd 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/ButtonGroupAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/ButtonGroupAction.java @@ -48,7 +48,7 @@ public abstract class ButtonGroupAction extends ElementCaseAction{ @Override public UIButtonGroup createToolBarComponent() { if(group == null) { - group = new UIButtonGroup(iconArray, valueArray, true); + group = new UIButtonGroup<>(iconArray, valueArray, true); group.addActionListener(this); } return group; diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/style/AlignmentAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/style/AlignmentAction.java index 9147b3d653..5bbd54a716 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/style/AlignmentAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/style/AlignmentAction.java @@ -16,6 +16,8 @@ import com.fr.stable.Constants; import javax.swing.Icon; +import static com.fr.design.i18n.Toolkit.i18nText; + public class AlignmentAction extends ButtonGroupAction implements StyleActionInterface { @@ -105,8 +107,10 @@ public class AlignmentAction extends ButtonGroupAction implements StyleActionInt public UIButtonGroup createToolBarComponent() { UIButtonGroup group = super.createToolBarComponent(); if (group != null) { - group.setForToolBarButtonGroup(true); - group.setAllToolTips(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_StyleAlignment_Left"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Center"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_StyleAlignment_Right")}); + group.setAllToolTips(new String[]{ + i18nText("Fine-Design_Basic_StyleAlignment_Left"), + i18nText("Fine-Design_Form_Center"), + i18nText("Fine-Design_Basic_StyleAlignment_Right")}); } return group; } From 220952a02fbcbee6c9d5992e5ff3e88452371091 Mon Sep 17 00:00:00 2001 From: vito Date: Wed, 17 Jan 2024 11:51:47 +0800 Subject: [PATCH 135/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E9=81=97=E6=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java index 39dbc8a803..bd31f513e1 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java @@ -99,6 +99,7 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb }; initButton(labelButton, index); } + setBorder(new FineRoundBorder()); initLayout(getCols()); } @@ -175,6 +176,7 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb }; initButton(labelButton, index); } + setBorder(new FineRoundBorder()); initLayout(getCols()); } From d1051efe532dd96c7f93182ceff05d729e4a921a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Mon, 22 Jan 2024 20:24:41 +0800 Subject: [PATCH 136/302] =?UTF-8?q?REPORT-111995=20=E3=80=90UI=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E3=80=91=E6=8E=A7=E4=BB=B6=E9=9D=A2=E6=9D=BF=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E6=95=B4=E4=BD=93=E7=BF=BB=E6=96=B0(form=E9=83=A8?= =?UTF-8?q?=E5=88=86)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 10 ++ .../com/fine/theme/utils/FineUIStyle.java | 2 + .../com/fr/design/dialog/BasicScrollPane.java | 4 +- .../design/gui/controlpane/JControlPane.java | 4 +- .../design/gui/controlpane/UIControlPane.java | 8 +- .../gui/controlpane/UIListControlPane.java | 3 - .../controlpane/UIListGroupControlPane.java | 8 +- .../controlpane/UISimpleListControlPane.java | 13 +- .../fr/design/gui/style/AlignmentPane.java | 17 +-- .../mainframe/widget/BasicPropertyPane.java | 33 ++--- .../widget/editors/StringEditor.java | 1 - .../java/com/fr/design/menu/ToolBarDef.java | 19 +-- .../widget/WidgetBoundsPaneFactory.java | 126 +++++++--------- .../widget/component/BackgroundCompPane.java | 55 +++---- .../fine/theme/icon/cellstyle/h_justify.svg | 6 + .../fine/theme/icon/cellstyle/h_normal.svg | 8 ++ .../fine/theme/icon/cellstyle/v_bottom.svg | 10 ++ .../fine/theme/icon/cellstyle/v_center.svg | 10 ++ .../com/fine/theme/icon/cellstyle/v_top.svg | 10 ++ .../theme/icon/filetree/monochrome_cut.svg | 5 + .../icon/filetree/monochrome_cut_disable.svg | 5 + .../com/fine/theme/icon/lock/locked.svg | 5 + .../fine/theme/icon/lock/locked_disable.svg | 5 + .../com/fine/theme/icon/lock/unlocked.svg | 5 + .../fine/theme/icon/lock/unlocked_disable.svg | 3 + .../com/fine/theme/icon/toolbar/to_bottom.svg | 5 + .../theme/icon/toolbar/to_bottom_disable.svg | 3 + .../com/fine/theme/icon/toolbar/to_top.svg | 5 + .../theme/icon/toolbar/to_top_disable.svg | 5 + .../light/ui/laf/FineLightLaf.properties | 9 +- .../designer/beans/actions/CopyAction.java | 3 +- .../designer/beans/actions/CutAction.java | 3 +- .../beans/actions/FormDeleteAction.java | 6 +- .../beans/actions/MoveDownAction.java | 5 +- .../beans/actions/MoveToBottomAction.java | 5 +- .../beans/actions/MoveToTopAction.java | 7 +- .../designer/beans/actions/MoveUpAction.java | 5 +- .../designer/beans/actions/PasteAction.java | 3 +- .../designer/creator/PropertyGroupPane.java | 32 +++-- .../treeview/ComponentTreeCellRenderer.java | 4 +- .../gui/controlpane/EventPropertyPane.java | 2 + .../fr/design/mainframe/ComponentTree.java | 6 - .../mainframe/FormHierarchyTreePane.java | 34 ++--- .../design/mainframe/WidgetPropertyPane.java | 8 +- .../ui/BasicSetVisiblePropertyPane.java | 13 +- .../ui/FormBasicWidgetPropertyPane.java | 6 - .../widget/ui/FormSingleWidgetCardPane.java | 36 ++--- .../widget/ui/FormWidgetCardPane.java | 3 - .../parameter/ParameterPropertyPane.java | 12 +- .../parameter/RootDesignDefinePane.java | 134 +++++++++--------- .../widget/ui/designer/ButtonDefinePane.java | 76 ++++------ .../ui/designer/ButtonGroupDictPane.java | 31 ++-- .../ui/designer/CheckBoxDefinePane.java | 54 ++++--- .../ui/designer/CheckBoxGroupDefinePane.java | 26 ++-- .../ui/designer/ComboBoxDefinePane.java | 5 +- .../ui/designer/ComboCheckBoxDefinePane.java | 27 ++-- .../CustomWritableRepeatEditorPane.java | 7 +- .../ui/designer/DateEditorDefinePane.java | 74 +++++----- .../designer/DirectWriteEditorDefinePane.java | 81 ++++++----- .../ui/designer/FieldEditorDefinePane.java | 67 +++++---- .../ui/designer/FreeButtonDefinePane.java | 33 +++-- .../widget/ui/designer/LabelDefinePane.java | 73 ++++------ .../ui/designer/NumberEditorDefinePane.java | 54 ++++--- .../designer/TextFieldEditorDefinePane.java | 60 ++++---- .../ui/designer/TreeEditorDefinePane.java | 15 +- .../widget/ui/designer/WaterMarkDictPane.java | 3 +- .../designer/WriteUnableRepeatEditorPane.java | 5 +- .../designer/btn/ButtonGroupDefinePane.java | 57 ++++---- .../component/FormWidgetValuePane.java | 51 ++++--- .../designer/component/WidgetBoundPane.java | 17 +-- .../BaseTextEditorMobileDefinePane.java | 6 +- .../mobile/ButtonGroupDefinePane.java | 30 ++-- 72 files changed, 772 insertions(+), 809 deletions(-) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_justify.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_normal.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/cellstyle/v_bottom.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/cellstyle/v_center.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/cellstyle/v_top.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_cut.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_cut_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/lock/locked.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/lock/locked_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/lock/unlocked.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/lock/unlocked_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/to_bottom.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/to_bottom_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/to_top.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/to_top_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 8c9b68cc12..77079e8fdc 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -152,6 +152,11 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("h_left", "com/fine/theme/icon/cellstyle/h_left.svg"), new SvgIconSource("h_center", "com/fine/theme/icon/cellstyle/h_center.svg"), new SvgIconSource("h_right", "com/fine/theme/icon/cellstyle/h_right.svg"), + new SvgIconSource("h_justify", "com/fine/theme/icon/cellstyle/h_justify.svg"), + new SvgIconSource("h_normal", "com/fine/theme/icon/cellstyle/h_normal.svg"), + new SvgIconSource("v_top", "com/fine/theme/icon/cellstyle/v_top.svg"), + new SvgIconSource("v_center", "com/fine/theme/icon/cellstyle/v_center.svg"), + new SvgIconSource("v_bottom", "com/fine/theme/icon/cellstyle/v_bottom.svg"), new SvgIconSource("noboder", "com/fine/theme/icon/noboder.svg", true), new SvgIconSource("merge", "com/fine/theme/icon/merge/merge.svg", true), new SvgIconSource("unmerge", "com/fine/theme/icon/merge/unmerge.svg", true), @@ -174,6 +179,8 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("move_up", "com/fine/theme/icon/toolbar/move_up.svg", true), new SvgIconSource("move_left", "com/fine/theme/icon/toolbar/move_left.svg", true), new SvgIconSource("move_right", "com/fine/theme/icon/toolbar/move_right.svg", true), + new SvgIconSource("to_top", "com/fine/theme/icon/toolbar/to_top.svg", true), + new SvgIconSource("to_bottom", "com/fine/theme/icon/toolbar/to_bottom.svg", true), new SvgIconSource("tool_edit", "com/fine/theme/icon/toolbar/edit.svg", true), new SvgIconSource("tool_edit_white", "com/fine/theme/icon/toolbar/edit_white.svg", true), new SvgIconSource("tool_more", "com/fine/theme/icon/toolbar/more.svg", true), @@ -188,6 +195,8 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("param_hide_pressed", "com/fine/theme/icon/param/hide_pressed.svg", true, 24), new SvgIconSource("param_view", "com/fine/theme/icon/param/view.svg", true, 18), new SvgIconSource("param", "com/fine/theme/icon/param/param.svg", true), + new SvgIconSource("locked", "com/fine/theme/icon/lock/locked.svg", true, 16), + new SvgIconSource("unlocked", "com/fine/theme/icon/lock/unlocked.svg", true, 16), // 北区菜单栏 //文件 @@ -304,6 +313,7 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("move", "com/fine/theme/icon/filetree/move.svg", true), new SvgIconSource("monochrome_copy", "com/fine/theme/icon/filetree/monochrome_copy.svg", true), new SvgIconSource("monochrome_paste", "com/fine/theme/icon/filetree/monochrome_paste.svg", true), + new SvgIconSource("monochrome_cut", "com/fine/theme/icon/filetree/monochrome_cut.svg", true), // 控件 new SvgIconSource("button", "com/fine/theme/icon/widget/button.svg", true), diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java index 873c0e4edd..8fd013916b 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java @@ -29,6 +29,8 @@ public interface FineUIStyle { String BUTTON_TAB_ACTION = "tabAction"; String LABEL_BOLD = "boldLabel"; String LABEL_TIP = "tipLabel"; + String PLAIN_BUTTON = "plainButton"; + String TOGGLE_GROUP = "inToggleGroup"; String MENU_TOOL_BAR = "menuToolBar"; String MENU_ITEM_TOOL_BAR = "menuItemToolBar"; diff --git a/designer-base/src/main/java/com/fr/design/dialog/BasicScrollPane.java b/designer-base/src/main/java/com/fr/design/dialog/BasicScrollPane.java index fbb602db38..3b31822b6d 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/BasicScrollPane.java +++ b/designer-base/src/main/java/com/fr/design/dialog/BasicScrollPane.java @@ -1,6 +1,5 @@ package com.fr.design.dialog; -import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.iscrollbar.UIScrollBar; @@ -178,7 +177,7 @@ public abstract class BasicScrollPane extends BasicBeanPane{ int width = parent.getWidth(); int height = parent.getHeight(); if (leftcontentPane.getPreferredSize().height > maxheight && scrollBar.isVisible()) { - leftcontentPane.setBounds(0, -beginY, width - scrollBar.getWidth() + getOverWidth() - DET_WIDTH_OVER_HEIGHT, height + beginY); + leftcontentPane.setBounds(0, -beginY, width - scrollBar.getWidth(), height + beginY); scrollBar.setBounds(width - scrollBar.getWidth() - 1, 0, scrollBar.getWidth(), height); } else { int hideBarWidth = hideBarWidth() ? scrollBar.getWidth() : 0; @@ -211,7 +210,6 @@ public abstract class BasicScrollPane extends BasicBeanPane{ this.setLayout(new BarLayout()); this.add(scrollBar); leftcontentPane = pane; - leftcontentPane.setBorder(new ScaledEmptyBorder(0, 6, 0, 6)); this.add(leftcontentPane); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/JControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/JControlPane.java index 2f73936c7a..594a21ac5c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/JControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/JControlPane.java @@ -148,6 +148,8 @@ abstract class JControlPane extends BasicPane implements UnrepeatedNameHelper, S toolbarDef.addShortCut(sj.getShortCut()); } toolBar = ToolBarDef.createJToolBar(); + toolBar.setBorder(FineBorderFactory.createUnderlineBorder(FlatUIUtils.getUIColor("defaultBorderColor", Color.GRAY))); + toolBar.setBorderPainted(true); toolbarDef.updateToolBar(toolBar); } @@ -163,8 +165,6 @@ abstract class JControlPane extends BasicPane implements UnrepeatedNameHelper, S } initToolBar(); - toolBar.setBorder(FineBorderFactory.createUnderlineBorder(FlatUIUtils.getUIColor("defaultBorderColor", Color.GRAY))); - toolBar.setBorderPainted(true); leftPane.add(toolBar, BorderLayout.NORTH); return leftPane; } diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java index 2ed774966b..16ebf0ff66 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java @@ -4,6 +4,7 @@ import com.fine.theme.light.ui.FineButtonBorder; import com.fine.theme.utils.FineUIScale; import com.fine.theme.utils.FineUIStyle; import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.constants.UIConstants; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.controlpane.shortcutfactory.ShortCutFactory; @@ -33,10 +34,7 @@ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.Frame; -import java.awt.Graphics; -import java.awt.Graphics2D; import java.awt.GraphicsEnvironment; import java.awt.Point; import java.awt.Rectangle; @@ -83,7 +81,7 @@ public abstract class UIControlPane extends JControlPane { if (isNewStyle()) { createPopupEditDialog(cardPane); this.add(getLeftPane(), BorderLayout.CENTER); - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 15, 10)); + this.setBorder(new ScaledEmptyBorder(10, 10, 15, 10)); } else { // 增加边框 JPanel leftPaneWrapper = new JPanel(new BorderLayout()); @@ -143,7 +141,7 @@ public abstract class UIControlPane extends JControlPane { ShortCut addItem = shortCutFactory.addItemShortCut().getShortCut(); addItem.intoJToolBar(topToolBar); JPanel leftTopPane = getLeftTopPane(topToolBar); - leftTopPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); + leftTopPane.setBorder(new ScaledEmptyBorder(0, 0, 10, 0)); leftPane.add(leftTopPane, BorderLayout.NORTH); return leftPane; diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java index 581c101ed5..a9c03a6eeb 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java @@ -10,10 +10,8 @@ import com.fr.form.event.Listener; import com.fr.stable.ArrayUtils; import com.fr.stable.Nameable; -import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.JPanel; -import javax.swing.UIManager; import javax.swing.ListSelectionModel; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; @@ -77,7 +75,6 @@ public abstract class UIListControlPane extends UIControlPane implements ListCon nameableList = createJNameList(); nameableList.setName(LIST_NAME); UIScrollPane scrollPane = new UIScrollPane(nameableList); - scrollPane.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, UIManager.getColor("defaultBorderColor"))); leftPane.add(scrollPane, BorderLayout.CENTER); leftPane.setBorder(new FineRoundBorder()); diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java index 8a1e5020e9..cb4ff46cdd 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java @@ -1,5 +1,7 @@ package com.fr.design.gui.controlpane; +import com.fine.theme.light.ui.FineRoundBorder; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.beans.BasicBeanPane; import com.fr.design.constants.UIConstants; import com.fr.design.gui.icontainer.UIScrollPane; @@ -19,7 +21,6 @@ import com.fr.stable.ArrayUtils; import com.fr.stable.Nameable; import com.fr.stable.StringUtils; -import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.JPanel; import javax.swing.ListModel; @@ -80,6 +81,7 @@ public abstract class UIListGroupControlPane extends UIControlPane implements Li @Override protected void initLeftPane(JPanel leftPane) { leftPane.add(new UIScrollPane(contentPane = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 0)), BorderLayout.CENTER); + leftPane.setBorder(new FineRoundBorder()); } @@ -539,13 +541,11 @@ public abstract class UIListGroupControlPane extends UIControlPane implements Li super.paint(g); } }; - label.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 0)); + label.setBorder(new ScaledEmptyBorder(0, 8, 0, 0)); label.setOpaque(true); label.setBackground(Color.WHITE); label.setForeground(UIManager.getColor("List.wrapper.text.fontColor")); label.setFont(label.getFont().deriveFont(11F)); - //预留 10px 的纵向滚动条的宽度 - label.setPreferredSize(new Dimension(214, 26)); this.nameEdList = nameEdList; this.add(label, BorderLayout.NORTH); this.add(this.nameEdList, BorderLayout.CENTER); diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UISimpleListControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UISimpleListControlPane.java index 29c8c0602b..79c96067fe 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UISimpleListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UISimpleListControlPane.java @@ -1,6 +1,6 @@ package com.fr.design.gui.controlpane; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicPane; @@ -230,8 +230,7 @@ public class UISimpleListControlPane extends BasicPane { public MoveUpItemAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Up")); this.setMnemonic('U'); - this.setSmallIcon(BaseUtils - .readIcon("/com/fr/design/images/control/up.png")); + this.setSmallIcon(new LazyIcon("move_up")); } @Override @@ -263,8 +262,7 @@ public class UISimpleListControlPane extends BasicPane { public MoveDownItemAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Down")); this.setMnemonic('D'); - this.setSmallIcon(BaseUtils - .readIcon("/com/fr/design/images/control/down.png")); + this.setSmallIcon(new LazyIcon("move_down")); } @Override @@ -294,8 +292,7 @@ public class UISimpleListControlPane extends BasicPane { public SortItemAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Action_Sort")); this.setMnemonic('S'); - this.setSmallIcon(BaseUtils - .readIcon("/com/fr/design/images/control/sortAsc.png")); + this.setSmallIcon(new LazyIcon("sort_desc")); } @Override @@ -423,7 +420,7 @@ public class UISimpleListControlPane extends BasicPane { private void initComponents() { label = new UILabel(); - label.setBorder(BorderFactory.createEmptyBorder(3, 10, 3, 0)); +// label.setBorder(BorderFactory.createEmptyBorder(3, 10, 3, 0)); initialLabelForeground = label.getForeground(); this.setLayout(new BorderLayout()); this.add(label, BorderLayout.CENTER); diff --git a/designer-base/src/main/java/com/fr/design/gui/style/AlignmentPane.java b/designer-base/src/main/java/com/fr/design/gui/style/AlignmentPane.java index 4a9c4cee3d..4cbbe01590 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/AlignmentPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/AlignmentPane.java @@ -5,6 +5,7 @@ package com.fr.design.gui.style; */ import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.icon.LazyIcon; import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.BaseUtils; import com.fr.base.Style; @@ -91,18 +92,18 @@ public class AlignmentPane extends AbstractBasicStylePane implements GlobalNameO initTextRotationComboBox(); // todo: 换新图标及反白问题 - Icon[][] hAlignmentIconArray = {{IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal_white.png")}, - {IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal_white.png")}, - {IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal_white.png")}, - {IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_s_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_s_normal_white.png")}, - {IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/defaultAlignment.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/defaultAlignment_white.png")}}; + Icon[][] hAlignmentIconArray = {{new LazyIcon("h_left"), new LazyIcon("h_left").white()}, + {new LazyIcon("h_center"), new LazyIcon("h_center").white()}, + {new LazyIcon("h_right"), new LazyIcon("h_right").white()}, + {new LazyIcon("h_justify"), new LazyIcon("h_justify").white()}, + {new LazyIcon("h_normal"), new LazyIcon("h_normal").white()}}; Integer[] hAlignment = new Integer[]{Constants.LEFT, Constants.CENTER, Constants.RIGHT, Integer.valueOf(Constants.DISTRIBUTED), Constants.NULL}; hAlignmentPane = new UIButtonGroup<>(hAlignmentIconArray, hAlignment); hAlignmentPane.setAllToolTips(new String[]{Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Left"), Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Center"), Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Right"), Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Distributed"), Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_DEFAULT")}); - Icon[][] vAlignmentIconArray = {{IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_top_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_top_normal_white.png")}, - {IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_center_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_center_normal_white.png")}, - {IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_down_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_down_normal_white.png")}}; + Icon[][] vAlignmentIconArray = {{new LazyIcon("v_top"), new LazyIcon("v_top").white()}, + {new LazyIcon("v_center"), new LazyIcon("v_center").white()}, + {new LazyIcon("v_bottom"), new LazyIcon("v_bottom").white()}}; Integer[] vAlignment = new Integer[]{Constants.TOP, Constants.CENTER, Constants.BOTTOM}; vAlignmentPane = new UIButtonGroup<>(vAlignmentIconArray, vAlignment); vAlignmentPane.setAllToolTips(new String[]{Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Top"), Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Center"), Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Bottom")}); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/BasicPropertyPane.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/BasicPropertyPane.java index 23cc188edb..30987eb29f 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/widget/BasicPropertyPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/BasicPropertyPane.java @@ -1,29 +1,31 @@ package com.fr.design.mainframe.widget; -import com.fr.design.designer.IntervalConstants; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; - -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; + /** * Created by plough on 2017/8/7. */ public class BasicPropertyPane extends BasicPane { protected UITextField widgetName; + protected JPanel corePane; public BasicPropertyPane(){ initContentPane(); @@ -31,7 +33,9 @@ public class BasicPropertyPane extends BasicPane { protected void initContentPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + corePane = column(LayoutConstants.VERTICAL_GAP).getComponent(); + this.add(corePane, BorderLayout.CENTER); + widgetName = new UITextField() { protected void initListener() { if (shouldResponseChangeListener()) { @@ -58,17 +62,10 @@ public class BasicPropertyPane extends BasicPane { } }; widgetName.setGlobalName(Toolkit.i18nText("Fine-Design_Report_Basic")); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] rowSize = {p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}}; - Component[][] components = new Component[][]{ - new Component[]{new UILabel(obtainBasicName()), widgetName}, - }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); - this.add(panel, BorderLayout.NORTH); + + corePane.add(row( + cell(new UILabel(obtainBasicName())).weight(LEFT_WEIGHT), cell(widgetName).weight(RIGHT_WEIGHT) + ).getComponent()); } public String obtainBasicName(){ diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/editors/StringEditor.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/editors/StringEditor.java index da7bbc6197..2ba3bb7a13 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/widget/editors/StringEditor.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/editors/StringEditor.java @@ -25,7 +25,6 @@ public class StringEditor extends AbstractPropertyEditor { panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); textField = new UITextField(); panel.add(textField, BorderLayout.CENTER); - textField.setBorder(null); textField.getDocument().addDocumentListener(new DocumentListener() { @Override diff --git a/designer-base/src/main/java/com/fr/design/menu/ToolBarDef.java b/designer-base/src/main/java/com/fr/design/menu/ToolBarDef.java index b35818c614..5f66743441 100644 --- a/designer-base/src/main/java/com/fr/design/menu/ToolBarDef.java +++ b/designer-base/src/main/java/com/fr/design/menu/ToolBarDef.java @@ -2,17 +2,11 @@ package com.fr.design.menu; import com.fr.design.actions.UpdateAction; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.gui.itoolbar.UIToolBarUI; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.mainframe.JTemplate; import org.jetbrains.annotations.Nullable; -import javax.swing.BorderFactory; -import javax.swing.JComponent; -import java.awt.Color; -import java.awt.FlowLayout; -import java.awt.Graphics; -import java.awt.Graphics2D; +import java.awt.*; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -30,16 +24,7 @@ public class ToolBarDef { * 一个static的方法生成一个JToolBar */ public static UIToolbar createJToolBar(final Color background) { - UIToolbar toolbar = new UIToolbar(FlowLayout.LEFT, new UIToolBarUI() { - @Override - public void paint(Graphics g, JComponent c) { - Graphics2D g2 = (Graphics2D) g; - g2.setColor(background); - g2.fillRect(0, 0, c.getWidth(), c.getHeight()); - } - }); - toolbar.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0)); - return toolbar; + return new UIToolbar(); } diff --git a/designer-base/src/main/java/com/fr/design/widget/WidgetBoundsPaneFactory.java b/designer-base/src/main/java/com/fr/design/widget/WidgetBoundsPaneFactory.java index 2b2dcc532c..a7013353b9 100644 --- a/designer-base/src/main/java/com/fr/design/widget/WidgetBoundsPaneFactory.java +++ b/designer-base/src/main/java/com/fr/design/widget/WidgetBoundsPaneFactory.java @@ -1,21 +1,25 @@ package com.fr.design.widget; -import com.fr.design.designer.IntervalConstants; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; -import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.SwingConstants; -import java.awt.BorderLayout; import java.awt.Component; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; +import static com.fr.design.constants.LayoutConstants.HORIZONTAL_GAP; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; + /** * Created by plough on 2017/8/7. */ @@ -44,23 +48,15 @@ public class WidgetBoundsPaneFactory { } } - private static final int RIGHT_PANE_WIDTH = 145; - public static UIExpandablePane createBoundsPane(UISpinner width, UISpinner height, JComponent ratioLocked, NameAttribute nameAttribute) { - JPanel boundsPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - Component[][] components = new Component[][]{ - new Component[]{FRWidgetFactory.createLineWrapLabel(nameAttribute.getSizeName()), - ratioLocked != null ? createRightPane(width, ratioLocked, height) : createRightPane(width, height)}, - new Component[]{null, createRightPane(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Tree_Width"), SwingConstants.CENTER), new UILabel(Toolkit.i18nText("Fine-Design_Basic_Tree_Height"), SwingConstants.CENTER))}, - }; - double[] rowSize = {p, p}; - double[] columnSize = {f, RIGHT_PANE_WIDTH}; - int[][] rowCount = ratioLocked != null ? new int[][]{{1, 1}, {1, 1, 1}} : new int[][]{{1, 1}, {1, 1}}; - final JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W5, IntervalConstants.INTERVAL_L6); - panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); - boundsPane.add(panel); + final JPanel boundsPane = column(VERTICAL_GAP, + row( + cell(FRWidgetFactory.createLineWrapLabel(nameAttribute.getSizeName())).weight(LEFT_WEIGHT), + cell(ratioLocked != null ? createRightPane(width, ratioLocked, height) : createRightPane(width, height)).weight(RIGHT_WEIGHT) + ), + cell(createRightPane(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Tree_Width"), SwingConstants.CENTER), + new UILabel(Toolkit.i18nText("Fine-Design_Basic_Tree_Height"), SwingConstants.CENTER))) + ).with(it -> it.setBorder(new ScaledEmptyBorder(0, 0, 10, 0))).getComponent(); return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Form_Coords_And_Size"), 280, 24, boundsPane); } @@ -69,33 +65,24 @@ public class WidgetBoundsPaneFactory { } public static JPanel createRightPane(Component com1, Component com2) { - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] rowSize = {p}; - double[] columnSize = {f, f}; - int[][] rowCount = {{1, 1}}; - Component[][] components = new Component[][]{ - new Component[]{com1, com2} - }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_L6, IntervalConstants.INTERVAL_L1); + return row(HORIZONTAL_GAP, + cell(com1).weight(0.5), cell(com2).weight(0.5) + ).getComponent(); } public static JPanel createRightPane(Component com1, Component com2, Component com3) { - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] rowSize = {p}; - double[] columnSize = {f, 24, f}; - int[][] rowCount = {{1, 1, 1}}; - Component[][] components = new Component[][]{ - new Component[]{com1, com2, com3} - }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, 0, IntervalConstants.INTERVAL_L1); + if (com2 != null) { + return row( + cell(com1).weight(1), cell(com2).weight(0.3), cell(com3).weight(1) + ).getComponent(); + } + return row( + cell(com1).weight(1), flex(0.3), cell(com3).weight(1) + ).getComponent(); + } public static UIExpandablePane createAbsoluteBoundsPane(UISpinner x, UISpinner y, UISpinner width, UISpinner height, JComponent ratioLocked, NameAttribute nameAttribute) { - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - UILabel positionLabel = FRWidgetFactory.createLineWrapLabel(nameAttribute.getPositionName()); UILabel xLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_X_Coordinate"), SwingConstants.CENTER); UILabel yLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Y_Coordinate"), SwingConstants.CENTER); @@ -104,24 +91,24 @@ public class WidgetBoundsPaneFactory { UILabel widthLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Tree_Width"), SwingConstants.CENTER); UILabel heightLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Tree_Height"), SwingConstants.CENTER); - Component[][] northComponents = new Component[][]{ - new Component[]{positionLabel, ratioLocked != null ? createRightPane(x, null, y) : createRightPane(x, y)}, - new Component[]{null, ratioLocked != null ? createRightPane(xLabel, null, yLabel) : createRightPane(xLabel, yLabel)}, - }; - Component[][] centerComponents = new Component[][]{ - new Component[]{sizeLabel, ratioLocked != null ? createRightPane(width, ratioLocked, height) : createRightPane(width, height)}, - new Component[]{null, ratioLocked != null ? createRightPane(widthLabel, null, heightLabel) : createRightPane(widthLabel, heightLabel)}, - }; - double[] rowSize = {p, p}; - double[] columnSize = {f, RIGHT_PANE_WIDTH}; - int[][] rowCount = ratioLocked != null ? new int[][]{{1, 1, 1}, {1, 1, 1}} : new int[][]{{1, 1}, {1, 1}}; - final JPanel northPanel = TableLayoutHelper.createGapTableLayoutPane(northComponents, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W5, IntervalConstants.INTERVAL_L6); - final JPanel centerPanel = TableLayoutHelper.createGapTableLayoutPane(centerComponents, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W5, IntervalConstants.INTERVAL_L6); - JPanel boundsPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - northPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); - centerPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); - boundsPane.add(northPanel, BorderLayout.NORTH); - boundsPane.add(centerPanel, BorderLayout.CENTER); + JPanel boundsPane = column(VERTICAL_GAP, + row( + cell(positionLabel).weight(LEFT_WEIGHT), + cell(ratioLocked != null ? createRightPane(x, null, y) : createRightPane(x, y)).weight(RIGHT_WEIGHT) + ), + row( + flex(LEFT_WEIGHT), + cell(ratioLocked != null ? createRightPane(xLabel, null, yLabel) : createRightPane(xLabel, yLabel)).weight(RIGHT_WEIGHT) + ), + row( + cell(sizeLabel).weight(LEFT_WEIGHT), + cell(ratioLocked != null ? createRightPane(width, ratioLocked, height) : createRightPane(width, height)).weight(RIGHT_WEIGHT) + ), + row( + flex(LEFT_WEIGHT), + cell(ratioLocked != null ? createRightPane(widthLabel, null, heightLabel) : createRightPane(widthLabel, heightLabel)).weight(RIGHT_WEIGHT) + ) + ).with(it -> it.setBorder(new ScaledEmptyBorder(0, 0, 10, 0))).getComponent(); return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Form_Coords_And_Size"), 230, 24, boundsPane); } @@ -135,18 +122,11 @@ public class WidgetBoundsPaneFactory { public static UIExpandablePane createCardTagBoundPane(UISpinner width) { - JPanel boundsPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - Component[][] components = new Component[][]{ - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Component_Size")), width}, - }; - double[] rowSize = {p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}}; - final JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L6); - panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); - boundsPane.add(panel); + final JPanel boundsPane = column(VERTICAL_GAP, + cell(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Component_Size"))).weight(LEFT_WEIGHT), + cell(width).weight(RIGHT_WEIGHT) + ).getComponent(); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Form_Coords_And_Size"), 280, 24, boundsPane); } } diff --git a/designer-base/src/main/java/com/fr/design/widget/component/BackgroundCompPane.java b/designer-base/src/main/java/com/fr/design/widget/component/BackgroundCompPane.java index 99e642425b..98e4844ade 100644 --- a/designer-base/src/main/java/com/fr/design/widget/component/BackgroundCompPane.java +++ b/designer-base/src/main/java/com/fr/design/widget/component/BackgroundCompPane.java @@ -1,20 +1,22 @@ package com.fr.design.widget.component; -import com.fr.design.designer.IntervalConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.widget.accessibles.AccessibleImgBackgroundEditor; import com.fr.form.ui.Widget; -import javax.swing.BorderFactory; import javax.swing.JPanel; -import java.awt.BorderLayout; -import java.awt.Component; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; /** * Created by ibm on 2017/8/6. @@ -35,25 +37,30 @@ public abstract class BackgroundCompPane extends BasicPane { UILabel headLabel = createUILable(); initBackgroundEditor(); String [] titles = new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Custom")}; - - double f = TableLayout.FILL; - final double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1},{1, 1},{1, 1}}; - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Background_Initial")), initialBackgroundEditor}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Background_Over")), overBackgroundEditor}, - new Component[]{getClickLabel(), clickBackgroundEditor}, - }; - panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - panel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L6, IntervalConstants.INTERVAL_L5, 0, 0)); backgroundHead = new UIButtonGroup(titles); - JPanel headPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ - new Component[]{headLabel, backgroundHead}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W3, IntervalConstants.INTERVAL_L1); - - this.add(headPane, BorderLayout.NORTH); - this.add(panel, BorderLayout.CENTER); + panel = column(VERTICAL_GAP, + row( + flex(LEFT_WEIGHT), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Background_Initial"))).weight(RIGHT_WEIGHT / 2), + cell(initialBackgroundEditor).weight(RIGHT_WEIGHT / 2) + ), + row( + flex(LEFT_WEIGHT), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Background_Over"))).weight(RIGHT_WEIGHT / 2), + cell(overBackgroundEditor).weight(RIGHT_WEIGHT / 2) + ), + row( + flex(LEFT_WEIGHT), + cell(getClickLabel()).weight(RIGHT_WEIGHT / 2), + cell(clickBackgroundEditor).weight(RIGHT_WEIGHT / 2) + ) + ).getComponent(); + this.add(column(VERTICAL_GAP, + row( + cell(headLabel).weight(LEFT_WEIGHT), + cell(backgroundHead).weight(RIGHT_WEIGHT) + ) + ).getComponent()); } diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_justify.svg b/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_justify.svg new file mode 100644 index 0000000000..77c336cb82 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_justify.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_normal.svg b/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_normal.svg new file mode 100644 index 0000000000..bb67ef75ca --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/h_normal.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/v_bottom.svg b/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/v_bottom.svg new file mode 100644 index 0000000000..159c2cbace --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/v_bottom.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/v_center.svg b/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/v_center.svg new file mode 100644 index 0000000000..4dfa2a6d47 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/v_center.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/v_top.svg b/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/v_top.svg new file mode 100644 index 0000000000..a4c2f871ed --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/cellstyle/v_top.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_cut.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_cut.svg new file mode 100644 index 0000000000..15796db6be --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_cut.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_cut_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_cut_disable.svg new file mode 100644 index 0000000000..58fc5b4e70 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/monochrome_cut_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/lock/locked.svg b/designer-base/src/main/resources/com/fine/theme/icon/lock/locked.svg new file mode 100644 index 0000000000..1a1e90b76a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/lock/locked.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/lock/locked_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/lock/locked_disable.svg new file mode 100644 index 0000000000..70fdd16dec --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/lock/locked_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/lock/unlocked.svg b/designer-base/src/main/resources/com/fine/theme/icon/lock/unlocked.svg new file mode 100644 index 0000000000..1117d1fa7c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/lock/unlocked.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/lock/unlocked_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/lock/unlocked_disable.svg new file mode 100644 index 0000000000..d2f7e40651 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/lock/unlocked_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/to_bottom.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/to_bottom.svg new file mode 100644 index 0000000000..e469901e05 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/to_bottom.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/to_bottom_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/to_bottom_disable.svg new file mode 100644 index 0000000000..6c6fd6e02c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/to_bottom_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/to_top.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/to_top.svg new file mode 100644 index 0000000000..2fd47003f0 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/to_top.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/to_top_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/to_top_disable.svg new file mode 100644 index 0000000000..7233c0934d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/to_top_disable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index 45378742e8..d7669df0f3 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -1304,4 +1304,11 @@ CellOtherSetPane.height=$Component.defaultHeight font: bold $defaultFont [style]Label.tipLabel = \ - foreground: $Label.tipColor \ No newline at end of file + foreground: $Label.tipColor + +[style]Button.plainButton = \ + border: null; \ + background: null; \ + hoverBackground : null; \ + selectedBackground : null; \ + pressedBackground : null \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/actions/CopyAction.java b/designer-form/src/main/java/com/fr/design/designer/beans/actions/CopyAction.java index 3d58ca1aa6..5de663ebbe 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/actions/CopyAction.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/actions/CopyAction.java @@ -1,5 +1,6 @@ package com.fr.design.designer.beans.actions; +import com.fine.theme.icon.LazyIcon; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.designer.beans.actions.behavior.CopyableEnable; import com.fr.design.mainframe.FormDesigner; @@ -15,7 +16,7 @@ public class CopyAction extends FormWidgetEditAction { super(t); this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_M_Edit_Copy")); this.setMnemonic('C'); - this.setSmallIcon("/com/fr/design/standard/copy/copy"); + this.setSmallIcon(new LazyIcon("monochrome_copy")); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, DEFAULT_MODIFIER)); setUpdateBehavior(new CopyableEnable()); this.setEnabled(!DesignModeContext.isBanCopyAndCut()); diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/actions/CutAction.java b/designer-form/src/main/java/com/fr/design/designer/beans/actions/CutAction.java index 0a63389355..4b859e85b0 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/actions/CutAction.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/actions/CutAction.java @@ -1,6 +1,7 @@ package com.fr.design.designer.beans.actions; +import com.fine.theme.icon.LazyIcon; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.designer.beans.actions.behavior.CutableEnable; import com.fr.design.mainframe.FormDesigner; @@ -16,7 +17,7 @@ public class CutAction extends FormWidgetEditAction { super(t); this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_M_Edit_Cut")); this.setMnemonic('T'); - this.setSmallIcon("/com/fr/design/standard/cut/cut"); + this.setSmallIcon(new LazyIcon("monochrome_cut")); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, DEFAULT_MODIFIER)); this.setUpdateBehavior(new CutableEnable()); this.setEnabled(!DesignModeContext.isBanCopyAndCut()); diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/actions/FormDeleteAction.java b/designer-form/src/main/java/com/fr/design/designer/beans/actions/FormDeleteAction.java index 75a7442514..67d62af579 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/actions/FormDeleteAction.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/actions/FormDeleteAction.java @@ -5,8 +5,10 @@ package com.fr.design.designer.beans.actions; import java.awt.event.KeyEvent; -import javax.swing.*; +import javax.swing.JComponent; +import javax.swing.KeyStroke; +import com.fine.theme.icon.LazyIcon; import com.fr.design.designer.beans.actions.behavior.DeletableEnable; import com.fr.design.mainframe.FormDesigner; @@ -22,7 +24,7 @@ public class FormDeleteAction extends FormWidgetEditAction { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_M_Edit_Delete")); this.setMnemonic('D'); // Richie:删除菜单图标 - this.setSmallIcon("/com/fr/design/images/m_report/delete"); + this.setSmallIcon(new LazyIcon("remove")); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0)); this.setUpdateBehavior(new DeletableEnable()); } diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/actions/MoveDownAction.java b/designer-form/src/main/java/com/fr/design/designer/beans/actions/MoveDownAction.java index 4663d37599..c2d36f5b63 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/actions/MoveDownAction.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/actions/MoveDownAction.java @@ -1,6 +1,6 @@ package com.fr.design.designer.beans.actions; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.designer.beans.actions.behavior.MovableDownEnable; import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.creator.XCreator; @@ -8,7 +8,6 @@ import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormSelection; - import javax.swing.*; import java.awt.event.KeyEvent; @@ -25,7 +24,7 @@ public class MoveDownAction extends FormWidgetEditAction { super(t); this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Move_Down")); this.setMnemonic('B'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/down.png")); + this.setSmallIcon(new LazyIcon("move_down")); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_OPEN_BRACKET, DEFAULT_MODIFIER)); this.setUpdateBehavior(new MovableDownEnable()); } diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/actions/MoveToBottomAction.java b/designer-form/src/main/java/com/fr/design/designer/beans/actions/MoveToBottomAction.java index a5f76ee833..153a898bd1 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/actions/MoveToBottomAction.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/actions/MoveToBottomAction.java @@ -1,6 +1,6 @@ package com.fr.design.designer.beans.actions; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.designer.beans.actions.behavior.MovableDownEnable; import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.creator.XCreator; @@ -8,7 +8,6 @@ import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormSelection; - import javax.swing.*; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; @@ -26,7 +25,7 @@ public class MoveToBottomAction extends FormWidgetEditAction { super(t); this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Move_To_Bottom")); this.setMnemonic('K'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/to_bottom.png")); + this.setSmallIcon(new LazyIcon("to_bottom")); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_OPEN_BRACKET, DEFAULT_MODIFIER + InputEvent.SHIFT_MASK)); this.setUpdateBehavior(new MovableDownEnable()); } diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/actions/MoveToTopAction.java b/designer-form/src/main/java/com/fr/design/designer/beans/actions/MoveToTopAction.java index 05d42322ce..d3c71f83bf 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/actions/MoveToTopAction.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/actions/MoveToTopAction.java @@ -1,6 +1,6 @@ package com.fr.design.designer.beans.actions; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.designer.beans.actions.behavior.MovableUpEnable; import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.creator.XCreator; @@ -8,8 +8,7 @@ import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormSelection; - -import javax.swing.*; +import javax.swing.KeyStroke; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; @@ -26,7 +25,7 @@ public class MoveToTopAction extends FormWidgetEditAction { super(t); this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Move_To_Top")); this.setMnemonic('T'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/to_top.png")); + this.setSmallIcon(new LazyIcon("to_top")); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_CLOSE_BRACKET, DEFAULT_MODIFIER + InputEvent.SHIFT_MASK)); this.setUpdateBehavior(new MovableUpEnable()); } diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/actions/MoveUpAction.java b/designer-form/src/main/java/com/fr/design/designer/beans/actions/MoveUpAction.java index 81eae97f0c..4760e4c76f 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/actions/MoveUpAction.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/actions/MoveUpAction.java @@ -1,6 +1,6 @@ package com.fr.design.designer.beans.actions; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.designer.beans.actions.behavior.MovableUpEnable; import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.creator.XCreator; @@ -8,7 +8,6 @@ import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormSelection; - import javax.swing.*; import java.awt.event.KeyEvent; @@ -25,7 +24,7 @@ public class MoveUpAction extends FormWidgetEditAction { super(t); this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Move_Up")); this.setMnemonic('F'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/up.png")); + this.setSmallIcon(new LazyIcon("move_up")); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_CLOSE_BRACKET, DEFAULT_MODIFIER)); this.setUpdateBehavior(new MovableUpEnable()); } diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/actions/PasteAction.java b/designer-form/src/main/java/com/fr/design/designer/beans/actions/PasteAction.java index e45d891556..6c257a8896 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/actions/PasteAction.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/actions/PasteAction.java @@ -1,5 +1,6 @@ package com.fr.design.designer.beans.actions; +import com.fine.theme.icon.LazyIcon; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.designer.beans.actions.behavior.PasteEnable; import com.fr.design.mainframe.FormDesigner; @@ -15,7 +16,7 @@ public class PasteAction extends FormWidgetEditAction { super(t); this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Edit_Paste")); this.setMnemonic('P'); - this.setSmallIcon("/com/fr/design/standard/paste/paste"); + this.setSmallIcon(new LazyIcon("monochrome_paste")); this.setUpdateBehavior(new PasteEnable()); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, DEFAULT_MODIFIER)); } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/PropertyGroupPane.java b/designer-form/src/main/java/com/fr/design/designer/creator/PropertyGroupPane.java index bb3c3a42fb..e64479b8ef 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/PropertyGroupPane.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/PropertyGroupPane.java @@ -1,17 +1,21 @@ package com.fr.design.designer.creator; -import com.fr.design.designer.IntervalConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.FormDesigner; import com.fr.form.ui.Widget; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; + /** * Created by kerry on 2017/9/7. */ @@ -50,15 +54,23 @@ public class PropertyGroupPane extends BasicPane { this.setLayout(FRGUIPaneFactory.createBorderLayout()); int count = crPropertyDescriptors.length; crPropertyDescriptorPanes = new CRPropertyDescriptorPane[count]; - Component[][] components = new Component[count][]; + JPanel column = column(VERTICAL_GAP).getComponent(); for (int i = 0; i < count; i++) { crPropertyDescriptorPanes[i] = new CRPropertyDescriptorPane(crPropertyDescriptors[i], xCreator, designer); - components[i] = crPropertyDescriptorPanes[i].createTableLayoutComponent(); + Component[] component = crPropertyDescriptorPanes[i].createTableLayoutComponent(); + if(component[1] != null) { + column.add(row( + cell(component[0]).weight(LEFT_WEIGHT), cell(component[1]).weight(RIGHT_WEIGHT) + ).getComponent()); + } else { + column.add(component[0]); + } + } + if (count == 0) { + this.setVisible(false); + } else { + this.add(column, BorderLayout.CENTER); } - - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L2, IntervalConstants.INTERVAL_L1); - panel.setBorder(BorderFactory.createEmptyBorder(5, 0, 10, 0)); - this.add(panel, BorderLayout.CENTER); } public void populate(Widget widget) { @@ -67,6 +79,8 @@ public class PropertyGroupPane extends BasicPane { } } + + @Override protected String title4PopupWindow() { return "PropertyGroupPane"; diff --git a/designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java b/designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java index 0e344e083f..c990e547f2 100644 --- a/designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java +++ b/designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java @@ -1,10 +1,10 @@ package com.fr.design.designer.treeview; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XCreatorUtils; import com.fr.log.FineLoggerFactory; -import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellRenderer; @@ -35,7 +35,7 @@ public class ComponentTreeCellRenderer extends DefaultTreeCellRenderer { } this.treeCellRender = ((XCreator) value).getComponentTreeCellRender(); } - this.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0)); + this.setBorder(new ScaledEmptyBorder(2, 0, 2, 0)); this.setBackgroundNonSelectionColor(getBackground()); return this; } diff --git a/designer-form/src/main/java/com/fr/design/gui/controlpane/EventPropertyPane.java b/designer-form/src/main/java/com/fr/design/gui/controlpane/EventPropertyPane.java index 2a67f61ae4..d52a0b8925 100644 --- a/designer-form/src/main/java/com/fr/design/gui/controlpane/EventPropertyPane.java +++ b/designer-form/src/main/java/com/fr/design/gui/controlpane/EventPropertyPane.java @@ -1,5 +1,6 @@ package com.fr.design.gui.controlpane; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.properties.EventPropertyTable; import com.fr.design.i18n.Toolkit; @@ -22,6 +23,7 @@ public class EventPropertyPane extends UIListGroupControlPane { public EventPropertyPane(FormDesigner designer) { super(); this.designer = designer; + setBorder(new ScaledEmptyBorder(10, 0, 10, 0)); } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java b/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java index 4cd6072225..8399fa2352 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java @@ -10,7 +10,6 @@ import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; import com.fr.design.designer.treeview.ComponentTreeCellRenderer; import com.fr.design.designer.treeview.ComponentTreeModel; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.gui.itree.UITreeUI; import com.fr.design.utils.ComponentUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.StringUtils; @@ -47,7 +46,6 @@ public class ComponentTree extends JTree { private FormDesigner designer; private ComponentTreeModel model; - private UITreeUI uiTreeUI = new UITreeUI(); private PopupPreviewPane previewPane; private static final Map> treePathCache = new HashMap<>(); @@ -56,7 +54,6 @@ public class ComponentTree extends JTree { public ComponentTree(FormDesigner designer) { this.designer = designer; -// this.setBackground(UIConstants.TREE_BACKGROUND); setRootVisible(true); setCellRenderer(new ComponentTreeCellRenderer()); getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); @@ -66,7 +63,6 @@ public class ComponentTree extends JTree { this.refreshTreeRoot(); initListeners(); setEditable(true); -// setUI(uiTreeUI); setBorder(BorderFactory.createEmptyBorder(PADDING_TOP, PADDING_LEFT, 0, 0)); } @@ -162,7 +158,6 @@ public class ComponentTree extends JTree { */ public void refreshUI() { updateUI(); -// setUI(uiTreeUI); } @@ -525,7 +520,6 @@ public class ComponentTree extends JTree { PopupPreviewPane() { contentPane = new JPanel(); -// contentPane.setBackground(Color.white); this.setLayout(new BorderLayout()); this.add(contentPane, BorderLayout.CENTER); this.setOpaque(false); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java b/designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java index 17f07cdee6..44723b6d32 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java @@ -1,8 +1,8 @@ package com.fr.design.mainframe; +import com.fine.theme.utils.FineUIScale; import com.fr.base.BaseUtils; import com.fr.design.actions.UndoableAction; -import com.fr.design.constants.UIConstants; import com.fr.design.designer.beans.events.DesignerEditListener; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XWAbsoluteBodyLayout; @@ -17,7 +17,6 @@ import com.fr.design.menu.ToolBarDef; import com.fr.design.parameter.HierarchyTreePane; import javax.swing.Action; -import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JPanel; import javax.swing.SwingUtilities; @@ -35,7 +34,6 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree private static final int PARA = 0; private static final int BODY = 1; private static final int SHORTS_SEPARATOR_POS = 4; - private static final int TOOLBAR_PADDING_RIGHT = 10; private ShortCut4JControlPane[] shorts; private ComponentTree componentTree; @@ -160,42 +158,26 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree private JPanel getWidgetPane() { shorts = createShortcuts(); - JPanel widgetPane = new JPanel(); widgetPane.setLayout(FRGUIPaneFactory.createBorderLayout()); + UIToolbar toolbar = getToolBar(); + widgetPane.add(toolbar, BorderLayout.NORTH); - widgetPane.add(getToolBarPane(), BorderLayout.CENTER); UIScrollPane scrollPane = new UIScrollPane(componentTree); - scrollPane.setBorder(BorderFactory.createEmptyBorder()); - scrollPane.setPreferredSize(new Dimension(210, 170)); - widgetPane.add(scrollPane, BorderLayout.SOUTH); + scrollPane.setPreferredSize(FineUIScale.scale(new Dimension(210, 170))); + widgetPane.add(scrollPane, BorderLayout.CENTER); return widgetPane; } - private JPanel getToolBarPane() { + private UIToolbar getToolBar() { UIToolbar toolBar = ToolBarDef.createJToolBar(); -// toolBar.setUI(new UIToolBarUI() { -// @Override -// public void paint(Graphics g, JComponent c) { -// Graphics2D g2 = (Graphics2D) g; -// g2.setColor(new Color(245, 245, 247)); -// g2.fillRect(0, 0, c.getWidth(), c.getHeight()); -// } -// }); for (int i = 0; i < shorts.length; i++) { if (i == SHORTS_SEPARATOR_POS) { - toolBar.addSeparator(new Dimension(2, 16)); + toolBar.addSeparator(FineUIScale.scale(new Dimension(2, 16))); } shorts[i].getShortCut().intoJToolBar(toolBar); } - - JPanel toolBarPane = new JPanel(new BorderLayout()); - toolBarPane.add(toolBar, BorderLayout.CENTER); - toolBarPane.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIConstants.BARNOMAL)); - JPanel toolBarPaneWrapper = new JPanel(new BorderLayout()); - toolBarPaneWrapper.add(toolBarPane, BorderLayout.CENTER); - toolBarPaneWrapper.setBorder(BorderFactory.createEmptyBorder(1, 0, 2, TOOLBAR_PADDING_RIGHT)); - return toolBarPaneWrapper; + return toolBar; } /** 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 8abb9d81cf..aa6f5f6642 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 @@ -1,8 +1,8 @@ package com.fr.design.mainframe; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.BaseUtils; import com.fr.design.ExtraDesignClassManager; -import com.fr.design.constants.UIConstants; import com.fr.design.designer.beans.events.DesignerEditListener; import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.creator.XComponent; @@ -29,7 +29,6 @@ import com.fr.design.mainframe.widget.ui.FormWidgetCardPaneFactory; import com.fr.design.widget.ui.designer.mobile.MobileWidgetDefinePane; import com.fr.stable.ArrayUtils; -import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JPanel; import javax.swing.JScrollPane; @@ -46,8 +45,6 @@ import java.util.Set; */ public class WidgetPropertyPane extends FormDockView implements BaseWidgetPropertyPane { - private static final int PADDING = 10; - private static final int PADDING_M = 12; private FormWidgetCardPane formWidgetCardPane; // 控件的属性表 private EventPropertyPane eventTable; // 控件的事件表 private List widgetPropertyTables; // 这个变量应该是保存控件拓展的属性tab @@ -217,7 +214,6 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper for (WidgetPropertyUIProvider widgetAttrProvider : widgetAttrProviders) { MobileWidgetDefinePane extraPane = (MobileWidgetDefinePane) widgetAttrProvider.createWidgetAttrPane(); if (extraPane != null) { - extraPane.setBorder(BorderFactory.createEmptyBorder(PADDING, PADDING, PADDING, PADDING_M)); mobileExtraPropertyPanes.add(extraPane); wsp.add(extraPane); } @@ -282,8 +278,8 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper tabbedPane.show(center, tabTitles[index]); } }; - tabsHeaderIconPane.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, UIConstants.SHADOW_GREY)); this.add(tabsHeaderIconPane, BorderLayout.NORTH); + this.setBorder(new ScaledEmptyBorder(10, 10, 0, 10)); } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/BasicSetVisiblePropertyPane.java b/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/BasicSetVisiblePropertyPane.java index 5b359c9ac5..05dd7923e7 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/BasicSetVisiblePropertyPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/BasicSetVisiblePropertyPane.java @@ -1,14 +1,9 @@ package com.fr.design.mainframe.widget.ui; import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.form.ui.Widget; -import javax.swing.BorderFactory; -import javax.swing.JPanel; -import java.awt.BorderLayout; - /** * Created by kerry on 2017/9/30. */ @@ -20,18 +15,14 @@ public class BasicSetVisiblePropertyPane extends FormBasicPropertyPane { } protected void initComponent() { - JPanel pane2 = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - pane2.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); UICheckBox otherOtherConfig = createOtherConfig(); if(otherOtherConfig != null){ - pane2.add(otherOtherConfig); + corePane.add(otherOtherConfig); } visibleCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Widget_Visible"), true); visibleCheckBox.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Basic")); - visibleCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); - pane2.add(visibleCheckBox); - this.add(pane2, BorderLayout.CENTER); + corePane.add(visibleCheckBox); } public UICheckBox createOtherConfig(){ diff --git a/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/FormBasicWidgetPropertyPane.java b/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/FormBasicWidgetPropertyPane.java index 27d55ac28c..f9646e2706 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/FormBasicWidgetPropertyPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/FormBasicWidgetPropertyPane.java @@ -1,13 +1,9 @@ package com.fr.design.mainframe.widget.ui; import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.form.ui.Widget; -import javax.swing.BorderFactory; -import java.awt.Component; - /** * Created by ibm on 2017/7/26. */ @@ -21,8 +17,6 @@ public class FormBasicWidgetPropertyPane extends BasicSetVisiblePropertyPane { public UICheckBox createOtherConfig() { enableCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Enabled"), true); enableCheckBox.setGlobalName(Toolkit.i18nText("Fine-Design_Report_Basic")); - - enableCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); return enableCheckBox; } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/FormSingleWidgetCardPane.java b/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/FormSingleWidgetCardPane.java index 98c539f278..ec9adab243 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/FormSingleWidgetCardPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/FormSingleWidgetCardPane.java @@ -1,6 +1,8 @@ package com.fr.design.mainframe.widget.ui; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.base.mode.DesignModeContext; +import com.fr.design.border.FineBorderFactory; import com.fr.design.data.DataCreatorUI; import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.creator.XCreator; @@ -8,7 +10,6 @@ import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XWAbsoluteBodyLayout; import com.fr.design.designer.creator.XWAbsoluteLayout; -import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.designer.creator.XWParameterLayout; import com.fr.design.designer.creator.cardlayout.XWCardTagLayout; import com.fr.design.file.HistoryTemplateListCache; @@ -32,19 +33,21 @@ import com.fr.form.main.WidgetUtil; import com.fr.form.ui.ChartEditor; import com.fr.form.ui.Widget; import com.fr.form.ui.container.WScaleLayout; -import com.fr.form.ui.container.WSortLayout; import com.fr.form.ui.container.WTitleLayout; import com.fr.form.ui.widget.CRBoundsWidget; import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; import com.fr.stable.StringUtils; -import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.JPanel; import java.awt.BorderLayout; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.fix; + public class FormSingleWidgetCardPane extends FormWidgetCardPane { private AttributeChangeListener listener; @@ -114,18 +117,14 @@ public class FormSingleWidgetCardPane extends FormWidgetCardPane { attriCardPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); content.add(attriCardPane, BorderLayout.CENTER); - content.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); final boolean isExtraWidget = FormWidgetDefinePaneFactoryBase.isExtraXWidget(innerCreator.toData()); - this.listener = new AttributeChangeListener() { - @Override - public void attributeChange() { - if (!isExtraWidget) { - updateCreator(); - } - updateWidgetBound(); - firePropertyEdit(); + this.listener = () -> { + if (!isExtraWidget) { + updateCreator(); } + updateWidgetBound(); + firePropertyEdit(); }; freshPropertyMode(innerCreator); @@ -139,14 +138,19 @@ public class FormSingleWidgetCardPane extends FormWidgetCardPane { } widgetPropertyPane = WidgetBasicPropertyPaneFactory.createBasicPropertyPane(innerCreator); - + widgetPropertyPane.setBorder(new ScaledEmptyBorder(0, 0, 10, 0)); UIExpandablePane uiExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Basic"), 280, 20, widgetPropertyPane); - - content.add(uiExpandablePane, BorderLayout.NORTH); + content.add(column( + cell(uiExpandablePane), + fix(1).with(it -> it.setBorder(FineBorderFactory.createDefaultUnderlineBorder())) + ).getComponent(), BorderLayout.NORTH); widgetBoundPane = createWidgetBoundPane(xCreator); if (widgetBoundPane != null) { - attriCardPane.add(widgetBoundPane, BorderLayout.NORTH); + attriCardPane.add(column( + cell(widgetBoundPane), + fix(1).with(it -> it.setBorder(FineBorderFactory.createDefaultUnderlineBorder())) + ).getComponent(), BorderLayout.NORTH); } } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java b/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java index c2d145983a..6519e859dc 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java @@ -6,7 +6,6 @@ import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.FormDesigner; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; @@ -49,8 +48,6 @@ public class FormWidgetCardPane extends AbstractAttrNoScrollPane { private void initLayout() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - // 跟上方tab标题“属性”那一栏间距10 - this.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); } protected JPanel createContentPaneInScrollPane() { diff --git a/designer-form/src/main/java/com/fr/design/parameter/ParameterPropertyPane.java b/designer-form/src/main/java/com/fr/design/parameter/ParameterPropertyPane.java index ddab3a305e..16c0e91d65 100644 --- a/designer-form/src/main/java/com/fr/design/parameter/ParameterPropertyPane.java +++ b/designer-form/src/main/java/com/fr/design/parameter/ParameterPropertyPane.java @@ -1,6 +1,7 @@ package com.fr.design.parameter; import com.fr.base.Parameter; +import com.fr.design.border.FineBorderFactory; import com.fr.design.constants.UIConstants; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XWParameterLayout; @@ -31,10 +32,7 @@ public class ParameterPropertyPane extends JPanel{ private static ParameterPropertyPane THIS; private boolean isEditing = false; - private static final int HIDE_HEIGHT = 40; - private static final int PADDING_SMALL = 5; private static final int PADDING_MIDDLE = 10; - private static final int PADDING_LARGE = 15; private static final int ADD_PARA_PANE_MAX_HEIGHT = 95; public static final ParameterPropertyPane getInstance() { @@ -81,15 +79,13 @@ public class ParameterPropertyPane extends JPanel{ } }; JPanel scrollPaneWrapperInner = new JPanel(new BorderLayout()); - scrollPaneWrapperInner.setBorder(BorderFactory.createEmptyBorder(PADDING_MIDDLE, PADDING_MIDDLE, PADDING_MIDDLE, PADDING_SMALL)); scrollPaneWrapperInner.add(basicScrollPane, BorderLayout.CENTER); addParaPane = new JPanel(new BorderLayout()); addParaPane.add(scrollPaneWrapperInner, BorderLayout.CENTER); - addParaPane.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIConstants.SPLIT_LINE)); initParameterListener(); - this.setLayout(new BorderLayout(0, 6)); - this.setBorder(BorderFactory.createEmptyBorder(0, 0, PADDING_MIDDLE, 0)); + this.setLayout(new BorderLayout()); + this.setBorder(FineBorderFactory.createDefaultUnderlineBorder()); this.add(addParaPane, BorderLayout.NORTH); } @@ -138,7 +134,7 @@ public class ParameterPropertyPane extends JPanel{ } } } - + private void setEditor(FormDesigner editor) { if (formHierarchyTreePaneWrapper == null) { formHierarchyTreePaneWrapper = new JPanel(new BorderLayout()); diff --git a/designer-form/src/main/java/com/fr/design/parameter/RootDesignDefinePane.java b/designer-form/src/main/java/com/fr/design/parameter/RootDesignDefinePane.java index 57082e37f0..679284edd3 100644 --- a/designer-form/src/main/java/com/fr/design/parameter/RootDesignDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/parameter/RootDesignDefinePane.java @@ -1,10 +1,11 @@ package com.fr.design.parameter; -import com.fr.base.BaseUtils; +import com.fine.swing.ui.layout.Column; +import com.fine.theme.icon.LazyIcon; import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.border.FineBorderFactory; import com.fr.design.data.DataCreatorUI; -import com.fr.design.designer.IntervalConstants; import com.fr.design.designer.creator.CRPropertyDescriptor; import com.fr.design.designer.creator.PropertyGroupPane; import com.fr.design.designer.creator.XCreator; @@ -21,18 +22,16 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerUIModeConfig; import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormSelection; import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.widget.accessibles.AccessibleBackgroundEditor; -import com.fr.design.widgettheme.processor.WidgetThemeParaCreatorPaneAdder; import com.fr.design.utils.gui.LayoutUtils; import com.fr.design.utils.gui.UIComponentUtils; import com.fr.design.widget.ui.designer.AbstractDataModify; import com.fr.design.widget.ui.designer.component.UIBoundSpinner; +import com.fr.design.widgettheme.processor.WidgetThemeParaCreatorPaneAdder; import com.fr.form.ui.container.WParameterLayout; import com.fr.general.Background; import com.fr.general.GeneralContext; @@ -40,7 +39,6 @@ import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; import com.fr.report.stable.FormConstants; -import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JCheckBox; import javax.swing.JPanel; @@ -51,6 +49,14 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; + /** * Created by ibm on 2017/8/2. */ @@ -69,6 +75,7 @@ public class RootDesignDefinePane extends AbstractDataModify { private PropertyGroupPane extraPropertyGroupPane; protected final List> extraPaneList = new ArrayList<>(); private JPanel backgroundPane; + private JPanel corePane; public RootDesignDefinePane(XCreator xCreator) { super(xCreator); @@ -80,6 +87,8 @@ public class RootDesignDefinePane extends AbstractDataModify { public void initComponent() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); + corePane = new Column(); + this.add(corePane, BorderLayout.CENTER); if (newForm) { paraHeight = new UIBoundSpinner(0, Integer.MAX_VALUE, 1, 0); } else { @@ -87,10 +96,11 @@ public class RootDesignDefinePane extends AbstractDataModify { } JPanel advancePane = createAdvancePane(); UIExpandablePane advanceExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, advancePane); - this.add(advanceExpandablePane, BorderLayout.NORTH); + corePane.add(advanceExpandablePane); JPanel layoutPane = createBoundsPane(); UIExpandablePane layoutExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Size"), 280, 20, layoutPane); - this.add(layoutExpandablePane, BorderLayout.CENTER); + corePane.add(fix(10).with(it -> it.setBorder(FineBorderFactory.createDefaultUnderlineBorder())).getComponent()); + corePane.add(layoutExpandablePane); this.addExtraUIExpandablePaneFromPlugin(); } @@ -104,23 +114,21 @@ public class RootDesignDefinePane extends AbstractDataModify { panel.add(uiExpandablePane); } } - this.add(panel, BorderLayout.SOUTH); + corePane.add(panel); } public JPanel createBoundsPane() { - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] rowSize = {p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}}; - Component[] component = newForm ? new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit_Design_Height")), paraHeight} : - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Desin_Width")), designerWidth}; - Component[][] components = new Component[][]{component}; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); - jPanel.add(panel); - return jPanel; + if (newForm) { + return row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit_Design_Height"))).weight(LEFT_WEIGHT), + cell(paraHeight).weight(RIGHT_WEIGHT) + ).getComponent(); + } else { + return row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Desin_Width"))).weight(LEFT_WEIGHT), + cell(designerWidth).weight(RIGHT_WEIGHT) + ).getComponent(); + } } public JPanel createAdvancePane() { @@ -139,14 +147,12 @@ public class RootDesignDefinePane extends AbstractDataModify { * @date: 2020/11/05 15:36 */ private JPanel getTemplateAdvancePane() { - JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); labelNameTextField = new UITextField(); displayReport = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Display_Nothing_Before_Query")); UIComponentUtils.setLineWrap(displayReport); useParamsTemplate = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Use_Params_Template")); fireAfterEditor = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Trigger_Editing_End_Event")); fireAfterEditor.setEnabled(false); - fireAfterEditor.setBorder(BorderFactory.createEmptyBorder(0, 30, 0, 0)); useParamsTemplate.addChangeListener(e -> { boolean isSelected = ((UICheckBox) e.getSource()).isSelected(); fireAfterEditor.setEnabled(isSelected); @@ -154,37 +160,37 @@ public class RootDesignDefinePane extends AbstractDataModify { fireAfterEditor.setSelected(false); } }); - Icon[] hAlignmentIconArray = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"), - BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"), - BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png"),}; + Icon[][] hAlignmentIconArray = {{new LazyIcon("h_left"), new LazyIcon("h_left").white()}, + {new LazyIcon("h_center"), new LazyIcon("h_center").white()}, + {new LazyIcon("h_right"), new LazyIcon("h_right").white()}}; Integer[] hAlignment = new Integer[]{FormConstants.LEFTPOSITION, FormConstants.CENTERPOSITION, FormConstants.RIGHTPOSITION}; - hAlignmentPane = new UIButtonGroup(hAlignmentIconArray, hAlignment); + + hAlignmentPane = new UIButtonGroup<>(hAlignmentIconArray, hAlignment); hAlignmentPane.setAllToolTips(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_StyleAlignment_Left") , com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_StyleAlignment_Center"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_StyleAlignment_Right")}); backgroundPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); this.initExtraPane(); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - 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}}; - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name")), labelNameTextField}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Base_Background")), backgroundPane}, - new Component[]{displayReport, null}, - new Component[]{useParamsTemplate, null}, - new Component[]{fireAfterEditor, null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Display_Position")), hAlignmentPane} - }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W0, IntervalConstants.INTERVAL_L1); - panel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - CRPropertyDescriptor[] extraTableEditor = new CRPropertyDescriptor[0]; - extraTableEditor = root.getExtraTableEditor(); + CRPropertyDescriptor[] extraTableEditor = root.getExtraTableEditor(); extraPropertyGroupPane = new PropertyGroupPane(extraTableEditor, root); - jPanel.add(panel, BorderLayout.NORTH); - jPanel.add(extraPropertyGroupPane, BorderLayout.CENTER); - return jPanel; + return column(VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name"))).weight(LEFT_WEIGHT), + cell(labelNameTextField).weight(RIGHT_WEIGHT) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Base_Background"))).weight(LEFT_WEIGHT), + cell(backgroundPane).weight(RIGHT_WEIGHT) + ), + cell(displayReport), + cell(useParamsTemplate), + cell(fireAfterEditor), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Display_Position"))).weight(LEFT_WEIGHT), + cell(hAlignmentPane).weight(RIGHT_WEIGHT) + ), + cell(extraPropertyGroupPane) + ).getComponent(); } private void initExtraPane() { @@ -244,14 +250,12 @@ public class RootDesignDefinePane extends AbstractDataModify { * @date: 2020/11/05 15:36 */ private JPanel getNewFormAdvancePane() { - JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); labelNameTextField = new UITextField(); displayReport = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Display_Nothing_Before_Query")); UIComponentUtils.setLineWrap(displayReport); useParamsTemplate = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Use_Params_Template")); fireAfterEditor = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Trigger_Editing_End_Event")); fireAfterEditor.setEnabled(false); - fireAfterEditor.setBorder(BorderFactory.createEmptyBorder(0, 30, 0, 0)); useParamsTemplate.addChangeListener(e -> { boolean isSelected = ((UICheckBox) e.getSource()).isSelected(); fireAfterEditor.setEnabled(isSelected); @@ -261,24 +265,20 @@ public class RootDesignDefinePane extends AbstractDataModify { }); backgroundPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); this.initExtraPane(); - 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}}; - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name")), labelNameTextField}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Base_Background")), backgroundPane}, - new Component[]{displayReport, null}, - new Component[]{useParamsTemplate, null}, - new Component[]{fireAfterEditor, null}, - }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W0, IntervalConstants.INTERVAL_L1); - panel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, IntervalConstants.INTERVAL_L1, 0)); - - jPanel.add(panel, BorderLayout.NORTH); - return jPanel; + return column(VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name"))).weight(LEFT_WEIGHT), + cell(labelNameTextField).weight(RIGHT_WEIGHT) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Base_Background"))).weight(LEFT_WEIGHT), + cell(backgroundPane).weight(RIGHT_WEIGHT) + ), + cell(displayReport), + cell(useParamsTemplate), + cell(fireAfterEditor) + ).getComponent(); } @Override diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/ButtonDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/ButtonDefinePane.java index 0863260b3e..52695abd7e 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/ButtonDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/ButtonDefinePane.java @@ -3,15 +3,12 @@ package com.fr.design.widget.ui.designer; import com.finebi.cbb.utils.CollectionUtils; import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.designer.IntervalConstants; import com.fr.design.designer.creator.XCreator; import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.fun.WidgetAdvancedPaneProvider; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; 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.AccessibleIconEditor; import com.fr.design.widgettheme.processor.WidgetThemeParaCreatorPaneAdder; import com.fr.design.widget.btn.ButtonConstants; @@ -20,9 +17,7 @@ import com.fr.general.GeneralContext; import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; import com.fr.stable.StableUtils; -import org.jetbrains.annotations.NotNull; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingConstants; import java.awt.Component; @@ -30,6 +25,13 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; + public abstract class ButtonDefinePane extends AbstractDataModify { private UITextField hotkeysTextField; private UITextField buttonNameTextField; @@ -80,55 +82,39 @@ public abstract class ButtonDefinePane extends AbstractDataMod } private void refreshAdvancedPane(boolean containsExtraPane) { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; Component[] backgroundCompPane = createBackgroundComp(); Component[] frFont = createFontPane(); - double[] rowSize; - double[] columnSize; - int[][] rowCount; - Component[][] n_components; + hotkeysTextField.setToolTipText(StableUtils.join(ButtonConstants.HOTKEYS, ",")); + extraPane = column(VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Button_Name"))).weight(LEFT_WEIGHT), + cell(buttonNameTextField).weight(RIGHT_WEIGHT) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name"))).weight(LEFT_WEIGHT), + cell(labelNameTextField).weight(RIGHT_WEIGHT) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Icon"))).weight(LEFT_WEIGHT), + cell(iconPane).weight(RIGHT_WEIGHT) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Button_Hot_keys"))).weight(LEFT_WEIGHT), + cell(hotkeysTextField).weight(RIGHT_WEIGHT) + ) + ).getComponent(); if (containsExtraPane) { JPanel panel = FRGUIPaneFactory.createYBoxEmptyBorderPane(); for (BasicBeanPane pane : extraPaneList) { panel.add(pane); } - rowSize = new double[]{p, p, p, p, p}; - columnSize = new double[]{p, f}; - rowCount = new int[][]{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; - n_components = getExtraAdvancedComponents(panel); + extraPane.add(panel); } else { - rowSize = new double[]{p, p, p, p, p, p, p, p}; - columnSize = new double[]{p, f}; - rowCount = new int[][]{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; - n_components = getAdvancedComponents(backgroundCompPane, frFont); + extraPane.add(column(VERTICAL_GAP, + cell(backgroundCompPane[0]), + cell(frFont[0]) + ).getComponent(), 2); } - hotkeysTextField.setToolTipText(StableUtils.join(ButtonConstants.HOTKEYS, ",")); - extraPane = TableLayoutHelper.createGapTableLayoutPane(n_components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - extraPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); - } - - @NotNull - private Component[][] getAdvancedComponents(Component[] backgroundCompPane, Component[] frFont) { - return new Component[][]{ - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Button_Name")), buttonNameTextField}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name")), labelNameTextField}, - backgroundCompPane, - frFont, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Icon")), iconPane}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Button_Hot_keys")), hotkeysTextField} - }; - } - - @NotNull - private Component[][] getExtraAdvancedComponents(JPanel panel) { - return new Component[][]{ - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Button_Name")), buttonNameTextField}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name")), labelNameTextField}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Icon")), iconPane}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Button_Hot_keys")), hotkeysTextField}, - {panel, null} - }; } protected void initPluginListener() { 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 bc69bbd1a2..733317eb1d 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,20 +1,22 @@ 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.BorderFactory; import javax.swing.JPanel; import javax.swing.SpinnerNumberModel; -import java.awt.Component; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; public class ButtonGroupDictPane extends JPanel { @@ -32,23 +34,16 @@ 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)); 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, 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); + this.add(column(VERTICAL_GAP, + cell(adaptiveCheckbox), + row( + cell(columnLabel).weight(LEFT_WEIGHT), cell(columnSpinner).weight(RIGHT_WEIGHT) + ) + ).getComponent()); } public void populate(ButtonGroup buttonGroup) { diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/CheckBoxDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/CheckBoxDefinePane.java index d73582df7b..9390c7573f 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/CheckBoxDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/CheckBoxDefinePane.java @@ -3,7 +3,6 @@ package com.fr.design.widget.ui.designer; import com.finebi.cbb.utils.CollectionUtils; import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.designer.IntervalConstants; import com.fr.design.designer.creator.XCreator; import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.fun.WidgetAdvancedPaneProvider; @@ -11,7 +10,6 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.widgettheme.processor.WidgetThemeParaCreatorPaneAdder; import com.fr.design.gui.frpane.FontSizeComboPane; import com.fr.design.widget.ui.designer.component.FormWidgetValuePane; @@ -20,14 +18,18 @@ import com.fr.general.GeneralContext; import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; -import javax.swing.BorderFactory; import javax.swing.JPanel; -import javax.swing.SwingConstants; -import java.awt.Component; import java.util.ArrayList; import java.util.List; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; + public class CheckBoxDefinePane extends AbstractDataModify { private UITextField text; private FontSizeComboPane fontSizePane; @@ -41,31 +43,28 @@ public class CheckBoxDefinePane extends AbstractDataModify { public CheckBoxDefinePane(XCreator xCreator) { super(xCreator); - iniComoponents(); + initComponents(); } - private void iniComoponents() { + private void initComponents() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); text = new UITextField(); fontSizePane = new FontSizeComboPane(); labelNameTextField = new UITextField(); - UILabel widgetValueLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Estate_Widget_Value")); - widgetValueLabel.setVerticalAlignment(SwingConstants.TOP); formWidgetValuePane = new FormWidgetValuePane(creator.toData(), false); initExtraPane(); - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name")), labelNameTextField}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Text")), text }, - new Component[]{widgetValueLabel, formWidgetValuePane }, - new Component[]{extraPane, null}, - }; - double[] rowSize = {P, P, P, P, P, P}; - double[] columnSize = {P, F}; - int[][] rowCount = {{1, 1},{1, 1}, {1, 3},{1, 1}}; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - JPanel boundsPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); - boundsPane.add(panel); + JPanel boundsPane = column(VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name"))).weight(LEFT_WEIGHT), + cell(labelNameTextField).weight(RIGHT_WEIGHT) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Text"))).weight(LEFT_WEIGHT), + cell(text).weight(RIGHT_WEIGHT) + ), + cell(formWidgetValuePane), + cell(extraPane) + ).getComponent(); UIExpandablePane uiExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, boundsPane); this.add(uiExpandablePane); @@ -94,13 +93,10 @@ public class CheckBoxDefinePane extends AbstractDataModify { extraPane.add(pane); } } else { - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Font_Size")), fontSizePane} - }; - double[] rowSize = {P}; - double[] columnSize = {P, F}; - int[][] rowCount = {{1, 1}}; - extraPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); + extraPane = row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Font_Size"))).weight(LEFT_WEIGHT), + cell(fontSizePane).weight(RIGHT_WEIGHT) + ).getComponent(); } } diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/CheckBoxGroupDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/CheckBoxGroupDefinePane.java index 579001b555..97df720aa0 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/CheckBoxGroupDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/CheckBoxGroupDefinePane.java @@ -1,19 +1,19 @@ package com.fr.design.widget.ui.designer; import com.fr.design.data.DataCreatorUI; -import com.fr.design.designer.IntervalConstants; import com.fr.design.designer.creator.XCreator; import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.present.dict.DictionaryPane; import com.fr.design.widget.component.ReturnTypePane; import com.fr.design.widget.ui.designer.btn.ButtonGroupDefinePane; import com.fr.form.ui.CheckBoxGroup; -import javax.swing.*; -import java.awt.*; +import javax.swing.JPanel; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; public class CheckBoxGroupDefinePane extends ButtonGroupDefinePane { private DictionaryPane dictPane; @@ -39,19 +39,11 @@ public class CheckBoxGroupDefinePane extends ButtonGroupDefinePane { private UICheckBox removeRepeatCheckBox; @@ -21,7 +19,6 @@ public class ComboBoxDefinePane extends DictEditorDefinePane { public UICheckBox createRepeatCheckBox(){ removeRepeatCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_No_Repeat")); - removeRepeatCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); return removeRepeatCheckBox; } diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/ComboCheckBoxDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/ComboCheckBoxDefinePane.java index 86a00b990d..bac9a7076c 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/ComboCheckBoxDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/ComboCheckBoxDefinePane.java @@ -1,19 +1,20 @@ package com.fr.design.widget.ui.designer; import com.fr.design.data.DataCreatorUI; -import com.fr.design.designer.IntervalConstants; import com.fr.design.designer.creator.XCreator; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.widget.component.ReturnTypePane; import com.fr.form.ui.ComboCheckBox; -import javax.swing.*; -import java.awt.*; +import javax.swing.JPanel; +import java.awt.Component; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; public class ComboCheckBoxDefinePane extends DictEditorDefinePane { private UICheckBox supportTagCheckBox; @@ -27,7 +28,6 @@ public class ComboCheckBoxDefinePane extends DictEditorDefinePane public UICheckBox createRepeatCheckBox(){ removeRepeatCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_No_Repeat")); - removeRepeatCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); return removeRepeatCheckBox; } @@ -39,20 +39,11 @@ public class ComboCheckBoxDefinePane extends DictEditorDefinePane public JPanel createOtherPane(){ supportTagCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Support_Tag"), true); - supportTagCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); returnTypePane = new ReturnTypePane(); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - Component[][] components = new Component[][]{ - new Component[]{supportTagCheckBox, null }, - new Component[]{returnTypePane, null}, - }; - double[] rowSize = {p, p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1},{1, 1}}; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_L2, IntervalConstants.INTERVAL_L1); - return panel; + return column(VERTICAL_GAP, + cell(supportTagCheckBox),cell(returnTypePane) + ).getComponent(); } protected void populateSubDictionaryEditorBean(ComboCheckBox ob){ diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/CustomWritableRepeatEditorPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/CustomWritableRepeatEditorPane.java index 415a392f4c..c57d05da12 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/CustomWritableRepeatEditorPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/CustomWritableRepeatEditorPane.java @@ -2,12 +2,10 @@ package com.fr.design.widget.ui.designer; import com.fr.design.designer.creator.XCreator; import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.form.ui.CustomWriteAbleRepeatEditor; -import javax.swing.*; -import java.awt.*; +import javax.swing.JPanel; /** * Author : Shockway @@ -25,9 +23,8 @@ public abstract class CustomWritableRepeatEditorPane { private UIButtonGroup returnTypeComboBox; private DateValuePane startDv; @@ -65,37 +69,34 @@ public class DateEditorDefinePane extends DirectWriteEditorDefinePane(new String[] {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Date") , com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_String")}); JPanel formatHead = createFormatHead(); - startDv = new DateValuePane(); - endDv = new DateValuePane(); + startDv = new DateValuePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_FS_Start_Date")); + endDv = new DateValuePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_FS_End_Date")); initExtraPane(); - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name")), labelNameTextField}, - new Component[]{widgetValueLabel, formWidgetValuePane}, - new Component[]{formatLabel, formatHead}, - new Component[]{startDateLabel, startDv}, - new Component[]{endDateLabel, endDv}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_WaterMark")), waterMarkDictPane}, - new Component[]{extraPane, null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Date_Selector_Return_Type")), returnTypeComboBox} - - }; - double[] rowSize = {P, P, P, P, P, P, P, P, P, P}; - double[] columnSize = {P, F}; - int[][] rowCount = {{1, 1}, {1, 3}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_L2, IntervalConstants.INTERVAL_L1); - JPanel boundsPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - boundsPane.add(panel); - return boundsPane; + return column(VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name"))).weight(LEFT_WEIGHT), + cell(labelNameTextField).weight(RIGHT_WEIGHT) + ), + cell(formWidgetValuePane), + row( + cell(formatLabel).weight(LEFT_WEIGHT), + cell(formatHead).weight(RIGHT_WEIGHT) + ), + cell(startDv), + cell(endDv), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_WaterMark"))).weight(LEFT_WEIGHT), + cell(waterMarkDictPane).weight(RIGHT_WEIGHT) + ), + cell(extraPane), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Date_Selector_Return_Type"))).weight(LEFT_WEIGHT), + cell(returnTypeComboBox).weight(RIGHT_WEIGHT) + ) + ).getComponent(); } protected void refreshExtraAdvancedPane() { @@ -116,13 +117,10 @@ public class DateEditorDefinePane extends DirectWriteEditorDefinePane extends FieldEditorDefinePane { public UICheckBox directWriteCheckBox; @@ -36,33 +36,36 @@ public abstract class DirectWriteEditorDefinePane e @Override protected JPanel setFirstContentPane() { - JPanel advancePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - UILabel widgetValueLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Estate_Widget_Value")); - widgetValueLabel.setVerticalAlignment(SwingConstants.TOP); + JPanel advancePane = column(VERTICAL_GAP).getComponent(); formWidgetValuePane = new FormWidgetValuePane(creator.toData(), false); - Component[] removeRepeatPane = new Component[]{createRepeatCheckBox(), null}; + UICheckBox repeatCheckBox = createRepeatCheckBox(); Component[] dicPane = createDictPane(); Component[] waterMarkComponent = createWaterMarkPane(); initExtraPane(); - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name")), labelNameTextField}, - new Component[]{widgetValueLabel, formWidgetValuePane }, - dicPane, - removeRepeatPane, - waterMarkComponent, - new Component[]{extraPane, null} - }; - double[] rowSize = {P, P, P, P, P, P, P, P}; - double[] columnSize = {P, F}; - int[][] rowCount = {{1, 1},{1, 3},{1, 1},{1, 1},{1,1},{1,1}}; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); -// panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); - advancePane.add(panel, BorderLayout.NORTH); + JPanel panel = column(VERTICAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name"))).weight(LEFT_WEIGHT), + cell(labelNameTextField).weight(RIGHT_WEIGHT) + ), + cell(formWidgetValuePane), + row( + cell(dicPane[0]).weight(LEFT_WEIGHT), + cell(dicPane[1]).weight(RIGHT_WEIGHT) + ), + cell(repeatCheckBox) + ).getComponent(); + if (waterMarkComponent[0] != null && waterMarkComponent[1] != null) { + panel.add(row( + cell(waterMarkComponent[0]).weight(LEFT_WEIGHT), + cell(waterMarkComponent[1]).weight(RIGHT_WEIGHT) + ).getComponent()); + } + panel.add(extraPane); + advancePane.add(panel); JPanel otherPane = createOtherPane(); if(otherPane != null){ - advancePane.add(otherPane, BorderLayout.CENTER); + advancePane.add(otherPane); } - return advancePane; } @@ -84,18 +87,17 @@ public abstract class DirectWriteEditorDefinePane e extraPane.add(pane); } } else { - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Font_Size")), fontSizePane} - }; - double[] rowSize = {P}; - double[] columnSize = {P, F}; - int[][] rowCount = {{1, 1}}; - extraPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); + extraPane = row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Font_Size"))).weight(LEFT_WEIGHT), + cell(fontSizePane).weight(RIGHT_WEIGHT) + ).getComponent(); } } public UICheckBox createRepeatCheckBox(){ - return null; + UICheckBox emptyCheckBox = new UICheckBox(); + emptyCheckBox.setVisible(false); + return emptyCheckBox; } public Component[] createWaterMarkPane() { @@ -112,11 +114,8 @@ public abstract class DirectWriteEditorDefinePane e public JPanel setValidatePane(){ directWriteCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Allow_Edit"), false); - directWriteCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - JPanel otherContentPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); - otherContentPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); - JPanel jPanel = GUICoreUtils.createFlowPane(new JComponent[]{directWriteCheckBox}, FlowLayout.LEFT, 0); - otherContentPane.add(jPanel); + JPanel otherContentPane = column(LayoutConstants.VERTICAL_GAP).getComponent(); + otherContentPane.add(directWriteCheckBox); return otherContentPane; } diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/FieldEditorDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/FieldEditorDefinePane.java index 81499facc8..09fd42ee5d 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/FieldEditorDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/FieldEditorDefinePane.java @@ -1,11 +1,10 @@ package com.fr.design.widget.ui.designer; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicBeanPane; import com.fr.design.beans.ErrorMsgTextFieldAdapter; import com.fr.design.beans.UITextFieldAdapter; -import com.fr.design.constants.LayoutConstants; -import com.fr.design.designer.IntervalConstants; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.designer.creator.XLayoutContainer; @@ -14,28 +13,30 @@ import com.fr.design.designer.creator.XWParameterLayout; import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.fun.TextFieldAdapterProvider; import com.fr.design.fun.WidgetAdvancedPaneProvider; +import com.fr.design.gui.frpane.FontSizeComboPane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.gui.frpane.FontSizeComboPane; import com.fr.form.ui.FieldEditor; import com.fr.general.GeneralContext; import com.fr.log.FineLoggerFactory; import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; + public abstract class FieldEditorDefinePane extends AbstractDataModify { protected UICheckBox allowBlankCheckBox; // richer:错误信息,是所有控件共有的属性,所以放到这里来 @@ -45,6 +46,7 @@ public abstract class FieldEditorDefinePane extends Abstr protected UITextField labelNameTextField; protected final List> extraPaneList = new ArrayList<>(); protected JPanel extraPane; + protected JPanel corePane; protected static double F = TableLayout.FILL; protected static double P = TableLayout.PREFERRED; @@ -56,17 +58,17 @@ public abstract class FieldEditorDefinePane extends Abstr protected void initComponents() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); + corePane = column().getComponent(); + this.add(corePane, BorderLayout.CENTER); + labelNameTextField = new UITextField(); allowBlankCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Allow_Null")); - allowBlankCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); fontSizePane = new FontSizeComboPane(); JPanel contentPane = this.setFirstContentPane(); - JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - jPanel.add(contentPane, BorderLayout.CENTER); - contentPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); if (contentPane != null) { - UIExpandablePane uiExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, jPanel); - this.add(uiExpandablePane, BorderLayout.NORTH); + contentPane.setBorder(new ScaledEmptyBorder(0, 0, 10, 0)); + UIExpandablePane uiExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, contentPane); + corePane.add(uiExpandablePane); } this.addValidatePane(); } @@ -74,6 +76,10 @@ public abstract class FieldEditorDefinePane extends Abstr protected void initExtraPane() { initPluginListener(); refreshExtraAdvancedPane(); + if (extraPane == null) { + extraPane = new JPanel(); + extraPane.setVisible(false); + } } protected void refreshExtraAdvancedPane() { @@ -136,32 +142,25 @@ public abstract class FieldEditorDefinePane extends Abstr protected void addValidatePane() { initErrorMsgPane(); - validatePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + validatePane = column(VERTICAL_GAP).getComponent(); final UILabel uiLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Error_Tip")); - JPanel borderPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - final JPanel errorTipPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{uiLabel, errorMsgTextField.getErrorMsgTextField()}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); - errorTipPane.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L6, IntervalConstants.INTERVAL_L5, 0, 0)); - borderPane.add(errorTipPane, BorderLayout.CENTER); - allowBlankCheckBox.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - boolean isSelected = allowBlankCheckBox.isSelected(); - errorTipPane.setVisible(!isSelected); - } + final JPanel errorTipPane = row( + cell(uiLabel).weight(LEFT_WEIGHT), cell(errorMsgTextField.getErrorMsgTextField()).weight(RIGHT_WEIGHT) + ).getComponent(); + allowBlankCheckBox.addItemListener(e -> { + boolean selected = allowBlankCheckBox.isSelected(); + errorTipPane.setVisible(!selected); }); - Component[][] components = new Component[][]{ - new Component[]{allowBlankCheckBox}, - new Component[]{borderPane}, - }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L6, 0); - panel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, IntervalConstants.INTERVAL_L1, 0)); - validatePane.add(panel, BorderLayout.NORTH); + validatePane.add(column(VERTICAL_GAP, + cell(allowBlankCheckBox), + cell(errorTipPane) + ).getComponent()); + JPanel contentPane = this.setValidatePane(); if (contentPane != null) { - validatePane.add(contentPane, BorderLayout.CENTER); + validatePane.add(contentPane); } - UIExpandablePane uiExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Validate"), 280, 20, validatePane); this.add(uiExpandablePane, BorderLayout.CENTER); diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/FreeButtonDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/FreeButtonDefinePane.java index 16a31b85ed..fd27787329 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/FreeButtonDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/FreeButtonDefinePane.java @@ -3,14 +3,21 @@ package com.fr.design.widget.ui.designer; import com.fr.design.designer.creator.XCreator; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.style.FRFontPane; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.widget.component.ButtonBackgroundPane; import com.fr.form.ui.FreeButton; import com.fr.general.FRFont; -import javax.swing.*; -import java.awt.*; +import javax.swing.JPanel; +import java.awt.Component; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; /** * Created by ibm on 2017/8/6. @@ -19,6 +26,7 @@ public class FreeButtonDefinePane extends ButtonDefinePane { private ButtonBackgroundPane backgroundCompPane; private FRFontPane frFontPane; private UILabel fontLabel; + private JPanel fontPanel; public FreeButtonDefinePane(XCreator xcreator) { super(xcreator); @@ -30,14 +38,15 @@ public class FreeButtonDefinePane extends ButtonDefinePane { } public Component[] createFontPane() { - JPanel fontLabelPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); fontLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Font")); - fontLabelPanel.add(fontLabel, BorderLayout.CENTER); - fontLabel.setVerticalAlignment(SwingConstants.TOP); frFontPane = new FRFontPane(); - JPanel fontPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - fontPanel.add(frFontPane, BorderLayout.CENTER); - return new Component[]{fontLabelPanel, fontPanel}; + fontPanel = row( + column(VERTICAL_GAP, + cell(fontLabel).weight(1), flex(1), flex(1) + ).weight(LEFT_WEIGHT), + cell(frFontPane).weight(RIGHT_WEIGHT) + ).getComponent(); + return new Component[]{fontPanel, null}; } public void populateSubButtonPane(FreeButton e) { @@ -45,8 +54,7 @@ public class FreeButtonDefinePane extends ButtonDefinePane { return; } backgroundCompPane.populate(e); - frFontPane.setVisible(e.isCustomStyle()); - fontLabel.setVisible(e.isCustomStyle()); + fontPanel.setVisible(e.isCustomStyle()); if (e.isCustomStyle()) { FRFont frFont = e.getFont(); if (frFont != null) { @@ -59,8 +67,7 @@ public class FreeButtonDefinePane extends ButtonDefinePane { FreeButton freeButton = (FreeButton) creator.toData(); if (!containsExtraPane) { backgroundCompPane.update(freeButton); - frFontPane.setVisible(freeButton.isCustomStyle()); - fontLabel.setVisible(freeButton.isCustomStyle()); + fontPanel.setVisible(freeButton.isCustomStyle()); if (freeButton.isCustomStyle()) { FRFont frFont = freeButton.getFont() == null ? FRFont.getInstance() : freeButton.getFont(); freeButton.setFont(frFontPane.update(frFont)); diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/LabelDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/LabelDefinePane.java index 1776e2eb18..031b21466e 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/LabelDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/LabelDefinePane.java @@ -1,11 +1,10 @@ package com.fr.design.widget.ui.designer; +import com.fine.theme.icon.LazyIcon; import com.finebi.cbb.utils.CollectionUtils; -import com.fr.base.BaseUtils; import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicBeanPane; 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.fun.WidgetAdvancedPaneProvider; @@ -14,27 +13,29 @@ import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.style.FRFontPane; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.widgettheme.processor.WidgetThemeParaCreatorPaneAdder; import com.fr.design.widget.FRWidgetFactory; import com.fr.design.widget.ui.designer.component.FormWidgetValuePane; +import com.fr.design.widgettheme.processor.WidgetThemeParaCreatorPaneAdder; import com.fr.form.ui.Label; import com.fr.general.GeneralContext; import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; import com.fr.stable.Constants; -import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JPanel; -import javax.swing.SwingConstants; import java.awt.BorderLayout; -import java.awt.Component; import java.util.ArrayList; import java.util.List; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; + /** * 标签控件pane @@ -44,7 +45,6 @@ import java.util.Set; * Created on 2023/11/13 */ public class LabelDefinePane extends AbstractDataModify

文本类组件移动端高级属性的定义面板,基础扩展可以直接继承此面板 @@ -34,7 +36,7 @@ public class BaseTextEditorMobileDefinePane extends MobileWidgetDefinePane { @Override public void initPropertyGroups(Object source) { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel container = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 5); + JPanel container = column(LayoutConstants.VERTICAL_GAP).getComponent(); addPropertyPanesToContainer(container); this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, container), BorderLayout.NORTH); this.repaint(); diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ButtonGroupDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ButtonGroupDefinePane.java index 3f8f4bb05d..7d764f51d8 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ButtonGroupDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ButtonGroupDefinePane.java @@ -1,20 +1,21 @@ package com.fr.design.widget.ui.designer.mobile; -import com.fr.design.constants.LayoutConstants; 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.gui.ispinner.UISpinner; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.FormDesigner; import com.fr.form.ui.ButtonGroup; -import javax.swing.*; -import java.awt.*; +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import java.awt.BorderLayout; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; public class ButtonGroupDefinePane extends MobileWidgetDefinePane { @@ -31,21 +32,12 @@ public class ButtonGroupDefinePane extends MobileWidgetDefinePane { this.setLayout(FRGUIPaneFactory.createBorderLayout()); UILabel maxShowRowsLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design-Mobile_Max_Show_Rows"), SwingConstants.LEFT); this.maxShowRowsSpinner = new UISpinner(0, Integer.MAX_VALUE, 1, 5); - Component[][] components = new Component[][]{ - new Component[] {maxShowRowsLabel, maxShowRowsSpinner} - }; - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] rowSize = {p}; - double[] columnSize = {p,f}; - int[][] rowCount = {{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); - UIExpandablePane folderPane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, panelWrapper); + final JPanel panel = row( + cell(maxShowRowsLabel).weight(1.5), + cell(maxShowRowsSpinner).weight(2) + ).getComponent(); + UIExpandablePane folderPane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, panel); this.add(folderPane, BorderLayout.NORTH); - this.repaint(); } private void bindListeners2Widgets() { From e9fb43562ced06314af62a4945ffe0ef7cfb8b7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Thu, 25 Jan 2024 20:02:38 +0800 Subject: [PATCH 137/302] =?UTF-8?q?REPORT-111995=20=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E4=BB=85=E6=82=AC=E6=B5=AE=E6=97=B6=E6=98=BE=E7=A4=BA=E6=BB=9A?= =?UTF-8?q?=E5=8A=A8=E6=9D=A1=E7=9A=84=E6=BB=9A=E5=8A=A8=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../light/ui/CollapsibleScrollBarLayerUI.java | 73 +++++++++++++++++++ .../com/fine/theme/utils/FineUIUtils.java | 17 ++++- .../pane/TableDataSearchRemindPane.java | 32 ++++---- .../pane/TemplateSearchRemindPane.java | 29 ++++---- 4 files changed, 120 insertions(+), 31 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/CollapsibleScrollBarLayerUI.java diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/CollapsibleScrollBarLayerUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/CollapsibleScrollBarLayerUI.java new file mode 100644 index 0000000000..86160ea975 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/CollapsibleScrollBarLayerUI.java @@ -0,0 +1,73 @@ +package com.fine.theme.light.ui; + +import com.fr.design.gui.icontainer.UIScrollPane; + +import javax.swing.JComponent; +import javax.swing.JLayer; +import javax.swing.JScrollPane; +import javax.swing.ScrollPaneConstants; +import javax.swing.plaf.LayerUI; +import java.awt.AWTEvent; +import java.awt.Component; +import java.awt.event.MouseEvent; + +/** + * 滚动面板的装饰层UI,支持滚动条仅当悬浮时显示 + * 使用见工具类: {@link com.fine.theme.utils.FineUIUtils#createCollapsibleScrollBarLayer(Component)} + * + * @author Levy.Xie + * @since 11.0 + * Created on 2024/01/25 + */ +public class CollapsibleScrollBarLayerUI extends LayerUI { + private final int verticalPolicy; + private final int horizontalPolicy; + + public CollapsibleScrollBarLayerUI() { + this(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); + } + + public CollapsibleScrollBarLayerUI(int verticalPolicy, int horizontalPolicy) { + this.verticalPolicy = verticalPolicy; + this.horizontalPolicy = horizontalPolicy; + } + + @Override + public void installUI(JComponent c) { + super.installUI(c); + if (c instanceof JLayer) { + ((JLayer) c).setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK); + } + } + + @Override + public void uninstallUI(JComponent c) { + if (c instanceof JLayer) { + ((JLayer) c).setLayerEventMask(0); + } + super.uninstallUI(c); + } + + @Override + protected void processMouseEvent(MouseEvent e, JLayer l) { + JScrollPane view = l.getView(); + switch (e.getID()) { + case MouseEvent.MOUSE_ENTERED: + // 在鼠标进入时恢复滚动条显示策略 + if (view != null) { + view.setVerticalScrollBarPolicy(verticalPolicy); + view.setHorizontalScrollBarPolicy(horizontalPolicy); + } + break; + case MouseEvent.MOUSE_EXITED: + // 在鼠标退出时隐藏滚动条 + if (view != null) { + view.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); + view.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + } + break; + default: + break; + } + } +} diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java index 225fce4be5..46891db208 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java @@ -1,12 +1,16 @@ package com.fine.theme.utils; +import com.fine.theme.light.ui.CollapsibleScrollBarLayerUI; import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.design.border.FineBorderFactory; +import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.stable.os.OperatingSystem; import com.fr.value.AtomicClearableLazyValue; -import javax.swing.UIManager; import javax.swing.JLabel; +import javax.swing.JLayer; +import javax.swing.ScrollPaneConstants; +import javax.swing.UIManager; import java.awt.Color; import java.awt.Component; import java.awt.Composite; @@ -376,4 +380,15 @@ public class FineUIUtils { FineUIStyle.setStyle(label, FineUIStyle.LABEL_BOLD); } + /** + * 创建一个UIScrollPane的装饰层,内部的ScrollPane仅当悬浮时显示滚动条 + * + * @param c 组件 + * @return UIScrollPane的装饰层 + */ + public static JLayer createCollapsibleScrollBarLayer(Component c) { + return new JLayer<>(new UIScrollPane(c, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER), + new CollapsibleScrollBarLayerUI()); + } + } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TableDataSearchRemindPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TableDataSearchRemindPane.java index bab21699cb..2b4778dae6 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TableDataSearchRemindPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TableDataSearchRemindPane.java @@ -1,5 +1,7 @@ package com.fr.design.data.datapane.management.search.pane; +import com.fine.theme.utils.FineUIStyle; +import com.fine.theme.utils.FineUIUtils; import com.fr.base.svg.IconUtils; import com.fr.design.constants.UIConstants; import com.fr.design.data.datapane.TableDataTree; @@ -7,23 +9,24 @@ import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.search.TreeSearchStatus; import com.fr.design.search.event.TreeSearchStatusChangeEvent; import com.fr.design.search.event.TreeSearchStatusChangeListener; -import javax.swing.BorderFactory; +import javax.swing.JLayer; import javax.swing.JPanel; import javax.swing.SwingConstants; import java.awt.BorderLayout; import java.awt.CardLayout; -import java.awt.Color; -import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; + /** * @author Yvan */ @@ -81,7 +84,7 @@ public class TableDataSearchRemindPane extends JPanel implements TreeSearchStatu private class TreePane extends JPanel implements TreeSearchStatusChange { - private UIScrollPane scrollPane; + private JLayer scrollPane; private JPanel notFoundPane; @@ -97,21 +100,18 @@ public class TableDataSearchRemindPane extends JPanel implements TreeSearchStatu private void init(TableDataTree tableDataTree) { - scrollPane = new UIScrollPane(tableDataTree); - scrollPane.setBorder(null); + scrollPane = FineUIUtils.createCollapsibleScrollBarLayer(tableDataTree); - notFoundPane = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 5); UILabel emptyPicLabel = new UILabel(); emptyPicLabel.setIcon(IconUtils.readIcon("com/fr/base/images/share/no_match_icon.png")); emptyPicLabel.setHorizontalAlignment(SwingConstants.CENTER); - emptyPicLabel.setPreferredSize(new Dimension(240, 100)); - UILabel textLabel = new UILabel(Toolkit.i18nText("Fine-Design_Tree_Search_Not_Match"), SwingConstants.CENTER); -// textLabel.setForeground(Color.gray); + UILabel textLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Tree_Search_Not_Match"), SwingConstants.CENTER); + FineUIStyle.setStyle(textLabel, FineUIStyle.LABEL_TIP); textLabel.setHorizontalAlignment(SwingConstants.CENTER); - textLabel.setPreferredSize(new Dimension(240, 20)); - notFoundPane.add(emptyPicLabel); - notFoundPane.add(textLabel); - notFoundPane.setBorder(BorderFactory.createEmptyBorder(80, 0, 0, 0)); + + notFoundPane = column(10, + flex(1), cell(emptyPicLabel), cell(textLabel), flex(1.5) + ).getComponent(); cardLayout = new CardLayout(); this.setLayout(cardLayout); @@ -168,7 +168,7 @@ public class TableDataSearchRemindPane extends JPanel implements TreeSearchStatu this.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0)); // 初始情况下为Not_Begin textLabel = new UILabel(); - textLabel.setForeground(Color.gray); + FineUIStyle.setStyle(textLabel, FineUIStyle.LABEL_TIP); stopLabel = new UILabel(); stopLabel.setForeground(UIConstants.NORMAL_BLUE); stopSearch = new MouseAdapter() { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateSearchRemindPane.java b/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateSearchRemindPane.java index bdb6a32819..b23b3c073f 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateSearchRemindPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateSearchRemindPane.java @@ -1,5 +1,7 @@ package com.fr.design.mainframe.manager.search.searcher.control.pane; +import com.fine.theme.utils.FineUIStyle; +import com.fine.theme.utils.FineUIUtils; import com.fr.base.svg.IconUtils; import com.fr.design.constants.UIConstants; import com.fr.design.gui.itree.filetree.EnvFileTree; @@ -12,18 +14,20 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.manager.search.TemplateTreeSearchManager; -import javax.swing.BorderFactory; +import javax.swing.JLayer; import javax.swing.JPanel; import javax.swing.SwingConstants; import java.awt.BorderLayout; import java.awt.CardLayout; -import java.awt.Color; -import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.FlowLayout; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; + /** * 模板搜索提示面板:整合了模板树和提示面板 */ @@ -94,7 +98,7 @@ public class TemplateSearchRemindPane extends JPanel implements TreeSearchStatus private class TreePane extends JPanel implements TemplateSearchRemindPane.TreeSearchStatusChange { - private UIScrollPane scrollPane; + private JLayer scrollPane; private JPanel notFoundPane; @@ -110,21 +114,18 @@ public class TemplateSearchRemindPane extends JPanel implements TreeSearchStatus private void init(EnvFileTree templateFileTree) { - scrollPane = new UIScrollPane(templateFileTree); - scrollPane.setBorder(null); + scrollPane = FineUIUtils.createCollapsibleScrollBarLayer(templateFileTree); - notFoundPane = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 5); UILabel emptyPicLabel = new UILabel(); emptyPicLabel.setIcon(IconUtils.readIcon("com/fr/base/images/share/no_match_icon.png")); emptyPicLabel.setHorizontalAlignment(SwingConstants.CENTER); - emptyPicLabel.setPreferredSize(new Dimension(240, 100)); UILabel textLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Tree_Search_Not_Match"), SwingConstants.CENTER); - textLabel.setForeground(Color.gray); + FineUIStyle.setStyle(textLabel, FineUIStyle.LABEL_TIP); textLabel.setHorizontalAlignment(SwingConstants.CENTER); - textLabel.setPreferredSize(new Dimension(240, 20)); - notFoundPane.add(emptyPicLabel); - notFoundPane.add(textLabel); - notFoundPane.setBorder(BorderFactory.createEmptyBorder(80, 0, 0, 0)); + + notFoundPane = column(10, + flex(1), cell(emptyPicLabel), cell(textLabel), flex(1.5) + ).getComponent(); cardLayout = new CardLayout(); this.setLayout(cardLayout); @@ -181,7 +182,7 @@ public class TemplateSearchRemindPane extends JPanel implements TreeSearchStatus this.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0)); // 初始情况下为Not_Begin textLabel = new UILabel(); - textLabel.setForeground(Color.gray); + FineUIStyle.setStyle(textLabel, FineUIStyle.LABEL_TIP); stopLabel = new UILabel(); stopLabel.setForeground(UIConstants.NORMAL_BLUE); stopSearch = new MouseAdapter() { From 824b8953a4d1fd508c7edde6cbc608955b823b69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Thu, 25 Jan 2024 20:04:02 +0800 Subject: [PATCH 138/302] =?UTF-8?q?REPORT-111995=20=E5=BC=B9=E5=87=BA?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E9=80=82=E9=85=8DDPI=E7=BC=A9=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/dialog/BasicDialog.java | 22 +++++++++++++++---- .../com/fr/design/formula/FormulaPane.java | 5 ++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/dialog/BasicDialog.java b/designer-base/src/main/java/com/fr/design/dialog/BasicDialog.java index 3b3b1d620f..8eb0594415 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/BasicDialog.java +++ b/designer-base/src/main/java/com/fr/design/dialog/BasicDialog.java @@ -1,8 +1,11 @@ package com.fr.design.dialog; +import com.fine.theme.utils.FineUIScale; import com.fr.common.annotations.Open; -import java.awt.*; +import java.awt.Dialog; +import java.awt.Dimension; +import java.awt.Frame; @Open public abstract class BasicDialog extends UIDialog { @@ -12,7 +15,7 @@ public abstract class BasicDialog extends UIDialog { public static final Dimension LARGE = new Dimension(900, 600); public static final Dimension CHART = new Dimension(760, 560); public static final Dimension MAP_SIZE = new Dimension(760, 450); - public static final Dimension UPDATE_ONLINE_SIZE = new Dimension(600,300); + public static final Dimension UPDATE_ONLINE_SIZE = new Dimension(600, 300); public static final Dimension TOOLBAR_SIZE = new Dimension(660, 327); public BasicDialog(Frame parent) { @@ -40,12 +43,23 @@ public abstract class BasicDialog extends UIDialog { super(parent, pane, isNeedButtonPane); } + /** + * 设置对话框大小,方法内已进行dpi适配,传参无需考虑dpi适配 + * + * @param d 对话框尺寸 + */ protected void setBasicDialogSize(Dimension d) { - super.setSize(d.width, d.height); + super.setSize(FineUIScale.scale(d.width), FineUIScale.scale(d.height)); } + /** + * 设置对话框大小,方法内已进行dpi适配,传参无需考虑dpi适配 + * + * @param w 宽度 + * @param h 高度 + */ protected void setBasicDialogSize(int w, int h) { - super.setSize(w, h); + setBasicDialogSize(new Dimension(w, h)); } @Override diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java index 35c5a2c68f..9caae7461a 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java @@ -41,7 +41,6 @@ import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxTextArea; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.SyntaxConstants; -import com.fr.design.i18n.DesignSizeI18nManager; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; @@ -749,8 +748,8 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { } public BasicDialog showLargeWindow(Window window, DialogActionListener l) { - int width = FineUIScale.scale(900); - int height = FineUIScale.scale(600); + int width = 900; + int height = 900; BasicDialog basicDialog = super.showWindowWithCustomSize(window, l, new Dimension(width, height)); basicDialog.setMinimumSize(new Dimension(width, height)); basicDialog.setResizable(true); From 954c4f9559b1842c0d8ba433516a541e6c38ac9e Mon Sep 17 00:00:00 2001 From: vito Date: Mon, 29 Jan 2024 21:17:25 +0800 Subject: [PATCH 139/302] =?UTF-8?q?REPORT-99485=20feat:=20=E9=80=9A?= =?UTF-8?q?=E7=94=A8=E5=8A=A8=E7=94=BB=E6=94=AF=E6=8C=81=E5=8F=8A=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineHeaderPaneUI.java | 112 ++++++++++++ .../com/fine/theme/utils/AnimatedPainter.java | 131 ++++++++++++++ .../theme/utils/AnimatedPainterSupport.java | 167 ++++++++++++++++++ .../fr/design/foldablepane/HeaderPane.java | 79 +++------ .../design/foldablepane/UIExpandablePane.java | 25 +-- .../theme/light/ui/laf/FineLaf.properties | 1 + .../components/ExpandablePaneStoryBoard.java | 4 +- .../mainframe/chart/gui/ChangeConfigPane.java | 45 ++--- 8 files changed, 461 insertions(+), 103 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/light/ui/FineHeaderPaneUI.java create mode 100644 designer-base/src/main/java/com/fine/theme/utils/AnimatedPainter.java create mode 100644 designer-base/src/main/java/com/fine/theme/utils/AnimatedPainterSupport.java diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineHeaderPaneUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineHeaderPaneUI.java new file mode 100644 index 0000000000..4555096842 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineHeaderPaneUI.java @@ -0,0 +1,112 @@ +package com.fine.theme.light.ui; + +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.AnimatedPainter; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.fr.design.foldablepane.HeaderPane; + +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.UIManager; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.PanelUI; +import java.awt.AlphaComposite; +import java.awt.Component; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; +import java.awt.geom.AffineTransform; + +/** + * 标题组件UI + * + * @author vito + * @since 11.0 + * Created on 2024/1/29 + */ +public class FineHeaderPaneUI extends PanelUI implements AnimatedPainter { + + private Icon triangleRight; + + private static final int ICON_FIX = -2; + + /** + * 创建UI + * + * @param c 组件 + * @return ComponentUI + */ + public static ComponentUI createUI(JComponent c) { + return new FineHeaderPaneUI(); + } + + @Override + public void installUI(JComponent c) { + super.installUI(c); + triangleRight = new LazyIcon("triangle_right"); + } + + @Override + public void uninstallUI(JComponent c) { + super.uninstallUI(c); + } + + @Override + public void paint(Graphics g, JComponent c) { + paintWithAnimation(c, g, c.getX(), c.getY(), c.getWidth(), c.getHeight()); + } + + @Override + public void paintAnimated(Component c, Graphics2D g, int x, int y, int width, int height, float[] animatedValues) { + Graphics2D g2d = (Graphics2D) g.create(); + HeaderPane headerPane = (HeaderPane) c; + g2d.setColor(c.getBackground()); + if (headerPane.isPressed()) { + g2d.setColor(UIManager.getColor("Button.pressedBackground")); + } + Insets insets = headerPane.getInsets(); + g2d.fillRect(0, insets.top / 2, + headerPane.getWidth(), headerPane.getHeight() - (insets.top + insets.bottom) / 2); + + int iconY = (headerPane.getHeight() - triangleRight.getIconHeight()) / 2; + + + // 动起来,旋转角度(弧度),动画帧绘制开始 + double rotationAngle = Math.toRadians(90 * animatedValues[0]); + + // 设置旋转中心 + AffineTransform oldTransform = g2d.getTransform(); + // 折叠面板需要icon显示左边缘对齐,fix一下 + g2d.rotate(rotationAngle, FineUIScale.scale(ICON_FIX) + triangleRight.getIconWidth() / 2.0, + iconY + triangleRight.getIconHeight() / 2.0); + // 绘制旋转后的正方形 + triangleRight.paintIcon(c, g2d, FineUIScale.scale(ICON_FIX), iconY); + // 恢复原始的变换 + g2d.setTransform(oldTransform); + // ----- 动画帧绘制结束 ----- + + g2d.setFont(c.getFont().deriveFont(Font.BOLD)); + g2d.setPaint(c.getForeground()); + g2d.setComposite(AlphaComposite.SrcOver.derive(c.getForeground().getAlpha() / 255f)); + + FontMetrics metrics = g2d.getFontMetrics(); + int ascent = metrics.getAscent(); + int descent = metrics.getDescent(); + + float titleX = triangleRight.getIconWidth() + FineUIScale.scale(ICON_FIX) + + FineUIScale.scale(UIManager.getInt("ExpandablePane.HeaderPane.hGap")); + float titleY = (headerPane.getHeight() - (ascent + descent)) / 2.0f + ascent; + FlatUIUtils.setRenderingHints(g2d); + g2d.drawString(headerPane.getTitle(), titleX, titleY); + g2d.dispose(); + } + + @Override + public float[] getValues(Component c) { + HeaderPane headerPane = (HeaderPane) c; + return new float[]{headerPane.isShow() ? 1 : 0}; + } +} diff --git a/designer-base/src/main/java/com/fine/theme/utils/AnimatedPainter.java b/designer-base/src/main/java/com/fine/theme/utils/AnimatedPainter.java new file mode 100644 index 0000000000..5f1bcc4aa3 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/utils/AnimatedPainter.java @@ -0,0 +1,131 @@ +package com.fine.theme.utils; + +import com.formdev.flatlaf.util.Animator.Interpolator; +import com.formdev.flatlaf.util.CubicBezierEasing; + +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Graphics2D; + +/** + * Painter 可在组件值更改时自动对绘画进行动画处理。 + * getValues(Component) 返回组件的值。如果值已更改,则 paintAnimated(Component, Graphics2D, int, int, int, int, float[]) + * 使用动画值(从旧值到新值)多次调用。如果 getValues(Component) 返回多个值,则每个值都有自己独立的动画。 + * 仅当传递给 paintWithAnimation(Component, Graphics, int, int, int, int) 的组件是 的 JComponent实例时,动画才有效。 + * 在组件上设置客户端属性以存储动画状态。 + * + * @author vito + * @since 11.0 + * Created on 2024/1/29 + */ +public interface AnimatedPainter { + /** + * 开始绘画。调用 paintAnimated(Component, Graphics2D, int, int, int, int, float[]) 一次来绘制当前值 + * 或者如果值与上次绘制相比发生了变化,则它会启动动画并使用动画值(从旧值到新值)多次调用 + * paintAnimated(Component, Graphics2D, int, int, int, int, float[]) 。 + * + * @param c 动画所属组件 + * @param g 绘制上下文 + * @param x x + * @param y y + * @param width 区域宽度 + * @param height 区域高度 + */ + default void paintWithAnimation(Component c, Graphics g, int x, int y, int width, int height) { + AnimatedPainterSupport.paint(this, c, g, x, y, width, height); + } + + /** + * 绘制给定的(动画)值。 + * 从 paintWithAnimation(Component, Graphics, int, int, int, int)调用。 + * + * @param c 动画所属组件 + * @param g 绘制上下文 + * @param x x + * @param y y + * @param width 区域宽度 + * @param height 区域高度 + * @param animatedValues 动画值,介于先前的值 getValues(Component) 和返回的最新值 getValues(Component) 之间 + */ + void paintAnimated(Component c, Graphics2D g, int x, int y, int width, int height, float[] animatedValues); + + /** + * 从 animator 调用以重新绘制区域。 + * 用于限制重绘区域。例如,如果希望只有底部边框有动画。如果对多个边框进行动画处理(例如底部和右侧),那么单独的重绘是没有意义的, + * 因为 Swing 重绘管理器会合并区域并重绘整个组件。默认实现会重新绘制整个给定区域。 + */ + default void repaintDuringAnimation(Component c, int x, int y, int width, int height) { + c.repaint(x, y, width, height); + } + + /** + * 获取组件的值。 + * 如果值发生更改,则此类将从旧值动画到新值。如果返回多个值,则每个值都有自己独立的动画。 + * 对于切换按钮,0 表示关闭和 1 表示打开 + */ + float[] getValues(Component c); + + /** + * 动画是否启用 + */ + default boolean isAnimationEnabled() { + return true; + } + + /** + * 返回动画的持续时间(以毫秒为单位)(默认值为 150)。 + */ + default int getAnimationDuration() { + return 150; + } + + /** + * 返回动画的分辨率(以毫秒为单位)(默认值为 10)。分辨率是计时事件之间的时间量。 + */ + default int getAnimationResolution() { + return 10; + } + + /** + * 返回动画的插值器。默认值为 {@link CubicBezierEasing#STANDARD_EASING}. + */ + default Interpolator getAnimationInterpolator() { + return CubicBezierEasing.STANDARD_EASING; + } + + /** + * 返回给定值索引和值的动画持续时间(以毫秒为单位)(默认值为 150)。 + */ + default int getAnimationDuration(int valueIndex, float value) { + return getAnimationDuration(); + } + + /** + * 返回给定值索引和值的动画分辨率(以毫秒为单位)(默认值为 10)。分辨率是计时事件之间的时间量 + */ + default int getAnimationResolution(int valueIndex, float value) { + return getAnimationResolution(); + } + + /** + * 返回给定值索引和值的动画插值器。默认值为 {@link CubicBezierEasing#STANDARD_EASING}. + */ + default Interpolator getAnimationInterpolator(int valueIndex, float value) { + return getAnimationInterpolator(); + } + + /** + * 返回用于存储动画支持的客户端属性键。 + */ + default Object getClientPropertyKey() { + return getClass(); + } + + /** + * 保存位置,提供给 repaintDuringAnimation(Component, int, int, int, int)使用重新绘制动画区域。 + * 仅当传递到的 paintWithAnimation(Component, Graphics, int, int, int, int) 图形上下文使用转换的位置时才需要。 + */ + static void saveRepaintLocation(AnimatedPainter painter, Component c, int x, int y) { + AnimatedPainterSupport.saveRepaintLocation(painter, c, x, y); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/utils/AnimatedPainterSupport.java b/designer-base/src/main/java/com/fine/theme/utils/AnimatedPainterSupport.java new file mode 100644 index 0000000000..4e02bf29c9 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/utils/AnimatedPainterSupport.java @@ -0,0 +1,167 @@ +package com.fine.theme.utils; + +import com.formdev.flatlaf.util.Animator; + +import javax.swing.JComponent; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Graphics2D; + +/** + * 动画支持类,用于存储动画状态并实现动画。 + * + * @author vito + * @since 12.0 + * Created on 2024/1/29 + */ +class AnimatedPainterSupport { + private int valueIndex; + private float startValue; + private float targetValue; + private float animatedValue; + private float fraction; + + private Animator animator; + + // last bounds of the paint area needed to repaint while animating + private int x; + private int y; + private int width; + private int height; + + static void paint(AnimatedPainter painter, Component c, Graphics g, + int x, int y, int width, int height) { + if (!isAnimationEnabled(painter, c)) { + // paint without animation if animation is disabled or + // component is not a JComponent and therefore does not support + // client properties, which are required to keep animation state + painter.paintAnimated(c, (Graphics2D) g, x, y, width, height, painter.getValues(c)); + return; + } + + // get component values + float[] values = painter.getValues(c); + + JComponent jc = (JComponent) c; + Object key = painter.getClientPropertyKey(); + AnimatedPainterSupport[] ass = (AnimatedPainterSupport[]) jc.getClientProperty(key); + + // check whether length of values array has changed + if (ass != null && ass.length != values.length) { + // cancel all running animations + for (AnimatedPainterSupport as : ass) { + if (as.animator != null) { + as.animator.cancel(); + } + } + ass = null; + } + + if (ass == null) { + ass = new AnimatedPainterSupport[values.length]; + jc.putClientProperty(key, ass); + } + + for (int i = 0; i < ass.length; i++) { + AnimatedPainterSupport as = ass[i]; + float value = values[i]; + + if (as == null) { + // painted first time --> do not animate, but remember current component value + as = new AnimatedPainterSupport(); + as.valueIndex = i; + as.startValue = as.targetValue = as.animatedValue = value; + ass[i] = as; + } else if (value != as.targetValue) { + // value changed --> (re)start animation + + int animationDuration = painter.getAnimationDuration(as.valueIndex, value); + + // do not animate if animation duration (for current value) is zero + if (animationDuration <= 0) { + if (as.animator != null) { + as.animator.cancel(); + as.animator = null; + } + as.startValue = as.targetValue = as.animatedValue = value; + as.fraction = 0; + continue; + } + + if (as.animator == null) { + // create animator + AnimatedPainterSupport as2 = as; + as.animator = new Animator(1, fraction -> { + // check whether component was removed while animation is running + if (!c.isDisplayable()) { + as2.animator.stop(); + return; + } + + // compute animated value + as2.animatedValue = as2.startValue + ((as2.targetValue - as2.startValue) * fraction); + as2.fraction = fraction; + + // repaint + painter.repaintDuringAnimation(c, as2.x, as2.y, as2.width, as2.height); + }, () -> { + as2.startValue = as2.animatedValue = as2.targetValue; + as2.animator = null; + }); + } + + if (as.animator.isRunning()) { + // if animation is still running, restart it from the current + // animated value to the new target value with reduced duration + as.animator.cancel(); + int duration2 = (int) (animationDuration * as.fraction); + if (duration2 > 0) + as.animator.setDuration(duration2); + as.startValue = as.animatedValue; + } else { + // new animation + as.animator.setDuration(animationDuration); + + as.animatedValue = as.startValue; + } + + // update animator for new value + as.animator.setResolution(painter.getAnimationResolution(as.valueIndex, value)); + as.animator.setInterpolator(painter.getAnimationInterpolator(as.valueIndex, value)); + + // start animation + as.targetValue = value; + as.animator.start(); + } + + as.x = x; + as.y = y; + as.width = width; + as.height = height; + } + + float[] animatedValues = new float[ass.length]; + for (int i = 0; i < ass.length; i++) { + animatedValues[i] = ass[i].animatedValue; + } + + painter.paintAnimated(c, (Graphics2D) g, x, y, width, height, animatedValues); + } + + private static boolean isAnimationEnabled(AnimatedPainter painter, Component c) { + return Animator.useAnimation() && painter.isAnimationEnabled() && c instanceof JComponent; + } + + static void saveRepaintLocation(AnimatedPainter painter, Component c, int x, int y) { + if (!isAnimationEnabled(painter, c)) + return; + + AnimatedPainterSupport[] ass = (AnimatedPainterSupport[]) ((JComponent) c).getClientProperty(painter.getClientPropertyKey()); + if (ass != null) { + for (AnimatedPainterSupport as : ass) { + as.x = x; + as.y = y; + } + } + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java b/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java index 7e5878922b..461aa3bccd 100644 --- a/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java +++ b/designer-base/src/main/java/com/fr/design/foldablepane/HeaderPane.java @@ -1,96 +1,59 @@ package com.fr.design.foldablepane; -import com.fine.theme.icon.LazyIcon; -import com.fine.theme.utils.FineUIScale; -import com.formdev.flatlaf.ui.FlatUIUtils; import com.formdev.flatlaf.util.ScaledEmptyBorder; -import javax.swing.Icon; import javax.swing.JPanel; import javax.swing.UIManager; -import java.awt.AlphaComposite; -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Insets; /** * Created by MoMeak on 2017/7/5. */ public class HeaderPane extends JPanel { private static final long serialVersionUID = 1L; + + public static final String CLASS_ID = "HeaderPaneUI"; private boolean isShow; private boolean isPressed = false; private String title; - private int fontSize; - private final Icon triangleDown; - private final Icon triangleRight; - private static final int ICON_FIX = -2; + + @Override + public String getUIClassID() { + return CLASS_ID; + } + public void setPressed(boolean pressed) { this.isPressed = pressed; } + public boolean isPressed() { + return isPressed; + } + public void setShow(boolean isShow) { this.isShow = isShow; } - public void setTitle(String title) { - this.title = title; + public boolean isShow() { + return isShow; } - public void setFontSize(int fontSize) { - this.fontSize = fontSize; + public void setTitle(String title) { + this.title = title; } - - @Override - protected void paintComponent(Graphics g) { - Graphics2D g2d = (Graphics2D) g.create(); - g2d.setColor(getBackground()); - if (isPressed) { - g2d.setColor(UIManager.getColor("Button.pressedBackground")); - } - Insets insets = this.getInsets(); - g2d.fillRect(0, insets.top / 2, this.getWidth(), this.getHeight() - (insets.top + insets.bottom) / 2); - - int iconY = (this.getHeight() - triangleDown.getIconHeight()) / 2; - // 折叠面板需要icon显示左边缘对齐,fix一下 - if (this.isShow) { - triangleDown.paintIcon(this, g2d, FineUIScale.scale(ICON_FIX), iconY); - } else { - triangleRight.paintIcon(this, g2d, FineUIScale.scale(ICON_FIX), iconY); - } - - g2d.setFont(getFont()); - g2d.setPaint(getForeground()); - g2d.setComposite(AlphaComposite.SrcOver.derive( getForeground().getAlpha() / 255f)); - - FontMetrics metrics = g2d.getFontMetrics(); - int ascent = metrics.getAscent(); - int descent = metrics.getDescent(); - - float titleX = triangleDown.getIconWidth() + FineUIScale.scale(ICON_FIX) - + FineUIScale.scale(UIManager.getInt("ExpandablePane.HeaderPane.hGap")); - float titleY = (getHeight() - (ascent + descent)) / 2.0f + ascent; - FlatUIUtils.setRenderingHints(g2d); - g2d.drawString(this.title, titleX, titleY); - g2d.dispose(); + public String getTitle() { + return title; } - public HeaderPane(Color bgColor) { + public HeaderPane() { this.isShow = true; - triangleDown = new LazyIcon("triangle_down"); - triangleRight = new LazyIcon("triangle_right"); this.setForeground(UIManager.getColor("ExpandablePane.HeaderPane.foreground")); - this.setFont(getFont().deriveFont(Font.BOLD)); this.setBorder(new ScaledEmptyBorder(17, 0, 17, 0)); } - public HeaderPane(Color bgColor, String title, int headHeight) { - this(bgColor); + public HeaderPane(String title) { + this(); this.title = title; } diff --git a/designer-base/src/main/java/com/fr/design/foldablepane/UIExpandablePane.java b/designer-base/src/main/java/com/fr/design/foldablepane/UIExpandablePane.java index 9003660e0f..2432915650 100644 --- a/designer-base/src/main/java/com/fr/design/foldablepane/UIExpandablePane.java +++ b/designer-base/src/main/java/com/fr/design/foldablepane/UIExpandablePane.java @@ -34,7 +34,7 @@ public class UIExpandablePane extends JPanel { initComponents(); } - public UIExpandablePane(String title, int headHeight, JPanel contentPanel) { + public UIExpandablePane(String title, JPanel contentPanel) { super(); this.title = title; this.headHeight = headHeight; @@ -45,15 +45,15 @@ public class UIExpandablePane extends JPanel { private void initComponents() { this.setLayout(new BorderLayout()); - headerPanel = new HeaderPane(color, title, headHeight); + headerPanel = new HeaderPane(title); headerPanel.addMouseListener(new PanelAction()); - setcontentPanelontentPanelBorder (); + setcontentPanelontentPanelBorder(); this.add(headerPanel, BorderLayout.NORTH); this.add(contentPanel, BorderLayout.CENTER); setOpaque(false); } - protected void setcontentPanelontentPanelBorder (){ + protected void setcontentPanelontentPanelBorder() { } @@ -87,21 +87,4 @@ public class UIExpandablePane extends JPanel { } } - - public static void main(String[] args) { -// JFrame jf = new JFrame("test"); -// jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); -// JPanel content = (JPanel) jf.getContentPane(); -// content.setLayout(new BorderLayout()); -// JPanel myPanel = new JPanel(); -// myPanel.setLayout(new BorderLayout()); -// JPanel Panel = new JPanel(); -// Panel.setBackground(Color.blue); -// myPanel.add(new UIExpandablePane("基本", 223, 24, Panel), BorderLayout.CENTER); -// content.add(myPanel, BorderLayout.CENTER); -// GUICoreUtils.centerWindow(jf); -// jf.setSize(439, 400); -// jf.setVisible(true); - } - } diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties index 89fb2ec23a..5c95ed3cac 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties @@ -53,3 +53,4 @@ GradientBarUI=com.fine.theme.light.ui.FineGradientBarUI TemplateTabPaneUI=com.fine.theme.light.ui.FineTemplateTabPaneUI ReportComponentCompositeUI=com.fine.theme.light.ui.FineReportComponentCompositeUI ColorButtonUI=com.fine.theme.light.ui.FineColorButtonUI +HeaderPaneUI=com.fine.theme.light.ui.FineHeaderPaneUI diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ExpandablePaneStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ExpandablePaneStoryBoard.java index 67d63dc8bb..cd3c3e3ae1 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/components/ExpandablePaneStoryBoard.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/ExpandablePaneStoryBoard.java @@ -20,8 +20,8 @@ import static com.fine.swing.ui.layout.Layouts.*; public class ExpandablePaneStoryBoard extends StoryBoard { public ExpandablePaneStoryBoard() { super("扩展面板"); - add(cell(new UIExpandablePane("扩展", 24, createContentPane()))); - add(cell(new UIExpandablePane("扩展2", 24, createContentPane2()))); + add(cell(new UIExpandablePane("扩展", createContentPane()))); + add(cell(new UIExpandablePane("扩展2", createContentPane2()))); } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChangeConfigPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChangeConfigPane.java index 76a1295cd0..5d91eea462 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChangeConfigPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChangeConfigPane.java @@ -20,7 +20,6 @@ import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; -import com.fr.design.i18n.Toolkit; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; @@ -45,6 +44,8 @@ import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.List; +import static com.fr.design.i18n.Toolkit.i18nText; + /** * 图表切换设置面板 */ @@ -80,7 +81,7 @@ public class ChangeConfigPane extends BasicBeanPane { private List changeChartButtons = new ArrayList<>(); private int selectedChart; // 设置面板里面选取的图表,不是真正切换的图表 - public ChangeConfigPane(){ + public ChangeConfigPane() { init(); this.setLayout(new BorderLayout()); this.setBorder(BorderFactory.createEmptyBorder(10, 15, 10, 15)); @@ -109,7 +110,7 @@ public class ChangeConfigPane extends BasicBeanPane { double[] columnSize = {p, f}; double[] rowSize = {p, p, p}; Component[][] components = new Component[][]{ - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Change_Style")),configStyleButton}, + new Component[]{new UILabel(i18nText("Fine-Design_Chart_Change_Style")), configStyleButton}, new Component[]{configPane, null}, new Component[]{createButtonContentPane(), null} }; @@ -121,12 +122,12 @@ public class ChangeConfigPane extends BasicBeanPane { buttonConfigPane = createButtonConfigPane(); carouselConfigPane = createCarouseConfigPane(); - JPanel panel = new JPanel(new CardLayout()){ + JPanel panel = new JPanel(new CardLayout()) { @Override public Dimension getPreferredSize() { - if (configStyleButton.getSelectedIndex() == 0){ + if (configStyleButton.getSelectedIndex() == 0) { return buttonConfigPane.getPreferredSize(); - } else{ + } else { return carouselConfigPane.getPreferredSize(); } } @@ -147,19 +148,19 @@ public class ChangeConfigPane extends BasicBeanPane { double[] rowSize = {p, p, p}; timeInterval = new UISpinner(MIN_TIME, MAX_TIME, 1, 0); colorSelectBox4carousel = new ColorSelectBoxWithOutTransparent(WIDTH); - switchStyleGroup = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Show"), Toolkit.i18nText("Fine-Design_Report_Hide")}); + switchStyleGroup = new UIButtonGroup(new String[]{i18nText("Fine-Design_Chart_Show"), i18nText("Fine-Design_Report_Hide")}); Component[][] components = new Component[][]{ - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Arrow_Style")), switchStyleGroup, null}, - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Time_Interval")), timeInterval, new UILabel(Toolkit.i18nText("Fine-Design_Chart_Time_Second"))}, - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Background")),colorSelectBox4carousel, null} + new Component[]{new UILabel(i18nText("Fine-Design_Chart_Arrow_Style")), switchStyleGroup, null}, + new Component[]{new UILabel(i18nText("Fine-Design_Chart_Time_Interval")), timeInterval, new UILabel(i18nText("Fine-Design_Chart_Time_Second"))}, + new Component[]{new UILabel(i18nText("Fine-Design_Basic_Background")), colorSelectBox4carousel, null} }; return TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); } private JPanel createTitleStylePane() { - final UILabel text = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Character"), SwingConstants.LEFT); + final UILabel text = new UILabel(i18nText("Fine-Design_Chart_Character"), SwingConstants.LEFT); styleAttrPane = new ChartTextAttrPane() { protected JPanel getContentPane(JPanel buttonPane) { double p = TableLayout.PREFERRED; @@ -181,9 +182,9 @@ public class ChangeConfigPane extends BasicBeanPane { } - private JPanel createButtonBackgroundColorPane(){ + private JPanel createButtonBackgroundColorPane() { colorSelectBox4button = new ColorSelectBoxWithOutTransparent(WIDTH); - return TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Basic_Background"), colorSelectBox4button, EDIT_AREA_WIDTH); + return TableLayout4VanChartHelper.createGapTableLayoutPane(i18nText("Fine-Design_Basic_Background"), colorSelectBox4button, EDIT_AREA_WIDTH); } private JPanel createButtonContentPane() { @@ -195,7 +196,7 @@ public class ChangeConfigPane extends BasicBeanPane { switchTitlePane.setLayout(new CardLayout()); JPanel titleEditPane = TableLayout4VanChartHelper.createGapTableLayoutPane( - Toolkit.i18nText("Fine-Design_Chart_Switch_Title_Label"), + i18nText("Fine-Design_Chart_Switch_Title_Label"), switchTitlePane, EDIT_AREA_WIDTH ); @@ -204,7 +205,7 @@ public class ChangeConfigPane extends BasicBeanPane { buttonContentPane.add(chartTypesPane, BorderLayout.NORTH); buttonContentPane.add(titleEditPane, BorderLayout.CENTER); - UIExpandablePane expandablePane = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Button_And_Rotation_Content"), 20, buttonContentPane) { + UIExpandablePane expandablePane = new UIExpandablePane(i18nText("Fine-Design_Chart_Button_And_Rotation_Content"), buttonContentPane) { protected void setcontentPanelontentPanelBorder() { } @@ -270,8 +271,8 @@ public class ChangeConfigPane extends BasicBeanPane { } private void initButtonGroup() { - configStyleButton = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Button_Style"), - Toolkit.i18nText("Fine-Design_Chart_Carousel_Style")}); + configStyleButton = new UIButtonGroup(new String[]{i18nText("Fine-Design_Chart_Button_Style"), + i18nText("Fine-Design_Chart_Carousel_Style")}); configStyleButton.setPreferredSize(new Dimension(WIDTH * 2, (int) configStyleButton.getPreferredSize().getHeight())); configStyleButton.addActionListener(new ActionListener() { @Override @@ -292,11 +293,11 @@ public class ChangeConfigPane extends BasicBeanPane { @Override public void populateBean(ChartCollection ob) { - if (ob == null){ + if (ob == null) { return; } AttrChangeConfig changeConfigAttr = ob.getChangeConfigAttr(); - if (changeConfigAttr == null){ + if (changeConfigAttr == null) { return; } configStyleButton.setSelectedIndex(changeConfigAttr.getChangeType() == AttrChangeType.BUTTON ? 0 : 1); @@ -321,11 +322,11 @@ public class ChangeConfigPane extends BasicBeanPane { } public void updateBean(ChartCollection ob) { - if (ob == null){ + if (ob == null) { return; } AttrChangeConfig changeConfigAttr = ob.getChangeConfigAttr(); - if (changeConfigAttr == null){ + if (changeConfigAttr == null) { return; } changeConfigAttr.setChangeType(configStyleButton.getSelectedIndex() == 0 ? AttrChangeType.BUTTON : AttrChangeType.CAROUSEL); @@ -354,7 +355,7 @@ public class ChangeConfigPane extends BasicBeanPane { @Override protected String title4PopupWindow() { - return Toolkit.i18nText("Fine-Design_Chart_Change_Config_Attributes"); + return i18nText("Fine-Design_Chart_Change_Config_Attributes"); } private class ChangeChartButton extends UIToggleButton { From 366eaf01f370a4acf3888218d9af9d2662e52c45 Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 30 Jan 2024 11:44:30 +0800 Subject: [PATCH 140/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/utils/AnimatedPainterSupport.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/utils/AnimatedPainterSupport.java b/designer-base/src/main/java/com/fine/theme/utils/AnimatedPainterSupport.java index 4e02bf29c9..b13a741f82 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/AnimatedPainterSupport.java +++ b/designer-base/src/main/java/com/fine/theme/utils/AnimatedPainterSupport.java @@ -9,6 +9,7 @@ import java.awt.Graphics2D; /** * 动画支持类,用于存储动画状态并实现动画。 + * 逻辑保持与AnimatedIcon逻辑一致。 * * @author vito * @since 12.0 @@ -29,6 +30,10 @@ class AnimatedPainterSupport { private int width; private int height; + /** + * 用于包内绘制,保持与AnimatedIcon逻辑一致。 + * 后期整合逻辑之后在整理代码质量 + */ static void paint(AnimatedPainter painter, Component c, Graphics g, int x, int y, int width, int height) { if (!isAnimationEnabled(painter, c)) { @@ -115,8 +120,9 @@ class AnimatedPainterSupport { // animated value to the new target value with reduced duration as.animator.cancel(); int duration2 = (int) (animationDuration * as.fraction); - if (duration2 > 0) + if (duration2 > 0) { as.animator.setDuration(duration2); + } as.startValue = as.animatedValue; } else { // new animation @@ -153,8 +159,9 @@ class AnimatedPainterSupport { } static void saveRepaintLocation(AnimatedPainter painter, Component c, int x, int y) { - if (!isAnimationEnabled(painter, c)) + if (!isAnimationEnabled(painter, c)) { return; + } AnimatedPainterSupport[] ass = (AnimatedPainterSupport[]) ((JComponent) c).getClientProperty(painter.getClientPropertyKey()); if (ass != null) { From 2e06f2d7f185ac8aff95b1031837cd31829a92ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Tue, 30 Jan 2024 15:44:13 +0800 Subject: [PATCH 141/302] =?UTF-8?q?REPORT-111995=20=E3=80=90UI=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E3=80=91=E6=BB=9A=E5=8A=A8=E9=9D=A2=E6=9D=BF=E8=A1=A5?= =?UTF-8?q?=E5=85=85storyboard&=E8=A7=A3=E5=86=B3=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E4=B8=80=E4=BA=9B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/utils/FineUIUtils.java | 14 +++- .../components/UIScrollPaneStoryBoard.java | 77 +++++++++++++++++++ .../ui/designer/ButtonGroupDictPane.java | 20 ++--- .../ui/designer/FieldEditorDefinePane.java | 4 +- 4 files changed, 103 insertions(+), 12 deletions(-) create mode 100644 designer-base/src/test/java/com/fr/design/gui/storybook/components/UIScrollPaneStoryBoard.java diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java index 46891db208..058416fa15 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java @@ -381,7 +381,7 @@ public class FineUIUtils { } /** - * 创建一个UIScrollPane的装饰层,内部的ScrollPane仅当悬浮时显示滚动条 + * 基于组件创建一个UIScrollPane的装饰层,内部的ScrollPane仅当悬浮时显示滚动条 * * @param c 组件 * @return UIScrollPane的装饰层 @@ -391,4 +391,16 @@ public class FineUIUtils { new CollapsibleScrollBarLayerUI()); } + /** + * 基于组件创建一个UIScrollPane的装饰层,内部的ScrollPane仅当悬浮时显示滚动条 + * + * @param c 组件 + * @param verticalPolicy 滚动条垂直显示策略 + * @param horizontalPolicy 滚动条水平显示策略 + * @return UIScrollPane的装饰层 + */ + public static JLayer createCollapsibleScrollBarLayer(Component c, int verticalPolicy, int horizontalPolicy) { + return new JLayer<>(new UIScrollPane(c, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER), + new CollapsibleScrollBarLayerUI(verticalPolicy, horizontalPolicy)); + } } diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/UIScrollPaneStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/UIScrollPaneStoryBoard.java new file mode 100644 index 0000000000..a485942422 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/UIScrollPaneStoryBoard.java @@ -0,0 +1,77 @@ +package com.fr.design.gui.storybook.components; + +import com.fine.swing.ui.layout.Column; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIUtils; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.storybook.StoryBoard; + +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.ScrollPaneConstants; +import java.awt.Dimension; +import java.util.Collections; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; + +/** + * 滚动面板 + * + * @author Levy.Xie + * @since 11.0 + * Created on 2024/01/25 + */ +public class UIScrollPaneStoryBoard extends StoryBoard { + public UIScrollPaneStoryBoard() { + super("滚动面板"); + add( + row(20, + column( + cell(new UILabel("滚动条常驻显示")).with(this::h2), + cell(new UILabel("水平/纵向")).with(this::h2), + cell(new UIScrollPane(createMultiLabelPane())).with(this::setFixSize), + cell(new UILabel("水平")).with(this::h3), + cell(new UIScrollPane(createMultiLabelPane(), + ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED)) + .with(this::setFixSize), + cell(new UILabel("纵向")).with(this::h3), + cell(new UIScrollPane(createMultiLabelPane(), + ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER)) + .with(this::setFixSize) + ).weight(1), + + column( + cell(new UILabel("滚动条悬浮显示")).with(this::h2), + cell(new UILabel("水平/纵向")).with(this::h3), + cell(FineUIUtils.createCollapsibleScrollBarLayer(createMultiLabelPane())).with(it -> setFixSize(it.getView())), + cell(new UILabel("水平")).with(this::h3), + cell(FineUIUtils.createCollapsibleScrollBarLayer(createMultiLabelPane(), + ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED + )).with(it -> setFixSize(it.getView())), + cell(new UILabel("纵向")).with(this::h3), + cell(FineUIUtils.createCollapsibleScrollBarLayer(createMultiLabelPane(), + ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER + )).with(it -> setFixSize(it.getView()) + ) + ).weight(1) + ) + ); + } + + private JPanel createMultiLabelPane() { + Column column = new Column(); + for (int i = 0; i < 10; i++) { + column.add(new UILabel(String.join(" ", Collections.nCopies(20, "test")))); + } + return column; + } + + private void setFixSize(JComponent component) { + component.setPreferredSize(new Dimension(component.getWidth(), 100)); + component.setBorder(new FineRoundBorder()); + } + +} 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 733317eb1d..86238df132 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,6 +1,7 @@ package com.fr.design.widget.ui.designer; +import com.fine.swing.ui.layout.Row; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UIBasicSpinner; @@ -22,7 +23,7 @@ import static com.fr.design.constants.LayoutConstants.VERTICAL_GAP; public class ButtonGroupDictPane extends JPanel { private UIBasicSpinner columnSpinner; private UICheckBox adaptiveCheckbox; - private UILabel columnLabel; + private Row columnSettingRow; public ButtonGroupDictPane() { this.initComponents(); @@ -35,27 +36,26 @@ public class ButtonGroupDictPane extends JPanel { this.setLayout(FRGUIPaneFactory.createBorderLayout()); adaptiveCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Adaptive"), true); 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); + UILabel 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)); - + columnSettingRow = row( + cell(columnLabel).weight(LEFT_WEIGHT), cell(columnSpinner).weight(RIGHT_WEIGHT) + ).getComponent(); this.add(column(VERTICAL_GAP, cell(adaptiveCheckbox), - row( - cell(columnLabel).weight(LEFT_WEIGHT), cell(columnSpinner).weight(RIGHT_WEIGHT) - ) + cell(columnSettingRow) + ).getComponent()); } public void populate(ButtonGroup buttonGroup) { adaptiveCheckbox.setSelected(buttonGroup.isAdaptive()); - columnSpinner.setVisible(!adaptiveCheckbox.isSelected()); - columnLabel.setVisible(!adaptiveCheckbox.isSelected()); + columnSettingRow.setVisible(!adaptiveCheckbox.isSelected()); columnSpinner.setValue(buttonGroup.getColumnsInRow()); } public void update(ButtonGroup buttonGroup) { - columnSpinner.setVisible(!adaptiveCheckbox.isSelected()); - columnLabel.setVisible(!adaptiveCheckbox.isSelected()); + columnSettingRow.setVisible(!adaptiveCheckbox.isSelected()); buttonGroup.setAdaptive(adaptiveCheckbox.isSelected()); buttonGroup.setColumnsInRow((Integer)(columnSpinner.getValue())); } diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/FieldEditorDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/FieldEditorDefinePane.java index 09fd42ee5d..e847f7dac3 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/FieldEditorDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/FieldEditorDefinePane.java @@ -5,6 +5,7 @@ import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicBeanPane; import com.fr.design.beans.ErrorMsgTextFieldAdapter; import com.fr.design.beans.UITextFieldAdapter; +import com.fr.design.border.FineBorderFactory; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.designer.creator.XLayoutContainer; @@ -162,7 +163,8 @@ public abstract class FieldEditorDefinePane extends Abstr validatePane.add(contentPane); } UIExpandablePane uiExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Validate"), 280, 20, validatePane); - this.add(uiExpandablePane, BorderLayout.CENTER); + uiExpandablePane.setBorder(FineBorderFactory.createDefaultTopBorder()); + corePane.add(uiExpandablePane); } From 7ed5e6545d00f07b5dd520c27ef16e957f18e1b1 Mon Sep 17 00:00:00 2001 From: vito Date: Fri, 2 Feb 2024 16:26:29 +0800 Subject: [PATCH 142/302] =?UTF-8?q?REPORT-99485=20TableLayoutHelper=20?= =?UTF-8?q?=E9=80=82=E9=85=8DDPI=E7=BC=A9=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/layout/TableLayoutHelper.java | 108 +++-------- .../components/TablelayoutStoryBoard.java | 169 ++++++++++++++++++ .../gui/storybook/components/Preferred.gif | Bin 0 -> 17609 bytes 3 files changed, 198 insertions(+), 79 deletions(-) create mode 100644 designer-base/src/test/java/com/fr/design/gui/storybook/components/TablelayoutStoryBoard.java create mode 100644 designer-base/src/test/resources/com/fr/design/gui/storybook/components/Preferred.gif diff --git a/designer-base/src/main/java/com/fr/design/layout/TableLayoutHelper.java b/designer-base/src/main/java/com/fr/design/layout/TableLayoutHelper.java index e664524026..5e31ba2f7f 100644 --- a/designer-base/src/main/java/com/fr/design/layout/TableLayoutHelper.java +++ b/designer-base/src/main/java/com/fr/design/layout/TableLayoutHelper.java @@ -1,16 +1,13 @@ package com.fr.design.layout; - +import com.fine.theme.utils.FineUIScale; import com.fr.design.constants.LayoutConstants; -import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.stable.StringUtils; - -import javax.swing.*; -import java.awt.*; +import javax.swing.JPanel; +import java.awt.Component; +import java.awt.Container; public class TableLayoutHelper { @@ -18,8 +15,6 @@ public class TableLayoutHelper { public static final int FILL_LASTCOLUMN = 1; public static final int FILL_LASTROW = 2; public static final int FILL_LASTCOL_AND_ROW = 3; - private static final int FIVE = 5; - private static final int TEN = 10; private TableLayoutHelper() { } @@ -287,6 +282,8 @@ public class TableLayoutHelper { layoutRowSize[i * 2 + 1] = rowSize[i]; } + scaleIfNeed(layoutRowSize, layoutColumnSize); + layoutSize[0] = layoutColumnSize; layoutSize[1] = layoutRowSize; @@ -296,6 +293,28 @@ public class TableLayoutHelper { return resultPane; } + /** + * 缩放必要的尺寸。 + * 尺寸参数有三种,小于0有三种预定义类型,0~1之间为比例参数,大于等于1为普通px。 + * 这里只对px进行缩放处理 + * 注意:当前只对从TableLayoutHelper创建的TableLayout进行尺寸缩放。 + */ + private static void scaleIfNeed(double[] layoutRowSize, double[] layoutColumnSize) { + for (int i = 0; i < layoutRowSize.length; i++) { + double size = layoutRowSize[i]; + if (size >= 1.0) { + layoutRowSize[i] = FineUIScale.scale((float) size); + } + } + + for (int i = 0; i < layoutColumnSize.length; i++) { + double size = layoutColumnSize[i]; + if (size >= 1.0) { + layoutColumnSize[i] = FineUIScale.scale((float) size); + } + } + } + /** * 创建具有不同垂直间距的TableLayout面板 * @@ -363,73 +382,4 @@ public class TableLayoutHelper { }; return createTableLayoutPane(comp, row, column); } - - public static void main(String[] args) { - JFrame jf = new JFrame("test"); - jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - JPanel content = (JPanel) jf.getContentPane(); - content.setLayout(new GridLayout(2, 3)); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - JPanel jp1 = TableLayoutHelper.createTableLayoutPane(createTestComponents("jp1"), TableLayoutHelper.FILL_NONE); - JPanel jp2 = TableLayoutHelper.createGapTableLayoutPane(createTestComponents("jp2"), - TableLayoutHelper.FILL_LASTCOL_AND_ROW, (double)2 * TEN, (double)2 * TEN); - JPanel jp3 = TableLayoutHelper.createGapTableLayoutPane(createTestComponents("jp3"), - new double[]{f, p, f, p}, new double[]{f, f}, 4, 4); - JPanel jp4 = TableLayoutHelper.createGapTableLayoutPane(createTestComponents("jp4"), - new double[]{p, FIVE * TEN, p, p, p, p}, new double[]{p, f}, new int[][]{{1, 3}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, 1, FIVE); - - JPanel jp5 = TableLayoutHelper.createDiffVGapTableLayoutPane(createTestComponents("jp5"), - new double[]{p, p, p, p, p}, new double[]{p, f}, 4, new double[]{4, 8, 14, 4}); - JPanel jp6 = new JPanel(); - jp1.setBorder(BorderFactory.createLineBorder(Color.red)); - jp2.setBorder(BorderFactory.createLineBorder(Color.red)); - jp3.setBorder(BorderFactory.createLineBorder(Color.red)); - jp4.setBorder(BorderFactory.createLineBorder(Color.red)); - jp5.setBorder(BorderFactory.createLineBorder(Color.red)); - jp6.setBorder(BorderFactory.createLineBorder(Color.red)); - - - content.add(jp1); - content.add(jp2); - content.add(jp3); - content.add(jp4); - content.add(jp5); - content.add(jp6); - - GUICoreUtils.centerWindow(jf); - jf.setSize(900, 600); - jf.setVisible(true); - } - - private static Component[][] createTestComponents(String name) { - UILabel label1 = new UILabel(name + "laaaable1"); - UILabel label2 = new UILabel(name + "lable2"); - UILabel label3 = new UILabel(name + "lable3"); - UILabel label4 = new UILabel(name + "lable4"); - UILabel label5 = new UILabel(name + "lable5"); - UIButton button1 = new UIButton(name + "button1"); - UIButton button2 = new UIButton(name + "button2"); - label1.setSize(label1.getPreferredSize()); - label1.setBorder(BorderFactory.createLineBorder(Color.blue)); - label2.setSize(label2.getPreferredSize()); - label2.setBorder(BorderFactory.createLineBorder(Color.blue)); - label3.setSize(label3.getPreferredSize()); - label3.setBorder(BorderFactory.createLineBorder(Color.blue)); - label4.setSize(label4.getPreferredSize()); - label4.setBorder(BorderFactory.createLineBorder(Color.blue)); - label5.setSize(label5.getPreferredSize()); - label5.setBorder(BorderFactory.createLineBorder(Color.blue)); - button1.setSize(button1.getPreferredSize()); - button2.setSize(button2.getPreferredSize()); - button1.setBackground(Color.darkGray); - button2.setBackground(Color.darkGray); - return new Component[][]{ - new Component[]{label1, button1}, - new Component[]{label2, null}, - new Component[]{label3}, - new Component[]{null, label4}, - new Component[]{button2, label5} - }; - } -} \ No newline at end of file +} diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/TablelayoutStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/TablelayoutStoryBoard.java new file mode 100644 index 0000000000..c99995d60d --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/TablelayoutStoryBoard.java @@ -0,0 +1,169 @@ +package com.fr.design.gui.storybook.components; + +import com.fine.swing.ui.layout.Layouts; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.gui.storybook.StoryBoard; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import org.jetbrains.annotations.NotNull; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import java.awt.Color; +import java.awt.Component; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.layout.TableLayoutHelper.createDiffVGapTableLayoutPane; +import static com.fr.design.layout.TableLayoutHelper.createGapTableLayoutPane; +import static com.fr.design.layout.TableLayoutHelper.createTableLayoutPane; + +/** + * 表格布局展示 + *
+ * TableLayout 来自开源项目 + * TableLayout + * + * @author vito + * @since 11.0 + * Created on 2024/1/31 + */ +public class TablelayoutStoryBoard extends StoryBoard { + + + private static final double P = TableLayout.PREFERRED; + private static final double F = TableLayout.FILL; + + public TablelayoutStoryBoard() { + + super("Tablelayout"); + add( + cell(new UILabel("简单布局")).with(this::h3), + layout1(), + + cell(new UILabel("TableLayoutHelper 快速创建")).with(this::h3), + row( + cell(createTableLayoutPane(createTestComponents("jp1"), TableLayoutHelper.FILL_NONE)) + .with(it -> it.setBorder(BorderFactory.createLineBorder(Color.red))).weight(1), + + cell(createGapTableLayoutPane(createTestComponents("jp2"), + TableLayoutHelper.FILL_LASTCOL_AND_ROW, 20, 20)) + .with(it -> it.setBorder(BorderFactory.createLineBorder(Color.red))).weight(1), + + cell(createGapTableLayoutPane(createTestComponents("jp3"), + new double[]{F, P, F, P}, new double[]{F, F}, 4, 4)) + .with(it -> it.setBorder(BorderFactory.createLineBorder(Color.red))).weight(1) + ), + row( + cell(createGapTableLayoutPane(createTestComponents("jp4"), + new double[]{P, 50, P, P, P, P}, new double[]{P, F}, new int[][]{{1, 3}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, 1, 5)) + .with(it -> it.setBorder(BorderFactory.createLineBorder(Color.red))).weight(1), + + cell(createDiffVGapTableLayoutPane(createTestComponents("jp5"), + new double[]{P, P, P, P, P}, new double[]{P, F}, 4, new double[]{4, 8, 14, 4})) + .with(it -> it.setBorder(BorderFactory.createLineBorder(Color.red))).weight(1) + ) + + + ); + } + + + private static Component[][] createTestComponents(String name) { + UILabel label1 = new UILabel(name + "laaaable1"); + UILabel label2 = new UILabel(name + "lable2"); + UILabel label3 = new UILabel(name + "lable3"); + UILabel label4 = new UILabel(name + "lable4"); + UILabel label5 = new UILabel(name + "lable5"); + UIButton button1 = new UIButton(name + "button1"); + UIButton button2 = new UIButton(name + "button2"); + label1.setSize(label1.getPreferredSize()); + label1.setBorder(BorderFactory.createLineBorder(Color.blue)); + label2.setSize(label2.getPreferredSize()); + label2.setBorder(BorderFactory.createLineBorder(Color.blue)); + label3.setSize(label3.getPreferredSize()); + label3.setBorder(BorderFactory.createLineBorder(Color.blue)); + label4.setSize(label4.getPreferredSize()); + label4.setBorder(BorderFactory.createLineBorder(Color.blue)); + label5.setSize(label5.getPreferredSize()); + label5.setBorder(BorderFactory.createLineBorder(Color.blue)); + button1.setSize(button1.getPreferredSize()); + button2.setSize(button2.getPreferredSize()); + return new Component[][]{ + new Component[]{label1, button1}, + new Component[]{label2, null}, + new Component[]{label3}, + new Component[]{null, label4}, + new Component[]{button2, label5} + }; + } + + /** + * 图示 {@link /com/fr/design/gui/storybook/components/Preferred.gif} + */ + private Layouts.Cell layout1() { + + JPanel pane = getTableLayoutPanel(); + + // Create all controls + UILabel labelName = new UILabel("Name"); + UILabel labelAddress = new UILabel("Address"); + UILabel labelCity = new UILabel("City"); + UILabel labelState = new UILabel("State"); + UILabel labelZip = new UILabel("Zip"); + + UITextField textfieldName = new UITextField(10); + UITextField textfieldAddress = new UITextField(20); + UITextField textfieldCity = new UITextField(10); + UITextField textfieldState = new UITextField(2); + UITextField textfieldZip = new UITextField(5); + + UIButton buttonOk = new UIButton("OK"); + UIButton buttonCancel = new UIButton("Cancel"); + JPanel panelButton = new JPanel(); + panelButton.add(buttonOk); + panelButton.add(buttonCancel); + + // Add all controls + pane.add(labelName, "1, 1, 5, 1"); + pane.add(textfieldName, "1, 3, 5, 3"); + pane.add(labelAddress, "1, 5, 5, 5"); + pane.add(textfieldAddress, "1, 7, 5, 7"); + pane.add(labelCity, "1, 9"); + pane.add(textfieldCity, "1, 11"); + pane.add(labelState, "3, 9"); + pane.add(textfieldState, "3, 11"); + pane.add(labelZip, "5, 9"); + pane.add(textfieldZip, "5, 11"); + pane.add(panelButton, "1, 13, 5, 13"); + return cell(pane); + } + + @NotNull + private static JPanel getTableLayoutPanel() { + JPanel pane = new JPanel(); + // b - border + // f - FILL + // p - PREFERRED + // vs - vertical space between labels and text fields + // vg - vertical gap between form elements + // hg - horizontal gap between form elements + + double b = 10; + double f = TableLayout.FILL; + double p = TableLayout.PREFERRED; + double vs = 5; + double vg = 10; + double hg = 10; + + double[][] size = + {{b, f, hg, p, hg, p, b}, + {b, p, vs, p, vg, p, vs, p, vg, p, vs, p, vg, p, b}}; + + TableLayout layout = new TableLayout(size); + pane.setLayout(layout); + return pane; + } +} diff --git a/designer-base/src/test/resources/com/fr/design/gui/storybook/components/Preferred.gif b/designer-base/src/test/resources/com/fr/design/gui/storybook/components/Preferred.gif new file mode 100644 index 0000000000000000000000000000000000000000..88e9c2dfab60f3d4e0b2ee462a4ea6a2641a54ef GIT binary patch literal 17609 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 fwLn%8y^d6(7!6fbO Date: Fri, 23 Feb 2024 15:26:46 +0800 Subject: [PATCH 143/302] =?UTF-8?q?REPORT-113377=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E8=A7=86=E8=A7=89=E9=AA=8C=E6=94=B6-=E5=B7=A6?= =?UTF-8?q?=E4=BE=A7=E5=88=97=E8=A1=A8=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 4 ++-- .../theme/light/ui/FineToggleButtonUI.java | 23 +++++++++++-------- .../resources/com/fine/theme/icon/search.svg | 8 ++----- .../com/fine/theme/icon/search_disable.svg | 3 +++ .../light/ui/laf/FineLightLaf.properties | 7 +++--- 5 files changed, 24 insertions(+), 21 deletions(-) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/search_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 77079e8fdc..7fa3a7d058 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -330,12 +330,12 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("number_field", "com/fine/theme/icon/widget/number_field.svg", true), new SvgIconSource("password_field", "com/fine/theme/icon/widget/password_field.svg", true), new SvgIconSource("picture", "com/fine/theme/icon/widget/picture.svg", true), - new SvgIconSource("preview", "com/fine/theme/icon/widget/preview.svg", true), + new SvgIconSource("widget_preview", "com/fine/theme/icon/widget/preview.svg", true), new SvgIconSource("prewidget", "com/fine/theme/icon/widget/prewidget.svg", true), new SvgIconSource("tab", "com/fine/theme/icon/widget/tab.svg", true), new SvgIconSource("text_area", "com/fine/theme/icon/widget/text_area.svg", true), new SvgIconSource("text_field", "com/fine/theme/icon/widget/text_field.svg", true), - new SvgIconSource("tree", "com/fine/theme/icon/widget/tree.svg", true) + new SvgIconSource("widget_tree", "com/fine/theme/icon/widget/tree.svg", true) ); } diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineToggleButtonUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineToggleButtonUI.java index aab2766a03..ad28f76f8c 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineToggleButtonUI.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineToggleButtonUI.java @@ -122,19 +122,24 @@ public class FineToggleButtonUI extends FlatToggleButtonUI { int height = c.getHeight(); int width = c.getWidth(); boolean selected = ((AbstractButton) c).isSelected(); - Color enabledColor = selected ? clientPropertyColor(c, TAB_BUTTON_SELECTED_BACKGROUND, tabSelectedBackground) : null; - // use component background if explicitly set - if (enabledColor == null) { - Color bg = c.getBackground(); - if (isCustomBackground(bg)) { - enabledColor = bg; + // paint background + Color background; + if(c.isEnabled() && selected) { + background = tabSelectedBackground; + } else { + Color enabledColor = selected ? clientPropertyColor(c, TAB_BUTTON_SELECTED_BACKGROUND, tabSelectedBackground) : null; + // use component background if explicitly set + if (enabledColor == null) { + Color bg = c.getBackground(); + if (isCustomBackground(bg)) { + enabledColor = bg; + } } + background = buttonStateColor(c, enabledColor, + null, tabFocusBackground, tabHoverBackground, null); } - // paint background - Color background = buttonStateColor(c, enabledColor, - null, tabFocusBackground, tabHoverBackground, null); if (background != null) { g.setColor(background); g.fillRoundRect(0, 0, width, height, tabArc, tabArc); diff --git a/designer-base/src/main/resources/com/fine/theme/icon/search.svg b/designer-base/src/main/resources/com/fine/theme/icon/search.svg index 0e0ebbbd44..b04adf27f1 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/search.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/search.svg @@ -1,7 +1,3 @@ - - - icon_搜索_normal - - - + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/search_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/search_disable.svg new file mode 100644 index 0000000000..982bbe7687 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/search_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index d7669df0f3..51042cb0b2 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -131,7 +131,7 @@ color.brand4=#84B1F6 background.normal=#FFFFFF text.white=#ffffff text.placeholder=fade(@foreground, 40%) -text.highlight=fade(@foreground, 90%) +text.highlight=#F9AE31 fill.hover=#E6E9EF fill.click=#DADEE7 fill.normal=#FFFFFF @@ -1102,8 +1102,8 @@ ToolTip.maxWidth=392 Tree.border = 1,1,1,1 Tree.editorBorder = 1,1,1,1,@cellFocusColor Tree.background = @componentBackground -Tree.selectionInactiveBackground = @selectionInactiveBackground -Tree.selectionInactiveForeground = @selectionInactiveForeground +Tree.selectionInactiveBackground = @selectionBackground +Tree.selectionInactiveForeground = @selectionForeground Tree.textBackground = $Tree.background Tree.textForeground = $Tree.foreground Tree.selectionBorderColor = @cellFocusColor @@ -1142,7 +1142,6 @@ West.border = $defaultBorderColor #---- ExpandablePane ---- ExpandablePane.HeaderPane.borderInsets=0, 6, 0, 6 ExpandablePane.HeaderPane.hGap=0 -ExpandablePane.HeaderPane.foreground=$text.highlight ExpandablePane.vGap=5 HeaderPane.width=248 HeaderPane.height=$Component.defaultHeight From 9b5efc29c846a9cc6ad3679dff39969a9ca46cd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Fri, 23 Feb 2024 16:28:35 +0800 Subject: [PATCH 144/302] =?UTF-8?q?REPORT-113377=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E8=A7=86=E8=A7=89=E9=AA=8C=E6=94=B6-=E5=B7=A6?= =?UTF-8?q?=E4=BE=A7=E5=88=97=E8=A1=A8=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/gui/core/WidgetOption.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/core/WidgetOption.java b/designer-base/src/main/java/com/fr/design/gui/core/WidgetOption.java index 6dd9826fb7..5c6babf640 100644 --- a/designer-base/src/main/java/com/fr/design/gui/core/WidgetOption.java +++ b/designer-base/src/main/java/com/fr/design/gui/core/WidgetOption.java @@ -156,7 +156,7 @@ public abstract class WidgetOption implements Serializable { public static final WidgetOption TREE = WidgetOptionFactory.createByWidgetClass( i18nText("Fine-Design_Report_View_Tree"), - "tree", + "widget_tree", TreeEditor.class); public static final WidgetOption TREECOMBOBOX = WidgetOptionFactory.createByWidgetClass( From c30278f28bf7f8f0169e6e20089210150078643b Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 29 Feb 2024 16:19:39 +0800 Subject: [PATCH 145/302] =?UTF-8?q?REPORT-114888=20fix:=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=96=B0UI=E5=9B=BE=E8=A1=A8=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=89=93=E5=BC=80=E9=85=8D=E7=BD=AE=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 +- .../fr/design/gui/imenutable/UIMenuTable.java | 408 ++++++------- .../com/fr/design/gui/itable/UITable.java | 549 +++++++++--------- 3 files changed, 492 insertions(+), 469 deletions(-) diff --git a/build.gradle b/build.gradle index 9cabeff69e..4ebe9558d3 100644 --- a/build.gradle +++ b/build.gradle @@ -87,9 +87,9 @@ allprojects { implementation 'com.fr.report:engine-chart:' + frDevVersion implementation 'com.fr.report:engine-i18n:' + frDevVersion implementation 'com.fr.design:design-i18n:' + frDevVersion - implementation 'com.formdev:flatlaf:3.2' - implementation 'com.formdev:flatlaf-extras:3.2.1' implementation 'com.github.weisj:jsvg:1.2.0' + implementation 'com.formdev:flatlaf:3.4' + implementation 'com.formdev:flatlaf-extras:3.4' implementation 'com.fanruan.vito:gui-inspector:1.0.1' implementation 'com.fine.swing.ui:layout:1.0-SNAPSHOT' testImplementation 'org.easymock:easymock:3.5.1' diff --git a/designer-base/src/main/java/com/fr/design/gui/imenutable/UIMenuTable.java b/designer-base/src/main/java/com/fr/design/gui/imenutable/UIMenuTable.java index 938e0caccc..488b449939 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenutable/UIMenuTable.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenutable/UIMenuTable.java @@ -10,222 +10,238 @@ import com.fr.design.hyperlink.ReportletHyperlinkPane; import com.fr.design.hyperlink.WebHyperlinkPane; import com.fr.design.javascript.EmailPane; import com.fr.design.utils.gui.GUICoreUtils; - import com.fr.js.EmailJavaScript; import com.fr.js.ReportletHyperlink; import com.fr.js.WebHyperlink; +import org.jetbrains.annotations.NotNull; -import javax.swing.*; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JTable; +import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.plaf.TableUI; import javax.swing.table.TableCellRenderer; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; import java.util.ArrayList; import java.util.List; public class UIMenuTable extends JTable { - protected int selectedRowIndex = -1; - protected int rollOverRowIndex = -1; - protected int draggingIndex = -1; + protected int selectedRowIndex = -1; + protected int rollOverRowIndex = -1; + protected int draggingIndex = -1; - public UIMenuTable() { - super(new UIMenuTableDataModel()); - initComponents(); - } + public UIMenuTable() { + super(new UIMenuTableDataModel()); + initComponents(); + } - public void populateBean(List values) { - ((UIMenuTableDataModel)dataModel).populateBean(values); - } + public void populateBean(List values) { + ((UIMenuTableDataModel) dataModel).populateBean(values); + } - public List updateBean() { - return ((UIMenuTableDataModel)dataModel).updateBean(); - } + public List updateBean() { + return ((UIMenuTableDataModel) dataModel).updateBean(); + } - public void editingEvent(int rowIndex, int mouseY) { - selectedRowIndex = rowIndex; - repaint(); + public void editingEvent(int rowIndex, int mouseY) { + selectedRowIndex = rowIndex; + repaint(); - final UIMenuNameableCreator nameObject = UIMenuTable.this.getLine(rowIndex); + final UIMenuNameableCreator nameObject = UIMenuTable.this.getLine(rowIndex); - final BasicBeanPane baseShowPane = nameObject.getPane(); + final BasicBeanPane baseShowPane = nameObject.getPane(); - final Object showValue = nameObject.getObj(); + final Object showValue = nameObject.getObj(); - baseShowPane.populateBean(showValue); + baseShowPane.populateBean(showValue); UIDialog dialog = baseShowPane.showUnsizedWindow(SwingUtilities.getWindowAncestor(new JPanel()), new DialogActionAdapter() { - public void doOk() { - baseShowPane.updateBean(showValue); - fireTargetChanged(); - } - }); - - dialog.setSize(500, 600); - GUICoreUtils.centerWindow(dialog); - - dialog.setVisible(true); - } - - protected Color getRenderBackground(int row) { - if(selectedRowIndex == row ) { - return UIConstants.SKY_BLUE; - } else { - return (rollOverRowIndex == row) ? UIConstants.LIGHT_BLUE : UIConstants.NORMAL_BACKGROUND; - } - } - - /** - * - * @param value 该行列的值(字符串) - * @param row - * @param column - * @return 列表中默认显示的东西,如果有很多内容,可以装载一个JPanel里再嵌进来 - */ - protected JComponent getRenderCompoment(Object value, int row,int column) { - UILabel text = new UILabel(); - if(value != null) { - text.setText(value.toString()); - } - return text; - } - - /** - * @param line 该行的内容 - * 在table底部增加一行内容 - */ - public void addLine(UIMenuNameableCreator line) { - ((UIMenuTableDataModel)dataModel).addLine(line); - } - - /** - * @param rowIndex - * @return 某一行的内容 - */ - public UIMenuNameableCreator getLine(int rowIndex) { - return ((UIMenuTableDataModel)dataModel).getLine(rowIndex); - } - - /** - * 删除某行内容 - * @param rowIndex - */ - public void removeLine(int rowIndex) { - ((UIMenuTableDataModel)dataModel).removeLine(rowIndex); - } - - /** - * 清除所有的内容 - */ - public void clearAll() { - int rowCount = dataModel.getRowCount(); - for(int i = 0; i < rowCount; i++) { - removeLine(i); - } - } - - /** - * 对某一行拖动时进行排序 - * @param rowIndex - * @param positive 鼠标移动的距离 - */ - public void dragSort(int rowIndex, boolean positive) { - ((UIMenuTableDataModel)dataModel).dragSort(rowIndex, positive); - } - - @Override - public boolean isCellEditable(int row, int column) { - if(column == 0) { - return false; - } else { - return super.isCellEditable(row, column); - } - } - - @Override - public TableUI getUI() { - return new UIMenuTableUI(); - } - - private void initComponents() { - setShowGrid(false); - setRowHeight(20); - setDragEnabled(false); - setDefaultRenderer(UITable.class, new UITableRender()); - setUI(getUI()); - } - - @Override - public TableCellRenderer getDefaultRenderer(Class columnClass) { - return super.getDefaultRenderer(UITable.class); - } - - private class UITableRender implements TableCellRenderer { - @Override - public Component getTableCellRendererComponent(JTable table, - Object value, boolean isSelected, boolean hasFocus, int row, - int column) { - JPanel pane = new JPanel(new BorderLayout(4,0)); - Color back = getRenderBackground(row); - pane.setBackground(back); - - if(draggingIndex == row) { - return pane; - } - pane.add(getRenderCompoment(value, row, column), BorderLayout.CENTER); - return pane; - } - } - - protected void setRollOverRowIndex(int rowIndex) { - this.rollOverRowIndex = rowIndex; - } - - protected void setDraggingRowIndex(int rowIndex) { - this.draggingIndex = rowIndex; - } - - public void fireTargetChanged() { - repaint(); - Object[] listeners = listenerList.getListenerList(); - - for (int i = listeners.length - 2; i >= 0; i -= 2) { - if (listeners[i] == ChangeListener.class) { - ((ChangeListener)listeners[i + 1]).stateChanged(new ChangeEvent(this)); - } - } - } - - public void addChangeListener(ChangeListener l) { - this.listenerList.add(ChangeListener.class, l); - } - - public void removeChangeListener(ChangeListener l) { - this.listenerList.remove(ChangeListener.class, l); - } - - public static void main(String... args) { - JFrame jf = new JFrame("test"); - jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JPanel content = (JPanel)jf.getContentPane(); - content.setLayout(new BorderLayout()); - List data = new ArrayList(); - UIMenuNameableCreator reportlet = new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Reportlet"), - new ReportletHyperlink(), ReportletHyperlinkPane.class); - - UIMenuNameableCreator email = new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Email"), - new EmailJavaScript(), EmailPane.class); - - UIMenuNameableCreator web = new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Web_Link"), - new WebHyperlink(), WebHyperlinkPane.class ); - data.add(reportlet); - data.add(email); - data.add(web); - UIMenuTable pane = new UIMenuTable(); - pane.populateBean(data); - content.add(pane, BorderLayout.CENTER); - GUICoreUtils.centerWindow(jf); - jf.setSize(400, 400); - jf.setVisible(true); - } + public void doOk() { + baseShowPane.updateBean(showValue); + fireTargetChanged(); + } + }); + + dialog.setSize(500, 600); + GUICoreUtils.centerWindow(dialog); + + dialog.setVisible(true); + } + + protected Color getRenderBackground(int row) { + if (selectedRowIndex == row) { + return UIConstants.SKY_BLUE; + } else { + return (rollOverRowIndex == row) ? UIConstants.LIGHT_BLUE : UIConstants.NORMAL_BACKGROUND; + } + } + + /** + * @param value 该行列的值(字符串) + * @param row + * @param column + * @return 列表中默认显示的东西,如果有很多内容,可以装载一个JPanel里再嵌进来 + */ + protected JComponent getRenderCompoment(Object value, int row, int column) { + UILabel text = new UILabel(); + if (value != null) { + text.setText(value.toString()); + } + return text; + } + + /** + * @param line 该行的内容 + * 在table底部增加一行内容 + */ + public void addLine(UIMenuNameableCreator line) { + ((UIMenuTableDataModel) dataModel).addLine(line); + } + + /** + * @param rowIndex + * @return 某一行的内容 + */ + public UIMenuNameableCreator getLine(int rowIndex) { + return ((UIMenuTableDataModel) dataModel).getLine(rowIndex); + } + + /** + * 删除某行内容 + * + * @param rowIndex + */ + public void removeLine(int rowIndex) { + ((UIMenuTableDataModel) dataModel).removeLine(rowIndex); + } + + /** + * 清除所有的内容 + */ + public void clearAll() { + int rowCount = dataModel.getRowCount(); + for (int i = 0; i < rowCount; i++) { + removeLine(i); + } + } + + /** + * 对某一行拖动时进行排序 + * + * @param rowIndex + * @param positive 鼠标移动的距离 + */ + public void dragSort(int rowIndex, boolean positive) { + ((UIMenuTableDataModel) dataModel).dragSort(rowIndex, positive); + } + + @Override + public boolean isCellEditable(int row, int column) { + if (column == 0) { + return false; + } else { + return super.isCellEditable(row, column); + } + } + + @Override + public TableUI getUI() { + return new UIMenuTableUI(); + } + + private void initComponents() { + setShowGrid(false); + setRowHeight(20); + setDragEnabled(false); + setDefaultRenderer(UITable.class, new UITableRender()); + setUI(getUI()); + } + + @Override + public TableCellRenderer getDefaultRenderer(Class columnClass) { + // 处理null的情况用于创建时未指定数据结构的情况 + if (columnClass == null) { + return createDefaultRenderer(); + } + return super.getDefaultRenderer(columnClass); + } + + private @NotNull TableCellRenderer createDefaultRenderer() { + Object renderer = defaultRenderersByColumnClass.get(UITable.class); + return renderer != null ? (TableCellRenderer) renderer : new UITableRender(); + } + + private class UITableRender implements TableCellRenderer { + @Override + public Component getTableCellRendererComponent(JTable table, + Object value, boolean isSelected, boolean hasFocus, int row, + int column) { + JPanel pane = new JPanel(new BorderLayout(4, 0)); + Color back = getRenderBackground(row); + pane.setBackground(back); + + if (draggingIndex == row) { + return pane; + } + pane.add(getRenderCompoment(value, row, column), BorderLayout.CENTER); + return pane; + } + } + + protected void setRollOverRowIndex(int rowIndex) { + this.rollOverRowIndex = rowIndex; + } + + protected void setDraggingRowIndex(int rowIndex) { + this.draggingIndex = rowIndex; + } + + public void fireTargetChanged() { + repaint(); + Object[] listeners = listenerList.getListenerList(); + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + ((ChangeListener) listeners[i + 1]).stateChanged(new ChangeEvent(this)); + } + } + } + + public void addChangeListener(ChangeListener l) { + this.listenerList.add(ChangeListener.class, l); + } + + public void removeChangeListener(ChangeListener l) { + this.listenerList.remove(ChangeListener.class, l); + } + + public static void main(String... args) { + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(new BorderLayout()); + List data = new ArrayList(); + UIMenuNameableCreator reportlet = new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Reportlet"), + new ReportletHyperlink(), ReportletHyperlinkPane.class); + + UIMenuNameableCreator email = new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Email"), + new EmailJavaScript(), EmailPane.class); + + UIMenuNameableCreator web = new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Web_Link"), + new WebHyperlink(), WebHyperlinkPane.class); + data.add(reportlet); + data.add(email); + data.add(web); + UIMenuTable pane = new UIMenuTable(); + pane.populateBean(data); + content.add(pane, BorderLayout.CENTER); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } } diff --git a/designer-base/src/main/java/com/fr/design/gui/itable/UITable.java b/designer-base/src/main/java/com/fr/design/gui/itable/UITable.java index 2ddb20a7d3..a883742e72 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itable/UITable.java +++ b/designer-base/src/main/java/com/fr/design/gui/itable/UITable.java @@ -6,6 +6,7 @@ import com.fr.design.event.UIObserverListener; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.utils.gui.GUICoreUtils; +import org.jetbrains.annotations.NotNull; import javax.swing.BorderFactory; import javax.swing.JComponent; @@ -35,29 +36,29 @@ public class UITable extends JTable implements UIObserver { private static final int OFF_LEFT = 10; - private static final int DEFAULT_ROW_HEIGHT =20; + private static final int DEFAULT_ROW_HEIGHT = 20; private UIObserverListener uiObserverListener; - UITableEditor editor ; + UITableEditor editor; private boolean shouldResponseAwt; private boolean isEditingStopped; /** - * 在没有任何数据的时候,使用此构造函数,然后通过populate更新数据 - * - * @param columnSize 列表的列数 - */ - public UITable(int columnSize) { - - super(new UITableDataModel(columnSize)); - initComponents(); + * 在没有任何数据的时候,使用此构造函数,然后通过populate更新数据 + * + * @param columnSize 列表的列数 + */ + public UITable(int columnSize) { + + super(new UITableDataModel(columnSize)); + initComponents(); iniListener(); shouldResponseAwt = false; // kunsnat: 屏蔽: 对于下拉框, 无法等待选择结果之后在stop.. // Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); - } + } - public UITable (int columnSize, boolean needAWTEventListener) { + public UITable(int columnSize, boolean needAWTEventListener) { this(columnSize); shouldResponseAwt = needAWTEventListener; isEditingStopped = true; @@ -71,180 +72,182 @@ public class UITable extends JTable implements UIObserver { } } - /** - * values不允许为空! - * - * @param values 一个列表,里面装有字符串数组,每个数组代表一行内容 - */ - public UITable(List values) { - super(new UITableDataModel(values)); - initComponents(); + /** + * values不允许为空! + * + * @param values 一个列表,里面装有字符串数组,每个数组代表一行内容 + */ + public UITable(List values) { + super(new UITableDataModel(values)); + initComponents(); iniListener(); - } - - public UITable() { + } - } + public UITable() { - public void populateBean(List values) { - getTableDataModel().populateBean(values); - } + } + public void populateBean(List values) { + getTableDataModel().populateBean(values); + } private AWTEventListener awt = new AWTEventListener() { - public void eventDispatched(AWTEvent event) { - if(!UITable.this.isShowing()){ - return; + public void eventDispatched(AWTEvent event) { + if (!UITable.this.isShowing()) { + return; + } + doSomeInAll(event); + } + }; + + private void doSomeInAll(AWTEvent event) { + Rectangle bounds = new Rectangle(getLocationOnScreen().x, getLocationOnScreen().y, getWidth(), getHeight()); + if (event instanceof MouseEvent) { + MouseEvent mv = (MouseEvent) event; + if (mv.getClickCount() > 0) { + Point point = new Point((int) (mv.getLocationOnScreen().getX()) - 2 * OFF_LEFT, (int) mv.getLocationOnScreen().getY()); + // 判断鼠标点击是否在边界内 + if (!bounds.contains(point) && shouldResponseAwt) { + if (!isEditingStopped) { + this.editor.stopCellEditing(); + isEditingStopped = true; + } } - doSomeInAll(event); - } - }; - - private void doSomeInAll(AWTEvent event) { - Rectangle bounds = new Rectangle(getLocationOnScreen().x, getLocationOnScreen().y, getWidth(), getHeight()); - if (event instanceof MouseEvent) { - MouseEvent mv = (MouseEvent) event; - if (mv.getClickCount() > 0) { - Point point = new Point((int) (mv.getLocationOnScreen().getX()) - 2 * OFF_LEFT, (int) mv.getLocationOnScreen().getY()); - // 判断鼠标点击是否在边界内 - if (!bounds.contains(point) && shouldResponseAwt) { - if (!isEditingStopped) { - this.editor.stopCellEditing(); - isEditingStopped = true; - } - } - } - } - } - - public List updateBean() { - return getTableDataModel().updateBean(); - } - - /** - * 在table底部增加一空行 - */ - public void addBlankLine() { - getTableDataModel().addBlankLine(); - } - - /** - * 在table底部增加一行内容 - * @param line 该行的内容 - */ - public void addLine(Object[] line) { - getTableDataModel().addLine(line); - } - - /** - * @param rowIndex - * @return 某一行的内容 - */ - public Object[] getLine(int rowIndex) { - return getTableDataModel().getLine(rowIndex); - } - - /** - * 删除某行内容 - * - * @param rowIndex 行号 - */ - public void removeLine(int rowIndex) { - getTableDataModel().removeLine(rowIndex); - } - - /** - * 对某一行拖动时进行排序 - * - * @param rowIndex 行号 - * @param positive 鼠标移动的距离 - */ - public void dragSort(int rowIndex, boolean positive) { - ((UITableDataModel) dataModel).dragSort(rowIndex, positive); - } - - - /** - *格子是否可编辑,可置顶某一列column不可编辑 - * @param row 行号 - * @param column 列号 - * @return 是否可编辑 - */ - public boolean isCellEditable(int row, int column) { - return true; - } - - /** - * 清空数据 - */ - public void clear() { - getTableDataModel().clear(); - } - - private UITableDataModel getTableDataModel() { - return (UITableDataModel) dataModel; - } - - /** - * @param value 该行列的值(字符串) - * @param row - * @param column - * @return 列表中默认显示的东西,如果有很多内容,可以装载一个JPanel里再嵌进来 - */ - protected JComponent getRenderCompoment(Object value, int row, int column) { - UILabel text = new UILabel(); - if (value != null) { - text.setText(value.toString()); - } - return text; - } - - protected void initComponents() { - setShowGrid(false); - setRowHeight(getRowHeight4Table()); - setDragEnabled(false); - editor = createTableEditor(); - editor.addCellEditorListener(new CellEditorListener() { - @Override - public void editingStopped(ChangeEvent e) { - tableCellEditingStopped(e); - } - - @Override - public void editingCanceled(ChangeEvent e) { - tableCellEditingCanceled(e); - } - - }); - - setBackground(UIConstants.NORMAL_BACKGROUND); - setDefaultEditor(UITable.class, editor); - setDefaultRenderer(UITable.class, new UITableRender()); + } + } + } + + public List updateBean() { + return getTableDataModel().updateBean(); + } + + /** + * 在table底部增加一空行 + */ + public void addBlankLine() { + getTableDataModel().addBlankLine(); + } + + /** + * 在table底部增加一行内容 + * + * @param line 该行的内容 + */ + public void addLine(Object[] line) { + getTableDataModel().addLine(line); + } + + /** + * @param rowIndex + * @return 某一行的内容 + */ + public Object[] getLine(int rowIndex) { + return getTableDataModel().getLine(rowIndex); + } + + /** + * 删除某行内容 + * + * @param rowIndex 行号 + */ + public void removeLine(int rowIndex) { + getTableDataModel().removeLine(rowIndex); + } + + /** + * 对某一行拖动时进行排序 + * + * @param rowIndex 行号 + * @param positive 鼠标移动的距离 + */ + public void dragSort(int rowIndex, boolean positive) { + ((UITableDataModel) dataModel).dragSort(rowIndex, positive); + } + + + /** + * 格子是否可编辑,可置顶某一列column不可编辑 + * + * @param row 行号 + * @param column 列号 + * @return 是否可编辑 + */ + public boolean isCellEditable(int row, int column) { + return true; + } + + /** + * 清空数据 + */ + public void clear() { + getTableDataModel().clear(); + } + + private UITableDataModel getTableDataModel() { + return (UITableDataModel) dataModel; + } + + /** + * @param value 该行列的值(字符串) + * @param row + * @param column + * @return 列表中默认显示的东西,如果有很多内容,可以装载一个JPanel里再嵌进来 + */ + protected JComponent getRenderCompoment(Object value, int row, int column) { + UILabel text = new UILabel(); + if (value != null) { + text.setText(value.toString()); + } + return text; + } + + protected void initComponents() { + setShowGrid(false); + setRowHeight(getRowHeight4Table()); + setDragEnabled(false); + editor = createTableEditor(); + editor.addCellEditorListener(new CellEditorListener() { + @Override + public void editingStopped(ChangeEvent e) { + tableCellEditingStopped(e); + } + + @Override + public void editingCanceled(ChangeEvent e) { + tableCellEditingCanceled(e); + } + + }); + + setBackground(UIConstants.NORMAL_BACKGROUND); + setDefaultEditor(UITable.class, editor); + setDefaultRenderer(UITable.class, new UITableRender()); // setUI(getUI()); - - TableColumn deleteTableColumn = new TableColumn(getTableDataModel().getColumnCount()); - deleteTableColumn.setCellEditor(null); - deleteTableColumn.setCellRenderer(null); - deleteTableColumn.setMaxWidth(20); - getColumnModel().addColumn(deleteTableColumn); - } - - /** - * 鼠标悬浮再某一行时触发的事件 - * @param index 行号 - */ - public void dealWithRollOver(int index){ - - } - - private void iniListener(){ - if(shouldResponseChangeListener()){ + + TableColumn deleteTableColumn = new TableColumn(getTableDataModel().getColumnCount()); + deleteTableColumn.setCellEditor(null); + deleteTableColumn.setCellRenderer(null); + deleteTableColumn.setMaxWidth(20); + getColumnModel().addColumn(deleteTableColumn); + } + + /** + * 鼠标悬浮再某一行时触发的事件 + * + * @param index 行号 + */ + public void dealWithRollOver(int index) { + + } + + private void iniListener() { + if (shouldResponseChangeListener()) { this.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { - if(uiObserverListener == null){ - return ; + if (uiObserverListener == null) { + return; } uiObserverListener.doChange(); } @@ -252,138 +255,142 @@ public class UITable extends JTable implements UIObserver { } } - protected int getRowHeight4Table() { - return DEFAULT_ROW_HEIGHT; - } + protected int getRowHeight4Table() { + return DEFAULT_ROW_HEIGHT; + } - /** - *停止编辑事件 - * @param e 事件 - */ - public void tableCellEditingStopped(ChangeEvent e) { + /** + * 停止编辑事件 + * + * @param e 事件 + */ + public void tableCellEditingStopped(ChangeEvent e) { - } + } /** - *取消编辑事件 + * 取消编辑事件 + * * @param e 事件 */ - public void tableCellEditingCanceled(ChangeEvent e) { + public void tableCellEditingCanceled(ChangeEvent e) { - } - - /** - * 编辑器 - * @return 编辑器 - */ - public UITableEditor createTableEditor() { - return new UIDefaultTableCellEditor(new UITextField()); - } + } - @Override /** + * 编辑器 * + * @return 编辑器 */ - public TableUI getUI() { - return new UITableUI(); - } + public UITableEditor createTableEditor() { + return new UIDefaultTableCellEditor(new UITextField()); + } -// @Override + @Override /** * */ -// public TableCellEditor getDefaultEditor(Class columnClass) { -// return super.getDefaultEditor(UITable.class); -// } + public TableUI getUI() { + return new UITableUI(); + } + + @Override + public TableCellRenderer getDefaultRenderer(Class columnClass) { + // 处理null的情况用于创建时未指定数据结构的情况 + if (columnClass == null) { + return createDefaultRenderer(); + } + return super.getDefaultRenderer(columnClass); + } + + private @NotNull TableCellRenderer createDefaultRenderer() { + Object renderer = defaultRenderersByColumnClass.get(UITable.class); + return renderer != null ? (TableCellRenderer) renderer : new UITableRender(); + } -// @Override /** + * 给组件登记一个观察者监听事件 * + * @param listener 观察者监听事件 */ -// public TableCellRenderer getDefaultRenderer(Class columnClass) { -// return super.getDefaultRenderer(UITable.class); -// } - - /** - * 给组件登记一个观察者监听事件 - * - * @param listener 观察者监听事件 - */ public void registerChangeListener(UIObserverListener listener) { uiObserverListener = listener; } - /** - * 组件是否需要响应添加的观察者事件 - * - * @return 如果需要响应观察者事件则返回true,否则返回false - */ + /** + * 组件是否需要响应添加的观察者事件 + * + * @return 如果需要响应观察者事件则返回true,否则返回false + */ public boolean shouldResponseChangeListener() { return true; } protected class UITableRender implements TableCellRenderer { - @Override - public Component getTableCellRendererComponent(JTable table, - Object value, boolean isSelected, boolean hasFocus, int row, - int column) { - JComponent comp = getRenderCompoment(value, row, column); - comp.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); - return comp; - } - } - - protected void fireTargetChanged() { - repaint(); - Object[] listeners = listenerList.getListenerList(); - - for (int i = listeners.length - 2; i >= 0; i -= 2) { - if (listeners[i] == ChangeListener.class) { - ((ChangeListener) listeners[i + 1]).stateChanged(new ChangeEvent(this)); - } - } - } - - /** - * 增加监听 - * @param l 监听 - */ - public void addChangeListener(ChangeListener l) { - this.listenerList.add(ChangeListener.class, l); - } + @Override + public Component getTableCellRendererComponent(JTable table, + Object value, boolean isSelected, boolean hasFocus, int row, + int column) { + JComponent comp = getRenderCompoment(value, row, column); + comp.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); + return comp; + } + } + + protected void fireTargetChanged() { + repaint(); + Object[] listeners = listenerList.getListenerList(); + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + ((ChangeListener) listeners[i + 1]).stateChanged(new ChangeEvent(this)); + } + } + } + + /** + * 增加监听 + * + * @param l 监听 + */ + public void addChangeListener(ChangeListener l) { + this.listenerList.add(ChangeListener.class, l); + } /** - *移除监听 + * 移除监听 + * * @param l 监听 */ - public void removeChangeListener(ChangeListener l) { - this.listenerList.remove(ChangeListener.class, l); - } + public void removeChangeListener(ChangeListener l) { + this.listenerList.remove(ChangeListener.class, l); + } /** - *测试主函数 + * 测试主函数 + * * @param args 参数 */ - public static void main(String... args) { - JFrame jf = new JFrame("test"); - jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JPanel content = (JPanel) jf.getContentPane(); - content.setLayout(new BorderLayout()); - List data = new ArrayList(); - String[] a = {"1", "11"}; - String[] b = {"2", "22"}; - String[] c = {"3", "33"}; - String[] d = {"4", "44"}; - data.add(a); - data.add(b); - data.add(c); - data.add(d); - UITable pane = new UITable(2); - pane.populateBean(data); - content.add(pane, BorderLayout.CENTER); - GUICoreUtils.centerWindow(jf); - jf.setSize(400, 400); - jf.setVisible(true); - } + public static void main(String... args) { + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(new BorderLayout()); + List data = new ArrayList(); + String[] a = {"1", "11"}; + String[] b = {"2", "22"}; + String[] c = {"3", "33"}; + String[] d = {"4", "44"}; + data.add(a); + data.add(b); + data.add(c); + data.add(d); + UITable pane = new UITable(2); + pane.populateBean(data); + content.add(pane, BorderLayout.CENTER); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } } \ No newline at end of file From f80e26f59506cd2d9ce0fcb6df80c25184d4f4d8 Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 29 Feb 2024 17:34:34 +0800 Subject: [PATCH 146/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/gui/imenutable/UIMenuTable.java | 49 ++++------- .../com/fr/design/gui/itable/UITable.java | 85 +++++++------------ 2 files changed, 45 insertions(+), 89 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/imenutable/UIMenuTable.java b/designer-base/src/main/java/com/fr/design/gui/imenutable/UIMenuTable.java index 488b449939..ddee51dc5b 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenutable/UIMenuTable.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenutable/UIMenuTable.java @@ -6,17 +6,10 @@ import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.dialog.UIDialog; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itable.UITable; -import com.fr.design.hyperlink.ReportletHyperlinkPane; -import com.fr.design.hyperlink.WebHyperlinkPane; -import com.fr.design.javascript.EmailPane; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.js.EmailJavaScript; -import com.fr.js.ReportletHyperlink; -import com.fr.js.WebHyperlink; import org.jetbrains.annotations.NotNull; import javax.swing.JComponent; -import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.SwingUtilities; @@ -27,10 +20,10 @@ import javax.swing.table.TableCellRenderer; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; -import java.util.ArrayList; import java.util.List; public class UIMenuTable extends JTable { + private static final int STEP = 2; protected int selectedRowIndex = -1; protected int rollOverRowIndex = -1; protected int draggingIndex = -1; @@ -201,47 +194,35 @@ public class UIMenuTable extends JTable { this.draggingIndex = rowIndex; } + /** + * 触发变更通知 + */ public void fireTargetChanged() { repaint(); Object[] listeners = listenerList.getListenerList(); - for (int i = listeners.length - 2; i >= 0; i -= 2) { + for (int i = listeners.length - STEP; i >= 0; i -= STEP) { if (listeners[i] == ChangeListener.class) { ((ChangeListener) listeners[i + 1]).stateChanged(new ChangeEvent(this)); } } } + /** + * 添加变更监听 + * + * @param l 监听对象 + */ public void addChangeListener(ChangeListener l) { this.listenerList.add(ChangeListener.class, l); } + /** + * 删除变更监听 + * + * @param l 监听对象 + */ public void removeChangeListener(ChangeListener l) { this.listenerList.remove(ChangeListener.class, l); } - - public static void main(String... args) { - JFrame jf = new JFrame("test"); - jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JPanel content = (JPanel) jf.getContentPane(); - content.setLayout(new BorderLayout()); - List data = new ArrayList(); - UIMenuNameableCreator reportlet = new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Reportlet"), - new ReportletHyperlink(), ReportletHyperlinkPane.class); - - UIMenuNameableCreator email = new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Email"), - new EmailJavaScript(), EmailPane.class); - - UIMenuNameableCreator web = new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Web_Link"), - new WebHyperlink(), WebHyperlinkPane.class); - data.add(reportlet); - data.add(email); - data.add(web); - UIMenuTable pane = new UIMenuTable(); - pane.populateBean(data); - content.add(pane, BorderLayout.CENTER); - GUICoreUtils.centerWindow(jf); - jf.setSize(400, 400); - jf.setVisible(true); - } } diff --git a/designer-base/src/main/java/com/fr/design/gui/itable/UITable.java b/designer-base/src/main/java/com/fr/design/gui/itable/UITable.java index a883742e72..f66d483261 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itable/UITable.java +++ b/designer-base/src/main/java/com/fr/design/gui/itable/UITable.java @@ -5,37 +5,33 @@ import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.utils.gui.GUICoreUtils; import org.jetbrains.annotations.NotNull; import javax.swing.BorderFactory; import javax.swing.JComponent; -import javax.swing.JFrame; -import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.plaf.TableUI; +import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import java.awt.AWTEvent; -import java.awt.BorderLayout; import java.awt.Component; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; -import java.awt.event.AWTEventListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.MouseEvent; -import java.util.ArrayList; import java.util.List; public class UITable extends JTable implements UIObserver { private static final int OFF_LEFT = 10; + private static final int STEP = 2; private static final int DEFAULT_ROW_HEIGHT = 20; private UIObserverListener uiObserverListener; UITableEditor editor; @@ -54,8 +50,6 @@ public class UITable extends JTable implements UIObserver { initComponents(); iniListener(); shouldResponseAwt = false; - // kunsnat: 屏蔽: 对于下拉框, 无法等待选择结果之后在stop.. -// Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); } public UITable(int columnSize, boolean needAWTEventListener) { @@ -63,7 +57,12 @@ public class UITable extends JTable implements UIObserver { shouldResponseAwt = needAWTEventListener; isEditingStopped = true; if (needAWTEventListener) { - Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); + Toolkit.getDefaultToolkit().addAWTEventListener(event -> { + if (!UITable.this.isShowing()) { + return; + } + doSomeInAll(event); + }, AWTEvent.MOUSE_EVENT_MASK); this.addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent e) { isEditingStopped = false; @@ -87,20 +86,16 @@ public class UITable extends JTable implements UIObserver { } + /** + * 传入列表数据 + * + * @param values 数据 + */ public void populateBean(List values) { getTableDataModel().populateBean(values); } - private AWTEventListener awt = new AWTEventListener() { - public void eventDispatched(AWTEvent event) { - if (!UITable.this.isShowing()) { - return; - } - doSomeInAll(event); - } - }; - private void doSomeInAll(AWTEvent event) { Rectangle bounds = new Rectangle(getLocationOnScreen().x, getLocationOnScreen().y, getWidth(), getHeight()); if (event instanceof MouseEvent) { @@ -118,6 +113,11 @@ public class UITable extends JTable implements UIObserver { } } + /** + * 获取模型中数据 + * + * @return 数据 + */ public List updateBean() { return getTableDataModel().updateBean(); } @@ -223,7 +223,7 @@ public class UITable extends JTable implements UIObserver { setBackground(UIConstants.NORMAL_BACKGROUND); setDefaultEditor(UITable.class, editor); setDefaultRenderer(UITable.class, new UITableRender()); -// setUI(getUI()); + setUI(getUI()); TableColumn deleteTableColumn = new TableColumn(getTableDataModel().getColumnCount()); deleteTableColumn.setCellEditor(null); @@ -243,14 +243,11 @@ public class UITable extends JTable implements UIObserver { private void iniListener() { if (shouldResponseChangeListener()) { - this.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - if (uiObserverListener == null) { - return; - } - uiObserverListener.doChange(); + this.addChangeListener(e -> { + if (uiObserverListener == null) { + return; } + uiObserverListener.doChange(); }); } } @@ -295,6 +292,11 @@ public class UITable extends JTable implements UIObserver { return new UITableUI(); } + @Override + public TableCellEditor getDefaultEditor(Class columnClass) { + return super.getDefaultEditor(UITable.class); + } + @Override public TableCellRenderer getDefaultRenderer(Class columnClass) { // 处理null的情况用于创建时未指定数据结构的情况 @@ -342,7 +344,7 @@ public class UITable extends JTable implements UIObserver { repaint(); Object[] listeners = listenerList.getListenerList(); - for (int i = listeners.length - 2; i >= 0; i -= 2) { + for (int i = listeners.length - STEP; i >= 0; i -= STEP) { if (listeners[i] == ChangeListener.class) { ((ChangeListener) listeners[i + 1]).stateChanged(new ChangeEvent(this)); } @@ -366,31 +368,4 @@ public class UITable extends JTable implements UIObserver { public void removeChangeListener(ChangeListener l) { this.listenerList.remove(ChangeListener.class, l); } - - /** - * 测试主函数 - * - * @param args 参数 - */ - public static void main(String... args) { - JFrame jf = new JFrame("test"); - jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JPanel content = (JPanel) jf.getContentPane(); - content.setLayout(new BorderLayout()); - List data = new ArrayList(); - String[] a = {"1", "11"}; - String[] b = {"2", "22"}; - String[] c = {"3", "33"}; - String[] d = {"4", "44"}; - data.add(a); - data.add(b); - data.add(c); - data.add(d); - UITable pane = new UITable(2); - pane.populateBean(data); - content.add(pane, BorderLayout.CENTER); - GUICoreUtils.centerWindow(jf); - jf.setSize(400, 400); - jf.setVisible(true); - } -} \ No newline at end of file +} From fed17e839b50bddf8a30d41c76d4806e97ac7a12 Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 29 Feb 2024 18:21:05 +0800 Subject: [PATCH 147/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/gui/imenutable/UIMenuTable.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/gui/imenutable/UIMenuTable.java b/designer-base/src/main/java/com/fr/design/gui/imenutable/UIMenuTable.java index ddee51dc5b..764085a709 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenutable/UIMenuTable.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenutable/UIMenuTable.java @@ -33,14 +33,30 @@ public class UIMenuTable extends JTable { initComponents(); } + /** + * 传入列表数据 + * + * @param values 数据 + */ public void populateBean(List values) { ((UIMenuTableDataModel) dataModel).populateBean(values); } + /** + * 获取模型中数据 + * + * @return 数据 + */ public List updateBean() { return ((UIMenuTableDataModel) dataModel).updateBean(); } + /** + * 编辑事件 + * + * @param rowIndex 行索引 + * @param mouseY mouseY + */ public void editingEvent(int rowIndex, int mouseY) { selectedRowIndex = rowIndex; repaint(); From 08a14918835ebf4660dab90636b2b69739b8c167 Mon Sep 17 00:00:00 2001 From: vito Date: Mon, 18 Mar 2024 20:44:48 +0800 Subject: [PATCH 148/302] =?UTF-8?q?REPORT-116390=E3=80=90NewUI=E3=80=91?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E9=9D=A2=E6=9D=BF=E8=87=AA=E5=8A=A8=E8=81=9A?= =?UTF-8?q?=E7=84=A6=E8=BE=93=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../management/search/pane/FineSearchPane.java | 6 ++++++ .../search/pane/TreeSearchToolbarPane.java | 1 + .../pane/TemplateTreeSearchToolbarPane.java | 1 + .../mainframe/alphafine/AlphaFineHelper.java | 17 +++++++++++++---- .../alphafine/component/AlphaFineDialog.java | 10 ++++++++-- .../alphafine/component/AlphaFineFrame.java | 17 +++++++++-------- 6 files changed, 38 insertions(+), 14 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/FineSearchPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/FineSearchPane.java index ab199f3bc3..8c37a2d2e3 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/FineSearchPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/FineSearchPane.java @@ -147,4 +147,10 @@ public class FineSearchPane extends JPanel implements HoverAware { searchTextField.setEnabled(enabled); clearButton.setEnabled(enabled); } + + @Override + public void requestFocus() { + super.requestFocus(); + searchTextField.requestFocus(); + } } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java index 29e2bca721..6531a558ad 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java @@ -149,6 +149,7 @@ public class TreeSearchToolbarPane extends JPanel implements TreeSearchStatusCha switchPane(TOOLBAR_PANE); } else { switchPane(SEARCH_PANE); + searchPane.requestFocus(); } } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateTreeSearchToolbarPane.java b/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateTreeSearchToolbarPane.java index 8cc747123f..947a6df38d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateTreeSearchToolbarPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateTreeSearchToolbarPane.java @@ -156,6 +156,7 @@ public class TemplateTreeSearchToolbarPane extends JPanel implements TreeSearchS switchPane(TOOLBAR_PANE); } else { switchPane(SEARCH_PANE); + searchPane.requestFocus(); } } 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 126e883d9b..498425c537 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 @@ -34,16 +34,16 @@ 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 AlphaFineFrame 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); @@ -54,6 +54,15 @@ public class AlphaFineHelper { } } + /** + * 隐藏搜索面板 + */ + public static void hideAlphaFineDialog() { + if (alphaFineDialog != null && alphaFineDialog.isVisible()) { + alphaFineDialog.setVisible(false); + } + } + /** * 弹出alphafine搜索面板 */ diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java index dab1051258..4c2f611715 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -161,9 +161,15 @@ public class AlphaFineDialog extends UIDialog { return event -> { if (event instanceof KeyEvent) { KeyEvent e = (KeyEvent) event; + if (KeyEvent.VK_ESCAPE == e.getKeyCode() && AlphaFinePane.getAlphaFinePane().isVisible()) { + AlphaFineHelper.hideAlphaFineDialog(); + return; + } KeyStroke keyStroke = (KeyStroke) KeyStroke.getAWTKeyStrokeForEvent(e); KeyStroke storeKeyStroke = DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().getShortCutKeyStore(); - if (ComparatorUtils.equals(keyStroke.toString(), storeKeyStroke.toString()) && AlphaFineConfigManager.isALPHALicAvailable() && AlphaFinePane.getAlphaFinePane().isVisible()) { + if (ComparatorUtils.equals(keyStroke.toString(), storeKeyStroke.toString()) + && AlphaFineConfigManager.isALPHALicAvailable() + && AlphaFinePane.getAlphaFinePane().isVisible()) { doClickAction(); } @@ -637,7 +643,7 @@ public class AlphaFineDialog extends UIDialog { bytes = WorkContext.getCurrent().get(TemplateExportOperator.class).exportWorkBookAsImageData(fileName); } catch (Exception ignored) { // 兼容下老版本 - bytes = new LocalExportOperator().exportWorkBookAsImageData(fileName); + bytes = new LocalExportOperator().exportWorkBookAsImageData(fileName); } return TemplateExportOperator.byteDataToImage(bytes); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineFrame.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineFrame.java index e74108fee9..23625aa6ea 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineFrame.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineFrame.java @@ -411,7 +411,7 @@ public class AlphaFineFrame extends JFrame { /** * showPane,内容展示区,分为三个小区,tab区,label区,内容区 - * */ + */ private JPanel createShowPane() { JPanel showPane = new JPanel(new BorderLayout()); @@ -439,7 +439,7 @@ public class AlphaFineFrame extends JFrame { // 一键已读 readLabel = new UILabel(ONE_CLICK_READ); readLabel.setHorizontalAlignment(SwingConstants.RIGHT); - readLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 10));; + readLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 10)); readLabel.setPreferredSize(new Dimension(100, 30)); readLabel.setForeground(UIConstants.FLESH_BLUE); readLabel.addMouseListener(new MouseAdapter() { @@ -624,7 +624,7 @@ public class AlphaFineFrame extends JFrame { /** * 根据用户自定义的顺序排序 - * */ + */ private void sortList(List list) { AlphaFineConfigManager alphaFineConfigManager = DesignerEnvManager.getEnvManager().getAlphaFineConfigManager(); String[] tabOrder = alphaFineConfigManager.getTabOrder(); @@ -751,7 +751,7 @@ public class AlphaFineFrame extends JFrame { return; } fireSearch(); - } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { + } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { if (alphaFineToolTipList.getSelectedIndex() == alphaFineToolTipList.getModel().getSize() - 1) { alphaFineToolTipList.setSelectedIndex(0); } @@ -786,7 +786,7 @@ public class AlphaFineFrame extends JFrame { /** * 控制搜索tip框弹出收起 * 不断地刷新tab页,并防止tab页显示错误 - * */ + */ private void startSearchTextFieldTimer() { Timer timer = new Timer(TIMER_DELAY, e -> { // 坑 isShowing返回false 即使textField有内容 getText返回的也是空 @@ -901,14 +901,13 @@ public class AlphaFineFrame extends JFrame { return new SearchTextBean(getStoreText(searchText), new String[]{getStoreText(searchText)}); } else if (searchText.startsWith(DS_MARK)) { return new SearchTextBean(getStoreText(searchText), new String[]{DS_NAME + getStoreText(searchText)}); - } else { + } else { return new SearchTextBean(searchText, segmentationResult == null ? new String[]{} : segmentationResult); } } /** * 仅搜索依赖网络的搜索项 - * */ private void reSearch() { String text = preProcessSearchText(this.searchTextField.getText().toLowerCase()); @@ -925,7 +924,7 @@ public class AlphaFineFrame extends JFrame { /** * 所有tab页搜索通用的加载panel - * */ + */ private void initSearchLoadingPane() { if (searchLoadingPane == null) { searchLoadingPane = new SearchLoadingPane(); @@ -1008,6 +1007,8 @@ public class AlphaFineFrame extends JFrame { QuestionWindow.getInstance().setVisible(!b); if (!b) { AlphaFineHelper.resetAlphaFineDialog(); + } else { + searchTextField.requestFocus(); } } From 74b1c75fc8176210a7ab30c779a720ac15cce5fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Thu, 28 Mar 2024 17:37:00 +0800 Subject: [PATCH 149/302] =?UTF-8?q?REPORT-116247=20=E3=80=90NewUI=E3=80=91?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=A0=BC=E5=B1=9E=E6=80=A7-=E6=96=87?= =?UTF-8?q?=E5=AD=97=E6=A0=B7=E5=BC=8F=E9=9D=A2=E6=9D=BF=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/gui/style/TextFormatPane.java | 74 ++++++++----------- 1 file changed, 30 insertions(+), 44 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java b/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java index 790208bb6f..c2fc1fdddc 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java @@ -1,8 +1,5 @@ package com.fr.design.gui.style; -import com.fine.swing.ui.layout.Column; -import com.fine.swing.ui.layout.Layouts; -import com.fine.swing.ui.layout.Row; import com.fine.theme.utils.FineUIUtils; import com.fr.base.CoreDecimalFormat; import com.fr.base.GraphHelper; @@ -16,7 +13,6 @@ import com.fr.design.constants.UIConstants; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; import com.fr.design.event.UIObserverListener; -import com.fr.design.gui.core.ReactiveCardPane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icombobox.TextFontComboBox; import com.fr.design.gui.icombobox.UIComboBox; @@ -43,9 +39,11 @@ import java.math.RoundingMode; import java.text.Format; import java.text.SimpleDateFormat; -import static com.fine.swing.ui.layout.Layouts.Cell; import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; /** * @author Starryi @@ -79,7 +77,6 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName private boolean isRightFormat; private boolean isDate = false; private GlobalNameListener globalNameListener = null; - protected ReactiveCardPane cardPane; public TextFormatPane() { @@ -89,6 +86,10 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName initPreviewLabel4GeneralFormat(); initLayout(); + + setTextFieldVisible(false); + setRoundingBoxVisible(false); + setPreviewLabelVisible(false); } private void initFormatTypesComboBox() { @@ -136,43 +137,33 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName protected void initLayout() { this.setLayout(new BorderLayout()); - cardPane = ReactiveCardPane.create() - .addSupplier("normal", () -> Layouts.column(LayoutConstants.VERTICAL_GAP, - createTypeRow() - ).getComponent()) - .addSupplier("preview", () -> Layouts.column(LayoutConstants.VERTICAL_GAP, - createTypeRow(), - createPreviewRow() - ).getComponent()) - .addSupplier("previewAndCheck", () -> Layouts.column(LayoutConstants.VERTICAL_GAP, - createTypeRow(), - createPreviewRow(), - createRoundBoxRow() - ).getComponent()); - cardPane.select("normal").populate(); - this.add(cardPane); + this.add(column(LayoutConstants.VERTICAL_GAP, + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Report_Base_Format"))).weight(LEFT_WEIGHT), + cell(typeComboBox).weight(RIGHT_WEIGHT) + ), + cell(textField), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Report_Base_Option"))).weight(LEFT_WEIGHT), + cell(roundingBox).weight(RIGHT_WEIGHT) + ), + cell(previewLabel) + ).getComponent()); } - private Cell createTypeRow() { - return row( - cell(new UILabel(Toolkit.i18nText("Fine-Design_Report_Base_Format"))).weight(1.2), - cell(typeComboBox).weight(3) - ); + protected void setTextFieldVisible(boolean visible) { + textField.setVisible(visible); } - private Cell createRoundBoxRow() { - return row( - cell(new UILabel(Toolkit.i18nText("Fine-Design_Report_Base_Option"))).weight(1.2), - cell(roundingBox).with(it -> it.setBorder(null)).weight(3) - ); + protected void setRoundingBoxVisible(boolean visible) { + roundingBox.getParent().setVisible(visible); } - private Cell createPreviewRow() { - return row( - cell(previewLabel).weight(1) - ); + protected void setPreviewLabelVisible(boolean visible) { + previewLabel.setVisible(visible); } + protected UIComboBoxRenderer createComBoxRender() { return new UIComboBoxRenderer() { @Override @@ -314,11 +305,6 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName return contents == FormatContents.TEXT || contents == FormatContents.NULL; } - private boolean isRoundFormat() { - int contents = getFormatContents(); - return contents == FormatContents.PERCENT || contents == FormatContents.THOUSANDTHS; - } - /** * Radio selection listener. */ @@ -328,16 +314,16 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { int contents = getFormatContents(); - Column contentContainer; + if (!isTextOrNull()) { textField.removeAllItems(); String[] items = FormatField.getInstance().getFormatArray(contents, false); textField.setItemArray(items); textField.setSelectedIndex(0); - cardPane.select(isRoundFormat() ? "previewAndCheck" : "preview").populate(); - } else { - cardPane.select("normal").populate(); } + setTextFieldVisible(!isTextOrNull()); + setPreviewLabelVisible(!isTextOrNull()); + setRoundingBoxVisible(getFormatContents() == FormatContents.PERCENT || getFormatContents() == FormatContents.THOUSANDTHS); } } From 8eb2df765fe532ed642d3ce2a0495baf0a886abf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Thu, 11 Apr 2024 17:20:27 +0800 Subject: [PATCH 150/302] =?UTF-8?q?REPORT-111995=20=E3=80=90NewUI=E3=80=91?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=88=97=E9=9D=A2=E6=9D=BF=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 2 + .../com/fine/theme/utils/FineUIUtils.java | 19 ++ .../design/condition/LiteConditionPane.java | 196 +++++++++--------- .../com/fr/design/formula/FormulaPane.java | 6 +- .../com/fine/theme/icon/toolbar/bracket.svg | 4 + .../theme/icon/toolbar/bracket_disable.svg | 4 + .../com/fine/theme/icon/toolbar/unBracket.svg | 11 + .../theme/icon/toolbar/unBracket_disable.svg | 11 + .../design/dscolumn/DSColumnAdvancedPane.java | 176 ++++++---------- .../fr/design/dscolumn/DSColumnBasicPane.java | 47 ++--- .../dscolumn/DSColumnConditionsPane.java | 46 ++-- .../dscolumn/ResultSetGroupPopUpPane.java | 41 ++-- .../dscolumn/SelectedDataColumnPane.java | 41 ++-- .../fr/design/expand/ConditionParentPane.java | 46 ++-- .../fr/design/expand/ExpandDirectionPane.java | 26 +-- 15 files changed, 323 insertions(+), 353 deletions(-) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/bracket.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/bracket_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/unBracket.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/unBracket_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 7fa3a7d058..3bb48ea05b 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -187,6 +187,8 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("tool_more_hover", "com/fine/theme/icon/toolbar/more_hover.svg"), new SvgIconSource("tool_config", "com/fine/theme/icon/toolbar/config.svg", true), new SvgIconSource("add_popup", "com/fine/theme/icon/toolbar/add_popup.svg", true), + new SvgIconSource("bracket", "com/fine/theme/icon/toolbar/bracket.svg", true), + new SvgIconSource("unBracket", "com/fine/theme/icon/toolbar/unBracket.svg", true), // 参数面板 new SvgIconSource("param_edit", "com/fine/theme/icon/param/edit.svg", true, 24), diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java index 058416fa15..b541811f8f 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java @@ -3,7 +3,9 @@ package com.fine.theme.utils; import com.fine.theme.light.ui.CollapsibleScrollBarLayerUI; import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.design.border.FineBorderFactory; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilable.UILabel; import com.fr.stable.os.OperatingSystem; import com.fr.value.AtomicClearableLazyValue; @@ -23,6 +25,8 @@ import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; import java.lang.reflect.Field; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; import static com.fine.theme.light.ui.FineButtonUI.isLeftRoundButton; import static com.formdev.flatlaf.util.UIScale.scale; @@ -380,6 +384,21 @@ public class FineUIUtils { FineUIStyle.setStyle(label, FineUIStyle.LABEL_BOLD); } + /** + * 面板元素头部添加小标题 + * + * @param component 面板元素 + * @param title 标题文本 + * @return 包装面板 + */ + public static Component wrapComponentWithTitle(Component component, String title) { + UILabel label = new UILabel(title); + wrapBoldLabelWithUnderline(label); + return column(LayoutConstants.VERTICAL_GAP, + cell(label), cell(component) + ).getComponent(); + } + /** * 基于组件创建一个UIScrollPane的装饰层,内部的ScrollPane仅当悬浮时显示滚动条 * diff --git a/designer-base/src/main/java/com/fr/design/condition/LiteConditionPane.java b/designer-base/src/main/java/com/fr/design/condition/LiteConditionPane.java index 82c8ec340f..a6dc6aa107 100644 --- a/designer-base/src/main/java/com/fr/design/condition/LiteConditionPane.java +++ b/designer-base/src/main/java/com/fr/design/condition/LiteConditionPane.java @@ -1,7 +1,12 @@ package com.fr.design.condition; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.BaseFormula; -import com.fr.base.BaseUtils; import com.fr.data.DataConstants; import com.fr.data.condition.CommonCondition; import com.fr.data.condition.FormulaCondition; @@ -9,6 +14,8 @@ import com.fr.data.condition.JoinCondition; import com.fr.data.condition.ListCondition; import com.fr.data.condition.ObjectCondition; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.border.FineBorderFactory; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.formula.FormulaFactory; @@ -20,7 +27,6 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.scrollruler.ModLineBorder; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; @@ -46,6 +52,11 @@ import java.util.ArrayList; import java.util.Enumeration; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + /** * peter: LiteCondition Pane. */ @@ -60,6 +71,7 @@ public abstract class LiteConditionPane extends BasicBeanPa private JPanel conditionCardPane; protected BasicBeanPane defaultConditionPane; // card2 + private UILabel conditionTitleLabel; private UITextArea formulaTextArea; private UIButton modifyButton; private UIButton addButton; @@ -71,10 +83,6 @@ public abstract class LiteConditionPane extends BasicBeanPa private UIButton moveDownButton; private UIButton bracketButton; private UIButton unBracketButton; - private static final int DOWN_PADDING = 4; - private static final int STRUT_ONE = 35; - private static final int STRUT_TWO = 4; - private static final int ADD_CONTROL_PANE_PADDING_RIGHT = -5; private ActionListener actionListener1 = new ActionListener() { @@ -407,74 +415,82 @@ public abstract class LiteConditionPane extends BasicBeanPa protected abstract VariableResolver variableResolver4FormulaPane(); protected void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); // north initNorth(); //center - JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + JPanel centerPane = new JPanel(new BorderLayout(0, FineUIScale.scale(10))); this.add(centerPane, BorderLayout.CENTER); - centerPane.setLayout(FRGUIPaneFactory.createBorderLayout()); - - // Control - JPanel controlPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - centerPane.add(controlPane, BorderLayout.NORTH); - // controlPane.setLayout(FRGUIPaneFactory.createBorderLayout()); // conditionCardPane - initConditionCardPane(controlPane); + initConditionCardPane(); + centerPane.add(conditionCardPane, BorderLayout.NORTH); - // addControlPane, contains or,and Radio, add,modify Button - initControlPane(controlPane); + // northButtonPane, contains or,and Radio, add,modify Button + JPanel northButtonPane = initNorthButtonPane(); // Preview - JPanel previewPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - centerPane.add(previewPane, BorderLayout.CENTER); - previewPane.setBorder(BorderFactory.createEmptyBorder(0, 2, 2, 0)); - - - // conTreeScrollPane.setPreferredSize(new Dimension(400, 125)); - previewPane.add(iniTreeScrollPane(), BorderLayout.CENTER); + JPanel buttonPane = initButtonPane(); + JScrollPane treeScrollPane = iniTreeScrollPane(); + // 滚动面板不能直接加入row-col布局,需设定宽高 + treeScrollPane.setPreferredSize(FineUIScale.scale(new Dimension(600, 250))); + JPanel previewPane = column( + cell(northButtonPane), + row( + cell(treeScrollPane).weight(0.75), cell(buttonPane).weight(0.25) + ) + ).with(it -> { + it.setBorder(new FineRoundBorder()); + it.setOpaque(true); + it.setBackground(FlatUIUtils.getUIColor("fill.normal", Color.WHITE)); + }).getComponent(); conditionsTree.addTreeSelectionListener(treeSelectionListener); - JPanel buttonPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(1); - previewPane.add(GUICoreUtils.createBorderPane(buttonPane, BorderLayout.NORTH), BorderLayout.EAST); - initButtonPane(buttonPane); + centerPane.add(previewPane, BorderLayout.CENTER); // peter:必须要检查Enabled. checkButtonEnabledForList(); } - private void initButtonPane(JPanel buttonPane) { + private JPanel initButtonPane() { removeButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove")); - buttonPane.add(removeButton); - removeButton.setIcon(BaseUtils.readIcon("com/fr/base/images/cell/control/remove.png")); + removeButton.setIcon(new LazyIcon("remove")); + removeButton.setDisabledIcon(new LazyIcon("remove").disabled()); removeButton.setEnabled(false); removeButton.addActionListener(actionListener3); moveUpButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Up")); - buttonPane.add(moveUpButton); - moveUpButton.setIcon(BaseUtils.readIcon("com/fr/design/images/control/up.png")); + moveUpButton.setIcon(new LazyIcon("move_up")); + moveUpButton.setDisabledIcon(new LazyIcon("move_up").disabled()); moveUpButton.addActionListener(actionListener4); moveDownButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Down")); - buttonPane.add(moveDownButton); - moveDownButton.setIcon(BaseUtils.readIcon("com/fr/design/images/control/down.png")); + moveDownButton.setIcon(new LazyIcon("move_down")); + moveDownButton.setDisabledIcon(new LazyIcon("move_down").disabled()); moveDownButton.addActionListener(actionListener5); // peter:加括号 bracketButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_ConditionB_Add_bracket")); - buttonPane.add(bracketButton); - bracketButton.setIcon(BaseUtils.readIcon("com/fr/design/images/condition/bracket.png")); + bracketButton.setIcon(new LazyIcon("bracket")); + bracketButton.setDisabledIcon(new LazyIcon("bracket").disabled()); bracketButton.addActionListener(actionListener6); // peter:去掉括号 unBracketButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_ConditionB_Remove_bracket")); - buttonPane.add(unBracketButton); - unBracketButton.setIcon(BaseUtils.readIcon("com/fr/design/images/condition/unBracket.png")); + unBracketButton.setIcon(new LazyIcon("unBracket")); + unBracketButton.setDisabledIcon(new LazyIcon("unBracket").disabled()); unBracketButton.addActionListener(actionListener7); + + return column(LayoutConstants.VERTICAL_GAP, + cell(removeButton), + cell(moveUpButton), + cell(moveDownButton), + cell(bracketButton), + cell(unBracketButton) + ).with(it -> it.setBorder(new ScaledEmptyBorder(5, 5, 0, 5))).getComponent(); } private JScrollPane iniTreeScrollPane() { @@ -484,26 +500,28 @@ public abstract class LiteConditionPane extends BasicBeanPa conditionsTree.setSelectionModel(new ContinuousTreeSelectionModel()); conditionsTree.addTreeExpansionListener(treeExpansionListener); conditionsTree.setShowsRootHandles(true); - return new JScrollPane(conditionsTree); + conditionsTree.setBackground(FlatUIUtils.getUIColor("fill.normal", Color.WHITE)); + JScrollPane scrollPane = new JScrollPane(conditionsTree); + scrollPane.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, + FineUIUtils.getUIColor("Label.borderColor", "defaultBorderColor"))); + return scrollPane; } private void initNorth() { - conditonTypePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - this.add(conditonTypePane, BorderLayout.NORTH); - conditonTypePane.setBorder(new ModLineBorder(ModLineBorder.BOTTOM)); - + conditionTitleLabel = new UILabel(); + FineUIUtils.wrapBoldLabelWithUnderline(conditionTitleLabel); UILabel conditionTypeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Type") + ":"); - conditonTypePane.add(conditionTypeLabel, BorderLayout.WEST); - conditionTypeLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, DOWN_PADDING, 0)); - - JPanel northPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); - conditonTypePane.add(northPane, BorderLayout.CENTER); - northPane.setBorder(BorderFactory.createEmptyBorder(0, 0, DOWN_PADDING, 0)); - northPane.add(GUICoreUtils.createFlowPane(commonRadioButton, FlowLayout.CENTER)); - northPane.add(GUICoreUtils.createFlowPane(formulaRadioButton, FlowLayout.CENTER)); commonRadioButton.addActionListener(radioActionListener); formulaRadioButton.addActionListener(radioActionListener); + conditonTypePane = row(10, + cell(conditionTypeLabel).weight(0.15), cell(commonRadioButton), cell(formulaRadioButton), flex() + ).getComponent(); + JPanel conditionWrapperPane = column(10, + cell(conditionTitleLabel), + cell(conditonTypePane) + ).getComponent(); + this.add(conditionWrapperPane, BorderLayout.NORTH); ButtonGroup mainBg = new ButtonGroup(); mainBg.add(commonRadioButton); @@ -511,74 +529,58 @@ public abstract class LiteConditionPane extends BasicBeanPa commonRadioButton.setSelected(true); } - private void initConditionCardPane(JPanel controlPane) { + private void initConditionCardPane() { conditionCardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); - controlPane.add(conditionCardPane, BorderLayout.CENTER); conditionCardPane.setLayout(new CardLayout()); - conditionCardPane.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0)); - // defaultConditionPane conditionCardPane.add(defaultConditionPane = createUnFormulaConditionPane(), "DEFAULT"); - // formulaConditionPane JPanel formulaConditionPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); conditionCardPane.add(formulaConditionPane, "FORMULA"); - // formulaConditionPane.setLayout(FRGUIPaneFactory.createBorderLayout()); - - // formulaPane - JPanel formulaPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - // 95106 公式区域限定宽高, 显示两行即可, 在新窗口编辑. - formulaPane.setPreferredSize(new Dimension(450, 40)); - formulaConditionPane.add(formulaPane, BorderLayout.CENTER); - formulaPane.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 2)); - formulaPane.add(GUICoreUtils.createBorderPane(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Lite_Condition_Formula") + "="), BorderLayout.NORTH), BorderLayout.WEST); formulaTextArea = new UITextArea(); - formulaPane.add(new JScrollPane(formulaTextArea), BorderLayout.CENTER); UIButton editFormulaButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Lite_Condition_Define")); - formulaPane.add(GUICoreUtils.createBorderPane(editFormulaButton, BorderLayout.NORTH), BorderLayout.EAST); + formulaConditionPane.add(row(10, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Lite_Condition_Formula") + " =")), + cell(formulaTextArea).weight(2), + cell(editFormulaButton)) + .getComponent()); editFormulaButton.addActionListener(actionListener1); + applyCardsPane(); } - private void initControlPane(JPanel controlPane) { - JPanel addControlPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - addControlPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, ADD_CONTROL_PANE_PADDING_RIGHT)); - JPanel splitPane = new JPanel(); - splitPane.setBorder(new ModLineBorder(ModLineBorder.TOP)); - - JPanel addControlPaneWrapper = new JPanel(new BorderLayout()); - addControlPaneWrapper.add(addControlPane, BorderLayout.CENTER); - addControlPaneWrapper.add(splitPane, BorderLayout.NORTH); - controlPane.add(addControlPaneWrapper, BorderLayout.SOUTH); - + private JPanel initNorthButtonPane() { ButtonGroup bg = new ButtonGroup(); bg.add(andRadioButton); bg.add(orRadioButton); - andRadioButton.setSelected(true); - JPanel radioPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); - addControlPane.add(radioPane); - radioPane.add(andRadioButton); - radioPane.add(orRadioButton); - - addControlPane.add(Box.createHorizontalStrut(STRUT_ONE)); - - addButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add"), BaseUtils.readIcon("com/fr/base/images/cell/control/add.png")); + addButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add"), new LazyIcon("add")); + addButton.setDisabledIcon(new LazyIcon("add").disabled()); addButton.setMnemonic('A'); - addControlPane.add(addButton); addButton.addActionListener(actionListener2); - - addControlPane.add(Box.createHorizontalStrut(STRUT_TWO)); - - modifyButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Modify"), BaseUtils.readIcon("com/fr/base/images/cell/control/rename.png")); + modifyButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Modify"), new LazyIcon("edit")); + modifyButton.setDisabledIcon(new LazyIcon("edit").disabled()); modifyButton.setMnemonic('M'); - addControlPane.add(modifyButton); modifyButton.addActionListener(actionListener8); - - // peter:当鼠标进入修改按钮的时候,如果是ListConditon内容编辑区域不可编辑 + // peter:当鼠标进入修改按钮的时候,如果是ListCondition内容编辑区域不可编辑 modifyButton.addMouseListener(mouseAdapter); + + return row( + row(5, + cell(andRadioButton).weight(0.5), + cell(orRadioButton).weight(0.5) + ).weight(0.25), + flex(0.5), + row(5, + cell(addButton).weight(0.5), + cell(modifyButton).weight(0.5) + ).with(it -> it.setBorder(new ScaledEmptyBorder(0, 8, 0, 0))).weight(0.25) + ).with(it -> it.setBorder(BorderFactory.createCompoundBorder( + FineBorderFactory.createDefaultUnderlineBorder(), + new ScaledEmptyBorder(5, 5, 5, 5)) + )).getComponent(); } @@ -662,10 +664,10 @@ public abstract class LiteConditionPane extends BasicBeanPa private void applyCardsPane() { CardLayout cl = (CardLayout) (conditionCardPane.getLayout()); if (this.commonRadioButton.isSelected()) { - this.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Lite_Condition_Common_Condition"), null)); + conditionTitleLabel.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Lite_Condition_Common_Condition")); cl.show(conditionCardPane, "DEFAULT"); } else { - this.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Lite_Condition_Formula_Condition"), null)); + conditionTitleLabel.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Lite_Condition_Formula_Condition")); cl.show(conditionCardPane, "FORMULA"); } } diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java index 9caae7461a..6cfb221ca1 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java @@ -749,9 +749,9 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { public BasicDialog showLargeWindow(Window window, DialogActionListener l) { int width = 900; - int height = 900; - BasicDialog basicDialog = super.showWindowWithCustomSize(window, l, new Dimension(width, height)); - basicDialog.setMinimumSize(new Dimension(width, height)); + int height = 640; + BasicDialog basicDialog = super.showWindowWithCustomSize(window, l, FineUIScale.scale(new Dimension(width, height))); + basicDialog.setMinimumSize(FineUIScale.scale(new Dimension(width, height))); basicDialog.setResizable(true); return basicDialog; } diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bracket.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bracket.svg new file mode 100644 index 0000000000..fd415fcb5f --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bracket.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bracket_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bracket_disable.svg new file mode 100644 index 0000000000..ac60d55fe8 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bracket_disable.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/unBracket.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/unBracket.svg new file mode 100644 index 0000000000..6bb05f7c89 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/unBracket.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/unBracket_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/unBracket_disable.svg new file mode 100644 index 0000000000..f9b651d80c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/unBracket_disable.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnAdvancedPane.java b/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnAdvancedPane.java index e1b8a676ad..5fe59ee85f 100644 --- a/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnAdvancedPane.java +++ b/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnAdvancedPane.java @@ -1,7 +1,7 @@ package com.fr.design.dscolumn; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.BaseFormula; -import com.fr.design.border.UITitledBorder; import com.fr.design.data.DesignTableDataManager; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; @@ -16,37 +16,31 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.sort.celldscolumn.CellDSColumnSortPane; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.report.cell.CellElement; import com.fr.report.cell.TemplateCellElement; import com.fr.report.cell.cellattr.CellExpandAttr; import com.fr.report.cell.cellattr.core.group.DSColumn; import com.fr.report.cell.cellattr.core.group.SelectCount; -import javax.swing.BorderFactory; -import javax.swing.Box; -import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.SwingUtilities; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Component; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.BOTTOM; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.SPECIFY; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.TOP; public class DSColumnAdvancedPane extends BasicPane { - private static final String InsetText = " "; private SortPane sortPane; private SelectCountPane selectCountPane; private ValuePane valuePane; @@ -66,78 +60,55 @@ public class DSColumnAdvancedPane extends BasicPane { } private void initScrollPane() { - ScrollPane scrollPane = new ScrollPane(contentPane); + this.setLayout(new BorderLayout()); + UIScrollPane scrollPane = new UIScrollPane(contentPane); this.add(scrollPane); } private void initContentPane(int setting) { contentPane = new JPanel(); - contentPane.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); contentPane.setLayout(FRGUIPaneFactory.createBorderLayout()); sortPane = new SortPane(); - sortPane.setBorder(UITitledBorder.createBorderWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sort_Sort_Order"))); - if (setting > DSColumnPane.SETTING_DSRELATED) { selectCountPane = new SelectCountPane(); - selectCountPane.setBorder(UITitledBorder.createBorderWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Results_Filter"))); } - valuePane = new ValuePane(); - valuePane.setBorder(UITitledBorder.createBorderWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Custom_Data_Appearance"))); - JPanel extendablePane = null; + Component extendablePane = null; if (setting > DSColumnPane.SETTING_DSRELATED) { - // extendableDirectionPane - JPanel extendableDirectionPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - - extendableDirectionPane.add(horizontalExtendableCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ExpandD_Horizontal_Extendable"))); - extendableDirectionPane.add(verticalExtendableCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ExpandD_Vertical_Extendable"))); - - extendablePane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ExpandD_Expandable")); - extendablePane.setLayout(new BorderLayout()); - extendablePane.add(extendableDirectionPane, BorderLayout.CENTER); + horizontalExtendableCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ExpandD_Horizontal_Extendable")); + verticalExtendableCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ExpandD_Vertical_Extendable")); + extendablePane = row(10, + cell(horizontalExtendableCheckBox), cell(verticalExtendableCheckBox) + ).getComponent(); } - JPanel multiNumPane = null; + Component multiNumPane = null; if (setting > DSColumnPane.SETTING_DSRELATED) { - multiNumPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Fill_Blank_Data")); useMultiplyNumCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Column_Multiple")); - multiNumPane.add(useMultiplyNumCheckBox); - multiNumPane.add(new UILabel(InsetText)); - multiNumSpinner = new UISpinner(1, 10000, 1, 1); - multiNumPane.add(multiNumSpinner); - - useMultiplyNumCheckBox.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - checkButtonEnabled(); - } - }); + multiNumPane = row(10, + cell(useMultiplyNumCheckBox), cell(multiNumSpinner) + ).getComponent(); + useMultiplyNumCheckBox.addActionListener(e -> checkButtonEnabled()); } - - Component[][] components = null; + // 基于row-column布局的特性,null面板不渲染 if (setting > DSColumnPane.SETTING_DSRELATED) { - components = new Component[][]{ - {sortPane}, - {selectCountPane}, - {valuePane}, - {extendablePane}, - {multiNumPane} - }; + contentPane.add(column(20, + cell(wrapComponentWithTitle(sortPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sort_Sort_Order"))), + cell(wrapComponentWithTitle(selectCountPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Results_Filter"))), + cell(wrapComponentWithTitle(valuePane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Custom_Data_Appearance"))), + cell(wrapComponentWithTitle(extendablePane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ExpandD_Expandable"))), + cell(wrapComponentWithTitle(multiNumPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Fill_Blank_Data"))) + ).getComponent()); } else { - components = new Component[][]{ - {sortPane}, - {valuePane}, - }; + contentPane.add(column(20, + cell(wrapComponentWithTitle(sortPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sort_Sort_Order"))), + cell(wrapComponentWithTitle(valuePane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Custom_Data_Appearance"))) + ).getComponent()); } - - double[] rowSize = {TableLayout.PREFERRED, TableLayout.PREFERRED, - TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.PREFERRED}; - double[] columnSize = {TableLayout.FILL}; - - contentPane.add(TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize), BorderLayout.CENTER); + contentPane.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); } @Override @@ -234,21 +205,8 @@ public class DSColumnAdvancedPane extends BasicPane { } } - private static class ScrollPane extends UIScrollPane { - ScrollPane(Component component) { - super(component); - this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - } - - @Override - public Dimension getPreferredSize() { - return new Dimension(DSColumnPane.DEFAULT_DIMENSION.width - 20, DSColumnPane.DEFAULT_DIMENSION.height - 100); - } - } - private static class SortPane extends CellDSColumnSortPane { SortPane() { - this.setLayout(new FlowLayout(FlowLayout.LEFT)); } protected boolean needSortHeaderPane() { @@ -259,7 +217,6 @@ public class DSColumnAdvancedPane extends BasicPane { private static class SelectCountPane extends JPanel { CellElement cellElement; - // private Comparator sortComparator; private UIComboBox selectCountComboBox; private JPanel selectCountCardPane; private UITextField serialTextField; @@ -299,25 +256,24 @@ public class DSColumnAdvancedPane extends BasicPane { }); selectCountCardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); - this.add(GUICoreUtils.createFlowPane(new JComponent[]{new UILabel(InsetText), selectCountComboBox, - new UILabel(InsetText), selectCountCardPane}, FlowLayout.LEFT), BorderLayout.WEST); -// selectCountCardPane.setLayout(new CardLayout()); - + this.add(row(10, + cell(selectCountComboBox),cell(selectCountCardPane) + ).getComponent()); //not define pane + JPanel undefinedPane = row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Undefined")))).getComponent(); - JPanel undefinedPane = GUICoreUtils.createFlowPane(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Undefined")), FlowLayout.LEFT); topFormulaPane = new JFormulaField("-1"); bottomFormulaPane = new JFormulaField("-1"); serialTextField = new UITextField(18); - JPanel oddPane = GUICoreUtils.createFlowPane(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Result_Serial_Number_Start_From_1") - + " " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Odd_Selected_(1,3,5...)")), FlowLayout.LEFT); - JPanel evenPane = GUICoreUtils.createFlowPane(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Result_Serial_Number_Start_From_1") - + " " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Even_Selected_(2,4,6...)")), FlowLayout.LEFT); - JPanel specifyPane = GUICoreUtils.createFlowPane(new JComponent[]{ - serialTextField, new UILabel( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_DSColumn_Result_Group_Format", "1,2-3,5,8", "$__count__") - ) - }, FlowLayout.LEFT); + + JPanel oddPane = row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Result_Serial_Number_Start_From_1") + + " " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Odd_Selected_(1,3,5...)")))).getComponent(); + JPanel evenPane = row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Result_Serial_Number_Start_From_1") + + " " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Even_Selected_(2,4,6...)")))).getComponent(); + JPanel specifyPane = row(10, + cell(serialTextField), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_DSColumn_Result_Group_Format", "1,2-3,5,8", "$__count__"))) + ).getComponent(); serialTextField.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Format") + ":=JOINARRAY(GREPARRAY(RANGE($__count__), item!=4), \",\")"); selectCountCardPane.add(undefinedPane, "UNDEFINE"); selectCountCardPane.add(topFormulaPane, "TOP"); @@ -337,7 +293,7 @@ public class DSColumnAdvancedPane extends BasicPane { this.cellElement = cellElement; Object value = cellElement.getValue(); - if (value == null || !(value instanceof DSColumn)) { + if (!(value instanceof DSColumn)) { return; } DSColumn dSColumn = (DSColumn) (cellElement.getValue()); @@ -362,7 +318,7 @@ public class DSColumnAdvancedPane extends BasicPane { return; } Object value = cellElement.getValue(); - if (value == null || !(value instanceof DSColumn)) { + if (!(value instanceof DSColumn)) { return; } DSColumn dSColumn = (DSColumn) (cellElement.getValue()); @@ -394,19 +350,18 @@ public class DSColumnAdvancedPane extends BasicPane { public JFormulaField(String defaultValue) { this.defaultValue = defaultValue; - this.setLayout(FRGUIPaneFactory.createBoxFlowLayout()); + this.setLayout(new BorderLayout()); UILabel bottomLabel = new UILabel("="); - bottomLabel.setFont(new Font("Dialog", Font.BOLD, 12)); - this.add(bottomLabel); formulaTextField = new UITextField(24); - this.add(formulaTextField); formulaTextField.setText(defaultValue); - UIButton bottomFrmulaButton = new UIButton("..."); - this.add(bottomFrmulaButton); - bottomFrmulaButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula") + "..."); - bottomFrmulaButton.setPreferredSize(new Dimension(25, formulaTextField.getPreferredSize().height)); - bottomFrmulaButton.addActionListener(formulaButtonActionListener); + UIButton bottomFormulaButton = new UIButton("..."); + bottomFormulaButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula") + "..."); + bottomFormulaButton.addActionListener(formulaButtonActionListener); + + this.add(row(10, + cell(bottomLabel), cell(formulaTextField), cell(bottomFormulaButton) + ).getComponent()); } public void populate(String formulaContent) { @@ -438,7 +393,7 @@ public class DSColumnAdvancedPane extends BasicPane { return; } Object value = cellElement.getValue(); - if (value == null || !(value instanceof DSColumn)) { + if (!(value instanceof DSColumn)) { return; } DSColumn dsColumn = (DSColumn) value; @@ -465,11 +420,12 @@ public class DSColumnAdvancedPane extends BasicPane { private JFormulaField formulaField; public ValuePane() { - this.setLayout(FRGUIPaneFactory.createBoxFlowLayout()); - - this.add(new UILabel(InsetText + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Value") + ":")); - this.add(Box.createHorizontalStrut(2)); - this.add((formulaField = new JFormulaField("$$$"))); + this.setLayout(new BorderLayout()); + formulaField = new JFormulaField("$$$"); + this.add(row(10, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Value") + ":")), + cell(formulaField) + ).getComponent()); } public void populate(CellElement cellElement) { @@ -478,7 +434,7 @@ public class DSColumnAdvancedPane extends BasicPane { } Object value = cellElement.getValue(); - if (value == null || !(value instanceof DSColumn)) { + if (!(value instanceof DSColumn)) { return; } DSColumn dSColumn = (DSColumn) value; @@ -497,7 +453,7 @@ public class DSColumnAdvancedPane extends BasicPane { return; } Object value = cellElement.getValue(); - if (value == null || !(value instanceof DSColumn)) { + if (!(value instanceof DSColumn)) { return; } DSColumn dSColumn = (DSColumn) (cellElement.getValue()); @@ -508,10 +464,6 @@ public class DSColumnAdvancedPane extends BasicPane { } private void checkButtonEnabled() { - if (useMultiplyNumCheckBox.isSelected()) { - multiNumSpinner.setEnabled(true); - } else { - multiNumSpinner.setEnabled(false); - } + multiNumSpinner.setEnabled(useMultiplyNumCheckBox.isSelected()); } } diff --git a/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnBasicPane.java b/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnBasicPane.java index b2e15604d0..a1b28bea88 100644 --- a/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnBasicPane.java +++ b/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnBasicPane.java @@ -1,25 +1,23 @@ package com.fr.design.dscolumn; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.data.TableDataSource; import com.fr.design.dialog.BasicPane; import com.fr.design.expand.ConditionParentPane; import com.fr.design.expand.ExpandDirectionPane; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.ElementCasePane; -import com.fr.design.utils.gui.GUICoreUtils; - import com.fr.report.cell.CellElement; import com.fr.report.cell.TemplateCellElement; import com.fr.report.cell.cellattr.CellExpandAttr; -import javax.swing.BorderFactory; -import java.awt.BorderLayout; -import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + public class DSColumnBasicPane extends BasicPane { private SelectedDataColumnPane selectDataColumnPane; @@ -57,7 +55,7 @@ public class DSColumnBasicPane extends BasicPane { public DSColumnBasicPane(int setting) { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); + this.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); if (setting > DSColumnPane.SETTING_DSRELATED) { selectDataColumnPane = new SelectedDataColumnPane(); @@ -65,43 +63,30 @@ public class DSColumnBasicPane extends BasicPane { selectDataColumnPane = new SelectedConfirmedDataColumnPane(); } - selectDataColumnPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Select_Data_Column"), null)); - if (setting > DSColumnPane.SETTING_DSRELATED) { conditionParentPane = new ConditionParentPane(); - conditionParentPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ParentCell_Setting"), null)); } resultSetGroupPane = new ResultSetGroupPopUpPane(setting > DSColumnPane.SETTING_DSRELATED); - resultSetGroupPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_Setting"), null)); if (setting > DSColumnPane.SETTING_DSRELATED) { expandDirectionPane = new ExpandDirectionPane(); - expandDirectionPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ExpandD_Expand_Direction"), null)); } - double[] rowSize = {TableLayout.PREFERRED, TableLayout.PREFERRED, - TableLayout.PREFERRED, TableLayout.PREFERRED}; - double[] columnSize = {TableLayout.FILL}; - - Component[][] components = null; - if (setting > DSColumnPane.SETTING_DSRELATED) { - components = new Component[][]{ - {selectDataColumnPane}, - {conditionParentPane}, - {resultSetGroupPane}, - {expandDirectionPane} - }; + this.add(column(20, + cell(wrapComponentWithTitle(selectDataColumnPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Select_Data_Column"))), + cell(wrapComponentWithTitle(conditionParentPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ParentCell_Setting"))), + cell(wrapComponentWithTitle(resultSetGroupPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_Setting"))), + cell(wrapComponentWithTitle(expandDirectionPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ExpandD_Expand_Direction"))) + ).getComponent()); } else { - components = new Component[][]{ - {selectDataColumnPane}, - {resultSetGroupPane}, - }; + this.add(column(20, + cell(wrapComponentWithTitle(selectDataColumnPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Select_Data_Column"))), + cell(wrapComponentWithTitle(resultSetGroupPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_Setting"))) + ).getComponent()); } - this.add(TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize), BorderLayout.CENTER); - this.resultSetGroupPane.addListeners(summaryDirectionActionlistener, othergroupDirectionActionlistener, sdcupdateActionlistener); } diff --git a/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnConditionsPane.java b/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnConditionsPane.java index 4d6a1e62ac..81be2bc66d 100644 --- a/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnConditionsPane.java +++ b/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnConditionsPane.java @@ -1,21 +1,22 @@ package com.fr.design.dscolumn; +import com.fine.swing.ui.layout.Column; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.data.TableDataSource; import com.fr.design.condition.DSColumnLiteConditionPane; import com.fr.design.condition.DSColumnSimpleLiteConditionPane; import com.fr.design.data.DesignTableDataManager; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.data.Condition; import com.fr.report.cell.CellElement; import com.fr.report.cell.cellattr.core.group.DSColumn; -import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.FlowLayout; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; public class DSColumnConditionsPane extends BasicPane { //peter: Lite Condition. @@ -24,15 +25,24 @@ public class DSColumnConditionsPane extends BasicPane { //marks:是否继承父格条件 private UICheckBox reselectExpandCheckBox; //marks:作为布局的空字符串 - private static final String INSET_TEXT = " "; public DSColumnConditionsPane() { this(DSColumnPane.SETTING_ALL); } public DSColumnConditionsPane(int setting) { - this.setLayout(FRGUIPaneFactory.createM_BorderLayout()); + this.setLayout(new BorderLayout()); + Column column = new Column(); + column.setSpacing(10); + if (setting > DSColumnPane.SETTING_DSRELATED) { + //alex:ReSelect + reselectExpandCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Extend_The_Conditions_of_Father_Cell(Applied_To_The_Data_Contains_Other_Data)"), false); + reselectExpandCheckBox.setSelected(true); + column.add(FineUIUtils.wrapComponentWithTitle( + row(cell(reselectExpandCheckBox)).getComponent(), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_The_Conditions_Of_Father_Cell"))); + } if (setting > DSColumnPane.SETTING_DSRELATED) { liteConditionPane = new DSColumnLiteConditionPane() { protected boolean isNeedDoWithCondition(Condition liteCondition) { @@ -42,22 +52,10 @@ public class DSColumnConditionsPane extends BasicPane { } else { liteConditionPane = new DSColumnSimpleLiteConditionPane(); } - this.add(liteConditionPane, BorderLayout.CENTER); + column.add(liteConditionPane); + column.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); + this.add(column); - if (setting > DSColumnPane.SETTING_DSRELATED) { - //alex:ReSelect - JPanel pane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); -// pane.setLayout(new BoxLayout(pane, BoxLayout.X_AXIS)); - pane.add(new UILabel(INSET_TEXT)); - - reselectExpandCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Extend_The_Conditions_of_Father_Cell(Applied_To_The_Data_Contains_Other_Data)"), false); - pane.add(reselectExpandCheckBox); - reselectExpandCheckBox.setSelected(true); - - JPanel reSelectPane = GUICoreUtils.createFlowPane(pane, FlowLayout.LEFT); - this.add(reSelectPane, BorderLayout.NORTH); - reSelectPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_The_Conditions_Of_Father_Cell"), null)); - } } @Override @@ -70,7 +68,7 @@ public class DSColumnConditionsPane extends BasicPane { return; } Object value = cellElement.getValue(); - if (value == null || !(value instanceof DSColumn)) { + if (!(value instanceof DSColumn)) { return; } DSColumn linearDSColumn = (DSColumn) value; @@ -90,7 +88,7 @@ public class DSColumnConditionsPane extends BasicPane { return; } Object value = cellElement.getValue(); - if (value == null || !(value instanceof DSColumn)) { + if (!(value instanceof DSColumn)) { return; } DSColumn linearDSColumn = (DSColumn) value; diff --git a/designer-realize/src/main/java/com/fr/design/dscolumn/ResultSetGroupPopUpPane.java b/designer-realize/src/main/java/com/fr/design/dscolumn/ResultSetGroupPopUpPane.java index a37dcf01e2..7058da827e 100644 --- a/designer-realize/src/main/java/com/fr/design/dscolumn/ResultSetGroupPopUpPane.java +++ b/designer-realize/src/main/java/com/fr/design/dscolumn/ResultSetGroupPopUpPane.java @@ -1,37 +1,38 @@ package com.fr.design.dscolumn; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIRadioButton; -import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.icombobox.FunctionComboBox; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.report.cell.TemplateCellElement; -import com.fr.report.cell.cellattr.core.group.*; -import com.fr.stable.StringUtils; import com.fr.design.utils.gui.GUICoreUtils; - -import javax.swing.*; -import java.awt.*; +import com.fr.report.cell.cellattr.core.group.CustomGrouper; +import com.fr.report.cell.cellattr.core.group.DSColumn; +import com.fr.report.cell.cellattr.core.group.FunctionGrouper; +import com.fr.report.cell.cellattr.core.group.RecordGrouper; +import com.fr.report.cell.cellattr.core.group.SummaryGrouper; + +import javax.swing.ButtonGroup; +import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; public class ResultSetGroupPopUpPane extends ResultSetGroupPane { - private UIRadioButton groupRadioButton; private UIButton advancedButton; private UIRadioButton listRadioButton; private UIRadioButton summaryRadioButton; private FunctionComboBox functionComboBox; - - private String InsertText = StringUtils.BLANK; - public ResultSetGroupPopUpPane() { this(true); } @@ -43,7 +44,7 @@ public class ResultSetGroupPopUpPane extends ResultSetGroupPane { } public void initComponents(boolean isGroup) { - this.setLayout(FRGUIPaneFactory.create1ColumnGridLayout()); + this.setLayout(new BorderLayout()); // 分组 groupRadioButton = new UIRadioButton(Toolkit.i18nText("Fine-Design_Report_Bind_Column_Group(Merger_The_Items_Which_Have_The_Same_Value_in_Column)")); @@ -56,22 +57,25 @@ public class ResultSetGroupPopUpPane extends ResultSetGroupPane { }); advancedButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Custom")); advancedButton.addActionListener(groupAdvancedListener); - this.add(GUICoreUtils.createFlowPane( - new JComponent[]{new UILabel(InsertText), groupRadioButton, groupComboBox, advancedButton}, FlowLayout.LEFT)); // 列表 listRadioButton = new UIRadioButton(Toolkit.i18nText("Fine-Design_Report_Bind_Column_Select(Regardless_of_Having_the_Same_Value,Display_All_Item_in_Column)")); listRadioButton.addActionListener(checkEnabledActionListener); - this.add(GUICoreUtils.createFlowPane( - new JComponent[]{new UILabel(InsertText), listRadioButton}, FlowLayout.LEFT)); // 汇总 summaryRadioButton = new UIRadioButton(Toolkit.i18nText("Fine-Design_Report_Bind_Column_Summary(Including_SUM_,_AVERAGE_,_MAX_,_MIN_And_So_On)"), true); summaryRadioButton.addActionListener(checkEnabledActionListener); functionComboBox = new FunctionComboBox(GUICoreUtils.getFunctionArray()); - this.add(GUICoreUtils.createFlowPane( - new JComponent[]{new UILabel(InsertText), summaryRadioButton, functionComboBox}, FlowLayout.LEFT)); + this.add(column(LayoutConstants.VERTICAL_GAP, + row(10, + cell(groupRadioButton), cell(groupComboBox), cell(advancedButton) + ), + cell(listRadioButton), + row(10, + cell(summaryRadioButton), cell(functionComboBox) + ) + ).getComponent()); ButtonGroup resultSetGroupButtonGroup = new ButtonGroup(); resultSetGroupButtonGroup.add(groupRadioButton); @@ -142,7 +146,6 @@ public class ResultSetGroupPopUpPane extends ResultSetGroupPane { SummaryGrouper summaryGrouper = new SummaryGrouper(); summaryGrouper.setFunction(functionComboBox.getFunction()); recordGrouper = summaryGrouper; - } else { } dSColumn.setGrouper(recordGrouper); diff --git a/designer-realize/src/main/java/com/fr/design/dscolumn/SelectedDataColumnPane.java b/designer-realize/src/main/java/com/fr/design/dscolumn/SelectedDataColumnPane.java index 969946908d..eb86266368 100644 --- a/designer-realize/src/main/java/com/fr/design/dscolumn/SelectedDataColumnPane.java +++ b/designer-realize/src/main/java/com/fr/design/dscolumn/SelectedDataColumnPane.java @@ -1,6 +1,5 @@ package com.fr.design.dscolumn; -import com.fine.swing.ui.layout.Layouts; import com.fr.base.Parameter; import com.fr.data.SimpleDSColumn; import com.fr.data.TableDataSource; @@ -16,8 +15,6 @@ import com.fr.design.gui.icombobox.LazyComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itableeditorpane.ParameterTableModel; import com.fr.design.gui.itableeditorpane.UITableEditorPane; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.widget.FRWidgetFactory; @@ -29,9 +26,7 @@ import com.fr.stable.ParameterProvider; import com.fr.stable.StringUtils; import javax.swing.DefaultComboBoxModel; -import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -43,6 +38,7 @@ import java.util.Objects; import java.util.regex.Pattern; import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; import static com.fine.swing.ui.layout.Layouts.row; /** @@ -157,28 +153,21 @@ public class SelectedDataColumnPane extends BasicPane { }; columnNameComboBox.setEditable(true); - double p = TableLayout.PREFERRED; UILabel dsLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_TableData") + ":"); UILabel dcLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Data_Column") + ":"); - if (showParameterButton) { - dsLabel.setPreferredSize(new Dimension(200, 25)); - dcLabel.setPreferredSize(new Dimension(200, 25)); - } - if (showParameterButton) { - Component[][] comps = {{dsLabel, null, dcLabel}, {tableNameComboBox, paramButton, columnNameComboBox}}; - this.add(TableLayoutHelper.createTableLayoutPane(comps, new double[]{p, p}, new double[]{p, p, p})); - } else { - double f = TableLayout.FILL; - double[] columnSize = {p, f}; - double[] rowSize = {p, p}; - Component[][] components = new Component[][]{ - new Component[]{dsLabel, tableNameComboBox}, - new Component[]{dcLabel, columnNameComboBox} - }; - JPanel jPanel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); - this.setLayout(new BorderLayout()); - this.add(jPanel, BorderLayout.CENTER); - } + paramButton.setVisible(showParameterButton); + this.setLayout(new BorderLayout()); + this.add(row(10, + row( + cell(dsLabel).weight(0.1), + cell(tableNameComboBox).weight(0.3) + ).weight(0.3), + cell(paramButton).weight(0.2), + row( + cell(dcLabel).weight(0.1), + cell(columnNameComboBox).weight(0.3) + ).weight(0.3) + ).getComponent()); } @@ -200,7 +189,7 @@ public class SelectedDataColumnPane extends BasicPane { UILabel dpLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Dynamic_Parameter")); UILabel dcLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Data_Column")); this.setLayout(new BorderLayout()); - this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, + this.add(column(LayoutConstants.VERTICAL_GAP, row( cell(dsLabel).weight(1.2), cell(tableNameComboBox).weight(3) ), diff --git a/designer-realize/src/main/java/com/fr/design/expand/ConditionParentPane.java b/designer-realize/src/main/java/com/fr/design/expand/ConditionParentPane.java index 579a8efbcf..eeb04df332 100644 --- a/designer-realize/src/main/java/com/fr/design/expand/ConditionParentPane.java +++ b/designer-realize/src/main/java/com/fr/design/expand/ConditionParentPane.java @@ -1,19 +1,18 @@ package com.fr.design.expand; -import java.awt.FlowLayout; -import java.awt.event.ActionListener; - -import javax.swing.JComponent; import com.fr.design.gui.ilable.UILabel; -import javax.swing.JPanel; - -import com.fr.design.layout.FRGUIPaneFactory; - import com.fr.design.mainframe.ElementCasePane; import com.fr.report.cell.TemplateCellElement; import com.fr.report.cell.cellattr.CellExpandAttr; -import com.fr.design.utils.gui.GUICoreUtils; + +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.event.ActionListener; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; public class ConditionParentPane extends JPanel { private ParentPane leftParentPane; @@ -29,21 +28,20 @@ public class ConditionParentPane extends JPanel { public void initComponents(ActionListener listener) { - JPanel innerthis=FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - this.add(innerthis); - - - JPanel eastPane =FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); - innerthis.add(eastPane); - - eastPane.add(GUICoreUtils.createFlowPane(new JComponent[] { - new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Left_Parent") + ": "), - leftParentPane = new ParentPane(ParentPane.LEFT, listener) }, FlowLayout.LEFT)); - - eastPane.add(GUICoreUtils.createFlowPane( - new JComponent[] { - new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Up_Parent") + ": "), - upParentPane = new ParentPane(ParentPane.UP, listener) }, FlowLayout.LEFT)); + this.setLayout(new BorderLayout()); + leftParentPane = new ParentPane(ParentPane.LEFT, listener); + upParentPane = new ParentPane(ParentPane.UP, listener); + this.add(row(10, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Left_Parent") + ": ")).weight(0.1), + cell(leftParentPane).weight(0.3) + ).weight(0.3), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Up_Parent") + ": ")).weight(0.1), + cell(upParentPane).weight(0.3) + ).weight(0.3), + flex(0.2) + ).getComponent()); } public void putElementcase(ElementCasePane t){ leftParentPane.putElementcase(t); diff --git a/designer-realize/src/main/java/com/fr/design/expand/ExpandDirectionPane.java b/designer-realize/src/main/java/com/fr/design/expand/ExpandDirectionPane.java index 03a0c1d039..439447832c 100644 --- a/designer-realize/src/main/java/com/fr/design/expand/ExpandDirectionPane.java +++ b/designer-realize/src/main/java/com/fr/design/expand/ExpandDirectionPane.java @@ -1,18 +1,16 @@ package com.fr.design.expand; import com.fr.design.gui.ibutton.UIRadioButton; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.report.cell.cellattr.CellExpandAttr; import com.fr.stable.Constants; -import com.fr.stable.StringUtils; import javax.swing.ButtonGroup; import javax.swing.JPanel; -import java.awt.Component; -import java.awt.FlowLayout; -import java.awt.GridLayout; +import java.awt.BorderLayout; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + /** * * @editor zhou @@ -23,7 +21,6 @@ public class ExpandDirectionPane extends JPanel { private UIRadioButton t2bRadioButton; private UIRadioButton l2rRadioButton; private UIRadioButton noneRadioButton; - private String InsertText = StringUtils.BLANK; public ExpandDirectionPane() { super(); @@ -31,9 +28,7 @@ public class ExpandDirectionPane extends JPanel { } public void initComponents() { - this.setLayout(new GridLayout(1, 3)); - JPanel innerthis=FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); - this.add(innerthis); + this.setLayout(new BorderLayout()); t2bRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Top_To_Bottom")); l2rRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("FIne-Design_Report_Utils_Left_To_Right")); noneRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ExpandD_Not_Expand")); @@ -41,12 +36,9 @@ public class ExpandDirectionPane extends JPanel { bg.add(t2bRadioButton); bg.add(l2rRadioButton); bg.add(noneRadioButton); - innerthis.add(GUICoreUtils.createFlowPane(new Component[]{new UILabel(InsertText), t2bRadioButton}, - FlowLayout.LEFT)); - innerthis.add(GUICoreUtils.createFlowPane(new Component[]{new UILabel(InsertText), l2rRadioButton}, - FlowLayout.LEFT)); - innerthis.add(GUICoreUtils.createFlowPane(new Component[]{new UILabel(InsertText), noneRadioButton}, - FlowLayout.LEFT)); + this.add(row(10, + cell(t2bRadioButton), cell(l2rRadioButton), cell(noneRadioButton) + ).getComponent()); } public void populate(CellExpandAttr cellExpandAttr) { From d32d2c0d57e423ed4307ddfed1a5f657fddeb86d Mon Sep 17 00:00:00 2001 From: vito Date: Mon, 6 May 2024 10:24:24 +0800 Subject: [PATCH 151/302] =?UTF-8?q?REPORT-114888=20fix:=20=E6=A8=A1?= =?UTF-8?q?=E6=9D=BFtab=E6=A0=8F=E5=8F=B3=E9=94=AE=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/file/MultiTemplateTabPane.java | 22 ++++--------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 10c0101877..ef9fb8fcc6 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -14,7 +14,6 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.gui.imenu.UIScrollPopUpMenu; -import com.fr.design.i18n.DesignSizeI18nManager; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; @@ -31,12 +30,10 @@ import com.fr.third.javax.annotation.Nonnull; import com.fr.workspace.WorkContext; import com.fr.workspace.server.lock.TplOperator; -import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JOptionPane; import javax.swing.JSeparator; -import javax.swing.MenuElement; import javax.swing.SwingUtilities; import javax.swing.ToolTipManager; import java.awt.AWTEvent; @@ -166,26 +163,15 @@ public class MultiTemplateTabPane extends Row { int tplIndex = getTemplateIndex(e.getX()); if (tplIndex > -1) { UIPopupMenu menu = new UIPopupMenu(); - menu.setBorder(BorderFactory.createEmptyBorder(-3, 3, 3, 0)); - for (CloseOption option : CloseOption.values()) { menu.add(new UIMenuItem(new RightMenuCloseAction(option, tplIndex))); } menu.add(new CloseMenuItemJSeparator()); menu.add(new UIMenuItem(new OpenInTemplateTreeAction(tplIndex))); - - int height = 0; - for (MenuElement subElement : menu.getSubElements()) { - if (subElement instanceof CloseMenuItemJSeparator) { - height += 10; - } else { - height += 25; - } - } - //根据当前i18n语言环境,动态调整popupMenu的宽度 - menu.setPreferredSize(new Dimension((int) DesignSizeI18nManager.getInstance(). - i18nDimension("com.fr.design.file.MultiTemplateTabPane.popUpMenu").getWidth(), height)); - GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.getInstance(), e.getX(), MultiTemplateTabPane.getInstance().getY() - 1 + MultiTemplateTabPane.getInstance().getHeight()); + GUICoreUtils.showPopupMenu(menu, + MultiTemplateTabPane.getInstance(), + e.getX(), + MultiTemplateTabPane.getInstance().getY() + MultiTemplateTabPane.getInstance().getHeight()); } } } From 7d717e353c6b73c05c24a0fc6a7d6069de4253b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Tue, 7 May 2024 15:59:49 +0800 Subject: [PATCH 152/302] =?UTF-8?q?REPORT-111995=20=E3=80=90NewUI=E3=80=91?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B5=8B=E8=AF=95=E9=AA=8C=E6=94=B6=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/light/ui/FineLightIconSet.java | 1 + .../refreshabletree/RefreshableJTree.java | 14 +++++----- .../fr/design/gui/style/TextFormatPane.java | 20 +++----------- .../DesignerFrameFileDealerPane.java | 2 -- .../design/mainframe/vcs/RecycleAction.java | 3 ++- .../resources/com/fine/theme/icon/recycle.svg | 8 ++++++ .../fr/design/expand/ExpandFatherPane.java | 26 ++++++------------- .../fr/design/widget/CellWidgetCardPane.java | 14 ++++------ .../com/fr/design/widget/WidgetEventPane.java | 7 +++++ 9 files changed, 41 insertions(+), 54 deletions(-) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/recycle.svg diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 3bb48ea05b..e716e04466 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -39,6 +39,7 @@ public class FineLightIconSet extends AbstractIconSet { new SvgIconSource("down_arrow_12", "com/fine/theme/icon/down_arrow.svg", true, 12), new SvgIconSource("up_arrow_12", "com/fine/theme/icon/up_arrow.svg", true, 12), new SvgIconSource("select", "com/fine/theme/icon/select.svg", true), + new SvgIconSource("recycle", "com/fine/theme/icon/recycle.svg", true), // 数据集相关Icon new SvgIconSource("database", "com/fine/theme/icon/dataset/database.svg", true), diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java b/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java index 6a8433225a..b649cf3c19 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java @@ -104,23 +104,21 @@ public abstract class RefreshableJTree extends CheckBoxTree { @Override protected Long doInBackground() throws Exception { long startTime = System.currentTimeMillis(); - - return System.currentTimeMillis() - startTime; - } - - @Override - protected void done() { ExpandMutableTreeNode[] nodes = RefreshableJTree.this.loadChildTreeNodes(treeNode); for (int i = 0; i < nodes.length; i++) { treeNode.add(nodes[i]); } - + DefaultTreeModel treeModel = (DefaultTreeModel) RefreshableJTree.this.getModel(); // 主要耗时是用在了treeUI的渲染上了,所以把这个放到工作线程里面 if (treeNode.getChildCount() >= 1 && ((ExpandMutableTreeNode) treeNode.getFirstChild()).getUserObject() == PENDING) { treeNode.remove(0); } - DefaultTreeModel treeModel = (DefaultTreeModel) RefreshableJTree.this.getModel(); treeModel.nodeStructureChanged(treeNode); + return System.currentTimeMillis() - startTime; + } + + @Override + protected void done() { RefreshableJTree.this.updateUI(); // 恢复Tree的可用性 RefreshableJTree.this.setEnabled(true); diff --git a/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java b/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java index c2fc1fdddc..d8263af1a6 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java @@ -1,5 +1,6 @@ package com.fr.design.gui.style; +import com.fine.theme.utils.FineUIStyle; import com.fine.theme.utils.FineUIUtils; import com.fr.base.CoreDecimalFormat; import com.fr.base.GraphHelper; @@ -116,23 +117,10 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName Border interBorder = new UIRoundedBorder(UIConstants.LINE_COLOR, 0, 4); String title = Toolkit.i18nText("Fine-Design_Report_Base_StyleFormat_Sample"); Border border = BorderFactory.createTitledBorder(interBorder, title, TitledBorder.ABOVE_TOP, 0, null, labelColor); - previewLabel = new UILabel(FormatField.getInstance().getFormatValue()) { - @Override - public void paint(Graphics g) { - super.paint(g); - int width = getWidth(); - Color original = g.getColor(); - g.setColor(getBackground()); - g.fillRect(LABEL_X, LABEL_Y, width - LABEL_DELTA_WIDTH, LABEL_HEIGHT); - g.setColor(labelColor); - FontMetrics cellFM = g.getFontMetrics(); - int textWidth = cellFM.stringWidth(getText()); - GraphHelper.drawString(g, getText(), (width - textWidth) / 2F, 26); - g.setColor(original); - } - }; + previewLabel = new UILabel(FormatField.getInstance().getFormatValue()); previewLabel.setHorizontalAlignment(UILabel.CENTER); previewLabel.setBorder(border); + FineUIStyle.setStyle(previewLabel, FineUIStyle.LABEL_TIP); } protected void initLayout() { @@ -286,7 +274,7 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName */ private void refreshPreviewLabel() { this.previewLabel.setText(FormatField.getInstance().getFormatValue()); - this.previewLabel.setForeground(UIManager.getColor("Label.foreground")); + FineUIStyle.setStyle(previewLabel, FineUIStyle.LABEL_TIP); try { isRightFormat = true; if (StringUtils.isEmpty(String.valueOf(textField.getSelectedItem()))) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index 387dfece15..49fd533045 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -324,7 +324,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt */ private void addVcsAction(ToolBarDef toolbarDef) { if (VcsHelper.getInstance().needInit()) { - vcsAction = new VcsAction(); if (!isLegacyOnCluster()) { vcsAction.setName(Toolkit.i18nText("Fine-Design_Vcs_Title")); @@ -334,7 +333,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt toolbarDef.addShortCut(vcsAction); //11.0.19及其之后加入回收站逻辑 if (VcsHelper.getInstance().checkV2FunctionSupport()) { - recycleAction = new RecycleAction(); toolbarDef.addShortCut(recycleAction); } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/RecycleAction.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/RecycleAction.java index acd89f668d..b6da535892 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/RecycleAction.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/RecycleAction.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.vcs; +import com.fine.theme.icon.LazyIcon; import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.BasicDialog; import com.fr.design.i18n.Toolkit; @@ -18,7 +19,7 @@ import java.awt.event.ActionEvent; public class RecycleAction extends UpdateAction { public RecycleAction() { - this.setSmallIcon("/com/fr/design/standard/vcslist/vcs_recycle", false); + this.setSmallIcon(new LazyIcon("recycle")); this.setName(Toolkit.i18nText("Fine-Design_Vcs_Recycle")); } diff --git a/designer-base/src/main/resources/com/fine/theme/icon/recycle.svg b/designer-base/src/main/resources/com/fine/theme/icon/recycle.svg new file mode 100644 index 0000000000..ab3b97e703 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/recycle.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/designer-realize/src/main/java/com/fr/design/expand/ExpandFatherPane.java b/designer-realize/src/main/java/com/fr/design/expand/ExpandFatherPane.java index 5a32b0e61d..ac226425b0 100644 --- a/designer-realize/src/main/java/com/fr/design/expand/ExpandFatherPane.java +++ b/designer-realize/src/main/java/com/fr/design/expand/ExpandFatherPane.java @@ -1,12 +1,10 @@ package com.fr.design.expand; -import com.fine.swing.ui.layout.Layouts; import com.fine.theme.icon.LazyIcon; import com.fr.design.constants.LayoutConstants; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; import com.fr.design.gui.columnrow.ColumnRowPane; -import com.fr.design.gui.core.ReactiveCardPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.mainframe.ElementCasePane; @@ -18,12 +16,13 @@ import com.fr.grid.selection.Selection; import com.fr.report.cell.cellattr.CellExpandAttr; import com.fr.stable.ColumnRow; -import javax.swing.*; -import java.awt.*; +import javax.swing.JPanel; +import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; public abstract class ExpandFatherPane extends JPanel implements GlobalNameObserver { @@ -35,7 +34,6 @@ public abstract class ExpandFatherPane extends JPanel implements GlobalNameObser private String expandFatherName = ""; private GlobalNameListener globalNameListener = null; private boolean isAlreadyAddListener = false; - private ReactiveCardPane cardPane; public ExpandFatherPane() { this.setLayout(new BorderLayout()); @@ -55,20 +53,12 @@ public abstract class ExpandFatherPane extends JPanel implements GlobalNameObser JPanel cc = new JPanel(new BorderLayout(LayoutConstants.HGAP_SMALL, 0)); cc.add(customParentColumnRowPane, BorderLayout.CENTER); cc.add(imageButton, BorderLayout.EAST); - cardPane = ReactiveCardPane.create() - .addSupplier("content", () -> Layouts.column(LayoutConstants.VERTICAL_GAP, - cell(comboBox), - cell(cc)).getComponent()) - .addSupplier("none", () -> Layouts.cell(comboBox).getComponent()); - cardPane.select("none").populate(); - this.add(cardPane); + this.add(column(LayoutConstants.VERTICAL_GAP, + cell(comboBox), + cell(cc) + ).getComponent()); comboBox.addItemListener(e -> { - if (comboBox.getSelectedIndex() == 2) { - cardPane.select("content").populate(); - } else { - cardPane.select("none").populate(); - - } + cc.setVisible(comboBox.getSelectedIndex() == 2); if (globalNameListener != null && shouldResponseNameListener()) { globalNameListener.setGlobalName(expandFatherName); } diff --git a/designer-realize/src/main/java/com/fr/design/widget/CellWidgetCardPane.java b/designer-realize/src/main/java/com/fr/design/widget/CellWidgetCardPane.java index 3a88feb36d..71dbd52603 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/CellWidgetCardPane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/CellWidgetCardPane.java @@ -23,7 +23,6 @@ import java.util.ArrayList; import static com.fine.swing.ui.layout.Layouts.cell; import static com.fine.swing.ui.layout.Layouts.column; import static com.fine.swing.ui.layout.Layouts.fix; -import static com.fine.swing.ui.layout.Layouts.row; /* * carl :单独弄出来 @@ -76,14 +75,11 @@ public class CellWidgetCardPane extends BasicPane { } }; - this.add(column( - row( - fix(10), - cell(tabsHeaderIconPane).weight(1), - fix(10) - ), - cell(center).with(it -> it.setBorder(new ScaledEmptyBorder(0, 10, 0, 10))) - ).getComponent()); + JPanel wrapperPane = new JPanel(new BorderLayout()); + wrapperPane.add(tabsHeaderIconPane, BorderLayout.NORTH); + wrapperPane.add(center, BorderLayout.CENTER); + wrapperPane.setBorder(new ScaledEmptyBorder(0, 10, 0, 10)); + this.add(wrapperPane, BorderLayout.CENTER); // 属性 attriTabPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); diff --git a/designer-realize/src/main/java/com/fr/design/widget/WidgetEventPane.java b/designer-realize/src/main/java/com/fr/design/widget/WidgetEventPane.java index 41e5a99011..47db0235f1 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/WidgetEventPane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/WidgetEventPane.java @@ -1,6 +1,7 @@ package com.fr.design.widget; +import com.fine.theme.utils.FineUIScale; import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.controlpane.NameableCreator; @@ -24,6 +25,7 @@ import com.fr.stable.AssistUtils; import com.fr.stable.Nameable; import com.fr.write.JavaScriptResourceInfo; +import java.awt.Dimension; import java.lang.reflect.Constructor; public class WidgetEventPane extends UIListGroupControlPane { @@ -203,6 +205,11 @@ public class WidgetEventPane extends UIListGroupControlPane { } } + @Override + public Dimension getPreferredSize() { + return FineUIScale.scale(new Dimension(200, 950)); + } + protected String getWrapperLabelText() { return Toolkit.i18nText("Fine-Design_Report_Event"); } From de85a0815d386c2c817b2a89393e2682e1c58d59 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Tue, 7 May 2024 19:07:10 +0800 Subject: [PATCH 153/302] =?UTF-8?q?REPORT-111997=20NewUI=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=8C=89=E9=92=AE=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/ReportFloatPane.java | 4 +-- .../cellquick/CellSubReportEditor.java | 17 +++++------ .../floatquick/FloatImageQuickEditor.java | 30 +++++++------------ 3 files changed, 20 insertions(+), 31 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ReportFloatPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/ReportFloatPane.java index 0977d0aa11..2c4b48106b 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ReportFloatPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ReportFloatPane.java @@ -54,8 +54,8 @@ public class ReportFloatPane extends Column { initInsertToolBar(); this.add( row(10, - cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Add_FloatElement"))), - cell(createButtonUI()).weight(1.0) + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Add_FloatElement"))).weight(1.2), + cell(createButtonUI()).weight(3.0) ) ); diff --git a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellSubReportEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellSubReportEditor.java index d44380a5b8..8e4e5665a9 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellSubReportEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellSubReportEditor.java @@ -4,16 +4,14 @@ import com.fr.design.actions.core.ActionFactory; import com.fr.design.actions.insert.cell.SubReportCellAction; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; - import com.fr.quickeditor.CellQuickEditor; -import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; /** * 单元格元素子报表编辑器 @@ -33,11 +31,10 @@ public class CellSubReportEditor extends CellQuickEditor { public JComponent createCenterBody() { JPanel content = new JPanel(new BorderLayout()); subReportButton = new UIButton(); - subReportButton.setOpaque(false); - content.add(TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ - new Component[]{EMPTY_LABEL, subReportButton}}, - new double[]{TableLayout.PREFERRED}, - new double[]{TableLayout.PREFERRED, TableLayout.FILL}, HGAP, VGAP), BorderLayout.CENTER); + content.add(row( + cell(EMPTY_LABEL).weight(1.2), + cell(subReportButton).weight(3) + ).getComponent()); return content; } diff --git a/designer-realize/src/main/java/com/fr/quickeditor/floatquick/FloatImageQuickEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/floatquick/FloatImageQuickEditor.java index dbde12f64c..1f09ecd115 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/floatquick/FloatImageQuickEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/floatquick/FloatImageQuickEditor.java @@ -1,26 +1,25 @@ package com.fr.quickeditor.floatquick; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.Style; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.design.report.SelectImagePane; import com.fr.general.ComparatorUtils; - import com.fr.quickeditor.FloatQuickEditor; import com.fr.report.cell.cellattr.CellImage; -import javax.swing.BorderFactory; -import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + public class FloatImageQuickEditor extends FloatQuickEditor { public FloatImageQuickEditor() { @@ -33,21 +32,14 @@ public class FloatImageQuickEditor extends FloatQuickEditor { showEditingDialog(); } }); - editbutton.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0)); - editbutton.setMargin(null); - editbutton.setOpaque(false); - Component[][] components = new Component[][]{ - new Component[]{editbutton} - }; - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f}; - double[] rowSize = {p}; - JPanel pane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); this.setLayout(new BorderLayout()); + this.setBorder(new ScaledEmptyBorder(0, 10, 0, 10)); - this.setBorder(BorderFactory.createEmptyBorder(10, 75, 10, 15)); - this.add(pane, BorderLayout.CENTER); + this.add(row( + 10, + cell(new UILabel()).weight(1.2), + cell(editbutton).weight(3) + ).getComponent(), BorderLayout.NORTH); } From f2c8761693dea65f2012b5af320fad37d2460890 Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 9 May 2024 21:01:37 +0800 Subject: [PATCH 154/302] =?UTF-8?q?REPORT-114888=20feat:=20=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E7=AE=A1=E7=90=86=E5=99=A8=E4=BC=98=E5=8C=96=201.=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81png=E6=B3=A8=E5=86=8C=202.=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=9F=A5=E6=89=BE=E6=97=A7=E7=89=88=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=203.=20=E6=96=B0=E5=9B=BE=E6=A0=87=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=B3=A8=E5=86=8C=E6=96=B9=E5=BC=8F=203.=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=B0=83=E7=94=A8=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/icon/AbstractIconSet.java | 58 +-- .../fine/theme/icon/AbstractIconSource.java | 65 ++-- .../java/com/fine/theme/icon/IconManager.java | 153 ++++---- .../java/com/fine/theme/icon/IconSet.java | 25 +- .../java/com/fine/theme/icon/IconSource.java | 5 +- .../java/com/fine/theme/icon/IconType.java | 1 + .../java/com/fine/theme/icon/JsonIconSet.java | 109 ++++++ .../java/com/fine/theme/icon/LazyIcon.java | 46 ++- .../fine/theme/icon/img/ImageIconSource.java | 58 +++ .../java/com/fine/theme/icon/svg/SvgIcon.java | 8 - .../fine/theme/icon/svg/SvgIconSource.java | 61 +--- .../theme/icon/svg/batik/BatikSvgIcon.java | 160 +++++++++ .../icon/svg/{ => batik}/SvgTranscoder.java | 39 +- .../fine/theme/light/ui/FineLightIconSet.java | 339 +----------------- .../icontainer/UIModeControlContainer.java | 11 +- .../com/fr/design/gui/ispinner/UISpinner.java | 14 +- .../mainframe/EastRegionContainerPane.java | 41 +-- .../resources/com/fine/theme/icon/default.svg | 6 + .../fine/theme/light/ui/fine_light.icon.json | 278 ++++++++++++++ .../main/java/com/fr/start/MainDesigner.java | 5 +- 20 files changed, 864 insertions(+), 618 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/icon/JsonIconSet.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/img/ImageIconSource.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/svg/batik/BatikSvgIcon.java rename designer-base/src/main/java/com/fine/theme/icon/svg/{ => batik}/SvgTranscoder.java (62%) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/default.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json diff --git a/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSet.java index c207a99744..008779ca71 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSet.java @@ -1,10 +1,11 @@ package com.fine.theme.icon; -import com.fr.third.errorprone.annotations.Immutable; +import com.fr.essential.errorprone.annotations.Immutable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.Icon; +import java.awt.Dimension; import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -19,68 +20,47 @@ import java.util.concurrent.ConcurrentHashMap; @Immutable public abstract class AbstractIconSet implements IconSet { - private final String id; + protected String name; + protected boolean dark; - private final Map> map = new ConcurrentHashMap<>(64); - private final Map cache = new ConcurrentHashMap<>(64); - private final Map disableCache = new ConcurrentHashMap<>(64); + private final Map> iconSourceMap = new ConcurrentHashMap<>(64); + private final Map iconCache = new ConcurrentHashMap<>(64); - public AbstractIconSet(String id) { - this.id = id; + public AbstractIconSet() { } @Override public @NotNull String getId() { - return id; + return name; } @Override public @NotNull Collection getIds() { - return map.keySet(); + return iconSourceMap.keySet(); } @Override public void addIcon(@NotNull IconSource icon) { - map.put(icon.getId(), icon); + iconSourceMap.put(icon.getId(), icon); } + @SafeVarargs @Override - public void addIcon(@NotNull IconSource... icons) { + public final void addIcon(@NotNull IconSource... icons) { for (IconSource icon : icons) { - map.put(icon.getId(), icon); + iconSourceMap.put(icon.getId(), icon); } } @Override - public @Nullable Icon findIcon(@NotNull String id) { - Icon icon = cache.get(id); + public @Nullable Icon findIcon(@NotNull String id, @NotNull Dimension dimension, IconType type) { + String cacheKey = IconManager.genCacheKey(id, dimension, type); + Icon icon = iconCache.get(cacheKey); if (icon == null) { - IconSource iconSource = map.get(id); + IconSource iconSource = iconSourceMap.get(id); if (iconSource != null) { - icon = iconSource.loadIcon(); - cache.put(id, icon); - } - } - return icon; - } - - @Override - public @Nullable Icon findWhiteIcon(@NotNull String id) { - IconSource iconSource = map.get(id); - if (iconSource != null) { - return iconSource.white(); - } - return null; - } - - @Override - public @Nullable Icon findDisableIcon(@NotNull String id) { - Icon icon = disableCache.get(id); - if (icon == null) { - IconSource iconSource = map.get(id); - if (iconSource != null) { - icon = iconSource.disabled(); - disableCache.put(id, icon); + icon = iconSource.loadIcon(dimension, type); + iconCache.put(cacheKey, icon); } } return icon; diff --git a/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java b/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java index 134bbb2a69..1eb6c18637 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java +++ b/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java @@ -5,10 +5,17 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.Icon; +import java.awt.Dimension; + /** * 抽象图标源 - * 能够根据图标源寻找灰化图标资源 + *

+ * 1. 记录图标来源的所有信息 + * 2. 如果使用来源提供灰化和反白图标,source负责提供图标的不同来源 + * 3. 默认查找命名,如图标名称为 path/pic.svg,根据以下规则自动查询灰化和反白图标 + * 1). 灰化图 path/pic_disable.svg + * 2). 反白图 path/pic_white.svg * * @author vito * @since 11.0 @@ -17,7 +24,7 @@ import javax.swing.Icon; @Immutable public abstract class AbstractIconSource implements IconSource { - public static final String ICON_DISABLE = "_disable"; + private static final String ICON_DISABLE_SUFFIX = "_disable"; protected String id; @@ -26,28 +33,24 @@ public abstract class AbstractIconSource implements IconSource implements IconSource implements IconSource + * IconSource - 表示实际 Icon 的源的接口。 + * 目前有两种实现可用: ImageIconSource 和 SvgIconSource . + *

+ * IconSet - 表示不同可用图标集实现的接口。 + * 目前有两种实现可用: XmlIconSet 和 RuntimeIconSet . + *

+ * IconManager 可用于在运行时添加/删除 IconSet 并检索实际 Icon。 * * @author vito * @since 11.0 @@ -23,11 +36,9 @@ import java.util.HashMap; @Immutable public class IconManager { + public static final Dimension DEFAULT_DIMENSION = new Dimension(16, 16); private static final ArrayList ICON_SETS = new ArrayList<>(2); - private static final HashMap> CACHE = new HashMap<>(64); - private static final HashMap> DISABLE_CACHE = new HashMap<>(64); - private static final HashMap> WHITE_CACHE = new HashMap<>(32); /** @@ -51,103 +62,94 @@ public class IconManager { * @param set 图标集 */ public static void addSet(@NotNull IconSet set) { - if (!ICON_SETS.contains(set)) { - ICON_SETS.add(set); - // 清理可能来自其他图集相同名称图标 - clearIconSetCache(set); - } else { - throw new IconException("[IconManager] IconSet by id:" + set.getId() + "is added!"); - } + ICON_SETS.remove(set); + ICON_SETS.add(set); + clearCache(); } /** * 根据图标ID获取图标 + *

+ * 查找路径 + * 1)查找图集图标 + * 2)路径为图片图标,从路径再查找 + * 3)提供默认svg图标 * * @param id 图标ID * @param 图标类型 * @return 图标 */ @NotNull - public static I getIcon(String id) { - Icon icon = findIcon(id); + public static I getIcon(@NotNull final String id, @NotNull Dimension dimension, @NotNull IconType type) { + Icon icon = findIcon(id, dimension, type); if (icon == null) { - throw new IconException("[IconManager] Can not find icon by id: " + id); + // 只有找不到再进行其他fallback,提升效率 + if (IconManager.isImageIcon(id)) { + return (I) fallbackLegacyIcon(id); + } else { + FineLoggerFactory.getLogger().warn("[IconManager] Can not find icon by id: " + id); + return (I) new LazyIcon("default"); + } } return (I) icon; } - /** - * 获取灰化图标 - * - * @param id 图标ID - * @param 图标类型 - * @return 图标 - */ - @NotNull - public static I getWhiteIcon(String id) { - final WeakReference reference = WHITE_CACHE.get(id); + private static Icon fallbackLegacyIcon(String id) { + return IOUtils.readIcon(id); + } + + @Nullable + private static I findIcon(String id, Dimension dimension, IconType type) { + String cacheKey = genCacheKey(id, dimension, type); + final WeakReference reference = CACHE.get(cacheKey); I icon = reference != null ? (I) reference.get() : null; if (icon == null) { for (IconSet set : ICON_SETS) { - Icon f = set.findWhiteIcon(id); + Icon f = set.findIcon(id, dimension, type); if (f != null) { icon = (I) f; - WHITE_CACHE.put(id, new WeakReference<>(icon)); + CACHE.put(cacheKey, new WeakReference<>(icon)); } } } - if (icon == null) { - throw new IconException("[IconManager] Can not find icon by id: " + id); - } return icon; } + /** - * 获取灰化图标 + * 生成缓存key * - * @param id 图标ID - * @param 图标类型 - * @return 图标 + * @param id id + * @param dimension 尺寸 + * @param type 图标类型 + * @return 缓存key */ - @NotNull - public static I getDisableIcon(String id) { - Icon icon = findDisableIcon(id); - if (icon == null) { - throw new IconException("[IconManager] Can not find icon by id: " + id); + public static @NotNull String genCacheKey(String id, Dimension dimension, IconType type) { + if (DEFAULT_DIMENSION.equals(dimension)) { + return id + "_" + type; } - return (I) icon; + return id + "_" + dimension.width + "_" + dimension.height + "_" + type; } - @Nullable - private static I findDisableIcon(String id) { - final WeakReference reference = DISABLE_CACHE.get(id); - I icon = reference != null ? (I) reference.get() : null; - if (icon == null) { - for (IconSet set : ICON_SETS) { - Icon f = set.findDisableIcon(id); - if (f != null) { - icon = (I) f; - DISABLE_CACHE.put(id, new WeakReference<>(icon)); - } - } - } - return icon; + /** + * 是否SVG图标格式 + * + * @param path 路径 + * @return 是否SVG图标格式 + */ + public static boolean isSvgIcon(String path) { + return FileExtension.SVG.matchExtension(path); } - @Nullable - private static I findIcon(String id) { - final WeakReference reference = CACHE.get(id); - I icon = reference != null ? (I) reference.get() : null; - if (icon == null) { - for (IconSet set : ICON_SETS) { - Icon f = set.findIcon(id); - if (f != null) { - icon = (I) f; - CACHE.put(id, new WeakReference<>(icon)); - } - } - } - return icon; + /** + * 是否支持的图片图标格式,目前只支持png和jpg + * + * @param path 路径 + * @return 是否支持的图片图标格式 + */ + public static boolean isImageIcon(String path) { + return FileExtension.PNG.matchExtension(path) + || FileExtension.JPG.matchExtension(path); } /** @@ -155,24 +157,5 @@ public class IconManager { */ public static void clearCache() { CACHE.clear(); - DISABLE_CACHE.clear(); - WHITE_CACHE.clear(); - } - - /** - * 清理图标缓存 - */ - public static void clearIconCache(String id) { - CACHE.remove(id); - DISABLE_CACHE.remove(id); - WHITE_CACHE.clear(); - } - - private static void clearIconSetCache(@NotNull IconSet set) { - for (String id : set.getIds()) { - CACHE.remove(id); - DISABLE_CACHE.remove(id); - WHITE_CACHE.remove(id); - } } } diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconSet.java b/designer-base/src/main/java/com/fine/theme/icon/IconSet.java index 0439243fa5..d60aed98d4 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/IconSet.java +++ b/designer-base/src/main/java/com/fine/theme/icon/IconSet.java @@ -2,9 +2,9 @@ package com.fine.theme.icon; import com.fr.third.errorprone.annotations.Immutable; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.swing.Icon; +import java.awt.Dimension; import java.util.Collection; /** @@ -16,9 +16,6 @@ import java.util.Collection; */ @Immutable public interface IconSet extends Identifiable { - @NotNull - @Override - String getId(); /** * 返回集合中所有 Icons 的 id。 @@ -48,24 +45,6 @@ public interface IconSet extends Identifiable { * @param id id * @return Icon */ - @Nullable - Icon findIcon(@NotNull String id); - - /** - * 返回指定 id 的 Icon。 - * - * @param id id - * @return Icon - */ - @Nullable - Icon findWhiteIcon(@NotNull String id); + Icon findIcon(@NotNull String id, @NotNull Dimension dimension, IconType type); - /** - * 返回指定 id 的 Icon。 - * - * @param id id - * @return Icon - */ - @Nullable - Icon findDisableIcon(@NotNull String id); } diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconSource.java b/designer-base/src/main/java/com/fine/theme/icon/IconSource.java index 78de6e6584..187ec69cdf 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/IconSource.java +++ b/designer-base/src/main/java/com/fine/theme/icon/IconSource.java @@ -4,6 +4,7 @@ import com.fr.third.errorprone.annotations.Immutable; import org.jetbrains.annotations.NotNull; import javax.swing.Icon; +import java.awt.Dimension; import java.io.Serializable; /** @@ -15,7 +16,7 @@ import java.io.Serializable; * Created on 2023/11/6 */ @Immutable -public interface IconSource extends Identifiable, DisabledIcon, WhiteIcon, Cloneable, Serializable { +public interface IconSource extends Identifiable, Cloneable, Serializable { /** * 获取图标资源 @@ -32,5 +33,5 @@ public interface IconSource extends Identifiable, DisabledIcon, * @return 图标 */ @NotNull - I loadIcon(); + I loadIcon(Dimension dimension, IconType type); } diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconType.java b/designer-base/src/main/java/com/fine/theme/icon/IconType.java index 1f89331b3d..0e5821a469 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/IconType.java +++ b/designer-base/src/main/java/com/fine/theme/icon/IconType.java @@ -20,4 +20,5 @@ public enum IconType { * 原始图 */ normal + } diff --git a/designer-base/src/main/java/com/fine/theme/icon/JsonIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/JsonIconSet.java new file mode 100644 index 0000000000..f341317d0c --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/JsonIconSet.java @@ -0,0 +1,109 @@ +package com.fine.theme.icon; + +import com.fine.theme.icon.img.ImageIconSource; +import com.fine.theme.icon.svg.SvgIconSource; +import com.formdev.flatlaf.json.Json; +import com.formdev.flatlaf.json.ParseException; +import com.fr.stable.StringUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.Objects; + + +/** + * json 格式图标集 + * + * @author vito + * @since 11.0 + * Created on 2023/11/17 + */ +public class JsonIconSet extends AbstractIconSet { + + private String base; + + public JsonIconSet(UrlIconResource resource) { + addIcon(new SvgIconSource("default", "com/fine/theme/icon/default.svg")); + Map json; + try (InputStream in = resource.getInputStream()) { + try (Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) { + json = (Map) Json.parse(reader); + } + } catch (ParseException | IOException ex) { + throw new RuntimeException(ex.getMessage(), ex); + } + + + name = (String) json.get("name"); + dark = Boolean.parseBoolean((String) json.get("dark")); + base = (String) json.get("base"); + if (base == null) { + base = StringUtils.EMPTY; + } + + Map icons = (Map) json.get("icons"); + + for (Map.Entry icon : icons.entrySet()) { + applyIcon(icon.getKey(), icon.getValue()); + } + + } + + /** + * 从配置文件中添加icon,只处理认识的格式和结构 + */ + private void applyIcon(String key, Object value) { + if (value instanceof String) { + String path = (String) value; + if (IconManager.isSvgIcon(path)) { + addIcon(new SvgIconSource(key, base + path)); + } else if (IconManager.isImageIcon(path)) { + addIcon(new ImageIconSource(key, base + path)); + } + // 其他无法识别格式不处理 + } else if (value instanceof Map) { + Map iconObj = (Map) value; + String normalPath = (String) iconObj.get(IconType.normal.name()); + String disablePath = (String) iconObj.get(IconType.disable.name()); + String whitePath = (String) iconObj.get(IconType.white.name()); + // 暂不支持混合格式,每个id的格式需要保持一致 + if (IconManager.isSvgIcon(normalPath)) { + addIcon(new SvgIconSource(key, + base + normalPath, + base + disablePath, + base + whitePath + )); + } else if (IconManager.isImageIcon(normalPath)) { + addIcon(new ImageIconSource(key, + base + normalPath, + base + disablePath, + base + whitePath + )); + } + } + } + + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + JsonIconSet that = (JsonIconSet) o; + return Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hashCode(name); + } + +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java b/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java index 0032ce258f..e93e619684 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java @@ -5,11 +5,15 @@ import org.jetbrains.annotations.NotNull; import javax.swing.Icon; import java.awt.Component; +import java.awt.Dimension; import java.awt.Graphics; import java.util.StringJoiner; +import static com.fine.theme.utils.FineUIScale.scale; + /** * 懒加载图标 + * 非常懒,宽高都不想算 * * @author vito * @since 11.0 @@ -20,15 +24,37 @@ public class LazyIcon implements Identifiable, DisabledIcon, WhiteIcon, Icon { @NotNull private final String id; + private final Dimension dimension; + private final IconType type; public LazyIcon(@NotNull final String id) { this.id = id; + this.dimension = IconManager.DEFAULT_DIMENSION; + this.type = IconType.normal; + } + + public LazyIcon(@NotNull final String id, int side) { + this.id = id; + this.dimension = new Dimension(side, side); + this.type = IconType.normal; + } + + public LazyIcon(@NotNull final String id, @NotNull Dimension dimension) { + this.id = id; + this.dimension = dimension; this.type = IconType.normal; } - private LazyIcon(@NotNull final String id, IconType type) { + private LazyIcon(@NotNull final String id, @NotNull IconType type) { + this.id = id; + this.dimension = IconManager.DEFAULT_DIMENSION; + this.type = type; + } + + public LazyIcon(@NotNull final String id, @NotNull Dimension dimension, @NotNull IconType type) { this.id = id; + this.dimension = dimension; this.type = type; } @@ -46,25 +72,18 @@ public class LazyIcon implements Identifiable, DisabledIcon, WhiteIcon, Icon { @Override public int getIconWidth() { - return getIcon().getIconWidth(); + return scale(dimension.width); } @Override public int getIconHeight() { - return getIcon().getIconHeight(); + return scale(dimension.height); } @NotNull public I getIcon() { - switch (type) { - case white: - return IconManager.getWhiteIcon(getId()); - case disable: - return IconManager.getDisableIcon(getId()); - default: - return IconManager.getIcon(getId()); - } + return IconManager.getIcon(getId(), dimension, type); } /** @@ -75,7 +94,7 @@ public class LazyIcon implements Identifiable, DisabledIcon, WhiteIcon, Icon { @NotNull @Override public Icon disabled() { - return new LazyIcon(getId(), IconType.disable); + return new LazyIcon(getId(), dimension, IconType.disable); } /** @@ -86,7 +105,7 @@ public class LazyIcon implements Identifiable, DisabledIcon, WhiteIcon, Icon { @NotNull @Override public Icon white() { - return new LazyIcon(getId(), IconType.white); + return new LazyIcon(getId(), dimension, IconType.white); } @@ -94,6 +113,7 @@ public class LazyIcon implements Identifiable, DisabledIcon, WhiteIcon, Icon { public String toString() { return new StringJoiner(", ", LazyIcon.class.getSimpleName() + "[", "]") .add("id='" + id + "'") + .add("size=" + "[w=" + scale(dimension.width) + ",h=" + scale(dimension.height) + "]") .add("type=" + type) .toString(); } diff --git a/designer-base/src/main/java/com/fine/theme/icon/img/ImageIconSource.java b/designer-base/src/main/java/com/fine/theme/icon/img/ImageIconSource.java new file mode 100644 index 0000000000..2f0c17d442 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/img/ImageIconSource.java @@ -0,0 +1,58 @@ +package com.fine.theme.icon.img; + +import com.fine.theme.icon.AbstractIconSource; +import com.fine.theme.icon.IconResource; +import com.fine.theme.icon.IconType; +import com.fine.theme.icon.UrlIconResource; +import com.fr.clone.cloning.Immutable; +import com.fr.general.FRLogger; +import com.fr.general.IOUtils; +import com.fr.stable.StringUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.ImageIcon; +import java.awt.Dimension; +import java.awt.image.BufferedImage; + +/** + * 图片图标源 + * + * @author vito + * @since 11.0 + * Created on 2024/05/09 + */ +@Immutable +public class ImageIconSource extends AbstractIconSource { + + + public ImageIconSource(@NotNull String id, @NotNull String resource) { + super(id, new UrlIconResource(resource)); + } + + public ImageIconSource(@NotNull String id, + @NotNull String resource, + @Nullable String grayResource, + @Nullable String whiteResource) { + super(id, new UrlIconResource(resource), + StringUtils.isEmpty(grayResource) ? null : new UrlIconResource(grayResource), + StringUtils.isEmpty(whiteResource) ? null : new UrlIconResource(whiteResource)); + } + + @NotNull + @Override + protected ImageIcon loadIcon(@NotNull IconResource resource, Dimension dimension, IconType type) { + byte[] bytes = IOUtils.inputStream2Bytes(resource.getInputStream()); + if (bytes == null && resource instanceof UrlIconResource) { + // 换readImageWithCache尝试读取 + UrlIconResource iconResource = (UrlIconResource) resource; + BufferedImage icon = IOUtils.readImageWithCache(iconResource.getPath()); + if (icon == null) { + FRLogger.getLogger().error(iconResource.getPath()); + return new ImageIcon(); + } + return new ImageIcon(icon); + } + return new ImageIcon(bytes); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java index 66b062e2e9..051e8d1280 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java @@ -51,10 +51,6 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { private final NullableLazyValue svgDocument = NullableLazyValue.createValue(() -> load(IconType.normal)); private final NullableLazyValue whiteSvgDocument = NullableLazyValue.createValue(() -> load(IconType.white)); - public SvgIcon(IconResource resource, Dimension size) { - this(resource, size, IconType.normal); - } - public SvgIcon(IconResource resource, Dimension size, IconType type) { this.resource = resource; this.size = size; @@ -63,10 +59,6 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { this.type = type; } - public SvgIcon(IconResource resource, int side) { - this(resource, new Dimension(side, side), IconType.normal); - } - /** * 如果支持绘制Retina绘制,则进行Retina绘制, * 绘制结束不影响任何外部尺寸 diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIconSource.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIconSource.java index e77a219b1f..eeb929dd92 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIconSource.java +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIconSource.java @@ -2,12 +2,13 @@ package com.fine.theme.icon.svg; import com.fine.theme.icon.AbstractIconSource; import com.fine.theme.icon.IconResource; +import com.fine.theme.icon.IconType; import com.fine.theme.icon.UrlIconResource; import com.fr.clone.cloning.Immutable; +import com.fr.stable.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.Icon; import java.awt.Dimension; /** @@ -20,61 +21,23 @@ import java.awt.Dimension; @Immutable public class SvgIconSource extends AbstractIconSource { - private static final int ICON_SIDE_LENGTH = 16; - - private final Dimension size; public SvgIconSource(@NotNull String id, @NotNull String resource) { - this(id, new UrlIconResource(resource), null, new Dimension(ICON_SIDE_LENGTH, ICON_SIDE_LENGTH)); - } - - public SvgIconSource(@NotNull String id, @NotNull String resource, boolean autoFindDisable) { - this(id, new UrlIconResource(resource), autoFindDisable, new Dimension(ICON_SIDE_LENGTH, ICON_SIDE_LENGTH)); - } - - public SvgIconSource(@NotNull String id, @NotNull String resource, int side) { - this(id, new UrlIconResource(resource), null, side); - } - - public SvgIconSource(@NotNull String id, @NotNull String resource, boolean autoFindDisable, int side) { - this(id, new UrlIconResource(resource), autoFindDisable, new Dimension(side, side)); - } - - public SvgIconSource(@NotNull String id, @NotNull String resource, @Nullable String grayResource, int side) { - this(id, new UrlIconResource(resource), new UrlIconResource(grayResource), side); - } - - public SvgIconSource(@NotNull String id, @NotNull IconResource resource, - @Nullable IconResource grayResource, int side) { - this(id, resource, grayResource, new Dimension(side, side)); - } - - public SvgIconSource(@NotNull String id, @NotNull IconResource resource, - boolean autoFindDisable, Dimension size) { - super(id, resource, autoFindDisable); - this.size = size; + super(id, new UrlIconResource(resource)); } - public SvgIconSource(@NotNull String id, @NotNull IconResource resource, - @Nullable IconResource grayResource, Dimension size) { - super(id, resource, grayResource); - this.size = size; + public SvgIconSource(@NotNull String id, + @NotNull String resource, + @Nullable String grayResource, + @Nullable String whiteResource) { + super(id, new UrlIconResource(resource), + StringUtils.isEmpty(grayResource) ? null : new UrlIconResource(grayResource), + StringUtils.isEmpty(whiteResource) ? null : new UrlIconResource(whiteResource)); } - @NotNull @Override - protected SvgIcon loadIcon(@NotNull IconResource resource) { - return new SvgIcon(resource, size); - } - - @Override - public @NotNull SvgIcon loadDisableIcon() { - return new SvgIcon(resource, size).disabled(); - } - - @Override - public @NotNull Icon white() { - return new SvgIcon(resource, size).white(); + protected SvgIcon loadIcon(@NotNull IconResource resource, Dimension dimension, IconType type) { + return new SvgIcon(resource, dimension, type); } } diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/batik/BatikSvgIcon.java b/designer-base/src/main/java/com/fine/theme/icon/svg/batik/BatikSvgIcon.java new file mode 100644 index 0000000000..80848e5761 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/batik/BatikSvgIcon.java @@ -0,0 +1,160 @@ +package com.fine.theme.icon.svg.batik; + +import com.fine.theme.icon.DisabledIcon; +import com.fine.theme.icon.GraphicsFilter; +import com.fine.theme.icon.IconResource; +import com.fine.theme.icon.IconType; +import com.fine.theme.icon.WhiteIcon; +import com.formdev.flatlaf.FlatLaf; +import com.formdev.flatlaf.util.GrayFilter; +import com.fr.clone.cloning.Immutable; +import com.fr.log.FineLoggerFactory; +import org.apache.batik.transcoder.TranscoderException; +import org.apache.batik.transcoder.TranscoderInput; +import org.jetbrains.annotations.NotNull; + +import javax.swing.Icon; +import javax.swing.UIManager; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.awt.image.RGBImageFilter; +import java.util.StringJoiner; + +import static com.fine.theme.utils.FineUIScale.scale; +import static com.fine.theme.utils.FineUIUtils.RETINA_SCALE_FACTOR; +import static com.fine.theme.utils.FineUIUtils.getRetina; + +/** + * svg图标 + * 1.绘制长度会跟随DPI比率变化 + * 1跟2的缩放原因不同,因此不能混淆,宽高测量等依旧 + * 使用DPI缩放进行,只有绘制内容时使用Retina绘制(如果有) + * Retina绘制不影响最终尺寸,注意区分 + * + * @author vito + * @since 11.0 + * Created on 2023/11/15 + */ +@Immutable +public class BatikSvgIcon implements DisabledIcon, WhiteIcon, Icon { + + private final Dimension size; + private final Dimension scaleSize; + private final IconResource resource; + private final IconType type; + + + public BatikSvgIcon(IconResource resource, Dimension size) { + this(resource, size, IconType.normal); + } + + public BatikSvgIcon(IconResource resource, Dimension size, IconType type) { + this.resource = resource; + this.size = size; + // 根据dpi进行缩放 + this.scaleSize = scale(size); + this.type = type; + } + + public BatikSvgIcon(IconResource resource, int side) { + this(resource, new Dimension(side, side), IconType.normal); + } + + + /** + * 如果支持绘制Retina绘制,则进行Retina绘制, + * 绘制结束不影响任何外部尺寸 + */ + @Override + public void paintIcon(Component c, Graphics g, int x, int y) { + if (getRetina()) { + BufferedImage image = toImage(scaleRetina(size)); + // 高清绘制的原理:scale(1/2,1/2)的原理是坐标减半,底层是矩阵进行坐标变换,意思是坐标减半进行绘制, + // 这样就可以将两倍图绘制到一倍的大小,如果这时候设备支持Retina绘制(四个像素模拟一个像素), + // 正好就可以将4个像素利用起来,每个像素点都有不同的颜色,而不像之前只能是四个共用一个颜色。因此图像 + // 可以更加细腻当然,绘图之后,需要将这个坐标变换给恢复。 + ((Graphics2D) g).scale(1.0 / RETINA_SCALE_FACTOR, 1.0 / RETINA_SCALE_FACTOR); + g.drawImage(image, x * RETINA_SCALE_FACTOR, y * RETINA_SCALE_FACTOR, null); + ((Graphics2D) g).scale(RETINA_SCALE_FACTOR, RETINA_SCALE_FACTOR); + } else { + BufferedImage image = toImage(size); + g.drawImage(image, x, y, null); + } + } + + private static Dimension scaleRetina(Dimension dimension) { + return getRetina() + ? new Dimension(dimension.width * RETINA_SCALE_FACTOR, dimension.height * RETINA_SCALE_FACTOR) + : dimension; + } + + /** + * 根据指定尺寸绘制图片,这里尺寸为结算后的尺寸, + * 因此不必进行缩放 + * + * @param size 图像尺寸 + * @return 图像 + */ + private BufferedImage toImage(Dimension size) { + SvgTranscoder transcoder = new SvgTranscoder(size); + TranscoderInput transcoderInput = new TranscoderInput(resource.getInputStream()); + try { + transcoder.transcode(transcoderInput, null); + return transcoder.getImage(); + } catch (TranscoderException e) { + FineLoggerFactory.getLogger().error("SvgIcon from url: " + resource + "can not paint.", e); + } + return transcoder.getImage(); + } + + + private Graphics2D grayGraphics(Graphics g) { + Object grayFilterObj = UIManager.get("Component.grayFilter"); + RGBImageFilter grayFilter = (grayFilterObj instanceof RGBImageFilter) + ? (RGBImageFilter) grayFilterObj + : GrayFilter.createDisabledIconFilter(FlatLaf.isLafDark()); + + return new GraphicsFilter((Graphics2D) g.create(), grayFilter); + } + + @Override + public int getIconWidth() { + return scaleSize.width; + } + + @Override + public int getIconHeight() { + return scaleSize.height; + } + + + @Override + public String toString() { + return new StringJoiner(", ", BatikSvgIcon.class.getSimpleName() + "[", "]") + .add("resource=" + resource) + .add("type=" + type) + .add("size=" + size) + .add("scaleSize=" + scaleSize) + .toString(); + } + + /** + * 默认提供一个简单的灰化处理 + */ + @Override + public @NotNull BatikSvgIcon white() { + return new BatikSvgIcon(resource, size, IconType.white); + } + + + /** + * 默认提供一个简单的灰化处理 + */ + @Override + public @NotNull BatikSvgIcon disabled() { + return new BatikSvgIcon(resource, size, IconType.disable); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgTranscoder.java b/designer-base/src/main/java/com/fine/theme/icon/svg/batik/SvgTranscoder.java similarity index 62% rename from designer-base/src/main/java/com/fine/theme/icon/svg/SvgTranscoder.java rename to designer-base/src/main/java/com/fine/theme/icon/svg/batik/SvgTranscoder.java index abb55e1c72..2fd3663167 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgTranscoder.java +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/batik/SvgTranscoder.java @@ -1,4 +1,4 @@ -package com.fine.theme.icon.svg; +package com.fine.theme.icon.svg.batik; import org.apache.batik.transcoder.SVGAbstractTranscoder; import org.apache.batik.transcoder.TranscoderException; @@ -8,6 +8,9 @@ import org.apache.batik.transcoder.image.ImageTranscoder; import java.awt.Color; import java.awt.Dimension; import java.awt.image.BufferedImage; +import java.awt.image.DataBuffer; +import java.awt.image.IndexColorModel; +import java.awt.image.Raster; /** * Svg图标转码器 @@ -18,16 +21,20 @@ import java.awt.image.BufferedImage; */ public class SvgTranscoder extends ImageTranscoder { + public enum Type { + gray, white, origin + } + private BufferedImage bufferedImage; - private boolean gray = false; + private Type type = Type.origin; public SvgTranscoder(Dimension size) { addTranscodingHint(SVGAbstractTranscoder.KEY_WIDTH, (float) size.getWidth()); addTranscodingHint(SVGAbstractTranscoder.KEY_HEIGHT, (float) size.getHeight()); } - public SvgTranscoder(Dimension size, Color background, boolean gray) { - this.gray = gray; + public SvgTranscoder(Dimension size, Color background, Type type) { + this.type = type; addTranscodingHint(SVGAbstractTranscoder.KEY_WIDTH, (float) size.getWidth()); addTranscodingHint(SVGAbstractTranscoder.KEY_HEIGHT, (float) size.getHeight()); addTranscodingHint(ImageTranscoder.KEY_BACKGROUND_COLOR, background); @@ -41,9 +48,14 @@ public class SvgTranscoder extends ImageTranscoder { @Override public BufferedImage createImage(int width, int height) { - return gray ? - createGrayImage(width, height) : - new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + switch (type) { + case gray: + return createGrayImage(width, height); + case white: + return createWhiteImage(width, height); + default: + return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + } } /** @@ -54,6 +66,19 @@ public class SvgTranscoder extends ImageTranscoder { } + /** + * 灰化底图 + */ + private BufferedImage createWhiteImage(int width, int height) { + byte[] arr = {(byte) 0xff, (byte) 0,}; + return new BufferedImage( + new IndexColorModel(1, 2, arr, arr, arr), + Raster.createPackedRaster(DataBuffer.TYPE_BYTE, width, height, 1, 1, null), + false, + null); + } + + @Override public void writeImage(BufferedImage bufferedImage, TranscoderOutput transcoderOutput) throws TranscoderException { this.bufferedImage = bufferedImage; diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java index 3bb48ea05b..33fa2aecbd 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java @@ -1,344 +1,17 @@ package com.fine.theme.light.ui; -import com.fine.theme.icon.AbstractIconSet; -import com.fine.theme.icon.svg.SvgIconSource; +import com.fine.theme.icon.JsonIconSet; +import com.fine.theme.icon.UrlIconResource; /** * Fine 亮主题图标集 * * @author vito * @since 11.0 - * Created on 2023/11/17 + * Created on 2024/5/7 */ -public class FineLightIconSet extends AbstractIconSet { - - public FineLightIconSet(String id) { - super(id); - load(); - } - - private void load() { - addIcon( - new SvgIconSource("cut", "com/fine/theme/icon/cut.svg", true), - new SvgIconSource("save", "com/fine/theme/icon/save.svg", true), - new SvgIconSource("copy", "com/fine/theme/icon/copy.svg", true), - new SvgIconSource("formatBrush", "com/fine/theme/icon/formatBrush.svg", true), - new SvgIconSource("paste", "com/fine/theme/icon/paste.svg", true), - new SvgIconSource("undo", "com/fine/theme/icon/undo.svg", true), - new SvgIconSource("redo", "com/fine/theme/icon/redo.svg", true), - new SvgIconSource("version_save", "com/fine/theme/icon/version_save.svg", true), - new SvgIconSource("font_miss_check", "com/fine/theme/icon/font_miss_check.svg", true), - new SvgIconSource("template_theme", "com/fine/theme/icon/template_theme.svg", true), - new SvgIconSource("remove", "com/fine/theme/icon/remove.svg", true), - new SvgIconSource("search", "com/fine/theme/icon/search.svg", true), - new SvgIconSource("add", "com/fine/theme/icon/add.svg", true), - new SvgIconSource("drag_left", "com/fine/theme/icon/drag_left.svg", true), - new SvgIconSource("drag_right", "com/fine/theme/icon/drag_right.svg", true), - new SvgIconSource("down_arrow", "com/fine/theme/icon/down_arrow.svg", true), - new SvgIconSource("up_arrow", "com/fine/theme/icon/up_arrow.svg", true), - new SvgIconSource("down_arrow_12", "com/fine/theme/icon/down_arrow.svg", true, 12), - new SvgIconSource("up_arrow_12", "com/fine/theme/icon/up_arrow.svg", true, 12), - new SvgIconSource("select", "com/fine/theme/icon/select.svg", true), - - // 数据集相关Icon - new SvgIconSource("database", "com/fine/theme/icon/dataset/database.svg", true), - new SvgIconSource("preview", "com/fine/theme/icon/dataset/preview.svg", true), - new SvgIconSource("connection", "com/fine/theme/icon/dataset/connection.svg"), - new SvgIconSource("class_table_data", "com/fine/theme/icon/dataset/class_table_data.svg", true), - new SvgIconSource("data_table", "com/fine/theme/icon/dataset/data_table.svg", true), - new SvgIconSource("multi", "com/fine/theme/icon/dataset/multi.svg"), - new SvgIconSource("file", "com/fine/theme/icon/dataset/file.svg"), - new SvgIconSource("tree", "com/fine/theme/icon/dataset/tree.svg"), - new SvgIconSource("store_procedure", "com/fine/theme/icon/dataset/store_procedure.svg", true), - new SvgIconSource("batch_esd_on", "com/fine/theme/icon/dataset/batch_esd_on.svg", true), - new SvgIconSource("batch_esd_off", "com/fine/theme/icon/dataset/batch_esd_off.svg", true), - new SvgIconSource("edit", "com/fine/theme/icon/dataset/edit.svg", true), - new SvgIconSource("server_database", "com/fine/theme/icon/dataset/server_database.svg", true), - new SvgIconSource("field", "com/fine/theme/icon/dataset/field.svg", true), - - // 目录树相关Icon - new SvgIconSource("folder", "com/fine/theme/icon/filetree/folder.svg", true), - new SvgIconSource("folder_open", "com/fine/theme/icon/filetree/folder_open.svg", true), - new SvgIconSource("cpt_icon", "com/fine/theme/icon/filetree/cpt_icon.svg", true), - new SvgIconSource("frm_icon", "com/fine/theme/icon/filetree/frm_icon.svg", true), - new SvgIconSource("fvs_icon", "com/fine/theme/icon/filetree/fvs_icon.svg", true), - new SvgIconSource("excel_icon", "com/fine/theme/icon/filetree/excel_icon.svg", true), - new SvgIconSource("minus", "com/fine/theme/icon/filetree/minus.svg", true), - new SvgIconSource("plus", "com/fine/theme/icon/filetree/plus.svg", true), - new SvgIconSource("locate", "com/fine/theme/icon/filetree/locate.svg", true), - new SvgIconSource("rename", "com/fine/theme/icon/filetree/rename.svg", true), - new SvgIconSource("collapse_all", "com/fine/theme/icon/filetree/collapse_all.svg", true), - new SvgIconSource("vcs_list", "com/fine/theme/icon/filetree/vcs_list.svg", true), - new SvgIconSource("view_folder", "com/fine/theme/icon/filetree/view_folder.svg", true), - new SvgIconSource("refresh", "com/fine/theme/icon/filetree/refresh.svg", true), - new SvgIconSource("new_folder", "com/fine/theme/icon/filetree/new_folder.svg", true), - - // 文件类型 - new SvgIconSource("add_report", "com/fine/theme/icon/filetree/filetype/add_report.svg", true), - new SvgIconSource("add_word", "com/fine/theme/icon/filetree/filetype/add_word.svg", true), - new SvgIconSource("bmpFile", "com/fine/theme/icon/filetree/filetype/bmpFile.svg", true), - new SvgIconSource("chtFile", "com/fine/theme/icon/filetree/filetype/chtFile.svg", true), - new SvgIconSource("classFile", "com/fine/theme/icon/filetree/filetype/classFile.svg", true), - new SvgIconSource("cpt_locked", "com/fine/theme/icon/filetree/filetype/cpt_locked.svg", true), - new SvgIconSource("excel_import", "com/fine/theme/icon/filetree/filetype/excel_import.svg", true), - new SvgIconSource("excelFile", "com/fine/theme/icon/filetree/filetype/excelFile.svg", true), - new SvgIconSource("flashFile", "com/fine/theme/icon/filetree/filetype/flashFile.svg", true), - new SvgIconSource("frm_locked", "com/fine/theme/icon/filetree/filetype/frm_locked.svg", true), - new SvgIconSource("gifFile", "com/fine/theme/icon/filetree/filetype/gifFile.svg", true), - new SvgIconSource("htmlFile", "com/fine/theme/icon/filetree/filetype/htmlFile.svg", true), - new SvgIconSource("jarFile", "com/fine/theme/icon/filetree/filetype/jarFile.svg", true), - new SvgIconSource("javaFile", "com/fine/theme/icon/filetree/filetype/javaFile.svg", true), - new SvgIconSource("jpgFile", "com/fine/theme/icon/filetree/filetype/jpgFile.svg", true), - new SvgIconSource("jsFile", "com/fine/theme/icon/filetree/filetype/jsFile.svg", true), - new SvgIconSource("jspFile", "com/fine/theme/icon/filetree/filetype/jspFile.svg", true), - new SvgIconSource("pdfFile", "com/fine/theme/icon/filetree/filetype/pdfFile.svg", true), - new SvgIconSource("pngFile", "com/fine/theme/icon/filetree/filetype/pngFile.svg", true), - new SvgIconSource("sqlFile", "com/fine/theme/icon/filetree/filetype/sqlFile.svg", true), - new SvgIconSource("wordFile", "com/fine/theme/icon/filetree/filetype/wordFile.svg", true), - new SvgIconSource("xlsFile", "com/fine/theme/icon/filetree/filetype/xlsFile.svg", true), - new SvgIconSource("xmlFile", "com/fine/theme/icon/filetree/filetype/xmlFile.svg", true), - - // 属性面板Icon - new SvgIconSource("cellattr", "com/fine/theme/icon/propertiestab/cellattr.svg", false, 18), - new SvgIconSource("cellattr_disabled", "com/fine/theme/icon/propertiestab/cellattr_disabled.svg", false, 18), - new SvgIconSource("cellattr_selected", "com/fine/theme/icon/propertiestab/cellattr_selected.svg", false, 18), - new SvgIconSource("cellelement", "com/fine/theme/icon/propertiestab/cellelement.svg", false, 18), - new SvgIconSource("cellelement_disabled", "com/fine/theme/icon/propertiestab/cellelement_disabled.svg", false, 18), - new SvgIconSource("cellelement_selected", "com/fine/theme/icon/propertiestab/cellelement_selected.svg", false, 18), - new SvgIconSource("conditionattr", "com/fine/theme/icon/propertiestab/conditionattr.svg", false, 18), - new SvgIconSource("conditionattr_disabled", "com/fine/theme/icon/propertiestab/conditionattr_disabled.svg", false, 18), - new SvgIconSource("conditionattr_selected", "com/fine/theme/icon/propertiestab/conditionattr_selected.svg", false, 18), - new SvgIconSource("floatelement", "com/fine/theme/icon/propertiestab/floatelement.svg", false, 18), - new SvgIconSource("floatelement_disabled", "com/fine/theme/icon/propertiestab/floatelement_disabled.svg", false, 18), - new SvgIconSource("floatelement_selected", "com/fine/theme/icon/propertiestab/floatelement_selected.svg", false, 18), - new SvgIconSource("hyperlink", "com/fine/theme/icon/propertiestab/hyperlink.svg", false, 18), - new SvgIconSource("hyperlink_disabled", "com/fine/theme/icon/propertiestab/hyperlink_disabled.svg", false, 18), - new SvgIconSource("hyperlink_selected", "com/fine/theme/icon/propertiestab/hyperlink_selected.svg", false, 18), - new SvgIconSource("widgetlib", "com/fine/theme/icon/propertiestab/widgetlib.svg", false, 18), - new SvgIconSource("widgetlib_disabled", "com/fine/theme/icon/propertiestab/widgetlib_disabled.svg", false, 18), - new SvgIconSource("widgetlib_selected", "com/fine/theme/icon/propertiestab/widgetlib_selected.svg", false, 18), - new SvgIconSource("widgetsettings", "com/fine/theme/icon/propertiestab/widgetsettings.svg", false, 18), - new SvgIconSource("widgetsettings_disabled", "com/fine/theme/icon/propertiestab/widgetsettings_disabled.svg", false, 18), - new SvgIconSource("widgetsettings_selected", "com/fine/theme/icon/propertiestab/widgetsettings_selected.svg", false, 18), - new SvgIconSource("configuredroles", "com/fine/theme/icon/propertiestab/configuredroles.svg", false, 18), - new SvgIconSource("configuredroles_selected", "com/fine/theme/icon/propertiestab/configuredroles_selected.svg", false, 18), - new SvgIconSource("configuredroles_disabled", "com/fine/theme/icon/propertiestab/configuredroles_disabled.svg", false, 18), - new SvgIconSource("authorityedit", "com/fine/theme/icon/propertiestab/authorityedit.svg", false, 18), - new SvgIconSource("authorityedit_disabled", "com/fine/theme/icon/propertiestab/authorityedit_disabled.svg", false, 18), - new SvgIconSource("authorityedit_selected", "com/fine/theme/icon/propertiestab/authorityedit_selected.svg", false, 18), - - - // sheet标签栏相关icon - new SvgIconSource("add_worksheet", "com/fine/theme/icon/sheet/add_sheet.svg", true), - // TODO: 待视觉提供后替换 - new SvgIconSource("add_polysheet", "com/fine/theme/icon/sheet/add_frm.svg", true), - - // CheckBox相关Icon - new SvgIconSource("checkbox_checked", "com/fine/theme/icon/checkbox/checked.svg", true), - new SvgIconSource("checkbox_unchecked", "com/fine/theme/icon/checkbox/unchecked.svg", true), - new SvgIconSource("checkbox_part_checked", "com/fine/theme/icon/checkbox/part_checked.svg", true), - new SvgIconSource("checkbox_hovered", "com/fine/theme/icon/checkbox/hovered.svg", true), - - // radioButton相关icon - new SvgIconSource("radio_selected", "com/fine/theme/icon/radio/radio_selected.svg", true), - new SvgIconSource("radio_unselected", "com/fine/theme/icon/radio/radio_unselected.svg", true), - - // 菜单栏Icon - new SvgIconSource("bold", "com/fine/theme/icon/font/bold.svg"), - new SvgIconSource("italic", "com/fine/theme/icon/font/italic.svg"), - new SvgIconSource("underline", "com/fine/theme/icon/font/underline.svg"), - new SvgIconSource("foreground", "com/fine/theme/icon/font/foreground.svg"), - new SvgIconSource("background", "com/fine/theme/icon/font/background.svg"), - new SvgIconSource("h_left", "com/fine/theme/icon/cellstyle/h_left.svg"), - new SvgIconSource("h_center", "com/fine/theme/icon/cellstyle/h_center.svg"), - new SvgIconSource("h_right", "com/fine/theme/icon/cellstyle/h_right.svg"), - new SvgIconSource("h_justify", "com/fine/theme/icon/cellstyle/h_justify.svg"), - new SvgIconSource("h_normal", "com/fine/theme/icon/cellstyle/h_normal.svg"), - new SvgIconSource("v_top", "com/fine/theme/icon/cellstyle/v_top.svg"), - new SvgIconSource("v_center", "com/fine/theme/icon/cellstyle/v_center.svg"), - new SvgIconSource("v_bottom", "com/fine/theme/icon/cellstyle/v_bottom.svg"), - new SvgIconSource("noboder", "com/fine/theme/icon/noboder.svg", true), - new SvgIconSource("merge", "com/fine/theme/icon/merge/merge.svg", true), - new SvgIconSource("unmerge", "com/fine/theme/icon/merge/unmerge.svg", true), - new SvgIconSource("bind_column", "com/fine/theme/icon/bindcolumn/bind_column.svg", true), - new SvgIconSource("text", "com/fine/theme/icon/insert/text.svg", true), - new SvgIconSource("richtext", "com/fine/theme/icon/insert/richtext.svg", true), - new SvgIconSource("formula", "com/fine/theme/icon/insert/formula.svg", true), - new SvgIconSource("chart", "com/fine/theme/icon/insert/chart.svg", true), - new SvgIconSource("image", "com/fine/theme/icon/insert/image.svg", true), - new SvgIconSource("bias", "com/fine/theme/icon/insert/bias.svg", true), - new SvgIconSource("sub_report", "com/fine/theme/icon/insert/sub_report.svg", true), - new SvgIconSource("chart_line", "com/fine/theme/icon/chart/chart_line.svg", true), - new SvgIconSource("popup", "com/fine/theme/icon/popup/popup.svg", true), - new SvgIconSource("clear", "com/fine/theme/icon/clear.svg", true), - new SvgIconSource("clear_hover", "com/fine/theme/icon/clear_hover.svg", true), - - // 工具栏 - new SvgIconSource("tool_copy", "com/fine/theme/icon/toolbar/copy.svg", true), - new SvgIconSource("move_down", "com/fine/theme/icon/toolbar/move_down.svg", true), - new SvgIconSource("move_up", "com/fine/theme/icon/toolbar/move_up.svg", true), - new SvgIconSource("move_left", "com/fine/theme/icon/toolbar/move_left.svg", true), - new SvgIconSource("move_right", "com/fine/theme/icon/toolbar/move_right.svg", true), - new SvgIconSource("to_top", "com/fine/theme/icon/toolbar/to_top.svg", true), - new SvgIconSource("to_bottom", "com/fine/theme/icon/toolbar/to_bottom.svg", true), - new SvgIconSource("tool_edit", "com/fine/theme/icon/toolbar/edit.svg", true), - new SvgIconSource("tool_edit_white", "com/fine/theme/icon/toolbar/edit_white.svg", true), - new SvgIconSource("tool_more", "com/fine/theme/icon/toolbar/more.svg", true), - new SvgIconSource("tool_more_hover", "com/fine/theme/icon/toolbar/more_hover.svg"), - new SvgIconSource("tool_config", "com/fine/theme/icon/toolbar/config.svg", true), - new SvgIconSource("add_popup", "com/fine/theme/icon/toolbar/add_popup.svg", true), - new SvgIconSource("bracket", "com/fine/theme/icon/toolbar/bracket.svg", true), - new SvgIconSource("unBracket", "com/fine/theme/icon/toolbar/unBracket.svg", true), - - // 参数面板 - new SvgIconSource("param_edit", "com/fine/theme/icon/param/edit.svg", true, 24), - new SvgIconSource("param_edit_pressed", "com/fine/theme/icon/param/edit_pressed.svg", true, 24), - new SvgIconSource("param_hide", "com/fine/theme/icon/param/hide.svg", true, 24), - new SvgIconSource("param_hide_pressed", "com/fine/theme/icon/param/hide_pressed.svg", true, 24), - new SvgIconSource("param_view", "com/fine/theme/icon/param/view.svg", true, 18), - new SvgIconSource("param", "com/fine/theme/icon/param/param.svg", true), - new SvgIconSource("locked", "com/fine/theme/icon/lock/locked.svg", true, 16), - new SvgIconSource("unlocked", "com/fine/theme/icon/lock/unlocked.svg", true, 16), - - // 北区菜单栏 - //文件 - new SvgIconSource("notification", "com/fine/theme/icon/notification/notification.svg"), - new SvgIconSource("notification_dot", "com/fine/theme/icon/notification/notification_dot.svg"), - new SvgIconSource("createCpt", "com/fine/theme/icon/toolbar/createCpt.svg", true), - new SvgIconSource("createOther", "com/fine/theme/icon/toolbar/createOther.svg", true), - new SvgIconSource("openTemplate", "com/fine/theme/icon/toolbar/openTemplate.svg", true), - new SvgIconSource("switchEnv", "com/fine/theme/icon/toolbar/switchEnv.svg", true), - new SvgIconSource("export", "com/fine/theme/icon/toolbar/export.svg", true), - new SvgIconSource("monochrome_undo", "com/fine/theme/icon/toolbar/monochrome_undo.svg", true), - new SvgIconSource("monochrome_redo", "com/fine/theme/icon/toolbar/monochrome_redo.svg", true), - new SvgIconSource("saveAs", "com/fine/theme/icon/toolbar/saveAs.svg", true), - // 模板 - new SvgIconSource("widgetThemeMenu", "com/fine/theme/icon/toolbar/widgetThemeMenu.svg", true), - new SvgIconSource("datasource", "com/fine/theme/icon/toolbar/datasource.svg", true), - new SvgIconSource("webReportAttribute", "com/fine/theme/icon/toolbar/webReportAttribute.svg", true), - new SvgIconSource("reportParameter", "com/fine/theme/icon/toolbar/reportParameter.svg", true), - new SvgIconSource("reportFit", "com/fine/theme/icon/toolbar/reportFit.svg", true), - new SvgIconSource("mobileAttr", "com/fine/theme/icon/toolbar/mobileAttr.svg", true), - new SvgIconSource("watermark", "com/fine/theme/icon/toolbar/watermark.svg", true), - new SvgIconSource("print", "com/fine/theme/icon/toolbar/print.svg", true), - new SvgIconSource("pageSetup", "com/fine/theme/icon/toolbar/pageSetup.svg", true), - new SvgIconSource("reportHeader", "com/fine/theme/icon/toolbar/reportHeader.svg", true), - new SvgIconSource("reportFooter", "com/fine/theme/icon/toolbar/reportFooter.svg", true), - new SvgIconSource("reportBackground", "com/fine/theme/icon/toolbar/reportBackground.svg", true), - new SvgIconSource("reportWriteAttr", "com/fine/theme/icon/toolbar/reportWriteAttr.svg", true), - new SvgIconSource("linearAttr", "com/fine/theme/icon/toolbar/linearAttr.svg", true), - new SvgIconSource("repeatAndFrozen", "com/fine/theme/icon/toolbar/repeatAndFrozen.svg", true), - new SvgIconSource("reportEngineAttr", "com/fine/theme/icon/toolbar/reportEngineAttr.svg", true), - new SvgIconSource("allowAuthorityEdit", "com/fine/theme/icon/toolbar/allowAuthorityEdit.svg", true), - new SvgIconSource("replace", "com/fine/theme/icon/toolbar/replace.svg", true), - // 服务器 - new SvgIconSource("monochromeServerDatabase", "com/fine/theme/icon/toolbar/monochromeServerDatabase.svg", true), - new SvgIconSource("platform", "com/fine/theme/icon/toolbar/platform.svg", true), - new SvgIconSource("pluginManager", "com/fine/theme/icon/toolbar/pluginManager.svg", true), - new SvgIconSource("functionManager", "com/fine/theme/icon/toolbar/functionManager.svg", true), - new SvgIconSource("serverConfigManager", "com/fine/theme/icon/toolbar/serverConfigManager.svg", true), - new SvgIconSource("widgetManager", "com/fine/theme/icon/toolbar/widgetManager.svg", true), - new SvgIconSource("chartPreStyle", "com/fine/theme/icon/toolbar/chartPreStyle.svg", true), - new SvgIconSource("chartEmptyDataStyle", "com/fine/theme/icon/toolbar/chartEmptyDataStyle.svg", true), - new SvgIconSource("charMapData", "com/fine/theme/icon/toolbar/charMapData.svg", true), - // 帮助 - new SvgIconSource("demo", "com/fine/theme/icon/toolbar/demo.svg", true), - new SvgIconSource("update", "com/fine/theme/icon/toolbar/update.svg", true), - new SvgIconSource("envDetect", "com/fine/theme/icon/toolbar/envDetect.svg", true), - new SvgIconSource("servicePlatform", "com/fine/theme/icon/toolbar/servicePlatform.svg", true), - // 社区 - new SvgIconSource("bbs", "com/fine/theme/icon/toolbar/bbs.svg", true), - new SvgIconSource("video", "com/fine/theme/icon/toolbar/video.svg", true), - new SvgIconSource("help", "com/fine/theme/icon/toolbar/help.svg", true), - new SvgIconSource("studyPlan", "com/fine/theme/icon/toolbar/studyPlan.svg", true), - new SvgIconSource("question", "com/fine/theme/icon/toolbar/question.svg", true), - new SvgIconSource("solution", "com/fine/theme/icon/toolbar/solution.svg", true), - new SvgIconSource("templateStore", "com/fine/theme/icon/toolbar/templateStore.svg", true), - new SvgIconSource("bug", "com/fine/theme/icon/toolbar/bug.svg", true), - new SvgIconSource("need", "com/fine/theme/icon/toolbar/need.svg", true), - new SvgIconSource("workOrderCenter", "com/fine/theme/icon/toolbar/workOrderCenter.svg", true), - new SvgIconSource("actCenter", "com/fine/theme/icon/toolbar/actCenter.svg", true), - new SvgIconSource("sign", "com/fine/theme/icon/toolbar/sign.svg", true), - - //东区面板 - new SvgIconSource("cellelement_small", "com/fine/theme/icon/cellelement.svg"), - new SvgIconSource("forbid", "com/fine/theme/icon/expand/forbid.svg"), - new SvgIconSource("horizontal_expand", "com/fine/theme/icon/expand/horizontal.svg"), - new SvgIconSource("vertical_expand", "com/fine/theme/icon/expand/vertical.svg"), - - // 三角 - new SvgIconSource("triangle_down", "com/fine/theme/icon/triangle/triangle_down.svg"), - new SvgIconSource("triangle_down_small", "com/fine/theme/icon/triangle/triangle_down_small.svg"), - new SvgIconSource("triangle_left", "com/fine/theme/icon/triangle/triangle_left.svg"), - new SvgIconSource("triangle_left_small", "com/fine/theme/icon/triangle/triangle_left_small.svg"), - new SvgIconSource("triangle_right", "com/fine/theme/icon/triangle/triangle_right.svg"), - new SvgIconSource("triangle_right_small", "com/fine/theme/icon/triangle/triangle_right_small.svg"), - - // 滚动条 - new SvgIconSource("zoomIn", "com/fine/theme/icon/zoom/zoomIn.svg", true), - new SvgIconSource("zoomOut", "com/fine/theme/icon/zoom/zoomOut.svg", true), - - //排序 - new SvgIconSource("sort_asc", "com/fine/theme/icon/sort/sort_asc.svg", true), - new SvgIconSource("sort_desc", "com/fine/theme/icon/sort/sort_desc.svg", true), - new SvgIconSource("nosort", "com/fine/theme/icon/sort/nosort.svg", true), - - // 关闭 - new SvgIconSource("close", "com/fine/theme/icon/close/close.svg", true), - new SvgIconSource("close_round", "com/fine/theme/icon/close/close_round.svg", true), - - // 文字样式 - new SvgIconSource("add_parenthesis", "com/fine/theme/icon/font/add_parenthesis.svg", true), - new SvgIconSource("remove_parenthesis", "com/fine/theme/icon/font/remove_parenthesis.svg", true), - new SvgIconSource("shadow", "com/fine/theme/icon/font/shadow.svg", true), - new SvgIconSource("strike", "com/fine/theme/icon/font/strike.svg", true), - new SvgIconSource("sub", "com/fine/theme/icon/font/sub.svg", true), - new SvgIconSource("super", "com/fine/theme/icon/font/super.svg", true), - - new SvgIconSource("dot", "com/fine/theme/icon/dot.svg", true), - new SvgIconSource("expand_popup", "com/fine/theme/icon/popup/expand_popup.svg"), - new SvgIconSource("collapse_popup", "com/fine/theme/icon/popup/collapse_popup.svg"), - - new SvgIconSource("logMsg", "com/fine/theme/icon/log/logMsg.svg", true), - new SvgIconSource("logMsg_dot", "com/fine/theme/icon/log/logMsg_dot.svg", true), - - // 右键弹窗 - new SvgIconSource("cellClear", "com/fine/theme/icon/cell/cellClear.svg", true), - new SvgIconSource("cellExpandAttr", "com/fine/theme/icon/cell/cellExpandAttr.svg", true), - new SvgIconSource("cellStyleAttr", "com/fine/theme/icon/cell/cellStyleAttr.svg", true), - new SvgIconSource("cellOtherAttr", "com/fine/theme/icon/cell/cellOtherAttr.svg", true), - new SvgIconSource("cellWidgetAttr", "com/fine/theme/icon/cell/cellWidgetAttr.svg", true), - new SvgIconSource("cellConditionalAttr", "com/fine/theme/icon/cell/cellConditionalAttr.svg", true), - new SvgIconSource("cellHyperLinkAttr", "com/fine/theme/icon/cell/cellHyperLinkAttr.svg", true), - new SvgIconSource("cellPresentAttr", "com/fine/theme/icon/cell/cellPresentAttr.svg", true), - new SvgIconSource("cellElementAttr", "com/fine/theme/icon/cell/cellElementAttr.svg", true), - new SvgIconSource("move", "com/fine/theme/icon/filetree/move.svg", true), - new SvgIconSource("monochrome_copy", "com/fine/theme/icon/filetree/monochrome_copy.svg", true), - new SvgIconSource("monochrome_paste", "com/fine/theme/icon/filetree/monochrome_paste.svg", true), - new SvgIconSource("monochrome_cut", "com/fine/theme/icon/filetree/monochrome_cut.svg", true), - - // 控件 - new SvgIconSource("button", "com/fine/theme/icon/widget/button.svg", true), - new SvgIconSource("button_group", "com/fine/theme/icon/widget/button_group.svg", true), - new SvgIconSource("check_box", "com/fine/theme/icon/widget/checkbox.svg", true), - new SvgIconSource("checkbox_group", "com/fine/theme/icon/widget/checkbox_group.svg", true), - new SvgIconSource("combo_box", "com/fine/theme/icon/widget/combo_box.svg", true), - new SvgIconSource("combo_check", "com/fine/theme/icon/widget/combo_check.svg", true), - new SvgIconSource("comboboxtree", "com/fine/theme/icon/widget/comboboxtree.svg", true), - new SvgIconSource("date", "com/fine/theme/icon/widget/date.svg", true), - new SvgIconSource("files_up", "com/fine/theme/icon/widget/files_up.svg", true), - new SvgIconSource("iframe", "com/fine/theme/icon/widget/iframe.svg", true), - new SvgIconSource("label", "com/fine/theme/icon/widget/label.svg", true), - new SvgIconSource("number_field", "com/fine/theme/icon/widget/number_field.svg", true), - new SvgIconSource("password_field", "com/fine/theme/icon/widget/password_field.svg", true), - new SvgIconSource("picture", "com/fine/theme/icon/widget/picture.svg", true), - new SvgIconSource("widget_preview", "com/fine/theme/icon/widget/preview.svg", true), - new SvgIconSource("prewidget", "com/fine/theme/icon/widget/prewidget.svg", true), - new SvgIconSource("tab", "com/fine/theme/icon/widget/tab.svg", true), - new SvgIconSource("text_area", "com/fine/theme/icon/widget/text_area.svg", true), - new SvgIconSource("text_field", "com/fine/theme/icon/widget/text_field.svg", true), - new SvgIconSource("widget_tree", "com/fine/theme/icon/widget/tree.svg", true) - - ); +public class FineLightIconSet extends JsonIconSet { + public FineLightIconSet() { + super(new UrlIconResource("com/fine/theme/light/ui/fine_light.icon.json")); } } diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIModeControlContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIModeControlContainer.java index c0903f644c..7a64b47c22 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIModeControlContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIModeControlContainer.java @@ -6,16 +6,15 @@ import com.fr.base.vcs.DesignerMode; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.ibutton.UIButtonUI; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.DesignerContext; import com.fr.design.utils.gui.GUICoreUtils; +import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLayeredPane; import javax.swing.JPanel; -import javax.swing.Icon; import javax.swing.UIManager; import javax.swing.plaf.basic.BasicButtonUI; import java.awt.AlphaComposite; @@ -33,6 +32,7 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; public class UIModeControlContainer extends JLayeredPane { + private static final int ICON_WIDTH = 18; private static int DIM_HEIGHT = 30; private static final int NUM32 = 32; private static final int NUM5 = 5; @@ -287,7 +287,8 @@ public class UIModeControlContainer extends JLayeredPane { setLayout(new FlowLayout(FlowLayout.CENTER, 10, -3)); setBackground(UIConstants.NORMAL_BACKGROUND); add(new UILabel("" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Parameter_Panel") + "")); - UIButton viewButton = new LargeButton(new LazyIcon("param_view"), new LazyIcon("param_view"), new LazyIcon("param_view")) { + LazyIcon paramViewIcon = new LazyIcon("param_view", ICON_WIDTH); + UIButton viewButton = new LargeButton(paramViewIcon, paramViewIcon, paramViewIcon) { @Override public Dimension getPreferredSize() { return new Dimension(32, 32); @@ -378,8 +379,8 @@ public class UIModeControlContainer extends JLayeredPane { } }); - editButton = new LargeButton(new LazyIcon("param_edit"), new LazyIcon("param_edit_pressed"), new LazyIcon("param_edit_pressed")); - hideButton = new LargeButton(new LazyIcon("param_hide"), new LazyIcon("param_hide_pressed"), new LazyIcon("param_hide_pressed")); + editButton = new LargeButton(new LazyIcon("param_edit", 24), new LazyIcon("param_edit_pressed", 24), new LazyIcon("param_edit_pressed", 24)); + hideButton = new LargeButton(new LazyIcon("param_hide", 24), new LazyIcon("param_hide_pressed", 24), new LazyIcon("param_hide_pressed", 24)); editButton.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { diff --git a/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java index 6f891afc7b..b47d162a27 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java +++ b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java @@ -47,6 +47,7 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver, private final Insets defaultInsets = new Insets(0, 6, 0, 6); private final int defaultButtonSize = 24; + private final int ICON_WIDTH = 12; protected double value; private static final int DEFAULT_NUMBERFIELD_COLUMNS = 2; private UINumberField textField; @@ -173,6 +174,7 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver, /** * 赋值但不触发保存,只是展现,一般是populate的时候用 + * * @param value */ public void setValueWithoutEvent(double value) { @@ -196,7 +198,7 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver, } } - protected void setTextField(double value){ + protected void setTextField(double value) { textField.getDocument().removeDocumentListener(docListener); textField.setValue(value); textField.getDocument().addDocumentListener(docListener); @@ -219,7 +221,8 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver, /** * 设置Spinner内的数字输入框列数 - * @param numberFieldColumns 输入框列数 + * + * @param numberFieldColumns 输入框列数 */ public void setNumberFieldColumns(int numberFieldColumns) { textField.setColumns(numberFieldColumns); @@ -286,8 +289,8 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver, textField.setOpaque(false); setValue(value); - preButton = createArrowButton(new LazyIcon("up_arrow_12")); - nextButton = createArrowButton(new LazyIcon("down_arrow_12")); + preButton = createArrowButton(new LazyIcon("up_arrow", ICON_WIDTH)); + nextButton = createArrowButton(new LazyIcon("down_arrow", ICON_WIDTH)); setLayout(new BorderLayout()); add(textField, BorderLayout.CENTER); JPanel arrowPane = new JPanel(); @@ -315,6 +318,7 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver, /** * 设置最大值 + * * @param maxValue 最大值 */ public void setMaxValue(double maxValue) { @@ -357,7 +361,7 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver, initTextFiledListeners(); } - protected void initTextFiledListeners(){ + protected void initTextFiledListeners() { textField.getDocument().removeDocumentListener(docListener); textField.getDocument().addDocumentListener(docListener); textField.addFocusListener(new FocusAdapter() { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 0b564ced10..6d33c5946b 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -72,6 +72,7 @@ import java.util.Set; import static com.fine.theme.utils.FineUIStyle.STYLE_TEXT; import static com.fine.theme.utils.FineUIStyle.setStyle; +import static com.fr.design.i18n.Toolkit.i18nText; public class EastRegionContainerPane extends UIEastResizableContainer { private static volatile EastRegionContainerPane THIS; @@ -111,13 +112,13 @@ public class EastRegionContainerPane extends UIEastResizableContainer { public enum PropertyMode { REPORT, // 报表 REPORT_PARA_WIDGET, //报表参数面板中的控件 - REPORT_PARA(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Component_Settings")), // 报表参数面板 + REPORT_PARA(i18nText("Fine-Design_Basic_Component_Settings")), // 报表参数面板 REPORT_FLOAT, // 报表悬浮元素 - FORM(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Component_Settings")), // 表单 + FORM(i18nText("Fine-Design_Basic_Component_Settings")), // 表单 FORM_REPORT, // 表单报表块 POLY, // 聚合报表 POLY_REPORT, // 聚合报表-报表块 - POLY_CHART(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Component_Settings")), // 聚合报表-图表块 + POLY_CHART(i18nText("Fine-Design_Basic_Component_Settings")), // 聚合报表-图表块 AUTHORITY_EDITION, // 权限编辑 AUTHORITY_EDITION_DISABLED, // 权限编辑 DUCHAMP_REPORT; @@ -125,7 +126,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { private String title; PropertyMode() { - this.title = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Settings"); + this.title = i18nText("Fine-Design_Basic_Widget_Settings"); } PropertyMode(String title) { @@ -167,8 +168,8 @@ public class EastRegionContainerPane extends UIEastResizableContainer { private EastRegionContainerPane() { super(); initPropertyItemList(); - defaultPane = getDefaultPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No_Settings_Available")); - defaultAuthorityPane = getDefaultPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Not_Support_Authority_Edit")); + defaultPane = getDefaultPane(i18nText("Fine-Design_Basic_No_Settings_Available")); + defaultAuthorityPane = getDefaultPane(i18nText("Fine-Design_Basic_Not_Support_Authority_Edit")); switchMode(PropertyMode.REPORT); setContainerWidth(CONTAINER_WIDTH); @@ -284,19 +285,19 @@ public class EastRegionContainerPane extends UIEastResizableContainer { propertyItemMap = new LinkedHashMap<>(); // 有序map // 单元格元素 - PropertyItem cellElement = new PropertyItem(KEY_CELL_ELEMENT, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Cell_Element"), + PropertyItem cellElement = new PropertyItem(KEY_CELL_ELEMENT, i18nText("Fine-Design_Basic_Cell_Element"), "cellelement", new PropertyMode[]{PropertyMode.REPORT, PropertyMode.REPORT_PARA, PropertyMode.REPORT_PARA_WIDGET, PropertyMode.REPORT_FLOAT, PropertyMode.POLY, PropertyMode.POLY_CHART}, new PropertyMode[]{PropertyMode.REPORT, PropertyMode.FORM_REPORT, PropertyMode.POLY_REPORT, PropertyMode.DUCHAMP_REPORT}); // 单元格属性 - PropertyItem cellAttr = new PropertyItem(KEY_CELL_ATTR, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Cell_Attributes"), + PropertyItem cellAttr = new PropertyItem(KEY_CELL_ATTR, i18nText("Fine-Design_Basic_Cell_Attributes"), "cellattr", new PropertyMode[]{PropertyMode.REPORT, PropertyMode.REPORT_PARA, PropertyMode.REPORT_PARA_WIDGET, PropertyMode.REPORT_FLOAT, PropertyMode.POLY, PropertyMode.POLY_CHART}, new PropertyMode[]{PropertyMode.REPORT, PropertyMode.FORM_REPORT, PropertyMode.POLY_REPORT, PropertyMode.DUCHAMP_REPORT}); // 悬浮元素 - PropertyItem floatElement = new PropertyItem(KEY_FLOAT_ELEMENT, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Float_Element"), + PropertyItem floatElement = new PropertyItem(KEY_FLOAT_ELEMENT, i18nText("Fine-Design_Basic_Float_Element"), "floatelement", new PropertyMode[]{PropertyMode.REPORT, PropertyMode.REPORT_PARA, PropertyMode.REPORT_PARA_WIDGET, PropertyMode.REPORT_FLOAT, PropertyMode.POLY, PropertyMode.POLY_CHART}, new PropertyMode[]{PropertyMode.REPORT, PropertyMode.REPORT_FLOAT, PropertyMode.POLY_REPORT}); // 控件设置 - PropertyItem widgetSettings = new PropertyItem(KEY_WIDGET_SETTINGS, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Component_Settings"), + PropertyItem widgetSettings = new PropertyItem(KEY_WIDGET_SETTINGS, i18nText("Fine-Design_Basic_Component_Settings"), "widgetsettings", new PropertyMode[]{PropertyMode.REPORT, PropertyMode.REPORT_PARA, PropertyMode.REPORT_PARA_WIDGET, PropertyMode.REPORT_FLOAT, PropertyMode.FORM, PropertyMode.POLY}, new PropertyMode[]{PropertyMode.REPORT, PropertyMode.REPORT_PARA, PropertyMode.REPORT_PARA_WIDGET, PropertyMode.FORM, PropertyMode.POLY_REPORT, PropertyMode.POLY_CHART}, new ActionListener() { @Override @@ -305,18 +306,18 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } }); // 条件属性 - PropertyItem conditionAttr = new PropertyItem(KEY_CONDITION_ATTR, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Condition_Attributes"), + PropertyItem conditionAttr = new PropertyItem(KEY_CONDITION_ATTR, i18nText("Fine-Design_Basic_Condition_Attributes"), "conditionattr", new PropertyMode[]{PropertyMode.REPORT, PropertyMode.REPORT_PARA, PropertyMode.REPORT_PARA_WIDGET, PropertyMode.REPORT_FLOAT, PropertyMode.POLY, PropertyMode.POLY_CHART}, new PropertyMode[]{PropertyMode.REPORT, PropertyMode.FORM_REPORT, PropertyMode.POLY_REPORT, PropertyMode.DUCHAMP_REPORT}); // 超级链接 - PropertyItem hyperlink = new PropertyItem(KEY_HYPERLINK, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Hyperlink"), + PropertyItem hyperlink = new PropertyItem(KEY_HYPERLINK, i18nText("Fine-Design_Report_Hyperlink"), "hyperlink", new PropertyMode[]{PropertyMode.REPORT, PropertyMode.REPORT_PARA, PropertyMode.REPORT_PARA_WIDGET, PropertyMode.REPORT_FLOAT, PropertyMode.POLY, PropertyMode.POLY_CHART}, new PropertyMode[]{PropertyMode.REPORT, PropertyMode.REPORT_FLOAT, PropertyMode.FORM_REPORT, PropertyMode.POLY_REPORT, PropertyMode.DUCHAMP_REPORT}); // 组件库 widgetLibSnapChat = SnapChatFactory.createSnapChat(false, SnapChatKeys.COMPONENT); PropertyItem widgetLib = new PropertyItem( KEY_WIDGET_LIB, - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Library"), + i18nText("Fine-Design_Basic_Widget_Library"), "widgetlib", new PropertyMode[]{PropertyMode.FORM}, new PropertyMode[]{PropertyMode.FORM}, @@ -330,11 +331,11 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } }); // 权限编辑 - PropertyItem authorityEdition = new PropertyItem(KEY_AUTHORITY_EDITION, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Permissions_Edition"), + PropertyItem authorityEdition = new PropertyItem(KEY_AUTHORITY_EDITION, i18nText("Fine-Design_Report_Permissions_Edition"), "authorityedit", new PropertyMode[]{PropertyMode.AUTHORITY_EDITION_DISABLED}, new PropertyMode[]{PropertyMode.AUTHORITY_EDITION}); // 已配置角色 - PropertyItem configuredRoles = new PropertyItem(KEY_CONFIGURED_ROLES, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Configured_Roles"), + PropertyItem configuredRoles = new PropertyItem(KEY_CONFIGURED_ROLES, i18nText("Fine-Design_Basic_Configured_Roles"), "configuredroles", new PropertyMode[]{PropertyMode.AUTHORITY_EDITION_DISABLED}, new PropertyMode[]{PropertyMode.AUTHORITY_EDITION}); @@ -975,7 +976,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { button.setBackground(new Color(0, 0, 0, 0)); if (iconSuffix.equals(ICON_SUFFIX_SELECTED)) { iconSuffix = ICON_SUFFIX_NORMAL; - button.setIcon(new LazyIcon(getBtnIconId())); + button.setIcon(new LazyIcon(getBtnIconId(), ICON_WIDTH)); button.setOpaque(false); } else if (ICON_SUFFIX_SELECTED_DEPRECATED.equals(iconSuffix)) { iconSuffix = ICON_SUFFIX_NORMAL_DEPRECATED; @@ -988,7 +989,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { resetPropertyIcons(); if (StringUtils.isEmpty(iconBaseDir)) { iconSuffix = ICON_SUFFIX_SELECTED; - button.setIcon(new LazyIcon(getBtnIconId())); + button.setIcon(new LazyIcon(getBtnIconId(), ICON_WIDTH)); } else { iconSuffix = ICON_SUFFIX_SELECTED_DEPRECATED; button.setIcon(IconUtils.readIcon(getBtnIconUrl())); @@ -1033,8 +1034,8 @@ public class EastRegionContainerPane extends UIEastResizableContainer { private void initButtonIcon() { if (StringUtils.isEmpty(iconBaseDir)) { - button.setIcon(new LazyIcon(getBtnIconId())); - button.setDisabledIcon(new LazyIcon(btnIconName + ICON_SUFFIX_DISABLED)); + button.setIcon(new LazyIcon(getBtnIconId(), ICON_WIDTH)); + button.setDisabledIcon(new LazyIcon(btnIconName + ICON_SUFFIX_DISABLED, ICON_WIDTH)); } else { button.setIcon(IconUtils.readIcon(getBtnIconUrl())); button.setDisabledIcon(IconUtils.readIcon(getIconBaseDir() + btnIconName + ICON_SUFFIX_DISABLED_DEPRECATED)); @@ -1371,7 +1372,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { initListener(); this.setVisible(true); - defaultPane = getDefaultPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No_Settings_Available")); + defaultPane = getDefaultPane(i18nText("Fine-Design_Basic_No_Settings_Available")); } public void showDefaultPane() { diff --git a/designer-base/src/main/resources/com/fine/theme/icon/default.svg b/designer-base/src/main/resources/com/fine/theme/icon/default.svg new file mode 100644 index 0000000000..d27d416384 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/default.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json b/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json new file mode 100644 index 0000000000..b0a6aca0b7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json @@ -0,0 +1,278 @@ +{ + "name": "Fine light", + "dark": false, + "author": "fine", + "base": "com/fine/theme/icon/", + "icons": { + "cut": "cut.svg", + "save": "save.svg", + "copy": "copy.svg", + "formatBrush": "formatBrush.svg", + "paste": "paste.svg", + "undo": "undo.svg", + "redo": "redo.svg", + "version_save": "version_save.svg", + "font_miss_check": "font_miss_check.svg", + "template_theme": "template_theme.svg", + "remove": "remove.svg", + "search": "search.svg", + "add": "add.svg", + "drag_left": "drag_left.svg", + "drag_right": "drag_right.svg", + "down_arrow": "down_arrow.svg", + "up_arrow": "up_arrow.svg", + "select": "select.svg", + "database": "dataset/database.svg", + "preview": "dataset/preview.svg", + "connection": "dataset/connection.svg", + "class_table_data": "dataset/class_table_data.svg", + "data_table": "dataset/data_table.svg", + "multi": "dataset/multi.svg", + "file": "dataset/file.svg", + "tree": "dataset/tree.svg", + "store_procedure": "dataset/store_procedure.svg", + "batch_esd_on": "dataset/batch_esd_on.svg", + "batch_esd_off": "dataset/batch_esd_off.svg", + "edit": "dataset/edit.svg", + "server_database": "dataset/server_database.svg", + "field": "dataset/field.svg", + "folder": "filetree/folder.svg", + "folder_open": "filetree/folder_open.svg", + "cpt_icon": "filetree/cpt_icon.svg", + "frm_icon": "filetree/frm_icon.svg", + "fvs_icon": "filetree/fvs_icon.svg", + "excel_icon": "filetree/excel_icon.svg", + "minus": "filetree/minus.svg", + "plus": "filetree/plus.svg", + "locate": "filetree/locate.svg", + "rename": "filetree/rename.svg", + "collapse_all": "filetree/collapse_all.svg", + "vcs_list": "filetree/vcs_list.svg", + "view_folder": "filetree/view_folder.svg", + "refresh": "filetree/refresh.svg", + "new_folder": "filetree/new_folder.svg", + "add_report": "filetree/filetype/add_report.svg", + "add_word": "filetree/filetype/add_word.svg", + "bmpFile": "filetree/filetype/bmpFile.svg", + "chtFile": "filetree/filetype/chtFile.svg", + "classFile": "filetree/filetype/classFile.svg", + "cpt_locked": "filetree/filetype/cpt_locked.svg", + "excel_import": "filetree/filetype/excel_import.svg", + "excelFile": "filetree/filetype/excelFile.svg", + "flashFile": "filetree/filetype/flashFile.svg", + "frm_locked": "filetree/filetype/frm_locked.svg", + "gifFile": "filetree/filetype/gifFile.svg", + "htmlFile": "filetree/filetype/htmlFile.svg", + "jarFile": "filetree/filetype/jarFile.svg", + "javaFile": "filetree/filetype/javaFile.svg", + "jpgFile": "filetree/filetype/jpgFile.svg", + "jsFile": "filetree/filetype/jsFile.svg", + "jspFile": "filetree/filetype/jspFile.svg", + "pdfFile": "filetree/filetype/pdfFile.svg", + "pngFile": "filetree/filetype/pngFile.svg", + "sqlFile": "filetree/filetype/sqlFile.svg", + "wordFile": "filetree/filetype/wordFile.svg", + "xlsFile": "filetree/filetype/xlsFile.svg", + "xmlFile": "filetree/filetype/xmlFile.svg", + "cellattr": "propertiestab/cellattr.svg", + "cellattr_disabled": "propertiestab/cellattr_disabled.svg", + "cellattr_selected": "propertiestab/cellattr_selected.svg", + "cellelement": "propertiestab/cellelement.svg", + "cellelement_disabled": "propertiestab/cellelement_disabled.svg", + "cellelement_selected": "propertiestab/cellelement_selected.svg", + "conditionattr": "propertiestab/conditionattr.svg", + "conditionattr_disabled": "propertiestab/conditionattr_disabled.svg", + "conditionattr_selected": "propertiestab/conditionattr_selected.svg", + "floatelement": "propertiestab/floatelement.svg", + "floatelement_disabled": "propertiestab/floatelement_disabled.svg", + "floatelement_selected": "propertiestab/floatelement_selected.svg", + "hyperlink": "propertiestab/hyperlink.svg", + "hyperlink_disabled": "propertiestab/hyperlink_disabled.svg", + "hyperlink_selected": "propertiestab/hyperlink_selected.svg", + "widgetlib": "propertiestab/widgetlib.svg", + "widgetlib_disabled": "propertiestab/widgetlib_disabled.svg", + "widgetlib_selected": "propertiestab/widgetlib_selected.svg", + "widgetsettings": "propertiestab/widgetsettings.svg", + "widgetsettings_disabled": "propertiestab/widgetsettings_disabled.svg", + "widgetsettings_selected": "propertiestab/widgetsettings_selected.svg", + "configuredroles": "propertiestab/configuredroles.svg", + "configuredroles_selected": "propertiestab/configuredroles_selected.svg", + "configuredroles_disabled": "propertiestab/configuredroles_disabled.svg", + "authorityedit": "propertiestab/authorityedit.svg", + "authorityedit_disabled": "propertiestab/authorityedit_disabled.svg", + "authorityedit_selected": "propertiestab/authorityedit_selected.svg", + "add_worksheet": "sheet/add_sheet.svg", + "add_polysheet": "sheet/add_frm.svg", + "checkbox_checked": "checkbox/checked.svg", + "checkbox_unchecked": "checkbox/unchecked.svg", + "checkbox_part_checked": "checkbox/part_checked.svg", + "checkbox_hovered": "checkbox/hovered.svg", + "radio_selected": "radio/radio_selected.svg", + "radio_unselected": "radio/radio_unselected.svg", + "bold": "font/bold.svg", + "italic": "font/italic.svg", + "underline": "font/underline.svg", + "foreground": "font/foreground.svg", + "background": "font/background.svg", + "h_left": "cellstyle/h_left.svg", + "h_center": "cellstyle/h_center.svg", + "h_right": "cellstyle/h_right.svg", + "h_justify": "cellstyle/h_justify.svg", + "h_normal": "cellstyle/h_normal.svg", + "v_top": "cellstyle/v_top.svg", + "v_center": "cellstyle/v_center.svg", + "v_bottom": "cellstyle/v_bottom.svg", + "noboder": "noboder.svg", + "merge": "merge/merge.svg", + "unmerge": "merge/unmerge.svg", + "bind_column": "bindcolumn/bind_column.svg", + "text": "insert/text.svg", + "richtext": "insert/richtext.svg", + "formula": "insert/formula.svg", + "chart": "insert/chart.svg", + "image": "insert/image.svg", + "bias": "insert/bias.svg", + "sub_report": "insert/sub_report.svg", + "chart_line": "chart/chart_line.svg", + "popup": "popup/popup.svg", + "clear": "clear.svg", + "clear_hover": "clear_hover.svg", + "tool_copy": "toolbar/copy.svg", + "move_down": "toolbar/move_down.svg", + "move_up": "toolbar/move_up.svg", + "move_left": "toolbar/move_left.svg", + "move_right": "toolbar/move_right.svg", + "to_top": "toolbar/to_top.svg", + "to_bottom": "toolbar/to_bottom.svg", + "tool_edit": "toolbar/edit.svg", + "tool_edit_white": "toolbar/edit_white.svg", + "tool_more": "toolbar/more.svg", + "tool_more_hover": "toolbar/more_hover.svg", + "tool_config": "toolbar/config.svg", + "add_popup": "toolbar/add_popup.svg", + "bracket": "toolbar/bracket.svg", + "unBracket": "toolbar/unBracket.svg", + "param_edit": "param/edit.svg", + "param_edit_pressed": "param/edit_pressed.svg", + "param_hide": "param/hide.svg", + "param_hide_pressed": "param/hide_pressed.svg", + "param_view": "param/view.svg", + "param": "param/param.svg", + "locked": "lock/locked.svg", + "unlocked": "lock/unlocked.svg", + "notification": "notification/notification.svg", + "notification_dot": "notification/notification_dot.svg", + "createCpt": "toolbar/createCpt.svg", + "createOther": "toolbar/createOther.svg", + "openTemplate": "toolbar/openTemplate.svg", + "switchEnv": "toolbar/switchEnv.svg", + "export": "toolbar/export.svg", + "monochrome_undo": "toolbar/monochrome_undo.svg", + "monochrome_redo": "toolbar/monochrome_redo.svg", + "saveAs": "toolbar/saveAs.svg", + "widgetThemeMenu": "toolbar/widgetThemeMenu.svg", + "datasource": "toolbar/datasource.svg", + "webReportAttribute": "toolbar/webReportAttribute.svg", + "reportParameter": "toolbar/reportParameter.svg", + "reportFit": "toolbar/reportFit.svg", + "mobileAttr": "toolbar/mobileAttr.svg", + "watermark": "toolbar/watermark.svg", + "print": "toolbar/print.svg", + "pageSetup": "toolbar/pageSetup.svg", + "reportHeader": "toolbar/reportHeader.svg", + "reportFooter": "toolbar/reportFooter.svg", + "reportBackground": "toolbar/reportBackground.svg", + "reportWriteAttr": "toolbar/reportWriteAttr.svg", + "linearAttr": "toolbar/linearAttr.svg", + "repeatAndFrozen": "toolbar/repeatAndFrozen.svg", + "reportEngineAttr": "toolbar/reportEngineAttr.svg", + "allowAuthorityEdit": "toolbar/allowAuthorityEdit.svg", + "replace": "toolbar/replace.svg", + "monochromeServerDatabase": "toolbar/monochromeServerDatabase.svg", + "platform": "toolbar/platform.svg", + "pluginManager": "toolbar/pluginManager.svg", + "functionManager": "toolbar/functionManager.svg", + "serverConfigManager": "toolbar/serverConfigManager.svg", + "widgetManager": "toolbar/widgetManager.svg", + "chartPreStyle": "toolbar/chartPreStyle.svg", + "chartEmptyDataStyle": "toolbar/chartEmptyDataStyle.svg", + "charMapData": "toolbar/charMapData.svg", + "demo": "toolbar/demo.svg", + "update": "toolbar/update.svg", + "envDetect": "toolbar/envDetect.svg", + "servicePlatform": "toolbar/servicePlatform.svg", + "bbs": "toolbar/bbs.svg", + "video": "toolbar/video.svg", + "help": "toolbar/help.svg", + "studyPlan": "toolbar/studyPlan.svg", + "question": "toolbar/question.svg", + "solution": "toolbar/solution.svg", + "templateStore": "toolbar/templateStore.svg", + "bug": "toolbar/bug.svg", + "need": "toolbar/need.svg", + "workOrderCenter": "toolbar/workOrderCenter.svg", + "actCenter": "toolbar/actCenter.svg", + "sign": "toolbar/sign.svg", + "cellelement_small": "cellelement.svg", + "forbid": "expand/forbid.svg", + "horizontal_expand": "expand/horizontal.svg", + "vertical_expand": "expand/vertical.svg", + "triangle_down": "triangle/triangle_down.svg", + "triangle_down_small": "triangle/triangle_down_small.svg", + "triangle_left": "triangle/triangle_left.svg", + "triangle_left_small": "triangle/triangle_left_small.svg", + "triangle_right": "triangle/triangle_right.svg", + "triangle_right_small": "triangle/triangle_right_small.svg", + "zoomIn": "zoom/zoomIn.svg", + "zoomOut": "zoom/zoomOut.svg", + "sort_asc": "sort/sort_asc.svg", + "sort_desc": "sort/sort_desc.svg", + "nosort": "sort/nosort.svg", + "close": "close/close.svg", + "close_round": "close/close_round.svg", + "add_parenthesis": "font/add_parenthesis.svg", + "remove_parenthesis": "font/remove_parenthesis.svg", + "shadow": "font/shadow.svg", + "strike": "font/strike.svg", + "sub": "font/sub.svg", + "super": "font/super.svg", + "dot": "dot.svg", + "expand_popup": "popup/expand_popup.svg", + "collapse_popup": "popup/collapse_popup.svg", + "logMsg": "log/logMsg.svg", + "logMsg_dot": "log/logMsg_dot.svg", + "cellClear": "cell/cellClear.svg", + "cellExpandAttr": "cell/cellExpandAttr.svg", + "cellStyleAttr": "cell/cellStyleAttr.svg", + "cellOtherAttr": "cell/cellOtherAttr.svg", + "cellWidgetAttr": "cell/cellWidgetAttr.svg", + "cellConditionalAttr": "cell/cellConditionalAttr.svg", + "cellHyperLinkAttr": "cell/cellHyperLinkAttr.svg", + "cellPresentAttr": "cell/cellPresentAttr.svg", + "cellElementAttr": "cell/cellElementAttr.svg", + "move": "filetree/move.svg", + "monochrome_copy": "filetree/monochrome_copy.svg", + "monochrome_paste": "filetree/monochrome_paste.svg", + "monochrome_cut": "filetree/monochrome_cut.svg", + "button": "widget/button.svg", + "button_group": "widget/button_group.svg", + "check_box": "widget/checkbox.svg", + "checkbox_group": "widget/checkbox_group.svg", + "combo_box": "widget/combo_box.svg", + "combo_check": "widget/combo_check.svg", + "comboboxtree": "widget/comboboxtree.svg", + "date": "widget/date.svg", + "files_up": "widget/files_up.svg", + "iframe": "widget/iframe.svg", + "label": "widget/label.svg", + "number_field": "widget/number_field.svg", + "password_field": "widget/password_field.svg", + "picture": "widget/picture.svg", + "widget_preview": "widget/preview.svg", + "prewidget": "widget/prewidget.svg", + "tab": "widget/tab.svg", + "text_area": "widget/text_area.svg", + "text_field": "widget/text_field.svg", + "widget_tree": "widget/tree.svg" + } +} diff --git a/designer-realize/src/main/java/com/fr/start/MainDesigner.java b/designer-realize/src/main/java/com/fr/start/MainDesigner.java index 315c624efa..739571ad96 100644 --- a/designer-realize/src/main/java/com/fr/start/MainDesigner.java +++ b/designer-realize/src/main/java/com/fr/start/MainDesigner.java @@ -84,7 +84,6 @@ import java.awt.Dimension; import java.awt.FlowLayout; import java.io.File; import java.util.ArrayList; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; @@ -166,9 +165,7 @@ public class MainDesigner extends BaseDesigner { * 在 {@link FineRuntime#start()} 运行后 */ private static void startPreload1() { - - CompletableFuture initLookAndFeel = CompletableFuture.runAsync(DesignUtils::initLookAndFeel); - PreLoadService.getInstance().addUIFuture(initLookAndFeel); + DesignUtils.initLookAndFeel(); DesignerLaunchStatus.setStatusAndAsyncFire(DesignerLaunchStatus.UI_PRE_INIT_COMPLETE); } From 2936dc76b51cc313e9bd00635643e60149bd881b Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 9 May 2024 21:08:51 +0800 Subject: [PATCH 155/302] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fine/theme/icon/IconManager.java | 9 --------- .../java/com/fine/theme/light/ui/laf/FineDarkLaf.java | 2 +- .../java/com/fine/theme/light/ui/laf/FineLightLaf.java | 2 +- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconManager.java b/designer-base/src/main/java/com/fine/theme/icon/IconManager.java index e887e48553..acb9f1fd76 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/IconManager.java +++ b/designer-base/src/main/java/com/fine/theme/icon/IconManager.java @@ -19,15 +19,6 @@ import java.util.HashMap; * 2. 提供图标缓存 * 3. 查找图标 * 4. 配合 {@link LazyIcon} 实现图标懒加载 - * 5. - *

- * IconSource - 表示实际 Icon 的源的接口。 - * 目前有两种实现可用: ImageIconSource 和 SvgIconSource . - *

- * IconSet - 表示不同可用图标集实现的接口。 - * 目前有两种实现可用: XmlIconSet 和 RuntimeIconSet . - *

- * IconManager 可用于在运行时添加/删除 IconSet 并检索实际 Icon。 * * @author vito * @since 11.0 diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java index 5150df2dd3..e568f5af32 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java @@ -25,7 +25,7 @@ public class FineDarkLaf extends FineLaf { * @return 是否安装成功 */ public static boolean setup() { - IconManager.addSet(new FineLightIconSet("fine-dark")); + IconManager.addSet(new FineLightIconSet()); Layouts.setScaleFactor(UIScale.getUserScaleFactor()); UIScale.addPropertyChangeListener(evt -> { if (StringUtils.equals(evt.getPropertyName(), USER_SCALE_FACTOR)) { diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java index e3ae21a413..9e95b76f7e 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java @@ -25,7 +25,7 @@ public class FineLightLaf extends FineLaf { * @return 是否安装成功 */ public static boolean setup() { - IconManager.addSet(new FineLightIconSet("fine-light")); + IconManager.addSet(new FineLightIconSet()); Layouts.setScaleFactor(UIScale.getUserScaleFactor()); UIScale.addPropertyChangeListener(evt -> { if (StringUtils.equals(evt.getPropertyName(), USER_SCALE_FACTOR)) { From 36a50e6176f111b1d8d1b0a7cd8e1874565abb5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 15 May 2024 11:38:52 +0800 Subject: [PATCH 156/302] =?UTF-8?q?REPORT-111995=20=E3=80=90NewUI=E3=80=91?= =?UTF-8?q?=E6=96=87=E4=BB=B6-=E9=80=89=E9=A1=B9=E5=92=8C=E5=B8=AE?= =?UTF-8?q?=E5=8A=A9=E9=9D=A2=E6=9D=BF=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/actions/file/PreferencePane.java | 556 ++++++++---------- .../fr/design/actions/help/AboutDialog.java | 3 + .../com/fr/design/actions/help/AboutPane.java | 11 +- .../fr/design/gui/style/TextFormatPane.java | 1 - .../design/mainframe/vcs/ui/VcsMovePanel.java | 9 +- 5 files changed, 267 insertions(+), 313 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java index f8703275f8..505ece7fb8 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java @@ -1,5 +1,9 @@ package com.fr.design.actions.file; +import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIStyle; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.config.Configuration; import com.fr.config.ServerPreferenceConfig; import com.fr.design.DesignerEnvManager; @@ -31,8 +35,6 @@ import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; import com.fr.design.jdk.JdkVersion; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.layout.VerticalFlowLayout; import com.fr.design.mainframe.vcs.VcsConfigManager; import com.fr.design.mainframe.vcs.common.VcsHelper; @@ -44,7 +46,6 @@ import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.widget.FRWidgetFactory; import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; -import com.fr.general.GeneralContext; import com.fr.general.IOUtils; import com.fr.general.Inter; import com.fr.general.log.Log4jConfig; @@ -52,7 +53,6 @@ import com.fr.io.attr.ImageExportAttr; import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; import com.fr.report.ReportConfigManager; -import com.fr.scheduler.tool.FineScheduler; import com.fr.stable.Constants; import com.fr.stable.os.OperatingSystem; import com.fr.third.apache.logging.log4j.Level; @@ -70,13 +70,10 @@ import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanSchedule; import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanService; import org.jetbrains.annotations.NotNull; -import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; -import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFileChooser; -import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JProgressBar; @@ -86,7 +83,6 @@ import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import javax.swing.Timer; import javax.swing.UIManager; -import javax.swing.border.EmptyBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.*; @@ -105,6 +101,10 @@ import java.util.Locale; import java.util.Map; import java.util.concurrent.ExecutionException; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.row; import static com.fr.design.i18n.Toolkit.i18nText; /** @@ -127,6 +127,7 @@ public class PreferencePane extends BasicPane { private static final int MEMORY_TIP_LABEL_MAX_WIDTH = 230; private static final int PREFERENCE_LABEL_MAX_WIDTH = 460; private static final int OFFSET_HEIGHT = 60; + private static final int SETTING_V_GAP = 15; private static final int VCS_FILL_TOTAL = 5; private static final String TYPE = "pressed"; @@ -275,108 +276,116 @@ public class PreferencePane extends BasicPane { protected void initComponents() { JPanel contentPane = this; contentPane.setLayout(FRGUIPaneFactory.createBorderLayout()); - - UITabbedPane jtabPane = new UITabbedPane(); - JPanel generalPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + UITabbedPane tabPane = new UITabbedPane(); + contentPane.add(tabPane, BorderLayout.NORTH); + // 常用面板 + JPanel generalPane = column(SETTING_V_GAP, + // 功能设置 + cell(createFunctionPane()), + // 编辑器设置 + cell(createEditPane()), + // 颜色设置 + cell(createColorSettingPane()), + // 语言选择 + cell(createLanPane()), + // 启动页配置 + cell(createStartupPagePane()) + ).weight(1).getComponent(); UIScrollPane generalScrollPane = patchScroll(generalPane); - jtabPane.addTab(i18nText("Fine-Design_Basic_General"), generalScrollPane); - - JPanel advancePane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + tabPane.addTab(i18nText("Fine-Design_Basic_General"), generalScrollPane); + + // 高级面板 + JPanel advancePane = column(SETTING_V_GAP, + // log导出配置 + cell(createLogPane()), + // 标尺单位设置 + cell(createLengthPane()), + // 服务器设置 + cell(createServerPane()), + // 插件管理设置 + cell(createUpmSelectorPane()).with(it -> it.setVisible(!OperatingSystem.isLinux() && JdkVersion.LE_8.support())), + // 登录选项 + cell(createLoginSelectorPane()).with(it -> it.setVisible(SupportOSImpl.DESIGNER_LOGIN.support())), + // Oracle设置 + cell(createOraclePane()), + // 内存设置 + cell(createMemoryPane()), + // 产品改良 + cell(createImprovePane()), + // 内置服务器 + cell(createEmbeddedServerPane()), + // 模板预览性能 + cell(createTplPreviewPane()), + // 设计器启动选项 + cell(createDesignerStartupPane()) + ).getComponent(); + useUniverseDBMCheckbox = new UICheckBox(i18nText("Fine-Design_Basic_Use_Universe_Database_Manager")); UIScrollPane adviceScrollPane = patchScroll(advancePane); - jtabPane.addTab(i18nText("Fine-Design_Basic_Advanced"), adviceScrollPane); + tabPane.addTab(i18nText("Fine-Design_Basic_Advanced"), adviceScrollPane); + + // 版本管理面板 //初始化vcs总面板 JPanel vcsParentPane = new JPanel(); CardLayout cardLayout = new CardLayout(); vcsParentPane.setLayout(cardLayout); //vcs配置面板 - JPanel vcsPane = new JPanel(new BorderLayout()); + JPanel vcsPane = new JPanel(new BorderLayout(0, SETTING_V_GAP)); + // vcsPane + createVcsSettingPane(vcsPane, vcsParentPane, cardLayout); //添加滚动条 UIScrollPane vcsScrollPane = patchScroll(vcsPane); //配置面板作为vcs总面板的一张卡片 vcsParentPane.add(vcsScrollPane, VcsMovePanel.SETTING); - jtabPane.addTab(i18nText("Fine-Design_Vcs_Title"), vcsParentPane); - - contentPane.add(jtabPane, BorderLayout.NORTH); - - createFunctionPane(generalPane); - createEditPane(generalPane); - createColorSettingPane(generalPane); - - // vcsPane - createVcsSettingPane(vcsPane, vcsParentPane, cardLayout); - - // ConfPane - JPanel confLocationPane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); - advancePane.add(confLocationPane); - - createLogPane(advancePane); - - createLanPane(generalPane); - - createStartupPagePane(generalPane); - - createLengthPane(advancePane); - - createServerPane(advancePane); - - JPanel oraclePane = FRGUIPaneFactory.createTitledBorderPane("Oracle" + i18nText("Fine-Design_Basic_Oracle_All_Tables")); - oracleSpace = new UICheckBox(i18nText("Fine-Design_Basic_Show_All_Oracle_Tables")); - oraclePane.add(oracleSpace); + tabPane.addTab(i18nText("Fine-Design_Vcs_Title"), vcsParentPane); + } - if (!OperatingSystem.isLinux() && JdkVersion.LE_8.support()) { - JPanel upmSelectorPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Update_Plugin_Manager")); - useOptimizedUPMCheckbox = new UICheckBox(i18nText("Fine-Design_Basic_Use_New_Update_Plugin_Manager")); - upmSelectorPane.add(useOptimizedUPMCheckbox); - advancePane.add(upmSelectorPane); - } + private Component createDesignerStartupPane() { + cloudAnalyticsDelayCheckBox = new UICheckBox(i18nText("Fine-Design_Cloud_Analytics_Delay")); + return FineUIUtils.wrapComponentWithTitle(column(10, cell(cloudAnalyticsDelayCheckBox)).getComponent(), + i18nText("Fine-Design_Startup_Option")); + } - if (SupportOSImpl.DESIGNER_LOGIN.support()) { - JPanel loginSelectorPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Login_Manager")); - useNewVersionLoginCheckbox = new UICheckBox(i18nText("Fine-Design_Basic_Use_New_Login_Manager")); - loginSelectorPane.add(useNewVersionLoginCheckbox); - advancePane.add(loginSelectorPane); - } + private Component createTplPreviewPane() { + imageCompressPanelCheckBox = new UICheckBox(i18nText("Fine-Design_Image_Compress")); + return FineUIUtils.wrapComponentWithTitle(column(10, + cell(imageCompressPanelCheckBox), + cell(createImageExportSettingPane()) + ).getComponent(), + i18nText("Fine-Design_Template_Preview_Performance")); + } - JPanel dbmSelectorPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Database_Manager")); - useUniverseDBMCheckbox = new UICheckBox(i18nText("Fine-Design_Basic_Use_Universe_Database_Manager")); - //dbmSelectorPane.add(useUniverseDBMCheckbox); - //advancePane.add(dbmSelectorPane); + private Component createEmbeddedServerPane() { + embedServerLazyStartupCheckBox = new UICheckBox(i18nText("Fine-Design_Startup_When_Needed")); + return FineUIUtils.wrapComponentWithTitle(column(10, cell(embedServerLazyStartupCheckBox)).getComponent(), + i18nText("Fine-Design_Embed_Server")); + } - JPanel improvePane = FRGUIPaneFactory.createVerticalTitledBorderPane(i18nText("Fine-Design_Basic_Product_Improve")); + private Component createImprovePane() { joinProductImproveCheckBox = new UICheckBox(i18nText("Fine-Design_Basic_Join_Product_Improve")); - improvePane.add(joinProductImproveCheckBox); + autoPushUpdateCheckBox = new UICheckBox(i18nText("Fine-Design_Automatic_Push_Update")); + JPanel improvePane = column(10, + cell(joinProductImproveCheckBox), + cell(autoPushUpdateCheckBox).with(it -> it.setVisible(SupportOSImpl.AUTOPUSHUPDATE.support())) + ).getComponent(); + return FineUIUtils.wrapComponentWithTitle(improvePane, i18nText("Fine-Design_Basic_Product_Improve")); + } - if (SupportOSImpl.AUTOPUSHUPDATE.support()) { - autoPushUpdateCheckBox = new UICheckBox(i18nText("Fine-Design_Automatic_Push_Update")); - improvePane.add(autoPushUpdateCheckBox); - } - /* - if (DesignerPushUpdateManager.getInstance().isAutoPushUpdateSupported()) { - autoPushUpdateCheckBox = new UICheckBox(i18nText("Fine-Design_Automatic_Push_Update")); - improvePane.add(autoPushUpdateCheckBox); - }*/ - - JPanel spaceUpPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - spaceUpPane.add(oraclePane, BorderLayout.NORTH); - spaceUpPane.add(createMemoryPane(), BorderLayout.CENTER); - spaceUpPane.add(improvePane, BorderLayout.SOUTH); - advancePane.add(spaceUpPane); - - JPanel embedServerPanel = FRGUIPaneFactory.createVerticalTitledBorderPane(i18nText("Fine-Design_Embed_Server")); - embedServerLazyStartupCheckBox = new UICheckBox(i18nText("Fine-Design_Startup_When_Needed")); - embedServerPanel.add(embedServerLazyStartupCheckBox); - advancePane.add(embedServerPanel); + private Component createOraclePane() { + oracleSpace = new UICheckBox(i18nText("Fine-Design_Basic_Show_All_Oracle_Tables")); + return FineUIUtils.wrapComponentWithTitle(column(10, cell(oracleSpace)).getComponent(), + i18nText("Fine-Design_Basic_Oracle_All_Tables")); + } - JPanel imageCompressPanel = FRGUIPaneFactory.createVerticalTitledBorderPane(i18nText("Fine-Design_Template_Preview_Performance")); - imageCompressPanelCheckBox = new UICheckBox(i18nText("Fine-Design_Image_Compress")); - imageCompressPanel.add(imageCompressPanelCheckBox); - imageCompressPanel.add(createImageExportSettingPane()); - advancePane.add(imageCompressPanel); + private Component createLoginSelectorPane() { + useNewVersionLoginCheckbox = new UICheckBox(i18nText("Fine-Design_Basic_Use_New_Login_Manager")); + return FineUIUtils.wrapComponentWithTitle(column(10, cell(useNewVersionLoginCheckbox)).getComponent(), + i18nText("Fine-Design_Basic_Login_Manager")); + } - JPanel designerStartupOption = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Startup_Option")); - cloudAnalyticsDelayCheckBox = new UICheckBox(i18nText("Fine-Design_Cloud_Analytics_Delay")); - designerStartupOption.add(cloudAnalyticsDelayCheckBox); - advancePane.add(designerStartupOption); + private Component createUpmSelectorPane() { + useOptimizedUPMCheckbox = new UICheckBox(i18nText("Fine-Design_Basic_Use_New_Update_Plugin_Manager")); + return FineUIUtils.wrapComponentWithTitle(column(10, cell(useOptimizedUPMCheckbox)).getComponent(), + i18nText("Fine-Design_Basic_Update_Plugin_Manager")); } private JPanel createImageExportSettingPane() { @@ -391,42 +400,32 @@ public class PreferencePane extends BasicPane { ButtonGroup previewRenderGroup = new ButtonGroup(); previewRenderGroup.add(previewRenderQuality); previewRenderGroup.add(previewRenderSpeed); - JPanel imageExportSettingPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - JComponent[][] templateComps = { - {new UILabel(Toolkit.i18nText("Fine-Design_Report_Engine_Enlarge_Or_Reduce") + ":"), this.previewResolutionBtnS, this.previewResolutionBtnM}, - {new UILabel(Toolkit.i18nText("Fine-Design_Image_Export_Rendering_Quality") + ":"), this.previewRenderQuality, this.previewRenderSpeed}, - }; - imageExportSettingPane.add( - TableLayoutHelper.createGapTableLayoutPane( - templateComps, - new double[]{TableLayout.FILL, TableLayout.FILL}, - new double[]{TableLayout.FILL, TableLayout.FILL, TableLayout.FILL}, - 20, 0), - BorderLayout.CENTER); - imageExportSettingPane.setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 0)); - return imageExportSettingPane; + return column(10, + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Report_Engine_Enlarge_Or_Reduce") + ":")).weight(1), + cell(this.previewResolutionBtnS).weight(1), + cell(this.previewResolutionBtnM).weight(1) + ), + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Image_Export_Rendering_Quality") + ":")).weight(1), + cell(this.previewRenderQuality).weight(1), + cell(this.previewRenderSpeed).weight(1) + ) + ).getComponent(); } @NotNull private UIScrollPane patchScroll(JPanel generalPane) { - UIScrollPane generalPanelWithScroll = new UIScrollPane(generalPane, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - generalPanelWithScroll.setBorder(new EmptyBorder(0, 0, 0, 0)); - generalPanelWithScroll.setPreferredSize(new Dimension(generalPane.getWidth(), 600)); - return generalPanelWithScroll; + JPanel wrapperPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + wrapperPane.add(generalPane); + wrapperPane.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); + return new UIScrollPane(wrapperPane, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); } - private void createVcsSettingPane(JPanel generalPane,JPanel parentPane, CardLayout cardLayout) { + private void createVcsSettingPane(JPanel generalPane, JPanel parentPane, CardLayout cardLayout) { //迁移面板 movePanel = createMovePane(cardLayout, parentPane); generalPane.add(movePanel, BorderLayout.NORTH); - JPanel savePane = FRGUIPaneFactory.createTopVerticalTitledBorderPane(i18nText("Fine-Design_Vcs_Save_Setting")); - JPanel vcsPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane(i18nText("Fine-Design_Vcs_Clean_Setting")); - JPanel containPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - containPane.add(savePane); - containPane.add(vcsPane); - //填充一下面板 - fillPane(containPane, VCS_FILL_TOTAL); - generalPane.add(containPane, BorderLayout.CENTER); remindVcsLabel = new UILabel(i18nText("Fine-Design_Vcs_Remind")); remindVcsLabel.setVisible(!VcsHelper.getInstance().needInit()); vcsEnableCheckBox = new UICheckBox(i18nText("Fine-Design_Vcs_SaveAuto")); @@ -435,55 +434,56 @@ public class PreferencePane extends BasicPane { saveCommitCheckBox = new UICheckBox(i18nText("Fine-Design_Vcs_No_Delete")); saveIntervalEditor = new UIPositiveIntEditor(60); useIntervalCheckBox = new UICheckBox(); - savePane.add(vcsEnableCheckBox); - savePane.add(saveIntervalPane); - //gc面板 - gcControlPane = createGcControlPane(); - - JPanel enableVcsPanel = new JPanel(FRGUIPaneFactory.createLeftZeroLayout()); - enableVcsPanel.add(remindVcsLabel); - JPanel intervalPanel = new JPanel(FRGUIPaneFactory.createLeftZeroLayout()); final UILabel everyLabel = new UILabel(i18nText("Fine-Design_Vcs_Every")); final UILabel delayLabel = new UILabel(i18nText("Fine-Design_Vcs_Delay")); - intervalPanel.add(useIntervalCheckBox); - intervalPanel.add(everyLabel); - intervalPanel.add(saveIntervalEditor); - intervalPanel.add(delayLabel); + JPanel intervalPanel = row(4, + cell(useIntervalCheckBox), + cell(everyLabel), + cell(saveIntervalEditor), + cell(delayLabel) + ).getComponent(); + autoCleanPane = createAutoCleanPane(); checkAutoScheduleStartAndUpdateStatus(); - vcsEnableCheckBox.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - boolean selected = vcsEnableCheckBox.isSelected(); - if (selected && vcsEnableCheckBox.isEnabled()) { - saveCommitCheckBox.setEnabled(true); - saveIntervalEditor.setEnabled(true); - useIntervalCheckBox.setEnabled(true); - everyLabel.setEnabled(true); - delayLabel.setEnabled(true); - } else { - saveCommitCheckBox.setEnabled(false); - saveIntervalEditor.setEnabled(false); - useIntervalCheckBox.setEnabled(false); - everyLabel.setEnabled(false); - delayLabel.setEnabled(false); - } + vcsEnableCheckBox.addChangeListener(e -> { + boolean selected = vcsEnableCheckBox.isSelected(); + if (selected && vcsEnableCheckBox.isEnabled()) { + saveCommitCheckBox.setEnabled(true); + saveIntervalEditor.setEnabled(true); + useIntervalCheckBox.setEnabled(true); + everyLabel.setEnabled(true); + delayLabel.setEnabled(true); + } else { + saveCommitCheckBox.setEnabled(false); + saveIntervalEditor.setEnabled(false); + useIntervalCheckBox.setEnabled(false); + everyLabel.setEnabled(false); + delayLabel.setEnabled(false); } }); - vcsPane.add(enableVcsPanel); - vcsPane.add(intervalPanel); - if (VcsHelper.getInstance().isLegacyMode()) { - vcsPane.add(saveCommitCheckBox); - } - vcsPane.add(autoCleanPane); - boolean support = VcsHelper.getInstance().checkV2FunctionSupport(); - saveIntervalPane.setVisible(support); - autoCleanPane.setVisible(support); - if (VcsHelper.getInstance().isLegacyMode()) { - // 老版本时才显示gc选项 - vcsPane.add(gcControlPane); - } + //gc面板 + gcControlPane = createGcControlPane(); + + Component savePane = FineUIUtils.wrapComponentWithTitle(column(10, + cell(vcsEnableCheckBox), + cell(saveIntervalPane).with(it -> it.setVisible(VcsHelper.getInstance().checkV2FunctionSupport())) + ).getComponent(), i18nText("Fine-Design_Vcs_Save_Setting")); + + Component vcsPane = FineUIUtils.wrapComponentWithTitle(column(10, + cell(remindVcsLabel), + cell(intervalPanel), + cell(saveCommitCheckBox).with(it -> it.setVisible(VcsHelper.getInstance().isLegacyMode())), + cell(autoCleanPane), + cell(gcControlPane).with(it -> it.setVisible(VcsHelper.getInstance().isLegacyMode())) + ).getComponent(), i18nText("Fine-Design_Vcs_Clean_Setting")); + JPanel containPane = column(SETTING_V_GAP, + cell(savePane), + cell(vcsPane) + ).getComponent(); + //填充一下面板 + fillPane(containPane, VCS_FILL_TOTAL); + generalPane.add(containPane, BorderLayout.CENTER); } private void fillPane(JPanel containPane, int total) { @@ -557,20 +557,16 @@ public class PreferencePane extends BasicPane { } private JPanel createSaveIntervalPane() { - JPanel saveIntervalPane = new JPanel(FRGUIPaneFactory.createLeftZeroLayout()); useVcsAutoSaveScheduleCheckBox = new UICheckBox(); autoSaveIntervalEditor = new UIPositiveIntEditor(60); - saveIntervalPane.add(useVcsAutoSaveScheduleCheckBox); - saveIntervalPane.add(new UILabel(i18nText("Fine-Design_Vcs_Every"))); - saveIntervalPane.add(autoSaveIntervalEditor); - saveIntervalPane.add(new UILabel(i18nText("Fine-Design_Vcs_Save_Delay"))); - useVcsAutoSaveScheduleCheckBox.setEnabled(!VcsHelper.getInstance().isLegacyMode()); - saveIntervalPane.setVisible(false); - return saveIntervalPane; + return row(4, + cell(useVcsAutoSaveScheduleCheckBox).with(it -> it.setEnabled(!VcsHelper.getInstance().isLegacyMode())), + cell(new UILabel(i18nText("Fine-Design_Vcs_Every"))), + cell(autoSaveIntervalEditor), + cell(new UILabel(i18nText("Fine-Design_Vcs_Save_Delay"))) + ).with(it -> it.setVisible(false)).getComponent(); } - - /** * 模创建板版本gc 配置操作面板 * @@ -600,22 +596,13 @@ public class PreferencePane extends BasicPane { return gcControlPane; } - private void createFunctionPane(JPanel generalPane) { - JPanel topVerticalTitledBorderPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane(i18nText("Fine-Design_Basic_Preference_Function")); - JPanel supportUndoPanel = new JPanel(FRGUIPaneFactory.createLeftZeroVgapNormalHgapLayout()); - topVerticalTitledBorderPane.add(supportUndoPanel); - generalPane.add(topVerticalTitledBorderPane); - - + private Component createFunctionPane() { //添加supportUndo选择项 supportUndoCheckBox = new UICheckBox(i18nText("Fine-Design_Basic_Preference_Support_Undo")); - supportUndoPanel.add(supportUndoCheckBox); //添加maxUndoLimit - //String[] undoTimes = {"最大撤销次数","5次","10次","15次","20次","50次"}; String[] undoTimes = {i18nText("Fine-Design_Basic_Max_Undo_Limit"), MAX_UNDO_LIMIT_5 + i18nText("Fine-Design_Basic_Time(s)"), MAX_UNDO_LIMIT_10 + i18nText("Fine-Design_Basic_Time(s)") , MAX_UNDO_LIMIT_15 + i18nText("Fine-Design_Basic_Time(s)"), MAX_UNDO_LIMIT_20 + i18nText("Fine-Design_Basic_Time(s)"), MAX_UNDO_LIMIT_50 + i18nText("Fine-Design_Basic_Time(s)")}; maxUndoLimit = new UIComboBox(undoTimes); - supportUndoPanel.add(maxUndoLimit); //不支持撤销则不能选择撤销可缓存,也不能设置最大撤销次数 supportUndoCheckBox.addActionListener(new ActionListener() { @@ -625,32 +612,31 @@ public class PreferencePane extends BasicPane { } }); - //添加supportDefaultParentCalculate选择项 supportDefaultParentCalculateCheckBox = new UICheckBox( i18nText("Fine-Design_Basic_Preference_Support_Default_Parent_Calculate")); - topVerticalTitledBorderPane.add(supportDefaultParentCalculateCheckBox); - //添加是否展示打开模板提示缺少插件选择项 showTemplateMissingPlugin = new UICheckBox( i18nText("Fine-Design_Basic_Preference_Show-Template-Missing-Plugin")); - topVerticalTitledBorderPane.add(showTemplateMissingPlugin); startWithEmptyFile = new UICheckBox(i18nText("Fine-Design_Basic_Preference_Start_Empty_File")); - topVerticalTitledBorderPane.add(startWithEmptyFile); + + JPanel functionPanel = column(10, + row(10, + cell(supportUndoCheckBox), cell(maxUndoLimit) + ), + cell(supportDefaultParentCalculateCheckBox), + cell(showTemplateMissingPlugin), + cell(startWithEmptyFile) + ).getComponent(); + return FineUIUtils.wrapComponentWithTitle(functionPanel, i18nText("Fine-Design_Basic_Preference_Function")); } - private void createEditPane(JPanel generalPane) { + private Component createEditPane() { //samuel:编辑器设置 - JPanel editPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane(i18nText("Fine-Design_Basic_Editor_Preference")); - generalPane.add(editPane); - //设置是否支持将字符串编辑为公式 supportStringToFormulaBox = new UICheckBox(i18nText("Fine-Design_Report_Support_String_To_Formula")); - editPane.add(supportStringToFormulaBox); - //是否默认转化 defaultStringToFormulaBox = new UICheckBox(i18nText("Fine-Design_Basic_Always")); - //不支持转化则不能默认执行 supportStringToFormulaBox.addActionListener(new ActionListener() { @Override @@ -658,16 +644,8 @@ public class PreferencePane extends BasicPane { defaultStringToFormulaBox.setEnabled(supportStringToFormulaBox.isSelected()); } }); - JPanel keyStrokePane = new JPanel(new BorderLayout()); - keyStrokePane.add(new UILabel(i18nText("Fine-Design_Basic_Support_Auto_Complete_Shortcut") + ":"), BorderLayout.WEST); + UILabel shortCutInfoLabel = new UILabel(i18nText("Fine-Design_Basic_Support_Auto_Complete_Shortcut") + ":"); shortCutLabel = new UILabel(); - keyStrokePane.add(shortCutLabel, BorderLayout.CENTER); - keyStrokePane.setBorder(new EmptyBorder(0, 10,0,0)); - - JPanel defaultExecutePane = new JPanel(FRGUIPaneFactory.createLeftZeroVgapNormalHgapLayout()); - defaultExecutePane.add(defaultStringToFormulaBox); - defaultExecutePane.add(keyStrokePane); - editPane.add(defaultExecutePane); shortCutLabel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { @@ -683,6 +661,16 @@ public class PreferencePane extends BasicPane { } } }); + JPanel editPanel = column(10, + cell(supportStringToFormulaBox), + row( + cell(defaultStringToFormulaBox), + fix(10), + cell(shortCutInfoLabel), + cell(shortCutLabel) + ) + ).getComponent(); + return FineUIUtils.wrapComponentWithTitle(editPanel, i18nText("Fine-Design_Basic_Editor_Preference")); } private class KeyStrokePane extends BasicPane { @@ -726,37 +714,27 @@ public class PreferencePane extends BasicPane { } - private void createColorSettingPane(JPanel generalPane) { + private Component createColorSettingPane() { // Color Setting Pane - JPanel colorSettingPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Preference_Setting_Colors")); - generalPane.add(colorSettingPane); - gridLineColorTBButton = new UINoThemeColorButton(IOUtils.readIcon("/com/fr/design/images/gui/color/foreground.png")); gridLineColorTBButton.setEnabled(this.isEnabled()); paginationLineColorTBButton = new UINoThemeColorButton(IOUtils.readIcon("/com/fr/design/images/gui/color/foreground.png")); paginationLineColorTBButton.setEnabled(this.isEnabled()); - JPanel leftPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - leftPane.add(new UILabel(i18nText("Fine-Design_Basic_Preference_Grid_Line_Color") + ":")); - leftPane.add(gridLineColorTBButton); - JPanel rightPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - rightPane.add(new UILabel(i18nText("Fine-Design_Basic_Preference_Pagination_Line_Color") + ":")); - rightPane.add(paginationLineColorTBButton); - colorSettingPane.add(leftPane); - colorSettingPane.add(rightPane); + JPanel colorPanel = row(10, + cell(new UILabel(i18nText("Fine-Design_Basic_Preference_Grid_Line_Color") + ":")), + cell(gridLineColorTBButton), + cell(new UILabel(i18nText("Fine-Design_Basic_Preference_Pagination_Line_Color") + ":")), + cell(paginationLineColorTBButton) + ).getComponent(); + return FineUIUtils.wrapComponentWithTitle(colorPanel, i18nText("Fine-Design_Basic_Preference_Setting_Colors")); } - private void createLogPane(JPanel advancePane) { + private Component createLogPane() { //richer:选择导出log文件的目录. - JPanel logPane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); - advancePane.add(logPane); - JPanel logExportPane = FRGUIPaneFactory.createTitledBorderPane("log" + i18nText("Fine-Design_Basic_Export_Setting")); - logPane.add(logExportPane); UILabel logLabel = new UILabel(i18nText("Fine-Design_Basic_Select_Export_Log_Directory") + ":"); - logExportPane.add(logLabel, BorderLayout.WEST); logExportDirectoryField = new UITextField(24); - logExportPane.add(logExportDirectoryField, BorderLayout.CENTER); UIButton chooseDirBtn = new UIButton("..."); logExportPane.add(chooseDirBtn, BorderLayout.EAST); chooseDirBtn.setPreferredSize(new Dimension(25, 25)); @@ -773,46 +751,40 @@ public class PreferencePane extends BasicPane { } } }); - - JPanel logLevelPane = FRGUIPaneFactory.createTitledBorderPane("log" + i18nText("Fine-Design_Basic_Level_Setting")); - logPane.add(logLevelPane); + UILabel logLevelLabel = new UILabel("Log" + i18nText("Fine-Design_Basic_Level_Setting")); logLevelComboBox = new UIComboBox(LOG); logLevelComboBox.setEnabled(WorkContext.getCurrent().isLocal()); - logLevelPane.add(logLevelComboBox); + JPanel logPanel = row(10, + cell(logLabel), + cell(logExportDirectoryField), + cell(chooseDirBtn), + cell(logLevelLabel), + cell(logLevelComboBox) + ).getComponent(); + return FineUIUtils.wrapComponentWithTitle(logPanel, "Log" + i18nText("Fine-Design_Basic_Export_Setting")); } - private void createLanPane(JPanel generalPane) { + private Component createLanPane() { // ben:选择版本语言; - JPanel languageAndDashBoard_pane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); - JPanel LanguagePane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Choose_Language")); - generalPane.add(languageAndDashBoard_pane); - languageAndDashBoard_pane.add(LanguagePane); - languageComboBox = createLanguageComboBox(); - ActionLabel languageLabel = new ActionLabel(i18nText("Fine-Design_Basic_Designer_Language")); - languageLabel.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - final LocalePane localePane = new LocalePane(); - BasicDialog dlg = localePane.showLargeWindow(SwingUtilities.getWindowAncestor(PreferencePane.this), new DialogActionAdapter() { - @Override - public void doOk() { - localePane.save(); - } - }); - dlg.setVisible(true); - } + languageLabel.addActionListener(e -> { + final LocalePane localePane = new LocalePane(); + BasicDialog dlg = localePane.showLargeWindow(SwingUtilities.getWindowAncestor(PreferencePane.this), new DialogActionAdapter() { + @Override + public void doOk() { + localePane.save(); + } + }); + dlg.setVisible(true); }); UILabel noticeLabel = new UILabel(i18nText("Fine-Design_Basic_Work_After_Restart_Designer"));//sail:提示重启后生效 - double p = TableLayout.PREFERRED; - double[] rowSize = {p}; - double[] columnSize = {p, p, p}; - Component[][] components = { - {languageLabel, languageComboBox, noticeLabel}, - }; - JPanel choosePane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); - LanguagePane.add(choosePane); + JPanel langPanel = row(10, + cell(languageLabel), + cell(languageComboBox), + cell(noticeLabel) + ).getComponent(); + return FineUIUtils.wrapComponentWithTitle(langPanel, i18nText("Fine-Design_Basic_Choose_Language")); } private UIDictionaryComboBox createLanguageComboBox() { @@ -832,19 +804,15 @@ public class PreferencePane extends BasicPane { return languageComboBox; } - private void createStartupPagePane(JPanel generalPane) { - - // ben:选择版本语言; - JPanel startupPagePaneWrapper = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); - JPanel startupPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane(Toolkit.i18nText("Fine-Design_Startup_Page_Config")); - generalPane.add(startupPagePaneWrapper); - startupPagePaneWrapper.add(startupPane); - + private Component createStartupPagePane() { startupPageEnabledCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Startup_Page_Config_Check_Text")); - startupPane.add(startupPageEnabledCheckBox); UILabel descLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Startup_Page_Config_Desc"), PREFERENCE_LABEL_MAX_WIDTH); - descLabel.setForeground(new Color(51, 51, 52, (int)Math.round(0.5 * 255))); - startupPane.add(descLabel); + FineUIStyle.setStyle(descLabel, FineUIStyle.LABEL_TIP); + JPanel startPanel = column(10, + cell(startupPageEnabledCheckBox), + cell(descLabel) + ).getComponent(); + return FineUIUtils.wrapComponentWithTitle(startPanel, i18nText("Fine-Design_Startup_Page_Config")); } private String getDisplayShortCut(String shotrCut) { @@ -860,60 +828,44 @@ public class PreferencePane extends BasicPane { } - private void createLengthPane(JPanel advancePane) { - double p = TableLayout.PREFERRED; - double[] rowSize = {p}; - + private Component createLengthPane() { // 长度单位选择 - JPanel lengthPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Setting_Ruler_Units")); - advancePane.add(lengthPane); pageLengthComboBox = new UIComboBox(new String[]{i18nText("Fine-Design_Basic_Page_Setup_MM"), i18nText("Fine-Design_Report_Unit_CM"), i18nText("Fine-Design_Report_Unit_INCH")}); - pageLengthComboBox.setPreferredSize(new Dimension(80, 20)); - pageLengthComboBox.setMinimumSize(new Dimension(80, 20)); reportLengthComboBox = new UIComboBox(UnitConvertUtil.getUnitItems()); - reportLengthComboBox.setPreferredSize(new Dimension(80, 20)); - reportLengthComboBox.setMinimumSize(new Dimension(80, 20)); - UILabel pagelengthLabel = new UILabel(i18nText("Fine-Design_Basic_Page_Setup_Scale_Units") + ":"); + UILabel pageLengthLabel = new UILabel(i18nText("Fine-Design_Basic_Page_Setup_Scale_Units") + ":"); UILabel reportLengthLabel = new UILabel(i18nText("Fine-Design_Basic_Report_Design_Ruler_Units") + ":"); - Component[][] lengthComponents = { - {pagelengthLabel, pageLengthComboBox, reportLengthLabel, reportLengthComboBox}, - }; - JPanel chooseLengthPane = TableLayoutHelper.createTableLayoutPane(lengthComponents, rowSize, new double[]{p, p, p, p}); - lengthPane.add(chooseLengthPane); + JPanel lengthPane = row(10, + cell(pageLengthLabel), + cell(pageLengthComboBox), + cell(reportLengthLabel), + cell(reportLengthComboBox) + ).getComponent(); + return FineUIUtils.wrapComponentWithTitle(lengthPane, i18nText("Fine-Design_Basic_Setting_Ruler_Units")); } - private void createServerPane(JPanel advancePane) { - double p = TableLayout.PREFERRED; - double[] rowSize = {p}; - double[] columnSize = {p, p, p}; - - JPanel serverPortPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Web_Preview_Port_Setting")); - advancePane.add(serverPortPane); + private Component createServerPane() { portEditor = new IntegerEditor(); - portEditor.setPreferredSize(new Dimension(80, 20)); - portEditor.setMinimumSize(new Dimension(80, 20)); UILabel notiJlabel = new UILabel(i18nText("Fine-Design_Basic_Work_After_Restart_Designer")); UILabel serverPortLabel = new UILabel(i18nText("Fine-Design_Basic_Web_Preview_Port") + ":"); - Component[][] portComponents = { - {serverPortLabel, portEditor, notiJlabel}, - }; - JPanel choosePortPane = TableLayoutHelper.createTableLayoutPane(portComponents, rowSize, columnSize); - serverPortPane.add(choosePortPane, BorderLayout.CENTER); + JPanel serverPane = row(10, + cell(serverPortLabel), + cell(portEditor), + cell(notiJlabel) + ).getComponent(); + return FineUIUtils.wrapComponentWithTitle(serverPane, i18nText("Fine-Design_Basic_Web_Preview_Port_Setting")); } - private JPanel createMemoryPane() { - JPanel memoryPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Preference_Caching_Template")); + private Component createMemoryPane() { UILabel memoryLabel = new UILabel(i18nText("Fine-Design_Basic_Preference_Max_Caching_Template")); UILabel memoryTipLabel = FRWidgetFactory.createLineWrapLabel( i18nText("Fine-Design_Basic_Preference_Caching_Template_Tip"), MEMORY_TIP_LABEL_MAX_WIDTH); - memoryTipLabel.setBorder(BorderFactory.createEmptyBorder(0, CACHING_GAP, 0, 0)); cachingTemplateSpinner = new UISpinner(0, CACHING_MAX, 1, CACHING_DEFAULT); - JPanel memorySpace = new JPanel(FRGUIPaneFactory.createLeftZeroLayout()); - memorySpace.add(memoryLabel); - memorySpace.add(cachingTemplateSpinner); - memorySpace.add(memoryTipLabel); - memoryPane.add(memorySpace); - return memoryPane; + JPanel memoryPane = row(5, + cell(memoryLabel), + cell(cachingTemplateSpinner), + cell(memoryTipLabel) + ).getComponent(); + return FineUIUtils.wrapComponentWithTitle(memoryPane, i18nText("Fine-Design_Basic_Preference_Caching_Template")); } @Override @@ -1286,7 +1238,7 @@ public class PreferencePane extends BasicPane { @Override public BasicDialog showWindow(Window window, DialogActionListener l) { - return showWindowWithCustomSize(window, l, new Dimension(BasicDialog.DEFAULT.width, this.getPreferredSize().height + OFFSET_HEIGHT)); + return showWindowWithCustomSize(window, l, new Dimension(BasicDialog.DEFAULT.width, BasicDialog.DEFAULT.height + OFFSET_HEIGHT)); } private void tryGc() { diff --git a/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java b/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java index d94e8ea5c3..30d288fc18 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java @@ -1,5 +1,7 @@ package com.fr.design.actions.help; +import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIStyle; import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.layout.FRGUIPaneFactory; @@ -41,6 +43,7 @@ public class AboutDialog extends JDialog implements ActionListener { this.setContentPane(defaultPane); okButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_OK")); + FineUIStyle.setStyle(okButton, FineUIStyle.STYLE_PRIMARY); okButton.addActionListener(this); tabbedPane = new UITabbedPane(); diff --git a/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java b/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java index dbb7798f3b..a57b86f205 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java @@ -3,6 +3,8 @@ */ package com.fr.design.actions.help; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.FRContext; import com.fr.base.GraphHelper; import com.fr.design.DesignerEnvManager; @@ -31,6 +33,8 @@ import java.awt.event.MouseEvent; import java.net.URI; import java.util.Locale; +import static com.fine.swing.ui.layout.Layouts.column; + public class AboutPane extends JPanel { private static final String FINEREPORT = "FineReport"; private static final int DEFAULT_GAP = 12; @@ -49,10 +53,11 @@ public class AboutPane extends JPanel { com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Copy_Build_NO") + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Copy_Build_NO_OK")); //center panel - JPanel centerPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); + JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + centerPane.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); this.add(centerPane, BorderLayout.CENTER); - JPanel contentPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + JPanel contentPane = column().getComponent(); centerPane.add(contentPane, BorderLayout.NORTH); contentPane.add(new BoxCenterAligmentPane(getBuildTitle())); @@ -325,7 +330,7 @@ public class AboutPane extends JPanel { }); this.lastLabel = new UILabel(descriptions[0]); - lastLabel.setForeground(Color.lightGray); + FineUIStyle.setStyle(lastLabel, FineUIStyle.LABEL_TIP); centerPane.add(lastLabel); add(centerPane, BorderLayout.CENTER); diff --git a/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java b/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java index d8263af1a6..a86bc70e05 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java @@ -3,7 +3,6 @@ package com.fr.design.gui.style; import com.fine.theme.utils.FineUIStyle; import com.fine.theme.utils.FineUIUtils; import com.fr.base.CoreDecimalFormat; -import com.fr.base.GraphHelper; import com.fr.base.Style; import com.fr.base.TextFormat; import com.fr.data.core.FormatField; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsMovePanel.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsMovePanel.java index b8736ae3e2..8340b53e01 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsMovePanel.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsMovePanel.java @@ -27,7 +27,6 @@ import com.fr.stable.StringUtils; import com.fr.workspace.server.vcs.v2.move.VcsMoveService; import com.fr.workspace.server.vcs.v2.move.VcsMoveStrategy; -import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -45,6 +44,7 @@ import java.awt.event.MouseEvent; import java.util.List; import java.util.concurrent.ExecutionException; +import static com.fine.swing.ui.layout.Layouts.row; import static javax.swing.JOptionPane.YES_OPTION; @@ -61,8 +61,6 @@ public class VcsMovePanel extends BasicPane { .applySize(14) .applyStyle(FRFont.BOLD); -// private static final Color BACK_GROUND_COLOR = new Color(202,232,255); - //提示字体的颜色,直接模仿其他面板的写法 private static final Color TIP_COLOR = new Color(51, 51, 52, (int)Math.round(0.5 * 255)); @@ -138,8 +136,7 @@ public class VcsMovePanel extends BasicPane { this.callBack = callBack; this.setLayout(new BorderLayout()); this.parentDialog = parentDialog; - updatePane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(); - updatePane.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 0)); + updatePane = row(10).getComponent(); //初始化顶部的面板 initVcsLabel(updatePane); //initVcsChoosePane @@ -261,12 +258,10 @@ public class VcsMovePanel extends BasicPane { private void initVcsLabel(JPanel parent) { parent.removeAll(); if (!VcsHelper.getInstance().isLegacyMode()) { -// parent.setBackground(ThemeUtils.BACK_COLOR); centerButton = new UIButton(Toolkit.i18nText("Fine-Design_Vcs_Center")); parent.add(centerButton); initVcsCenterListener(); } else { -// parent.setBackground(BACK_GROUND_COLOR); vcsUpdateExistLabel = new UILabel(IconUtils.readIcon("/com/fr/design/vcs/vcs_move_icon.svg")); vcsUpdateExistLabel.setText(Toolkit.i18nText("Fine-Design_Vcs_Can_Update")); vcsUpdateFireLabel = new UILabel(Toolkit.i18nText("Fine-Design_Vcs_Update")); From db6489c34a5f24efa8b82c55c739aff000911c1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 15 May 2024 11:45:30 +0800 Subject: [PATCH 157/302] =?UTF-8?q?REPORT-111995=20=E3=80=90NewUI=E3=80=91?= =?UTF-8?q?=E6=96=87=E4=BB=B6-=E9=80=89=E9=A1=B9=E5=92=8C=E5=B8=AE?= =?UTF-8?q?=E5=8A=A9=E9=9D=A2=E6=9D=BF=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/actions/file/PreferencePane.java | 3 +-- .../main/java/com/fr/design/actions/help/AboutDialog.java | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java index 505ece7fb8..e2b11c176c 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java @@ -736,7 +736,6 @@ public class PreferencePane extends BasicPane { UILabel logLabel = new UILabel(i18nText("Fine-Design_Basic_Select_Export_Log_Directory") + ":"); logExportDirectoryField = new UITextField(24); UIButton chooseDirBtn = new UIButton("..."); - logExportPane.add(chooseDirBtn, BorderLayout.EAST); chooseDirBtn.setPreferredSize(new Dimension(25, 25)); chooseDirBtn.addActionListener(new ActionListener() { @Override @@ -1434,7 +1433,7 @@ public class PreferencePane extends BasicPane { */ private UIButton initGcButton() { UIButton gcButton = new UIButton(i18nText("Fine-Design_Vcs_Clean")); - gcButton.setPreferredSize(new Dimension(100, 15)); + gcButton.setPreferredSize(FineUIScale.scale(new Dimension(100, 15))); gcButton.setRoundBorder(true, Constants.LEFT); return gcButton; } diff --git a/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java b/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java index 30d288fc18..121d9ece9c 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java @@ -39,7 +39,7 @@ public class AboutDialog extends JDialog implements ActionListener { this.setTitle(ProductConstants.PRODUCT_NAME); this.setResizable(false); - JPanel defaultPane=FRGUIPaneFactory.createBorderLayout_L_Pane(); + JPanel defaultPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); this.setContentPane(defaultPane); okButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_OK")); @@ -66,7 +66,7 @@ public class AboutDialog extends JDialog implements ActionListener { //esp. InputMap inputMapAncestor = defaultPane.getInputMap( - JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); ActionMap actionMap = defaultPane.getActionMap(); //transfer focus to CurrentEditor @@ -79,7 +79,7 @@ public class AboutDialog extends JDialog implements ActionListener { this.getRootPane().setDefaultButton(okButton); - this.setSize(defaultPane.getPreferredSize().width, 600); + this.setSize(FineUIScale.scale(new Dimension(defaultPane.getPreferredSize().width, 600))); GUICoreUtils.centerWindow(this); } From 3399f9fdb6ddcfc568e5e5565173755f0665332b Mon Sep 17 00:00:00 2001 From: vito Date: Wed, 22 May 2024 16:25:25 +0800 Subject: [PATCH 158/302] =?UTF-8?q?REPORT-113994=20fix:=20bbs=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E6=8D=9F=E5=9D=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/com/fine/theme/icon/toolbar/bbs.svg | 4 +--- .../resources/com/fine/theme/icon/toolbar/bbs_disable.svg | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bbs.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bbs.svg index 6c01e3bc3f..bcbb7bb33d 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bbs.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bbs.svg @@ -1,5 +1,3 @@ - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bbs_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bbs_disable.svg index d77d19464d..d0d531f1d8 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bbs_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/bbs_disable.svg @@ -1,5 +1,3 @@ - + From d1f5f4abfe02fc6b3670d853b13654743271ba60 Mon Sep 17 00:00:00 2001 From: vito Date: Mon, 3 Jun 2024 20:43:51 +0800 Subject: [PATCH 159/302] =?UTF-8?q?REPORT-113994=20bugfix:=20flex=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E5=BA=94=E7=94=A8=E4=BF=AE=E5=A4=8D=E6=BB=9A=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/actions/file/PreferencePane.java | 19 +++++++++++++------ .../java/com/fr/design/widget/WidgetPane.java | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java index e2b11c176c..8ac946f423 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java @@ -85,7 +85,15 @@ import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dialog; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; @@ -277,7 +285,7 @@ public class PreferencePane extends BasicPane { JPanel contentPane = this; contentPane.setLayout(FRGUIPaneFactory.createBorderLayout()); UITabbedPane tabPane = new UITabbedPane(); - contentPane.add(tabPane, BorderLayout.NORTH); + contentPane.add(tabPane, BorderLayout.CENTER); // 常用面板 JPanel generalPane = column(SETTING_V_GAP, // 功能设置 @@ -416,10 +424,9 @@ public class PreferencePane extends BasicPane { @NotNull private UIScrollPane patchScroll(JPanel generalPane) { - JPanel wrapperPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - wrapperPane.add(generalPane); - wrapperPane.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); - return new UIScrollPane(wrapperPane, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + UIScrollPane uiScrollPane = new UIScrollPane(generalPane, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + uiScrollPane.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); + return uiScrollPane; } private void createVcsSettingPane(JPanel generalPane, JPanel parentPane, CardLayout cardLayout) { diff --git a/designer-realize/src/main/java/com/fr/design/widget/WidgetPane.java b/designer-realize/src/main/java/com/fr/design/widget/WidgetPane.java index 9cbcc66b8d..80ba33ef26 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/WidgetPane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/WidgetPane.java @@ -81,7 +81,7 @@ public class WidgetPane extends AbstractAttrNoScrollPane implements ItemListener this.add(column( 10, cell(northPane), - cell(cellEditorCardPane) + cell(cellEditorCardPane).weight(1) ).getComponent() ); } From dd7f075f16fa1fad0e798bebd14c84e9dba6d97c Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 13 Jun 2024 14:21:45 +0800 Subject: [PATCH 160/302] =?UTF-8?q?REPORT-114888=20icon=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=89=BE=E5=88=B0=5Fdisable=E5=9B=BE=E6=A0=87=E6=97=B6?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=B3=BB=E7=BB=9F=E9=BB=98=E8=AE=A4=E7=81=B0?= =?UTF-8?q?=E5=8C=96=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/icon/AbstractIconSource.java | 8 ++-- .../com/fine/theme/icon/UrlIconResource.java | 22 +++++++-- .../java/com/fine/theme/icon/svg/SvgIcon.java | 36 ++++++++++++-- .../fr/design/gui/storybook/DebugStory.java | 21 +++++++++ .../fr/design/gui/storybook/Storybook.java | 47 +++++++++---------- 5 files changed, 100 insertions(+), 34 deletions(-) create mode 100644 designer-base/src/test/java/com/fr/design/gui/storybook/DebugStory.java diff --git a/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java b/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java index 1eb6c18637..98601b0bba 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java +++ b/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java @@ -24,7 +24,7 @@ import java.awt.Dimension; @Immutable public abstract class AbstractIconSource implements IconSource { - private static final String ICON_DISABLE_SUFFIX = "_disable"; + public static final String ICON_DISABLE_SUFFIX = "_disable"; protected String id; @@ -100,8 +100,10 @@ public abstract class AbstractIconSource implements IconSource 1) { + SVGLoader loader = new SVGLoader(); + SVGDocument document = loader.load(new UrlIconResource(names[0] + names[1]).getInputStream()); + if (document != null) { + document.render((JComponent) c, grayGraphics(g), + new ViewBox(x, y, scaleSize.width, scaleSize.height)); + } + } + } } private Graphics2D grayGraphics(Graphics g) { @@ -92,7 +115,7 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { return scaleSize.height; } - private void render(Component c, Graphics g, int x, int y) { + private void render(Component c, Graphics g, int x, int y, FallbackRender fallbackRender) { try { if (type == IconType.white) { Objects.requireNonNull(whiteSvgDocument.getValue()) @@ -103,6 +126,7 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { } } catch (Exception e) { FineLoggerFactory.getLogger().error("SvgIcon from url: " + resource + "can not paint.", e); + fallbackRender.render(c, g, x, y); } } @@ -141,4 +165,10 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { public @NotNull SvgIcon disabled() { return new SvgIcon(resource, size, IconType.disable); } + + + @FunctionalInterface + interface FallbackRender { + void render(Component c, Graphics g, int x, int y); + } } diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/DebugStory.java b/designer-base/src/test/java/com/fr/design/gui/storybook/DebugStory.java new file mode 100644 index 0000000000..ef000aabe5 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/DebugStory.java @@ -0,0 +1,21 @@ +package com.fr.design.gui.storybook; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 单面板调试注解,如果components目录下带有这个注解, + * 那么Storybook中只有带有这个注解的界面被展示 + * + * @author vito + * @since 11.0 + * Created on 2024/6/11 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@Inherited +public @interface DebugStory { +} diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/Storybook.java b/designer-base/src/test/java/com/fr/design/gui/storybook/Storybook.java index 635b342c15..d8b09ca523 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/Storybook.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/Storybook.java @@ -9,6 +9,7 @@ import com.formdev.flatlaf.extras.FlatAnimatedLafChange; import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.formdev.flatlaf.util.UIScale; import com.fr.design.gui.UILookAndFeel; +import com.fr.third.org.reflections.Reflections; import com.fr.value.NotNullLazyValue; import javax.swing.DefaultListCellRenderer; @@ -29,11 +30,10 @@ import java.awt.BorderLayout; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; -import java.io.File; -import java.net.URISyntaxException; -import java.net.URL; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import static com.fine.swing.ui.layout.Layouts.cell; @@ -108,33 +108,30 @@ public class Storybook { private StoryBookComponent[] components() { ArrayList components = new ArrayList<>(); - for (String s : getClasses()) { - components.add(new StoryBookComponent(s.replace("StoryBoard", ""), COMPONENTS_PACKAGE + s)); + List> componentList = getDebugClasses(); + if (componentList.isEmpty()) { + componentList = getClasses(); + } + for (Class s : componentList) { + components.add( + new StoryBookComponent(s.getSimpleName().replace("StoryBoard", ""), s.getTypeName())); } return components.toArray(new StoryBookComponent[0]); } - private static List getClasses() { - List classNames = new ArrayList<>(); - URL resource = Storybook.class.getResource(COMPONENTS_DIR); - try { - File folder = new File(resource.toURI()); - File[] files = folder.listFiles(); - if (files != null) { - for (File file : files) { - if (file.isFile() && file.getName().endsWith(".class")) { - String className = file.getName().replace(".class", ""); - if (isStory(className)) { - classNames.add(className); - } - } - } - } - return classNames.stream().sorted().collect(Collectors.toList()); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } + private static List> getClasses() { + Reflections reflections = new Reflections("com.fr.design.gui.storybook.components"); + Set> storyClass = reflections.getTypesAnnotatedWith(Story.class); + Set> classSet = reflections.getSubTypesOf(StoryBoard.class); + storyClass.addAll(classSet); + return storyClass.stream().sorted(Comparator.comparing(Class::getSimpleName)).collect(Collectors.toList()); + } + + private static List> getDebugClasses() { + Reflections reflections = new Reflections("com.fr.design.gui.storybook.components"); + Set> types = reflections.getTypesAnnotatedWith(DebugStory.class); + return new ArrayList<>(types); } /** From 3ccf99e1e98d776da3dbc100b3f4178e9e185339 Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 13 Jun 2024 21:38:50 +0800 Subject: [PATCH 161/302] =?UTF-8?q?REPORT-114888=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E6=80=A7=E8=83=BD=E5=AE=8C=E5=96=84=E5=8D=95?= =?UTF-8?q?=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/icon/AbstractIconSource.java | 14 ---- .../java/com/fine/theme/icon/IconManager.java | 12 +++ .../java/com/fine/theme/icon/JsonIconSet.java | 16 ++-- .../com/fine/theme/icon/UrlIconResource.java | 22 +----- .../java/com/fine/theme/icon/svg/SvgIcon.java | 26 ++++--- .../icon/filetree/filetype/add_report.svg | 2 +- .../filetree/filetype/add_report_disable.svg | 0 .../theme/icon/filetree/filetype/add_word.svg | 4 +- .../filetree/filetype/add_word_disable.svg | 7 +- .../theme/icon/filetree/filetype/bmpFile.svg | 8 +- .../filetree/filetype/bmpFile_disable.svg | 6 +- .../theme/icon/filetree/filetype/chtFile.svg | 1 + .../filetree/filetype/chtFile_disable.svg | 0 .../icon/filetree/filetype/classFile.svg | 3 +- .../filetree/filetype/classFile_disable.svg | 2 +- .../icon/filetree/filetype/cpt_locked.svg | 3 +- .../filetree/filetype/cpt_locked_disable.svg | 0 .../theme/icon/filetree/filetype/csvFile.svg | 9 +++ .../filetree/filetype/csvFile_disable.svg | 9 +++ .../icon/filetree/filetype/excelFile.svg | 3 +- .../filetree/filetype/excelFile_disable.svg | 2 +- .../icon/filetree/filetype/excel_import.svg | 2 +- .../filetype/excel_import_disable.svg | 2 +- .../icon/filetree/filetype/flashFile.svg | 6 +- .../filetree/filetype/flashFile_disable.svg | 4 +- .../icon/filetree/filetype/frm_locked.svg | 2 +- .../filetree/filetype/frm_locked_disable.svg | 2 +- .../theme/icon/filetree/filetype/gifFile.svg | 7 +- .../filetree/filetype/gifFile_disable.svg | 6 +- .../theme/icon/filetree/filetype/htmlFile.svg | 11 ++- .../filetree/filetype/htmlFile_disable.svg | 9 +-- .../theme/icon/filetree/filetype/jarFile.svg | 7 +- .../filetree/filetype/jarFile_disable.svg | 6 +- .../theme/icon/filetree/filetype/javaFile.svg | 9 ++- .../filetree/filetype/javaFile_disable.svg | 8 +- .../theme/icon/filetree/filetype/jpgFile.svg | 7 +- .../filetree/filetype/jpgFile_disable.svg | 6 +- .../theme/icon/filetree/filetype/jsFile.svg | 5 +- .../icon/filetree/filetype/jsFile_disable.svg | 4 +- .../theme/icon/filetree/filetype/jspFile.svg | 7 +- .../filetree/filetype/jspFile_disable.svg | 6 +- .../theme/icon/filetree/filetype/pdfFile.svg | 7 +- .../filetree/filetype/pdfFile_disable.svg | 6 +- .../theme/icon/filetree/filetype/pngFile.svg | 7 +- .../filetree/filetype/pngFile_disable.svg | 6 +- .../theme/icon/filetree/filetype/sqlFile.svg | 19 ++--- .../filetree/filetype/sqlFile_disable.svg | 15 ++-- .../theme/icon/filetree/filetype/wordFile.svg | 2 +- .../filetree/filetype/wordFile_disable.svg | 7 +- .../theme/icon/filetree/filetype/xlsFile.svg | 2 +- .../filetree/filetype/xlsFile_disable.svg | 4 +- .../theme/icon/filetree/filetype/xmlFile.svg | 8 +- .../filetree/filetype/xmlFile_disable.svg | 6 +- .../fine/theme/light/ui/fine_light.icon.json | 4 +- .../storybook/components/IconStoryBoard.java | 73 +++++++++++-------- 55 files changed, 239 insertions(+), 192 deletions(-) mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/csvFile.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/csvFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile_disable.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile.svg mode change 100755 => 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java b/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java index 98601b0bba..2ced39c685 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java +++ b/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java @@ -24,8 +24,6 @@ import java.awt.Dimension; @Immutable public abstract class AbstractIconSource implements IconSource { - public static final String ICON_DISABLE_SUFFIX = "_disable"; - protected String id; protected final IconResource resource; @@ -98,13 +96,6 @@ public abstract class AbstractIconSource implements IconSource implements IconSource ICON_SETS = new ArrayList<>(2); private static final HashMap> CACHE = new HashMap<>(64); @@ -149,4 +150,15 @@ public class IconManager { public static void clearCache() { CACHE.clear(); } + + /** + * 查找灰化图标 + * + * @param path 原始路径 + * @return 灰化路径 + */ + public static String findDisablePath(String path) { + int i = path.lastIndexOf('.'); + return path.substring(0, i) + ICON_DISABLE_SUFFIX + path.substring(i); + } } diff --git a/designer-base/src/main/java/com/fine/theme/icon/JsonIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/JsonIconSet.java index f341317d0c..a7b774d0f4 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/JsonIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/icon/JsonIconSet.java @@ -60,7 +60,12 @@ public class JsonIconSet extends AbstractIconSet { if (value instanceof String) { String path = (String) value; if (IconManager.isSvgIcon(path)) { - addIcon(new SvgIconSource(key, base + path)); + // 默认字符串提供正常图和灰化图 + addIcon(new SvgIconSource(key, + base + path, + IconManager.findDisablePath(base + path), + null + )); } else if (IconManager.isImageIcon(path)) { addIcon(new ImageIconSource(key, base + path)); } @@ -74,21 +79,20 @@ public class JsonIconSet extends AbstractIconSet { if (IconManager.isSvgIcon(normalPath)) { addIcon(new SvgIconSource(key, base + normalPath, - base + disablePath, - base + whitePath + StringUtils.isNotBlank(disablePath) ? base + disablePath : null, + StringUtils.isNotBlank(whitePath) ? base + whitePath : null )); } else if (IconManager.isImageIcon(normalPath)) { addIcon(new ImageIconSource(key, base + normalPath, - base + disablePath, - base + whitePath + StringUtils.isNotBlank(disablePath) ? base + disablePath : null, + StringUtils.isNotBlank(whitePath) ? base + whitePath : null )); } } } - @Override public boolean equals(Object o) { if (this == o) { diff --git a/designer-base/src/main/java/com/fine/theme/icon/UrlIconResource.java b/designer-base/src/main/java/com/fine/theme/icon/UrlIconResource.java index 8a7874ab4e..61746e3bf5 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/UrlIconResource.java +++ b/designer-base/src/main/java/com/fine/theme/icon/UrlIconResource.java @@ -28,30 +28,14 @@ public class UrlIconResource implements IconResource { return path; } - /** - * 资源是否可访问 - * - * @return 是否可访问 - */ - public boolean isReachable() { - try (InputStream inputStream = getInputStream(path)) { - return inputStream != null; - } catch (Exception e) { - return false; - } - } - @Override @NotNull public InputStream getInputStream() { - try (InputStream inputStream = getInputStream(path)) { - if (inputStream == null) { - throw new IconException("Icon load failed: " + path); - } - return inputStream; - } catch (Exception e) { + InputStream inputStream = getInputStream(path); + if (inputStream == null) { throw new IconException("Icon load failed: " + path); } + return inputStream; } diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java index bac68dc4a6..331c028a17 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java @@ -1,8 +1,8 @@ package com.fine.theme.icon.svg; -import com.fine.theme.icon.AbstractIconSource; import com.fine.theme.icon.DisabledIcon; import com.fine.theme.icon.GraphicsFilter; +import com.fine.theme.icon.IconManager; import com.fine.theme.icon.IconResource; import com.fine.theme.icon.IconType; import com.fine.theme.icon.UrlIconResource; @@ -26,7 +26,6 @@ import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.RGBImageFilter; -import java.util.Objects; import java.util.StringJoiner; import static com.fine.theme.utils.FineUIScale.scale; @@ -50,6 +49,7 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { private final IconResource resource; private final IconType type; + private final static NullableLazyValue defaultDoc = NullableLazyValue.createValue(SvgIcon::loadDefault); private final NullableLazyValue svgDocument = NullableLazyValue.createValue(() -> load(IconType.normal)); private final NullableLazyValue whiteSvgDocument = NullableLazyValue.createValue(() -> load(IconType.white)); @@ -84,8 +84,8 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { private void fallbackRender(Component c, Graphics g, int x, int y) { if (resource instanceof UrlIconResource) { String path = ((UrlIconResource) resource).getPath(); - String[] names = path.split(AbstractIconSource.ICON_DISABLE_SUFFIX); - if (path.contains(AbstractIconSource.ICON_DISABLE_SUFFIX) && names.length > 1) { + String[] names = path.split(IconManager.ICON_DISABLE_SUFFIX); + if (path.contains(IconManager.ICON_DISABLE_SUFFIX) && names.length == 2) { SVGLoader loader = new SVGLoader(); SVGDocument document = loader.load(new UrlIconResource(names[0] + names[1]).getInputStream()); if (document != null) { @@ -116,20 +116,29 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { } private void render(Component c, Graphics g, int x, int y, FallbackRender fallbackRender) { + SVGDocument document; try { if (type == IconType.white) { - Objects.requireNonNull(whiteSvgDocument.getValue()) - .render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, scaleSize.width, scaleSize.height)); + document = whiteSvgDocument.getValue(); } else { - Objects.requireNonNull(svgDocument.getValue()) - .render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, scaleSize.width, scaleSize.height)); + document = svgDocument.getValue(); } + if (document == null) { + document = defaultDoc.getValue(); + } + document.render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, scaleSize.width, scaleSize.height)); } catch (Exception e) { FineLoggerFactory.getLogger().error("SvgIcon from url: " + resource + "can not paint.", e); fallbackRender.render(c, g, x, y); } } + private static SVGDocument loadDefault() { + SVGLoader loader = new SVGLoader(); + UrlIconResource iconResource = new UrlIconResource("com/fine/theme/icon/default.svg"); + return loader.load(iconResource.getInputStream()); + } + private SVGDocument load(IconType type) { SVGLoader loader = new SVGLoader(); @@ -138,7 +147,6 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { : loader.load(resource.getInputStream()); } - @Override public String toString() { return new StringJoiner(", ", SvgIcon.class.getSimpleName() + "[", "]") diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report.svg old mode 100755 new mode 100644 index 6cb73b6991..ad9e75210d --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report.svg @@ -1,5 +1,5 @@ - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report_disable.svg old mode 100755 new mode 100644 diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word.svg old mode 100755 new mode 100644 index d2aa41ea80..6f9d1f6d6c --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word.svg @@ -1,7 +1,7 @@ - + - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word_disable.svg old mode 100755 new mode 100644 index f8f711c520..ae6a0a3fa4 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word_disable.svg @@ -1,7 +1,12 @@ + + + + + + - diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile.svg old mode 100755 new mode 100644 index fc346b19de..01e6c412ae --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile.svg @@ -1,8 +1,10 @@ + - - - + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile_disable.svg old mode 100755 new mode 100644 index ec09f32baa..16e2c4117f --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile_disable.svg @@ -1,8 +1,8 @@ - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile.svg old mode 100755 new mode 100644 index cda2a6cb93..2422bcf307 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile.svg @@ -1,4 +1,5 @@ + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile_disable.svg old mode 100755 new mode 100644 diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile.svg old mode 100755 new mode 100644 index e3e9893bba..4fc380e73a --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile.svg @@ -1,6 +1,7 @@ + - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile_disable.svg old mode 100755 new mode 100644 index 3201b3d581..ed15882e48 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile_disable.svg @@ -1,6 +1,6 @@ - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked.svg old mode 100755 new mode 100644 index 9c5f01a364..18791ee41d --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked.svg @@ -1,6 +1,7 @@ - + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked_disable.svg old mode 100755 new mode 100644 diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/csvFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/csvFile.svg new file mode 100644 index 0000000000..6cce0ba0a7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/csvFile.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/csvFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/csvFile_disable.svg new file mode 100644 index 0000000000..ede1cbc16a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/csvFile_disable.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile.svg old mode 100755 new mode 100644 index 8143080cac..5dd91fb6a7 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile.svg @@ -1,6 +1,7 @@ + - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile_disable.svg old mode 100755 new mode 100644 index fad1fa2a1c..fc89982901 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile_disable.svg @@ -1,6 +1,6 @@ + - diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import.svg old mode 100755 new mode 100644 index 3faf981f21..2a21450f81 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import.svg @@ -3,5 +3,5 @@ - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import_disable.svg old mode 100755 new mode 100644 index 04fd0b9b4a..c4fdb4b49f --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import_disable.svg @@ -1,7 +1,7 @@ + - diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile.svg old mode 100755 new mode 100644 index 70e75f46c7..f1408b67f2 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile.svg @@ -1,8 +1,8 @@ + - - - + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile_disable.svg old mode 100755 new mode 100644 index 712692d1bd..00d288d930 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile_disable.svg @@ -1,7 +1,7 @@ + + - - diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked.svg old mode 100755 new mode 100644 index 8bd63be484..a602e102cb --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked.svg @@ -4,6 +4,6 @@ - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked_disable.svg old mode 100755 new mode 100644 index b2fb1bc31a..77eeb6f351 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked_disable.svg @@ -4,6 +4,6 @@ - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile.svg old mode 100755 new mode 100644 index 6c64fd7241..945e988e75 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile.svg @@ -1,8 +1,9 @@ + - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile_disable.svg old mode 100755 new mode 100644 index 709124b0d6..b4e60659d4 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile_disable.svg @@ -1,8 +1,8 @@ + + + - - - diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile.svg old mode 100755 new mode 100644 index 6a65b848ba..a593de1653 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile.svg @@ -1,11 +1,10 @@ + - - - - - - + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile_disable.svg old mode 100755 new mode 100644 index 809c5f12e7..597eaadfa0 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile_disable.svg @@ -1,10 +1,9 @@ - - - - + + + + - diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile.svg old mode 100755 new mode 100644 index cb3bfd8924..8cf93ffc01 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile.svg @@ -1,8 +1,9 @@ + - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile_disable.svg old mode 100755 new mode 100644 index 0b1d5f818b..a2b58b1e96 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile_disable.svg @@ -1,8 +1,8 @@ - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile.svg old mode 100755 new mode 100644 index f2e2e3c2f8..185bc71a87 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile.svg @@ -1,9 +1,10 @@ + - - - - + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile_disable.svg old mode 100755 new mode 100644 index 53acf3252e..7d94b54e8c --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile_disable.svg @@ -1,9 +1,9 @@ - - - - + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile.svg old mode 100755 new mode 100644 index 32e7d50fd2..0f0065ecf3 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile.svg @@ -1,8 +1,9 @@ + - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile_disable.svg old mode 100755 new mode 100644 index 5ddc6a39cf..2a9c644837 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile_disable.svg @@ -1,8 +1,8 @@ - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile.svg old mode 100755 new mode 100644 index 97756c235c..596cac7d7c --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile.svg @@ -1,7 +1,8 @@ + - - + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile_disable.svg old mode 100755 new mode 100644 index 4c05097233..7777d71f41 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile_disable.svg @@ -1,7 +1,7 @@ - - + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile.svg old mode 100755 new mode 100644 index 27be0dcb20..d029535ad9 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile.svg @@ -1,8 +1,9 @@ + - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile_disable.svg old mode 100755 new mode 100644 index dc1ad39412..2d00642e09 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile_disable.svg @@ -1,8 +1,8 @@ - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile.svg old mode 100755 new mode 100644 index 9146d94cc6..9ec5ffb81f --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile.svg @@ -1,8 +1,9 @@ + - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile_disable.svg old mode 100755 new mode 100644 index 6f97ecfc05..bd3c767845 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile_disable.svg @@ -1,8 +1,8 @@ - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile.svg old mode 100755 new mode 100644 index 527e0a204e..cf2cb0dd9b --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile.svg @@ -1,8 +1,9 @@ + - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile_disable.svg old mode 100755 new mode 100644 index 37a41dc9d5..83adf9d2cd --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile_disable.svg @@ -1,8 +1,8 @@ + + + - - - diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile.svg old mode 100755 new mode 100644 index f24f8bb647..432938f062 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile.svg @@ -1,11 +1,12 @@ - - - - - - - - - + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile_disable.svg old mode 100755 new mode 100644 index 441ed97a70..3dedd47e58 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile_disable.svg @@ -1,10 +1,9 @@ - - - - - - - - + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile.svg old mode 100755 new mode 100644 index 6dc5bab611..2ca4ef17f7 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile.svg @@ -1,6 +1,6 @@ - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile_disable.svg old mode 100755 new mode 100644 index 80ae82c64d..c46e574960 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile_disable.svg @@ -1,6 +1,11 @@ - + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile.svg old mode 100755 new mode 100644 index ea58c34918..135b429b03 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile.svg @@ -3,5 +3,5 @@ - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile_disable.svg old mode 100755 new mode 100644 index ccd9aae917..687ed47b4b --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile_disable.svg @@ -1,7 +1,7 @@ - - + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile.svg old mode 100755 new mode 100644 index c5b68c24d0..af5aecd593 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile.svg @@ -1,9 +1,9 @@ + - - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile_disable.svg old mode 100755 new mode 100644 index 4aaa3dfc2c..9257262130 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile_disable.svg @@ -1,8 +1,8 @@ - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json b/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json index 19f4d0900a..d86b0292d9 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json @@ -135,7 +135,9 @@ "bias": "insert/bias.svg", "sub_report": "insert/sub_report.svg", "chart_line": "chart/chart_line.svg", - "popup": "popup/popup.svg", + "popup": { + "normal": "popup/popup.svg" + }, "clear": "clear.svg", "clear_hover": "clear_hover.svg", "tool_copy": "toolbar/copy.svg", diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/IconStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/IconStoryBoard.java index aefcb16d5a..e86582dd5f 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/components/IconStoryBoard.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/IconStoryBoard.java @@ -1,15 +1,18 @@ package com.fr.design.gui.storybook.components; +import com.fine.swing.ui.layout.Layouts; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineLightIconSet; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.storybook.Story; import com.fr.design.gui.storybook.StoryBoard; import javax.swing.JLabel; +import javax.swing.SwingConstants; import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; import static com.fine.swing.ui.layout.Layouts.fix; -import static com.fine.swing.ui.layout.Layouts.flex; import static com.fine.swing.ui.layout.Layouts.row; /** @@ -19,42 +22,50 @@ import static com.fine.swing.ui.layout.Layouts.row; */ @Story public class IconStoryBoard extends StoryBoard { + private FineLightIconSet iconSet = new FineLightIconSet(); + public IconStoryBoard() { super("图标"); - add( - cell(new UILabel("普通图标")).with(this::h3), - row(10, - cell(new JLabel(new LazyIcon("cut"))), - cell(new JLabel(new LazyIcon("save"))), - cell(new JLabel(new LazyIcon("copy"))), - cell(new JLabel(new LazyIcon("formatBrush"))), - cell(new JLabel(new LazyIcon("paste"))), - cell(new JLabel(new LazyIcon("undo"))), - cell(new JLabel(new LazyIcon("redo"))) + add(row( + column(10, + cell(new UILabel("普通图标")).with(this::h3), + icons() ), fix(5), - cell(new UILabel("禁用图标")).with(this::h3), - row(10, - cell(new JLabel(new LazyIcon("cut").disabled())), - cell(new JLabel(new LazyIcon("save").disabled())), - cell(new JLabel(new LazyIcon("copy").disabled())), - cell(new JLabel(new LazyIcon("formatBrush").disabled())), - cell(new JLabel(new LazyIcon("paste").disabled())), - cell(new JLabel(new LazyIcon("undo").disabled())), - cell(new JLabel(new LazyIcon("redo").disabled())) + column(10, + cell(new UILabel("禁用图标")).with(this::h3), + disableIcons() ), fix(5), - cell(new UILabel("白化图标")).with(this::h3), - row(10, - cell(new JLabel(new LazyIcon("cut").white())), - cell(new JLabel(new LazyIcon("save").white())), - cell(new JLabel(new LazyIcon("copy").white())), - cell(new JLabel(new LazyIcon("formatBrush").white())), - cell(new JLabel(new LazyIcon("paste").white())), - cell(new JLabel(new LazyIcon("undo").white())), - cell(new JLabel(new LazyIcon("redo").white())) - ), - flex() + column(10, + cell(new UILabel("白化图标")).with(this::h3), + whiteIcons() + )) ); } + + private Layouts.Cell icons() { + return column(10, + iconSet.getIds().stream().sorted() + .map(id -> cell(new JLabel(id, new LazyIcon(id), SwingConstants.LEFT))) + .toArray(Layouts.Cell[]::new)); + } + + private Layouts.Cell disableIcons() { + return column(10, + iconSet.getIds().stream().sorted() + .map(id -> cell(new JLabel(id, new LazyIcon(id).disabled(), SwingConstants.LEFT)) + .with(it -> { + it.setDisabledIcon(new LazyIcon(id).disabled()); + it.setEnabled(false); + })) + .toArray(Layouts.Cell[]::new)); + } + + private Layouts.Cell whiteIcons() { + return column(10, + iconSet.getIds().stream().sorted() + .map(id -> cell(new JLabel(id, new LazyIcon(id).white(), SwingConstants.LEFT))) + .toArray(Layouts.Cell[]::new)); + } } From 0c27d45923db075de9871cc2ad97493c6bd0f6b6 Mon Sep 17 00:00:00 2001 From: vito Date: Fri, 14 Jun 2024 15:06:59 +0800 Subject: [PATCH 162/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8A=A5=E9=94=99=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fine/theme/icon/svg/SvgIcon.java | 24 +++++++++++++------ .../fine/theme/light/ui/fine_light.icon.json | 1 - 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java index 331c028a17..1789d74256 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java @@ -81,19 +81,24 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { /** * 用于fallback渲染disable图像,这段代码来自异常分支,使用率要保持较低水平 */ - private void fallbackRender(Component c, Graphics g, int x, int y) { + private boolean fallbackRender(Component c, Graphics g, int x, int y) { if (resource instanceof UrlIconResource) { String path = ((UrlIconResource) resource).getPath(); - String[] names = path.split(IconManager.ICON_DISABLE_SUFFIX); - if (path.contains(IconManager.ICON_DISABLE_SUFFIX) && names.length == 2) { + int index = path.lastIndexOf(IconManager.ICON_DISABLE_SUFFIX); + if (path.contains(IconManager.ICON_DISABLE_SUFFIX) && index > 0) { SVGLoader loader = new SVGLoader(); - SVGDocument document = loader.load(new UrlIconResource(names[0] + names[1]).getInputStream()); + SVGDocument document = loader.load( + new UrlIconResource(path.substring(0, index) + + path.substring(index + IconManager.ICON_DISABLE_SUFFIX.length())) + .getInputStream()); if (document != null) { document.render((JComponent) c, grayGraphics(g), new ViewBox(x, y, scaleSize.width, scaleSize.height)); + return true; } } } + return false; } private Graphics2D grayGraphics(Graphics g) { @@ -123,13 +128,18 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { } else { document = svgDocument.getValue(); } + // 由于 weisj 库中加载svg描述出现问题,则返回一个Null,这里补充一个默认图标 if (document == null) { document = defaultDoc.getValue(); } document.render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, scaleSize.width, scaleSize.height)); } catch (Exception e) { - FineLoggerFactory.getLogger().error("SvgIcon from url: " + resource + "can not paint.", e); - fallbackRender.render(c, g, x, y); + boolean rendered = fallbackRender.render(c, g, x, y); + if (rendered) { + FineLoggerFactory.getLogger().warn("SvgIcon from url: " + resource + " paint with fallbackRender"); + } else { + FineLoggerFactory.getLogger().error("SvgIcon from url: " + resource + "can not paint.", e); + } } } @@ -177,6 +187,6 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { @FunctionalInterface interface FallbackRender { - void render(Component c, Graphics g, int x, int y); + boolean render(Component c, Graphics g, int x, int y); } } diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json b/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json index d86b0292d9..4e3213695b 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json @@ -134,7 +134,6 @@ "image": "insert/image.svg", "bias": "insert/bias.svg", "sub_report": "insert/sub_report.svg", - "chart_line": "chart/chart_line.svg", "popup": { "normal": "popup/popup.svg" }, From 63b2c694307b7b2bceecc1e860614911e0d4b718 Mon Sep 17 00:00:00 2001 From: vito Date: Fri, 14 Jun 2024 15:08:35 +0800 Subject: [PATCH 163/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fine/theme/icon/svg/SvgIcon.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java index 1789d74256..11b46b647d 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java @@ -185,6 +185,9 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { } + /** + * 用于回退绘制的类 + */ @FunctionalInterface interface FallbackRender { boolean render(Component c, Graphics g, int x, int y); From 8a4b2a3c1c2d0626df5f5ab7ab821550f8878be6 Mon Sep 17 00:00:00 2001 From: vito Date: Fri, 14 Jun 2024 15:18:15 +0800 Subject: [PATCH 164/302] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fine/theme/icon/JsonIconSet.java | 72 +++++++++++-------- .../java/com/fine/theme/icon/svg/SvgIcon.java | 22 ++++-- 2 files changed, 59 insertions(+), 35 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/icon/JsonIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/JsonIconSet.java index a7b774d0f4..fc769c7557 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/JsonIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/icon/JsonIconSet.java @@ -58,37 +58,49 @@ public class JsonIconSet extends AbstractIconSet { */ private void applyIcon(String key, Object value) { if (value instanceof String) { - String path = (String) value; - if (IconManager.isSvgIcon(path)) { - // 默认字符串提供正常图和灰化图 - addIcon(new SvgIconSource(key, - base + path, - IconManager.findDisablePath(base + path), - null - )); - } else if (IconManager.isImageIcon(path)) { - addIcon(new ImageIconSource(key, base + path)); - } - // 其他无法识别格式不处理 + dealWithIconString(key, (String) value); } else if (value instanceof Map) { - Map iconObj = (Map) value; - String normalPath = (String) iconObj.get(IconType.normal.name()); - String disablePath = (String) iconObj.get(IconType.disable.name()); - String whitePath = (String) iconObj.get(IconType.white.name()); - // 暂不支持混合格式,每个id的格式需要保持一致 - if (IconManager.isSvgIcon(normalPath)) { - addIcon(new SvgIconSource(key, - base + normalPath, - StringUtils.isNotBlank(disablePath) ? base + disablePath : null, - StringUtils.isNotBlank(whitePath) ? base + whitePath : null - )); - } else if (IconManager.isImageIcon(normalPath)) { - addIcon(new ImageIconSource(key, - base + normalPath, - StringUtils.isNotBlank(disablePath) ? base + disablePath : null, - StringUtils.isNotBlank(whitePath) ? base + whitePath : null - )); - } + dealWithIconMap(key, (Map) value); + } + } + + /** + * 处理字符串格式的icon配置 + */ + private void dealWithIconString(String key, String value) { + if (IconManager.isSvgIcon(value)) { + // 默认字符串提供正常图和灰化图 + addIcon(new SvgIconSource(key, + base + value, + IconManager.findDisablePath(base + value), + null + )); + } else if (IconManager.isImageIcon(value)) { + addIcon(new ImageIconSource(key, base + value)); + } + // 其他无法识别格式不处理 + } + + /** + * 处理object形式的icon配置 + */ + private void dealWithIconMap(String key, Map value) { + String normalPath = (String) value.get(IconType.normal.name()); + String disablePath = (String) value.get(IconType.disable.name()); + String whitePath = (String) value.get(IconType.white.name()); + // 暂不支持混合格式,每个id的格式需要保持一致 + if (IconManager.isSvgIcon(normalPath)) { + addIcon(new SvgIconSource(key, + base + normalPath, + StringUtils.isNotBlank(disablePath) ? base + disablePath : null, + StringUtils.isNotBlank(whitePath) ? base + whitePath : null + )); + } else if (IconManager.isImageIcon(normalPath)) { + addIcon(new ImageIconSource(key, + base + normalPath, + StringUtils.isNotBlank(disablePath) ? base + disablePath : null, + StringUtils.isNotBlank(whitePath) ? base + whitePath : null + )); } } diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java index 11b46b647d..eee575d50b 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java @@ -49,9 +49,12 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { private final IconResource resource; private final IconType type; - private final static NullableLazyValue defaultDoc = NullableLazyValue.createValue(SvgIcon::loadDefault); - private final NullableLazyValue svgDocument = NullableLazyValue.createValue(() -> load(IconType.normal)); - private final NullableLazyValue whiteSvgDocument = NullableLazyValue.createValue(() -> load(IconType.white)); + private final static NullableLazyValue DEFAULT_ICON_DOC = + NullableLazyValue.createValue(SvgIcon::loadDefault); + private final NullableLazyValue svgDocument = + NullableLazyValue.createValue(() -> load(IconType.normal)); + private final NullableLazyValue whiteSvgDocument = + NullableLazyValue.createValue(() -> load(IconType.white)); public SvgIcon(IconResource resource, Dimension size, IconType type) { this.resource = resource; @@ -130,7 +133,7 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { } // 由于 weisj 库中加载svg描述出现问题,则返回一个Null,这里补充一个默认图标 if (document == null) { - document = defaultDoc.getValue(); + document = DEFAULT_ICON_DOC.getValue(); } document.render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, scaleSize.width, scaleSize.height)); } catch (Exception e) { @@ -186,10 +189,19 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { /** - * 用于回退绘制的类 + * 用于回退渲染的回调类 */ @FunctionalInterface interface FallbackRender { + /** + * 渲染图标 + * + * @param c 待绘制组件 + * @param g 抽象画板 + * @param x 起点横坐标 + * @param y 起点纵坐标 + * @return 是否使用了回退渲染 + */ boolean render(Component c, Graphics g, int x, int y); } } From f5952fe3ceb186bf10d3889ac8bf5ef4e3610e6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Fri, 12 Jul 2024 16:21:20 +0800 Subject: [PATCH 165/302] =?UTF-8?q?REPORT-117002=20feat:=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8UI=E6=80=A7=E8=83=BD=E7=9B=91=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/carton/CartonConstants.java | 61 ++++++ .../carton/CartonThreadExecutorPool.java | 10 +- .../com/fr/design/carton/CartonUtils.java | 147 ++++++++++++++ .../EventDispatchThreadHangMonitor.java | 186 ++++-------------- .../design/carton/FeedbackToolboxDialog.java | 4 +- .../design/carton/SwitchForSwingChecker.java | 37 ++-- .../carton/latency/DesignerLatencyMetric.java | 155 +++++++++++++++ .../design/carton/latency/LatencyLevel.java | 67 +++++++ .../fr/design/mainframe/DesignerFrame.java | 2 + .../main/java/com/fr/start/MainDesigner.java | 2 + 10 files changed, 506 insertions(+), 165 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/carton/CartonConstants.java create mode 100644 designer-base/src/main/java/com/fr/design/carton/CartonUtils.java create mode 100644 designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java create mode 100644 designer-base/src/main/java/com/fr/design/carton/latency/LatencyLevel.java diff --git a/designer-base/src/main/java/com/fr/design/carton/CartonConstants.java b/designer-base/src/main/java/com/fr/design/carton/CartonConstants.java new file mode 100644 index 0000000000..c51f1193c5 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/carton/CartonConstants.java @@ -0,0 +1,61 @@ +package com.fr.design.carton; + +import com.fr.stable.ProductConstantsBase; +import com.fr.stable.StableUtils; + +import java.text.SimpleDateFormat; + +/** + * 卡顿常量类管理 + * + * @author Levy.Xie + * @since 11.0 + * Created on 2024/07/04 + */ +public class CartonConstants { + + public static final String TIME = "time"; + public static final String APPID = "appId"; + public static final String USERID = "userId"; + public static final String LOCAL = "local"; + public static final String REMOTE = "remote"; + public static final String OPERANDS_NUM = "operands"; + public static final String DESIGN_METHOD = "designMethod"; + public static final String DESIGNER_VERSION = "designerVersion"; + public static final String DESIGNER_ID = "designerId"; + + public static final String EASY_CHECKER_FILE_NAME = "easy_check_log.csv"; + public static final String TIMER_CHECKER_FILE_NAME = "timer_check_log.csv"; + + /** + * 开启间隔检测后两次检测的相隔时间ms + */ + public static final long CHECK_INTERVAL_MS = 100; + + /** + * 最大的事件允许执行时间,超过该时间则打印堆栈等相关信息 + */ + public static final long UNREASONABLE_DISPATCH_DURATION_MS = 1500; + + /** + * UI检测采样频率 + */ + public static final int LATENCY_SAMPLING_FREQUENCY = 100; + + /** + * 输出日志所在地址 + */ + public static final String JOURNAL_FILE_PATH = StableUtils.pathJoin(ProductConstantsBase.getEnvHome(), "journal_log"); + + /** + * 日期事件格式 + */ + public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + /** + * Designer4Debug类名 + */ + public static final String DEBUG_MAIN_CLASS_NAME = "com.fr.start.Designer4Debug"; + + +} diff --git a/designer-base/src/main/java/com/fr/design/carton/CartonThreadExecutorPool.java b/designer-base/src/main/java/com/fr/design/carton/CartonThreadExecutorPool.java index 39525110b3..d366791b25 100644 --- a/designer-base/src/main/java/com/fr/design/carton/CartonThreadExecutorPool.java +++ b/designer-base/src/main/java/com/fr/design/carton/CartonThreadExecutorPool.java @@ -57,18 +57,18 @@ public class CartonThreadExecutorPool extends ThreadPoolExecutor { private void examineHang() { StackTraceElement[] currentStack = eventThread.getStackTrace(); - if (lastReportedStack!=null && EventDispatchThreadHangMonitor.stacksEqual(currentStack, lastReportedStack)) { + if (lastReportedStack!=null && CartonUtils.stacksEqual(currentStack, lastReportedStack)) { return; } lastReportedStack = currentStack; - String stackTrace = EventDispatchThreadHangMonitor.stackTraceToString(currentStack); + String stackTrace = CartonUtils.stackTraceToString(currentStack); JSONObject jsonObject = new JSONObject(); jsonObject.put(Toolkit.i18nText("Fine-Design_Basic_Carton_Output_Time"), simpleDateFormatThreadSafe.format(System.currentTimeMillis())); jsonObject.put(Toolkit.i18nText("Fine-Design_Basic_Carton_Event_Number"), "swingWorker_" + hangNumber); jsonObject.put(Toolkit.i18nText("Fine-Design_Basic_Carton_Duration_Task_Execute"), timeSoFar() + "ms"); jsonObject.put(Toolkit.i18nText("Fine-Design_Basic_Carton_Stack_Info"), stackTrace); - EventDispatchThreadHangMonitor.outPutJournalLog(jsonObject.toString(), SwitchForSwingChecker.TIMER_CHECK_FLAG); - EventDispatchThreadHangMonitor.checkForDeadlock(); + CartonUtils.outPutJournalLog(jsonObject.toString(), SwitchForSwingChecker.TIMER_CHECK_FLAG); + CartonUtils.checkForDeadlock(); } } @@ -129,7 +129,7 @@ public class CartonThreadExecutorPool extends ThreadPoolExecutor { jsonObject.put(Toolkit.i18nText("Fine-Design_Basic_Carton_Event_Number"), "swingWorker_" + concurrentHashMap.get(currentThreadId).hangNumber); jsonObject.put(Toolkit.i18nText("Fine-Design_Basic_Carton_Task_Start_Time"), simpleDateFormatThreadSafe.format(concurrentHashMap.get(currentThreadId).startTime)); jsonObject.put(Toolkit.i18nText("Fine-Design_Basic_Carton_Task_Total_Time"), runTime + "ms"); - EventDispatchThreadHangMonitor.outPutJournalLog(jsonObject.toString(), SwitchForSwingChecker.EASY_CHECK_FLAG); + CartonUtils.outPutJournalLog(jsonObject.toString(), SwitchForSwingChecker.EASY_CHECK_FLAG); } concurrentHashMap.remove(currentThreadId); diff --git a/designer-base/src/main/java/com/fr/design/carton/CartonUtils.java b/designer-base/src/main/java/com/fr/design/carton/CartonUtils.java new file mode 100644 index 0000000000..b67fe8c504 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/carton/CartonUtils.java @@ -0,0 +1,147 @@ +package com.fr.design.carton; + +import com.fr.log.FineLoggerFactory; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StableUtils; +import com.fr.stable.StringUtils; +import org.jetbrains.annotations.NotNull; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadInfo; +import java.lang.management.ThreadMXBean; +import java.text.SimpleDateFormat; + +import static com.fr.design.carton.CartonConstants.EASY_CHECKER_FILE_NAME; +import static com.fr.design.carton.CartonConstants.JOURNAL_FILE_PATH; +import static com.fr.design.carton.CartonConstants.TIMER_CHECKER_FILE_NAME; + +/** + * 设计器卡顿业务工具类 + * + * @author Levy.Xie + * @since 11.0 + * Created on 2024/07/10 + */ +public class CartonUtils { + + /** + * 堆栈元素输出为文本 + * + * @param stackTrace 堆栈元素 + * @return 文本 + */ + public static String stackTraceToString(StackTraceElement[] stackTrace) { + StringBuilder result = new StringBuilder(); + for (StackTraceElement stackTraceElement : stackTrace) { + String indentation = " "; + result.append("~").append(indentation).append(stackTraceElement); + } + return result.toString(); + } + + /** + * 命令行显示堆栈信息 + * + * @param stackTrace 堆栈元素 + * @return 文本 + */ + public static String stackTraceToStringForConsole(StackTraceElement[] stackTrace) { + StringBuilder result = new StringBuilder(); + for (StackTraceElement stackTraceElement : stackTrace) { + String indentation = " "; + result.append("\r\n").append(indentation).append(stackTraceElement); + } + return result.toString(); + } + + /** + * 堆栈是否一致 + * + * @param a 堆栈A + * @param b 堆栈B + * @return 是否一致 + */ + public static boolean stacksEqual(@NotNull StackTraceElement[] a, @NotNull StackTraceElement[] b) { + if (!ArrayUtils.isSameLength(a, b)) { + return false; + } + for (int i = 0; i < a.length; ++i) { + if (!a[i].equals(b[i])) { + return false; + } + } + return true; + } + + /** + * 检查死锁 + */ + public static void checkForDeadlock() { + ThreadMXBean threadBean = ManagementFactory.getThreadMXBean(); + long[] threadIds = threadBean.findDeadlockedThreads(); + if (threadIds == null) { + return; + } + FineLoggerFactory.getLogger().warn("deadlock detected involving the following threads:"); + ThreadInfo[] threadInfos = threadBean.getThreadInfo(threadIds, Integer.MAX_VALUE); + for (ThreadInfo info : threadInfos) { + FineLoggerFactory.getLogger().warn("Thread # {} {} ( {} ) waiting on {} held by {} {}", info.getThreadId(), info.getThreadName(), + info.getThreadState(), info.getLockName(), info.getLockOwnerName(), CartonUtils.stackTraceToStringForConsole(info.getStackTrace())); + } + } + + /** + * 输出卡顿日志 + * + * @param message 文本信息 + * @param flag 类型,true时为简单检查、false时为定时检查 + */ + public static void outPutJournalLog(String message, int flag) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + String date = simpleDateFormat.format(System.currentTimeMillis()); + String filename = flag == SwitchForSwingChecker.EASY_CHECK_FLAG ? EASY_CHECKER_FILE_NAME : TIMER_CHECKER_FILE_NAME; + String[] split = date.split("-"); + int month = StringUtils.isEmpty(split[1]) ? -1 : Integer.parseInt(split[1]); + String dirPath = StableUtils.pathJoin(JOURNAL_FILE_PATH, split[0], "month-" + month, date); + File dirFile = new File(dirPath); + File file = new File(StableUtils.pathJoin(dirPath, filename)); + try { + if (!file.exists()) { + if (!dirFile.exists()) { + dirFile.mkdirs(); + } + file.createNewFile(); + } + BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file, true)); + String outputMessage = message.replaceAll("~", "\r\n") + "," + "\r\n"; + bufferedWriter.write(outputMessage); + bufferedWriter.close(); + } catch (IOException e) { + FineLoggerFactory.getLogger().error("output fail", e); + } + } + + /** + * 用于判断是不是特定的堆栈 + */ + public static boolean stackTraceElementIs(StackTraceElement e, String className, String methodName, boolean isNative) { + return e.getClassName().equals(className) && e.getMethodName().equals(methodName) && e.isNativeMethod() == isNative; + } + + /** + * 用于判断某个堆栈是否在等待另一个事件 + * 取当前堆栈前三层判断是是不是匹配等待堆栈的格式 + */ + public static boolean isWaitingForNextEvent(StackTraceElement[] currentStack) { + + return currentStack != null && currentStack.length >= 3 && + stackTraceElementIs(currentStack[0], "java.lang.Object", "wait", true) + && stackTraceElementIs(currentStack[1], "java.lang.Object", "wait", false) + && stackTraceElementIs(currentStack[2], "java.awt.EventQueue", "getNextEvent", false); + } + +} diff --git a/designer-base/src/main/java/com/fr/design/carton/EventDispatchThreadHangMonitor.java b/designer-base/src/main/java/com/fr/design/carton/EventDispatchThreadHangMonitor.java index a7bf03b407..988e7dd81d 100644 --- a/designer-base/src/main/java/com/fr/design/carton/EventDispatchThreadHangMonitor.java +++ b/designer-base/src/main/java/com/fr/design/carton/EventDispatchThreadHangMonitor.java @@ -1,34 +1,26 @@ package com.fr.design.carton; import com.fr.concurrent.FineExecutors; +import com.fr.design.carton.latency.DesignerLatencyMetric; import com.fr.design.ui.util.UIUtil; import com.fr.json.JSONObject; -import com.fr.log.FineLoggerFactory; -import com.fr.stable.ArrayUtils; -import com.fr.stable.ProductConstantsBase; -import com.fr.stable.StableUtils; -import com.fr.stable.StringUtils; -import org.jetbrains.annotations.NotNull; import javax.swing.SwingUtilities; import java.awt.EventQueue; import java.awt.Toolkit; import java.awt.AWTEvent; import java.awt.event.WindowEvent; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.lang.management.ManagementFactory; -import java.lang.management.ThreadInfo; -import java.lang.management.ThreadMXBean; -import java.text.SimpleDateFormat; import java.util.LinkedList; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import static com.fr.design.carton.CartonConstants.CHECK_INTERVAL_MS; +import static com.fr.design.carton.CartonConstants.DATE_FORMAT; +import static com.fr.design.carton.CartonConstants.LATENCY_SAMPLING_FREQUENCY; +import static com.fr.design.carton.CartonConstants.UNREASONABLE_DISPATCH_DURATION_MS; + /** * 参考自git swinghelper * 用于卡顿检测 @@ -38,31 +30,16 @@ import java.util.concurrent.TimeUnit; */ public final class EventDispatchThreadHangMonitor extends EventQueue { - /** - * 日期事件格式 - */ - private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + public static final EventDispatchThreadHangMonitor INSTANCE = new EventDispatchThreadHangMonitor(); /** * 一个timer */ private Timer timer; - /** - * 开启间隔检测后两次检测的相隔时间ms - */ - private static final long CHECK_INTERVAL_MS = 100; - /** - * 最大的事件允许执行时间,超过该时间则打印堆栈等相关信息 - */ - private static final long UNREASONABLE_DISPATCH_DURATION_MS = 1500; /** * 事件唯一编码,用于方便日志的查看 */ - private static long hangCount = 0; - /** - * 输出日志所在地址 - */ - private static final String JOURNAL_FILE_PATH = StableUtils.pathJoin(ProductConstantsBase.getEnvHome(), "journal_log"); + private static long hangCount = 0; /** * 类似于一个开关,当该值为默认的false启动时,定时任务在窗口开启前都不会对执行的事件进行检查 */ @@ -103,43 +80,6 @@ public final class EventDispatchThreadHangMonitor extends EventQueue { return hangCount++; } - /** - * @param a can not be null - * @param b can not be null - * @return - */ - public static boolean stacksEqual(@NotNull StackTraceElement[] a, @NotNull StackTraceElement[] b) { - - if (!ArrayUtils.isSameLength(a, b)) { - return false; - } - for (int i = 0; i < a.length; ++i) { - if (!a[i].equals(b[i])) { - return false; - } - } - return true; - } - - /** - * 用于判断是不是特定的堆栈 - */ - public static boolean stackTraceElementIs(StackTraceElement e, String className, String methodName, boolean isNative) { - return e.getClassName().equals(className) && e.getMethodName().equals(methodName) && e.isNativeMethod() == isNative; - } - - /** - * 用于判断某个堆栈是否在等待另一个事件 - * 取当前堆栈前三层判断是是不是匹配等待堆栈的格式 - */ - public static boolean isWaitingForNextEvent(StackTraceElement[] currentStack) { - - return currentStack != null && currentStack.length >= 3 && - stackTraceElementIs(currentStack[0], "java.lang.Object", "wait", true) - && stackTraceElementIs(currentStack[1], "java.lang.Object", "wait", false) - && stackTraceElementIs(currentStack[2], "java.awt.EventQueue", "getNextEvent", false); - } - /** * event事件的包装类 */ @@ -153,11 +93,13 @@ public final class EventDispatchThreadHangMonitor extends EventQueue { //事件开始的时间 private final long startDispatchTimeMillis = System.currentTimeMillis(); //事件编号 - private long hangNumber; + private final long hangNumber; + //构造函数,给当前对象赋一个递增的唯一编号 - public DispatchInfo() { + public DispatchInfo() { hangNumber = getHangCount(); } + //定时调度任务检测的入口,如果执行时间大于设定的值就进入examineHang()方法 public void checkForHang() { if (timeSoFar() > UNREASONABLE_DISPATCH_DURATION_MS) { @@ -168,36 +110,38 @@ public final class EventDispatchThreadHangMonitor extends EventQueue { private void examineHang() { //获取执行线程的当前堆栈 StackTraceElement[] currentStack = eventDispatchThread.getStackTrace(); - if (isWaitingForNextEvent(currentStack)) { + if (CartonUtils.isWaitingForNextEvent(currentStack)) { return; } //某个事件执行时间很长,定时处理时可能会连续打很多个堆栈,对同一个事件的相同堆栈只打一次 - if (lastReportedStack !=null && stacksEqual(lastReportedStack, currentStack)) { + if (lastReportedStack != null && CartonUtils.stacksEqual(lastReportedStack, currentStack)) { return; } - String stackTrace = stackTraceToString(currentStack); + String stackTrace = CartonUtils.stackTraceToString(currentStack); lastReportedStack = currentStack; JSONObject jsonObject = new JSONObject(); - jsonObject.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Carton_Output_Time"), simpleDateFormat.format(System.currentTimeMillis())); + jsonObject.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Carton_Output_Time"), DATE_FORMAT.format(System.currentTimeMillis())); jsonObject.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Carton_Event_Number"), "eventQueue_" + hangNumber); jsonObject.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Carton_Duration_Task_Execute"), timeSoFar() + "ms"); jsonObject.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Carton_Stack_Info"), stackTrace); - outPutJournalLog(jsonObject.toString(), SwitchForSwingChecker.TIMER_CHECK_FLAG); - checkForDeadlock(); + CartonUtils.outPutJournalLog(jsonObject.toString(), SwitchForSwingChecker.TIMER_CHECK_FLAG); + CartonUtils.checkForDeadlock(); } + //记录连续运行了多长时间 - private long timeSoFar() { + public long timeSoFar() { return (System.currentTimeMillis() - lastDispatchTimeMillis); } + //记录一个事件从被分发到结束的总运行时间 - private long totalTime() { + public long totalTime() { return (System.currentTimeMillis() - startDispatchTimeMillis); } //事件处理完后的时间判断 public void dispose() { if (timeSoFar() > UNREASONABLE_DISPATCH_DURATION_MS) { exportCartonLog(true); - } else if (lastReportedStack != null){ + } else if (lastReportedStack != null) { exportCartonLog(false); } } @@ -208,40 +152,15 @@ public final class EventDispatchThreadHangMonitor extends EventQueue { */ private void exportCartonLog(boolean flag) { JSONObject jsonObject = new JSONObject(); - jsonObject.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Carton_Output_Time"), simpleDateFormat.format(System.currentTimeMillis())); + jsonObject.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Carton_Output_Time"), DATE_FORMAT.format(System.currentTimeMillis())); jsonObject.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Carton_Event_Number"), "eventQueue_" + hangNumber); - jsonObject.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Carton_Task_Start_Time"), simpleDateFormat.format(startDispatchTimeMillis)); + jsonObject.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Carton_Task_Start_Time"), DATE_FORMAT.format(startDispatchTimeMillis)); if (flag) { jsonObject.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Carton_Task_Total_Time"), timeSoFar() + "ms"); } else { jsonObject.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Carton_Task_Total_Time"), totalTime() + "ms"); } - outPutJournalLog(jsonObject.toString(), SwitchForSwingChecker.EASY_CHECK_FLAG); - } - } - - public static void outPutJournalLog(String message, int flag) { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); - String date = simpleDateFormat.format(System.currentTimeMillis()); - String filename = flag == SwitchForSwingChecker.EASY_CHECK_FLAG ? SwitchForSwingChecker.EASY_CHECKER_FILE_NAME: SwitchForSwingChecker.TIMER_CHECKER_FILE_NAME; - String[] split = date.split("-"); - int month = StringUtils.isEmpty(split[1]) ? -1 : Integer.parseInt(split[1]); - String dirPath = StableUtils.pathJoin(JOURNAL_FILE_PATH, split[0], "month-" + month, date); - File dirFile = new File(dirPath); - File file = new File( StableUtils.pathJoin(dirPath, filename)); - try { - if (!file.exists()) { - if (!dirFile.exists()) { - dirFile.mkdirs(); - } - file.createNewFile(); - } - BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file, true)); - String outputMessage = new StringBuilder(message.replaceAll("~", "\r\n")).append(",").append("\r\n").toString(); - bufferedWriter.write(outputMessage); - bufferedWriter.close(); - } catch (IOException e) { - FineLoggerFactory.getLogger().error("output fail", e); + CartonUtils.outPutJournalLog(jsonObject.toString(), SwitchForSwingChecker.EASY_CHECK_FLAG); } } @@ -325,8 +244,7 @@ public final class EventDispatchThreadHangMonitor extends EventQueue { */ @Override protected void dispatchEvent(AWTEvent event) { - //如果两个开关都没开,那就不走重写方法了 - if (!isEasyWitch() && !isTimerWitch()) { + if (!useCustomEventQueue()) { super.dispatchEvent(event); } else { try { @@ -342,6 +260,18 @@ public final class EventDispatchThreadHangMonitor extends EventQueue { } } + private boolean useCustomEventQueue() { + // 开启性能监控或开启卡顿工具箱,则走自定义的EventQueue + return SwitchForSwingChecker.isLatencyMonitoring() || + isEasyWitch() || isTimerWitch(); + } + + private boolean needSampling() { + // UI性能采样逻辑:开启采样并且符合采样频次 + return SwitchForSwingChecker.isLatencyMonitoring() + && (hangCount % LATENCY_SAMPLING_FREQUENCY == 0); + } + /** * Starts tracking a dispatch. */ @@ -357,6 +287,9 @@ public final class EventDispatchThreadHangMonitor extends EventQueue { private synchronized void postDispatchEvent() { synchronized (dispatches) { DispatchInfo justFinishedDispatch = dispatches.removeLast(); + if (needSampling()) { + DesignerLatencyMetric.getInstance().record(justFinishedDispatch.timeSoFar()); + } if (isEasyWitch()) { justFinishedDispatch.dispose(); } @@ -370,39 +303,4 @@ public final class EventDispatchThreadHangMonitor extends EventQueue { } } - /** - * 检查死锁 - */ - public static void checkForDeadlock() { - ThreadMXBean threadBean = ManagementFactory.getThreadMXBean(); - long[] threadIds = threadBean.findDeadlockedThreads(); - if (threadIds == null) { - return; - } - FineLoggerFactory.getLogger().warn("deadlock detected involving the following threads:"); - ThreadInfo[] threadInfos = threadBean.getThreadInfo(threadIds, Integer.MAX_VALUE); - for (ThreadInfo info : threadInfos) { - FineLoggerFactory.getLogger().warn("Thread # {} {} ( {} ) waiting on {} held by {} {}", info.getThreadId(), info.getThreadName(), - info.getThreadState(), info.getLockName(), info.getLockOwnerName(), stackTraceToStringForConsole(info.getStackTrace())); - } - } - - public static String stackTraceToString(StackTraceElement[] stackTrace) { - StringBuilder result = new StringBuilder(); - for (StackTraceElement stackTraceElement : stackTrace) { - String indentation = " "; - result.append("~").append(indentation).append(stackTraceElement); - } - return result.toString(); - } - - public static String stackTraceToStringForConsole(StackTraceElement[] stackTrace) { - StringBuilder result = new StringBuilder(); - for (StackTraceElement stackTraceElement : stackTrace) { - String indentation = " "; - result.append("\r\n").append(indentation).append(stackTraceElement); - } - return result.toString(); - } - } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/carton/FeedbackToolboxDialog.java b/designer-base/src/main/java/com/fr/design/carton/FeedbackToolboxDialog.java index 83d6e24ac8..328e47e8aa 100644 --- a/designer-base/src/main/java/com/fr/design/carton/FeedbackToolboxDialog.java +++ b/designer-base/src/main/java/com/fr/design/carton/FeedbackToolboxDialog.java @@ -49,6 +49,8 @@ import java.text.ParseException; import java.util.List; import java.util.Objects; +import static com.fr.design.carton.CartonConstants.JOURNAL_FILE_PATH; + public class FeedbackToolboxDialog extends JDialog { private UIDatePicker uiDatePicker; @@ -147,7 +149,7 @@ public class FeedbackToolboxDialog extends JDialog { //selectDate 2002-03-09例子 String[] split = selectDate.split("-"); int month = Integer.parseInt(split[1]); - String sourceFilePath = StableUtils.pathJoin(SwitchForSwingChecker.JOURNAL_FILE_PATH, split[0], "month-" + month, selectDate); + String sourceFilePath = StableUtils.pathJoin(JOURNAL_FILE_PATH, split[0], "month-" + month, selectDate); File sourceFile = new File(sourceFilePath); if (sourceFile.exists()) { exportCartonLog(sourceFile, path, sourceFilePath); diff --git a/designer-base/src/main/java/com/fr/design/carton/SwitchForSwingChecker.java b/designer-base/src/main/java/com/fr/design/carton/SwitchForSwingChecker.java index 683179293e..758017465d 100644 --- a/designer-base/src/main/java/com/fr/design/carton/SwitchForSwingChecker.java +++ b/designer-base/src/main/java/com/fr/design/carton/SwitchForSwingChecker.java @@ -7,7 +7,6 @@ import com.fr.json.JSON; import com.fr.json.JSONArray; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; -import com.fr.stable.ProductConstantsBase; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.xml.XMLPrintWriter; @@ -29,11 +28,13 @@ import java.util.Map; import java.util.Date; import java.util.Calendar; +import static com.fr.design.carton.CartonConstants.DEBUG_MAIN_CLASS_NAME; +import static com.fr.design.carton.CartonConstants.EASY_CHECKER_FILE_NAME; +import static com.fr.design.carton.CartonConstants.JOURNAL_FILE_PATH; +import static com.fr.design.carton.CartonConstants.TIMER_CHECKER_FILE_NAME; + public class SwitchForSwingChecker implements XMLReadable, XMLWriter { - /** - * Designer4Debug类名 - */ - private static final String DEBUG_MAIN_CLASS_NAME = "com.fr.start.Designer4Debug"; + /** * XML标签 */ @@ -46,18 +47,16 @@ public class SwitchForSwingChecker implements XMLReadable, XMLWriter { * 简单记录事件执行时间的开关 */ private static boolean easyChecker = false; + /** + * UI性能监控埋点的开关 + */ + private static boolean latencyMonitor = true; /** * 一个标识位用于区分耗时任务时长检测(简单检测)和timer检测 */ public static final int TIMER_CHECK_FLAG = 0; public static final int EASY_CHECK_FLAG = 1; - /** - * 日志存储地址 - */ - public static final String JOURNAL_FILE_PATH = StableUtils.pathJoin(ProductConstantsBase.getEnvHome(), "journal_log"); - public static final String EASY_CHECKER_FILE_NAME = "easy_check_log.csv"; - public static final String TIMER_CHECKER_FILE_NAME = "timer_check_log.csv"; public static boolean isCheckerTimerSwitch() { return checkerTimerSwitch; } @@ -66,6 +65,13 @@ public class SwitchForSwingChecker implements XMLReadable, XMLWriter { return easyChecker; } + /** + * 是否开启UI性能检测 + */ + public static boolean isLatencyMonitoring() { + return latencyMonitor; + } + public static volatile SwitchForSwingChecker switchForSwingChecker = new SwitchForSwingChecker(); public static SwitchForSwingChecker getInstance() { @@ -137,7 +143,7 @@ public class SwitchForSwingChecker implements XMLReadable, XMLWriter { } /** - *处理文件 + * 处理文件 * 一共四种情况, * 两个文件都不存在 * 文件一存在,文件二不存在 @@ -224,7 +230,7 @@ public class SwitchForSwingChecker implements XMLReadable, XMLWriter { /** * /埋点方法上传卡顿信息入口 - date为 2022-09-08的格式 + * date为 2022-09-08的格式 */ public static List uploadJournalLog(Date dateTime) { List res = new ArrayList<>(); @@ -245,9 +251,8 @@ public class SwitchForSwingChecker implements XMLReadable, XMLWriter { /** * 初始化监控任务,主要是替换EventQueue以及SwingWorker执行任务的线程池 - * */ - public static void initThreadMonitoring () { + public static void initThreadMonitoring() { String mainClass = System.getProperty("sun.java.command"); //判断一下,如果是以Designer4Debug启动,就不注册代码,不然会覆盖掉SwingExplorer,导致其无法使用 if (!StringUtils.equals(mainClass, DEBUG_MAIN_CLASS_NAME)) { @@ -293,6 +298,7 @@ public class SwitchForSwingChecker implements XMLReadable, XMLWriter { if (reader.isAttr()) { checkerTimerSwitch = reader.getAttrAsBoolean("checkerTimerSwitch", false); easyChecker = reader.getAttrAsBoolean("easyChecker", false); + latencyMonitor = reader.getAttrAsBoolean("latencyMonitor", true); } try { initSwitchChecker(); @@ -306,6 +312,7 @@ public class SwitchForSwingChecker implements XMLReadable, XMLWriter { writer.startTAG(XML_TAG); writer.attr("checkerTimerSwitch", checkerTimerSwitch); writer.attr("easyChecker", easyChecker); + writer.attr("latencyMonitor", latencyMonitor); writer.end(); } diff --git a/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java b/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java new file mode 100644 index 0000000000..d98e26c198 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java @@ -0,0 +1,155 @@ +package com.fr.design.carton.latency; + +import com.fanruan.third.v2.org.ehcache.impl.internal.concurrent.ConcurrentHashMap; +import com.fr.concurrent.FineExecutors; +import com.fr.concurrent.NamedThreadFactory; +import com.fr.config.MarketConfig; +import com.fr.design.DesignerEnvManager; +import com.fr.design.carton.SwitchForSwingChecker; +import com.fr.design.mainframe.SiteCenterToken; +import com.fr.event.Event; +import com.fr.event.EventDispatcher; +import com.fr.event.Listener; +import com.fr.general.http.HttpToolbox; +import com.fr.json.JSONObject; +import com.fr.stable.ProductConstants; +import com.fr.workspace.WorkContext; +import com.fr.workspace.Workspace; +import com.fr.workspace.WorkspaceEvent; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import static com.fr.design.carton.CartonConstants.APPID; +import static com.fr.design.carton.CartonConstants.DESIGNER_ID; +import static com.fr.design.carton.CartonConstants.DESIGNER_VERSION; +import static com.fr.design.carton.CartonConstants.DESIGN_METHOD; +import static com.fr.design.carton.CartonConstants.LOCAL; +import static com.fr.design.carton.CartonConstants.OPERANDS_NUM; +import static com.fr.design.carton.CartonConstants.REMOTE; +import static com.fr.design.carton.CartonConstants.TIME; +import static com.fr.design.carton.CartonConstants.USERID; + +/** + * 设计器延迟时间记录Metric + * + * @author Levy.Xie + * @since 11.0 + * Created on 2024/07/01 + */ +public class DesignerLatencyMetric { + + private ExecutorService executorService; + private ScheduledExecutorService scheduler; + private static final Map LATENCY_CONTAINER = new ConcurrentHashMap<>(); + + private static final String LATENCY_INFO_URL = "https://cloud.fanruan.com/api/monitor/record_of_deisgner_latency/single"; + + private final static class InstanceHolder { + static final DesignerLatencyMetric INSTANCE = new DesignerLatencyMetric(); + } + + /** + * 获取单例 + */ + public static DesignerLatencyMetric getInstance() { + return DesignerLatencyMetric.InstanceHolder.INSTANCE; + } + + private DesignerLatencyMetric() { + } + + /** + * 启动 + */ + public void start() { + if (SwitchForSwingChecker.isLatencyMonitoring()) { + // 初始化容器 + initializeContainer(); + // 启动异步性能记录线程池 + executorService = FineExecutors.newCachedThreadPool( + new NamedThreadFactory(DesignerLatencyMetric.class)); + // 启动定时埋点 + this.scheduler = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("LatencyMetricWorker")); + this.scheduler.scheduleWithFixedDelay(this::collectAndSubmit, 60, 60, TimeUnit.SECONDS); + // 注册设计器工作目录切换事件监听 + EventDispatcher.listen(WorkspaceEvent.AfterSwitch, new Listener() { + @Override + public void on(Event event, Workspace param) { + collectAndSubmit(); + } + }); + } + } + + /** + * 关闭 + */ + public void stop() { + if (SwitchForSwingChecker.isLatencyMonitoring()) { + this.executorService.shutdown(); + this.scheduler.shutdown(); + collectAndSubmit(); + } + } + + private void initializeContainer() { + for (LatencyLevel level : LatencyLevel.values()) { + LATENCY_CONTAINER.put(level, new AtomicInteger()); + } + } + + private void resetContainer() { + LATENCY_CONTAINER.values().forEach(count -> count.set(0)); + } + + /** + * 记录性能信息 + */ + public void record(long cost) { + executorService.submit(() -> { + try { + LatencyLevel level = LatencyLevel.measure(cost); + LATENCY_CONTAINER.computeIfAbsent(level, k -> new AtomicInteger()).incrementAndGet(); + } catch (Throwable ignore) { + // 记录失败不影响业务 + } + }); + } + + /** + * 汇总并提交性能监控埋点 + */ + public void collectAndSubmit() { + Map para = new HashMap<>(); + para.put("token", SiteCenterToken.generateToken()); + para.put("content", collect()); + try { + HttpToolbox.post(LATENCY_INFO_URL, para); + } catch (Throwable ignore) { + // doNothing + } + resetContainer(); + } + + private JSONObject collect() { + JSONObject info = new JSONObject(); + info.put(TIME, System.currentTimeMillis()); + info.put(APPID, MarketConfig.getInstance().getCloudOperationMaintenanceId()); + info.put(USERID, MarketConfig.getInstance().getBbsUid()); + info.put(DESIGNER_ID, DesignerEnvManager.getEnvManager().getUUID()); + info.put(DESIGNER_VERSION, ProductConstants.DESIGNER_VERSION); + info.put(DESIGN_METHOD, WorkContext.getCurrent().isLocal() ? LOCAL : REMOTE); + info.put(OPERANDS_NUM, LATENCY_CONTAINER.values().stream().mapToInt(AtomicInteger::get).sum()); + for (Map.Entry entry : LATENCY_CONTAINER.entrySet()) { + info.put(entry.getKey().getMark(), entry.getValue().get()); + } + return info; + } + +} diff --git a/designer-base/src/main/java/com/fr/design/carton/latency/LatencyLevel.java b/designer-base/src/main/java/com/fr/design/carton/latency/LatencyLevel.java new file mode 100644 index 0000000000..0d40b37d89 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/carton/latency/LatencyLevel.java @@ -0,0 +1,67 @@ +package com.fr.design.carton.latency; + +/** + * 卡顿等级 + * + * @author Levy.Xie + * @since 11.0 + * Created on 2024/07/01 + */ +public enum LatencyLevel { + + // 非常流畅 + FLASH(0, 50, "waitNum1"), + // 流畅 + SMOOTH(50, 100, "waitNum2"), + // 轻微卡顿 + SLIGHT(100, 200, "waitNum3"), + // 中等卡顿 + MILD(200, 500, "waitNum4"), + // 明显卡顿 + NOTICEABLE(500, 1000, "waitNum5"), + // 严重卡顿 + SERVE(1000, 2000, "waitNum6"), + // 非常严重卡顿 + EXTREME(2000, 3000, "waitNum7"), + // 极度卡顿 + CRITICAL(3000, Long.MAX_VALUE, "waitNum8"), + // 未知场景 + UNDEFINE(-1, -1, "unknown"); + + final long start; + final long end; + final String mark; + + LatencyLevel(long start, long end, String mark) { + this.start = start; + this.end = end; + this.mark = mark; + } + + public long getStart() { + return start; + } + + public long getEnd() { + return end; + } + + public String getMark() { + return mark; + } + + /** + * 评估当前卡顿等级 + * + * @param cost UI-EventQueue响应耗时 + * @return 卡顿等级 + */ + public static LatencyLevel measure(long cost) { + for (LatencyLevel level : LatencyLevel.values()) { + if (cost >= level.getStart() && cost < level.getEnd()) { + return level; + } + } + return UNDEFINE; + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index afa1a3bcb2..e20debacb7 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -11,6 +11,7 @@ import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.core.ActionFactory; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.base.mode.DesignerMode; +import com.fr.design.carton.latency.DesignerLatencyMetric; import com.fr.design.constants.UIConstants; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.TableDataTreePane; @@ -1161,6 +1162,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta }); DesignerEnvManager.getEnvManager().saveXMLFile(); + DesignerLatencyMetric.getInstance().stop(); } /** diff --git a/designer-realize/src/main/java/com/fr/start/MainDesigner.java b/designer-realize/src/main/java/com/fr/start/MainDesigner.java index ee25802846..dab50eb3ce 100644 --- a/designer-realize/src/main/java/com/fr/start/MainDesigner.java +++ b/designer-realize/src/main/java/com/fr/start/MainDesigner.java @@ -11,6 +11,7 @@ import com.fr.design.actions.server.ServerConfigManagerAction; import com.fr.design.actions.server.TemplateThemeManagerAction; import com.fr.design.actions.server.WidgetManagerAction; import com.fr.design.base.mode.DesignModeContext; +import com.fr.design.carton.latency.DesignerLatencyMetric; import com.fr.design.carton.SwitchForSwingChecker; import com.fr.design.constants.DesignerLaunchStatus; import com.fr.design.constants.UIConstants; @@ -162,6 +163,7 @@ public class MainDesigner extends BaseDesigner { FineLoggerFactory.getLogger().info("Designer started.Time used {} ms", DesignerStartupContext.getRecorder().getTime(TimeUnit.MILLISECONDS)); SwitchForSwingChecker.initThreadMonitoring(); + DesignerLatencyMetric.getInstance().start(); } /** From 9c31c6a877ade12c8e8d16b40adebc63b3891fcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=B8=96=E8=B1=AA?= <1944167742@qq.com> Date: Fri, 12 Jul 2024 16:38:41 +0800 Subject: [PATCH 166/302] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=BC=95=E6=93=8E?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E5=BC=B9=E7=AA=97=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/report/ReportEnginePane.java | 106 +++++++++++++----- 1 file changed, 77 insertions(+), 29 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java b/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java index 9ae4983227..86a1cd5e9a 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java @@ -1,5 +1,7 @@ package com.fr.design.report; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.utils.FineUIUtils; import com.fr.design.beans.BasicBeanPane; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.editor.editor.IntegerEditor; @@ -43,6 +45,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; +import com.fr.design.i18n.Toolkit; /** * @author fly.li @@ -77,36 +80,54 @@ public class ReportEnginePane extends BasicBeanPane { protected void initComponents() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel outReportEnginePane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Report_Engine_Attribute")); + //JPanel outReportEnginePane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Report_Engine_Attribute")); + JPanel outReportEnginePane = new JPanel(); + outReportEnginePane.setLayout(FRGUIPaneFactory.createBorderLayout()); outReportEnginePane.setPreferredSize(new Dimension(600, 370)); - this.add(outReportEnginePane, BorderLayout.NORTH); + //this.add(outReportEnginePane, BorderLayout.NORTH); outReportEnginePane.add(createReportEnginePane()); - JPanel outAdvicePane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advice")); - this.add(outAdvicePane, BorderLayout.SOUTH); - outAdvicePane.setPreferredSize(new Dimension(600, 150)); + //JPanel outAdvicePane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advice")); + //this.add(outAdvicePane, BorderLayout.SOUTH); + JPanel outAdvicePane = new JPanel(); + outAdvicePane.setLayout(FRGUIPaneFactory.createBorderLayout()); + outAdvicePane.setPreferredSize(new Dimension(600, 160)); outAdvicePane.add(createAdvicePane()); + + this.add(Layouts.column(20, + Layouts.cell(FineUIUtils.wrapComponentWithTitle(outReportEnginePane, Toolkit.i18nText("Fine-Design_Report_Report_Engine_Attribute"))), + Layouts.cell(FineUIUtils.wrapComponentWithTitle(outAdvicePane, Toolkit.i18nText("Fine-Design_Report_Advice")))) + .getComponent()); } private JPanel createReportEnginePane() { JPanel reportEnginePane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); JPanel clientPagingPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - clientPaging = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Enable_Client_Page")); + clientPaging = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Enable_Client_Page")); clientPaging.setSelected(false); - clientPagingPane.add(clientPaging); reportEnginePane.add(clientPagingPane); - outPagingEngineSelectPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Paging_Engine_Select")); - reportEnginePane.add(outPagingEngineSelectPane); + //reportEnginePane.add(Layouts.row(10, Layouts.cell(clientPagingPane)).getComponent()); + //outPagingEngineSelectPane = FRGUIPaneFactory.createTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Paging_Engine_Select")); + outPagingEngineSelectPane = new JPanel(); + outPagingEngineSelectPane.setLayout(FRGUIPaneFactory.createBorderLayout()); + //reportEnginePane.add(outPagingEngineSelectPane); outPagingEngineSelectPane.setVisible(false); outPagingEngineSelectPane.setPreferredSize(new Dimension(600, 300)); outPagingEngineSelectPane.add(createPagingEngineSelectPane()); clientPaging.addActionListener(new SelectActionListener(clientPaging, outPagingEngineSelectPane)); + clientPagingPane.add(clientPaging); + //reportEnginePane.add(outPagingEngineSelectPane); + //clientPagingPane.add(Layouts.box(Layouts.cell(clientPaging)).getComponent()); + reportEnginePane.add(Layouts.column(20, + Layouts.cell(clientPagingPane), + Layouts.cell(FineUIUtils.wrapComponentWithTitle(outPagingEngineSelectPane, Toolkit.i18nText("Fine-Design_Report_Paging_Engine_Select")))) + .getComponent()); return reportEnginePane; } private JPanel createPagingEngineSelectPane() { engineSettingPane = new JLayeredPane(); - engineSettingPane.setPreferredSize(new Dimension(570, 240)); - engineSettingPane.setBounds(0, 0, 570, 240); + engineSettingPane.setPreferredSize(new Dimension(600, 240)); + engineSettingPane.setBounds(0, 0, 600, 240); createEngineXSettingPane(); createLineEngineSettingPane(); outLineEngineSettingPane.setVisible(false); @@ -115,8 +136,13 @@ public class ReportEnginePane extends BasicBeanPane { engineSettingPane.moveToFront(outEngineXSettingPane); engineSettingPane.setVisible(true); JPanel pagingEngineSelectPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); + //engineSettingPane.add(Layouts.column()) pagingEngineSelectPane.add(createPagingEngineRadioPanel()); pagingEngineSelectPane.add(engineSettingPane); + /*pagingEngineSelectPane.add(Layouts.column(10, + Layouts.cell(createPagingEngineSelectPane()), + Layouts.cell(engineSettingPane)) + .getComponent());*/ return pagingEngineSelectPane; } @@ -125,45 +151,58 @@ public class ReportEnginePane extends BasicBeanPane { */ private void createEngineXSettingPane() { outEngineXSettingPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_New_Engine")); - outEngineXSettingPane.setBounds(0, 0, 570, 240); + outEngineXSettingPane.setBounds(0, 0, 700, 200); JPanel engineXSettingPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); JPanel pageQueryBoxPanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - engineXPageQueryBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Fixed_Line_Paging")); + engineXPageQueryBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Fixed_Line_Paging")); engineXPageQueryBox.setSelected(false); pageQueryBoxPanel.add(engineXPageQueryBox); - engineXSettingPane.add(pageQueryBoxPanel); + //engineXSettingPane.add(pageQueryBoxPanel); engineXCountPerPageEditor = new IntegerEditor(new Integer(30)); engineXCountPerPageEditor.setPreferredSize(new Dimension(120, 20)); engineXPageQueryPane = createPageQueryPane(engineXCountPerPageEditor); engineXPageQueryPane.setVisible(false); - engineXSettingPane.add(engineXPageQueryPane); + //engineXSettingPane.add(engineXPageQueryPane); engineXPageQueryBox.addActionListener(new SelectActionListener(engineXPageQueryBox, engineXPageQueryPane)); JPanel rowCountPanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - rowCountBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Row_Count")); + rowCountBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Row_Count")); rowCountBox.setSelected(false); rowCountPanel.add(rowCountBox); - engineXSettingPane.add(rowCountPanel); - engineXSettingPane.add(createTipPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_X_tip"))); + //engineXSettingPane.add(rowCountPanel); + //engineXSettingPane.add(createTipPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_X_tip"))); + JPanel tip = createTipPane(Toolkit.i18nText("Fine-Design_Report_Engine_X_tip")); + //engineXSettingPane.add(tip); + engineXSettingPane.add(Layouts.column(10, + Layouts.cell(pageQueryBoxPanel), + Layouts.cell(engineXPageQueryPane), + Layouts.cell(rowCountPanel), + Layouts.cell(tip)) + .getComponent()); outEngineXSettingPane.add(engineXSettingPane); } private void createLineEngineSettingPane() { outLineEngineSettingPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Line_Engine")); - outLineEngineSettingPane.setBounds(0, 0, 570, 240); + outLineEngineSettingPane.setBounds(0, 0, 700, 200); JPanel lineEngineSettingPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); JPanel pageQueryBoxPanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - lineEnginePageQueryBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Fixed_Line_Paging")); + lineEnginePageQueryBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Fixed_Line_Paging")); lineEnginePageQueryBox.setSelected(false); pageQueryBoxPanel.add(lineEnginePageQueryBox); - lineEngineSettingPane.add(pageQueryBoxPanel); + //lineEngineSettingPane.add(pageQueryBoxPanel); lineEngineCountPerPageEditor = new IntegerEditor(new Integer(30)); lineEngineCountPerPageEditor.setPreferredSize(new Dimension(120, 20)); lineEnginePageQueryPane = createPageQueryPane(lineEngineCountPerPageEditor); lineEnginePageQueryPane.setVisible(false); lineEngineSettingPane.add(lineEnginePageQueryPane); lineEnginePageQueryBox.addActionListener(new SelectActionListener(lineEnginePageQueryBox, lineEnginePageQueryPane)); - JPanel tipPane = createTipPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Line_Engine_tip")); - lineEngineSettingPane.add(tipPane); + JPanel tipPane = createTipPane(Toolkit.i18nText("Fine-Design_Report_Line_Engine_tip")); + //lineEngineSettingPane.add(tipPane); + lineEngineSettingPane.add(Layouts.column(10, + Layouts.cell(pageQueryBoxPanel), + Layouts.cell(lineEnginePageQueryPane), + Layouts.cell(tipPane)) + .getComponent()); outLineEngineSettingPane.add(lineEngineSettingPane); } @@ -190,16 +229,16 @@ public class ReportEnginePane extends BasicBeanPane { // 上侧文字 UILabel topExplainLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Report_Report_Engine_Warnning_Info"), 480); topExplainLabel.setForeground(new Color(0, 0, 0)); - advicePane.add(topExplainLabel); + //advicePane.add(topExplainLabel); // 下侧文字及链接 JPanel adviceDownPane = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - advicePane.add(adviceDownPane); + //advicePane.add(adviceDownPane); UILabel downExplainLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Report_Detail_Reference")); - adviceDownPane.add(downExplainLabel); + //adviceDownPane.add(downExplainLabel); downExplainLabel.setForeground(new Color(0, 0, 0)); JLabel helper = new FRExplainLabel(Toolkit.i18nText("Fine-Design_Report_Community_Help")); helper.setForeground(new Color(1, 159, 222)); - adviceDownPane.add(helper); + //adviceDownPane.add(helper); helper.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { @@ -211,6 +250,15 @@ public class ReportEnginePane extends BasicBeanPane { } } }); + adviceDownPane.add(Layouts.row(20, + Layouts.cell(downExplainLabel), + Layouts.cell(helper)) + .getComponent()); + advicePane.add(Layouts.column(20, + Layouts.cell(topExplainLabel), + Layouts.cell(adviceDownPane)) + .getComponent()); + return advicePane; } @@ -222,7 +270,7 @@ public class ReportEnginePane extends BasicBeanPane { buttonGroup.add(lineEngine); radioButtons.add(newEngine); radioButtons.add(lineEngine); - double p = TableLayout.PREFERRED; + double p = TableLayout.FILL; double[] rowSize = {p}; double[] columnSize = {p, p, p, p, p}; Component[][] components = new Component[][]{ @@ -239,7 +287,7 @@ public class ReportEnginePane extends BasicBeanPane { @Override protected String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Report_Engine_Attribute"); + return Toolkit.i18nText("Fine-Design_Report_Report_Engine_Attribute"); } @Override From 1d662d3efb2efd28a4b7876d34852f4874e2b437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=B8=96=E8=B1=AA?= <1944167742@qq.com> Date: Mon, 15 Jul 2024 09:32:57 +0800 Subject: [PATCH 167/302] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=BC=95=E6=93=8E?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E5=BC=B9=E7=AA=97=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/report/ReportEnginePane.java | 1 + 1 file changed, 1 insertion(+) diff --git a/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java b/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java index 86a1cd5e9a..3b6e279c41 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java @@ -183,6 +183,7 @@ public class ReportEnginePane extends BasicBeanPane { private void createLineEngineSettingPane() { outLineEngineSettingPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Line_Engine")); + // TODO SCALE动态伸缩大小 outLineEngineSettingPane.setBounds(0, 0, 700, 200); JPanel lineEngineSettingPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); JPanel pageQueryBoxPanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); From 727a94e47554c9897720a01a62e129c89aac73fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Mon, 15 Jul 2024 17:26:24 +0800 Subject: [PATCH 168/302] =?UTF-8?q?REPORT-117002=20feat:=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8UI=E6=80=A7=E8=83=BD=E7=9B=91=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/carton/CartonUtils.java | 8 ++++---- .../fr/design/carton/latency/DesignerLatencyMetric.java | 8 ++++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/carton/CartonUtils.java b/designer-base/src/main/java/com/fr/design/carton/CartonUtils.java index b67fe8c504..df8361662b 100644 --- a/designer-base/src/main/java/com/fr/design/carton/CartonUtils.java +++ b/designer-base/src/main/java/com/fr/design/carton/CartonUtils.java @@ -116,10 +116,10 @@ public class CartonUtils { } file.createNewFile(); } - BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file, true)); - String outputMessage = message.replaceAll("~", "\r\n") + "," + "\r\n"; - bufferedWriter.write(outputMessage); - bufferedWriter.close(); + try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file, true))) { + String outputMessage = message.replaceAll("~", "\r\n") + "," + "\r\n"; + bufferedWriter.write(outputMessage); + } } catch (IOException e) { FineLoggerFactory.getLogger().error("output fail", e); } diff --git a/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java b/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java index d98e26c198..766ff17dba 100644 --- a/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java +++ b/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java @@ -92,8 +92,12 @@ public class DesignerLatencyMetric { */ public void stop() { if (SwitchForSwingChecker.isLatencyMonitoring()) { - this.executorService.shutdown(); - this.scheduler.shutdown(); + if (this.executorService != null) { + this.executorService.shutdown(); + } + if (this.scheduler != null) { + this.scheduler.shutdown(); + } collectAndSubmit(); } } From 847477adfe5064b6cd1776e70f5ac21f98c7a3a2 Mon Sep 17 00:00:00 2001 From: Zhanying <2446962908@qq.com> Date: Tue, 16 Jul 2024 09:51:01 +0800 Subject: [PATCH 169/302] =?UTF-8?q?REPORT-70155=20fix:=20fvs=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E4=B8=BB=E9=A2=98=E6=A0=B7=E5=BC=8F=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=8D=95=E5=85=83=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../form/FormElementCasePaneDelegate.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/form/FormElementCasePaneDelegate.java b/designer-realize/src/main/java/com/fr/design/mainframe/form/FormElementCasePaneDelegate.java index 525b3c0ca4..9a30b3266d 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/form/FormElementCasePaneDelegate.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/form/FormElementCasePaneDelegate.java @@ -6,20 +6,21 @@ import com.fr.design.actions.core.ActionFactory; import com.fr.design.actions.form.FormECBackgroundAction; import com.fr.design.actions.form.FormECColumnsAction; import com.fr.design.actions.form.FormECFrozenAction; -import com.fr.design.designer.creator.XElementCase; +import com.fr.design.base.mode.DesignModeContext; import com.fr.design.event.TargetModifiedEvent; import com.fr.design.event.TargetModifiedListener; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.fit.NewUIModeCellElementPainter; -import com.fr.design.fit.common.FormDesignerUtil; import com.fr.design.gui.frpane.HyperlinkGroupPane; import com.fr.design.mainframe.*; import com.fr.design.mainframe.cell.QuickEditorRegion; +import com.fr.design.mainframe.theme.utils.DefaultThemedTemplateCellElementCase; import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.MenuDef; import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; import com.fr.design.present.ConditionAttributesGroupPane; +import com.fr.design.utils.gui.AdjustWorkBookDefaultStyleUtils; import com.fr.form.fit.common.LightTool; import com.fr.form.main.Form; import com.fr.grid.Grid; @@ -27,6 +28,7 @@ import com.fr.grid.GridColumn; import com.fr.grid.GridCorner; import com.fr.grid.GridRow; import com.fr.page.ReportSettingsProvider; +import com.fr.report.cell.DefaultTemplateCellElement; import com.fr.report.elementcase.TemplateElementCase; import com.fr.report.worksheet.FormElementCase; import com.fr.design.selection.SelectionEvent; @@ -34,7 +36,6 @@ import com.fr.design.selection.SelectionListener; import javax.swing.JComponent; import javax.swing.JPanel; -import java.awt.Insets; import java.awt.Rectangle; /** @@ -69,6 +70,16 @@ public class FormElementCasePaneDelegate extends ElementCasePane { + DefaultTemplateCellElement defaultTemplateCellElement = DefaultThemedTemplateCellElementCase.createInstance(); + // fvs调整单元格默认样式 + AdjustWorkBookDefaultStyleUtils.adjustCellElement(defaultTemplateCellElement); + return defaultTemplateCellElement; + }); + } } private Rectangle getBoundsLineRect(TemplateElementCase elementCase) { From ad86fcdb91469123a734187bb38c99ade470e529 Mon Sep 17 00:00:00 2001 From: Zhanying <2446962908@qq.com> Date: Tue, 16 Jul 2024 09:58:50 +0800 Subject: [PATCH 170/302] =?UTF-8?q?REPORT-77878=20fix:=20fvs=E6=8F=92?= =?UTF-8?q?=E4=BB=B6-=E8=A1=A8=E6=A0=BC=E9=BB=98=E8=AE=A4=E5=AD=97?= =?UTF-8?q?=E4=BD=93=E9=A2=9C=E8=89=B2=E6=98=AF=E7=99=BD=E8=89=B2=EF=BC=8C?= =?UTF-8?q?=E4=BD=86=E6=98=AF=E5=8F=B3=E9=94=AE=E6=B8=85=E9=99=A4=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=A0=BC=E6=A0=BC=E5=BC=8F=EF=BC=8C=E5=AD=97=E4=BD=93?= =?UTF-8?q?=E4=BC=9A=E5=8F=98=E4=B8=BA=E9=BB=91=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/grid/selection/CellSelection.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java b/designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java index 4d5fe8a62b..ca95a933df 100644 --- a/designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java +++ b/designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java @@ -32,6 +32,7 @@ import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.theme.utils.DefaultThemedTemplateCellElementCase; import com.fr.design.report.RowColumnPane; import com.fr.design.selection.QuickEditor; +import com.fr.design.utils.gui.AdjustWorkBookDefaultStyleUtils; import com.fr.grid.GridUtils; import com.fr.report.cell.CellElement; import com.fr.report.cell.DefaultTemplateCellElement; @@ -562,6 +563,8 @@ public class CellSelection extends Selection { for (int i = 0; i < removeElementList.size(); i++) { CellElement element = removeElementList.get(i); element.setStyle(null); + // fvs调整单元格默认样式 + AdjustWorkBookDefaultStyleUtils.adjustCellElement(element); } break; From c03449b739859c1ab4770d15d12f10037ffd24d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Tue, 16 Jul 2024 10:52:33 +0800 Subject: [PATCH 171/302] =?UTF-8?q?=E6=97=A0jira=20=E6=89=93=E5=8C=85?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/carton/latency/DesignerLatencyMetric.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java b/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java index 766ff17dba..7898b2ad42 100644 --- a/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java +++ b/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java @@ -1,7 +1,5 @@ package com.fr.design.carton.latency; -import com.fanruan.third.v2.org.ehcache.impl.internal.concurrent.ConcurrentHashMap; -import com.fr.concurrent.FineExecutors; import com.fr.concurrent.NamedThreadFactory; import com.fr.config.MarketConfig; import com.fr.design.DesignerEnvManager; @@ -19,6 +17,7 @@ import com.fr.workspace.WorkspaceEvent; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -72,8 +71,7 @@ public class DesignerLatencyMetric { // 初始化容器 initializeContainer(); // 启动异步性能记录线程池 - executorService = FineExecutors.newCachedThreadPool( - new NamedThreadFactory(DesignerLatencyMetric.class)); + executorService = Executors.newFixedThreadPool(8); // 启动定时埋点 this.scheduler = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("LatencyMetricWorker")); this.scheduler.scheduleWithFixedDelay(this::collectAndSubmit, 60, 60, TimeUnit.SECONDS); From b05fd1300ce677243f373dcc7963396c78ff1c98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Tue, 16 Jul 2024 19:06:43 +0800 Subject: [PATCH 172/302] =?UTF-8?q?REPORT-117002=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=80=A7=E8=83=BD=E5=9F=8B=E7=82=B9=E7=9B=91=E6=8E=A7?= =?UTF-8?q?=20=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../carton/latency/DesignerLatencyMetric.java | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java b/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java index 7898b2ad42..fa517096ee 100644 --- a/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java +++ b/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java @@ -8,9 +8,12 @@ import com.fr.design.mainframe.SiteCenterToken; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; +import com.fr.general.CloudCenter; import com.fr.general.http.HttpToolbox; import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; import com.fr.stable.ProductConstants; +import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; import com.fr.workspace.WorkspaceEvent; @@ -43,11 +46,13 @@ import static com.fr.design.carton.CartonConstants.USERID; */ public class DesignerLatencyMetric { + private String latencyUrl; private ExecutorService executorService; private ScheduledExecutorService scheduler; private static final Map LATENCY_CONTAINER = new ConcurrentHashMap<>(); - private static final String LATENCY_INFO_URL = "https://cloud.fanruan.com/api/monitor/record_of_deisgner_latency/single"; + private static final String DEFAULT_MONITOR_URL = "https://cloud.fanruan.com/api/monitor/"; + private static final String LATENCY_TABLE_SUFFIX = "record_of_designer_latency/single"; private final static class InstanceHolder { static final DesignerLatencyMetric INSTANCE = new DesignerLatencyMetric(); @@ -74,7 +79,7 @@ public class DesignerLatencyMetric { executorService = Executors.newFixedThreadPool(8); // 启动定时埋点 this.scheduler = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("LatencyMetricWorker")); - this.scheduler.scheduleWithFixedDelay(this::collectAndSubmit, 60, 60, TimeUnit.SECONDS); + this.scheduler.scheduleWithFixedDelay(this::collectAndSubmit, 60, 60, TimeUnit.MINUTES); // 注册设计器工作目录切换事件监听 EventDispatcher.listen(WorkspaceEvent.AfterSwitch, new Listener() { @Override @@ -100,6 +105,16 @@ public class DesignerLatencyMetric { } } + private String getLatencyUrl() { + if (StringUtils.isEmpty(latencyUrl)) { + String monitorEntry = CloudCenter.getInstance().acquireUrlByKind("cloud.monitor.api.entrypoint", DEFAULT_MONITOR_URL); + if (StringUtils.isNotEmpty(monitorEntry)) { + latencyUrl = monitorEntry + LATENCY_TABLE_SUFFIX; + } + } + return latencyUrl; + } + private void initializeContainer() { for (LatencyLevel level : LatencyLevel.values()) { LATENCY_CONTAINER.put(level, new AtomicInteger()); @@ -132,9 +147,9 @@ public class DesignerLatencyMetric { para.put("token", SiteCenterToken.generateToken()); para.put("content", collect()); try { - HttpToolbox.post(LATENCY_INFO_URL, para); - } catch (Throwable ignore) { - // doNothing + HttpToolbox.post(getLatencyUrl(), para); + } catch (Throwable t) { + FineLoggerFactory.getLogger().debug(t,"[Latency] failed to submit latency log to cloud."); } resetContainer(); } From 5e915785e160bddccc48cbc3b4f283f805ffb047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Tue, 16 Jul 2024 19:12:48 +0800 Subject: [PATCH 173/302] =?UTF-8?q?REPORT-117002=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=80=A7=E8=83=BD=E5=9F=8B=E7=82=B9=E7=9B=91=E6=8E=A7?= =?UTF-8?q?=20=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/carton/latency/DesignerLatencyMetric.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java b/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java index fa517096ee..68aa42b4c9 100644 --- a/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java +++ b/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java @@ -107,10 +107,9 @@ public class DesignerLatencyMetric { private String getLatencyUrl() { if (StringUtils.isEmpty(latencyUrl)) { - String monitorEntry = CloudCenter.getInstance().acquireUrlByKind("cloud.monitor.api.entrypoint", DEFAULT_MONITOR_URL); - if (StringUtils.isNotEmpty(monitorEntry)) { - latencyUrl = monitorEntry + LATENCY_TABLE_SUFFIX; - } + String monitorEntry = CloudCenter.getInstance().acquireUrlByKind("cloud.monitor.api.entrypoint"); + latencyUrl = (StringUtils.isNotEmpty(monitorEntry) ? monitorEntry : DEFAULT_MONITOR_URL) + + LATENCY_TABLE_SUFFIX; } return latencyUrl; } From edc7184564e6ed125862266152013045a52f156c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 17 Jul 2024 09:51:21 +0800 Subject: [PATCH 174/302] =?UTF-8?q?REPORT-127241=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=80=A7=E8=83=BD=E5=9F=8B=E7=82=B9=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/carton/latency/DesignerLatencyMetric.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java b/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java index 68aa42b4c9..4dc38634c0 100644 --- a/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java +++ b/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java @@ -87,6 +87,7 @@ public class DesignerLatencyMetric { collectAndSubmit(); } }); + FineLoggerFactory.getLogger().info("[Latency] designer latency metric started."); } } @@ -102,6 +103,7 @@ public class DesignerLatencyMetric { this.scheduler.shutdown(); } collectAndSubmit(); + FineLoggerFactory.getLogger().info("[Latency] designer latency metric stopped."); } } @@ -147,6 +149,7 @@ public class DesignerLatencyMetric { para.put("content", collect()); try { HttpToolbox.post(getLatencyUrl(), para); + FineLoggerFactory.getLogger().debug("[Latency] submit latency log to cloud."); } catch (Throwable t) { FineLoggerFactory.getLogger().debug(t,"[Latency] failed to submit latency log to cloud."); } @@ -163,7 +166,9 @@ public class DesignerLatencyMetric { info.put(DESIGN_METHOD, WorkContext.getCurrent().isLocal() ? LOCAL : REMOTE); info.put(OPERANDS_NUM, LATENCY_CONTAINER.values().stream().mapToInt(AtomicInteger::get).sum()); for (Map.Entry entry : LATENCY_CONTAINER.entrySet()) { - info.put(entry.getKey().getMark(), entry.getValue().get()); + if (!LatencyLevel.UNDEFINE.equals(entry.getKey())) { + info.put(entry.getKey().getMark(), entry.getValue().get()); + } } return info; } From 6963a1308011f2b5c8f449aca00c89a4de20e668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=B8=96=E8=B1=AA?= <1944167742@qq.com> Date: Wed, 17 Jul 2024 11:18:20 +0800 Subject: [PATCH 175/302] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=BC=95=E6=93=8E?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E5=BC=B9=E7=AA=97=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- .../fr/design/data/datapane/ChoosePane.java | 27 ++++-- .../write/submit/DBManipulationPane.java | 69 +++++++++++---- .../fr/design/report/ReportEnginePane.java | 85 ++++++++----------- .../fr/design/report/WriteShortCutsPane.java | 47 ++++++---- .../write/submit/SubmitVisitorListPane.java | 19 ++++- 6 files changed, 153 insertions(+), 96 deletions(-) diff --git a/build.gradle b/build.gradle index 4ebe9558d3..9f6c3dd88b 100644 --- a/build.gradle +++ b/build.gradle @@ -90,8 +90,8 @@ allprojects { implementation 'com.github.weisj:jsvg:1.2.0' implementation 'com.formdev:flatlaf:3.4' implementation 'com.formdev:flatlaf-extras:3.4' - implementation 'com.fanruan.vito:gui-inspector:1.0.1' implementation 'com.fine.swing.ui:layout:1.0-SNAPSHOT' + implementation 'com.fanruan.vito:gui-inspector:1.0.2' testImplementation 'org.easymock:easymock:3.5.1' testImplementation 'org.powermock:powermock-module-junit4:1.7.1' testImplementation 'org.powermock:powermock-api-easymock:1.7.1' diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java index 99a294fdde..1011d3f254 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java @@ -1,5 +1,8 @@ package com.fr.design.data.datapane; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIScale; import com.fr.base.TableData; import com.fr.data.core.DataCoreUtils; import com.fr.data.core.db.DBUtils; @@ -11,6 +14,7 @@ import com.fr.data.impl.DBTableData; import com.fr.data.operator.DataOperator; import com.fr.design.DesignerEnvManager; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.border.FineBorderFactory; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.RefreshLabel.Refreshable; import com.fr.design.data.datapane.preview.PreviewLabel; @@ -39,6 +43,7 @@ import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.server.connection.DBConnectAuth; +import groovy.swing.factory.BoxLayoutFactory; import javax.swing.JList; import javax.swing.JOptionPane; @@ -54,9 +59,7 @@ import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeCellRenderer; import javax.swing.tree.TreePath; -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; +import java.awt.*; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.ItemEvent; @@ -68,6 +71,10 @@ import java.util.List; import java.util.Set; import java.util.concurrent.CancellationException; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.scale; + /** * @author zhou * @since 2012-7-11下午4:49:39 @@ -133,11 +140,11 @@ public class ChoosePane extends BasicBeanPane implements Refresha } public ChoosePane(Previewable parent, int labelSize) { - this.initBasicComponet(); + this.initBasicComponent(); this.initComponentsLayout(new PreviewLabel(parent == null ? this : parent), labelSize); } - private void initBasicComponet() { + private void initBasicComponent() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); dsNameComboBox = new StringUIComboBox(); @@ -239,7 +246,15 @@ public class ChoosePane extends BasicBeanPane implements Refresha double p = TableLayout.PREFERRED; double f = TableLayout.FILL; JPanel northDSPane = TableLayoutHelper.createTableLayoutPane(coms, new double[]{p}, new double[]{p, f, p, f, p, f, COLUMN_SIZE, COLUMN_SIZE}); - + //JPanel northDSPane = new JPanel(new BorderLayout()); + + /*northDSPane.add( + row(10, + row(5, cell(l1), cell(dsNameComboBox)), + row(5, cell(l2), cell(schemaBox)), + row(5, cell(l3), cell(tableNameComboBox)), + row(5, cell(new RefreshLabel(this)), cell(previewLabel))) + .getComponent());*/ this.add(northDSPane, BorderLayout.CENTER); } diff --git a/designer-base/src/main/java/com/fr/design/write/submit/DBManipulationPane.java b/designer-base/src/main/java/com/fr/design/write/submit/DBManipulationPane.java index 46b11d2a89..103156944d 100644 --- a/designer-base/src/main/java/com/fr/design/write/submit/DBManipulationPane.java +++ b/designer-base/src/main/java/com/fr/design/write/submit/DBManipulationPane.java @@ -1,8 +1,11 @@ package com.fr.design.write.submit; +import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.utils.FineUIScale; import com.fr.base.BaseFormula; import com.fr.base.BaseUtils; import com.fr.base.Parameter; +import com.fr.cert.token.lang.Collections; import com.fr.data.DataConstants; import com.fr.data.condition.JoinCondition; import com.fr.data.condition.ListCondition; @@ -25,11 +28,14 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icombobox.UIComboBoxRenderer; +import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilist.CheckBoxList; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.javascript.JavaScriptActionPane; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.FRLeftFlowLayout; +import com.fr.design.layout.LeftCenterRightLayout; import com.fr.design.mainframe.DesignerContext; import com.fr.design.scrollruler.ModLineBorder; import com.fr.design.utils.gui.GUICoreUtils; @@ -83,9 +89,15 @@ 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.Date; import java.util.EventObject; import java.util.List; +import java.util.stream.Collectors; + +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; //august:这个东西应该分成两类,一类是有单元格的情况,一类是没有单元格的情况 public class DBManipulationPane extends BasicBeanPane { @@ -140,32 +152,45 @@ public class DBManipulationPane extends BasicBeanPane { this.v_Types = v_Types; JPanel northPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - this.add(northPane, BorderLayout.NORTH); + //this.add(northPane, BorderLayout.NORTH); dmlConfigComboBox = new UIComboBox(DML_CONFIG_TYPES); - JPanel typePane = GUICoreUtils.createFlowPane(new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Write_Choose_Submit_Type") + ":"), dmlConfigComboBox}, - FlowLayout.LEFT, 10); + //JPanel typePane = GUICoreUtils.createFlowPane(new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Write_Choose_Submit_Type") + ":"), dmlConfigComboBox}, + // FlowLayout.LEFT, 10); + JPanel typePane = new JPanel(new BorderLayout()); + typePane.add(row(10, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Write_Choose_Submit_Type") + ":")), + cell(dmlConfigComboBox)).getComponent(), BorderLayout.WEST); typePane.setBorder(BorderFactory.createTitledBorder(new ModLineBorder(ModLineBorder.TOP), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Write_Submit_Type"))); - northPane.add(typePane, BorderLayout.NORTH); - + //northPane.add(typePane, BorderLayout.NORTH); chooseTable = new ChoosePaneSupportFormula(); chooseTable.setBorder(BorderFactory.createTitledBorder(new ModLineBorder(ModLineBorder.TOP), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Base_Table"))); chooseTable.setTableNameComboBoxPopSize(160, 320); - northPane.add(chooseTable, BorderLayout.CENTER); + //northPane.add(chooseTable, BorderLayout.CENTER); // peter:编辑的TablePane JPanel editTablePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - this.add(editTablePane, BorderLayout.CENTER); - editTablePane.setBorder(BorderFactory.createTitledBorder(new ModLineBorder(ModLineBorder.TOP), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Base_Value"))); - + //this.add(editTablePane, BorderLayout.CENTER); + editTablePane.setBorder(BorderFactory.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Base_Value"))); + editTablePane.setBounds(0, 0, FineUIScale.scale(280), FineUIScale.scale(180)); keyColumnValuesTable = new KeyColumnNameValueTable(); - editTablePane.add(new JScrollPane(this.keyColumnValuesTable), BorderLayout.CENTER); + editTablePane.add(new UIScrollPane(this.keyColumnValuesTable), BorderLayout.CENTER); keyColumnValuesTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - keyColumnValuesTable.setPreferredScrollableViewportSize(new Dimension(280, 180)); + keyColumnValuesTable.setPreferredScrollableViewportSize(new Dimension(280, 150)); keyColumnValuesTable.setShowHorizontalLines(true); + northPane.add(column(10, true, + cell(typePane), + cell(chooseTable)) + .getComponent()); + + this.add(column(10, true, + cell(northPane), + cell(editTablePane)) + .getComponent()); + initJTableColumn(); addButtons(editTablePane); @@ -187,15 +212,18 @@ public class DBManipulationPane extends BasicBeanPane { // alex:添加操作按钮 UpdateAction[] actions = this.getActions(); if (actions != null && actions.length > 0) { - JPanel controlBtnPane = new JPanel(new GridLayout(actions.length + 1, 1, 4, 4)); + JPanel controlBtnPane = new JPanel(new BorderLayout()); editTablePane.add(GUICoreUtils.createBorderPane(controlBtnPane, BorderLayout.NORTH), BorderLayout.EAST); - - for (UpdateAction action : actions) { + List buttonGroup = Arrays.stream(actions).map(action -> cell(new UIButton(action))).collect(Collectors.toList()); + /*for (UpdateAction action : actions) { controlBtnPane.add(new UIButton(action)); - } + }*/ + checkBoxUpdatePane = new JPanel(new BorderLayout(0, 0)); checkBoxUpdatePane.setPreferredSize(new Dimension(120, 20)); - controlBtnPane.add(checkBoxUpdatePane); + //buttonGroup.add(cell(checkBoxUpdatePane)); + //controlBtnPane.add(column(5, buttonGroup.toArray(new Layouts.Cell[0])).getComponent()); + //controlBtnPane.add(checkBoxUpdatePane); UpdateCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_RWA_NotChange_Unmodified")); UIButton helpButton = new UIButton(HEIP_ICON); @@ -211,8 +239,13 @@ public class DBManipulationPane extends BasicBeanPane { } }); helpButton.set4ToolbarButton(); - checkBoxUpdatePane.add(UpdateCheckBox, BorderLayout.WEST); - checkBoxUpdatePane.add(helpButton, BorderLayout.EAST); + //checkBoxUpdatePane.add(UpdateCheckBox, BorderLayout.WEST); + //checkBoxUpdatePane.add(helpButton, BorderLayout.EAST); + buttonGroup.add(row(5, cell(UpdateCheckBox), + cell(helpButton))); + //checkBoxUpdatePane.add(row(5, cell(UpdateCheckBox), + // cell(helpButton)).getComponent()); + controlBtnPane.add(column(5, buttonGroup.toArray(new Layouts.Cell[0])).getComponent()); } } diff --git a/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java b/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java index 3b6e279c41..68decd16c1 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java @@ -1,6 +1,7 @@ package com.fr.design.report; import com.fine.swing.ui.layout.Layouts; +import com.fine.theme.utils.FineUIScale; import com.fine.theme.utils.FineUIUtils; import com.fr.design.beans.BasicBeanPane; import com.fr.design.dialog.FineJOptionPane; @@ -47,6 +48,11 @@ import java.util.ArrayList; import java.util.List; import com.fr.design.i18n.Toolkit; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + /** * @author fly.li * @version 10.0 @@ -80,22 +86,18 @@ public class ReportEnginePane extends BasicBeanPane { protected void initComponents() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - //JPanel outReportEnginePane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Report_Engine_Attribute")); JPanel outReportEnginePane = new JPanel(); outReportEnginePane.setLayout(FRGUIPaneFactory.createBorderLayout()); - outReportEnginePane.setPreferredSize(new Dimension(600, 370)); - //this.add(outReportEnginePane, BorderLayout.NORTH); + outReportEnginePane.setPreferredSize(new Dimension(FineUIScale.scale(600), FineUIScale.scale(370))); outReportEnginePane.add(createReportEnginePane()); - //JPanel outAdvicePane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advice")); - //this.add(outAdvicePane, BorderLayout.SOUTH); JPanel outAdvicePane = new JPanel(); outAdvicePane.setLayout(FRGUIPaneFactory.createBorderLayout()); - outAdvicePane.setPreferredSize(new Dimension(600, 160)); + outAdvicePane.setPreferredSize(new Dimension(FineUIScale.scale(600), FineUIScale.scale(160))); outAdvicePane.add(createAdvicePane()); - this.add(Layouts.column(20, - Layouts.cell(FineUIUtils.wrapComponentWithTitle(outReportEnginePane, Toolkit.i18nText("Fine-Design_Report_Report_Engine_Attribute"))), - Layouts.cell(FineUIUtils.wrapComponentWithTitle(outAdvicePane, Toolkit.i18nText("Fine-Design_Report_Advice")))) + this.add(column(20, true, + cell(wrapComponentWithTitle(outReportEnginePane, Toolkit.i18nText("Fine-Design_Report_Report_Engine_Attribute"))), + cell(wrapComponentWithTitle(outAdvicePane, Toolkit.i18nText("Fine-Design_Report_Advice")))) .getComponent()); } @@ -105,29 +107,24 @@ public class ReportEnginePane extends BasicBeanPane { clientPaging = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Enable_Client_Page")); clientPaging.setSelected(false); reportEnginePane.add(clientPagingPane); - //reportEnginePane.add(Layouts.row(10, Layouts.cell(clientPagingPane)).getComponent()); - //outPagingEngineSelectPane = FRGUIPaneFactory.createTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Paging_Engine_Select")); outPagingEngineSelectPane = new JPanel(); outPagingEngineSelectPane.setLayout(FRGUIPaneFactory.createBorderLayout()); - //reportEnginePane.add(outPagingEngineSelectPane); outPagingEngineSelectPane.setVisible(false); - outPagingEngineSelectPane.setPreferredSize(new Dimension(600, 300)); + outPagingEngineSelectPane.setPreferredSize(new Dimension(FineUIScale.scale(600), FineUIScale.scale(300))); outPagingEngineSelectPane.add(createPagingEngineSelectPane()); clientPaging.addActionListener(new SelectActionListener(clientPaging, outPagingEngineSelectPane)); clientPagingPane.add(clientPaging); - //reportEnginePane.add(outPagingEngineSelectPane); - //clientPagingPane.add(Layouts.box(Layouts.cell(clientPaging)).getComponent()); - reportEnginePane.add(Layouts.column(20, - Layouts.cell(clientPagingPane), - Layouts.cell(FineUIUtils.wrapComponentWithTitle(outPagingEngineSelectPane, Toolkit.i18nText("Fine-Design_Report_Paging_Engine_Select")))) + reportEnginePane.add(column(10, true, + cell(clientPagingPane), + cell(wrapComponentWithTitle(outPagingEngineSelectPane, Toolkit.i18nText("Fine-Design_Report_Paging_Engine_Select")))) .getComponent()); return reportEnginePane; } private JPanel createPagingEngineSelectPane() { engineSettingPane = new JLayeredPane(); - engineSettingPane.setPreferredSize(new Dimension(600, 240)); - engineSettingPane.setBounds(0, 0, 600, 240); + engineSettingPane.setPreferredSize(new Dimension(FineUIScale.scale(600), FineUIScale.scale(240))); + engineSettingPane.setBounds(0, 0, FineUIScale.scale(600), FineUIScale.scale(240)); createEngineXSettingPane(); createLineEngineSettingPane(); outLineEngineSettingPane.setVisible(false); @@ -136,7 +133,6 @@ public class ReportEnginePane extends BasicBeanPane { engineSettingPane.moveToFront(outEngineXSettingPane); engineSettingPane.setVisible(true); JPanel pagingEngineSelectPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - //engineSettingPane.add(Layouts.column()) pagingEngineSelectPane.add(createPagingEngineRadioPanel()); pagingEngineSelectPane.add(engineSettingPane); /*pagingEngineSelectPane.add(Layouts.column(10, @@ -151,32 +147,27 @@ public class ReportEnginePane extends BasicBeanPane { */ private void createEngineXSettingPane() { outEngineXSettingPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_New_Engine")); - outEngineXSettingPane.setBounds(0, 0, 700, 200); + outEngineXSettingPane.setBounds(0, 0, FineUIScale.scale(600), FineUIScale.scale(180)); JPanel engineXSettingPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); JPanel pageQueryBoxPanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); engineXPageQueryBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Fixed_Line_Paging")); engineXPageQueryBox.setSelected(false); pageQueryBoxPanel.add(engineXPageQueryBox); - //engineXSettingPane.add(pageQueryBoxPanel); engineXCountPerPageEditor = new IntegerEditor(new Integer(30)); - engineXCountPerPageEditor.setPreferredSize(new Dimension(120, 20)); + engineXCountPerPageEditor.setPreferredSize(new Dimension(FineUIScale.scale(120), FineUIScale.scale(20))); engineXPageQueryPane = createPageQueryPane(engineXCountPerPageEditor); engineXPageQueryPane.setVisible(false); - //engineXSettingPane.add(engineXPageQueryPane); engineXPageQueryBox.addActionListener(new SelectActionListener(engineXPageQueryBox, engineXPageQueryPane)); JPanel rowCountPanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); rowCountBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Row_Count")); rowCountBox.setSelected(false); rowCountPanel.add(rowCountBox); - //engineXSettingPane.add(rowCountPanel); - //engineXSettingPane.add(createTipPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_X_tip"))); JPanel tip = createTipPane(Toolkit.i18nText("Fine-Design_Report_Engine_X_tip")); - //engineXSettingPane.add(tip); - engineXSettingPane.add(Layouts.column(10, - Layouts.cell(pageQueryBoxPanel), - Layouts.cell(engineXPageQueryPane), - Layouts.cell(rowCountPanel), - Layouts.cell(tip)) + engineXSettingPane.add(column(10, + cell(pageQueryBoxPanel), + cell(engineXPageQueryPane), + cell(rowCountPanel), + cell(tip)) .getComponent()); outEngineXSettingPane.add(engineXSettingPane); } @@ -184,13 +175,12 @@ public class ReportEnginePane extends BasicBeanPane { private void createLineEngineSettingPane() { outLineEngineSettingPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Line_Engine")); // TODO SCALE动态伸缩大小 - outLineEngineSettingPane.setBounds(0, 0, 700, 200); + outLineEngineSettingPane.setBounds(0, 0, FineUIScale.scale(600), FineUIScale.scale(200)); JPanel lineEngineSettingPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); JPanel pageQueryBoxPanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); lineEnginePageQueryBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Fixed_Line_Paging")); lineEnginePageQueryBox.setSelected(false); pageQueryBoxPanel.add(lineEnginePageQueryBox); - //lineEngineSettingPane.add(pageQueryBoxPanel); lineEngineCountPerPageEditor = new IntegerEditor(new Integer(30)); lineEngineCountPerPageEditor.setPreferredSize(new Dimension(120, 20)); lineEnginePageQueryPane = createPageQueryPane(lineEngineCountPerPageEditor); @@ -198,11 +188,10 @@ public class ReportEnginePane extends BasicBeanPane { lineEngineSettingPane.add(lineEnginePageQueryPane); lineEnginePageQueryBox.addActionListener(new SelectActionListener(lineEnginePageQueryBox, lineEnginePageQueryPane)); JPanel tipPane = createTipPane(Toolkit.i18nText("Fine-Design_Report_Line_Engine_tip")); - //lineEngineSettingPane.add(tipPane); - lineEngineSettingPane.add(Layouts.column(10, - Layouts.cell(pageQueryBoxPanel), - Layouts.cell(lineEnginePageQueryPane), - Layouts.cell(tipPane)) + lineEngineSettingPane.add(column(10, + cell(pageQueryBoxPanel), + cell(lineEnginePageQueryPane), + cell(tipPane)) .getComponent()); outLineEngineSettingPane.add(lineEngineSettingPane); } @@ -230,16 +219,12 @@ public class ReportEnginePane extends BasicBeanPane { // 上侧文字 UILabel topExplainLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Report_Report_Engine_Warnning_Info"), 480); topExplainLabel.setForeground(new Color(0, 0, 0)); - //advicePane.add(topExplainLabel); // 下侧文字及链接 JPanel adviceDownPane = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - //advicePane.add(adviceDownPane); UILabel downExplainLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Report_Detail_Reference")); - //adviceDownPane.add(downExplainLabel); downExplainLabel.setForeground(new Color(0, 0, 0)); JLabel helper = new FRExplainLabel(Toolkit.i18nText("Fine-Design_Report_Community_Help")); helper.setForeground(new Color(1, 159, 222)); - //adviceDownPane.add(helper); helper.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { @@ -251,13 +236,13 @@ public class ReportEnginePane extends BasicBeanPane { } } }); - adviceDownPane.add(Layouts.row(20, - Layouts.cell(downExplainLabel), - Layouts.cell(helper)) + adviceDownPane.add(row(20, + cell(downExplainLabel), + cell(helper)) .getComponent()); - advicePane.add(Layouts.column(20, - Layouts.cell(topExplainLabel), - Layouts.cell(adviceDownPane)) + advicePane.add(column(20, + cell(topExplainLabel), + cell(adviceDownPane)) .getComponent()); return advicePane; diff --git a/designer-realize/src/main/java/com/fr/design/report/WriteShortCutsPane.java b/designer-realize/src/main/java/com/fr/design/report/WriteShortCutsPane.java index f48061d33a..e1887084d2 100644 --- a/designer-realize/src/main/java/com/fr/design/report/WriteShortCutsPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/WriteShortCutsPane.java @@ -14,15 +14,15 @@ import com.fr.transaction.WorkerAdaptor; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingConstants; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + public class WriteShortCutsPane extends JPanel{ private static final int V_GAP = 20; @@ -51,15 +51,18 @@ public class WriteShortCutsPane extends JPanel{ contentPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); // 纵向布局,横向自适应 - contentPane.setLayout(new GridBagLayout()); + /*contentPane.setLayout(new GridBagLayout()); GridBagConstraints cons = new GridBagConstraints(); cons.fill = GridBagConstraints.HORIZONTAL; cons.weightx = 1; cons.gridx = 0; - cons.insets = new Insets(20, 0, 0, 0); - - contentPane.add(getFeatureNamePane(), cons); - contentPane.add(getHintsPane(), cons); + cons.insets = new Insets(20, 0, 0, 0);*/ + contentPane.setLayout(new BorderLayout()); + contentPane.add(column(10, true, + cell(getFeatureNamePane()), + cell(getHintsPane())).getComponent()); + //contentPane.add(getFeatureNamePane()); + //contentPane.add(getHintsPane()); return contentPane; } @@ -77,16 +80,20 @@ public class WriteShortCutsPane extends JPanel{ JPanel switchBtnPane = getSwitchBtnPane(); nextRowHK = new UILabel(nextRowString, SwingConstants.CENTER); - JPanel centerPane = new JPanel(new GridLayout(2, 4, 0, 0)); + JPanel centerPane = new JPanel(new FlowLayout(FlowLayout.CENTER)); centerPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); - centerPane.add(name); + /*centerPane.add(name); centerPane.add(nextCol); centerPane.add(new JPanel()); centerPane.add(nextRow); centerPane.add(shortName); centerPane.add(nextColHK); centerPane.add(switchBtnPane); - centerPane.add(nextRowHK); + centerPane.add(nextRowHK);*/ + centerPane.add(column(20, true, + row(50, cell(name), cell(nextCol), flex(50), cell(nextRow)), + row(50, cell(shortName), cell(nextColHK), cell(switchBtnPane), cell(nextRowHK)) + ).getComponent()); featureNamePane.add(centerPane, BorderLayout.CENTER); @@ -116,16 +123,22 @@ public class WriteShortCutsPane extends JPanel{ preCol = new UILabel("Shift+" + nextColString, SwingConstants.CENTER); preRow = new UILabel("Shift+" + nextRowString, SwingConstants.CENTER); - JPanel centerPane = new JPanel(new GridLayout(2, 3, 0, V_GAP)); + JPanel centerPane = new JPanel(new FlowLayout(FlowLayout.CENTER)); centerPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 100)); - centerPane.add(systemDefault); + /*centerPane.add(systemDefault); centerPane.add(preColText); centerPane.add(preCol); centerPane.add(new JPanel()); centerPane.add(preRowText); - centerPane.add(preRow); + centerPane.add(preRow);*/ + centerPane.add(row(80, + column(flex(), cell(systemDefault), flex()), + column(20, + row(80, cell(preColText), cell(preCol)), + row(80, cell(preRowText), cell(preRow))) + ).getComponent()); hintsPane.add(centerPane, BorderLayout.CENTER); diff --git a/designer-realize/src/main/java/com/fr/design/write/submit/SubmitVisitorListPane.java b/designer-realize/src/main/java/com/fr/design/write/submit/SubmitVisitorListPane.java index 6d5aac3022..e0890a65a2 100644 --- a/designer-realize/src/main/java/com/fr/design/write/submit/SubmitVisitorListPane.java +++ b/designer-realize/src/main/java/com/fr/design/write/submit/SubmitVisitorListPane.java @@ -33,6 +33,10 @@ import java.awt.event.ItemListener; import java.util.*; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.cell; + public class SubmitVisitorListPane extends ObjectJControlPane { public SubmitVisitorListPane(ElementCasePane ePane) { @@ -186,12 +190,19 @@ public class SubmitVisitorListPane extends ObjectJControlPane { } csjConfigComboBox = new UIComboBox(configTypes.toArray()); - JPanel typePane = GUICoreUtils.createFlowPane(new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Write_Choose_Submit_Type") + ":"), csjConfigComboBox}, - FlowLayout.LEFT, 10); + //JPanel typePane = GUICoreUtils.createFlowPane(new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Write_Choose_Submit_Type") + ":"), csjConfigComboBox}, + // FlowLayout.LEFT, 10); + JPanel typePane = new JPanel(new BorderLayout()); + typePane.add(row(10, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Write_Choose_Submit_Type") + ":")), + cell(csjConfigComboBox)).getComponent(), BorderLayout.WEST); typePane.setBorder(BorderFactory.createTitledBorder(new ModLineBorder(ModLineBorder.TOP), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Write_Submit_Type"))); - this.add(typePane, BorderLayout.NORTH); + /*this.add(typePane, BorderLayout.NORTH); - this.add(customCardPane, BorderLayout.CENTER); + this.add(customCardPane, BorderLayout.CENTER);*/ + this.add(column(10, + cell(typePane), + cell(customCardPane)).getComponent()); csjConfigComboBox.addItemListener(new ItemListener() { @Override From 5980231c6de2cb0498c56fadbf088202425ed242 Mon Sep 17 00:00:00 2001 From: "Richard.Fang" Date: Wed, 17 Jul 2024 12:08:50 +0800 Subject: [PATCH 176/302] =?UTF-8?q?REPORT-125241=20fix:=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E4=BB=8E=E5=86=85=E5=B1=82=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=88=B0=E6=9C=80=E5=A4=96=E5=B1=82=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E6=97=B6=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/file/DefaultTemplateTreeDefineProcessor.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java b/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java index 1d2048fa28..9bee877aee 100644 --- a/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java +++ b/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java @@ -421,7 +421,9 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi dialog.setVisible(true); DesignerFrameFileDealerPane.getInstance().getSelectedOperation().refresh(); - LocateAction.gotoEditingTemplateLeaf(targetFile); + SwingUtilities.invokeLater(() -> { + LocateAction.gotoEditingTemplateLeaf(targetFile); + }); } } From 9f849586a041dd99baaaa18cfadc6615ee55ef2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 17 Jul 2024 15:44:39 +0800 Subject: [PATCH 177/302] =?UTF-8?q?REPORT-113994=20feat:TabPane=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/actions/file/PreferencePane.java | 2 +- .../fr/design/gui/frpane/FineTabbedPane.java | 166 ++++++++++++++++++ .../fr/design/gui/ibutton/UIButtonGroup.java | 13 +- .../components/TabbedPaneStoryBoard.java | 63 +++++++ .../com/fr/design/dscolumn/DSColumnPane.java | 23 +-- 5 files changed, 253 insertions(+), 14 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/gui/frpane/FineTabbedPane.java create mode 100644 designer-base/src/test/java/com/fr/design/gui/storybook/components/TabbedPaneStoryBoard.java diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java index 8ac946f423..0ccef7087a 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java @@ -326,7 +326,7 @@ public class PreferencePane extends BasicPane { cell(createTplPreviewPane()), // 设计器启动选项 cell(createDesignerStartupPane()) - ).getComponent(); + ).weight(1).getComponent(); useUniverseDBMCheckbox = new UICheckBox(i18nText("Fine-Design_Basic_Use_Universe_Database_Manager")); UIScrollPane adviceScrollPane = patchScroll(advancePane); tabPane.addTab(i18nText("Fine-Design_Basic_Advanced"), adviceScrollPane); diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/FineTabbedPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/FineTabbedPane.java new file mode 100644 index 0000000000..54b01f2d48 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/FineTabbedPane.java @@ -0,0 +1,166 @@ +package com.fr.design.gui.frpane; + +import com.fine.swing.ui.layout.Column; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.gui.ibutton.UIButtonGroup; + +import javax.swing.JPanel; +import javax.swing.event.ChangeListener; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Component; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Map; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + +/** + * Tab面板组件 + * + * @author Levy.Xie + * @since 11.0 + * Created on 2024/05/14 + */ +public class FineTabbedPane extends Column { + + private CardLayout cards; + private JPanel centerPane; + private final float headRatio; + private final UIButtonGroup tabGroup; + private final Map tabComponents; + + private FineTabbedPane(Map tabComponents, float headRatio, int[] tabLayout) { + this.headRatio = headRatio; + this.tabComponents = tabComponents; + + String[] titleArray = tabComponents.keySet().toArray(new String[0]); + this.tabGroup = new UIButtonGroup<>(titleArray, titleArray, tabLayout); + + initLayout(); + initListeners(); + } + + /** + * 建造者模式创建TabPane + * + * @return TabPaneBuilder + */ + public static TabPaneBuilder builder() { + return new TabPaneBuilder(); + } + + /** + * FineTabbedPane建造者 + */ + public static class TabPaneBuilder { + private int[] tabLayout; + private float headRatio = 0.5f; + private final Map tabComponents = new LinkedHashMap<>(); + + /** + * 设置头部居中比例,0-1之间 + * + * @param headRatio 头部居中比例 + * @return TabPaneBuilder + */ + public TabPaneBuilder withHeadRatio(float headRatio) { + this.headRatio = headRatio; + return this; + } + + /** + * 设置Tab布局,形如[3,4]即为首行3个组件,次行4个组件 + * + * @param tabLayout Tab头部布局 + * @return TabPaneBuilder + */ + public TabPaneBuilder withTabLayout(int[] tabLayout) { + this.tabLayout = tabLayout; + return this; + } + + /** + * 添加tab标签 + * + * @param title tab标签标头 + * @param component 组件 + * @return TabPaneBuilder + */ + public TabPaneBuilder addTab(String title, Component component) { + JPanel wrapperPane = new JPanel(new BorderLayout()); + wrapperPane.add(component, BorderLayout.CENTER); + this.tabComponents.put(title, wrapperPane); + return this; + } + + /** + * 构造 + * + * @return FineTabbedPane + */ + public FineTabbedPane build() { + if (headRatio > 1) { + throw new IllegalArgumentException("illegal headRatio argument!"); + } + if (tabLayout != null && Arrays.stream(tabLayout).sum() != tabComponents.size()) { + throw new IllegalArgumentException("illegal tab layout argument!"); + } + return new FineTabbedPane(tabComponents, headRatio, tabLayout); + } + } + + private void initLayout() { + cards = new CardLayout(); + centerPane = new JPanel(cards); + tabComponents.forEach((key, value) -> centerPane.add(value, key)); + float flexRatio = (1 - headRatio) / 2; + add( + row( + flex(flexRatio), cell(tabGroup).weight(headRatio), flex(flexRatio) + ), + fix(5), + cell(centerPane).with(it -> FineUIStyle.setStyle(it, FineUIStyle.LIGHT_GREY)) + ); + setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); + } + + private void initListeners() { + tabGroup.addChangeListener((e) -> { + cards.show(centerPane, String.valueOf(tabGroup.getSelectedItem())); + }); + tabGroup.setSelectedIndex(0); + cards.show(centerPane, String.valueOf(tabGroup.getSelectedItem())); + } + + /** + * 添加事件监听 + * + * @param l 监听器 + */ + public void addChangeListener(ChangeListener l) { + listenerList.add(ChangeListener.class, l); + } + + /** + * 移除事件监听 + * + * @param l 监听器 + */ + public void removeChangeListener(ChangeListener l) { + listenerList.remove(ChangeListener.class, l); + } + + /** + * 获取当前选中的Tab组件 + * + * @return Tab组件 + */ + public Component getSelectedComponent() { + return tabComponents.get(String.valueOf(tabGroup.getSelectedItem())); + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java index bd31f513e1..1468e9255a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java @@ -50,6 +50,7 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb private GlobalNameListener globalNameListener = null; private String buttonGroupName = StringUtils.EMPTY; private boolean isClick; + private int[] customCols; private UIObserverListener uiObserverListener; private boolean autoFireStateChanged = true; @@ -144,10 +145,11 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb initLayout(getCols(), inToolbar); } - public UIButtonGroup(String[] textArray, T[] objects) { + public UIButtonGroup(String[] textArray, T[] objects, int[] customCols) { if (!ArrayUtils.isEmpty(objects) && textArray.length == objects.length) { this.objectList = Arrays.asList(objects); } + this.customCols = customCols; labelButtonList = new ArrayList<>(textArray.length); totalButtonSize = textArray.length; for (int i = 0; i < textArray.length; i++) { @@ -180,17 +182,24 @@ public class UIButtonGroup extends Column implements GlobalNameObserver, UIOb initLayout(getCols()); } + public UIButtonGroup(String[] textArray, T[] objects) { + this(textArray, objects, null); + } + @Override public String getUIClassID() { return UI_CLASS_ID; } /** - * 计算按钮组的列布局 + * 计算按钮组的列布局;支持自定义布局 * * @return 列布局,形如[5,3] 即为两行,首行5个组件,次行3个组件 */ protected int[] getCols() { + if (customCols != null) { + return customCols; + } return new int[]{totalButtonSize}; } diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/TabbedPaneStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/TabbedPaneStoryBoard.java new file mode 100644 index 0000000000..196b77615f --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/TabbedPaneStoryBoard.java @@ -0,0 +1,63 @@ +package com.fr.design.gui.storybook.components; + +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.gui.frpane.FineTabbedPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.storybook.StoryBoard; + +import java.awt.Component; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; + +/** + * @author Levy.Xie + * @since 11.0 + * Created on 2024/05/22 + */ +public class TabbedPaneStoryBoard extends StoryBoard { + public TabbedPaneStoryBoard() { + super("切换标题面板"); + add( + cell(createSampleTabPane()), + cell(createSampleTabPaneWithRatio(0.8f)), + cell(createMultiRowTab()) + ); + } + + private FineTabbedPane createSampleTabPane() { + + return FineTabbedPane.builder() + .addTab("测试1", getSampleCell(1)) + .addTab("测试2", getSampleCell(2)) + .build(); + } + + private FineTabbedPane createSampleTabPaneWithRatio(float ratio) { + + return FineTabbedPane.builder() + .addTab("测试1", getSampleCell(1)) + .addTab("测试2", getSampleCell(2)) + .withHeadRatio(ratio) + .build(); + } + + private FineTabbedPane createMultiRowTab() { + + return FineTabbedPane.builder() + .addTab("测试1", getSampleCell(1)) + .addTab("测试2", getSampleCell(2)) + .addTab("测试3", getSampleCell(3)) + .addTab("测试4", getSampleCell(4)) + .addTab("测试5", getSampleCell(5)) + .withTabLayout(new int[]{2,3}) + .build(); + } + + private Component getSampleCell(int seq) { + return column(10, + cell(new UIButton(seq + "-按钮1")), cell(new UIButton(seq + "-按钮2")) + ).with(it -> it.setBorder(new ScaledEmptyBorder(10, 10, 10, 10))).getComponent(); + } + +} diff --git a/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnPane.java b/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnPane.java index 3f0add29ba..d3378b8956 100644 --- a/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnPane.java +++ b/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnPane.java @@ -2,7 +2,7 @@ package com.fr.design.dscolumn; import com.fr.data.TableDataSource; import com.fr.design.dialog.BasicPane; -import com.fr.design.gui.frpane.UITabbedPane; +import com.fr.design.gui.frpane.FineTabbedPane; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.mainframe.theme.utils.DefaultThemedTemplateCellElementCase; @@ -29,7 +29,7 @@ public class DSColumnPane extends BasicPane { public static final Dimension DEFAULT_DIMENSION = new Dimension(700, 600); private TableDataSource tplEC; - private UITabbedPane tabbedPane; + private FineTabbedPane tabbedPane; private DSColumnBasicPane basicPane = null; private DSColumnConditionsPane conditionPane = null; private DSColumnAdvancedPane advancedPane = null; @@ -90,22 +90,23 @@ public class DSColumnPane extends BasicPane { JPanel contentPane = this; contentPane.setLayout(FRGUIPaneFactory.createBorderLayout()); - //peter:中心Panel. - tabbedPane = new UITabbedPane(); - tabbedPane.addChangeListener(appliedWizardTabChangeListener); - - contentPane.add(tabbedPane, BorderLayout.CENTER); - //_denny: 数据列面板 basicPane = new DSColumnBasicPane(setting); basicPane.addPropertyChangeListener("cellElement", myPropertyChangeListener); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Basic"), basicPane); conditionPane = new DSColumnConditionsPane(setting); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Filter"), conditionPane); advancedPane = new DSColumnAdvancedPane(setting); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), advancedPane); + + //peter:中心Panel. + tabbedPane = FineTabbedPane.builder() + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Basic"), basicPane) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Filter"), conditionPane) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), advancedPane) + .build(); + tabbedPane.addChangeListener(appliedWizardTabChangeListener); + + contentPane.add(tabbedPane, BorderLayout.CENTER); this.setPreferredSize(new Dimension(610, 400)); } From 4f0a24f5e751a22ddbad8ff5483d7f45c21f4293 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 17 Jul 2024 15:47:53 +0800 Subject: [PATCH 178/302] =?UTF-8?q?REPORT-113994=20feat:TabPane=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/actions/file/PreferencePane.java | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java index 0ccef7087a..093d3079f4 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java @@ -14,6 +14,7 @@ import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.dialog.DialogActionListener; import com.fr.design.editor.editor.IntegerEditor; import com.fr.design.file.SaveSomeTemplatePane; +import com.fr.design.gui.frpane.FineTabbedPane; import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIColorButton; @@ -53,6 +54,7 @@ import com.fr.io.attr.ImageExportAttr; import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; import com.fr.report.ReportConfigManager; +import com.fr.stable.ArrayUtils; import com.fr.stable.Constants; import com.fr.stable.os.OperatingSystem; import com.fr.third.apache.logging.log4j.Level; @@ -284,8 +286,6 @@ public class PreferencePane extends BasicPane { protected void initComponents() { JPanel contentPane = this; contentPane.setLayout(FRGUIPaneFactory.createBorderLayout()); - UITabbedPane tabPane = new UITabbedPane(); - contentPane.add(tabPane, BorderLayout.CENTER); // 常用面板 JPanel generalPane = column(SETTING_V_GAP, // 功能设置 @@ -300,7 +300,6 @@ public class PreferencePane extends BasicPane { cell(createStartupPagePane()) ).weight(1).getComponent(); UIScrollPane generalScrollPane = patchScroll(generalPane); - tabPane.addTab(i18nText("Fine-Design_Basic_General"), generalScrollPane); // 高级面板 JPanel advancePane = column(SETTING_V_GAP, @@ -329,7 +328,6 @@ public class PreferencePane extends BasicPane { ).weight(1).getComponent(); useUniverseDBMCheckbox = new UICheckBox(i18nText("Fine-Design_Basic_Use_Universe_Database_Manager")); UIScrollPane adviceScrollPane = patchScroll(advancePane); - tabPane.addTab(i18nText("Fine-Design_Basic_Advanced"), adviceScrollPane); // 版本管理面板 //初始化vcs总面板 @@ -344,7 +342,14 @@ public class PreferencePane extends BasicPane { UIScrollPane vcsScrollPane = patchScroll(vcsPane); //配置面板作为vcs总面板的一张卡片 vcsParentPane.add(vcsScrollPane, VcsMovePanel.SETTING); - tabPane.addTab(i18nText("Fine-Design_Vcs_Title"), vcsParentPane); + + FineTabbedPane tabbedPane = FineTabbedPane.builder() + .addTab(i18nText("Fine-Design_Basic_General"), generalScrollPane) + .addTab(i18nText("Fine-Design_Basic_Advanced"), adviceScrollPane) + .addTab(i18nText("Fine-Design_Vcs_Title"), vcsParentPane) + .build(); + contentPane.add(tabbedPane, BorderLayout.CENTER); + } private Component createDesignerStartupPane() { @@ -669,13 +674,13 @@ public class PreferencePane extends BasicPane { } }); JPanel editPanel = column(10, - cell(supportStringToFormulaBox), - row( - cell(defaultStringToFormulaBox), - fix(10), - cell(shortCutInfoLabel), - cell(shortCutLabel) - ) + cell(supportStringToFormulaBox), + row( + cell(defaultStringToFormulaBox), + fix(10), + cell(shortCutInfoLabel), + cell(shortCutLabel) + ) ).getComponent(); return FineUIUtils.wrapComponentWithTitle(editPanel, i18nText("Fine-Design_Basic_Editor_Preference")); } @@ -809,7 +814,7 @@ public class PreferencePane extends BasicPane { languageComboBox.setFont(FRFont.getInstance("Dialog", Font.PLAIN, 12));//为了在中文系统中显示韩文 return languageComboBox; } - + private Component createStartupPagePane() { startupPageEnabledCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Startup_Page_Config_Check_Text")); UILabel descLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Startup_Page_Config_Desc"), PREFERENCE_LABEL_MAX_WIDTH); From e3b9ac78c67bf930c1cf5c2a1366c720639b88b2 Mon Sep 17 00:00:00 2001 From: renekton Date: Thu, 18 Jul 2024 14:33:48 +0800 Subject: [PATCH 179/302] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=BC=95=E6=93=8E?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E5=BC=B9=E7=AA=97=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/frpane/ObjectProperiesPane.java | 4 +- .../itableeditorpane/UIArrayTableModel.java | 5 +- .../fr/design/write/submit/CustomJobPane.java | 33 +++++++--- .../fr/design/report/ReportEnginePane.java | 60 ++++++++++--------- .../fr/design/report/WriteShortCutsPane.java | 2 +- .../design/webattr/ReportWriteAttrPane.java | 2 +- .../write/submit/SubmitVisitorListPane.java | 4 +- 7 files changed, 67 insertions(+), 43 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/ObjectProperiesPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/ObjectProperiesPane.java index e946ad4f94..de904f5a45 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/ObjectProperiesPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/ObjectProperiesPane.java @@ -51,7 +51,9 @@ public class ObjectProperiesPane extends BasicBeanPane { JScrollPane selectedItemScrollPane = new JScrollPane(); selectedItemScrollPane.setViewportView(northPane); selectedItemScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - this.add(selectedItemScrollPane, BorderLayout.CENTER); + JPanel centerPane = new JPanel(new BorderLayout()); + centerPane.add(selectedItemScrollPane); + this.add(centerPane, BorderLayout.CENTER); } @Override diff --git a/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UIArrayTableModel.java b/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UIArrayTableModel.java index b42358dfbc..15d166bcd2 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UIArrayTableModel.java +++ b/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UIArrayTableModel.java @@ -3,6 +3,7 @@ package com.fr.design.gui.itableeditorpane; import java.awt.event.ActionEvent; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class UIArrayTableModel extends UITableModelAdapter implements ActionStyle { @@ -67,7 +68,9 @@ public class UIArrayTableModel extends UITableModelAdapter implements @Override public void actionPerformed(ActionEvent e) { super.actionPerformed(e); - addRow(new Object[getColumnCount()]); + Object[] values = new Object[getColumnCount()]; + Arrays.fill(values, "="); + addRow(values); fireTableDataChanged(); } } diff --git a/designer-base/src/main/java/com/fr/design/write/submit/CustomJobPane.java b/designer-base/src/main/java/com/fr/design/write/submit/CustomJobPane.java index 6e4f2d803f..717f19b907 100644 --- a/designer-base/src/main/java/com/fr/design/write/submit/CustomJobPane.java +++ b/designer-base/src/main/java/com/fr/design/write/submit/CustomJobPane.java @@ -22,6 +22,10 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + /** * Author : Shockway * Date: 13-7-29 @@ -36,7 +40,7 @@ public abstract class CustomJobPane extends BasicBeanPane { this.setLayout(FRGUIPaneFactory.createBorderLayout()); JPanel reportletNamePane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(); classNameTextField = new UITextField(getLengthOfTextField()); - reportletNamePane.add(classNameTextField); + //reportletNamePane.add(classNameTextField); UIButton browserButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Select")); browserButton.setPreferredSize(new Dimension( @@ -48,8 +52,9 @@ public abstract class CustomJobPane extends BasicBeanPane { GraphHelper.getWidth(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Select")) + 20, classNameTextField.getPreferredSize().height)); - reportletNamePane.add(browserButton); - reportletNamePane.add(editButton); + /*reportletNamePane.add(browserButton); + reportletNamePane.add(editButton);*/ + UITextArea area = new UITextArea(2, 1); browserButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { @@ -60,6 +65,7 @@ public abstract class CustomJobPane extends BasicBeanPane { new DialogActionAdapter() { public void doOk() { classNameTextField.setText(bPane.getClassPath()); + area.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Extend_Class", "com.fr.data.AbstractSubmitTask")); checkAddButtonEnable(); } }).setVisible(true); @@ -73,6 +79,7 @@ public abstract class CustomJobPane extends BasicBeanPane { new DialogActionAdapter() { public void doOk() { classNameTextField.setText(javaEditorPane.getClassText()); + area.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Extend_Class", "com.fr.data.AbstractSubmitTask")); checkAddButtonEnable(); } }); @@ -87,18 +94,28 @@ public abstract class CustomJobPane extends BasicBeanPane { }); reportletNamePane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Class_Name"), null)); - this.add(reportletNamePane, BorderLayout.NORTH); + reportletNamePane.add(row(10, + cell(classNameTextField).weight(1.0), + cell(browserButton), + cell(editButton) + ).getComponent()); + //this.add(reportletNamePane, BorderLayout.NORTH); objectProperiesPane = new ObjectProperiesPane(); objectProperiesPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Property"), null)); - this.add(objectProperiesPane, BorderLayout.CENTER); + //this.add(objectProperiesPane, BorderLayout.CENTER); - UITextArea area = new UITextArea(2, 1); - area.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Extend_Class", "com.fr.data.AbstractSubmitTask")); + //UITextArea area = new UITextArea(2, 1); + //area.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Extend_Class", "com.fr.data.AbstractSubmitTask")); JPanel dsPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); dsPane.add(area); dsPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Custom_Job_Description"), null)); - this.add(dsPane, BorderLayout.SOUTH); + //this.add(dsPane, BorderLayout.SOUTH); + this.add(column( + cell(reportletNamePane), + cell(objectProperiesPane).weight(1.0), + cell(dsPane) + ).getComponent()); checkAddButtonEnable(); } diff --git a/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java b/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java index 68decd16c1..ed41dd771e 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java @@ -51,7 +51,9 @@ import com.fr.design.i18n.Toolkit; import static com.fine.swing.ui.layout.Layouts.cell; import static com.fine.swing.ui.layout.Layouts.column; import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.box; import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; +import static com.fine.theme.utils.FineUIScale.scale; /** * @author fly.li @@ -61,7 +63,7 @@ import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; public class ReportEnginePane extends BasicBeanPane { private static final int LABEL_HEIGHT = 55; private JPanel outLineEngineSettingPane; - private JLayeredPane engineSettingPane; + private JPanel engineSettingPane; private UICheckBox clientPaging; private UICheckBox lineEnginePageQueryBox; private UICheckBox engineXPageQueryBox; @@ -86,51 +88,54 @@ public class ReportEnginePane extends BasicBeanPane { protected void initComponents() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel outReportEnginePane = new JPanel(); - outReportEnginePane.setLayout(FRGUIPaneFactory.createBorderLayout()); - outReportEnginePane.setPreferredSize(new Dimension(FineUIScale.scale(600), FineUIScale.scale(370))); + JPanel outReportEnginePane = new JPanel(new BorderLayout()); + createOutPagingEngineSelectPane(); outReportEnginePane.add(createReportEnginePane()); JPanel outAdvicePane = new JPanel(); outAdvicePane.setLayout(FRGUIPaneFactory.createBorderLayout()); outAdvicePane.setPreferredSize(new Dimension(FineUIScale.scale(600), FineUIScale.scale(160))); outAdvicePane.add(createAdvicePane()); - this.add(column(20, true, + this.add(column(10, cell(wrapComponentWithTitle(outReportEnginePane, Toolkit.i18nText("Fine-Design_Report_Report_Engine_Attribute"))), + cell(wrapComponentWithTitle(outPagingEngineSelectPane, Toolkit.i18nText("Fine-Design_Report_Paging_Engine_Select"))).weight(1.0), cell(wrapComponentWithTitle(outAdvicePane, Toolkit.i18nText("Fine-Design_Report_Advice")))) .getComponent()); } + private void createOutPagingEngineSelectPane() { + outPagingEngineSelectPane = new JPanel(new BorderLayout()); + outPagingEngineSelectPane.setVisible(false); + outPagingEngineSelectPane.add(createPagingEngineSelectPane()); + } + private JPanel createReportEnginePane() { - JPanel reportEnginePane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - JPanel clientPagingPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + JPanel reportEnginePane = new JPanel(new BorderLayout()); clientPaging = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Enable_Client_Page")); clientPaging.setSelected(false); - reportEnginePane.add(clientPagingPane); - outPagingEngineSelectPane = new JPanel(); + /*outPagingEngineSelectPane = new JPanel(); outPagingEngineSelectPane.setLayout(FRGUIPaneFactory.createBorderLayout()); outPagingEngineSelectPane.setVisible(false); outPagingEngineSelectPane.setPreferredSize(new Dimension(FineUIScale.scale(600), FineUIScale.scale(300))); - outPagingEngineSelectPane.add(createPagingEngineSelectPane()); + outPagingEngineSelectPane.add(createPagingEngineSelectPane());*/ clientPaging.addActionListener(new SelectActionListener(clientPaging, outPagingEngineSelectPane)); - clientPagingPane.add(clientPaging); - reportEnginePane.add(column(10, true, - cell(clientPagingPane), - cell(wrapComponentWithTitle(outPagingEngineSelectPane, Toolkit.i18nText("Fine-Design_Report_Paging_Engine_Select")))) - .getComponent()); + reportEnginePane.add(clientPaging); return reportEnginePane; } private JPanel createPagingEngineSelectPane() { - engineSettingPane = new JLayeredPane(); - engineSettingPane.setPreferredSize(new Dimension(FineUIScale.scale(600), FineUIScale.scale(240))); - engineSettingPane.setBounds(0, 0, FineUIScale.scale(600), FineUIScale.scale(240)); + engineSettingPane = new JPanel(new BorderLayout()); createEngineXSettingPane(); createLineEngineSettingPane(); outLineEngineSettingPane.setVisible(false); - engineSettingPane.add(outEngineXSettingPane, JLayeredPane.DEFAULT_LAYER); - engineSettingPane.add(outLineEngineSettingPane, JLayeredPane.DEFAULT_LAYER); - engineSettingPane.moveToFront(outEngineXSettingPane); + outEngineXSettingPane.setPreferredSize(new Dimension(scale(625), scale(220))); + outLineEngineSettingPane.setPreferredSize(new Dimension(scale(625), scale(220))); + engineSettingPane.add(box(cell(outEngineXSettingPane), + cell(outLineEngineSettingPane)).getComponent() + , BorderLayout.WEST); + /*engineSettingPane.add(outEngineXSettingPane, JLayeredPane.DEFAULT_LAYER); + engineSettingPane.add(outLineEngineSettingPane, JLayeredPane.DEFAULT_LAYER);*/ + //engineSettingPane.moveToFront(outEngineXSettingPane); engineSettingPane.setVisible(true); JPanel pagingEngineSelectPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); pagingEngineSelectPane.add(createPagingEngineRadioPanel()); @@ -147,7 +152,6 @@ public class ReportEnginePane extends BasicBeanPane { */ private void createEngineXSettingPane() { outEngineXSettingPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_New_Engine")); - outEngineXSettingPane.setBounds(0, 0, FineUIScale.scale(600), FineUIScale.scale(180)); JPanel engineXSettingPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); JPanel pageQueryBoxPanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); engineXPageQueryBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Fixed_Line_Paging")); @@ -174,8 +178,6 @@ public class ReportEnginePane extends BasicBeanPane { private void createLineEngineSettingPane() { outLineEngineSettingPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Line_Engine")); - // TODO SCALE动态伸缩大小 - outLineEngineSettingPane.setBounds(0, 0, FineUIScale.scale(600), FineUIScale.scale(200)); JPanel lineEngineSettingPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); JPanel pageQueryBoxPanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); lineEnginePageQueryBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Fixed_Line_Paging")); @@ -288,14 +290,14 @@ public class ReportEnginePane extends BasicBeanPane { radioButtons.get(0).setSelected(ob.getEngineState() == LayerReportAttr.ENGINE_X); radioButtons.get(1).setSelected(ob.getEngineState() == LayerReportAttr.LINE_ENGINE); if (ob.getEngineState() == LayerReportAttr.ENGINE_X) { - engineSettingPane.moveToFront(outEngineXSettingPane); + //engineSettingPane.moveToFront(outEngineXSettingPane); outEngineXSettingPane.setVisible(true); outLineEngineSettingPane.setVisible(false); engineXCountPerPageEditor.setValue(new Integer(ob.getCountPerPage())); engineXPageQueryBox.setSelected(ob.isPageQuery()); engineXPageQueryPane.setVisible(ob.isPageQuery()); } else { - engineSettingPane.moveToFront(outLineEngineSettingPane); + //engineSettingPane.moveToFront(outLineEngineSettingPane); outEngineXSettingPane.setVisible(false); outLineEngineSettingPane.setVisible(true); lineEngineCountPerPageEditor.setValue(new Integer(ob.getCountPerPage())); @@ -369,11 +371,11 @@ public class ReportEnginePane extends BasicBeanPane { private class EngineSelectActionListener implements ActionListener { private AbstractButton source; - private JLayeredPane target; + private JPanel target; private JPanel showTarget; private JPanel notShowTarget; - private EngineSelectActionListener(AbstractButton source, JLayeredPane target, JPanel showTarget, JPanel notShowTarget) { + private EngineSelectActionListener(AbstractButton source, JPanel target, JPanel showTarget, JPanel notShowTarget) { this.source = source; this.target = target; this.showTarget = showTarget; @@ -390,7 +392,7 @@ public class ReportEnginePane extends BasicBeanPane { target.setVisible(true); showTarget.setVisible(true); notShowTarget.setVisible(false); - target.moveToFront(showTarget); + //target.moveToFront(showTarget); } else { target.setVisible(false); } diff --git a/designer-realize/src/main/java/com/fr/design/report/WriteShortCutsPane.java b/designer-realize/src/main/java/com/fr/design/report/WriteShortCutsPane.java index e1887084d2..968dfdd896 100644 --- a/designer-realize/src/main/java/com/fr/design/report/WriteShortCutsPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/WriteShortCutsPane.java @@ -91,7 +91,7 @@ public class WriteShortCutsPane extends JPanel{ centerPane.add(switchBtnPane); centerPane.add(nextRowHK);*/ centerPane.add(column(20, true, - row(50, cell(name), cell(nextCol), flex(50), cell(nextRow)), + row(50, cell(name), cell(nextCol), flex(), cell(nextRow)), row(50, cell(shortName), cell(nextColHK), cell(switchBtnPane), cell(nextRowHK)) ).getComponent()); diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ReportWriteAttrPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ReportWriteAttrPane.java index 356fce98c9..5d9a050c8a 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ReportWriteAttrPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ReportWriteAttrPane.java @@ -40,7 +40,7 @@ public class ReportWriteAttrPane extends LoadingBasicPane { @Override protected synchronized void initComponents(JPanel container) { container.setLayout(FRGUIPaneFactory.createBorderLayout()); - final UITabbedPane tabbedPane = new UITabbedPane(SwingConstants.TOP, JTabbedPane.SCROLL_TAB_LAYOUT); + final UITabbedPane tabbedPane = new UITabbedPane(SwingConstants.TOP, JTabbedPane.WRAP_TAB_LAYOUT); container.add(tabbedPane, BorderLayout.CENTER); // peter: writeSQLAttrList的编辑. diff --git a/designer-realize/src/main/java/com/fr/design/write/submit/SubmitVisitorListPane.java b/designer-realize/src/main/java/com/fr/design/write/submit/SubmitVisitorListPane.java index e0890a65a2..91475900d9 100644 --- a/designer-realize/src/main/java/com/fr/design/write/submit/SubmitVisitorListPane.java +++ b/designer-realize/src/main/java/com/fr/design/write/submit/SubmitVisitorListPane.java @@ -200,9 +200,9 @@ public class SubmitVisitorListPane extends ObjectJControlPane { /*this.add(typePane, BorderLayout.NORTH); this.add(customCardPane, BorderLayout.CENTER);*/ - this.add(column(10, + this.add(column( cell(typePane), - cell(customCardPane)).getComponent()); + cell(customCardPane).weight(1.0)).getComponent()); csjConfigComboBox.addItemListener(new ItemListener() { @Override From 8cbef9ef05e790eb558e4eef1c61408b500b3c8d Mon Sep 17 00:00:00 2001 From: "Richard.Fang" Date: Fri, 19 Jul 2024 16:03:53 +0800 Subject: [PATCH 180/302] =?UTF-8?q?REPORT-125224=20fix:=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E5=90=AF=E5=8A=A8=E8=AE=A1=E6=97=B6?= =?UTF-8?q?=E5=99=A8=E5=85=B3=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-realize/src/main/java/com/fr/start/MainDesigner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/start/MainDesigner.java b/designer-realize/src/main/java/com/fr/start/MainDesigner.java index dab50eb3ce..632548607b 100644 --- a/designer-realize/src/main/java/com/fr/start/MainDesigner.java +++ b/designer-realize/src/main/java/com/fr/start/MainDesigner.java @@ -161,7 +161,7 @@ public class MainDesigner extends BaseDesigner { ServerTray.init(); } FineLoggerFactory.getLogger().info("Designer started.Time used {} ms", DesignerStartupContext.getRecorder().getTime(TimeUnit.MILLISECONDS)); - + DesignerStartupContext.getRecorder().stop(); SwitchForSwingChecker.initThreadMonitoring(); DesignerLatencyMetric.getInstance().start(); } From 4cff4a2dd7b5e72ad6b4851fb5f4952be7079e75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Mon, 22 Jul 2024 10:52:08 +0800 Subject: [PATCH 181/302] =?UTF-8?q?REPORT-111995=20=E3=80=90NewUI=E3=80=91?= =?UTF-8?q?=E6=96=87=E4=BB=B6-=E9=80=89=E9=A1=B9=E5=92=8C=E5=B8=AE?= =?UTF-8?q?=E5=8A=A9=E9=9D=A2=E6=9D=BF=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/carton/latency/DesignerLatencyMetric.java | 10 ++++------ .../com/fr/design/carton/latency/LatencyLevel.java | 6 ++---- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java b/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java index 4dc38634c0..75fa28ef1e 100644 --- a/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java +++ b/designer-base/src/main/java/com/fr/design/carton/latency/DesignerLatencyMetric.java @@ -9,10 +9,10 @@ import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; import com.fr.general.CloudCenter; +import com.fr.general.GeneralUtils; import com.fr.general.http.HttpToolbox; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; -import com.fr.stable.ProductConstants; import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; @@ -81,7 +81,7 @@ public class DesignerLatencyMetric { this.scheduler = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("LatencyMetricWorker")); this.scheduler.scheduleWithFixedDelay(this::collectAndSubmit, 60, 60, TimeUnit.MINUTES); // 注册设计器工作目录切换事件监听 - EventDispatcher.listen(WorkspaceEvent.AfterSwitch, new Listener() { + EventDispatcher.listen(WorkspaceEvent.BeforeSwitch, new Listener() { @Override public void on(Event event, Workspace param) { collectAndSubmit(); @@ -162,13 +162,11 @@ public class DesignerLatencyMetric { info.put(APPID, MarketConfig.getInstance().getCloudOperationMaintenanceId()); info.put(USERID, MarketConfig.getInstance().getBbsUid()); info.put(DESIGNER_ID, DesignerEnvManager.getEnvManager().getUUID()); - info.put(DESIGNER_VERSION, ProductConstants.DESIGNER_VERSION); + info.put(DESIGNER_VERSION, GeneralUtils.getVersion()); info.put(DESIGN_METHOD, WorkContext.getCurrent().isLocal() ? LOCAL : REMOTE); info.put(OPERANDS_NUM, LATENCY_CONTAINER.values().stream().mapToInt(AtomicInteger::get).sum()); for (Map.Entry entry : LATENCY_CONTAINER.entrySet()) { - if (!LatencyLevel.UNDEFINE.equals(entry.getKey())) { - info.put(entry.getKey().getMark(), entry.getValue().get()); - } + info.put(entry.getKey().getMark(), entry.getValue().get()); } return info; } diff --git a/designer-base/src/main/java/com/fr/design/carton/latency/LatencyLevel.java b/designer-base/src/main/java/com/fr/design/carton/latency/LatencyLevel.java index 0d40b37d89..f190bb883d 100644 --- a/designer-base/src/main/java/com/fr/design/carton/latency/LatencyLevel.java +++ b/designer-base/src/main/java/com/fr/design/carton/latency/LatencyLevel.java @@ -24,9 +24,7 @@ public enum LatencyLevel { // 非常严重卡顿 EXTREME(2000, 3000, "waitNum7"), // 极度卡顿 - CRITICAL(3000, Long.MAX_VALUE, "waitNum8"), - // 未知场景 - UNDEFINE(-1, -1, "unknown"); + CRITICAL(3000, Long.MAX_VALUE, "waitNum8"); final long start; final long end; @@ -62,6 +60,6 @@ public enum LatencyLevel { return level; } } - return UNDEFINE; + return CRITICAL; } } From 462452de1a3dd750797c32d05045364e518b2ad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Wed, 24 Jul 2024 17:26:17 +0800 Subject: [PATCH 182/302] =?UTF-8?q?REPORT-113994=20=E3=80=90NewUI=E3=80=91?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0?= =?UTF-8?q?-=E5=9B=BE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- .../fine/theme/utils/FineLayoutBuilder.java | 155 ++++++++++++++++++ .../com/fine/theme/utils/FineUIStyle.java | 1 + .../design/actions/file/PreferencePane.java | 13 +- .../fr/design/actions/help/AboutDialog.java | 13 +- .../design/condition/LiteConditionPane.java | 6 +- .../design/foldablepane/UIExpandablePane.java | 26 ++- .../fr/design/gui/frpane/FineTabbedPane.java | 14 +- .../gui/frpane/UICorrelationComboBoxPane.java | 7 +- .../design/gui/frpane/UICorrelationPane.java | 4 +- .../gui/icombobox/UIComboBoxRenderer.java | 1 - .../com/fr/design/gui/style/FormatPane.java | 122 ++++---------- .../light/ui/laf/FineLightLaf.properties | 5 +- .../design/mainframe/ChartPropertyPane.java | 6 +- .../chart/AbstractChartAttrPane.java | 4 +- .../chart/gui/ChartTypeButtonPane.java | 101 +++++------- .../mainframe/chart/gui/ChartTypePane.java | 6 +- .../chart/gui/data/ChartDataFilterPane.java | 128 +++++---------- .../chart/gui/data/DatabaseTableDataPane.java | 38 ++--- .../chart/gui/data/NormalChartDataPane.java | 33 ++-- .../chart/gui/data/TableDataPane.java | 17 +- .../report/AbstractReportDataContentPane.java | 4 +- ...goryPlotMoreCateReportDataContentPane.java | 92 ++++------- .../CategoryPlotReportDataContentPane.java | 44 +++-- ...egoryPlotMoreCateTableDataContentPane.java | 102 +++++------- .../CategoryPlotTableDataContentPane.java | 44 +++-- .../table/SeriesNameUseFieldValuePane.java | 57 +++---- .../data/table/SeriesTypeUseComboxPane.java | 39 ++--- .../chart/gui/style/ChartTextAttrPane.java | 15 +- .../ChartTextAttrPaneWithThemeStyle.java | 5 +- .../style/ColorSelectBoxWithThemeStyle.java | 16 +- .../chart/gui/style/ThirdTabPane.java | 51 +----- .../gui/style/axis/ChartCategoryPane.java | 2 - .../style/series/AbstractPlotSeriesPane.java | 1 - .../chart/gui/type/ChartTabPane.java | 11 +- .../column/VanChartColumnSeriesPane.java | 89 +++------- .../designer/AbstractVanChartScrollPane.java | 14 -- .../component/VanChartTooltipContentPane.java | 60 +++---- .../component/VanChartUIListControlPane.java | 2 + .../component/border/VanChartBorderPane.java | 39 ++--- .../format/FormatPaneWithNormalType.java | 14 +- .../format/FormatPaneWithOutFont.java | 25 +-- .../style/VanChartPlotLegendPane.java | 121 +++++--------- .../designer/style/VanChartTitlePane.java | 155 ++++++++---------- .../VanChartAreaBackgroundPane.java | 26 +-- .../style/background/VanChartAreaPane.java | 14 +- .../datasheet/VanChartDataSheetPane.java | 43 ++--- .../style/label/VanChartPiePlotLabelPane.java | 8 +- .../label/VanChartPlotLabelDetailPane.java | 13 +- .../style/label/VanChartPlotLabelPane.java | 21 +-- .../VanChartAbstractPlotSeriesPane.java | 36 ++-- .../tooltip/VanChartPlotTooltipPane.java | 37 ++--- .../van/chart/pie/VanChartPieSeriesPane.java | 3 +- .../com/fr/design/dscolumn/DSColumnPane.java | 1 - 54 files changed, 785 insertions(+), 1121 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/utils/FineLayoutBuilder.java diff --git a/build.gradle b/build.gradle index 4ebe9558d3..7201922fe8 100644 --- a/build.gradle +++ b/build.gradle @@ -90,7 +90,7 @@ allprojects { implementation 'com.github.weisj:jsvg:1.2.0' implementation 'com.formdev:flatlaf:3.4' implementation 'com.formdev:flatlaf-extras:3.4' - implementation 'com.fanruan.vito:gui-inspector:1.0.1' + implementation 'com.fanruan.vito:gui-inspector:1.0.2' implementation 'com.fine.swing.ui:layout:1.0-SNAPSHOT' testImplementation 'org.easymock:easymock:3.5.1' testImplementation 'org.powermock:powermock-module-junit4:1.7.1' diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineLayoutBuilder.java b/designer-base/src/main/java/com/fine/theme/utils/FineLayoutBuilder.java new file mode 100644 index 0000000000..11d7137ec4 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/utils/FineLayoutBuilder.java @@ -0,0 +1,155 @@ +package com.fine.theme.utils; + +import com.fine.swing.ui.layout.Column; +import com.fine.swing.ui.layout.Layouts; +import com.fine.swing.ui.layout.Row; +import com.fine.swing.ui.layout.Spacer; +import com.fr.design.foldablepane.UIExpandablePane; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.collections.combination.Pair; + +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Component; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static com.fine.swing.ui.layout.Layouts.cell; + +/** + * 设计器典型布局构建器 + * + * @author Levy.Xie + * @since 11.0 + * Created on 2024/05/08 + */ +public class FineLayoutBuilder { + + /** + * 创建标准行列表格布局,行内元素均匀分布 + * + * @param elePerRow 每行元素数 + * @param rowSpacing 行内间距 + * @param colSpacing 列内间距 + * @param componentList 组件 + * @return 表格面板 + */ + public static Column createCommonTableLayout(int elePerRow, int rowSpacing, int colSpacing, List componentList) { + int rowNum = componentList.size() / elePerRow + 1; + Iterator iterator = componentList.iterator(); + + Column column = new Column(); + column.setSpacing(colSpacing); + + Row currentRow; + for (int i = 0; i < rowNum; i++) { + currentRow = new Row(); + currentRow.setSpacing(rowSpacing); + for (int j = 0; j < elePerRow; j++) { + Layouts.populate(currentRow, cell( + iterator.hasNext() ? iterator.next() : new Spacer(1) + ).weight(1)); + } + column.add(currentRow); + } + return column; + } + + /** + * 兼容TableLayout配置项,生成网格布局面板 + * + * @param colSpacing 间距 + * @param components 组件二维数组,内部每个一维数组均为行内组件,一维数组元素需与weight严格对应 + * @param weight 行内权重列表,形如[0.4,0.6] 即首个元素占比0.4,第二个元素占比0.6 + * @return 面板 + */ + public static JPanel compatibleTableLayout(int colSpacing, Component[][] components, double[] weight) { + Column column = new Column(); + column.setSpacing(colSpacing); + try { + for (Component[] componentArray : components) { + Row row = new Row(); + List visibleComponents = Arrays.stream(componentArray) + .filter(com -> com != null && com.isVisible()).collect(Collectors.toList()); + if (visibleComponents.size() >= 1) { + // 仅当存在可见组件时处理布局 + dealWithVisibleComponents(weight, column, componentArray, row, visibleComponents); + } + } + return asBorderLayoutWrapped(column); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e, "[Designer] create layout failed."); + } + return new JPanel(); + } + + private static void dealWithVisibleComponents(double[] weight, Column column, Component[] value, Row row, List components) { + if (components.size() == 1 && value[0] != null) { + // 仅存在首个元素,则该元素自适应占满整行 + Layouts.populate(row, cell(components.get(0)).weight(1)); + } else { + // 其他场景,按权重分配布局,以适配原TableLayout形式 + for (int j = 0; j < value.length; j++) { + Component component = value[j]; + if (component == null) { + component = new Spacer(1); + } + Layouts.populate(row, cell(component).weight(weight[j])); + } + } + column.add(row); + } + + /** + * 创建竖向排列的扩展面板列表 + * + * @param spacing 间距 + * @param elements 面板元素,含标题、面板 + * @return 竖向排列面板 + */ + @SafeVarargs + public static Column createVerticalExpandPaneLayout(int spacing, Pair... elements) { + UIExpandablePane[] panes = IntStream.range(0, elements.length) + .mapToObj(i -> { + Pair pair = elements[i]; + if (i != elements.length - 1) { + return new UIExpandablePane(pair.getFirst(), pair.getSecond(), true); + } + return new UIExpandablePane(pair.getFirst(), pair.getSecond()); + }) + .toArray(UIExpandablePane[]::new); + return createVerticalLayout(spacing, panes); + } + + /** + * 创建垂直布局面板 + * + * @param spacing 间距 + * @param elements 面板元素 + * @return 面板 + */ + public static Column createVerticalLayout(int spacing, JPanel... elements) { + Column column = new Column(); + column.setSpacing(spacing); + for (JPanel element : elements) { + column.add(element); + } + return column; + } + + /** + * 组件包装于BorderLayout中 + * + * @param component 组件 + * @return 包装后的面板 + */ + public static JPanel asBorderLayoutWrapped(Component component) { + JPanel panel = new JPanel(new BorderLayout()); + panel.add(component); + return panel; + } + +} diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java index 8fd013916b..4cf5637d94 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java @@ -31,6 +31,7 @@ public interface FineUIStyle { String LABEL_TIP = "tipLabel"; String PLAIN_BUTTON = "plainButton"; String TOGGLE_GROUP = "inToggleGroup"; + String COMPACT_BUTTON = "compactButton"; String MENU_TOOL_BAR = "menuToolBar"; String MENU_ITEM_TOOL_BAR = "menuItemToolBar"; diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java index 093d3079f4..bfbc5c2347 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java @@ -1,5 +1,6 @@ package com.fr.design.actions.file; +import com.fine.theme.utils.FineLayoutBuilder; import com.fine.theme.utils.FineUIScale; import com.fine.theme.utils.FineUIStyle; import com.fine.theme.utils.FineUIUtils; @@ -15,7 +16,6 @@ import com.fr.design.dialog.DialogActionListener; import com.fr.design.editor.editor.IntegerEditor; import com.fr.design.file.SaveSomeTemplatePane; import com.fr.design.gui.frpane.FineTabbedPane; -import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIColorButton; import com.fr.design.gui.ibutton.UINoThemeColorButton; @@ -54,7 +54,6 @@ import com.fr.io.attr.ImageExportAttr; import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; import com.fr.report.ReportConfigManager; -import com.fr.stable.ArrayUtils; import com.fr.stable.Constants; import com.fr.stable.os.OperatingSystem; import com.fr.third.apache.logging.log4j.Level; @@ -299,7 +298,7 @@ public class PreferencePane extends BasicPane { // 启动页配置 cell(createStartupPagePane()) ).weight(1).getComponent(); - UIScrollPane generalScrollPane = patchScroll(generalPane); + JPanel generalScrollPane = patchScroll(FineLayoutBuilder.asBorderLayoutWrapped(generalPane)); // 高级面板 JPanel advancePane = column(SETTING_V_GAP, @@ -327,7 +326,7 @@ public class PreferencePane extends BasicPane { cell(createDesignerStartupPane()) ).weight(1).getComponent(); useUniverseDBMCheckbox = new UICheckBox(i18nText("Fine-Design_Basic_Use_Universe_Database_Manager")); - UIScrollPane adviceScrollPane = patchScroll(advancePane); + JPanel adviceScrollPane = patchScroll(advancePane); // 版本管理面板 //初始化vcs总面板 @@ -339,7 +338,7 @@ public class PreferencePane extends BasicPane { // vcsPane createVcsSettingPane(vcsPane, vcsParentPane, cardLayout); //添加滚动条 - UIScrollPane vcsScrollPane = patchScroll(vcsPane); + JPanel vcsScrollPane = patchScroll(vcsPane); //配置面板作为vcs总面板的一张卡片 vcsParentPane.add(vcsScrollPane, VcsMovePanel.SETTING); @@ -428,10 +427,10 @@ public class PreferencePane extends BasicPane { } @NotNull - private UIScrollPane patchScroll(JPanel generalPane) { + private JPanel patchScroll(JPanel generalPane) { UIScrollPane uiScrollPane = new UIScrollPane(generalPane, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); uiScrollPane.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); - return uiScrollPane; + return FineLayoutBuilder.asBorderLayoutWrapped(uiScrollPane); } private void createVcsSettingPane(JPanel generalPane, JPanel parentPane, CardLayout cardLayout) { diff --git a/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java b/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java index 121d9ece9c..4d55af0306 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java @@ -2,7 +2,7 @@ package com.fr.design.actions.help; import com.fine.theme.utils.FineUIScale; import com.fine.theme.utils.FineUIStyle; -import com.fr.design.gui.frpane.UITabbedPane; +import com.fr.design.gui.frpane.FineTabbedPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; @@ -46,11 +46,12 @@ public class AboutDialog extends JDialog implements ActionListener { FineUIStyle.setStyle(okButton, FineUIStyle.STYLE_PRIMARY); okButton.addActionListener(this); - tabbedPane = new UITabbedPane(); sysPane = new SystemInfoPane(); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_About"), aboutPanel); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("FIne-Design_Basic_System"), sysPane); + tabbedPane = FineTabbedPane.builder() + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_About"), aboutPanel) + .addTab(com.fr.design.i18n.Toolkit.i18nText("FIne-Design_Basic_System"), sysPane) + .build(); buttonPanel = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); buttonPanel.add(okButton); @@ -79,7 +80,7 @@ public class AboutDialog extends JDialog implements ActionListener { this.getRootPane().setDefaultButton(okButton); - this.setSize(FineUIScale.scale(new Dimension(defaultPane.getPreferredSize().width, 600))); + this.setSize(FineUIScale.scale(new Dimension(defaultPane.getPreferredSize().width, 620))); GUICoreUtils.centerWindow(this); } @@ -96,6 +97,6 @@ public class AboutDialog extends JDialog implements ActionListener { private SystemInfoPane sysPane; private JPanel buttonPanel; - private UITabbedPane tabbedPane; + private FineTabbedPane tabbedPane; private UIButton okButton; } diff --git a/designer-base/src/main/java/com/fr/design/condition/LiteConditionPane.java b/designer-base/src/main/java/com/fr/design/condition/LiteConditionPane.java index a6dc6aa107..22e71aef4e 100644 --- a/designer-base/src/main/java/com/fr/design/condition/LiteConditionPane.java +++ b/designer-base/src/main/java/com/fr/design/condition/LiteConditionPane.java @@ -435,7 +435,7 @@ public abstract class LiteConditionPane extends BasicBeanPa JPanel buttonPane = initButtonPane(); JScrollPane treeScrollPane = iniTreeScrollPane(); // 滚动面板不能直接加入row-col布局,需设定宽高 - treeScrollPane.setPreferredSize(FineUIScale.scale(new Dimension(600, 250))); + treeScrollPane.setPreferredSize(FineUIScale.scale(new Dimension(600, 240))); JPanel previewPane = column( cell(northButtonPane), row( @@ -571,8 +571,8 @@ public abstract class LiteConditionPane extends BasicBeanPa row(5, cell(andRadioButton).weight(0.5), cell(orRadioButton).weight(0.5) - ).weight(0.25), - flex(0.5), + ).weight(0.35), + flex(0.4), row(5, cell(addButton).weight(0.5), cell(modifyButton).weight(0.5) diff --git a/designer-base/src/main/java/com/fr/design/foldablepane/UIExpandablePane.java b/designer-base/src/main/java/com/fr/design/foldablepane/UIExpandablePane.java index 2432915650..140aa74c83 100644 --- a/designer-base/src/main/java/com/fr/design/foldablepane/UIExpandablePane.java +++ b/designer-base/src/main/java/com/fr/design/foldablepane/UIExpandablePane.java @@ -1,12 +1,19 @@ package com.fr.design.foldablepane; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.border.FineBorderFactory; + import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.fix; + /** * Created by MoMeak on 2017/7/5. @@ -31,18 +38,22 @@ public class UIExpandablePane extends JPanel { this.headWidth = headWidth; this.headHeight = headHeight; this.contentPanel = contentPanel; - initComponents(); + initComponents(false); } public UIExpandablePane(String title, JPanel contentPanel) { + this(title, contentPanel, false); + } + + public UIExpandablePane(String title, JPanel contentPanel, boolean withUnderline) { super(); this.title = title; this.headHeight = headHeight; this.contentPanel = contentPanel; - initComponents(); + initComponents(withUnderline); } - private void initComponents() { + private void initComponents(boolean withUnderline) { this.setLayout(new BorderLayout()); headerPanel = new HeaderPane(title); @@ -50,6 +61,15 @@ public class UIExpandablePane extends JPanel { setcontentPanelontentPanelBorder(); this.add(headerPanel, BorderLayout.NORTH); this.add(contentPanel, BorderLayout.CENTER); + if (withUnderline) { + this.add(column( + cell(headerPanel), cell(contentPanel).with(it -> it.setBorder(new ScaledEmptyBorder(0, 0, 10, 0))), + fix(1).with(it -> it.setBorder(FineBorderFactory.createDefaultUnderlineBorder()))) + .getComponent()); + } else { + this.add(column(cell(headerPanel), cell(contentPanel)).getComponent()); + } + setOpaque(false); } diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/FineTabbedPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/FineTabbedPane.java index 54b01f2d48..9fd7620c7f 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/FineTabbedPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/FineTabbedPane.java @@ -5,6 +5,7 @@ import com.fine.theme.utils.FineUIStyle; import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.gui.ibutton.UIButtonGroup; +import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; @@ -32,9 +33,9 @@ public class FineTabbedPane extends Column { private JPanel centerPane; private final float headRatio; private final UIButtonGroup tabGroup; - private final Map tabComponents; + private final Map tabComponents; - private FineTabbedPane(Map tabComponents, float headRatio, int[] tabLayout) { + private FineTabbedPane(Map tabComponents, float headRatio, int[] tabLayout) { this.headRatio = headRatio; this.tabComponents = tabComponents; @@ -60,7 +61,7 @@ public class FineTabbedPane extends Column { public static class TabPaneBuilder { private int[] tabLayout; private float headRatio = 0.5f; - private final Map tabComponents = new LinkedHashMap<>(); + private final Map tabComponents = new LinkedHashMap<>(); /** * 设置头部居中比例,0-1之间 @@ -117,14 +118,17 @@ public class FineTabbedPane extends Column { private void initLayout() { cards = new CardLayout(); centerPane = new JPanel(cards); - tabComponents.forEach((key, value) -> centerPane.add(value, key)); + tabComponents.forEach((key, value) -> { + value.setOpaque(false); + centerPane.add(value, key); + }); float flexRatio = (1 - headRatio) / 2; add( row( flex(flexRatio), cell(tabGroup).weight(headRatio), flex(flexRatio) ), fix(5), - cell(centerPane).with(it -> FineUIStyle.setStyle(it, FineUIStyle.LIGHT_GREY)) + cell(centerPane).weight(1).with(it -> FineUIStyle.setStyle(it, FineUIStyle.LIGHT_GREY)) ); setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); } diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/UICorrelationComboBoxPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/UICorrelationComboBoxPane.java index 79dece5057..ac94b82499 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/UICorrelationComboBoxPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/UICorrelationComboBoxPane.java @@ -1,8 +1,7 @@ package com.fr.design.gui.frpane; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.constants.UIConstants; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.dialog.DialogActionListener; import com.fr.design.dialog.UIDialog; @@ -225,9 +224,7 @@ public class UICorrelationComboBoxPane extends JPanel implements UIObserver { } protected void initAddButton() { - addButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); - addButton.setBorderType(UIButton.OTHER_BORDER); - addButton.setOtherBorder(UIConstants.BS, UIConstants.LINE_COLOR); + addButton = new UIButton(new LazyIcon("add")); } private void initAddButtonListener() { diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/UICorrelationPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/UICorrelationPane.java index 3a23a478c3..dde2337196 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/UICorrelationPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/UICorrelationPane.java @@ -19,7 +19,7 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.table.TableCellEditor; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.constants.UIConstants; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; @@ -212,7 +212,7 @@ public class UICorrelationPane extends JPanel implements UIObserver { } protected void initAddButton() { - addButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")) { + addButton = new UIButton(new LazyIcon("add")) { public boolean shouldResponseChangeListener() { return false; } diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBoxRenderer.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBoxRenderer.java index 0903070dc0..07cb941293 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBoxRenderer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBoxRenderer.java @@ -36,7 +36,6 @@ public class UIComboBoxRenderer extends DefaultListCellRenderer { renderer.setForeground(list.getForeground()); renderer.setBackground(list.getBackground()); } - renderer.setText(" " + renderer.getText()); return renderer; } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/style/FormatPane.java b/designer-base/src/main/java/com/fr/design/gui/style/FormatPane.java index 2485b4de4e..d26cf47e61 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/FormatPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/FormatPane.java @@ -1,7 +1,10 @@ package com.fr.design.gui.style; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIStyle; +import com.fine.theme.utils.FineUIUtils; import com.fr.base.CoreDecimalFormat; -import com.fr.base.GraphHelper; import com.fr.base.Style; import com.fr.base.TextFormat; import com.fr.data.core.FormatField; @@ -10,7 +13,6 @@ import com.fr.design.event.UIObserverListener; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.i18n.Toolkit; import com.fr.design.border.UIRoundedBorder; -import com.fr.design.constants.LayoutConstants; import com.fr.design.constants.UIConstants; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; @@ -18,26 +20,19 @@ import com.fr.design.gui.icombobox.TextFontComboBox; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icombobox.UIComboBoxRenderer; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.general.ComparatorUtils; import com.fr.stable.StringUtils; import java.awt.BorderLayout; -import java.awt.CardLayout; import java.awt.Color; import java.awt.Component; -import java.awt.Dimension; -import java.awt.FontMetrics; -import java.awt.Graphics; import java.math.RoundingMode; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.SwingConstants; -import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.TitledBorder; import java.awt.event.ItemEvent; @@ -53,13 +48,7 @@ import java.text.SimpleDateFormat; */ public class FormatPane extends AbstractBasicStylePane implements GlobalNameObserver { private static final long serialVersionUID = 724330854437726751L; - - private static final int LABEL_X = 4; - private static final int LABEL_Y = 18; - private static final int LABEL_DELTA_WIDTH = 8; - private static final int LABEL_HEIGHT = 15; //标签背景的范围 private static final int CURRENCY_FLAG_POINT = 6; - private static final Border LEFT_BORDER = BorderFactory.createEmptyBorder(0, 30, 0, 0); private static final Integer[] TYPES = new Integer[]{ FormatContents.NULL, FormatContents.NUMBER, @@ -85,6 +74,7 @@ public class FormatPane extends AbstractBasicStylePane implements GlobalNameObse private boolean isRightFormat; private boolean isDate = false; private GlobalNameListener globalNameListener = null; + private JPanel self = this; /** * Constructor. @@ -98,14 +88,10 @@ public class FormatPane extends AbstractBasicStylePane implements GlobalNameObse } protected void initComponents(Integer[] types) { - this.setLayout(new BorderLayout(0, 4)); + this.setLayout(new BorderLayout()); initSampleLabel(); - contentPane = new JPanel(new BorderLayout(0, 4)) { - @Override - public Dimension getPreferredSize() { - return new Dimension(super.getPreferredSize().width, 65); - } - }; + contentPane = new JPanel(); + contentPane.setLayout(new BorderLayout(0, FineUIScale.scale(10))); typeComboBox = new UIComboBox(types); UIComboBoxRenderer render = createComBoxRender(); typeComboBox.setRenderer(render); @@ -113,7 +99,7 @@ public class FormatPane extends AbstractBasicStylePane implements GlobalNameObse typeComboBox.setGlobalName("typeComboBox"); contentPane.add(sampleLabel, BorderLayout.NORTH); - txtCenterPane = new JPanel(new BorderLayout()); + txtCenterPane = new JPanel(new BorderLayout(0, FineUIScale.scale(10))); textField = new TextFontComboBox(); textField.addItemListener(textFieldItemListener); textField.setEditable(true); @@ -122,58 +108,38 @@ public class FormatPane extends AbstractBasicStylePane implements GlobalNameObse contentPane.add(txtCenterPane, BorderLayout.CENTER); - centerPane = new JPanel(new CardLayout()); - centerPane.add(new JPanel(), "hide"); - centerPane.setPreferredSize(new Dimension(0, 0)); - centerPane.add(contentPane, "show"); - + centerPane = new JPanel(new BorderLayout()); + centerPane.add(contentPane); frFontPane = new FRFontPane(); UILabel font = new UILabel(Toolkit.i18nText("Fine-Design_Form_FR_Font"), SwingConstants.LEFT); JPanel fontPane = new JPanel(new BorderLayout()); fontPane.add(font, BorderLayout.NORTH); - typeComboBox.setPreferredSize(new Dimension(155,20)); JPanel typePane = new JPanel(new BorderLayout()); typePane.add(typeComboBox, BorderLayout.CENTER); - typePane.setBorder(LEFT_BORDER); -// centerPane.setBorder(LEFT_BORDER); - frFontPane.setBorder(LEFT_BORDER); JPanel option = new JPanel(new BorderLayout()); option.add(new UILabel(Toolkit.i18nText("Fine-Design_Report_Base_Option"), SwingConstants.LEFT), BorderLayout.WEST); roundingBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Base_Option_Half_Up")); - roundingBox.setBorder(BorderFactory.createEmptyBorder(0, 40, 0, 0)); - roundingBox.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - } - }); roundingBox.setGlobalName("roundingBox"); option.add(roundingBox, BorderLayout.CENTER); - optionPane = new JPanel(new CardLayout()); - optionPane.add(new JPanel(), "hide"); - optionPane.setPreferredSize(new Dimension(0, 0)); - optionPane.add(option, "show"); + optionPane = new JPanel(new BorderLayout()); + optionPane.add(option); Component[][] components = getComponent(fontPane, centerPane, typePane); this.add(createContentPane(components), BorderLayout.CENTER); } protected JPanel createContentPane (Component[][] components) { - 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}}; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_LARGE, LayoutConstants.VGAP_MEDIUM); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } protected Component[][] getComponent (JPanel fontPane, JPanel centerPane, JPanel typePane) { return new Component[][]{ new Component[]{null, null}, - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Report_Base_Format"), SwingConstants.LEFT), typePane}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Report_Base_Format")), typePane}, new Component[]{centerPane, null}, new Component[]{optionPane, null}, new Component[]{fontPane, frFontPane}, @@ -194,41 +160,17 @@ public class FormatPane extends AbstractBasicStylePane implements GlobalNameObse } private void initSampleLabel() { + Color labelColor = FineUIUtils.getUIColor("Label.tipColor", "inactiveCaption"); Border interBorder = new UIRoundedBorder(UIConstants.LINE_COLOR, 1, 4); String title = Toolkit.i18nText("Fine-Design_Report_Base_StyleFormat_Sample"); - Border border = BorderFactory.createTitledBorder(interBorder, title, TitledBorder.LEFT, 0, null, UIConstants.LINE_COLOR); - sampleLabel = new UILabel(FormatField.getInstance().getFormatValue()) { - - @Override - public void paint(Graphics g) { - super.paint(g); - int width = getWidth(); - Color original = g.getColor(); - g.setColor(getBackground()); - g.fillRect(LABEL_X, LABEL_Y, width - LABEL_DELTA_WIDTH, LABEL_HEIGHT); - g.setColor(UIConstants.LINE_COLOR); - FontMetrics cellFM = g.getFontMetrics(); - int textWidth = cellFM.stringWidth(getText()); - GraphHelper.drawString(g, getText(), (width - textWidth) / 2, 26); - g.setColor(original); - } - }; + Border border = BorderFactory.createTitledBorder(interBorder, title, TitledBorder.LEFT, 0, null, labelColor); + sampleLabel = new UILabel(FormatField.getInstance().getFormatValue()); sampleLabel.setHorizontalAlignment(UILabel.CENTER); sampleLabel.setBorder(border); + FineUIStyle.setStyle(sampleLabel, FineUIStyle.LABEL_TIP); } - @Override - /** - * 得到合适的大小 - */ - public Dimension getPreferredSize() { - if (this.typeComboBox.getSelectedIndex() == FormatContents.NULL) { - return typeComboBox.getPreferredSize(); - } - return super.getPreferredSize(); - } - /** * 弹出框标题 * @@ -340,7 +282,7 @@ public class FormatPane extends AbstractBasicStylePane implements GlobalNameObse */ private void refreshPreviewLabel() { this.sampleLabel.setText(FormatField.getInstance().getFormatValue()); - this.sampleLabel.setForeground(UIManager.getColor("Label.foreground")); + FineUIStyle.setStyle(sampleLabel, FineUIStyle.LABEL_TIP); try { isRightFormat = true; if (StringUtils.isEmpty(String.valueOf(textField.getSelectedItem()))) { @@ -369,38 +311,30 @@ public class FormatPane extends AbstractBasicStylePane implements GlobalNameObse if (e.getStateChange() == ItemEvent.SELECTED) { int contents = getFormatContents(); String[] items = FormatField.getInstance().getFormatArray(contents, false); - CardLayout cardLayout = (CardLayout) centerPane.getLayout(); if (isTextOrNull()) { - centerPane.setPreferredSize(new Dimension(0, 0)); - cardLayout.show(centerPane, "hide"); + centerPane.setVisible(false); } else { textField.removeAllItems(); textField.setItemArray(items); textField.setSelectedIndex(0); - centerPane.setPreferredSize(new Dimension(270, 65)); - cardLayout.show(centerPane, "show"); + centerPane.setVisible(true); } - CardLayout optionLayout = ((CardLayout) optionPane.getLayout()); if (getFormatContents() == FormatContents.PERCENT) { - optionPane.setPreferredSize(new Dimension(100, 20)); - optionLayout.show(optionPane, "show"); + optionPane.setVisible(true); } else { - optionPane.setPreferredSize(new Dimension(0, 0)); - optionLayout.show(optionPane, "hide"); + optionPane.setVisible(false); roundingBox.setSelected(false); } + self.repaint(); } } }; - ItemListener textFieldItemListener = new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - if (e.getStateChange() == ItemEvent.SELECTED) { - refreshPreviewLabel(); - } + ItemListener textFieldItemListener = e -> { + if (e.getStateChange() == ItemEvent.SELECTED) { + refreshPreviewLabel(); } }; diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index 51042cb0b2..d20add6df5 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -1310,4 +1310,7 @@ CellOtherSetPane.height=$Component.defaultHeight background: null; \ hoverBackground : null; \ selectedBackground : null; \ - pressedBackground : null \ No newline at end of file + pressedBackground : null + +[style]ToggleButton.compactButton = \ + margin: 2,0,2,0 \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java index 297245960d..0949b792a4 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java @@ -4,6 +4,7 @@ package com.fr.design.mainframe; +import com.fine.theme.utils.FineUIScale; import com.fr.base.BaseUtils; import com.fr.base.chart.BaseChartCollection; import com.fr.chart.chartattr.ChartCollection; @@ -21,8 +22,7 @@ import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.SwingWorker; -import java.awt.BorderLayout; -import java.awt.Component; +import java.awt.*; public class ChartPropertyPane extends BaseChartPropertyPane { @@ -44,6 +44,8 @@ public class ChartPropertyPane extends BaseChartPropertyPane { protected void initComponent() { this.setLayout(new BorderLayout()); this.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); + // 外部轮廓大小固定,适配滚动面板 + this.setPreferredSize(FineUIScale.scale(new Dimension(getWidth(), 900))); } @Override diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/AbstractChartAttrPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/AbstractChartAttrPane.java index c3beef7570..e3dff4837a 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/AbstractChartAttrPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/AbstractChartAttrPane.java @@ -4,8 +4,7 @@ package com.fr.design.mainframe.chart; import com.fr.chart.chartattr.ChartCollection; import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; -import javax.swing.*; -import java.awt.*; +import java.awt.BorderLayout; public abstract class AbstractChartAttrPane extends AbstractAttrNoScrollPane { public abstract void populate(ChartCollection collection); @@ -30,7 +29,6 @@ public abstract class AbstractChartAttrPane extends AbstractAttrNoScrollPane { protected void initContentPane() { leftContentPane = createContentPane(); - leftContentPane.setBorder(BorderFactory.createMatteBorder(10, 0, 0, 0, original)); this.add(leftContentPane, BorderLayout.CENTER); } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java index 8b1c293282..5261223840 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java @@ -1,5 +1,8 @@ package com.fr.design.mainframe.chart.gui; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIStyle; import com.fr.base.BaseUtils; import com.fr.chart.base.AttrChangeConfig; import com.fr.chart.chartattr.ChartCollection; @@ -24,15 +27,12 @@ import com.fr.plugin.chart.vanchart.VanChart; import com.fr.stable.StringUtils; import com.fr.van.chart.config.DefaultStyleHelper4Van; -import javax.swing.BorderFactory; -import javax.swing.BoxLayout; import javax.swing.JPanel; import javax.swing.SwingUtilities; import java.awt.BorderLayout; +import java.awt.Component; import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.Graphics; -import java.awt.GridLayout; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.ActionEvent; @@ -46,7 +46,15 @@ import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; /** * 图表 类型 增删 控制按钮界面. @@ -103,38 +111,32 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen this.setLayout(new BorderLayout()); initButton(); - buttonPane = new JPanel(); - this.add(buttonPane, BorderLayout.CENTER); - - JPanel northPane = new JPanel(); - this.add(northPane, BorderLayout.NORTH); - - northPane.setLayout(new BorderLayout()); - northPane.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); - - JPanel button = new JPanel(); - button.setPreferredSize(new Dimension(89, 20)); - button.setLayout(new GridLayout(1, 4, 3, 0)); - button.add(addButton); - button.add(copyButton); - button.add(moveForwardButton); - button.add(moveBackButton); - northPane.add(button, BorderLayout.WEST); - northPane.add(configButton, BorderLayout.EAST); + buttonPane = new JPanel(new BorderLayout()); + this.add(column(10, + row(5, + cell(addButton).weight(0.5), + cell(copyButton).weight(0.5), + cell(moveForwardButton).weight(0.5), + cell(moveBackButton).weight(0.5), + flex(2), + cell(configButton).weight(0.5) + ), + cell(buttonPane) + ).getComponent() + ); initConfigCreator(); - // Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); } private void initButton() { - addButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); - configButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/config.png")); - copyButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/m_edit/copy.png")); + addButton = new UIButton(new LazyIcon("add")); + configButton = new UIButton(new LazyIcon("tool_config")); + copyButton = new UIButton(new LazyIcon("tool_copy")); copyButton.setToolTipText(Toolkit.i18nText("Fine-Design_Basic_Action_Copy")); - moveForwardButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/left.png")); + moveForwardButton = new UIButton(new LazyIcon("move_left")); moveForwardButton.setToolTipText(Toolkit.i18nText("Fine-Design_Report_HF_Move_Left")); - moveBackButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/right.png")); + moveBackButton = new UIButton(new LazyIcon("move_right")); moveBackButton.setToolTipText(Toolkit.i18nText("Fine-Design_Report_HF_Move_Right")); initAddButton(); initConfigButton(); @@ -151,7 +153,6 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen } private void initAddButton() { - addButton.setPreferredSize(new Dimension(20, 20)); addButton.addActionListener((e) -> { String name = getNewChartName(); ChartProvider chart = getChangeStateNewChart(); @@ -168,12 +169,10 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen } private void initConfigButton() { - configButton.setPreferredSize(new Dimension(20, 20)); configButton.addActionListener((e) -> showConfigDialog()); } private void initCopyButton() { - copyButton.setPreferredSize(new Dimension(20, 20)); copyButton.addActionListener((e) -> { String name = getCopyChartName(); ChartProvider chart = getCopyChart(); @@ -182,8 +181,6 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen } private void initMoveButton() { - moveForwardButton.setPreferredSize(new Dimension(20, 20)); - moveBackButton.setPreferredSize(new Dimension(20, 20)); moveForwardButton.addActionListener((e) -> moveForwardChart()); moveBackButton.addActionListener((e) -> moveBackChart()); } @@ -335,18 +332,7 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen return; } northPane.removeAll(); - northPane.setLayout(new BoxLayout(northPane, BoxLayout.Y_AXIS)); - - JPanel pane = null; - for (int i = 0; i < indexList.size(); i++) { - if (i % COL_COUNT == 0) { - pane = new JPanel(new FlowLayout(FlowLayout.LEFT)); - northPane.add(pane); - } - - pane.add(indexList.get(i)); - } - + northPane.add(FineLayoutBuilder.createCommonTableLayout(COL_COUNT, 10, 10, indexList)); this.revalidate(); } @@ -355,22 +341,12 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen return; } northPane.removeAll(); - northPane.setLayout(new BoxLayout(northPane, BoxLayout.Y_AXIS)); - - JPanel pane = null; - - for (int i = 0; i < indexList.size(); i++) { - if (i % COL_COUNT == 0) { - pane = new JPanel(new FlowLayout(FlowLayout.LEFT)); - northPane.add(pane); - } - if (i != index) { - pane.add(indexList.get(i)); - } else { - pane.add(currentEditingEditor); - } - } + List components = IntStream.range(0, indexList.size()) + .mapToObj(i -> i == index ? currentEditingEditor : indexList.get(i)) + .collect(Collectors.toList()); + northPane.add(FineLayoutBuilder.createCommonTableLayout(COL_COUNT, 10, 10, components)); this.revalidate(); + } /** @@ -518,6 +494,7 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen } } }); + FineUIStyle.setStyle(this, FineUIStyle.COMPACT_BUTTON); } public String getButtonName() { @@ -530,10 +507,6 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen buttonName = name; } - public Dimension getPreferredSize() { - return new Dimension(B_W, B_H); - } - private void paintDeleteButton(Graphics g2d) { Rectangle2D bounds = this.getBounds(); diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java index bd94ff561a..8505b81e93 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java @@ -1,5 +1,7 @@ package com.fr.design.mainframe.chart.gui; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.charttypes.ChartTypeManager; import com.fr.chartx.attr.ChartProvider; @@ -58,8 +60,8 @@ public class ChartTypePane extends AbstractChartAttrPane { @Override protected JPanel createContentPane() { initButtonListener(); - JPanel content = new JPanel(new BorderLayout()); - + JPanel content = new JPanel(new BorderLayout(0, FineUIScale.scale(10))); + content.setBorder(new ScaledEmptyBorder(10, 0, 0, 0)); buttonPane = new ChartTypeButtonPane(this); buttonPane.refreshChartInForm(inForm); content.add(buttonPane, BorderLayout.NORTH); diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/ChartDataFilterPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/ChartDataFilterPane.java index c24a192441..4dcf5193ec 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/ChartDataFilterPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/ChartDataFilterPane.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.chart.gui.data; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.Utils; import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.chartattr.ChartCollection; @@ -10,23 +11,20 @@ import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.style.AbstractChartTabPane; import com.fr.design.mainframe.chart.gui.style.ThirdTabPane; import com.fr.stable.StringUtils; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; -import javax.swing.BorderFactory; import javax.swing.JPanel; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import java.util.ArrayList; import java.util.List; import java.awt.BorderLayout; -import java.awt.Component; import java.awt.Dimension; -import java.awt.FlowLayout; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; /** * 图表数据 分类 系列 过滤界面. @@ -57,20 +55,15 @@ public class ChartDataFilterPane extends ThirdTabPane { protected void initTabPane() { super.initTabPane(); - tabPane.setPreferredSize(new Dimension(221, 25)); } protected void initLayout() { this.setLayout(new BorderLayout()); if (!paneList.isEmpty()) { - JPanel pane = new JPanel(new FlowLayout(FlowLayout.LEADING, 0, 0)); if (nameArray.length > 1) { - pane.add(tabPane); - this.add(pane, BorderLayout.NORTH); - centerPane.setBorder(BorderFactory.createEmptyBorder(10,0,0,0)); + this.add(tabPane, BorderLayout.NORTH); } - centerPane.setBorder(null); } this.add(centerPane, BorderLayout.CENTER); } @@ -129,8 +122,6 @@ public class ChartDataFilterPane extends ThirdTabPane { this.removeAll(); paneList = initPaneList4NoPresent(plot4Pane, parentPane); initAllPane(); - tabPane.setPreferredSize(new Dimension(221, 25)); - centerPane.setPreferredSize(new Dimension(getContentPaneWidth(), 200)); this.validate(); } @@ -213,19 +204,10 @@ public class ChartDataFilterPane extends ThirdTabPane { protected void layoutContentPane() { super.layoutContentPane(); - leftcontentPane.setBorder(BorderFactory.createEmptyBorder()); } public void reloaPane(JPanel pane){ super.reloaPane(pane); - leftcontentPane.setBorder(BorderFactory.createEmptyBorder()); - } - - @Override - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.height = FIL_HEIGHT; - return dim; } @Override @@ -238,51 +220,37 @@ public class ChartDataFilterPane extends ThirdTabPane { protected JPanel initOtherPane() { onlyPreData = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Only_Use_Before_Records")); - JPanel panel1 = new JPanel(new BorderLayout()); - JPanel panel2 = new JPanel(new BorderLayout()); - panel1.add(onlyPreData, BorderLayout.NORTH); preDataNum = new UITextField(); UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Records_Num")); combineOther = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Data_CombineOther")); combineOther.setSelected(true); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p,f}; - double[] rowSize = {p, p}; - Component[][] components = new Component[][]{ - new Component[]{label,preDataNum}, - new Component[]{combineOther,null} - }; - - preDataNumPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); - preDataNumPane.setBorder(BorderFactory.createEmptyBorder(10,15,0,0)); //默认不显示 + preDataNumPane = column(10, + row(cell(label).weight(1.2), cell(preDataNum).weight(3)), + cell(combineOther) + ).getComponent(); preDataNumPane.setVisible(false); - panel1.add(preDataNumPane, BorderLayout.CENTER); notShowNull = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Data_Not_Show_Cate")); - panel2.add(notShowNull, BorderLayout.NORTH); - onlyPreData.addChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent e) { - checkBoxUse(); - } - }); + onlyPreData.addChangeListener(e -> checkBoxUse()); present = new PresentComboBox() { protected void fireChange() { fire(); } }; - presentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Style_Present") ,present); - panel2.add(presentPane, BorderLayout.SOUTH); - - double[] column = {f}; - double[] row = {p, p}; - Component[][] coms = new Component[][]{ - new Component[]{panel1}, - new Component[]{panel2} - }; - return TableLayout4VanChartHelper.createGapTableLayoutPane(coms, row,column); + presentPane = row( + cell( + new UILabel(Toolkit.i18nText("Fine-Design_Chart_Style_Present")) + ).weight(1.2), cell(present).weight(3) + ).getComponent(); + + return column(10, + cell(onlyPreData), + cell(preDataNumPane), + cell(notShowNull), + cell(presentPane) + ).with(it -> it.setBorder(new ScaledEmptyBorder(10, 0, 0, 0))).getComponent(); } @@ -394,12 +362,10 @@ public class ChartDataFilterPane extends ThirdTabPane { protected void layoutContentPane() { super.layoutContentPane(); - leftcontentPane.setBorder(BorderFactory.createEmptyBorder()); } public void reloaPane(JPanel pane){ super.reloaPane(pane); - leftcontentPane.setBorder(BorderFactory.createEmptyBorder()); } @Override @@ -413,51 +379,37 @@ public class ChartDataFilterPane extends ThirdTabPane { protected JPanel initOtherPane() { onlyPreData = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Only_Use_Before_Records")); - JPanel panel1 = new JPanel(new BorderLayout()); - JPanel panel2 = new JPanel(new BorderLayout()); - panel1.add(onlyPreData, BorderLayout.NORTH); preDataNum = new UITextField(); UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Records_Num")); combineOther = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Data_CombineOther")); combineOther.setSelected(true); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p,f}; - double[] rowSize = {p, p}; - Component[][] components = new Component[][]{ - new Component[]{label,preDataNum}, - new Component[]{combineOther,null} - }; - - preDataNumPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); - preDataNumPane.setBorder(BorderFactory.createEmptyBorder(10,15,0,0)); //默认不显示 + preDataNumPane = column(10, + row(cell(label).weight(1.2), cell(preDataNum).weight(3)), + cell(combineOther) + ).getComponent(); preDataNumPane.setVisible(false); - panel1.add(preDataNumPane, BorderLayout.CENTER); notShowNull = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Data_Not_Show_Series")); - panel2.add(notShowNull, BorderLayout.NORTH); - onlyPreData.addChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent e) { - checkBoxUse(); - } - }); + onlyPreData.addChangeListener(e -> checkBoxUse()); present = new PresentComboBox() { protected void fireChange() { fire(); } }; - presentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Style_Present") ,present); - panel2.add(presentPane, BorderLayout.SOUTH); - - double[] column = {f}; - double[] row = {p, p}; - Component[][] coms = new Component[][]{ - new Component[]{panel1}, - new Component[]{panel2} - }; - return TableLayout4VanChartHelper.createGapTableLayoutPane(coms, row,column); + presentPane = row( + cell( + new UILabel(Toolkit.i18nText("Fine-Design_Chart_Style_Present")) + ).weight(1.2), cell(present).weight(3) + ).getComponent(); + + return column(10, + cell(onlyPreData), + cell(preDataNumPane), + cell(notShowNull), + cell(presentPane) + ).with(it -> it.setBorder(new ScaledEmptyBorder(10, 0, 0, 0))).getComponent(); } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/DatabaseTableDataPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/DatabaseTableDataPane.java index 40983c56b5..e89a0eaaf9 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/DatabaseTableDataPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/DatabaseTableDataPane.java @@ -1,28 +1,26 @@ package com.fr.design.mainframe.chart.gui.data; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.base.TableData; import com.fr.data.impl.NameTableData; -import com.fr.design.constants.LayoutConstants; -import com.fr.design.constants.UIConstants; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.TableDataComboBox; import com.fr.design.data.tabledata.wrapper.TableDataWrapper; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.utils.gui.UIComponentUtils; import com.fr.log.FineLoggerFactory; -import javax.swing.BorderFactory; -import javax.swing.JPanel; -import javax.swing.border.LineBorder; import java.awt.BorderLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + public class DatabaseTableDataPane extends BasicPane{ private static final long serialVersionUID = 5316016202202932242L; private TableDataComboBox tableNameCombox; @@ -38,21 +36,16 @@ public class DatabaseTableDataPane extends BasicPane{ initTableCombox(); initReviewButton(); - this.setLayout(new BorderLayout(0,0)); - if (label != null) { - this.add(label, BorderLayout.WEST); - } - - JPanel pane = new JPanel(new BorderLayout(LayoutConstants.HGAP_LARGE,0)); - pane.add(tableNameCombox,BorderLayout.CENTER); - pane.add(reviewButton,BorderLayout.EAST); - - this.add(UIComponentUtils.wrapWithBorderLayoutPane(pane),BorderLayout.CENTER); + this.setLayout(new BorderLayout()); + this.add( + row( + cell(label).weight(1.2), cell(tableNameCombox).weight(2.4), flex(0.1), cell(reviewButton).weight(0.5) + ).getComponent(), BorderLayout.CENTER + ); setBorder(); } protected void setBorder () { - this.setBorder(BorderFactory.createEmptyBorder(0,24,0,15)); } /** * 返回选中的数据源. @@ -101,15 +94,14 @@ public class DatabaseTableDataPane extends BasicPane{ } private void initReviewButton() { - reviewButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/data/search.png")); - reviewButton.setBorder(new LineBorder(UIConstants.LINE_COLOR)); + reviewButton = new UIButton(new LazyIcon("search")); reviewButton.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { - TableDataWrapper tableDataWrappe = tableNameCombox.getSelectedItem(); - if ( tableDataWrappe != null) { + TableDataWrapper tableDataWrapper = tableNameCombox.getSelectedItem(); + if ( tableDataWrapper != null) { try { - tableDataWrappe.previewData(); + tableDataWrapper.previewData(); } catch (Exception e1) { FineLoggerFactory.getLogger().error(e1.getMessage(), e1); } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java index 9943c79631..6bf18a70eb 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java @@ -1,25 +1,26 @@ package com.fr.design.mainframe.chart.gui.data; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.chart.chartattr.ChartCollection; import com.fr.design.beans.FurtherBasicBeanPane; -import com.fr.design.chartx.data.DataLayoutHelper; -import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.frpane.AttributeChangeListener; import com.fr.design.gui.frpane.UIComboBoxPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.mode.ChartEditContext; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.van.chart.designer.AbstractVanChartScrollPane; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fr.design.constants.LayoutConstants.LEFT_WEIGHT; +import static com.fr.design.constants.LayoutConstants.RIGHT_WEIGHT; + /** * 一般数据界面 * @author kunsnat E-mail:kunsnat@gmail.com @@ -62,19 +63,14 @@ public class NormalChartDataPane extends DataContentsPane { JPanel contentPane = new JPanel(new BorderLayout()); dataPane = new UIComboBoxPane() { protected void initLayout() { - this.setLayout(new BorderLayout(ChartEditContext.normalMode() ? LayoutConstants.HGAP_LARGE : 0,6)); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); + setBorder(new ScaledEmptyBorder(10, 0, 0, 0)); if (ChartEditContext.supportReportData()) { - JPanel northPane = new JPanel(new BorderLayout(LayoutConstants.HGAP_LARGE, 0)); - northPane.add(jcb, BorderLayout.CENTER); - UILabel label1 = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_Source")); - label1.setPreferredSize(new Dimension(ChartDataPane.LABEL_WIDTH, ChartDataPane.LABEL_HEIGHT)); - northPane.add(GUICoreUtils.createBorderLayoutPane(new Component[]{jcb, null, null, label1, null})); - if (ChartEditContext.normalMode()) { - northPane.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 8)); - } else { - northPane.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 20)); - } - this.add(northPane, BorderLayout.NORTH); + UILabel dataSourceLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_Source")); + this.add(row( + cell(dataSourceLabel).weight(LEFT_WEIGHT), + cell(jcb).weight(RIGHT_WEIGHT) + ).getComponent(), BorderLayout.NORTH); } this.add(cardPane, BorderLayout.CENTER); @@ -95,7 +91,6 @@ public class NormalChartDataPane extends DataContentsPane { } }; contentPane.add(dataPane, BorderLayout.CENTER); - dataPane.setBorder(BorderFactory.createEmptyBorder(10 ,0, 0, 0)); return contentPane; } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/TableDataPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/TableDataPane.java index 82240bc6d2..0c84c65e63 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/TableDataPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/TableDataPane.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.chart.gui.data; +import com.fine.theme.utils.FineUIScale; import com.fr.base.TableData; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; @@ -9,23 +10,16 @@ import com.fr.data.impl.NameTableData; import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.beans.FurtherBasicBeanPane; import com.fr.design.data.tabledata.wrapper.TableDataWrapper; -import com.fr.design.gui.ilable.BoldFontTextLabel; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; -import com.fr.design.utils.gui.UIComponentUtils; import com.fr.stable.StringUtils; -import javax.swing.BorderFactory; import java.awt.BorderLayout; -import java.awt.Dimension; public class TableDataPane extends FurtherBasicBeanPane{ private static final long serialVersionUID = 4740461028440155147L; - private static final int TOP = -5; - private static final int TABLE_DATA_LABEL_LINE_WRAP_WIDTH = 65; - private static final int TABLE_DATA_PANE_WIDTH = 246; private DatabaseTableDataPane tableDataPane; private AbstractTableDataContentPane dataContentPane; @@ -37,14 +31,12 @@ public class TableDataPane extends FurtherBasicBeanPane{ public TableDataPane(ChartDataPane parent) { this.parent = parent; + setLayout(new BorderLayout(0, FineUIScale.scale(10))); initDataPane(); } private void initDataPane() { - UILabel label = new BoldFontTextLabel(Toolkit.i18nText("Fine-Design_Chart_Table_Data")); - UIComponentUtils.setLineWrap(label, TABLE_DATA_LABEL_LINE_WRAP_WIDTH); - UIComponentUtils.setPreferedWidth(label, ChartDataPane.LABEL_WIDTH); - + UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Table_Data")); tableDataPane = new DatabaseTableDataPane(label) { @Override protected void userEvent() { @@ -52,9 +44,6 @@ public class TableDataPane extends FurtherBasicBeanPane{ checkBoxUse(); } }; - - tableDataPane.setPreferredSize(new Dimension(TABLE_DATA_PANE_WIDTH , tableDataPane.getPreferredSize().height)); - this.setBorder(BorderFactory.createEmptyBorder(TOP,0,0,0)); this.add(tableDataPane, BorderLayout.NORTH); } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/report/AbstractReportDataContentPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/report/AbstractReportDataContentPane.java index 1073f0e410..2e1f486ccf 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/report/AbstractReportDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/report/AbstractReportDataContentPane.java @@ -53,7 +53,6 @@ public abstract class AbstractReportDataContentPane extends BasicBeanPane addNewCatePane()); } /** @@ -100,37 +86,29 @@ public class CategoryPlotMoreCateReportDataContentPane extends CategoryPlotRepor } private TinyFormulaPane addNewCatePane() { - final TinyFormulaPane pane = initCategoryBox(StringUtils.EMPTY); - pane.setPreferredSize(new Dimension(100, 16)); - - pane.registerChangeListener(uiobListener); - - formualList.add(pane); + final TinyFormulaPane formulaPane = initCategoryBox(StringUtils.EMPTY); - final JPanel newButtonPane = new JPanel(); - newButtonPane.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 0)); - newButtonPane.add(pane); - - UIButton delButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/toolbarbtn/close.png")); - newButtonPane.add(delButton); + formulaPane.registerChangeListener(uiobListener); + formualList.add(formulaPane); + UIButton delButton = new UIButton(new LazyIcon("close")); + JPanel newButtonPane = row( + cell(formulaPane).weight(3.7), flex(0.1), cell(delButton).weight(0.4) + ).with(it -> it.setBorder(new ScaledEmptyBorder(10, 0, 0, 0))).getComponent(); boxPane.add(newButtonPane); - delButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - boxPane.remove(newButtonPane); - formualList.remove(pane); - checkComponent(); - relayoutPane(); - } + delButton.addActionListener(e -> { + boxPane.remove(newButtonPane); + formualList.remove(formulaPane); + checkComponent(); + relayoutPane(); }); delButton.registerChangeListener(uiobListener); checkComponent(); relayoutPane(); - return pane; + return formulaPane; } private void checkAddButton() { diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotReportDataContentPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotReportDataContentPane.java index fb315b84ed..944f7d2825 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotReportDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotReportDataContentPane.java @@ -5,25 +5,27 @@ import com.fr.chart.chartattr.Bar2DPlot; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartdata.NormalReportDataDefinition; import com.fr.chart.chartdata.SeriesDefinition; +import com.fr.design.border.FineBorderFactory; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.formula.DefaultTinyFormulaPane; import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.ChartDataFilterPane; -import com.fr.stable.StringUtils; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; -import javax.swing.BorderFactory; -import javax.swing.JPanel; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.BorderLayout; -import java.awt.Dimension; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + public class CategoryPlotReportDataContentPane extends AbstractReportDataContentPane { - protected static final int PRE_WIDTH = 210; protected TinyFormulaPane categoryName; protected ChartDataFilterPane filterPane; @@ -35,30 +37,24 @@ public class CategoryPlotReportDataContentPane extends AbstractReportDataContent public CategoryPlotReportDataContentPane(ChartDataPane parent) { initEveryPane(); categoryName = initCategoryBox(Toolkit.i18nText("Fine-Design_Chart_Category_Name")); - categoryName.setPreferredSize(new Dimension(236,30)); - categoryName.setBorder(BorderFactory.createEmptyBorder(0,24,0,20)); - this.add(categoryName, "0,0,1,0"); + this.setLayout(new BorderLayout()); filterPane = new ChartDataFilterPane(new Bar2DPlot(), parent); - JPanel panel = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Data_Filter"),filterPane); - panel.setBorder(getSidesBorder()); - filterPane.setBorder(getFilterPaneBorder()); - this.add(panel, "0,6,1,4"); } + this.add(column( + cell(categoryName), + fix(10).with(it -> it.setBorder(FineBorderFactory.createDefaultUnderlineBorder())), + cell(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Data_Filter"),filterPane)) + ).getComponent()); + } protected TinyFormulaPane initCategoryBox(final String leftLabel) { TinyFormulaPane categoryName = new DefaultTinyFormulaPane() { @Override protected void initLayout() { - this.setLayout(new BorderLayout(4, 0)); - - if(StringUtils.isNotEmpty(leftLabel)) { - UILabel label1 = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Category_Name")); - label1.setPreferredSize(new Dimension(75, 20)); - this.add(label1, BorderLayout.WEST); - } - - formulaTextField.setPreferredSize(new Dimension(100, 20)); - this.add(formulaTextField, BorderLayout.CENTER); - this.add(formulaTextFieldButton, BorderLayout.EAST); + UILabel label = new UILabel(leftLabel); + this.setLayout(new BorderLayout()); + this.add(row( + cell(label).weight(1.2), cell(formulaTextField).weight(2), flex(0.1), cell(formulaTextFieldButton).weight(0.4) + ).getComponent()); } public void okEvent() { diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotMoreCateTableDataContentPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotMoreCateTableDataContentPane.java index 7432dfcce1..0f2e21a6a4 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotMoreCateTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotMoreCateTableDataContentPane.java @@ -1,28 +1,25 @@ package com.fr.design.mainframe.chart.gui.data.table; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineLayoutBuilder; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.chartattr.Bar2DPlot; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartattr.Plot; import com.fr.chart.chartdata.NormalTableDataDefinition; +import com.fr.design.border.FineBorderFactory; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.UIComboBox; -import com.fr.design.gui.ilable.BoldFontTextLabel; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.ChartDataHelper; -import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; @@ -30,6 +27,11 @@ import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + /** * 多分类轴 的数据集定义界面. * @@ -38,9 +40,6 @@ import java.util.List; */ public class CategoryPlotMoreCateTableDataContentPane extends CategoryPlotTableDataContentPane implements UIObserver { private static final long serialVersionUID = -3305681053750642843L; - private static final int COMBOX_GAP = 8; - private static final int COMBOX_WIDTH = 95; - private static final int COMBOX_HEIGHT = 20; private JPanel boxPane; @@ -59,40 +58,37 @@ public class CategoryPlotMoreCateTableDataContentPane extends CategoryPlotTableD public CategoryPlotMoreCateTableDataContentPane(ChartDataPane parent) { categoryCombox = new UIComboBox(); - categoryCombox.setPreferredSize(new Dimension(COMBOX_WIDTH,COMBOX_HEIGHT)); - - JPanel categoryPane = new JPanel(new BorderLayout(4, 0)); - categoryPane.setBorder(BorderFactory.createMatteBorder(0, 0, 6, 1, getBackground())); - UILabel categoryLabel = new BoldFontTextLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Category")); - categoryLabel.setPreferredSize(new Dimension(85,COMBOX_HEIGHT)); - - addButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); - addButton.setPreferredSize(new Dimension(20, COMBOX_HEIGHT)); - - categoryPane.add(GUICoreUtils.createBorderLayoutPane(new Component[]{categoryCombox, addButton, null, categoryLabel, null})); - - categoryPane.setBorder(BorderFactory.createEmptyBorder(0,24,10,15)); + UILabel categoryLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Category")); + addButton = new UIButton(new LazyIcon("add")); boxPane = new JPanel(); boxPane.setLayout(new BoxLayout(boxPane, BoxLayout.Y_AXIS)); - categoryPane.add(boxPane, BorderLayout.SOUTH); + JPanel categoryPane = column(10, + row( + cell(categoryLabel).weight(1.2), + cell(categoryCombox).weight(2.4), + flex(0.1), + cell(addButton).weight(0.5) + ), + cell(boxPane) + ).with(it -> it.setBorder(FineBorderFactory.createDefaultUnderlineBorder())).getComponent(); + this.setLayout(new BorderLayout()); - this.add(categoryPane, BorderLayout.NORTH); - this.add(getJSeparator()); seriesTypeComboxPane = new SeriesTypeUseComboxPane(parent, new Bar2DPlot()); - this.add(seriesTypeComboxPane, BorderLayout.SOUTH); + this.add(FineLayoutBuilder.createVerticalLayout(10, categoryPane, seriesTypeComboxPane)); addButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (boxList.size() < 2) { - addNewCombox(); + addNewComboBox(); relayoutPane(); } checkSeriseUse(categoryCombox.getSelectedItem() != null); + checkComponent(); } }); @@ -112,49 +108,39 @@ public class CategoryPlotMoreCateTableDataContentPane extends CategoryPlotTableD addButton.setEnabled(hasUse); } - private UIComboBox addNewCombox() { - final JPanel buttonPane = new JPanel(); - buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 2)); - - final UIComboBox combox = new UIComboBox(); - combox.setPreferredSize(new Dimension(COMBOX_WIDTH, COMBOX_HEIGHT)); + private UIComboBox addNewComboBox() { + final UIComboBox comboBox = new UIComboBox(); int count = categoryCombox.getItemCount(); for (int i = 0; i < count; i++) { - combox.addItem(categoryCombox.getItemAt(i)); + comboBox.addItem(categoryCombox.getItemAt(i)); } - combox.registerChangeListener(uiobListener); - combox.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - makeToolTipUse(combox); - } - }); + comboBox.registerChangeListener(uiobListener); + comboBox.addItemListener(e -> makeToolTipUse(comboBox)); + + comboBox.setSelectedItem(categoryCombox.getItemAt(0)); + makeToolTipUse(comboBox); - combox.setSelectedItem(categoryCombox.getItemAt(0)); - makeToolTipUse(combox); + UIButton delButton = new UIButton(new LazyIcon("close")); + JPanel buttonPane = row( + flex(1.2), cell(comboBox).weight(2.4), flex(0.1), cell(delButton).weight(0.5) + ).with(it -> it.setBorder(new ScaledEmptyBorder(0, 0, 10, 0))).getComponent(); - buttonPane.add(combox); - UIButton delButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/toolbarbtn/close.png")); - buttonPane.add(delButton); boxPane.add(buttonPane); - boxList.add(combox); + boxList.add(comboBox); checkComponent(); - delButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - boxPane.remove(buttonPane); - boxList.remove(combox); - checkComponent(); - relayoutPane(); - } + delButton.addActionListener(e -> { + boxPane.remove(buttonPane); + boxList.remove(comboBox); + checkComponent(); + relayoutPane(); }); delButton.registerChangeListener(uiobListener); - return combox; + return comboBox; } private void checkAddButton() { @@ -223,7 +209,7 @@ public class CategoryPlotMoreCateTableDataContentPane extends CategoryPlotTableD NormalTableDataDefinition normal = (NormalTableDataDefinition) top; int size = normal.getMoreCateSize(); for (int i = 0; i < size; i++) { - UIComboBox box = addNewCombox(); + UIComboBox box = addNewComboBox(); box.setSelectedItem(normal.getMoreCateWithIndex(i)); } } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotTableDataContentPane.java index 7d12e3e52d..270f3ffa71 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotTableDataContentPane.java @@ -6,22 +6,21 @@ import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartdata.NormalTableDataDefinition; import com.fr.chart.chartdata.TopDefinition; import com.fr.design.gui.icombobox.UIComboBox; -import com.fr.design.gui.ilable.BoldFontTextLabel; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.chart.gui.ChartDataPane; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; import com.fr.design.i18n.Toolkit; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; -import javax.swing.*; -import java.awt.*; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; +import java.awt.BorderLayout; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; + /** * 属性表, 矩形类的 数据集 数据界面. * @author kunsnat E-mail:kunsnat@gmail.com @@ -40,29 +39,24 @@ public class CategoryPlotTableDataContentPane extends AbstractTableDataContentPa public CategoryPlotTableDataContentPane(ChartDataPane parent) { categoryCombox = new UIComboBox(); - JPanel categoryPane = new JPanel(new BorderLayout(4,0)); - categoryPane.setBorder(BorderFactory.createMatteBorder(0, 0, 6, 1, getBackground())); - UILabel label1 = new BoldFontTextLabel(Toolkit.i18nText("Fine-Design_Chart_Style_Category")) ; - label1.setPreferredSize(new Dimension(ChartDataPane.LABEL_WIDTH,ChartDataPane.LABEL_HEIGHT)); - categoryCombox.setPreferredSize(new Dimension(100,20)); + UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Style_Category")) ; categoryCombox.addItem(Toolkit.i18nText("Fine-Design_Chart_Use_None")); - categoryPane.add(GUICoreUtils.createBorderLayoutPane(new Component[]{categoryCombox,null,null,label1,null})); - categoryPane.setPreferredSize(new Dimension(246,30)); - categoryPane.setBorder(BorderFactory.createEmptyBorder(0,24,10,15)); - this.setLayout(new BorderLayout()); - - this.add(categoryPane, BorderLayout.NORTH); - - this.add(getJSeparator()); seriesTypeComboxPane = new SeriesTypeUseComboxPane(parent, new Bar2DPlot()); - this.add(seriesTypeComboxPane, BorderLayout.SOUTH); - categoryCombox.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - checkSeriseUse(categoryCombox.getSelectedItem() != null); - makeToolTipUse(categoryCombox); - } + this.setLayout(new BorderLayout()); + + this.add(column(10, + row( + cell(label).weight(1.2), cell(categoryCombox).weight(3) + ), + cell(seriesTypeComboxPane) + ).getComponent() + ); + + categoryCombox.addItemListener(e -> { + checkSeriseUse(categoryCombox.getSelectedItem() != null); + makeToolTipUse(categoryCombox); }); } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldValuePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldValuePane.java index 889e6f5302..f3d326f8dc 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldValuePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldValuePane.java @@ -6,17 +6,14 @@ import com.fr.chart.chartdata.OneValueCDDefinition; import com.fr.data.util.function.AbstractDataFunction; import com.fr.data.util.function.NoneFunction; import com.fr.design.beans.FurtherBasicBeanPane; +import com.fr.design.border.FineBorderFactory; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.extended.chart.UIComboBoxWithNone; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.util.List; import java.awt.BorderLayout; @@ -25,6 +22,11 @@ import java.awt.Dimension; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.row; + /** * 属性表 数据集 系列名使用 系列值 界面. * @@ -45,9 +47,6 @@ public class SeriesNameUseFieldValuePane extends FurtherBasicBeanPane it.setBorder(FineBorderFactory.createDefaultUnderlineBorder())) + ).getComponent(); this.setLayout(new BorderLayout()); this.add(centerPane, BorderLayout.CENTER); } private void initCenterPaneWithOutCaculateSummary() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f}; - double[] rowSize = {p, p, p, p}; UILabel label1 = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Series_Name")); - label1.setPreferredSize(getLabelDimension()); UILabel label2 = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Series_Value")); - label2.setPreferredSize(getLabelDimension()); - UILabel label3 = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Summary_Method")); - label3.setPreferredSize(getLabelDimension()); - Component[][] components = getUseComponentWithOutSummary(label1, label2, label3); - - centerPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 4, 6); - centerPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 1)); + centerPane = column(10, + row( + cell(label1).weight(1), cell(seriesName).weight(2) + ), + row( + cell(label2).weight(1), cell(seriesValue).weight(2) + ), + fix(1).with(it -> it.setBorder(FineBorderFactory.createDefaultUnderlineBorder())) + ).getComponent(); this.setLayout(new BorderLayout()); this.add(centerPane, BorderLayout.CENTER); } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/SeriesTypeUseComboxPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/SeriesTypeUseComboxPane.java index cf78e59ffb..2a78359109 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/SeriesTypeUseComboxPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/SeriesTypeUseComboxPane.java @@ -1,30 +1,32 @@ package com.fr.design.mainframe.chart.gui.data.table; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartattr.Plot; import com.fr.chart.chartdata.MoreNameCDDefinition; import com.fr.chart.chartdata.OneValueCDDefinition; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.constants.LayoutConstants; import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.ChartDataFilterPane; -import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.util.List; import java.awt.BorderLayout; import java.awt.CardLayout; -import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.row; + /** * 属性表: 柱形, 饼图 数据集界面, "系列名使用"界面. * @@ -98,32 +100,21 @@ public class SeriesTypeUseComboxPane extends BasicBeanPane { } protected void initLayout() { - this.setLayout(new BorderLayout(4, LayoutConstants.VGAP_MEDIUM)); - JPanel northPane = new JPanel(new BorderLayout(4, 0)); - + this.setLayout(new BorderLayout()); //使用系列名/系列值选项面板 UILabel seriesLabel = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Series_Name_From")); - seriesLabel.setPreferredSize(new Dimension(ChartDataPane.LABEL_WIDTH, ChartDataPane.LABEL_HEIGHT)); - JPanel borderLayoutPane = GUICoreUtils.createBorderLayoutPane(new Component[]{content, null, null, seriesLabel, null}); - northPane.add(borderLayoutPane); - northPane.setBorder(BorderFactory.createEmptyBorder(10, 24, 0, 16)); - this.add(northPane, BorderLayout.NORTH); - - //系列名/系列值配置面板 - cardPane.setBorder(BorderFactory.createEmptyBorder(0, 24, 0, 15)); - this.add(cardPane, BorderLayout.CENTER); //数据筛选 dataScreeningPane = new ChartDataFilterPane(this.initplot, parent); - JPanel panel = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Data_Filter"), 250, 24, dataScreeningPane); - panel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 15)); - dataScreeningPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); - this.add(panel, BorderLayout.SOUTH); - } - public Dimension getPreferredSize() { - Dimension preferredSize = super.getPreferredSize(); - return new Dimension(246, (int) preferredSize.getHeight()); + this.add(column( + row( + cell(seriesLabel).weight(1), cell(content).weight(2) + ), + fix(10), + cell(cardPane), + cell(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Data_Filter"), dataScreeningPane)) + ).with(it -> it.setBorder(new ScaledEmptyBorder(10, 0, 0, 0))).getComponent()); } /** diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPane.java index 63b259e7aa..89281390d0 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPane.java @@ -1,8 +1,8 @@ package com.fr.design.mainframe.chart.gui.style; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.FRContext; -import com.fr.base.Utils; import com.fr.chart.base.TextAttr; import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicPane; @@ -18,7 +18,6 @@ import com.fr.design.utils.DesignUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.FRFont; import com.fr.general.GeneralUtils; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.JPanel; import javax.swing.SwingConstants; @@ -193,8 +192,8 @@ public class ChartTextAttrPane extends BasicPane { protected void initState() { fontNameComboBox = new UIComboBox(DesignUtils.getAvailableFontFamilyNames4Report()); fontSizeComboBox = new UIComboBox(getFontSizeComboBoxModel()); - bold = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold.png")); - italic = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic.png")); + bold = new UIToggleButton(new LazyIcon("bold")); + italic = new UIToggleButton(new LazyIcon("italic")); initFontColorState(); } @@ -217,11 +216,7 @@ public class ChartTextAttrPane extends BasicPane { } protected JPanel getContentPane(JPanel buttonPane) { - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - - return TableLayout4VanChartHelper.createGapTableLayoutPane(getComponents(buttonPane), getRowSize(), columnSize); + return FineLayoutBuilder.compatibleTableLayout(10, getComponents(buttonPane), new double[]{1.2, 3}); } protected double[] getRowSize() { diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPaneWithThemeStyle.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPaneWithThemeStyle.java index 345d57de8a..76862a7577 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPaneWithThemeStyle.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPaneWithThemeStyle.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.chart.gui.style; +import com.fine.theme.utils.FineUIScale; import com.fr.chart.base.TextAttr; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; @@ -7,7 +8,6 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.layout.TableLayout; import com.fr.van.chart.designer.TableLayout4VanChartHelper; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingConstants; import java.awt.BorderLayout; @@ -33,7 +33,7 @@ public class ChartTextAttrPaneWithThemeStyle extends ChartTextAttrPane { } protected JPanel getContentPane(JPanel buttonPane) { - JPanel panel = new JPanel(new BorderLayout(0, 10)); + JPanel panel = new JPanel(new BorderLayout(0, FineUIScale.scale(10))); preButton = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_Follow_Theme"), Toolkit.i18nText("Fine-Design_Chart_Custom")}); @@ -46,7 +46,6 @@ public class ChartTextAttrPaneWithThemeStyle extends ChartTextAttrPane { textFontPane = TableLayout4VanChartHelper.createGapTableLayoutPane(getComponents(buttonPane), getRowSize(), columnSize); panel.add(preButtonPane, BorderLayout.CENTER); panel.add(textFontPane, BorderLayout.SOUTH); - panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); return panel; } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ColorSelectBoxWithThemeStyle.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ColorSelectBoxWithThemeStyle.java index db59476792..412266358a 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ColorSelectBoxWithThemeStyle.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ColorSelectBoxWithThemeStyle.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.chart.gui.style; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.base.ColorWithThemeStyle; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButtonGroup; @@ -7,13 +8,10 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.mode.ChartEditContext; import com.fr.design.style.color.ColorSelectBox; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.JPanel; -import javax.swing.SwingConstants; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -40,7 +38,7 @@ public class ColorSelectBoxWithThemeStyle extends BasicPane { private void initContent() { - UILabel text = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Color"), SwingConstants.LEFT); + UILabel text = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Color")); Component[][] components = ChartEditContext.supportTheme() ? new Component[][]{ new Component[]{text, preButton}, new Component[]{null, colorSelectBox}, @@ -48,23 +46,17 @@ public class ColorSelectBoxWithThemeStyle extends BasicPane { new Component[]{text, colorSelectBox} }; - JPanel gapTableLayoutPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components); + JPanel gapTableLayoutPane = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); this.setLayout(new BorderLayout()); this.add(gapTableLayoutPane, BorderLayout.CENTER); } private void initListener() { - preButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - checkPreButton(); - } - }); + preButton.addActionListener(e -> checkPreButton()); } private void checkPreButton() { colorSelectBox.setVisible(preButton.getSelectedIndex() == CUSTOM); - this.setPreferredSize(ChartEditContext.supportTheme() && preButton.getSelectedIndex() == CUSTOM ? new Dimension(0, 55) : new Dimension(0, 23)); } public String title4PopupWindow() { diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ThirdTabPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ThirdTabPane.java index a58a889164..5afaded3f2 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ThirdTabPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ThirdTabPane.java @@ -3,29 +3,18 @@ package com.fr.design.mainframe.chart.gui.style; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicScrollPane; import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; import com.fr.design.gui.ibutton.UIButtonGroup; import javax.swing.JPanel; -import javax.swing.border.Border; import java.util.List; import java.awt.BorderLayout; import java.awt.CardLayout; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; public abstract class ThirdTabPane extends BasicBeanPane{ private static final long serialVersionUID = 2298609199400393886L; - private static final int MIN_TAB_HEIGHT = 25; protected UIButtonGroup tabPane; protected String[] nameArray; public JPanel centerPane; @@ -57,54 +46,18 @@ public abstract class ThirdTabPane extends BasicBeanPane{ if (!paneList.isEmpty()) { tabPane = new UIButtonGroup(nameArray); tabPane.setSelectedIndex(0); - int prefHeight = tabPane.getPreferredSize().height; - int prefWidth = tabPane.getPreferredSize().width + 20; // 暂且加一个偏移量 - int minWidth = 60 * nameArray.length; - tabPane.setPreferredSize( - new Dimension(prefWidth > minWidth ? prefWidth : minWidth, - prefHeight > MIN_TAB_HEIGHT ? prefHeight : MIN_TAB_HEIGHT)); - tabPane.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - cardLayout.show(centerPane, nameArray[tabPane.getSelectedIndex()]); - } - }); - - centerPane.setBorder(myBorder); + tabPane.addActionListener(e -> cardLayout.show(centerPane, nameArray[tabPane.getSelectedIndex()])); } } protected void initLayout() { this.setLayout(new BorderLayout()); if (!paneList.isEmpty()) { - JPanel pane = new JPanel(new FlowLayout(FlowLayout.LEADING, 0, 0)); - pane.add(tabPane); - this.add(pane, BorderLayout.NORTH); + this.add(tabPane, BorderLayout.NORTH); } this.add(centerPane, BorderLayout.CENTER); } - private Border myBorder = new Border() { - @Override - public void paintBorder(Component c, Graphics g, int x, int y, int width,int height) { - Graphics2D g2d = (Graphics2D)g; - g2d.setColor(UIConstants.LINE_COLOR); - g2d.drawLine(0, 0, 0, height); - g2d.drawLine(tabPane.getPreferredSize().width - 1, 0, width - 2, 0); - g2d.drawLine(0, height - 1, width - 2, height - 1); - } - - @Override - public boolean isBorderOpaque() { - return false; - } - - @Override - public Insets getBorderInsets(Component c) { - return new Insets(2, 2, 2, 2); - } - }; - /** * * @return 中间的内容面板的指定宽度 diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/axis/ChartCategoryPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/axis/ChartCategoryPane.java index c0842ab15e..0789ef53d6 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/axis/ChartCategoryPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/axis/ChartCategoryPane.java @@ -18,7 +18,6 @@ import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.Constants; import com.fr.van.chart.designer.component.format.FormatPaneWithOutFont; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.JSeparator; import java.awt.BorderLayout; @@ -134,7 +133,6 @@ public class ChartCategoryPane extends ChartAxisUsePane{ @Override protected void layoutContentPane() { leftcontentPane = createContentPane(); - leftcontentPane.setBorder(BorderFactory.createMatteBorder(5, 10, 5, 0, original)); this.add(leftcontentPane); } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/AbstractPlotSeriesPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/AbstractPlotSeriesPane.java index e9b118df87..cf8f55bb79 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/AbstractPlotSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/AbstractPlotSeriesPane.java @@ -70,7 +70,6 @@ public abstract class AbstractPlotSeriesPane extends BasicBeanPane{ panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); } - panel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 15)); return panel; } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ChartTabPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ChartTabPane.java index 495c0409ad..05b353ea07 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ChartTabPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ChartTabPane.java @@ -1,5 +1,7 @@ package com.fr.design.mainframe.chart.gui.type; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.chart.chartattr.Chart; import com.fr.design.dialog.MultiTabPane; import com.fr.design.gui.ibutton.UIToggleButton; @@ -7,8 +9,9 @@ import com.fr.design.mainframe.chart.gui.style.legend.AutoSelectedPane; import com.fr.general.ComparatorUtils; import com.fr.stable.StringUtils; -import javax.swing.*; -import java.awt.*; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Graphics; /** * Created by Mitisky on 16/3/9. @@ -21,9 +24,9 @@ public abstract class ChartTabPane extends MultiTabPane { @Override protected void initLayout() { JPanel tabPanel = new JPanel(new BorderLayout()); - tabPanel.setBorder(BorderFactory.createMatteBorder(0, 5, 0, 10, getBackground())); tabPanel.add(tabPane, BorderLayout.CENTER); - this.setLayout(new BorderLayout(0, 4)); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); + this.setBorder(new ScaledEmptyBorder(10, 0, 0, 0)); this.add(tabPanel, BorderLayout.NORTH); this.add(centerPane, BorderLayout.CENTER); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnSeriesPane.java index a542f100cb..57176c256c 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnSeriesPane.java @@ -1,8 +1,10 @@ package com.fr.van.chart.column; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.background.ImageBackground; import com.fr.chart.chartattr.Plot; import com.fr.chart.chartglyph.ConditionAttr; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.frpane.UINumberDragPane; import com.fr.design.gui.frpane.UINumberDragPaneWithPercent; import com.fr.design.gui.ibutton.UIButtonGroup; @@ -10,28 +12,19 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.ispinner.chart.UISpinnerWithPx; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.backgroundpane.ImageBackgroundQuickPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; -import com.fr.design.utils.gui.UIComponentUtils; -import com.fr.design.widget.FRWidgetFactory; import com.fr.plugin.chart.base.AttrSeriesImageBackground; import com.fr.plugin.chart.column.VanChartColumnPlot; import com.fr.stable.Constants; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.VanChartBeautyPane; import com.fr.van.chart.designer.component.VanChartBeautyPaneWithGradientBar; import com.fr.van.chart.designer.component.border.VanChartBorderPane; import com.fr.van.chart.designer.component.border.VanChartBorderWithRadiusPane; import com.fr.van.chart.designer.style.series.VanChartAbstractPlotSeriesPane; -import javax.swing.BorderFactory; import javax.swing.JPanel; -import java.awt.BorderLayout; import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; /** * 新条形图系列界面 @@ -52,20 +45,13 @@ public class VanChartColumnSeriesPane extends VanChartAbstractPlotSeriesPane { } protected JPanel getContentInPlotType() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f}; - double[] rowSize = {p,p,p,p,p,p,p,p,p,p}; - Component[][] components = new Component[][]{ - new Component[]{createSeriesStylePane(new double[]{p,p}, new double[]{f,e})}, - new Component[]{createBorderPane()}, - new Component[]{createStackedAndAxisPane()}, - new Component[]{createTrendLinePane()}, - }; - - contentPane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); - + contentPane = FineLayoutBuilder.createVerticalLayout(0, + createSeriesStylePane(), + createBorderPane(), + createStackedAndAxisPane(), + createTrendLinePane() + ); + contentPane = FineLayoutBuilder.asBorderLayoutWrapped(contentPane); return contentPane; } @@ -74,55 +60,26 @@ public class VanChartColumnSeriesPane extends VanChartAbstractPlotSeriesPane { return new VanChartBorderWithRadiusPane(true); } - private JPanel createSeriesStylePane(double[] row, double[] col) { - isFixedWidth = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_YES"), Toolkit.i18nText("Fine-Design_Chart_NO")}); + private JPanel createSeriesStylePane() { + isFixedWidth = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_YES"), Toolkit.i18nText("Fine-Design_Chart_NO")}); columnWidth = new UISpinnerWithPx(0,1000,1,0); - columnWidth.setBorder(BorderFactory.createEmptyBorder(0, (int)TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH + TableLayout4VanChartHelper.COMPONENT_INTERVAL,0,0)); seriesGap = new UINumberDragPaneWithPercent(-100, 100); categoryGap = new UINumberDragPaneWithPercent(0, 100); - isFillWithImage = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_YES"), Toolkit.i18nText("Fine-Design_Chart_NO")}); + isFillWithImage = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_YES"), Toolkit.i18nText("Fine-Design_Chart_NO")}); imagePane = new ImageBackgroundQuickPane(false); - imagePane.setBorder(BorderFactory.createEmptyBorder(0,(int)TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH + TableLayout4VanChartHelper.COMPONENT_INTERVAL,0,0)); - - JPanel panel1 = new JPanel(new BorderLayout()); - JPanel isFixedWidthPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Fixed_Column_Width"),isFixedWidth); - isFixedWidthPane.setBorder(BorderFactory.createEmptyBorder(0,0,6,0)); - panel1.add(isFixedWidthPane, BorderLayout.NORTH); - panel1.add(columnWidth, BorderLayout.CENTER); - - Component[][] components2 = new Component[][]{ - new Component[]{FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Chart_Gap_Series")),seriesGap}, - new Component[]{FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Chart_Gap_Category")),categoryGap}, + Component[][] components = new Component[][]{ + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Fixed_Column_Width")), isFixedWidth}, + new Component[]{null, columnWidth}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Gap_Series")), seriesGap}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Gap_Category")), categoryGap}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Filled_With_Image")), isFillWithImage}, + new Component[]{null, imagePane} }; - JPanel panel2 = TableLayout4VanChartHelper.createGapTableLayoutPane(components2, row, col); + JPanel borderPane = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); - UILabel fillImageLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Chart_Filled_With_Image")); - Component[][] components3 = new Component[][]{ - new Component[]{fillImageLabel, UIComponentUtils.wrapWithBorderLayoutPane(isFillWithImage)}, - }; - JPanel panel3 = TableLayout4VanChartHelper.createGapTableLayoutPane(components3, row, col); - - JPanel panel = new JPanel(new BorderLayout(0, 4)); - panel.add(panel1, BorderLayout.NORTH); - panel.add(panel2, BorderLayout.CENTER); - panel.add(panel3, BorderLayout.SOUTH); - - JPanel borderPane = new JPanel(new BorderLayout()); - borderPane.add(panel, BorderLayout.NORTH); - borderPane.add(imagePane, BorderLayout.CENTER); - isFixedWidth.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - checkColumnWidth(); - } - }); - isFillWithImage.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - checkImagePane(); - } - }); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), borderPane); + isFixedWidth.addActionListener(e -> checkColumnWidth()); + isFillWithImage.addActionListener(e -> checkImagePane()); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Filled_With_Image"), borderPane); } private void checkAll() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/AbstractVanChartScrollPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/AbstractVanChartScrollPane.java index f5d592e025..9949862884 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/AbstractVanChartScrollPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/AbstractVanChartScrollPane.java @@ -14,23 +14,9 @@ public abstract class AbstractVanChartScrollPane extends BasicScrollPane { protected void layoutContentPane() { leftcontentPane = createContentPane(); - leftcontentPane.setBorder(BorderFactory.createMatteBorder(0, 5, 0, 10, original)); this.add(leftcontentPane); } - protected void setLeftContentPaneBounds(Container parent, UIScrollBar scrollBar, int beginY, int maxheight) { - int width = parent.getWidth(); - int height = parent.getHeight(); - if (leftcontentPane.getPreferredSize().height > maxheight) { - scrollBar.setBounds(width - scrollBar.getWidth() - 1, 0, 6, height); - leftcontentPane.setBounds(0, -beginY, width - 6, height + beginY); - leftcontentPane.setBorder(BorderFactory.createMatteBorder(0, 4, 0, 4, original)); - - } else { - leftcontentPane.setBounds(0, 0, width, height); - leftcontentPane.setBorder(BorderFactory.createMatteBorder(0, 4, 0, 10, original)); - } - } public void reloaPane(JPanel pane){ super.reloaPane(pane); leftcontentPane.setBorder(BorderFactory.createEmptyBorder()); diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java index d89a7d31e5..ce4a6492b5 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java @@ -1,15 +1,16 @@ package com.fr.van.chart.designer.component; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; import com.fr.design.beans.BasicBeanPane; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.jxbrowser.JxUIPane; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; import com.fr.general.ComparatorUtils; @@ -22,7 +23,6 @@ import com.fr.plugin.chart.base.format.AttrTooltipPercentFormat; import com.fr.plugin.chart.base.format.AttrTooltipSeriesFormat; import com.fr.plugin.chart.base.format.AttrTooltipValueFormat; import com.fr.stable.StringUtils; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithCheckBox; import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithCheckBox; import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithCheckBox; @@ -52,6 +52,10 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; + /** * 数据点提示内容界面,含有通用设置、富文本编辑器、自定义JS界面 */ @@ -191,7 +195,7 @@ public class VanChartTooltipContentPane extends BasicBeanPane(new String[]{ Toolkit.i18nText("Fine-Design_Chart_Common"), @@ -291,22 +289,18 @@ public class VanChartTooltipContentPane extends BasicBeanPane(Toolkit.i18nText("Fine-Design_Basic_Form_Layout"), createTitlePositionPane()), + new Pair<>(Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), createTitleStylePane()), + new Pair<>(Toolkit.i18nText("Fine-Design_Chart_Border"), borderPane), + new Pair<>(Toolkit.i18nText("Fine-Design_Chart_Background"), backgroundPane), + new Pair<>(Toolkit.i18nText("Fine-Design_Chart_Display_Strategy"), createDisplayStrategy()) + ); + return FineLayoutBuilder.asBorderLayoutWrapped(column); } protected VanChartBackgroundPane creatBackgroundPane(){ @@ -166,27 +160,21 @@ public class VanChartPlotLegendPane extends BasicPane { backgroundPane = creatBackgroundPane(); fixedCheckPane = createFixedCheckPane(); JPanel panel = new JPanel(); - panel.setLayout(new BorderLayout()); + panel.setLayout(new BorderLayout(0, FineUIScale.scale(10))); panel.add(createDisplayStrategy(), BorderLayout.CENTER); panel.add(fixedCheckPane, BorderLayout.SOUTH); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] rowSize = {p, p, p, p, p, p, p, p}; - - Component[][] components = new Component[][]{ - new Component[]{createTitlePositionPane(new double[]{p, p, p}, columnSize), null}, - new Component[]{createTitleStylePane(), null}, - new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Border"), borderPane), null}, - new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Background"), backgroundPane), null}, - new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Display_Strategy"), panel), null}, - }; - return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + Column column = FineLayoutBuilder.createVerticalExpandPaneLayout(0, + new Pair<>(Toolkit.i18nText("Fine-Design_Basic_Form_Layout"), createTitlePositionPane()), + new Pair<>(Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), createTitleStylePane()), + new Pair<>(Toolkit.i18nText("Fine-Design_Chart_Border"), borderPane), + new Pair<>(Toolkit.i18nText("Fine-Design_Chart_Background"), backgroundPane), + new Pair<>(Toolkit.i18nText("Fine-Design_Chart_Display_Strategy"), panel) + ); + return FineLayoutBuilder.asBorderLayoutWrapped(column); } - private JPanel createTitlePositionPane(double[] row, double[] col) { + private JPanel createTitlePositionPane() { String[] textArray = { Toolkit.i18nText("Fine-Design_Chart_Style_Alignment_Top"), Toolkit.i18nText("Fine-Design_Chart_Style_Alignment_Bottom"), @@ -213,7 +201,6 @@ public class VanChartPlotLegendPane extends BasicPane { customFloatPositionButton.setEventBannded(true); Component[][] components = new Component[][]{ - new Component[]{null, null}, new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Layout_Position")), location}, new Component[]{null, customFloatPositionButton} }; @@ -223,13 +210,12 @@ public class VanChartPlotLegendPane extends BasicPane { initPositionListener(); - JPanel positionPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); + JPanel positionPane = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); - JPanel panel = new JPanel(new BorderLayout()); - panel.add(positionPane, BorderLayout.NORTH); - panel.add(layoutPane, BorderLayout.CENTER); + return column(10, + cell(positionPane), cell(layoutPane) + ).getComponent(); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Basic_Form_Layout"), panel); } private JPanel createLayoutPane() { @@ -237,16 +223,11 @@ public class VanChartPlotLegendPane extends BasicPane { new String[]{Toolkit.i18nText("Fine-Design_Chart_Layout_Flow"), Toolkit.i18nText("Fine-Design_Chart_Layout_Aligned")}, new LayoutType[]{LayoutType.FLOW, LayoutType.ALIGNED}); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - Component[][] components = new Component[][]{ - new Component[]{null, null}, new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Arrange")), layoutButton} }; - return TableLayout4VanChartHelper.createGapTableLayoutPane(components, new double[]{p, p}, new double[]{f, e}); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } private void initPositionListener() { @@ -290,48 +271,34 @@ public class VanChartPlotLegendPane extends BasicPane { private JPanel createTitleStylePane() { textAttrPane = ChartEditContext.supportTheme() ? new ChartTextAttrPaneWithThemeStyle() : new ChartTextAttrPane(); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), textAttrPane); + return textAttrPane; } private JPanel createDisplayStrategy() { //区域显示策略 恢复用注释。开始删除。 maxProportion = new UINumberDragPaneWithPercent(0, 100, 1); customSize = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_Auto"), Toolkit.i18nText("Fine-Design_Chart_Custom")}); + maxProportionPane = row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Chart_Max_Proportion"))).weight(1.2), + cell(maxProportion).weight(3) + ).getComponent(); - JPanel limitSizePane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Area_Size"), customSize); - maxProportionPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Max_Proportion"), maxProportion, TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH); - maxProportionPane.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0)); - JPanel panel = new JPanel(new BorderLayout()); - panel.add(limitSizePane, BorderLayout.NORTH); - panel.add(maxProportionPane, BorderLayout.CENTER); - - customSize.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - checkMaxProPortionUse(); - } - }); - return panel; - //区域显示策略 恢复用注释。结束删除。 - - //区域显示策略 恢复用注释。取消注释。 -// limitPane = new LimitPane(false); -// return limitPane; + customSize.addActionListener(e -> checkMaxProPortionUse()); + Component[][] components = new Component[][]{ + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Area_Size")), customSize}, + new Component[]{maxProportionPane, null} + }; + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } private JPanel createFixedCheckPane() { fixedCheck = new UICheckBox(Toolkit.i18nText("Fine-Engine_Chart_Open_Fixed_Display")); fixedCheckLabel = new UILabel(Toolkit.i18nText("Fine-Engine_Chart_Fixed_Display")); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] rowSize = {p, p}; Component[][] components = new Component[][]{ new Component[]{null, null}, new Component[]{fixedCheckLabel, fixedCheck} }; - return TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1.2, 3}); } protected void checkAllUse() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/VanChartTitlePane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/VanChartTitlePane.java index 3469e26246..925d2c38b6 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/VanChartTitlePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/VanChartTitlePane.java @@ -1,10 +1,13 @@ package com.fr.van.chart.designer.style; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIStyle; import com.fr.base.BaseFormula; -import com.fr.base.BaseUtils; import com.fr.base.Utils; import com.fr.chart.base.TextAttr; import com.fr.chartx.config.info.constant.ConfigType; +import com.fr.design.border.FineBorderFactory; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.formula.DefaultTinyFormulaPane; import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.frpane.UIBubbleFloatPane; @@ -15,8 +18,6 @@ import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.PaneTitleConstants; import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPaneWithThemeStyle; @@ -29,25 +30,24 @@ import com.fr.stable.Constants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.van.chart.designer.AbstractVanChartScrollPane; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.VanChartFloatPositionPane; import com.fr.van.chart.designer.component.background.VanChartBackgroundWithOutShadowWithRadiusPane; -import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; import java.awt.Point; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.row; + // 属性表-样式 标题界面 public class VanChartTitlePane extends AbstractVanChartScrollPane { private static final long serialVersionUID = -2438898431228882682L; @@ -96,131 +96,108 @@ public class VanChartTitlePane extends AbstractVanChartScrollPane { private void initComponents() { isTitleVisible = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Title_Visible")); tooltipLabel = new UILabel("" + Toolkit.i18nText("Fine-Design_Chart_Title_Tooltip") + ""); - tooltipLabel.setForeground(Color.gray); - tooltipLabel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10)); + FineUIStyle.setStyle(tooltipLabel, FineUIStyle.LABEL_TIP); tooltipLabel.setVisible(false); - - JPanel panel = new JPanel(); - panel.setLayout(new BorderLayout()); - panel.add(isTitleVisible, BorderLayout.NORTH); - panel.add(tooltipLabel, BorderLayout.CENTER); - titlePane = createTitlePane(); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f}; - double[] rowSize = {p, p, p}; - Component[][] components = new Component[][]{ - new Component[]{panel}, - new Component[]{titlePane} - }; - - JPanel panel1 = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); this.setLayout(new BorderLayout()); - this.add(panel1, BorderLayout.CENTER); + this.add(column( + cell(isTitleVisible), + cell(tooltipLabel), + cell(titlePane) + ).getComponent(), BorderLayout.CENTER); - isTitleVisible.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - checkTitlePaneUse(); - } - }); + isTitleVisible.addActionListener(e -> checkTitlePaneUse()); } } private JPanel createTitlePane() { backgroundPane = createBackgroundPane(); + return column( + cell(createTitleContentPane()), + fix(10).with(it -> it.setBorder(FineBorderFactory.createDefaultUnderlineBorder())), + cell(createTitlePositionPane()), + fix(10).with(it -> it.setBorder(FineBorderFactory.createDefaultUnderlineBorder())), + cell(createTitleStylePane()), + fix(10).with(it -> it.setBorder(FineBorderFactory.createDefaultUnderlineBorder())), + cell(new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Background"), backgroundPane)), + fix(10).with(it -> it.setBorder(FineBorderFactory.createDefaultUnderlineBorder())), + cell(createDisplayStrategy()) + ).getComponent(); - - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {p, f}; - double[] column = {f, e}; - double[] rowSize = {p, p, p, p, p, p, p, p}; - Component[][] components = new Component[][]{ - new Component[]{createTitleContentPane(new double[]{p, p, p}, column), null}, - new Component[]{createTitlePositionPane(new double[]{p, p, p}, column), null}, - new Component[]{createTitleStylePane(), null}, - new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Background"), backgroundPane), null}, - new Component[]{createDisplayStrategy(), null} - }; - - return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); } protected VanChartBackgroundWithOutShadowWithRadiusPane createBackgroundPane() { return new VanChartBackgroundWithOutShadowWithRadiusPane(); } - private JPanel createTitleContentPane(double[] row, double[] col) { + private JPanel createTitleContentPane() { titleContent = new DefaultTinyFormulaPane(); useHtml = new UIToggleButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Html")); UIComponentUtils.setLineWrap(useHtml); - Component[][] components = new Component[][]{ - new Component[]{null, null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Text"), SwingConstants.LEFT), titleContent}, - new Component[]{null, useHtml}, - }; - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Content"), panel); + JPanel titleContentPane = column(10, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Text"), SwingConstants.LEFT)).weight(1.2), + cell(titleContent).weight(3) + )).getComponent(); + return new UIExpandablePane( + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Content"), titleContentPane); } - private JPanel createTitlePositionPane(double[] row, double[] col) { - Icon[] alignmentIconArray = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"), - BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"), - BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png")}; + private JPanel createTitlePositionPane() { + Icon[][] hAlignmentIconArray = {{new LazyIcon("h_left"), new LazyIcon("h_left").white()}, + {new LazyIcon("h_center"), new LazyIcon("h_center").white()}, + {new LazyIcon("h_right"), new LazyIcon("h_right").white()}}; Integer[] alignment = new Integer[]{Constants.LEFT, Constants.CENTER, Constants.RIGHT}; - - alignmentPane = new UIButtonGroup(alignmentIconArray, alignment); + alignmentPane = new UIButtonGroup<>(hAlignmentIconArray, alignment); customFloatPositionButton = new UIToggleButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom_Float_Position")); UIComponentUtils.setLineWrap(customFloatPositionButton); customFloatPositionButton.setEventBannded(true); - Component[][] components = new Component[][]{ - new Component[]{null, null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_BorderLayout_Constraints"), SwingConstants.LEFT), alignmentPane}, - new Component[]{null, customFloatPositionButton} - }; - customFloatPositionPane = new VanChartFloatPositionPane(); initPositionListener(); - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Form_Layout"), panel); + JPanel titlePositionPane = column(10, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_BorderLayout_Constraints"))).weight(1.2), + cell(alignmentPane).weight(3) + ), + cell(customFloatPositionButton) + ).getComponent(); + + return new UIExpandablePane( + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Form_Layout"), titlePositionPane); } private JPanel createTitleStylePane() { textAttrPane = ChartEditContext.supportTheme() ? new ChartTextAttrPaneWithThemeStyle() : new ChartTextAttrPane(); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), textAttrPane); + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), textAttrPane); } private JPanel createDisplayStrategy() { //区域显示策略 恢复用注释。开始删除。 maxProportion = new UINumberDragPaneWithPercent(0, 100, 1); - limitSize = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Limit"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Not_Limit")}); + limitSize = new UIButtonGroup<>(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Limit"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Not_Limit")}); + maxProportionPane = row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Max_Proportion"))).weight(1.2), + cell(maxProportion).weight(3) + ).getComponent(); - JPanel limitSizePane = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Area_Size"), limitSize); - maxProportionPane = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Max_Proportion"), maxProportion, TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH); - maxProportionPane.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0)); JPanel panel = new JPanel(new BorderLayout()); - panel.add(limitSizePane, BorderLayout.NORTH); - panel.add(maxProportionPane, BorderLayout.CENTER); + panel.add(column(10, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Area_Size"))).weight(1.2), + cell(limitSize).weight(3) + ), + cell(maxProportionPane) - limitSize.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - checkMaxProPortionUse(); - } - }); + ).getComponent()); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Display_Strategy"), panel); + limitSize.addActionListener(e -> checkMaxProPortionUse()); - //区域显示策略 恢复用注释。结束删除。 + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Display_Strategy"), panel); - //区域显示策略 恢复用注释。取消注释。 -// limitPane = new LimitPane(); -// return limitPane; } private void initPositionListener() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaBackgroundPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaBackgroundPane.java index e6eb8c6131..9c332c3e5e 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaBackgroundPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaBackgroundPane.java @@ -1,16 +1,15 @@ package com.fr.van.chart.designer.style.background; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.PaneTitleConstants; import com.fr.design.mainframe.chart.mode.ChartEditContext; import com.fr.van.chart.designer.AbstractVanChartScrollPane; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.background.VanChartBackgroundPane; import com.fr.van.chart.designer.component.background.VanChartBackgroundPaneWithThemeStyle; import com.fr.van.chart.designer.component.border.VanChartBorderWithRadiusPane; @@ -52,16 +51,11 @@ public class VanChartAreaBackgroundPane extends AbstractVanChartScrollPane implements AutoSele protected void initLayout() { - this.setLayout(new BorderLayout()); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); if (!paneList.isEmpty()) { - JPanel pane = new JPanel(new FlowLayout(FlowLayout.LEADING, 0, 0)); if (nameArray.length > 1) { - pane.add(tabPane); - tabPane.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); - this.add(pane, BorderLayout.NORTH); + this.add(cell(tabPane).getComponent(), BorderLayout.NORTH); } } - centerPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); this.add(centerPane, BorderLayout.CENTER); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/datasheet/VanChartDataSheetPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/datasheet/VanChartDataSheetPane.java index 045b6cd3fa..b795eff6c4 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/datasheet/VanChartDataSheetPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/datasheet/VanChartDataSheetPane.java @@ -1,13 +1,14 @@ package com.fr.van.chart.designer.style.datasheet; +import com.fine.swing.ui.layout.Column; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.chart.chartglyph.DataSheet; import com.fr.chartx.config.info.constant.ConfigType; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.style.FormatPane; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.PaneTitleConstants; import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPaneWithThemeStyle; @@ -18,8 +19,8 @@ import com.fr.plugin.chart.VanChartAttrHelper; import com.fr.plugin.chart.attr.plot.VanChartRectanglePlot; import com.fr.plugin.chart.base.VanChartConstants; import com.fr.plugin.chart.type.AxisType; +import com.fr.stable.collections.combination.Pair; import com.fr.van.chart.designer.AbstractVanChartScrollPane; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.border.VanChartBorderPane; import com.fr.van.chart.designer.component.border.VanChartBorderPaneWithPreStyle; import com.fr.van.chart.designer.component.format.FormatPaneWithNormalType; @@ -27,8 +28,6 @@ import com.fr.van.chart.designer.component.format.FormatPaneWithNormalType; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; /** * 样式-数据表 @@ -54,32 +53,22 @@ public class VanChartDataSheetPane extends AbstractVanChartScrollPane { private void initComponents() { isShowDataSheet = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Show_Data_Sheet")); dataSheetPane = createDataSheetPane(); - - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f}; - double[] rowSize = {p, p, p}; Component[][] components = creatComponent(dataSheetPane); - JPanel panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1}); this.setLayout(new BorderLayout()); this.add(panel, BorderLayout.CENTER); - isShowDataSheet.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - checkDataSheetPaneUse(); - } - }); + isShowDataSheet.addActionListener(e -> checkDataSheetPaneUse()); } } protected Component[][] creatComponent(JPanel dataSheetPane) { - Component[][] components = new Component[][]{ + return new Component[][]{ new Component[]{isShowDataSheet}, new Component[]{dataSheetPane} }; - return components; } // 检查数据表界面是否可用. @@ -91,19 +80,12 @@ public class VanChartDataSheetPane extends AbstractVanChartScrollPane { textAttrPane = createChartTextAttrPane(); formatPane = new FormatPaneWithNormalType(); borderPane = createBorderPanePane(); + Column column = FineLayoutBuilder.createVerticalExpandPaneLayout(0, + new Pair<>(Toolkit.i18nText("Fine-Design_Report_Base_Format"), formatPane), + new Pair<>(Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), textAttrPane), + new Pair<>(Toolkit.i18nText("Fine-Design_Chart_Border"), borderPane)); - double p = TableLayout.PREFERRED; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double d = TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH; - double[] columnSize = {d, e}; - double[] rowSize = {p, p, p}; - Component[][] components = new Component[][]{ - new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Base_Format"), formatPane), null}, - new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), textAttrPane), null}, - new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Border"), borderPane), null}, - }; - - return TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.asBorderLayoutWrapped(column); } protected VanChartBorderPane createBorderPanePane() { @@ -150,7 +132,6 @@ public class VanChartDataSheetPane extends AbstractVanChartScrollPane { //数据表埋点 ChartInfoCollector.getInstance().updateChartConfig(chart, ConfigType.DATA_TABLE, chart.getBuryingPointDataTableConfig()); -// plot.setDataSheet2PlotList(); } @Override diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPiePlotLabelPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPiePlotLabelPane.java index ac24b99510..09b719ab0a 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPiePlotLabelPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPiePlotLabelPane.java @@ -1,11 +1,11 @@ package com.fr.van.chart.designer.style.label; import com.fr.chart.chartattr.Plot; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.i18n.Toolkit; import com.fr.plugin.chart.attr.plot.VanChartPlot; import com.fr.plugin.chart.base.AttrLabel; import com.fr.plugin.chart.base.AttrLabelDetail; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -25,14 +25,14 @@ public class VanChartPiePlotLabelPane extends VanChartPlotLabelPane { } protected void createLabelPane() { - setLabelPane(new JPanel(new BorderLayout(0, 4))); + setLabelPane(new JPanel(new BorderLayout())); setLabelDetailPane(new VanChartPieValueLabelDetailPane(getPlot(), getParentPane(), isInCondition())); - JPanel valuePane = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Value_Label"), getLabelDetailPane()); + JPanel valuePane = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Value_Label"), getLabelDetailPane(), true); getLabelPane().add(valuePane, BorderLayout.NORTH); if (!isInCondition()) { pieCategoryLabelPane = new VanChartPieCategoryLabelDetailPane(getPlot(), getParentPane(), isInCondition()); - JPanel categoryPane = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Category_Label"), pieCategoryLabelPane); + JPanel categoryPane = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Category_Label"), pieCategoryLabelPane); getLabelPane().add(categoryPane, BorderLayout.CENTER); } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java index 0467fe3f5e..2cf72679f3 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java @@ -1,9 +1,12 @@ package com.fr.van.chart.designer.style.label; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; import com.fr.chart.chartattr.Plot; import com.fr.chartx.TwoTuple; import com.fr.design.beans.BasicBeanPane; import com.fr.design.dialog.BasicPane; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.ilable.UILabel; @@ -125,7 +128,7 @@ public class VanChartPlotLabelDetailPane extends BasicPane { double[] rowSize = getLabelPaneRowSize(plot, p); Component[][] components = getLabelPaneComponents(plot, p, columnSize); - return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1, 0}); } protected Component[][] getLabelPaneComponents(Plot plot, double p, double[] columnSize) { @@ -153,7 +156,7 @@ public class VanChartPlotLabelDetailPane extends BasicPane { protected JPanel createBorderAndBackgroundPane() { JPanel jPanel = new JPanel(); - jPanel.setLayout(new BorderLayout(0, 5)); + jPanel.setLayout(new BorderLayout(0, FineUIScale.scale(10))); jPanel.add(createLabelBorderPane(), BorderLayout.NORTH); jPanel.add(createLabelBackgroundPane(), BorderLayout.CENTER); return jPanel; @@ -161,7 +164,7 @@ public class VanChartPlotLabelDetailPane extends BasicPane { protected JPanel createLabelBorderPane() { borderPane = new VanChartBorderWithShapePane(); - borderPaneWithTitle = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Border"), borderPane); + borderPaneWithTitle = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Border"), borderPane, true); return borderPaneWithTitle; } @@ -179,7 +182,7 @@ public class VanChartPlotLabelDetailPane extends BasicPane { } }; - backgroundPaneWithTitle = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Background"), backgroundPane); + backgroundPaneWithTitle = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Background"), backgroundPane); return backgroundPaneWithTitle; } @@ -201,7 +204,7 @@ public class VanChartPlotLabelDetailPane extends BasicPane { } protected JPanel createTableLayoutPaneWithTitle(String title, JPanel panel) { - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(title, panel); + return new UIExpandablePane(title, panel); } protected TwoTuple getPositionNamesAndValues() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelPane.java index 4aed8c30a9..ab4340f361 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelPane.java @@ -1,11 +1,10 @@ package com.fr.van.chart.designer.style.label; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Plot; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.plugin.chart.attr.plot.VanChartPlot; import com.fr.plugin.chart.base.AttrLabel; import com.fr.van.chart.designer.PlotFactory; @@ -14,8 +13,6 @@ import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; public class VanChartPlotLabelPane extends BasicPane { private static final long serialVersionUID = -1701936672446232396L; @@ -39,7 +36,7 @@ public class VanChartPlotLabelPane extends BasicPane { this.plot = plot; this.inCondition = inCondition; isLabelShow = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Use_Label")); - labelPane = new JPanel(new BorderLayout(0, 4)); + labelPane = new JPanel(new BorderLayout()); createLabelPane(); addComponents(); } @@ -86,22 +83,12 @@ public class VanChartPlotLabelPane extends BasicPane { if (inCondition) { return labelPane; } - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f}; - double[] rowSize = {p, p}; Component[][] components = new Component[][]{ new Component[]{isLabelShow}, new Component[]{labelPane} }; - isLabelShow.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - checkBoxUse(); - } - }); - - JPanel panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); - return panel; + isLabelShow.addActionListener(e -> checkBoxUse()); + return FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1}); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java index 0a5f7b8feb..470e9ead02 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java @@ -1,5 +1,7 @@ package com.fr.van.chart.designer.style.series; +import com.fine.theme.utils.FineLayoutBuilder; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.chart.chartdata.model.DataProcessor; import com.fr.base.chart.chartdata.model.LargeDataModel; import com.fr.base.chart.chartdata.model.NormalDataModel; @@ -9,14 +11,12 @@ import com.fr.chart.base.AttrFillStyle; import com.fr.chart.base.GradientStyle; import com.fr.chart.chartattr.Plot; import com.fr.chart.chartglyph.ConditionAttr; -import com.fr.design.constants.LayoutConstants; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.frpane.UINumberDragPane; import com.fr.design.gui.frpane.UINumberDragPaneWithPercent; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.style.series.AbstractPlotSeriesPane; import com.fr.design.widget.FRWidgetFactory; @@ -42,15 +42,16 @@ import com.fr.van.chart.designer.component.border.VanChartBorderPane; import com.fr.van.chart.designer.other.VanChartInteractivePane; import com.fr.van.chart.pie.RadiusCardLayoutPane; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.JScrollPane; -import javax.swing.SwingConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; import java.awt.Component; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; + /** * 图表样式-系列抽象界面 */ @@ -104,13 +105,9 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP scrollPane.setViewportView(getContentInPlotType()); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); } - JPanel panel = new JPanel(new BorderLayout()); - JPanel colorPane = getColorPane(); - if (colorPane != null) { - panel.add(colorPane, BorderLayout.NORTH); - } - panel.add(getContentInPlotType(), BorderLayout.CENTER); - return panel; + return column( + cell(getColorPane()), cell(getContentInPlotType()) + ).getComponent(); } /** @@ -135,8 +132,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP panel.add(vanChartFillStylePane, BorderLayout.CENTER); } setColorPaneContent(panel); - JPanel colorPane = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Color"), panel); - panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 0)); + JPanel colorPane = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Color"), panel, true); return panel.getComponentCount() == 0 ? null : colorPane; } @@ -184,23 +180,19 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP //边框(默认没有圆角) protected JPanel createBorderPane() { borderPane = createDiffBorderPane(); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Border"), borderPane); + borderPane.setBorder(new ScaledEmptyBorder(0, 0, 10, 0)); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Border"), borderPane); } //半径界面 protected JPanel createRadiusPane(String title) { radiusPane = initRadiusPane(); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f, TableLayout4VanChartHelper.EDIT_AREA_WIDTH}; - double[] rowSize = {p}; UILabel label = FRWidgetFactory.createLineWrapLabel(title); - label.setVerticalAlignment(SwingConstants.TOP); Component[][] components = new Component[][]{ new Component[]{label, radiusPane}, }; - radiusPaneWithTitle = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, TableLayout4VanChartHelper.COMPONENT_INTERVAL, LayoutConstants.VGAP_LARGE); + radiusPaneWithTitle = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); return ((VanChartPlot) plot).isInCustom() ? null : radiusPaneWithTitle; } @@ -284,7 +276,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP //堆积和坐标轴设置(自定义柱形图等用到) protected JPanel createStackedAndAxisPane() { stackAndAxisEditPane = new VanChartStackedAndAxisListControlPane(); - stackAndAxisEditExpandablePane = TableLayout4VanChartHelper.createExpandablePaneWithTitle(stackAndAxisEditPane.getPaneTitle(), stackAndAxisEditPane); + stackAndAxisEditExpandablePane = new UIExpandablePane(stackAndAxisEditPane.getPaneTitle(), stackAndAxisEditPane); return stackAndAxisEditExpandablePane; } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/tooltip/VanChartPlotTooltipPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/tooltip/VanChartPlotTooltipPane.java index 5f76337d67..5c7e7dd2ed 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/tooltip/VanChartPlotTooltipPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/tooltip/VanChartPlotTooltipPane.java @@ -1,12 +1,13 @@ package com.fr.van.chart.designer.style.tooltip; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Plot; import com.fr.design.dialog.BasicPane; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.utils.gui.UIComponentUtils; import com.fr.design.widget.FRWidgetFactory; import com.fr.plugin.chart.base.AttrTooltip; @@ -20,8 +21,6 @@ import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; public class VanChartPlotTooltipPane extends BasicPane { private static final long serialVersionUID = 6087381131907589370L; @@ -47,28 +46,19 @@ public class VanChartPlotTooltipPane extends BasicPane { addComponents(plot); } - protected void addComponents(Plot plot) { + protected void addComponents(Plot plot) { isTooltipShow = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Use_Tooltip")); tooltipPane = createTooltipPane(plot); - - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f}; - double[] rowSize = {p,p}; Component[][] components = new Component[][]{ new Component[]{isTooltipShow}, new Component[]{tooltipPane} }; - JPanel panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1}); this.setLayout(new BorderLayout()); this.add(panel,BorderLayout.CENTER); - isTooltipShow.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - checkBoxUse(); - } - }); + isTooltipShow.addActionListener(e -> checkBoxUse()); } protected JPanel createTooltipPane(Plot plot) { @@ -77,25 +67,18 @@ public class VanChartPlotTooltipPane extends BasicPane { initTooltipContentPane(plot); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] rowSize = {p,p,p,p,p,p,p,p,p}; - Component[][] components = createComponents(plot); - return TableLayoutHelper.createTableLayoutPane(components,rowSize,columnSize); + return FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1}); } protected Component[][] createComponents(Plot plot) { - Component[][] components = new Component[][]{ + return new Component[][]{ new Component[]{tooltipContentPane,null}, - new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Border"),borderPane),null}, - new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Background"), backgroundPane),null}, + new Component[]{new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Border"),borderPane, true),null}, + new Component[]{new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Background"), backgroundPane, true),null}, new Component[]{createDisplayStrategy(plot),null}, }; - return components; } public VanChartStylePane getParentPane() { @@ -123,7 +106,7 @@ public class VanChartPlotTooltipPane extends BasicPane { components[2] = new Component[]{showAllSeries,null}; } JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components,rowSize,columnSize); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Display_Strategy"), panel); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Display_Strategy"), panel); } protected String getShowAllSeriesLabelText() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPieSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPieSeriesPane.java index 6253190da2..52f865356d 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPieSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPieSeriesPane.java @@ -2,6 +2,7 @@ package com.fr.van.chart.pie; import com.fr.chart.chartattr.Plot; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.frpane.UINumberDragPane; import com.fr.design.gui.frpane.UINumberDragPaneWithPercent; import com.fr.design.gui.ibutton.UIButtonGroup; @@ -69,7 +70,7 @@ public class VanChartPieSeriesPane extends VanChartAbstractPlotSeriesPane { JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), panel); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), panel, true); } public void populateBean(Plot plot) { diff --git a/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnPane.java b/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnPane.java index d3378b8956..15df8e7fa5 100644 --- a/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnPane.java +++ b/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnPane.java @@ -108,7 +108,6 @@ public class DSColumnPane extends BasicPane { contentPane.add(tabbedPane, BorderLayout.CENTER); - this.setPreferredSize(new Dimension(610, 400)); } @Override From b62c3399515767af7b81119dabca7234f2373845 Mon Sep 17 00:00:00 2001 From: "Richard.Fang" Date: Fri, 26 Jul 2024 18:50:45 +0800 Subject: [PATCH 183/302] =?UTF-8?q?REPORT-127436=E3=80=90NewUI=E3=80=91?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0?= =?UTF-8?q?-=E6=A8=A1=E6=9D=BF=E7=9B=B8=E5=85=B3/=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E9=85=8D=E7=BD=AE/=E6=95=B0=E6=8D=AE=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/utils/FineUIStyle.java | 1 + .../data/datapane/TreeTableDataDictPane.java | 99 +++--- .../connect/DatabaseConnectionPane.java | 12 +- .../data/datapane/connect/JNDIDefPane.java | 116 ++++--- .../data/datapane/preview/PreviewLabel.java | 7 +- .../tabledatapane/ClassTableDataPane.java | 58 ++-- .../tabledatapane/EmbeddedTableDataPane.java | 6 +- .../tabledatapane/FileTableDataPane.java | 298 +++++++++--------- .../FileTableDataSmallHeightPane.java | 9 +- .../tabledatapane/FileTableDataSmallPane.java | 9 +- .../tabledatapane/MultiTDTableDataPane.java | 82 +++-- .../AbstractTemplateServerSettingPane.java | 24 +- .../java/com/fr/design/dialog/BasicPane.java | 27 +- .../gui/frpane/EditingStringListPane.java | 96 +++--- .../fr/design/gui/ilable/FRExplainLabel.java | 5 +- .../fr/design/parameter/ParameterPane.java | 42 +-- .../com/fr/design/report/WatermarkPane.java | 165 +++++----- .../design/report/WatermarkSettingPane.java | 2 +- .../fr/design/report/fit/BaseFitAttrPane.java | 47 ++- .../design/report/fit/FormFitConfigPane.java | 25 +- .../design/report/fit/NewFitPreviewPane.java | 3 +- .../report/fit/ReportFitConfigPane.java | 51 ++- .../com/fr/design/utils/gui/GUICoreUtils.java | 11 +- .../com/fr/design/widget/IconDefinePane.java | 30 +- .../fine/theme/icon/toolbar/clearStash.svg | 3 + .../theme/icon/toolbar/clearStash_disable.svg | 3 + .../fine/theme/icon/toolbar/customButton.svg | 10 + .../icon/toolbar/customButton_disable.svg | 10 + .../fine/theme/icon/toolbar/dataVerify.svg | 3 + .../theme/icon/toolbar/dataVerify_disable.svg | 3 + .../com/fine/theme/icon/toolbar/email.svg | 3 + .../fine/theme/icon/toolbar/email_disable.svg | 3 + .../com/fine/theme/icon/toolbar/move_up.svg | 11 +- .../theme/icon/toolbar/move_up_disable.svg | 11 +- .../fine/theme/icon/toolbar/page_first.svg | 3 + .../theme/icon/toolbar/page_first_disable.svg | 3 + .../com/fine/theme/icon/toolbar/page_last.svg | 3 + .../theme/icon/toolbar/page_last_disbale.svg | 3 + .../com/fine/theme/icon/toolbar/page_navi.svg | 3 + .../theme/icon/toolbar/page_navi_disable.svg | 3 + .../com/fine/theme/icon/toolbar/page_next.svg | 3 + .../theme/icon/toolbar/page_next_disable.svg | 3 + .../fine/theme/icon/toolbar/page_previous.svg | 3 + .../icon/toolbar/page_previous_disable.svg | 3 + .../fine/theme/icon/toolbar/printApplet.svg | 3 + .../icon/toolbar/printApplet_disable.svg | 3 + .../com/fine/theme/icon/toolbar/printPdf.svg | 6 + .../theme/icon/toolbar/printPdf_disable.svg | 6 + .../fine/theme/icon/toolbar/printPreview.svg | 10 + .../icon/toolbar/printPreview_disable.svg | 10 + .../fine/theme/icon/toolbar/printerOffset.svg | 10 + .../icon/toolbar/printerOffset_disable.svg | 10 + .../com/fine/theme/icon/toolbar/scale.svg | 3 + .../fine/theme/icon/toolbar/scale_disable.svg | 3 + .../fine/theme/light/ui/fine_light.icon.json | 14 + .../light/ui/laf/FineLightLaf.properties | 4 + .../fr/design/i18n/dimension_zh.properties | 4 +- .../design/javascript/ListenerEditPane.java | 26 +- .../com/fr/design/report/ExcelExportPane.java | 94 +++--- .../fr/design/report/ExportUniversalPane.java | 23 +- .../com/fr/design/report/ImageExportPane.java | 76 ++--- .../com/fr/design/report/PDFExportPane.java | 30 +- .../com/fr/design/report/PageSetupPane.java | 278 +++++++--------- .../design/report/ReportExportAttrPane.java | 29 +- .../com/fr/design/report/WordExportPane.java | 81 ++--- .../report/mobile/AppFitBrowserPane.java | 22 +- .../report/mobile/AppFitPreviewPane.java | 20 +- .../report/mobile/MobileOthersPane.java | 17 +- .../report/mobile/MobileRadioGroupPane.java | 36 +-- .../report/mobile/MobileToolBarPane.java | 21 +- .../report/mobile/ReportMobileAttrPane.java | 31 +- .../ReportMobileTemplateSettingsPane.java | 53 ++-- .../com/fr/design/webattr/CommonPane.java | 50 ++- .../fr/design/webattr/DragToolBarPane.java | 64 ++-- .../EditReportServerParameterPane.java | 30 +- .../com/fr/design/webattr/EditToolBar.java | 252 ++++++++------- .../fr/design/webattr/ErrorTemplatePane.java | 58 ++-- .../java/com/fr/design/webattr/EventPane.java | 27 +- .../fr/design/webattr/PageToolBarPane.java | 86 +++-- .../fr/design/webattr/PageWebSettingPane.java | 68 ++-- .../webattr/ReportServerPrinterPane.java | 4 +- .../fr/design/webattr/ReportWebAttrPane.java | 34 +- .../webattr/ReportWebWidgetConstants.java | 115 ++++--- .../fr/design/webattr/ServerFitAttrPane.java | 10 +- .../fr/design/webattr/ServerPrinterPane.java | 90 +++--- .../com/fr/design/webattr/SettingToolBar.java | 31 +- .../com/fr/design/webattr/ToolBarButton.java | 10 +- .../fr/design/webattr/ToolBarDragPane.java | 148 +++++---- .../com/fr/design/webattr/ToolBarPane.java | 3 +- .../fr/design/webattr/ViewToolBarPane.java | 70 ++-- .../fr/design/webattr/ViewWebSettingPane.java | 19 +- .../com/fr/design/webattr/WebCssPane.java | 48 +-- .../java/com/fr/design/webattr/WebJsPane.java | 77 ++--- .../com/fr/design/webattr/WebSettingPane.java | 94 +++--- .../fr/design/webattr/WriteToolBarPane.java | 78 +++-- .../design/webattr/WriteWebSettingPane.java | 58 ++-- .../AbstractNativePrintSettingPane.java | 211 ++++++------- .../GlobalNativePrintSettingPane.java | 76 ++--- .../NoClientPrintSettingPane.java | 75 ++--- .../printsettings/PageMarginSettingPane.java | 43 +-- .../printsettings/PrintSettingPane.java | 27 +- .../ReportNativePrintSettingPane.java | 5 +- 102 files changed, 2218 insertions(+), 1981 deletions(-) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/clearStash.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/clearStash_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/customButton.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/customButton_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/dataVerify.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/dataVerify_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/email.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/email_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_first.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_first_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_last.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_last_disbale.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_navi.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_navi_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_next.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_next_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_previous.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_previous_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/printApplet.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/printApplet_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPdf.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPdf_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPreview.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPreview_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/printerOffset.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/printerOffset_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/scale.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/scale_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java index 4cf5637d94..155ffa7731 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java @@ -29,6 +29,7 @@ public interface FineUIStyle { String BUTTON_TAB_ACTION = "tabAction"; String LABEL_BOLD = "boldLabel"; String LABEL_TIP = "tipLabel"; + String LABEL_WARNING_TIP = "warningTipLabel"; String PLAIN_BUTTON = "plainButton"; String TOGGLE_GROUP = "inToggleGroup"; String COMPACT_BUTTON = "compactButton"; diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataDictPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataDictPane.java index 175ddbfda3..910a4c00c2 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataDictPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataDictPane.java @@ -1,6 +1,8 @@ package com.fr.design.data.datapane; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.data.impl.RecursionTableData; +import com.fr.design.constants.LayoutConstants; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.preview.PreviewLabel; import com.fr.design.data.datapane.preview.PreviewLabel.Previewable; @@ -18,19 +20,21 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.stable.StringUtils; -import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JPanel; -import javax.swing.SwingConstants; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + public class TreeTableDataDictPane extends BasicPane implements Previewable { private UILabel selectTableDataLabel; @@ -54,23 +58,28 @@ public class TreeTableDataDictPane extends BasicPane implements Previewable { } public TreeTableDataDictPane(String treeName) { - this.setLayout(new BorderLayout(5, 30)); - this.setBorder(BorderFactory.createEmptyBorder(20, 20, 0, 0)); - selectTableDataLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_TableData_Select_One") + " :"); + this.setLayout(new BorderLayout()); + this.setBorder(new ScaledEmptyBorder(10,10,10,10)); + //请选择一个数据集 + selectTableDataLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_TableData_Select_One") ); setTableDataNameComboBox(treeName); - tableDataNameComboBox.setPreferredSize(new Dimension(180, 20)); - JPanel tableFlowPane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(); - tableFlowPane.add(selectTableDataLabel); - tableFlowPane.add(tableDataNameComboBox); tableDataNameComboBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { tdChange(true); } }); - tableFlowPane.add(new PreviewLabel(this)); - this.add(tableFlowPane, BorderLayout.NORTH); + JPanel tableFlowPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + tableFlowPane.add(row(LayoutConstants.HGAP_LARGE, + cell(selectTableDataLabel).weight(0.12), + row(LayoutConstants.HGAP_LARGE, + cell(tableDataNameComboBox).weight(0.9), + cell(new PreviewLabel(this)).weight(0.1) + ).weight(0.3), + flex(0.58) + ).getComponent()); + + //中心面板 JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - this.add(centerPane, BorderLayout.CENTER); parentMarkRadio = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Build_Tree_Accord_Parent_Marked_Filed"), true); lengthMarkRadio = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Build_Tree_Accord_Marked_Filed_Length")); parentMarkRadio.addItemListener(new ItemListener() { @@ -95,45 +104,44 @@ public class TreeTableDataDictPane extends BasicPane implements Previewable { markButtonGroup.add(parentMarkRadio); markButtonGroup.add(lengthMarkRadio); - originFieldDependsOnParentLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Original_Marked_Filed") + " :", SwingConstants.RIGHT); - parentFieldLabel = new UILabel(" " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parent_Marked_Field") + " :", SwingConstants.RIGHT); - treeDataFieldLabel1 = new UILabel(" " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tree_Data_Field") + " :", SwingConstants.RIGHT); - originFieldDependsOnLengthLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Original_Marked_Filed") + " :", SwingConstants.RIGHT); - treeDataFieldLabel2 = new UILabel(" " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tree_Data_Field") + " :", SwingConstants.RIGHT); + //原始标记字段 + originFieldDependsOnParentLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Original_Marked_Filed")); + //父标记字段 + parentFieldLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parent_Marked_Field")); + treeDataFieldLabel1 = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tree_Data_Field")); + originFieldDependsOnLengthLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Original_Marked_Filed")); + treeDataFieldLabel2 = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tree_Data_Field")); -// originFieldDependsOnParentPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[] {new OldColumnIndexEditor(com.fr.design.i18n.Toolkit.i18nText("Columns"))}); -// parentFieldPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[] {new OldColumnIndexEditor(com.fr.design.i18n.Toolkit.i18nText("Columns"))}); -// originFieldDependsOnLengthPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[] {new OldColumnIndexEditor(com.fr.design.i18n.Toolkit.i18nText("Columns"))}); originFieldDependsOnParentPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()}); parentFieldPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()}); originFieldDependsOnLengthPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()}); - makeParentEnable(); - JPanel p1 = createCenterFlowZeroGapBorderPane(originFieldDependsOnParentLabel, originFieldDependsOnParentPane); - JPanel p2 = createCenterFlowZeroGapBorderPane(parentFieldLabel, parentFieldPane); - JPanel border1 = new JPanel(); - border1.setLayout(new BorderLayout(0, 10)); - border1.add(p1, BorderLayout.NORTH); - border1.add(p2, BorderLayout.CENTER); - JPanel p4 = createCenterFlowZeroGapBorderPane(originFieldDependsOnLengthLabel, originFieldDependsOnLengthPane); - JPanel border2 = new JPanel(); - border2.setLayout(new BorderLayout(0, 20)); - border2.add(p4, BorderLayout.NORTH); + //树数据集面板 + centerPane.add(column(10, + cell(parentMarkRadio), + row(LayoutConstants.HGAP_LARGE, + cell(originFieldDependsOnParentLabel).weight(0.12), + cell(originFieldDependsOnParentPane).weight(0.3), + flex(0.58) + ), + row(LayoutConstants.HGAP_LARGE, + cell(parentFieldLabel).weight(0.12), + cell(parentFieldPane).weight(0.3), + flex(0.58) + ), + cell(lengthMarkRadio), + row(LayoutConstants.HGAP_LARGE, + cell(originFieldDependsOnLengthLabel).weight(0.12), + cell(originFieldDependsOnLengthPane).weight(0.3), + flex(0.58) + ) + ).getComponent()); - JPanel xx = FRGUIPaneFactory.createBorderLayout_S_Pane(); - xx.add(parentMarkRadio, BorderLayout.NORTH); - xx.add(border1, BorderLayout.CENTER); - JPanel xxx = FRGUIPaneFactory.createBorderLayout_S_Pane(); - xxx.add(lengthMarkRadio, BorderLayout.NORTH); - xxx.add(border2, BorderLayout.CENTER); - JPanel buildTreePanel = new JPanel(new BorderLayout(5, 30)); - buildTreePanel.add(xx, BorderLayout.NORTH); - buildTreePanel.add(xxx, BorderLayout.CENTER); - centerPane.add(buildTreePanel, BorderLayout.NORTH); - JPanel previewPanel = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + //预览 + JPanel previewPanel = new JPanel(new BorderLayout()); UIButton treeDataPreviewButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview")); - previewPanel.add(treeDataPreviewButton); + previewPanel.add(treeDataPreviewButton, BorderLayout.WEST); treeDataPreviewButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -163,7 +171,8 @@ public class TreeTableDataDictPane extends BasicPane implements Previewable { PreviewTablePane.previewTableData(rtd); } }); - centerPane.add(previewPanel, BorderLayout.CENTER); + + this.add(column(LayoutConstants.VERTICAL_GAP, cell(tableFlowPane),cell(centerPane), cell(previewPanel)).getComponent()); } protected void setTableDataNameComboBox(String treeName) { diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java index 821c3fd482..370ce5219e 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java @@ -69,8 +69,10 @@ import java.net.URI; import java.util.concurrent.ExecutionException; import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.fix; import static com.fine.swing.ui.layout.Layouts.row; import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; /** * Database Connection pane. @@ -280,9 +282,13 @@ public abstract class DatabaseConnectionPane jndiMap = new HashMap(); @@ -66,57 +68,51 @@ public class JNDIDefPane extends JPanel { private JDialog otherAttrDialog; public JNDIDefPane() { - this.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); - this.setBorder(UITitledBorder.createBorderWithTitle("JNDI" + ":")); - JPanel innerthis = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - this.add(innerthis); - // NorthPane - JPanel nContentPane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); - innerthis.add(nContentPane); - nContentPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_JNDI_Name") + ":")); - jndiNameTextField = new UITextField(20); - nContentPane.add(jndiNameTextField, BorderLayout.NORTH); - - // CenterPane - JPanel outcenterPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Context")); - innerthis.add(outcenterPane); - JPanel centerPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - outcenterPane.add(centerPane); + this.setLayout(new BorderLayout()); + jndiNameTextField = new UITextField(20); JNDIFactoryComboBox = new UIComboBox(new String[] { "", "weblogic.jndi.WLInitialContextFactory", "com.ibm.websphere.naming.WsnInitialContextFactory", "org.jboss.naming.HttpNamingContextFactory", "org.jnp.interfaces.NamingContextFactory", "com.caucho.burlap.BurlapContextFactory", }); JNDIFactoryComboBox.setEditable(true); - JNDIFactoryComboBox.addActionListener(jndiListener); - JNDIFactoryComboBox.setPreferredSize(new Dimension(30, JNDIFactoryComboBox.getPreferredSize().height + 2)); - - // ContextPane - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] rowSize = { p, p, p, p }; - double[] columnSize = { f, f }; - Component[][] comps = { { new UILabel("INITIAL_CONTEXT_FACTORY:", SwingConstants.RIGHT), JNDIFactoryComboBox }, - { new UILabel("PROVIDER_URL:", SwingConstants.RIGHT), PROVIDER_URL_TF }, { new UILabel("SECURITY_PRINCIPAL:", SwingConstants.RIGHT), SECURITY_PRINCIPAL_TF }, - { new UILabel("SECURITY_CREDENTIALS:", SwingConstants.RIGHT), SECURITY_CREDENTIALS_TF } }; - centerPane.add(TableLayoutHelper.createCommonTableLayoutPane(comps, rowSize, columnSize, 2)); - - // ActionLabel - JPanel actionPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - centerPane.add(actionPane); - actionPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 4, 6)); - + JNDIFactoryComboBox.setPreferredSize(FineUIScale.scale(new Dimension(30, JNDIFactoryComboBox.getPreferredSize().height + 2))); + + // 上下文 + JPanel contextPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + contextPane.add(column(LayoutConstants.VERTICAL_GAP, + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("INITIAL_CONTEXT_FACTORY")).weight(0.35), cell(JNDIFactoryComboBox).weight(0.65)), + row(LayoutConstants.HORIZONTAL_GAP,cell(new UILabel("PROVIDER_URL")).weight(0.35), cell(PROVIDER_URL_TF).weight(0.65)), + row(LayoutConstants.HORIZONTAL_GAP,cell(new UILabel("SECURITY_PRINCIPAL")).weight(0.35), cell(SECURITY_PRINCIPAL_TF).weight(0.65)), + row(LayoutConstants.HORIZONTAL_GAP,cell(new UILabel("SECURITY_CREDENTIALS")).weight(0.35), cell(SECURITY_CREDENTIALS_TF).weight(0.65)) + ).getComponent()); + + //其他属性 + JPanel otherAttributePanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); ActionLabel actionLabel = new ActionLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Other_Attributes")); - actionPane.add(actionLabel, BorderLayout.EAST); actionLabel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { + //其他属性弹窗 JDialog wDialog = createJDialog(); wDialog.setVisible(true); } }); + otherAttributePanel.add(actionLabel, BorderLayout.EAST); + //注意描述 + JPanel jndiDesPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + jndiDesPanel.add(new JScrollPane(new FRExplainLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_JNDI_DES"))), BorderLayout.WEST); + //JNDI面板 + JPanel centerPanel = column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_JNDI_Name"))).weight(0.15), cell(jndiNameTextField).weight(0.85)), + row(cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Context"))).weight(0.15), cell(contextPane).weight(0.85)), + cell(otherAttributePanel), + cell(jndiDesPanel) + ).getComponent(); + this.add(wrapComponentWithTitle(centerPanel,"JNDI")); + } - // South Description - UILabel explainLabe11l = new FRExplainLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_JNDI_DES")); - innerthis.add(new JScrollPane(explainLabe11l)); + private JPanel getTopAlignLabelPane(String labelText) { + return column(LayoutConstants.VERTICAL_GAP, cell(new UILabel(labelText))) + .with(it -> it.setBorder(new ScaledEmptyBorder(2,0,0,0))).getComponent(); } public void populate(JNDIDatabaseConnection jndiDatabase) { @@ -216,21 +212,23 @@ public class JNDIDefPane extends JPanel { class OtherAttrPane extends BasicPane { public OtherAttrPane() { // JPanel northFlowPane - JPanel northFlowPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - this.add(northFlowPane, BorderLayout.NORTH); - + JPanel northFlowPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + northFlowPane.setBorder(new ScaledEmptyBorder(10,10,10,10)); // ContextPane - double f = TableLayout.FILL; - double[] rowSize = { f, f, f, f, f, f, f, f, f, f, f }; - double[] columnSize = { f, f }; - Component[][] comps = { { new UILabel("OBJECT_FACTORIES:", SwingConstants.RIGHT), OBJECT_FACTORIES_TF }, - { new UILabel("STATE_FACTORIES:", SwingConstants.RIGHT), STATE_FACTORIES_TF }, { new UILabel("URL_PKG_PREFIXES:", SwingConstants.RIGHT), URL_PKG_PREFIXES_TF }, - { new UILabel("DNS_URL:", SwingConstants.RIGHT), DNS_URL_TF }, { new UILabel("AUTHORITATIVE:", SwingConstants.RIGHT), AUTHORITATIVE_TF }, - { new UILabel("BATCHSIZE:", SwingConstants.RIGHT), BATCHSIZE_TF }, { new UILabel("REFERRAL:", SwingConstants.RIGHT), REFERRAL_TF }, - { new UILabel("SECURITY_PROTOCOL:", SwingConstants.RIGHT), SECURITY_PROTOCOL_TF }, - { new UILabel("SECURITY_AUTHENTICATION:", SwingConstants.RIGHT), SECURITY_AUTHENTICATION_TF }, { new UILabel("LANGUAGE:", SwingConstants.RIGHT), LANGUAGE_TF }, - { new UILabel("APPLET:", SwingConstants.RIGHT), APPLET_TF } }; - northFlowPane.add(TableLayoutHelper.createCommonTableLayoutPane(comps, rowSize, columnSize, 2)); + northFlowPane.add(column(LayoutConstants.VERTICAL_GAP, + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("OBJECT_FACTORIES")).weight(0.35), cell(OBJECT_FACTORIES_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("STATE_FACTORIES")).weight(0.35), cell(STATE_FACTORIES_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("URL_PKG_PREFIXES")).weight(0.35), cell(URL_PKG_PREFIXES_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("DNS_URL")).weight(0.35), cell(DNS_URL_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("AUTHORITATIVE")).weight(0.35), cell(AUTHORITATIVE_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("BATCHSIZE")).weight(0.35), cell(BATCHSIZE_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("REFERRAL")).weight(0.35), cell(REFERRAL_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("SECURITY_PROTOCOL")).weight(0.35), cell(SECURITY_PROTOCOL_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("SECURITY_AUTHENTICATION")).weight(0.35), cell(SECURITY_AUTHENTICATION_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("LANGUAGE")).weight(0.35), cell(LANGUAGE_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("APPLET")).weight(0.35), cell(APPLET_TF)).weight(0.65) + ).getComponent()); + this.add(northFlowPane, BorderLayout.NORTH); } @Override diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewLabel.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewLabel.java index 4fa695fd21..48df699015 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewLabel.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewLabel.java @@ -5,7 +5,8 @@ import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIScale; import com.fr.design.gui.ibutton.UIButton; @@ -16,7 +17,7 @@ public class PreviewLabel extends UIButton { Previewable previewable; public PreviewLabel(Previewable previewable) { - super(BaseUtils.readIcon("/com/fr/design/images/m_file/preview.png")); + super(new LazyIcon("preview")); this.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview")); this.setCursor(new Cursor(Cursor.HAND_CURSOR)); this.previewable = previewable; @@ -27,7 +28,7 @@ public class PreviewLabel extends UIButton { PreviewLabel.this.previewable.preview(); } }); - this.setPreferredSize(new Dimension(24, 20)); + this.setPreferredSize(FineUIScale.scale(new Dimension(24, 24))); } public static interface Previewable { diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java index e2f7efc70b..04bda940c0 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java @@ -1,7 +1,9 @@ package com.fr.design.data.tabledata.tabledatapane; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.Parameter; import com.fr.data.impl.ClassTableData; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.ibutton.UIButton; @@ -11,8 +13,6 @@ import com.fr.design.gui.itableeditorpane.UITableEditAction; import com.fr.design.gui.itableeditorpane.UITableEditorPane; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.general.IOUtils; import com.fr.script.Calculator; import com.fr.stable.ParameterProvider; @@ -23,35 +23,29 @@ import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingUtilities; import java.awt.BorderLayout; -import java.awt.Component; import java.awt.Dialog; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + public class ClassTableDataPane extends AbstractTableDataPane { private UITextField classNameTextField; private UITableEditorPane editorPane; public ClassTableDataPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); - - // TableLayout - double p = TableLayout.PREFERRED; - - double[] rowSize = {p, p, p, p}; - double[] columnSize = {p, p}; - //Reportlet. - JPanel reportletNamePane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(); - classNameTextField = new UITextField(36); - reportletNamePane.add(classNameTextField); + this.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); + //类名 + classNameTextField = new UITextField(); UIButton browserButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Select")); - browserButton.setPreferredSize(new Dimension( - browserButton.getPreferredSize().width, - classNameTextField.getPreferredSize().height)); - reportletNamePane.add(browserButton); + browserButton.setPreferredSize(new Dimension(browserButton.getPreferredSize().width, classNameTextField.getPreferredSize().height)); browserButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { final ClassNameSelectPane bPane = new ClassNameSelectPane(); @@ -69,15 +63,26 @@ public class ClassTableDataPane extends AbstractTableDataPane { } }); - Component[][] components = { - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DS_Class_Name") + ":"), reportletNamePane}, - {null, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Function_The_Class_Must_Implement_The_Interface") + "\"com.fr.data.Tabledata\"")}, - {null, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Example") + ":\"com.fr.data.impl.ArrayTableData\"")}, - {null,new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Class_Location_Description", StableUtils.pathJoin(ProjectConstants.WEBINF_NAME, ProjectConstants.CLASSES_NAME)))} - }; - JPanel northPane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + JPanel tipPanel = column(LayoutConstants.VERTICAL_GAP, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Function_The_Class_Must_Implement_The_Interface") + "\"com.fr.data.Tabledata\"")), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Example") + ":\"com.fr.data.impl.ArrayTableData\"")), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Class_Location_Description", StableUtils.pathJoin(ProjectConstants.WEBINF_NAME, ProjectConstants.CLASSES_NAME)))) + ).getComponent(); + + JPanel northPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + northPane.add(column(LayoutConstants.VERTICAL_GAP, + row(LayoutConstants.HGAP_LARGE, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DS_Class_Name"))).weight(0.12), + row(LayoutConstants.HGAP_LARGE, + cell(classNameTextField).weight(0.85), + cell(browserButton).weight(0.15) + ).weight(0.58), + flex(0.3) + ), + row(LayoutConstants.HGAP_LARGE, flex(0.12), cell(tipPanel).weight(0.88)) + ).with(it -> it.setBorder(new ScaledEmptyBorder(0, 0,10, 0))).getComponent()); this.add(northPane, BorderLayout.NORTH); - this.add(initSouthPanel(), BorderLayout.SOUTH); + this.add(initSouthPanel(), BorderLayout.CENTER); } private JPanel initSouthPanel() { JPanel jpanel = new JPanel(); @@ -95,7 +100,6 @@ public class ClassTableDataPane extends AbstractTableDataPane { }, " " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_TableData_Default_Para")); jpanel.add(editorPane, BorderLayout.CENTER); - return jpanel; } diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java index 731816243e..90de902a9a 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java @@ -1,5 +1,6 @@ package com.fr.design.data.tabledata.tabledatapane; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.data.impl.EmbeddedTableData; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; @@ -52,7 +53,8 @@ public class EmbeddedTableDataPane extends AbstractTableDataPane { private static final int TEXT = 0; private static final int EXCEL = 1; @@ -104,8 +108,6 @@ public class FileTableDataPane extends AbstractTableDataPane { private UIButton testConnection; private XMLNodeTree xmlNodeTree; private Parameter[] params; - private JPanel filePath; - private XMLNodeTreePane nodeTreePane; private UICheckBox needColumnNameCheckBox;// 第一行是否作为标题 private UIRadioButton tableDismemberRadioButton;// 制表符 @@ -116,41 +118,32 @@ public class FileTableDataPane extends AbstractTableDataPane { private UICheckBox ignoreOneMoreDelimiterCheckBox;// 连续分隔符是否作为单一 private UIComboBox charsetComboBox; private UILabel encodeLabel; - private UILabel dismenberLabel; private UILabel keyPointLaber; private ExpandMutableTreeNode selectedNode = null; private ExpandMutableTreeNode finalSelectedNode = null; - private ArrayList xmlColumnsList = new ArrayList(); - private static final int SETPANELWIDTH = 337; - private static final int WIDTH = 317; - private static final int HEIGHT = 453; - private static final int GAP = 23; - + private static final double LOCAL_WIDTH_RATIO = 0.62; + private static final double URL_WIDTH_RATIO = 0.56; public FileTableDataPane() { - this(SETPANELWIDTH, WIDTH, HEIGHT, GAP); + this(LOCAL_WIDTH_RATIO, URL_WIDTH_RATIO); } - public FileTableDataPane(int setPanelWidth, int width, int height, int gap) { - this.setLayout(new BorderLayout(gap, 0)); - JPanel northPanel = new JPanel(new BorderLayout()); - JPanel type = new JPanel(); - type.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_File_Type") + ":")); + public FileTableDataPane(double localWidthRatio, double urlWidthRatio) { + this.setLayout(new BorderLayout()); + this.setBorder(new ScaledEmptyBorder(10,10,10,10)); + //文件类型 + JPanel fileType = new JPanel(new BorderLayout()); String[] item = {"TXT", "Excel", "XML"}; fileTypeComboBox = new UIComboBox(item); - fileTypeComboBox.setPreferredSize(new Dimension(100, 20)); - type.add(fileTypeComboBox); - northPanel.add(type, BorderLayout.WEST); + fileType.add(row(LayoutConstants.HGAP_LARGE, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_File_Type"))).weight(0.12), + cell(fileTypeComboBox).weight(0.18), + flex(0.7) + ).getComponent()); - // 最上面的pane,文件选择 - JPanel centerPanel = new JPanel(); - centerPanel.setPreferredSize(new Dimension(522, 200)); - centerPanel.setBorder(BorderFactory.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_File_Address"))); - addToCenterPanel(centerPanel); - - // 下面的pane,参数面板 + //参数面板 ParameterTableModel model = new ParameterTableModel() { @Override public UITableEditAction[] createAction() { @@ -158,65 +151,75 @@ public class FileTableDataPane extends AbstractTableDataPane { } }; editorPane = new UITableEditorPane(model); - editorPane.setPreferredSize(new Dimension(355, 130)); - centerPanel.add(editorPane, BorderLayout.SOUTH); - - JPanel southPanel = new JPanel(new BorderLayout()); - JPanel setPanel = new JPanel(); - southPanel.add(setPanel, BorderLayout.CENTER); - setPanel.setPreferredSize(new Dimension(setPanelWidth, 460)); - setPanel.setBorder(BorderFactory.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set"))); - JPanel controlPane = textSetPanel(width, height); - setPanel.add(controlPane, BorderLayout.NORTH); - fileTypeComboBox.addActionListener(getFileTypeListener(setPanel, width, height)); - - this.add(northPanel, BorderLayout.NORTH); - this.add(centerPanel, BorderLayout.CENTER); - this.add(southPanel, BorderLayout.EAST); + editorPane.setBorder(new ScaledEmptyBorder(0,0,0,10)); + editorPane.setPreferredSize(FineUIScale.scale(new Dimension(-1, 150))); + + //左侧文件地址pane + JPanel leftPanel = new JPanel(new BorderLayout()); + leftPanel.add(column( + LayoutConstants.VERTICAL_GAP, + cell(getCenterPanel(localWidthRatio, urlWidthRatio)), + cell(editorPane) + ).getComponent()); + //右侧设定pane + JPanel rightPanel = new JPanel(new BorderLayout()); + rightPanel.setBorder(new ScaledEmptyBorder(0,0,0,10)); + rightPanel.add(getTextSetPanel()); + fileTypeComboBox.addActionListener(getFileTypeListener(rightPanel)); + + //文件数据集整体布局,服务器数据集/模板数据集下的文件数据集,创建文件数据集,三处面板通用布局 + this.add(column(LayoutConstants.VERTICAL_GAP, + cell(fileType), + row(20, + cell(wrapComponentWithTitle(leftPanel, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_File_Address"))).weight(0.5), + cell(wrapComponentWithTitle(rightPanel, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set"))).weight(0.5) + ) + ).getComponent()); } - private void addToCenterPanel(JPanel centerPanel) { - localFileRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Local_File") + ":", true); - urlFileRadioButton = new UIRadioButton("URL:", false); + /** + * 文件地址上方的面板-文件选择 + * @return + */ + private JPanel getCenterPanel(double localWidthRatio, double urlWidthRatio) { + // 本地文件/URL + localFileRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Local_File"), true); + urlFileRadioButton = new UIRadioButton("URL", false); ButtonGroup bg = new ButtonGroup(); bg.add(localFileRadioButton); bg.add(urlFileRadioButton); localFileRadioButton.addActionListener(radioActionListener); urlFileRadioButton.addActionListener(radioActionListener); - urlFileRadioButton.setForeground(new Color(143, 142, 139)); - localFileRadioButton.setForeground(Color.black); localText = new UITextField(); - localText.setPreferredSize(new Dimension(195, 20)); urlText = new UITextField(); - urlText.setPreferredSize(new Dimension(195, 20)); urlText.setEditable(false); + // 选择按钮 chooseFile = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Selection")); chooseFile.addActionListener(chooseFileListener); - + // 测试连接按钮 testConnection = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Test_Connection")); testConnection.setEnabled(false); - testConnection.addActionListener(testConnectionListener);// 测试连接按钮 - - JPanel textPanel = new JPanel(new GridLayout(2, 1, 15, 15)); - JPanel textFieldPanel = new JPanel(new GridLayout(2, 1, 15, 15)); - JPanel buttonPanel = new JPanel(new GridLayout(2, 1, 15, 15)); - textPanel.add(localFileRadioButton); - textPanel.add(urlFileRadioButton); - textFieldPanel.add(localText); - textFieldPanel.add(urlText); - buttonPanel.add(chooseFile); - buttonPanel.add(testConnection); - filePath = FRGUIPaneFactory.createBorderLayout_S_Pane(); - filePath.add(textPanel, BorderLayout.WEST); - filePath.add(textFieldPanel, BorderLayout.CENTER); - filePath.add(buttonPanel, BorderLayout.EAST); - centerPanel.add(filePath, BorderLayout.NORTH); - - // 中间的pane,提示信息 + testConnection.addActionListener(testConnectionListener); + // 提示信息 String tipContent = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Type_Parameter") + "reportlets/excel/FineReport${abc}." + "txt" + "
" + "http://192.168.100.120:8080/XXServer/Report/excel${abc}.jsp
" + "  "; tips = new UILabel(tipContent); - centerPanel.add(tips, BorderLayout.CENTER); + return column( + LayoutConstants.VERTICAL_GAP, + row( + LayoutConstants.HGAP_LARGE, + cell(localFileRadioButton).weight(0.25), + cell(localText).weight(localWidthRatio), + cell(chooseFile).weight(0.75 - localWidthRatio) + ), + row( + LayoutConstants.HGAP_LARGE, + cell(urlFileRadioButton).weight(0.25), + cell(urlText).weight(urlWidthRatio), + cell(testConnection).weight(0.75 - urlWidthRatio) + ), + cell(tips).weight(1) + ).with(it -> it.setBorder(new ScaledEmptyBorder(0,0,0,10))).getComponent(); } private ActionListener testConnectionListener = new ActionListener() { @@ -249,7 +252,7 @@ public class FileTableDataPane extends AbstractTableDataPane { } }; - private void previewPanel(JPanel jPanel) { + private JPanel getPreviewPanel() { JPanel previewPanel = new JPanel(new BorderLayout()); UIButton preview = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview")); preview.addActionListener(new ActionListener() { @@ -259,56 +262,33 @@ public class FileTableDataPane extends AbstractTableDataPane { } }); previewPanel.add(preview, BorderLayout.EAST); - jPanel.add(previewPanel, BorderLayout.SOUTH); + return previewPanel; } - private JPanel xmlSetPanel(int width, int height) { + /** + * XML设定Pane + * @return + */ + private JPanel getXmlSetPanel() { // xml设置pane - JPanel controlPane = new JPanel(); - JPanel northPane = new JPanel(new BorderLayout(8, 8)); - JPanel northTopPane = new JPanel(new BorderLayout(8, 8)); - JPanel southPane = new JPanel(new BorderLayout(8, 8)); - JPanel southTopPane = new JPanel(new BorderLayout(8, 8)); - controlPane.setLayout(new BorderLayout(8, 8)); - controlPane.setPreferredSize(new Dimension(width, height)); - JPanel comboboxPanel = new JPanel(new BorderLayout(8, 8)); - encodeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Encoding_Type") + ":"); + encodeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Encoding_Type")); encodingComboBox = new UIComboBox(EncodeConstants.ALL_ENCODING_ARRAY); encodingComboBox.setSelectedIndex(4); - encodingComboBox.setPreferredSize(new Dimension(90, 20)); - - JPanel treeContainerPane = new JPanel(); - treeContainerPane.setLayout(new BorderLayout(8, 8)); - nodeTreePane = new XMLNodeTreePane(); - treeContainerPane.add(nodeTreePane, BorderLayout.CENTER); - - - comboboxPanel.add(encodeLabel, BorderLayout.WEST); - comboboxPanel.add(encodingComboBox, BorderLayout.CENTER); - - northPane.add(comboboxPanel, BorderLayout.EAST); - northTopPane.add(northPane, BorderLayout.WEST); - southTopPane.add(southPane, BorderLayout.WEST); - southTopPane.add(treeContainerPane, BorderLayout.CENTER); - controlPane.add(northTopPane, BorderLayout.NORTH); - controlPane.add(southTopPane, BorderLayout.CENTER); - previewPanel(controlPane); - return controlPane; + return column( + LayoutConstants.VGAP_MEDIUM, + row(LayoutConstants.HORIZONTAL_GAP, cell(encodeLabel).weight(0.2), cell(encodingComboBox).weight(0.8)), + cell(new XMLNodeTreePane()), + cell(getPreviewPanel()) + ).getComponent(); } - private JPanel excelSetPanel(int width, int height) { - // excel设置pane - int checkBoxWidth = width - EIGHT; - JPanel controlPane = new JPanel(); - JPanel northPane = new JPanel(new BorderLayout(8, 8)); - controlPane.setLayout(new BorderLayout()); - controlPane.setPreferredSize(new Dimension(width, height)); + /** + * Excel设定Pane + * @return + */ + private JPanel getExcelSetPanel() { needColumnNameCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FirstRow_IS_Column_Name"), false); - needColumnNameCheckBox.setPreferredSize(new Dimension(checkBoxWidth, 20)); - northPane.add(needColumnNameCheckBox, BorderLayout.EAST); - controlPane.add(northPane, BorderLayout.NORTH); - previewPanel(controlPane); - return controlPane; + return column(cell(needColumnNameCheckBox), cell(getPreviewPanel())).getComponent(); } private String getFilePathFromUrlOrLocal() { @@ -346,34 +326,21 @@ public class FileTableDataPane extends AbstractTableDataPane { // return (uri.matches("https*://.+|\\$\\{.+\\}.*")); } - private JPanel textSetPanel(int width, int height) { - // text设置pane - JPanel controlPane = new JPanel(); - controlPane.setLayout(new BorderLayout()); - controlPane.setPreferredSize(new Dimension(width, height)); - JPanel northPane = new JPanel(new BorderLayout(8, 8)); - addToNorthPane(northPane); - controlPane.add(northPane, BorderLayout.WEST); - previewPanel(controlPane); - return controlPane; - } - - private void addToNorthPane(JPanel northPane) { - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] columnSize = {f, p, p}; - double[] rowSize = {B, B, B, B, B, B, B}; + /** + * TXT设定Pane + * @return + */ + private JPanel getTextSetPanel() { needColumnNameCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FirstRow_IS_Column_Name"), true); - dismenberLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dismenber") + ":"); tableDismemberRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Table_Dismember"), false); tableDismemberRadioButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Table_Dismember")); spaceDismenberRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Space"), true); spaceDismenberRadioButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Space")); commaDismenberRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Comma_Dismenber"), false); commaDismenberRadioButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Comma_Dismenber")); - otherDismenberRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Other") + ":", false); + otherDismenberRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Other"), false); otherDismenberRadioButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Other")); - otherDismenberTextField = new UITextField(8); + otherDismenberTextField = new UITextField(); otherDismenberTextField.setEditable(false); otherDismenberRadioButton.addChangeListener(new ChangeListener() { @Override @@ -392,18 +359,34 @@ public class FileTableDataPane extends AbstractTableDataPane { bg2.add(otherDismenberRadioButton); ignoreOneMoreDelimiterCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Series_Dismenber_As_Single"), true); UIComponentUtils.setLineWrap(ignoreOneMoreDelimiterCheckBox); - encodeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Encoding_Type") + ":"); + //编码类型 + encodeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Encoding_Type")); charsetComboBox = new UIComboBox(EncodeConstants.ALL_ENCODING_ARRAY); - Component[][] comps = { - {encodeLabel, charsetComboBox, null}, - {needColumnNameCheckBox, null, null}, - {dismenberLabel, tableDismemberRadioButton, null}, - {null, spaceDismenberRadioButton, null}, - {null, commaDismenberRadioButton, null}, - {null, otherDismenberRadioButton, otherDismenberTextField}, - {ignoreOneMoreDelimiterCheckBox, null, null} - }; - northPane.add(TableLayoutHelper.createTableLayoutPane(comps, rowSize, columnSize), BorderLayout.EAST); + //分隔符选项 + JPanel separatorOptionsPanel = column( + LayoutConstants.VERTICAL_GAP, + cell(tableDismemberRadioButton), + cell(spaceDismenberRadioButton), + cell(commaDismenberRadioButton), + row(cell(otherDismenberRadioButton).weight(0.2), cell(otherDismenberTextField).weight(0.8)) + ).getComponent(); + //TXT设定主要面板 + JPanel txtCenterPane = column( + LayoutConstants.VERTICAL_GAP, + row(10, cell(encodeLabel).weight(0.2), cell(charsetComboBox).weight(0.8)), + cell(needColumnNameCheckBox), + row(10, + cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dismenber"))).weight(0.2), + cell(separatorOptionsPanel).weight(0.8) + ), + cell(ignoreOneMoreDelimiterCheckBox) + ).getComponent(); + return column(cell(txtCenterPane), cell(getPreviewPanel())).getComponent(); + } + + private JPanel getTopAlignLabelPane(String labelText) { + return column(LayoutConstants.VERTICAL_GAP, cell(new UILabel(labelText))) + .with(it-> it.setBorder(new ScaledEmptyBorder(2,0,0,0))).getComponent(); } private ActionListener radioActionListener = new ActionListener() { @@ -480,24 +463,24 @@ public class FileTableDataPane extends AbstractTableDataPane { return suffixToString; } - private ActionListener getFileTypeListener(final JPanel setPanel, final int width, final int height) { + private ActionListener getFileTypeListener(final JPanel rightPanel) { ActionListener fileTypeListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - setPanel.removeAll(); + rightPanel.removeAll(); localText.setText(""); urlText.setText(""); if (fileTypeComboBox.getSelectedIndex() == XML) { - setPanel.add(xmlSetPanel(width, height), BorderLayout.NORTH); + rightPanel.add(getXmlSetPanel()); } else if (fileTypeComboBox.getSelectedIndex() == EXCEL) { - setPanel.add(excelSetPanel(width, height), BorderLayout.NORTH); + rightPanel.add(getExcelSetPanel()); } else { - setPanel.add(textSetPanel(width, height), BorderLayout.NORTH); + rightPanel.add(getTextSetPanel()); } String tipContent = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Type_Parameter") + "reportlets/excel/FineReport${abc}." + getFileSuffixToString() + "
" + "http://192.168.100.120:8080/XXServer/Report/excel${abc}.jsp
" + "  "; tips.setText(tipContent); - setPanel.revalidate(); + rightPanel.revalidate(); } }; @@ -507,7 +490,7 @@ public class FileTableDataPane extends AbstractTableDataPane { private class RefreshAction extends UITableEditAction { public RefreshAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Refresh")); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); + this.setSmallIcon(new LazyIcon("refresh")); } @Override @@ -818,9 +801,10 @@ public class FileTableDataPane extends AbstractTableDataPane { JPanel toolbarPanel = new JPanel(new BorderLayout()); this.setLayout(new BorderLayout()); xmlNodeTree = new XMLNodeTree(); + xmlNodeTree.setBackground(FlatUIUtils.getUIColor("fill.normal", Color.WHITE)); this.add(new JScrollPane(xmlNodeTree)); - keyPointLaber = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Key_Point") + ":"); + keyPointLaber = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Key_Point")); refreshAction = new RefreshParameterAction(); ToolBarDef toolbarDef = new ToolBarDef(); toolbarDef.addShortCut(refreshAction); @@ -840,7 +824,7 @@ public class FileTableDataPane extends AbstractTableDataPane { public RefreshParameterAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Refresh")); this.setMnemonic('r'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); + this.setSmallIcon(new LazyIcon("refresh")); } @Override diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallHeightPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallHeightPane.java index 4ce5da98d6..06963c3810 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallHeightPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallHeightPane.java @@ -9,11 +9,10 @@ package com.fr.design.data.tabledata.tabledatapane; */ public class FileTableDataSmallHeightPane extends FileTableDataPane{ //wikky:文件数据集在模板数据集下面的界面参数。 - private static final int SETPANELWIDTH = 265; - private static final int WIDTH = 245; - private static final int HEIGHT = 475; - private static final int GAP = 13; + private static final double LOCAL_WIDTH_RATIO = 0.58; + private static final double URL_WIDTH_RATIO = 0.51; + public FileTableDataSmallHeightPane(){ - super(SETPANELWIDTH,WIDTH,HEIGHT,GAP); + super(LOCAL_WIDTH_RATIO, URL_WIDTH_RATIO); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallPane.java index b81d2b904e..0c33c054af 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallPane.java @@ -9,11 +9,10 @@ package com.fr.design.data.tabledata.tabledatapane; */ public class FileTableDataSmallPane extends FileTableDataPane{ //wikky:文件数据集在服务器数据集下面的界面参数。 - private static final int SETPANELWIDTH = 265; - private static final int WIDTH = 245; - private static final int HEIGHT = 436; - private static final int GAP = 13; + private static final double LOCAL_WIDTH_RATIO = 0.59; + private static final double URL_WIDTH_RATIO = 0.52; + public FileTableDataSmallPane(){ - super(SETPANELWIDTH,WIDTH,HEIGHT,GAP); + super(LOCAL_WIDTH_RATIO, URL_WIDTH_RATIO); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java index 66674f166a..33c1377496 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java @@ -1,9 +1,13 @@ package com.fr.design.data.tabledata.tabledatapane; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.*; import com.fr.data.impl.ConditionTableData; import com.fr.data.impl.MultiTDTableData; import com.fr.data.impl.UnionTableData; +import com.fr.design.constants.LayoutConstants; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.tabledata.wrapper.TableDataWrapper; import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper; @@ -39,6 +43,10 @@ import java.util.Iterator; import java.util.List; import java.util.Map.Entry; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + public class MultiTDTableDataPane extends AbstractTableDataPane { private static final int MAX_LENTH_OF_DATASET = 130; //关联数据集面板最大显示的数据集长度,超出这个长度显示数据集名称+“...” @@ -52,28 +60,25 @@ public class MultiTDTableDataPane extends AbstractTableDataPane stringTableDataWrapperEntry : resMap.entrySet()) { TableDataWrapper tableDataWrappe = stringTableDataWrapperEntry.getValue(); @@ -103,7 +110,6 @@ public class MultiTDTableDataPane extends AbstractTableDataPane MAX_LENTH_OF_DATASET) { @@ -299,25 +298,40 @@ public class MultiTDTableDataPane extends AbstractTableDataPane it.setBorder(new ScaledEmptyBorder(0,10,0,0))).getComponent(); this.setLayout(new BorderLayout()); - this.add(buttonPane, BorderLayout.NORTH); this.contentPane = getContentPane(); - this.add(contentPane, BorderLayout.CENTER); + this.add(column(cell(buttonPane), cell(contentPane)).getComponent()); } /** 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 5b77b9571a..a15e6335cc 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 @@ -1,6 +1,9 @@ package com.fr.design.dialog; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.common.annotations.Open; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.DesignSizeI18nManager; @@ -17,6 +20,9 @@ import java.awt.Dimension; import java.awt.Frame; import java.awt.Window; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + @Open public abstract class BasicPane extends JPanel { @@ -299,16 +305,19 @@ public abstract class BasicPane extends JPanel { private PropertyChangeAdapter changeListener; public NamePane(BasicPane bPane) { - this.setLayout(new BorderLayout(4, 4)); - - nameTextField = new UITextField(30); - Name = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Name") + ":"); - JPanel northPane = new JPanel(new BorderLayout(4, 4)); - northPane.add(Name, BorderLayout.WEST); - northPane.add(nameTextField, BorderLayout.CENTER); - northPane.add(showfield = new UILabel(" "), BorderLayout.EAST); + this.setLayout(new BorderLayout()); + nameTextField = new UITextField(); + Name = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Name")); + JPanel northPane = new JPanel(new BorderLayout()); + northPane.setBorder(new ScaledEmptyBorder(0,10,0,10)); + northPane.add(row( + LayoutConstants.HGAP_LARGE, + cell(Name).weight(0.12), + cell(nameTextField).weight(0.58), + cell(showfield = new UILabel(" ")).weight(0.3) + ).getComponent()); showfield.setForeground(new Color(204, 0, 1)); - showfield.setPreferredSize(new Dimension(220, showfield.getPreferredSize().height)); + showfield.setPreferredSize(FineUIScale.scale(new Dimension(220, showfield.getPreferredSize().height))); this.add(northPane, BorderLayout.NORTH); this.centerPane = bPane; this.add(bPane, BorderLayout.CENTER); diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/EditingStringListPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/EditingStringListPane.java index ebe6abb672..b3815f2240 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/EditingStringListPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/EditingStringListPane.java @@ -1,27 +1,24 @@ package com.fr.design.gui.frpane; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.JListUtils; import com.fr.stable.StringUtils; -import javax.swing.BorderFactory; -import javax.swing.DefaultListCellRenderer; -import javax.swing.DefaultListModel; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.ListSelectionModel; -import javax.swing.SwingUtilities; +import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import java.awt.BorderLayout; -import java.awt.Component; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; @@ -29,13 +26,15 @@ import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.*; + public abstract class EditingStringListPane extends BasicBeanPane> { private static final long serialVersionUID = 1L; private DefaultListModel model; private JList jlist; private UIButton addButton; - private UIButton editButton; + private UIButton modifyButton; private UIButton removeButton; private UIButton moveUpButton; private UIButton moveDownButton; @@ -43,6 +42,11 @@ public abstract class EditingStringListPane extends BasicBeanPane> public EditingStringListPane() { super(); this.setLayout(FRGUIPaneFactory.createBorderLayout()); + //按钮 + JPanel buttonPane = initButtonPane(); + buttonPane.setBorder(new ScaledEmptyBorder(0,0,10,0)); + this.add(buttonPane, BorderLayout.NORTH); + //列表 model = new DefaultListModel(); jlist = new JList(model); jlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); @@ -56,34 +60,43 @@ public abstract class EditingStringListPane extends BasicBeanPane> } }); - - addButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add")); - editButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Modify")); - removeButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove")); - moveUpButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Up")); - moveDownButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Down")); - - JPanel eastPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(1); - eastPane.add(editButton); - eastPane.add(removeButton); - eastPane.add(moveUpButton); - eastPane.add(moveDownButton); - this.add(GUICoreUtils.createBorderPane(eastPane, BorderLayout.NORTH), BorderLayout.EAST); - - JPanel centerPane = new JPanel(new BorderLayout(0, 5)); - this.add(centerPane, BorderLayout.CENTER); - JPanel northcenterPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - northcenterPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); - northcenterPane.add(addButton, BorderLayout.EAST); - centerPane.add(northcenterPane, BorderLayout.NORTH); - centerPane.add(new JScrollPane(jlist), BorderLayout.CENTER); - + jlist.setBackground(FlatUIUtils.getUIColor("fill.normal", Color.WHITE)); + JScrollPane scrollPane = new JScrollPane(jlist); + scrollPane.setPreferredSize(FineUIScale.scale(new Dimension(620,350))); + scrollPane.setBorder(new FineRoundBorder()); + this.add(scrollPane, BorderLayout.CENTER); + //统一加按钮事件 this.addListener(); - this.addButton.setEnabled(false); this.checkEnableState(); } + private JPanel initButtonPane() { + addButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add"), new LazyIcon("add")); + addButton.setDisabledIcon(new LazyIcon("add").disabled()); + + modifyButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Modify"), new LazyIcon("edit")); + modifyButton.setDisabledIcon(new LazyIcon("edit").disabled()); + + removeButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"), new LazyIcon("remove")); + removeButton.setDisabledIcon(new LazyIcon("remove").disabled()); + + moveUpButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Up"), new LazyIcon("move_up")); + moveUpButton.setDisabledIcon(new LazyIcon("move_up").disabled()); + + moveDownButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Down"), new LazyIcon("move_down")); + moveDownButton.setDisabledIcon(new LazyIcon("move_down").disabled()); + + return row(LayoutConstants.HORIZONTAL_GAP, + flex(), + cell(addButton), + cell(modifyButton), + cell(removeButton), + cell(moveUpButton), + cell(moveDownButton) + ).getComponent(); + } + private void addListener() { addListener1(); @@ -119,7 +132,6 @@ public abstract class EditingStringListPane extends BasicBeanPane> private void addListener1() { addButton.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { String newvalue = getAddOrEditString(); @@ -133,7 +145,7 @@ public abstract class EditingStringListPane extends BasicBeanPane> } } }); - editButton.addActionListener(new ActionListener() { + modifyButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -152,9 +164,9 @@ public abstract class EditingStringListPane extends BasicBeanPane> Object selected = jlist.getSelectedValue(); if (selected != null) { int re = FineJOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(EditingStringListPane.this), - Toolkit.i18nText("Fine-Design_Basic_Sure_To_Delete") + selected.toString() + "?", - Toolkit.i18nText("Fine-Design_Basic_Dialog_Prompt"), - JOptionPane.OK_CANCEL_OPTION); + Toolkit.i18nText("Fine-Design_Basic_Sure_To_Delete") + selected.toString() + "?", + Toolkit.i18nText("Fine-Design_Basic_Dialog_Prompt"), + JOptionPane.OK_CANCEL_OPTION); if (re == JOptionPane.OK_OPTION) { JListUtils.removeSelectedListItems(jlist); } @@ -174,7 +186,7 @@ public abstract class EditingStringListPane extends BasicBeanPane> private void setEditEnabled(boolean enabled) { this.removeButton.setEnabled(enabled); - this.editButton.setEnabled(enabled); + this.modifyButton.setEnabled(enabled); this.moveUpButton.setEnabled(enabled); this.moveDownButton.setEnabled(enabled); } diff --git a/designer-base/src/main/java/com/fr/design/gui/ilable/FRExplainLabel.java b/designer-base/src/main/java/com/fr/design/gui/ilable/FRExplainLabel.java index d0c5f4a496..e4224535c3 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ilable/FRExplainLabel.java +++ b/designer-base/src/main/java/com/fr/design/gui/ilable/FRExplainLabel.java @@ -1,10 +1,9 @@ package com.fr.design.gui.ilable; -import java.awt.Color; +import com.fine.theme.utils.FineUIStyle; import javax.swing.Icon; import javax.swing.ImageIcon; -import com.fr.design.gui.ilable.UILabel; public class FRExplainLabel extends UILabel { @@ -19,6 +18,6 @@ public class FRExplainLabel extends UILabel { private void init(){ setIcon(icon); - setForeground(new Color(255, 0, 0)); + FineUIStyle.setStyle(this, FineUIStyle.LABEL_WARNING_TIP); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/parameter/ParameterPane.java b/designer-base/src/main/java/com/fr/design/parameter/ParameterPane.java index 063a685d80..340f9a5232 100644 --- a/designer-base/src/main/java/com/fr/design/parameter/ParameterPane.java +++ b/designer-base/src/main/java/com/fr/design/parameter/ParameterPane.java @@ -1,18 +1,21 @@ package com.fr.design.parameter; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.Parameter; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.LayoutConstants; import com.fr.design.editor.ValueEditorPane; import com.fr.design.editor.ValueEditorPaneFactory; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; public class ParameterPane extends BasicBeanPane { @@ -34,27 +37,24 @@ public class ParameterPane extends BasicBeanPane { } protected void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.setLayout(new BorderLayout()); + //名字 nameTextField = new UITextField(10); nameTextField.setEditable(false); - - JPanel textFieldPanel=FRGUIPaneFactory.createBorderLayout_S_Pane(); - textFieldPanel.add(nameTextField,BorderLayout.CENTER); - + //默认值 valueEditor = ValueEditorPaneFactory.createBasicValueEditorPane(); - // richer:要排列显示的控件 - Component[][] components = {{null}, - { null, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Name") + ":"),textFieldPanel }, - { null, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Default_Value") + ":"),valueEditor } - }; - double p =TableLayout.PREFERRED; - double f =TableLayout.FILL; - double[] rowSize = {p, p, p, p}; - double[] columnSize = {p, p, f, p, p}; - - JPanel centerPane = TableLayoutHelper.createGapTableLayoutPane( - components, rowSize, columnSize, 20, 10); + JPanel centerPane = column(LayoutConstants.VERTICAL_GAP, + row(20, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Name") + ":")).weight(0.1), + cell(nameTextField).weight(0.8), + flex(0.1)), + row(20, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Default_Value") + ":")).weight(0.1), + cell(valueEditor).weight(0.8), + flex(0.1)) + ).getComponent(); + centerPane.setBorder(new ScaledEmptyBorder(0, 20, 0, 0)); this.add(centerPane, BorderLayout.CENTER); } diff --git a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java index e06046e079..bab3f73d9c 100644 --- a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java +++ b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java @@ -1,7 +1,14 @@ package com.fr.design.report; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.BaseFormula; import com.fr.base.iofile.attr.WatermarkAttr; +import com.fr.design.border.FineBorderFactory; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.editor.editor.FormulaEditor; import com.fr.design.gui.icombobox.UIComboBox; @@ -12,25 +19,14 @@ import com.fr.design.gui.ispinner.UnsignedIntUISpinner; import com.fr.design.gui.style.FRFontPane; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.style.color.NewColorSelectPane; -import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.BorderFactory; -import javax.swing.SwingConstants; -import javax.swing.JComponent; -import javax.swing.JPanel; +import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import javax.swing.JDialog; -import javax.swing.SwingUtilities; -import javax.swing.UIManager; -import java.awt.Dimension; -import java.awt.BorderLayout; -import java.awt.Color; +import java.awt.*; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.ItemEvent; @@ -39,8 +35,13 @@ import java.awt.event.MouseListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.FocusAdapter; -import java.awt.Dialog; -import java.awt.FlowLayout; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; /** @@ -57,7 +58,7 @@ public class WatermarkPane extends BasicPane { private UIComboBox fontSizeComboBox; //横向间距 private UISpinner horizontalGapSpinner; - //横向间距 + //纵向间距 private UISpinner verticalGapSpinner; // 文字颜色 private NewColorSelectPane colorPane; @@ -69,7 +70,7 @@ public class WatermarkPane extends BasicPane { //纵向间距最小值 public static final int VERTICAL_GAP_MIX = 50; - private static final Dimension SPINNER_DIMENSION = new Dimension(75, 20); + private JPanel leftPane; public WatermarkPane() { initComponents(); @@ -77,26 +78,45 @@ public class WatermarkPane extends BasicPane { private void initComponents() { message = new UILabel(); - this.setBorder(BorderFactory.createEmptyBorder(4, 4, -5, 4)); this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel contentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - this.add(contentPane, BorderLayout.CENTER); - - // 预览 - JPanel leftPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - contentPane.add(leftPane, BorderLayout.CENTER); - leftPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Style_Preview"), null)); + //左侧预览面板 JPanel previewPaneWrapper = FRGUIPaneFactory.createBorderLayout_S_Pane(); - leftPane.add(previewPaneWrapper, BorderLayout.CENTER); - previewPaneWrapper.setBorder(BorderFactory.createEmptyBorder(2, 8, 4, 8)); + //预览外边框,宽度跟随全局权重 + previewPaneWrapper.setBorder(new FineRoundBorder()); + previewPaneWrapper.setPreferredSize(FineUIScale.scale(new Dimension(-1,415))); + previewPaneWrapper.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); watermarkPreviewPane = new WatermarkPreviewPane(); + watermarkPreviewPane.setOpaque(false); previewPaneWrapper.add(watermarkPreviewPane, BorderLayout.CENTER); - - // 设置 - JPanel rightPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - contentPane.add(rightPane, BorderLayout.EAST); - rightPane.add(initRightPane(), BorderLayout.NORTH); + leftPane = column( + LayoutConstants.VGAP_SMALL, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Style_Preview"))), + cell(previewPaneWrapper) + ).getComponent(); + + // 分割线 + JPanel separatorLine = new JPanel(); + separatorLine.setBorder(FineBorderFactory.createDefaultUnderlineBorder()); + + //在预览与配置外创建一个大的外边框并设置边距 + JPanel innerPanel = row( + LayoutConstants.HORIZONTAL_GAP, + cell(leftPane).weight(0.55), + cell(wrapComponentWithTitle(getRightPane(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Config"))).weight(0.45) + ).with(it -> it.setBorder(new ScaledEmptyBorder(10,10,10,10))).getComponent(); + JPanel outerPanel = new JPanel(new BorderLayout()); + outerPanel.setBorder(new FineRoundBorder()); + outerPanel.setBackground(FineUIUtils.getUIColor("fill.gray", "defaultBorderColor")); + outerPanel.add(innerPanel); + + // 分割线下方,左侧预览,右侧配置 + JPanel centerPanel = column(LayoutConstants.VERTICAL_GAP, + cell(separatorLine), + cell(outerPanel) + ).getComponent(); + centerPanel.setBorder(new ScaledEmptyBorder(0, 10, 0, 10)); + this.add(centerPanel, BorderLayout.CENTER); } public void populate(WatermarkAttr watermark) { @@ -129,60 +149,59 @@ public class WatermarkPane extends BasicPane { this.formulaPane = formulaPane; } - protected UIScrollPane initRightPane() { + /** + * 配置Pane + * @return + */ + protected JPanel getRightPane() { + // 文字 formulaPane = new FormulaEditor(Toolkit.i18nText("Fine-Design_Report_Parameter_Formula")); + // 字号 fontSizeComboBox = new UIComboBox(FRFontPane.FONT_SIZES); fontSizeComboBox.setEditable(true); + + //水印间距 horizontalGapSpinner = new UnsignedIntUISpinner(100, Integer.MAX_VALUE, 1, 200); verticalGapSpinner = new UnsignedIntUISpinner(50, Integer.MAX_VALUE, 1, 100); - horizontalGapSpinner.setPreferredSize(SPINNER_DIMENSION); - verticalGapSpinner.setPreferredSize(SPINNER_DIMENSION); - message.setBorder(BorderFactory.createEmptyBorder(8, 5, 0, 0)); //失去焦点时要判断是否要弹出提示 horizontalGapSpinner.getTextField().addFocusListener( createFocusListener4GapNumberField(horizontalGapSpinner, HORIZONTAL_GAP_MIX, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Horizontal_Gap_Over_Warning"))); verticalGapSpinner.getTextField().addFocusListener(createFocusListener4GapNumberField(verticalGapSpinner, VERTICAL_GAP_MIX, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Vertical_Gap_Over_Warning"))); - //next 按钮 释放时也要判断是否要弹出提示 horizontalGapSpinner.getNextButton().addMouseListener(createMouseListener4GapNextButton(horizontalGapSpinner, HORIZONTAL_GAP_MIX, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Horizontal_Gap_Over_Warning"))); verticalGapSpinner.getNextButton().addMouseListener(createMouseListener4GapNextButton(verticalGapSpinner, VERTICAL_GAP_MIX, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Vertical_Gap_Over_Warning"))); - - JPanel fontSizeTypePane = new JPanel(new BorderLayout(10, 0)); - fontSizeTypePane.add(fontSizeComboBox, BorderLayout.CENTER); - - //水印间距面板 - JPanel watermarkGapPane = new JPanel(new BorderLayout(10, 0)); - JPanel jp = FRGUIPaneFactory.createNColumnGridInnerContainer_Pane(2, 10, 0); - jp.add(horizontalGapSpinner); - jp.add(verticalGapSpinner); - watermarkGapPane.add(jp, BorderLayout.CENTER); - - JPanel watermarkGapTipsPane = new JPanel(new BorderLayout()); - JPanel tipsJp = FRGUIPaneFactory.createNColumnGridInnerContainer_Pane(2, 10, 0); - tipsJp.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Direction_Horizontal"), SwingConstants.CENTER)); - tipsJp.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Direction_Vertical"), SwingConstants.CENTER)); - watermarkGapTipsPane.add(tipsJp, BorderLayout.CENTER); - + //水印间距提示居中布局 + JPanel watermarkGapTipsPane = row(LayoutConstants.HGAP_LARGE, + flex(0.15), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Direction_Horizontal"))).weight(0.2), + flex(0.3), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Direction_Vertical"))).weight(0.2), + flex(0.15) + ).getComponent(); + //水印间距排列 + JPanel watermarkGapPane = column( + row(LayoutConstants.HGAP_LARGE, + cell(horizontalGapSpinner).weight(0.5), + cell(verticalGapSpinner).weight(0.5) + ), + cell(watermarkGapTipsPane) + ).getComponent(); + // 颜色选择器 colorPane = new NewColorSelectPane(false); - JPanel colorLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - colorLabelPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Text_Color")), BorderLayout.NORTH); - - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p, p}; - double[] columnSize = {p, MAX_WIDTH}; - - JPanel rightContentPane = TableLayoutHelper.createCommonTableLayoutPane(new JComponent[][]{ - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Watermark_Text")), formulaPane}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Font_Size")), fontSizeTypePane}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Watermark_Gap")), watermarkGapPane}, - {null, watermarkGapTipsPane}, - {colorLabelPane, colorPane}, - }, rowSize, columnSize, 10); - rightContentPane.setBorder(BorderFactory.createEmptyBorder(15, 12, 10, 12)); - - UIScrollPane configPane = new UIScrollPane(rightContentPane); - configPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Config"), null)); - return configPane; + // 配置面板排列布局 + JPanel rightContentPane = column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Watermark_Text"))).weight(0.3), cell(formulaPane).weight(0.7)), + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Font_Size"))).weight(0.3), cell(fontSizeComboBox).weight(0.7)), + row(cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Watermark_Gap"))).weight(0.3), cell(watermarkGapPane).weight(0.7)), + row(cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Text_Color"))).weight(0.3), cell(colorPane).weight(0.7)) + ).getComponent(); + rightContentPane.setOpaque(false); + return rightContentPane; + } + + private JPanel getTopAlignLabelPane(String labelText) { + return column(LayoutConstants.VERTICAL_GAP, cell(new UILabel(labelText))). + with(it -> it.setBorder(new ScaledEmptyBorder(2,0,0,0))).getComponent(); } protected void populateFontSize(int fontSize) { diff --git a/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java b/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java index f3de6eef96..da5ee01db7 100644 --- a/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java +++ b/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java @@ -20,7 +20,7 @@ public class WatermarkSettingPane extends AbstractTemplateServerSettingPane { } private void initComponents() { - buttonPane.setBorder(BorderFactory.createEmptyBorder(10, 8, 0, 0)); + //buttonPane.setBorder(BorderFactory.createEmptyBorder(10, 8, 0, 0)); } @Override diff --git a/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java b/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java index 48d6a5686e..901f1b6010 100644 --- a/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java +++ b/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java @@ -1,12 +1,12 @@ package com.fr.design.report.fit; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.report.fit.provider.FitAttrModelProvider; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.report.fit.ReportFitAttr; import javax.swing.*; @@ -17,6 +17,8 @@ import java.util.Comparator; import java.util.Set; import java.util.stream.Collectors; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; import static com.fr.design.i18n.Toolkit.i18nText; public abstract class BaseFitAttrPane extends BasicBeanPane { @@ -26,26 +28,23 @@ public abstract class BaseFitAttrPane extends BasicBeanPane { protected UIComboBox itemChoose; protected java.util.List fitAttrModelList = new ArrayList<>(); private ReportFitConfigPane fitConfigPane; - public FitAttrModel fitAttrModel; - private static final int BELOW_SET_COMPONENT_HSPACE = 8; - protected BaseFitAttrPane() { initFitAttrModel(); } private void initFitAttrModel() { + //旧决策报表 fitAttrModelList.add(new FrmFitAttrModel()); + //普通报表 fitAttrModelList.add(new CptFitAttrModel()); + //决策报表 fitAttrModelList.add(new AdaptiveFrmFitAttrModel()); - Set fitAttrModelProviders = ExtraDesignClassManager.getInstance().getArray(FitAttrModelProvider.XML_TAG); - for (FitAttrModelProvider fitAttrModelProvider : fitAttrModelProviders) { fitAttrModelList.add(fitAttrModelProvider); } - fitAttrModelList = fitAttrModelList.stream().sorted(Comparator.comparing(FitAttrModel::getPriority).reversed()).collect(Collectors.toList()); } @@ -55,6 +54,7 @@ public abstract class BaseFitAttrPane extends BasicBeanPane { contentJPanel.remove(fitConfigPane); } this.fitConfigPane = fitAttrModel instanceof CptFitAttrModel ? new ReportFitConfigPane(fitAttrModel, true) : new FormFitConfigPane(fitAttrModel, true); + //添加自适应面板 contentJPanel.add(fitConfigPane); } @@ -82,34 +82,33 @@ public abstract class BaseFitAttrPane extends BasicBeanPane { protected abstract String[] getItemNames(); protected void initComponents() { - this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - contentJPanel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(false, FlowLayout.LEFT, 0, 0); - this.add(contentJPanel); + //添加以下设置 initItemChoose(); + //服务器配置-PC端自适应属性面板中需要添加提示 initPrompt(); + this.setLayout(new BorderLayout()); + this.add(contentJPanel); } - + /** + * 以下设置Pane + */ private void initItemChoose() { - JPanel chooseJPanel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - ItemListener itemListener = getItemListener(); + belowSetLabel = new UILabel(i18nText("Fine-Design_Report_Blow_Set")); itemChoose = new UIComboBox(getItemNames()); + ItemListener itemListener = getItemListener(); itemChoose.addItemListener(itemListener); - belowSetLabel = new UILabel(i18nText("Fine-Design_Report_Blow_Set")); - JPanel hSpaceLabel = new JPanel(); - hSpaceLabel.setSize(BELOW_SET_COMPONENT_HSPACE, 0); - JPanel buttonPane = GUICoreUtils.createFlowPane(new Component[]{ - belowSetLabel, hSpaceLabel, itemChoose}, FlowLayout.LEFT); - chooseJPanel.add(buttonPane); - chooseJPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0)); - contentJPanel.add(chooseJPanel); + //以下设置横向布局 + JPanel buttonPane = row(20, cell(belowSetLabel), cell(itemChoose)).getComponent(); + buttonPane.setBorder(new ScaledEmptyBorder(0,5,5,0)); + //整体面板添加‘以下设置Pane’ + contentJPanel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(false, FlowLayout.LEFT, 0, 0); + contentJPanel.setBorder(new ScaledEmptyBorder(5,10,5,10)); + contentJPanel.add(buttonPane); } - protected abstract ItemListener getItemListener(); - public void populate(ReportFitAttr reportFitAttr) { } diff --git a/designer-base/src/main/java/com/fr/design/report/fit/FormFitConfigPane.java b/designer-base/src/main/java/com/fr/design/report/fit/FormFitConfigPane.java index d88a3a16eb..acd8ee1f73 100644 --- a/designer-base/src/main/java/com/fr/design/report/fit/FormFitConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/report/fit/FormFitConfigPane.java @@ -1,11 +1,12 @@ package com.fr.design.report.fit; +import com.fine.theme.utils.FineUIStyle; import com.fr.base.svg.SVGLoader; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.report.fit.menupane.FitRadioGroup; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; @@ -23,13 +24,16 @@ import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; + public class FormFitConfigPane extends ReportFitConfigPane { private static final int ICON_OFFSET_X = 25; private static final int ICON_OFFSET_Y = 3; private static final int ICON_SIZE = 16; + //待调整 private static final Image HOVER_IMAGE = SVGLoader.load("/com/fr/design/icon/icon_ec_default_fit.svg"); private static final int DEFAULT_ITEM = 0; - private static final int CUSTOM_ITEM = 1; public FormFitConfigPane(FitAttrModel fitAttrModel) { @@ -41,12 +45,11 @@ public class FormFitConfigPane extends ReportFitConfigPane { } protected JPanel initECConfigPane() { - JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + JPanel jPanel = new JPanel(new BorderLayout()); if (fitAttrModel.getFitTypeNames().length != 0) { Component[] ecComponents = new Component[fitAttrModel.getFitTypeNames().length + 1]; initRadioGroup(ecConfigRadioGroup, fitAttrModel.getFitName(), fitAttrModel.getFitTypeNames(), ecComponents); - jPanel.add(createSubAttrPane(ecComponents), BorderLayout.CENTER); - jPanel.add(createTipPane(), BorderLayout.SOUTH); + jPanel.add(column(10, cell(createSubAttrPane(ecComponents)), cell(createTipPane())).getComponent()); } return jPanel; } @@ -79,7 +82,6 @@ public class FormFitConfigPane extends ReportFitConfigPane { UIPopupMenu uiPopupMenu = new UIPopupMenu() { @Override protected void paintBorder(Graphics g) { - } }; uiPopupMenu.setLayout(new BorderLayout(0, 0)); @@ -107,7 +109,6 @@ public class FormFitConfigPane extends ReportFitConfigPane { } else { hidePreviewPane(); } - } }); } @@ -138,13 +139,12 @@ public class FormFitConfigPane extends ReportFitConfigPane { } private JPanel createTipPane() { - JPanel jPanel = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); + JPanel jPanel = new JPanel(new BorderLayout()); UILabel label1 = new UILabel(Toolkit.i18nText("Fine-Design_Form_PC_FIT_Config_Tip1")); - jPanel.add(label1); - label1.setForeground(Color.lightGray); + FineUIStyle.setStyle(label1, FineUIStyle.LABEL_TIP); UILabel label2 = new UILabel(Toolkit.i18nText("Fine-Design_Form_PC_FIT_Config_Tip2")); - jPanel.add(label2); - label2.setForeground(Color.lightGray); + FineUIStyle.setStyle(label2, FineUIStyle.LABEL_TIP); + jPanel.add(column(LayoutConstants.HORIZONTAL_GAP, cell(label1), cell(label2)).getComponent()); return jPanel; } @@ -159,5 +159,4 @@ public class FormFitConfigPane extends ReportFitConfigPane { protected void updateECConfigRadioGroup(ReportFitAttr reportFitAttr) { reportFitAttr.setFitStateInPC(ecConfigRadioGroup.getSelectRadioIndex()); } - } diff --git a/designer-base/src/main/java/com/fr/design/report/fit/NewFitPreviewPane.java b/designer-base/src/main/java/com/fr/design/report/fit/NewFitPreviewPane.java index 2bc69cedc7..36209972fc 100644 --- a/designer-base/src/main/java/com/fr/design/report/fit/NewFitPreviewPane.java +++ b/designer-base/src/main/java/com/fr/design/report/fit/NewFitPreviewPane.java @@ -1,5 +1,6 @@ package com.fr.design.report.fit; +import com.fine.theme.utils.FineUIScale; import com.fr.base.GraphHelper; import com.fr.general.FRFont; @@ -17,7 +18,7 @@ public class NewFitPreviewPane extends JPanel { private static final Color DEFAULT_PAINT_COLOR = Color.decode("#419BF9"); private static final int FIT_FONT_SIZE = 15; private static final int NO_FIT_FONT_SIZE = 10; - private static final Dimension NO_FIT_CONTAINER_DIMENSION = new Dimension(230, 80); + private static final Dimension NO_FIT_CONTAINER_DIMENSION = FineUIScale.scale(new Dimension(230, 80)); public NewFitPreviewPane(){ diff --git a/designer-base/src/main/java/com/fr/design/report/fit/ReportFitConfigPane.java b/designer-base/src/main/java/com/fr/design/report/fit/ReportFitConfigPane.java index 158089602f..20c2688392 100644 --- a/designer-base/src/main/java/com/fr/design/report/fit/ReportFitConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/report/fit/ReportFitConfigPane.java @@ -1,5 +1,6 @@ package com.fr.design.report.fit; +import com.fine.theme.utils.FineUIScale; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.DesignSizeI18nManager; @@ -10,15 +11,16 @@ import com.fr.design.report.fit.menupane.FontRadioGroup; import com.fr.general.ComparatorUtils; import com.fr.report.fit.ReportFitAttr; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; import static com.fr.design.i18n.Toolkit.i18nText; public class ReportFitConfigPane extends JPanel { @@ -36,21 +38,24 @@ public class ReportFitConfigPane extends JPanel { } private void initComponent() { - JPanel contentJPanel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(false, FlowLayout.LEFT, 0, 0); - this.add(contentJPanel); fontRadioGroup = new FontRadioGroup(); ecConfigRadioGroup = new FitRadioGroup(); - contentJPanel.add(initAttrJPanel()); - contentJPanel.add(initPreviewJPanel()); + this.add(initContentPanel()); } - private JPanel initAttrJPanel() { - JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + private JPanel initContentPanel() { + //字体 Component[] fontComponents = new Component[3]; initRadioGroup(fontRadioGroup, i18nText("Fine-Designer_Fit-Font"), new String[]{i18nText("Fine-Designer_Fit"), i18nText("Fine-Designer_Fit-No")}, fontComponents); - jPanel.add(createSubAttrPane(fontComponents), BorderLayout.NORTH); - jPanel.add(initECConfigPane(), BorderLayout.CENTER); - return jPanel; + //预览区域 + previewJPanel = new NewFitPreviewPane(); + previewJPanel.setPreferredSize(FineUIScale.scale(new Dimension(300, 204))); + //面板布局 字体-(null/报表块/表格)-预览区域 + return column(10, + cell(createSubAttrPane(fontComponents)), + cell(initECConfigPane()), + cell(previewJPanel) + ).getComponent(); } protected JPanel initECConfigPane() { @@ -61,21 +66,14 @@ public class ReportFitConfigPane extends JPanel { return jPanel; } - protected JPanel createSubAttrPane(Component[] components) { double[] rowSize = new double[]{20}; double[] columnSize = new double[components.length]; - for (int i = 0; i < columnSize.length; i++) { - if (i == 0) { - columnSize[i] = DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.fit.firstColumn").getWidth(); - } else { - columnSize[i] = DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.fit.column").getWidth(); - } + for (int i = 1; i < columnSize.length; i++) { + columnSize[i] = DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.fit.column").getWidth(); } - JPanel attrJPanel = TableLayoutHelper.createTableLayoutPane(new Component[][]{components}, rowSize, columnSize); - attrJPanel.setBorder(BorderFactory.createEmptyBorder(5, 0, 10, 0)); - return attrJPanel; + return row(cell(components[0]).weight(0.16),cell(attrJPanel).weight(0.84)).getComponent(); } protected void initRadioGroup(FitRadioGroup fitRadioGroup, String name, String[] options, Component[] components) { @@ -110,17 +108,6 @@ public class ReportFitConfigPane extends JPanel { previewJPanel.refreshPreview(fontRadioGroup.isFontFit(), FitType.parse(updateBean())); } - private JPanel initPreviewJPanel() { - JPanel wrapperPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - previewJPanel = new NewFitPreviewPane(); - wrapperPane.add(previewJPanel, BorderLayout.CENTER); - int leftIndent = globalConfig ? (int) DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.fit.firstColumn").getWidth() : 0; - wrapperPane.setBorder(BorderFactory.createEmptyBorder(0, leftIndent, 0, 0)); - wrapperPane.setPreferredSize(new Dimension(300 + leftIndent, 204)); - return wrapperPane; - } - - public void populateBean(ReportFitAttr ob) { fontRadioGroup.selectIndexButton(ob.isFitFont() ? 0 : 1); populateECConfigRadioGroup(ob.fitStateInPC()); diff --git a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java index 91661301f1..ba1c377965 100644 --- a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java @@ -16,6 +16,7 @@ import com.fr.data.util.function.SumFunction; import com.fr.design.actions.UpdateAction; import com.fr.design.actions.core.ActionFactory; import com.fr.design.border.UITitledBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.fun.DefaultValueAdjustProvider; import com.fr.design.gui.ibutton.UIButton; @@ -90,6 +91,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; + // Noninstantiable utility class public final class GUICoreUtils { @@ -992,12 +996,7 @@ public final class GUICoreUtils { dynamicPane.setVisible(e.getStateChange() == visibleState); } }); - JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - panel.add(checkBox, BorderLayout.NORTH); - JPanel dynamicPaneWrapper = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - dynamicPaneWrapper.add(dynamicPane); - panel.add(dynamicPaneWrapper, BorderLayout.CENTER); - return panel; + return column(LayoutConstants.VERTICAL_GAP, cell(checkBox), cell(dynamicPane)).getComponent(); } /** diff --git a/designer-base/src/main/java/com/fr/design/widget/IconDefinePane.java b/designer-base/src/main/java/com/fr/design/widget/IconDefinePane.java index 69805979ba..6aeddc1ae9 100644 --- a/designer-base/src/main/java/com/fr/design/widget/IconDefinePane.java +++ b/designer-base/src/main/java/com/fr/design/widget/IconDefinePane.java @@ -1,5 +1,7 @@ package com.fr.design.widget; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; @@ -16,25 +18,29 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + public class IconDefinePane extends BasicPane { private UILabel showIconImageLable; private UIButton editIconButton; private UIButton removeIconButton; private String curIconName; + private Icon curIcon; public IconDefinePane() { - JPanel iconPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + /*JPanel iconPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); JPanel labelPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - labelPane.setLayout(new /**/ FlowLayout(FlowLayout.LEFT, 20, 0)); + labelPane.setLayout(new *//**//* FlowLayout(FlowLayout.LEFT, 20, 0));*/ showIconImageLable = new UILabel(); - showIconImageLable.setPreferredSize(new Dimension(20, 20)); + //showIconImageLable.setPreferredSize(new Dimension(20, 20)); editIconButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit")); - JPanel iconButtonPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + /* JPanel iconButtonPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); labelPane.add(showIconImageLable); iconPane.add(labelPane, BorderLayout.WEST); iconPane.add(iconButtonPane, BorderLayout.EAST); - iconButtonPane.add(editIconButton); + iconButtonPane.add(editIconButton);*/ editIconButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -54,7 +60,7 @@ public class IconDefinePane extends BasicPane { }); removeIconButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Delete")); - iconButtonPane.add(removeIconButton); + //iconButtonPane.add(removeIconButton); removeIconButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { curIconName = null; @@ -62,9 +68,14 @@ public class IconDefinePane extends BasicPane { } }); - this.add(this.showIconImageLable); + /*this.add(this.showIconImageLable); this.add(this.editIconButton); this.add(this.removeIconButton); + */ + JPanel iconButtonPane = row(LayoutConstants.HORIZONTAL_GAP, cell(this.showIconImageLable), cell(this.editIconButton), cell(this.removeIconButton)).getComponent(); + iconButtonPane.setBorder(new ScaledEmptyBorder(0,0,0,0)); + this.setLayout(new BorderLayout()); + this.add(iconButtonPane, BorderLayout.CENTER); } @Override @@ -86,6 +97,11 @@ public class IconDefinePane extends BasicPane { setShowIconImage(); } + public void populateIcon(String iconName, Icon icon) { + this.curIconName = iconName; + showIconImageLable.setIcon(icon); + } + public String update() { return this.curIconName; } diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/clearStash.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/clearStash.svg new file mode 100644 index 0000000000..1c1214522d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/clearStash.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/clearStash_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/clearStash_disable.svg new file mode 100644 index 0000000000..6d62bdb21a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/clearStash_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/customButton.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/customButton.svg new file mode 100644 index 0000000000..af4281adf2 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/customButton.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/customButton_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/customButton_disable.svg new file mode 100644 index 0000000000..28c9902293 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/customButton_disable.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/dataVerify.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/dataVerify.svg new file mode 100644 index 0000000000..6cfda99d8a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/dataVerify.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/dataVerify_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/dataVerify_disable.svg new file mode 100644 index 0000000000..6672c764ea --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/dataVerify_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/email.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/email.svg new file mode 100644 index 0000000000..13b48174b7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/email.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/email_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/email_disable.svg new file mode 100644 index 0000000000..74499db085 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/email_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up.svg index 1da5e45a17..df2a4fcb0a 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up.svg @@ -1,3 +1,10 @@ - - + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up_disable.svg index cae74fbe52..2b6c72634e 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up_disable.svg @@ -1,3 +1,10 @@ - - + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_first.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_first.svg new file mode 100644 index 0000000000..ac5c1f0c12 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_first.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_first_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_first_disable.svg new file mode 100644 index 0000000000..f7e6a77895 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_first_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_last.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_last.svg new file mode 100644 index 0000000000..7f14b98388 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_last.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_last_disbale.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_last_disbale.svg new file mode 100644 index 0000000000..80384418da --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_last_disbale.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_navi.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_navi.svg new file mode 100644 index 0000000000..afc2ecb557 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_navi.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_navi_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_navi_disable.svg new file mode 100644 index 0000000000..365e6dc5fa --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_navi_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_next.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_next.svg new file mode 100644 index 0000000000..12c49708d8 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_next.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_next_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_next_disable.svg new file mode 100644 index 0000000000..f1ac806195 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_next_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_previous.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_previous.svg new file mode 100644 index 0000000000..37df1e9546 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_previous.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_previous_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_previous_disable.svg new file mode 100644 index 0000000000..e53a285ed6 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_previous_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printApplet.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printApplet.svg new file mode 100644 index 0000000000..ddf8873655 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printApplet.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printApplet_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printApplet_disable.svg new file mode 100644 index 0000000000..4dd13115b8 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printApplet_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPdf.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPdf.svg new file mode 100644 index 0000000000..405640d101 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPdf.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPdf_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPdf_disable.svg new file mode 100644 index 0000000000..0044218667 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPdf_disable.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPreview.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPreview.svg new file mode 100644 index 0000000000..479384b117 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPreview.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPreview_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPreview_disable.svg new file mode 100644 index 0000000000..b3b7dce3df --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPreview_disable.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printerOffset.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printerOffset.svg new file mode 100644 index 0000000000..90d01097be --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printerOffset.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printerOffset_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printerOffset_disable.svg new file mode 100644 index 0000000000..0eb451e6f1 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printerOffset_disable.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/scale.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/scale.svg new file mode 100644 index 0000000000..fd9b1ba386 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/scale.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/scale_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/scale_disable.svg new file mode 100644 index 0000000000..d51fced4d0 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/scale_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json b/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json index 4e3213695b..cfcdb3c99a 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json @@ -179,7 +179,12 @@ "reportFit": "toolbar/reportFit.svg", "mobileAttr": "toolbar/mobileAttr.svg", "watermark": "toolbar/watermark.svg", + "dataVerify": "toolbar/dataVerify.svg", + "clearStash": "toolbar/clearStash.svg", "print": "toolbar/print.svg", + "printPdf": "toolbar/printPdf.svg", + "printApplet": "toolbar/printApplet.svg", + "printPreview": "toolbar/printPreview.svg", "pageSetup": "toolbar/pageSetup.svg", "reportHeader": "toolbar/reportHeader.svg", "reportFooter": "toolbar/reportFooter.svg", @@ -215,6 +220,15 @@ "workOrderCenter": "toolbar/workOrderCenter.svg", "actCenter": "toolbar/actCenter.svg", "sign": "toolbar/sign.svg", + "page_first": "toolbar/page_first.svg", + "page_next": "toolbar/page_next.svg", + "page_previous": "toolbar/page_previous.svg", + "page_last": "toolbar/page_last.svg", + "page_navi": "toolbar/page_navi.svg", + "email": "toolbar/email.svg", + "scale": "toolbar/scale.svg", + "printerOffset": "toolbar/printerOffset.svg", + "customButton": "toolbar/customButton.svg", "cellelement_small": "cellelement.svg", "forbid": "expand/forbid.svg", "horizontal_expand": "expand/horizontal.svg", diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index d20add6df5..1274335f8b 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -399,6 +399,7 @@ Label.tipColor = @BrandTipColor Label.borderColor = $defaultBorderColor Label.hyperLinkColor = #2576EF Label.strongHintColor = #FF0000 +Label.warningColor = #F1393C #---- HelpButton ---- @@ -1305,6 +1306,9 @@ CellOtherSetPane.height=$Component.defaultHeight [style]Label.tipLabel = \ foreground: $Label.tipColor +[style]Label.warningTipLabel = \ + foreground: $Label.warningColor + [style]Button.plainButton = \ border: null; \ background: null; \ diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties index 2a10d13c7f..e69042470d 100644 --- a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties +++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties @@ -9,7 +9,7 @@ com.fr.design.version.detail.label=450*30 com.fr.design.version.detail.dialog=600*500 com.fr.env.SyncFailedPluginsDialog.messageWithLink=316*20 com.fr.design.web.pane.text.field=450*20 -com.fr.design.actions.server.dialog=700*630 +com.fr.design.actions.server.dialog=660*600 com.fr.design.report.fit.templatePane.dialog=600*400 com.fr.design.report.fit.firstColumn=80*20 com.fr.design.report.fit.column=100*20 @@ -22,7 +22,7 @@ com.fr.design.ds.column.sort.pane=220*150 com.fr.design.sort.expand.header.pane=108*10 com.fr.design.plugin.remind.PluginInvalidateRemindDialog.dialog=600*500 com.fr.design.plugin.remind.PluginInvalidateRemindDialog.centerPane=580*369 -com.fr.design.report.WatermarkSettingPane=720*600 +com.fr.design.report.WatermarkSettingPane=660*600 com.fr.design.file.MultiTemplateTabPane.popUpMenu=170*65 com.fr.design.formula.FormulaPane=900*600 com.fr.design.formula.FormulaPaneWhenReserveFormula=900*600 diff --git a/designer-realize/src/main/java/com/fr/design/javascript/ListenerEditPane.java b/designer-realize/src/main/java/com/fr/design/javascript/ListenerEditPane.java index 0567078968..a2e948ac3c 100644 --- a/designer-realize/src/main/java/com/fr/design/javascript/ListenerEditPane.java +++ b/designer-realize/src/main/java/com/fr/design/javascript/ListenerEditPane.java @@ -17,6 +17,7 @@ import com.fr.design.write.submit.DBManipulationPane; import com.fr.form.event.Listener; import com.fr.js.JavaScript; import com.fr.report.web.util.ReportEngineEventMapping; +import com.fr.web.core.cid.data.BrowserAccessDetail; import com.fr.write.JavaScriptResourceInfo; import javax.swing.BorderFactory; @@ -32,6 +33,11 @@ import java.util.Arrays; import java.util.List; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + public class ListenerEditPane extends BasicBeanPane { private UITextField nameText; private UIComboBox styleBox; @@ -66,10 +72,11 @@ public class ListenerEditPane extends BasicBeanPane { public void initComponents(String[] defaultArgs) { cards = new ArrayList<>(); this.setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel namePane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); nameText = new UITextField(8); nameText.setEditable(false); - namePane.add(nameText, BorderLayout.WEST); + //namePane.add(nameText, BorderLayout.WEST); final List style = new ArrayList<>(Arrays.asList(JS, DBCOMMIT, CUSTOMACTION, EMAIL, MOBILEPOPUP)); styleBox = new UIComboBox(style.toArray()); boolean workbook = DesignerContext.getDesignerFrame().getSelectedJTemplate().isJWorkBook(); @@ -77,15 +84,14 @@ public class ListenerEditPane extends BasicBeanPane { style.add(EXPORT); } styleBox = new UIComboBox(style.toArray()); - namePane.add(styleBox); - namePane = GUICoreUtils.createFlowPane(new Component[]{ - new UILabel(" " + Toolkit.i18nText("Fine-Design_Report_Event_Name") + ":"), - nameText, - new UILabel(" " + Toolkit.i18nText("Fine-Design_Report_Event_Type") + ":"), - styleBox}, - FlowLayout.LEFT); - namePane.setBorder(BorderFactory.createTitledBorder(Toolkit.i18nText("Fine-Design_Report_Event_Name_Type"))); - this.add(namePane, BorderLayout.NORTH); + //namePane.add(styleBox); + + JPanel eventName = row(10, cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event_Name"))), cell(nameText)).getComponent(); + JPanel eventType = row(10, cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event_Type"))), cell(styleBox)).getComponent(); + namePane = row(cell(eventName).weight(0.3), cell(eventType).weight(0.4), flex(0.3)).getComponent(); + + this.add(wrapComponentWithTitle(namePane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event_Name_Type")), BorderLayout.NORTH); + card = new CardLayout(); hyperlinkPane = FRGUIPaneFactory.createCardLayout_S_Pane(); hyperlinkPane.setLayout(card); diff --git a/designer-realize/src/main/java/com/fr/design/report/ExcelExportPane.java b/designer-realize/src/main/java/com/fr/design/report/ExcelExportPane.java index e00b5e22a4..466e790f7b 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ExcelExportPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ExcelExportPane.java @@ -1,6 +1,9 @@ package com.fr.design.report; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIRadioButton; @@ -14,14 +17,15 @@ import com.fr.io.attr.ExcelExportAttr; import com.fr.stable.StringUtils; import javax.swing.AbstractButton; -import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JPanel; -import java.awt.Color; -import java.awt.Dimension; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.*; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + public class ExcelExportPane extends BasicPane { private UICheckBox isExportHidedRow; private UICheckBox isExportHidenColumn; @@ -48,81 +52,52 @@ public class ExcelExportPane extends BasicPane { } protected void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - JPanel outPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane("Excel" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportD_Excel_Export")); - JPanel outNorthPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Export_Setting")); - outNorthPane.setPreferredSize(new Dimension(580, 85)); - this.add(outPane); - outPane.add(outNorthPane); + this.setLayout(new BorderLayout()); isExportHidedRow = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportD_Export_Hided_Row")); isExportHidedRow.setSelected(false); - outNorthPane.add(isExportHidedRow); isExportHidenColumn = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportD_Export_Hided_Column")); isExportHidenColumn.setSelected(false); - outNorthPane.add(isExportHidenColumn); - // 内容保护 - JPanel outSouthPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Export_Content_Protect")); - outSouthPane.setPreferredSize(new Dimension(580, 280)); - outPane.add(outSouthPane); + JPanel exportSettingPane = column(LayoutConstants.VERTICAL_GAP, row(cell(isExportHidedRow)), row(cell(isExportHidenColumn))).getComponent(); + // 文件保护 fileProtect = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Export_File_Protect"), false); - outSouthPane.add(fileProtect); // 文件密码和密码框 passwordWritePane = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); - JPanel passwordWriteFlowPane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); UILabel filePassword = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_File_Password")); - passwordWriteFlowPane.add(filePassword); passwordField = new UITextField(11); - passwordWriteFlowPane.add(passwordField); - passwordWritePane.add(passwordWriteFlowPane); fileProtect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - if (fileProtect.isSelected()) { - passwordWritePane.setVisible(true); - } else { - passwordWritePane.setVisible(false); - } + passwordWritePane.setVisible(fileProtect.isSelected()); } - }); - outSouthPane.add(passwordWritePane); + passwordWritePane.add(row(cell(filePassword), fix(5), cell(passwordField)) + .with(it->it.setBorder(new ScaledEmptyBorder(0,20,0,0))).getComponent()); + // 编辑保护 writeProtect = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Export_Write_Protect"), false); - outSouthPane.add(writeProtect); // 编辑保护勾选后展示的内容 writeProtectPane = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); - outSouthPane.add(writeProtectPane); // 工作表密码 workbookPassword = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sheet_Password"), true); - JPanel protectedWordPane =FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); protectedField = new UITextField(11); - protectedWordPane.add(workbookPassword); - protectedWordPane.add(protectedField); + // 仅限预览 onlyForPreview = new UIRadioButton(Toolkit.i18nText("Fine-Design_Report_Export_Only_For_Preview")); - JPanel onlyForPreviewPane =FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); - onlyForPreviewPane.add(onlyForPreview); wrapButtonsInButtonGroup(workbookPassword, onlyForPreview); - writeProtectPane.add(protectedWordPane); - writeProtectPane.add(onlyForPreviewPane); + writeProtectPane.add(column(LayoutConstants.VERTICAL_GAP, + row(cell(workbookPassword), fix(5), cell(protectedField)), + row(cell(onlyForPreview)) + ).with(it-> it.setBorder(new ScaledEmptyBorder(0,20,0,0) )).getComponent()); writeProtect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - if (writeProtect.isSelected()) { - writeProtectPane.setVisible(true); - } else { - writeProtectPane.setVisible(false); - } + writeProtectPane.setVisible(writeProtect.isSelected()); } }); // 导出水印 exportWaterMark = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Export_WaterMark"), false); - outSouthPane.add(exportWaterMark); - - JPanel tips = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(5, 5, 0); UILabel uiLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Export_WaterMark_Tips")); - uiLabel.setForeground(Color.GRAY); + FineUIStyle.setStyle(uiLabel, FineUIStyle.LABEL_TIP); ActionLabel actionLabel = new ActionLabel(Toolkit.i18nText("Fine-Design_Report_Export_WaterMark_Use"), UIConstants.FLESH_BLUE); actionLabel.addActionListener(new ActionListener() { @Override @@ -133,10 +108,31 @@ public class ExcelExportPane extends BasicPane { exportWaterMark.setSelected(true); } }); - tips.add(uiLabel); - tips.add(actionLabel); - outSouthPane.add(tips); + //内容保护 + JPanel contextProtectPane = column(LayoutConstants.VERTICAL_GAP, + cell(fileProtect), + cell(passwordWritePane), + cell(writeProtect), + cell(writeProtectPane), + cell(exportWaterMark), + row(cell(uiLabel), cell(actionLabel)) + ).getComponent(); + + JPanel centerPanel = column(LayoutConstants.VERTICAL_GAP, + row(20, + cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Setting"))), + cell(exportSettingPane).weight(1) + ), + row(20, + cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Content_Protect"))), + cell(contextProtectPane).weight(1) + ) + ).getComponent(); + this.add(wrapComponentWithTitle(centerPanel, "Excel" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportD_Excel_Export"))); + } + private JPanel getTopAlignLabelPane(String labelText) { + return column(LayoutConstants.VERTICAL_GAP, cell(new UILabel(labelText))).with(it-> it.setBorder(new ScaledEmptyBorder(2,0,0,0))).getComponent(); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java b/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java index 9c07bd157b..baf77a48df 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java @@ -1,17 +1,18 @@ package com.fr.design.report; +import com.fine.theme.utils.FineUIUtils; import com.fr.base.CustomConfig; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.io.attr.ReportExportAttr; import com.fr.transaction.Configurations; import com.fr.transaction.WorkerFacade; -import javax.swing.BorderFactory; -import javax.swing.JPanel; +import java.awt.*; + +import static com.fine.swing.ui.layout.Layouts.*; /** * 通用 @@ -38,17 +39,15 @@ public class ExportUniversalPane extends BasicPane { private UICheckBox passwordSupportFormula; public ExportUniversalPane() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - JPanel outerNorthPane = FRGUIPaneFactory.createTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Universal_Export_Config")); - JPanel northPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - JPanel passwordSupportPane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); + this.setLayout(new BorderLayout()); passwordSupportFormula = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Universal_Export_Password_Support_Formula")); passwordSupportFormula.setSelected(false); - passwordSupportPane.add(passwordSupportFormula); - northPane.add(passwordSupportPane); - outerNorthPane.add(northPane); - this.add(outerNorthPane); + + this.add( + FineUIUtils.wrapComponentWithTitle((column(10, + cell(passwordSupportFormula) + ).getComponent()), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Universal_Export_Config"))); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/report/ImageExportPane.java b/designer-realize/src/main/java/com/fr/design/report/ImageExportPane.java index ba4eccb63a..09bb494aa0 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ImageExportPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ImageExportPane.java @@ -1,23 +1,22 @@ package com.fr.design.report; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.extension.FileExtension; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.io.attr.ImageExportAttr; import com.fr.io.attr.ReportExportAttr; import javax.swing.AbstractButton; -import javax.swing.BorderFactory; import javax.swing.ButtonGroup; -import javax.swing.JComponent; import javax.swing.JPanel; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; +import java.awt.*; + +import static com.fine.swing.ui.layout.Layouts.*; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; /** * 导出图片配置 @@ -49,40 +48,37 @@ public class ImageExportPane extends AbstractExportPane { public static final String GLOBAL_CONF = Toolkit.i18nText("Fine-Design_Image_Export_Setting"); public ImageExportPane() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - JPanel globalTitlePane = FRGUIPaneFactory.createTitledBorderPane(GLOBAL_CONF); - JPanel outNorthPane = FRGUIPaneFactory.createTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Export_Setting")); - outNorthPane.setPreferredSize(new Dimension(580, 230)); + this.setLayout(new BorderLayout()); UILabel tipLabel = new UILabel(Toolkit.i18nText("Fine-Design_Image_Export_Tips")); - tipLabel.setForeground(Color.GRAY); - JPanel tipsTitlePane = new JPanel(); - tipsTitlePane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); - tipsTitlePane.setLayout(FRGUIPaneFactory.createBorderLayout()); - tipsTitlePane.add(tipLabel); - this.add(globalTitlePane); - globalTitlePane.add(outNorthPane); + FineUIStyle.setStyle(tipLabel, FineUIStyle.LABEL_TIP); initGlobalSettings(); - - JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - JComponent[][] comps = { - {new UILabel(Toolkit.i18nText("Fine-Design_Image_Export_Resolution") + ":"), this.globalResolutionBtnS, this.globalResolutionBtnM, this.globalResolutionBtnL}, - {new UILabel(Toolkit.i18nText("Fine-Design_Report_Format") + ":"), this.globalFormatJpg, null, this.globalFormatPng}, - {new UILabel(Toolkit.i18nText("Fine-Design_Image_Export_Rendering_Quality") + ":"), this.globalRenderQuality, null, this.globalRenderSpeed}, - {new UILabel(Toolkit.i18nText("Fine-Design_Image_Export_Typesetting") + ":"), this.templateThumbnail, null, this.templatePaging} - }; - centerPane.add( - TableLayoutHelper.createCommonTableLayoutPane( - comps, - new double[]{TableLayout.FILL, TableLayout.FILL, TableLayout.FILL, TableLayout.FILL}, - new double[]{TableLayout.FILL, TableLayout.FILL, TableLayout.FILL, TableLayout.FILL}, - GAP), - BorderLayout.CENTER); - centerPane.add(tipsTitlePane,BorderLayout.SOUTH); - outNorthPane.add(centerPane, BorderLayout.CENTER); + Component centerPane = column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel(Toolkit.i18nText("Fine-Design_Image_Export_Resolution") + ":")).weight(0.4), + cell(this.globalResolutionBtnS).weight(0.4), + cell(this.globalResolutionBtnM).weight(0.4), + cell(this.globalResolutionBtnL).weight(0.4), + flex()), + row(cell(new UILabel(Toolkit.i18nText("Fine-Design_Report_Format") + ":")).weight(0.4), + cell(this.globalFormatJpg).weight(0.8), + cell(this.globalFormatPng).weight(0.4), + flex()), + row(cell(new UILabel(Toolkit.i18nText("Fine-Design_Image_Export_Rendering_Quality") + ":")).weight(0.4), + cell(this.globalRenderQuality).weight(0.8), + cell(this.globalRenderSpeed).weight(0.4), + flex()), + row(cell(new UILabel(Toolkit.i18nText("Fine-Design_Image_Export_Typesetting") + ":")).weight(0.4), + cell(this.templateThumbnail).weight(0.8), + cell(this.templatePaging).weight(0.4), + flex()), + cell(tipLabel) + ).getComponent(); + + this.add(wrapComponentWithTitle( + row(GAP, cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Setting"))), + cell(centerPane).weight(1) + ).getComponent(), com.fr.design.i18n.Toolkit.i18nText(GLOBAL_CONF))); } - private void initGlobalSettings() { globalResolutionBtnS = new UIRadioButton("96dpi"); globalResolutionBtnM = new UIRadioButton("192dpi", true); @@ -111,6 +107,10 @@ public class ImageExportPane extends AbstractExportPane { } } + private JPanel getTopAlignLabelPane(String labelText) { + return column(LayoutConstants.VERTICAL_GAP, cell(new UILabel(labelText))).with(it-> it.setBorder(new ScaledEmptyBorder(2,0,0,0))).getComponent(); + } + /** * 展示界面 */ diff --git a/designer-realize/src/main/java/com/fr/design/report/PDFExportPane.java b/designer-realize/src/main/java/com/fr/design/report/PDFExportPane.java index f8e5767478..09ea418948 100644 --- a/designer-realize/src/main/java/com/fr/design/report/PDFExportPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/PDFExportPane.java @@ -1,8 +1,10 @@ package com.fr.design.report; +import com.fine.theme.utils.FineUIUtils; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; @@ -11,10 +13,13 @@ import com.fr.stable.StringUtils; import javax.swing.BorderFactory; import javax.swing.JPanel; -import java.awt.Dimension; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.*; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + public class PDFExportPane extends BasicPane { private UICheckBox isNeedPassword; private UITextField passwordField; @@ -25,20 +30,9 @@ public class PDFExportPane extends BasicPane { } protected void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - JPanel outPane =FRGUIPaneFactory.createTopVerticalTitledBorderPane("PDF" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportD_Excel_Export")); - this.add(outPane); - // 内容保护 - JPanel outNorthPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Export_Content_Protect")); - outNorthPane.setPreferredSize(new Dimension(580, 100)); - outPane.add(outNorthPane); - + this.setLayout(new BorderLayout()); isNeedPassword = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_File_Password"), false); - JPanel passwordPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - passwordPane.add(isNeedPassword); - passwordWritePane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - passwordPane.add(passwordWritePane); + passwordWritePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); passwordField = new UITextField(11); passwordWritePane.add(passwordField); isNeedPassword.addActionListener(new ActionListener() { @@ -46,8 +40,12 @@ public class PDFExportPane extends BasicPane { passwordWritePane.setVisible(isNeedPassword.isSelected()); } }); - outNorthPane.add(passwordPane); - } + Component contextProtectPane = row(20, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Content_Protect"))), + row(cell(isNeedPassword), fix(5), cell(passwordWritePane)) + ).getComponent(); + this.add(wrapComponentWithTitle(contextProtectPane, "PDF" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportD_Excel_Export"))); + } @Override protected String title4PopupWindow() { diff --git a/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java b/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java index 3074bb009a..dcf09ef281 100644 --- a/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java @@ -20,11 +20,11 @@ import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.*; - -import com.fr.design.gui.ispinner.ColumnRowSpinner; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.gui.frpane.FineTabbedPane; import com.fr.page.PaperSettingProvider; import com.fr.page.ReportSettingsProvider; -import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; @@ -59,6 +59,9 @@ import com.fr.stable.unit.INCH; import com.fr.stable.unit.MM; import com.fr.design.utils.gui.GUICoreUtils; +import static com.fine.swing.ui.layout.Layouts.*; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + /** * @author richer * @since 6.5.5 创建于2011-6-14 页面设置面板 @@ -74,14 +77,12 @@ public class PageSetupPane extends BasicPane { } private void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - UITabbedPane centerTabbedPane = new UITabbedPane(); - this.add(centerTabbedPane, BorderLayout.CENTER); - + this.setLayout(new BorderLayout()); pagePane = new PagePane(); otherPane = new OtherPane(); - centerTabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Page"), pagePane); - centerTabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Other"), otherPane); + FineTabbedPane tabbedPane = FineTabbedPane.builder().addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Page"), pagePane) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Other"), otherPane).build(); + this.add(tabbedPane, BorderLayout.CENTER); } @Override @@ -149,61 +150,39 @@ public class PageSetupPane extends BasicPane { private Report report; public PagePane() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - - JPanel defaultPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - this.add(defaultPane, BorderLayout.NORTH); - JPanel twoPane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); - twoPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - JPanel orientationPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Page_Setup_Orientation")); - JPanel innerorientationPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - orientationPane.add(innerorientationPane); - twoPane.add(orientationPane); - - JPanel portraitpanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + this.setLayout(new BorderLayout()); + + //方向 portraitRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Portrait")); portraitRadioButton.setMnemonic('t'); - portraitpanel.add(portraitRadioButton); - innerorientationPane.add(portraitpanel); portraitRadioButton.addActionListener(previewListener); - - JPanel landscapepanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); landscapeRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Landscape")); - innerorientationPane.add(landscapepanel); landscapeRadioButton.setMnemonic('L'); - landscapepanel.add(landscapeRadioButton); landscapeRadioButton.addActionListener(previewListener); ButtonGroup layoutButtonGroup = new ButtonGroup(); layoutButtonGroup.add(portraitRadioButton); layoutButtonGroup.add(landscapeRadioButton); - portraitRadioButton.setSelected(true); + JPanel orientationPane = column(LayoutConstants.VERTICAL_GAP, cell(portraitRadioButton), cell(landscapeRadioButton)).getComponent(); - JPanel spp = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview")); showPagePane = new ShowPagePane(); - spp.add(showPagePane); - defaultPane.add(spp); - defaultPane.add(twoPane); + Component spp = wrapComponentWithTitle( + row(cell(showPagePane), + flex()).getComponent(), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview") + ); // paper size - JPanel paperSizePane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Paper_Size")); - JPanel innerpaperSizePane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - paperSizePane.add(innerpaperSizePane); - defaultPane.add(paperSizePane); - - - predefinedRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Predefined") + ":"); + predefinedRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Predefined")); predefinedRadioButton.setMnemonic('P'); predefinedRadioButton.addActionListener(previewListener); - - customRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Custom") + ":"); + customRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Custom")); customRadioButton.setMnemonic('C'); customRadioButton.addActionListener(previewListener); predefinedComboBox = new UIComboBox(); - paperWidthSpinner = new UIBasicSpinner(new SpinnerNumberModel(0.0, 0.0, Double.MAX_VALUE, 1.0)); ((JSpinner.DefaultEditor) paperWidthSpinner.getEditor()).getTextField().setColumns(7); paperHeightSpinner = new UIBasicSpinner(new SpinnerNumberModel(0.0, 0.0, Double.MAX_VALUE, 1.0)); @@ -214,7 +193,6 @@ public class PageSetupPane extends BasicPane { txt = ((JSpinner.NumberEditor) paperHeightSpinner.getEditor()).getTextField(); ((NumberFormatter) txt.getFormatter()).setAllowsInvalid(false); - unitLabel = new UnitFieldPane.UnitLabel(Constants.UNIT_MM, paperHeightSpinner.getPreferredSize().height); String[] inch = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unit_MM"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unit_INCH")}; @@ -238,35 +216,28 @@ public class PageSetupPane extends BasicPane { Object[] tmpPaperSizeNameArray = ReportConstants.PaperSizeNameSizeArray[i]; predefinedComboBox.addItem(tmpPaperSizeNameArray[1]); } - - // tow radio buttons. - JPanel radioButtonPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - innerpaperSizePane.add(radioButtonPane); - - radioButtonPane.add(predefinedRadioButton); - radioButtonPane.add(predefinedComboBox); - ButtonGroup paperSizeRadioButtonGroup = new ButtonGroup(); paperSizeRadioButtonGroup.add(predefinedRadioButton); paperSizeRadioButtonGroup.add(customRadioButton); - // size and textfields. - JPanel paperSizeRightPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - innerpaperSizePane.add(paperSizeRightPane); - - paperSizeRightPane.add(customRadioButton); - paperSizeRightPane.add(paperWidthSpinner); - paperSizeRightPane.add(new UILabel("x")); - paperSizeRightPane.add(paperHeightSpinner); - paperSizeRightPane.add(switchInch); - + // tow radio buttons. + JPanel innerPaperSizePane = column(10, + row(10, cell(predefinedRadioButton), cell(predefinedComboBox).weight(0.8), flex()), + row(cell(customRadioButton), + fix(10), + cell(paperWidthSpinner).weight(0.4), + fix(5), + cell(new UILabel("x")), + fix(5), + cell(paperHeightSpinner).weight(0.4), + fix(5), + cell(switchInch).weight(0.4), + flex() + ) + ).getComponent(); + Component paperSizePane = wrapComponentWithTitle(innerPaperSizePane,com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Paper_Size")); // peter:设置边距.. - JPanel outermarginPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Margin")); - JPanel marginPane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_M_Pane(); - outermarginPane.add(marginPane); - twoPane.add(outermarginPane); - StringBuffer temp = new StringBuffer(); for (int i = 0; i < 11; i++) { temp.append(" "); @@ -275,70 +246,50 @@ public class PageSetupPane extends BasicPane { zeroMarginWarn.setForeground(Color.RED); // left - JPanel marginLeftPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - marginPane.add(marginLeftPane); - - JPanel marginLeftTextPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - marginLeftPane.add(marginLeftTextPane); - marginLeftTextPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Top_Duplicate") + ":")); marginTopUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - marginLeftTextPane.add(marginTopUnitFieldPane); - JPanel marginLeftUnitPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - marginLeftPane.add(marginLeftUnitPane); - marginLeftUnitPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bottom") + ":")); marginBottomUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - marginLeftUnitPane.add(marginBottomUnitFieldPane); - - // right - JPanel marginRightPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - marginPane.add(marginRightPane); + JPanel marginLeftPane = column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Top_Duplicate") + ":")), cell(marginTopUnitFieldPane)), + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bottom") + ":")), cell(marginBottomUnitFieldPane)) + ).getComponent(); // peter:这个一个垂直的上下的字符panel. - JPanel marginRightTextPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - marginRightPane.add(marginRightTextPane); - marginRightTextPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Left") + ":")); marginLeftUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - marginRightTextPane.add(marginLeftUnitFieldPane); - - JPanel marginRightUnitPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - marginRightPane.add(marginRightUnitPane); - marginRightUnitPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Right") + ":")); marginRightUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - marginRightUnitPane.add(marginRightUnitFieldPane); + JPanel marginRightPane = column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Left") + ":")), cell(marginLeftUnitFieldPane)), + row( cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Right") + ":")), cell(marginRightUnitFieldPane)) + ).getComponent(); marginTopUnitFieldPane.getTextField().addFocusListener(fa); marginBottomUnitFieldPane.getTextField().addFocusListener(fa); marginLeftUnitFieldPane.getTextField().addFocusListener(fa); marginRightUnitFieldPane.getTextField().addFocusListener(fa); + JPanel marginPane = row(24, cell(marginLeftPane), cell(marginRightPane), cell(zeroMarginWarn)).getComponent(); - marginPane.add(zeroMarginWarn); - - // header and footer - JPanel outhfHeightPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Height")); - JPanel hfHeightPane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); - defaultPane.add(outhfHeightPane); - outhfHeightPane.add(hfHeightPane); - - // header height. - JPanel headerHeightPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - hfHeightPane.add(headerHeightPane); - headerHeightPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Header") + ":")); + //方向-页边距 + JPanel twoPane = row(10, + cell(wrapComponentWithTitle(orientationPane,com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Page_Setup_Orientation"))).weight(0.25), + cell(wrapComponentWithTitle(marginPane,com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Margin"))).weight(0.8) + ).getComponent(); + //高度 headerUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - headerHeightPane.add(headerUnitFieldPane); - - // footer height. - JPanel footerHeightPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - hfHeightPane.add(footerHeightPane); - footerHeightPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Footer") + ":")); - footerUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - footerHeightPane.add(footerUnitFieldPane); + JPanel hfHeightPane = row( + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Header"))), cell(headerUnitFieldPane)), + fix(24), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Footer"))), cell(footerUnitFieldPane)) + ).getComponent(); + Component heightPane = wrapComponentWithTitle(hfHeightPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Height")); // print gridlines. - JPanel printOptionPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(1); - defaultPane.add(printOptionPane); - printOptionPane.setBorder(BorderFactory.createEmptyBorder(4, 0, 0, 0)); + Component defaultPane = column(LayoutConstants.VERTICAL_GAP, cell(spp), cell(twoPane), cell(paperSizePane), cell(heightPane)).getComponent(); + + JPanel workPanel = new JPanel(new BorderLayout()); + workPanel.add(defaultPane); + workPanel.setBorder(new ScaledEmptyBorder(10,10,10,10)); + this.add(workPanel); } @Override @@ -387,11 +338,6 @@ public class PageSetupPane extends BasicPane { } }; - /** - * Populate - * - * @param reportSettings rpt settings. - */ public void populate(Report report, int unitType) { this.report = report; ReportSettingsProvider reportSettings = report.getReportSettings(); @@ -602,13 +548,11 @@ public class PageSetupPane extends BasicPane { * Create icon radio pane for Portrait and Landscape. */ private JPanel createIconRadioPane(Icon icon, UIRadioButton radioButton) { - JPanel iconRadioPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); -// iconRadioPane.setLayout(FRGUIPaneFactory.createCenterFlowLayout()); - iconRadioPane.add(new UILabel(icon)); - iconRadioPane.add(radioButton); - - return iconRadioPane; + return column( + cell(new UILabel(icon)), + cell(radioButton) + ).getComponent(); } /** @@ -881,80 +825,76 @@ public class PageSetupPane extends BasicPane { private UIRadioButton isShrinkToFit4Width; public OtherPane() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - - JPanel defaultPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - this.add(defaultPane, BorderLayout.NORTH); - - // page order - JPanel outpageOrderPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Page_Order")); - JPanel pageOrderPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); - outpageOrderPane.add(pageOrderPane); - defaultPane.add(outpageOrderPane); - + this.setLayout(new BorderLayout()); + // page order 分页顺序 Icon topBottomIcon = BaseUtils.readIcon("/com/fr/base/images/dialog/pagesetup/down.png"); topBottomRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Top_To_Bottom"),false,false); - pageOrderPane.add(FRGUIPaneFactory.createIconRadio_S_Pane(topBottomIcon, topBottomRadioButton)); topBottomRadioButton.setMnemonic('B'); Icon leftRightIcon = BaseUtils.readIcon("/com/fr/base/images/dialog/pagesetup/over.png"); leftRightRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Left_To_Right"), false, false); - pageOrderPane.add(FRGUIPaneFactory.createIconRadio_S_Pane(leftRightIcon, leftRightRadioButton)); leftRightRadioButton.setMnemonic('R'); - ButtonGroup pageOrderButtonGroup = new ButtonGroup(); pageOrderButtonGroup.add(topBottomRadioButton); pageOrderButtonGroup.add(leftRightRadioButton); - topBottomRadioButton.setSelected(true); - // center on page - JPanel outcenterOnPagePane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Placement_Center_On_Page")); - JPanel centerOnPagePane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); - outcenterOnPagePane.add(centerOnPagePane); - defaultPane.add(outcenterOnPagePane); - + JPanel pageOrderPane = row( + cell(new UILabel(topBottomIcon)), + cell(topBottomRadioButton), + fix(20), + cell(new UILabel(leftRightIcon)), + cell(leftRightRadioButton) + ).getComponent(); + Component outPageOrderPane = wrapComponentWithTitle(pageOrderPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Page_Order")); + // center on page 居中方式 this.horizonalCenterCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Horizontally"), false, false); this.horizonalCenterCheckBox.setMnemonic('H'); this.verticalCenterCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Vertically"), false, false); this.verticalCenterCheckBox.setMnemonic('V'); + JPanel centerOnPagePane = row(LayoutConstants.HORIZONTAL_GAP, + cell(GUICoreUtils.createFlowPane(horizonalCenterCheckBox, FlowLayout.CENTER)), + cell(GUICoreUtils.createFlowPane(verticalCenterCheckBox, FlowLayout.CENTER)) + ).getComponent(); + Component outCenterOnPagePane = wrapComponentWithTitle(centerOnPagePane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Placement_Center_On_Page")); - centerOnPagePane.add(GUICoreUtils.createFlowPane(horizonalCenterCheckBox, FlowLayout.CENTER)); - centerOnPagePane.add(GUICoreUtils.createFlowPane(verticalCenterCheckBox, FlowLayout.CENTER)); - - // first page number. - JPanel firstPaneNumberPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - defaultPane.add(firstPaneNumberPane); - - firstPaneNumberPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_First_Page_Number") + ": ")); + // first page number. 起始页码 // marks: 这个地方必须为大于零的整数 firstPageNumberSpinner = new UISpinner(1, Integer.MAX_VALUE, 1, 1); - firstPaneNumberPane.add(firstPageNumberSpinner); + JPanel firstPaneNumberPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_First_Page_Number"))), + cell(firstPageNumberSpinner) + ).getComponent(); - defaultPane.add(Box.createVerticalStrut(4)); - - // print gridlines. - JPanel printOptionPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(1); - defaultPane.add(printOptionPane); - printOptionPane.setBorder(BorderFactory.createEmptyBorder(4, 0, 0, 0)); - - JPanel autoShrinkPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - autoShrinkPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Shrink_To_Fit_Content"))); + // print gridlines. 根据单元格内容自动调整 isShrinkToFit4None = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No")); isShrinkToFit4Height = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Row_Height")); isShrinkToFit4Width = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Column_Width")); - ButtonGroup bp = new ButtonGroup(); - autoShrinkPane.add(isShrinkToFit4None); - autoShrinkPane.add(isShrinkToFit4Height); - autoShrinkPane.add(isShrinkToFit4Width); bp.add(isShrinkToFit4None); bp.add(isShrinkToFit4Height); bp.add(isShrinkToFit4Width); - - printOptionPane.add(autoShrinkPane); + JPanel autoShrinkPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Shrink_To_Fit_Content"))), + cell(isShrinkToFit4None), + cell(isShrinkToFit4Height), + cell(isShrinkToFit4Width) + ).getComponent(); + + //整体布局 + JPanel defaultPane = column(LayoutConstants.HORIZONTAL_GAP, + cell(outPageOrderPane), + cell(outCenterOnPagePane), + cell(firstPaneNumberPane), + cell(autoShrinkPane) + ).getComponent(); + + JPanel workPanel = new JPanel(new BorderLayout()); + workPanel.add(defaultPane); + workPanel.setBorder(new ScaledEmptyBorder(10,10,10,10)); + this.add(workPanel); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/report/ReportExportAttrPane.java b/designer-realize/src/main/java/com/fr/design/report/ReportExportAttrPane.java index cd992c3fdf..9256e3e103 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ReportExportAttrPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ReportExportAttrPane.java @@ -1,10 +1,11 @@ package com.fr.design.report; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicStorePane; import com.fr.design.dialog.BasicPane; import com.fr.design.fun.ExportAttrTabProvider; -import com.fr.design.gui.frpane.UITabbedPane; +import com.fr.design.gui.frpane.FineTabbedPane; import com.fr.design.i18n.Toolkit; import com.fr.io.attr.ReportExportAttr; @@ -15,7 +16,8 @@ import java.util.Set; public class ReportExportAttrPane extends BasicPane { - UITabbedPane uiTabbedPane; + FineTabbedPane uiTabbedPane; + FineTabbedPane.TabPaneBuilder tabPaneBuilder; private ExcelExportPane excelExportPane; private PDFExportPane pdfExportPane; private WordExportPane wordExportPane; @@ -23,31 +25,28 @@ public class ReportExportAttrPane extends BasicPane { private List> paneList; public ReportExportAttrPane() { - uiTabbedPane = new UITabbedPane(); this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - exportUniversalPane = new ExportUniversalPane(); - uiTabbedPane.addTab(Toolkit.i18nText("Fine-Design_Report_Universal_Export"), exportUniversalPane); - excelExportPane = new ExcelExportPane(); - uiTabbedPane.addTab("Excel", excelExportPane); - pdfExportPane = new PDFExportPane(); - uiTabbedPane.addTab("PDF", pdfExportPane); - wordExportPane = new WordExportPane(); - uiTabbedPane.addTab("Word", wordExportPane); + this.setBorder(new ScaledEmptyBorder(10,10,10,10)); + tabPaneBuilder = FineTabbedPane.builder() + .addTab(Toolkit.i18nText("Fine-Design_Report_Universal_Export"), exportUniversalPane = new ExportUniversalPane()) + .addTab("Excel", excelExportPane = new ExcelExportPane()) + .addTab("PDF", pdfExportPane = new PDFExportPane()) + .addTab("Word", wordExportPane = new WordExportPane()); Set providers = ExtraDesignClassManager.getInstance().getArray(ExportAttrTabProvider.XML_TAG); paneList = new ArrayList<>(); initPane(new ImageExportPane()); for (ExportAttrTabProvider provider : providers) { BasicStorePane storePane = provider.toServiceComponent(); - uiTabbedPane.addTab(storePane.getTitle(), storePane); + tabPaneBuilder.addTab(storePane.getTitle(), storePane); paneList.add(storePane); } + uiTabbedPane = tabPaneBuilder.build(); this.add(uiTabbedPane); } private void initPane(BasicStorePane exportPane) { - uiTabbedPane.addTab(exportPane.getTitle(), exportPane); - paneList.add(exportPane); + tabPaneBuilder.addTab(new ImageExportPane().getTitle(), new ImageExportPane()); + paneList.add(new ImageExportPane()); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/report/WordExportPane.java b/designer-realize/src/main/java/com/fr/design/report/WordExportPane.java index c252a4e627..849fe30b0c 100644 --- a/designer-realize/src/main/java/com/fr/design/report/WordExportPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/WordExportPane.java @@ -1,6 +1,9 @@ package com.fr.design.report; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIRadioButton; @@ -15,14 +18,16 @@ import com.fr.io.attr.WordExportAttr; import com.fr.stable.StringUtils; import javax.swing.AbstractButton; -import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JPanel; -import java.awt.Color; -import java.awt.Dimension; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.*; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + public class WordExportPane extends BasicPane { private UICheckBox isExportAsTable; // 编辑保护 @@ -43,46 +48,31 @@ public class WordExportPane extends BasicPane { } protected void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - JPanel outPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane("Word" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportD_Excel_Export")); - JPanel outNorthPane =FRGUIPaneFactory.createTopVerticalTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Export_Setting")); - outNorthPane.setPreferredSize(new Dimension(580, 110)); - this.add(outPane); - outPane.add(outNorthPane); + this.setLayout(new BorderLayout()); isExportAsTable = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Is_Need_Word_Adjust"), false); - MultilineLabel wordLineLabel = new MultilineLabel(); - wordLineLabel.setPreferredSize(new Dimension(560, 50)); wordLineLabel.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Alert_Word")); - wordLineLabel.setForeground(Color.GRAY); - - outNorthPane.add(isExportAsTable); - outNorthPane.add(wordLineLabel); - // 内容保护 - JPanel outSouthPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Export_Content_Protect")); - outSouthPane.setPreferredSize(new Dimension(580, 250)); - outPane.add(outSouthPane); + wordLineLabel.setForeground(Color.GRAY); + + JPanel exportSettingPane = new JPanel(new BorderLayout()); + exportSettingPane.add(column(LayoutConstants.VERTICAL_GAP, cell(isExportAsTable), cell(wordLineLabel)).getComponent()); // 编辑保护 writeProtect = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Export_Write_Protect"), false); - outSouthPane.add(writeProtect); // 编辑保护勾选后展示的内容 writeProtectPane = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); - outSouthPane.add(writeProtectPane); // 工作表密码 workbookPassword = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sheet_Password"), true); - JPanel protectedWordPane =FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); protectedField = new UITextField(11); - protectedWordPane.add(workbookPassword); - protectedWordPane.add(protectedField); + // 仅限预览 onlyForPreview = new UIRadioButton(Toolkit.i18nText("Fine-Design_Report_Export_Only_For_Preview")); - JPanel onlyForPreviewPane =FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); - onlyForPreviewPane.add(onlyForPreview); wrapButtonsInButtonGroup(workbookPassword, onlyForPreview); - writeProtectPane.add(protectedWordPane); - writeProtectPane.add(onlyForPreviewPane); + writeProtectPane.add(column(LayoutConstants.VERTICAL_GAP, + row(cell(workbookPassword), fix(5), cell(protectedField)), + row(cell(onlyForPreview)) + ).with(it-> it.setBorder(new ScaledEmptyBorder(0,20,0,0) )).getComponent()); + writeProtect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (writeProtect.isSelected()) { @@ -91,15 +81,11 @@ public class WordExportPane extends BasicPane { writeProtectPane.setVisible(false); } } - }); // 导出水印 exportWaterMark = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Export_WaterMark"), false); - outSouthPane.add(exportWaterMark); - - JPanel tips = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(5, 5, 0); UILabel uiLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Export_WaterMark_Tips")); - uiLabel.setForeground(Color.GRAY); + FineUIStyle.setStyle(uiLabel, FineUIStyle.LABEL_TIP); ActionLabel actionLabel = new ActionLabel(Toolkit.i18nText("Fine-Design_Report_Export_WaterMark_Use"), UIConstants.FLESH_BLUE); actionLabel.addActionListener(new ActionListener() { @Override @@ -110,16 +96,35 @@ public class WordExportPane extends BasicPane { exportWaterMark.setSelected(true); } }); - tips.add(uiLabel); - tips.add(actionLabel); - outSouthPane.add(tips); - } + //内容保护 + JPanel contextProtectPane = column(10, + cell(writeProtect), + cell(writeProtectPane), + cell(exportWaterMark), + row(cell(uiLabel), cell(actionLabel)) + ).getComponent(); + Component centerPanel = column(LayoutConstants.VERTICAL_GAP, + row(20, + cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Setting"))), + cell(exportSettingPane).weight(1) + ), + row(20, + cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Content_Protect"))), + cell(contextProtectPane).weight(1) + ) + ).getComponent(); + this.add(wrapComponentWithTitle(centerPanel, "Word" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportD_Excel_Export"))); + } @Override protected String title4PopupWindow() { return "WordExport"; } + private JPanel getTopAlignLabelPane(String labelText) { + return column(LayoutConstants.VERTICAL_GAP, cell(new UILabel(labelText))).with(it-> it.setBorder(new ScaledEmptyBorder(2,0,0,0))).getComponent(); + } + public void populate(WordExportAttr wordExportAttr) { if(wordExportAttr == null){ return; diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitBrowserPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitBrowserPane.java index 1d415d0b75..fc65465781 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitBrowserPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitBrowserPane.java @@ -1,5 +1,7 @@ package com.fr.design.report.mobile; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.mobile.MobileFitAttrState; import com.fr.design.beans.BasicBeanPane; import com.fr.design.layout.FRGUIPaneFactory; @@ -11,6 +13,9 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.*; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + /** * Created by 夏翔 on 2016/5/28. */ @@ -25,22 +30,23 @@ public class AppFitBrowserPane extends BasicBeanPane { public AppFitBrowserPane(){ initComponents(); - } + /** + * 自适应面板 + */ private void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel borderPane = FRGUIPaneFactory.createTitledBorderPane(this.title4PopupWindow()); - JPanel fitOpsPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + this.setLayout(new BorderLayout()); horizionPane = new MobileRadioGroupPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Horizontal")); verticalPane = new MobileRadioGroupPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Vertical")); ActionListener actionListener = getAppPreviewActionListener(); horizionPane.addActionListener(actionListener); verticalPane.addActionListener(actionListener); - fitOpsPane.add(horizionPane, BorderLayout.NORTH); - fitOpsPane.add(verticalPane, BorderLayout.SOUTH); - borderPane.add(fitOpsPane); - this.add(borderPane); + this.add( + wrapComponentWithTitle((column(10, + row(cell(horizionPane)), + row(cell(verticalPane)) + ).getComponent()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Fit"))); } public void setAppFitPreviewPane(AppFitPreviewPane appFitPreviewPane) { diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitPreviewPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitPreviewPane.java index f0a61222a5..0be709496b 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitPreviewPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitPreviewPane.java @@ -1,5 +1,6 @@ package com.fr.design.report.mobile; +import com.fine.theme.utils.FineUIUtils; import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ilable.UILabel; @@ -7,8 +8,12 @@ import com.fr.design.layout.FRGUIPaneFactory; import javax.swing.*; +import java.awt.*; import java.util.ArrayList; +import static com.fine.swing.ui.layout.Layouts.*; +import static com.fine.swing.ui.layout.Layouts.flex; + /** * Created by 夏翔 on 2016/5/28. */ @@ -44,18 +49,21 @@ public class AppFitPreviewPane extends BasicPane{ } private void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - - JPanel outnorthPane = FRGUIPaneFactory.createTitledBorderPane(this.title4PopupWindow()); - this.add(outnorthPane); + this.setLayout(new BorderLayout()); horizontalImageLabel = new UILabel(); horizontalImageLabel.setIcon(cachedHorizonPreviewImage.get(1)); - outnorthPane.add(horizontalImageLabel); verticalImagelabel = new UILabel(); verticalImagelabel.setIcon(cachedVerticalPreviewImage.get(0)); - outnorthPane.add(verticalImagelabel); + this.add( + FineUIUtils.wrapComponentWithTitle((column(10, + row(10, + column(cell(horizontalImageLabel)), + column(cell(verticalImagelabel)), + flex() + )).getComponent()), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Plugin_Preview"))); } public void refreshPreview(int[] index) { 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 3948c26f3c..611d533063 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 @@ -1,15 +1,14 @@ package com.fr.design.report.mobile; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.designer.IntervalConstants; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.mobile.MobileRadioCheckPane; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.report.mobile.ElementCaseMobileAttr; -import javax.swing.BorderFactory; -import javax.swing.JPanel; -import java.awt.BorderLayout; +import static com.fine.swing.ui.layout.Layouts.*; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; /** * Created by plough on 2018/5/31. @@ -27,15 +26,11 @@ public class MobileOthersPane extends BasicBeanPane { private void initComponents() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel borderPane = FRGUIPaneFactory.createTitledBorderPane(this.title4PopupWindow()); - JPanel contentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - 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("Fine-Design_Report_Mobile_Attr_Allow_Zoom")); - contentPane.add(allowDoubleClickOrZoomCheckPane, BorderLayout.CENTER); - borderPane.add(contentPane); - this.add(borderPane); + this.add(wrapComponentWithTitle(row(LayoutConstants.HORIZONTAL_GAP, cell(appearRefreshCheckPane), cell(allowDoubleClickOrZoomCheckPane)).getComponent(), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Other"))); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/MobileRadioGroupPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/MobileRadioGroupPane.java index dd1a6dad79..422438ebd9 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/MobileRadioGroupPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/MobileRadioGroupPane.java @@ -1,5 +1,7 @@ package com.fr.design.report.mobile; +import com.fine.swing.ui.layout.Column; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.mobile.MobileFitAttrState; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.ibutton.UIRadioButton; @@ -15,6 +17,8 @@ import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.*; + /** * Created by Administrator on 2016/5/16/0016. */ @@ -27,10 +31,6 @@ public class MobileRadioGroupPane extends BasicBeanPane{ } private void initComponents(String title) { - double p = TableLayout.PREFERRED; - double[] rowSize = {p}; - double[] columnSize = {p, p, p, p, p}; - IndexRadioButton horizonRadio = new IndexRadioButton(MobileFitAttrState.HORIZONTAL.description(), MobileFitAttrState.HORIZONTAL); horizonRadio.setSelected(true); IndexRadioButton verticalRadio = new IndexRadioButton(MobileFitAttrState.VERTICAL.description(), MobileFitAttrState.VERTICAL); @@ -38,19 +38,20 @@ public class MobileRadioGroupPane extends BasicBeanPane{ IndexRadioButton notFitRadio = new IndexRadioButton(MobileFitAttrState.NONE.description(), MobileFitAttrState.NONE); addToButtonGroup(horizonRadio, verticalRadio, notFitRadio, bidirectionalRadio); - - Component[][] components = new Component[][]{ - new Component[] { - new UILabel(title), - horizonRadio, - verticalRadio, - bidirectionalRadio, - notFitRadio - } - }; - JPanel fitOpsPane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); - fitOpsPane.setBorder(BorderFactory.createEmptyBorder(10, 13, 10, 10)); - this.add(fitOpsPane); + Component row = + row( + cell(new UILabel(title)), + fix(10), + cell(horizonRadio), + fix(5), + cell(verticalRadio), + fix(5), + cell(bidirectionalRadio), + fix(5), + cell(notFitRadio), + flex() + ).getComponent(); + this.add(row); } private void addToButtonGroup(IndexRadioButton... radios) { @@ -81,7 +82,6 @@ public class MobileRadioGroupPane extends BasicBeanPane{ return radioButtons.get(i).getRadioButtonIndex(); } } - return 0; } diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/MobileToolBarPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/MobileToolBarPane.java index 7a2d99a2b8..4bfcf2b0af 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/MobileToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/MobileToolBarPane.java @@ -1,5 +1,6 @@ package com.fr.design.report.mobile; +import com.fine.theme.utils.FineUIUtils; import com.fr.design.beans.BasicBeanPane; import com.fr.design.dialog.mobile.MobileRadioCheckPane; import com.fr.design.gui.ilable.UILabel; @@ -10,6 +11,8 @@ import com.fr.report.mobile.ElementCaseMobileAttr; import javax.swing.*; import java.awt.*; +import static com.fine.swing.ui.layout.Layouts.*; + /** * Created by 方磊 on 2016/11/8. */ @@ -25,20 +28,20 @@ public class MobileToolBarPane extends BasicBeanPane { } private void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel borderPane = FRGUIPaneFactory.createTitledBorderPane(this.title4PopupWindow()); - JPanel toobarsPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - + this.setLayout(new BorderLayout()); UILabel uiLabel = new UILabel("html5"); uiLabel.setBorder(BorderFactory.createEmptyBorder(5, 15, 10, 15)); zoomCheckPane = new MobileRadioCheckPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Zoom")); refreshCheckPane = new MobileRadioCheckPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Refresh")); - toobarsPane.add(uiLabel, BorderLayout.WEST); - toobarsPane.add(zoomCheckPane, BorderLayout.CENTER); - toobarsPane.add(refreshCheckPane, BorderLayout.EAST); - borderPane.add(toobarsPane); - this.add(borderPane); + this.add( + FineUIUtils.wrapComponentWithTitle((column(10, + row(cell(uiLabel)), + row(cell(zoomCheckPane)), + row(cell(refreshCheckPane)), + flex() + ).getComponent()), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_ToolBar"))); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileAttrPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileAttrPane.java index 668027f5f8..dff4ced413 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileAttrPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileAttrPane.java @@ -1,12 +1,21 @@ package com.fr.design.report.mobile; +import com.fine.swing.ui.layout.Column; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.border.FineBorderFactory; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.report.mobile.ElementCaseMobileAttr; import javax.swing.*; +import java.awt.*; + +import static com.fine.swing.ui.layout.Layouts.*; + /** * Created by Administrator on 2016/5/12/0012. */ @@ -23,23 +32,19 @@ public class ReportMobileAttrPane extends BasicBeanPane{ } private void initComponents() { + this.setLayout(new BorderLayout()); AppFitPreviewPane appFitPreviewPane = new AppFitPreviewPane(); - this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - JPanel jPanel = new JPanel(); - jPanel.setLayout(new BoxLayout(jPanel, BoxLayout.Y_AXIS)); - jPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - reportMobileTemplateSettingsPane = new ReportMobileTemplateSettingsPane(); - jPanel.add(reportMobileTemplateSettingsPane); - appFitBrowserPane = new AppFitBrowserPane(); appFitBrowserPane.setAppFitPreviewPane(appFitPreviewPane); - jPanel.add(appFitBrowserPane); - - jPanel.add(mobileOthersPane = new MobileOthersPane()); - - jPanel.add(appFitPreviewPane); - UIScrollPane scrollPane = new UIScrollPane(jPanel); + JPanel panel = new JPanel(new BorderLayout()); + panel.add(column(LayoutConstants.VERTICAL_GAP, + cell(reportMobileTemplateSettingsPane), + cell(appFitBrowserPane), + cell(mobileOthersPane = new MobileOthersPane()), + cell(appFitPreviewPane) + ).with(it -> it.setBorder(new ScaledEmptyBorder(10,10,10,10))).getComponent()); + UIScrollPane scrollPane = new UIScrollPane(panel); this.add(scrollPane); } diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileTemplateSettingsPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileTemplateSettingsPane.java index f1b00f19af..d89c2b900c 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileTemplateSettingsPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileTemplateSettingsPane.java @@ -1,18 +1,21 @@ package com.fr.design.report.mobile; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.designer.IntervalConstants; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.report.mobile.ElementCaseMobileAttr; import javax.swing.*; import java.awt.*; +import static com.fine.swing.ui.layout.Layouts.*; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + /** * Created by plough on 2018/1/8. */ @@ -25,51 +28,37 @@ public class ReportMobileTemplateSettingsPane extends BasicBeanPane it.setBorder(new ScaledEmptyBorder(10,10,10,10))).getComponent()); + this.add(workPanel); } public void populate(ReportWebAttr reportWebAttr) { diff --git a/designer-realize/src/main/java/com/fr/design/webattr/DragToolBarPane.java b/designer-realize/src/main/java/com/fr/design/webattr/DragToolBarPane.java index b79e19e13f..9a410b53d1 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/DragToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/DragToolBarPane.java @@ -1,5 +1,8 @@ package com.fr.design.webattr; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.layout.FRGUIPaneFactory; @@ -7,27 +10,18 @@ import com.fr.form.ui.Widget; import com.fr.report.web.Location; import com.fr.report.web.ToolBarManager; -import javax.swing.DefaultListCellRenderer; -import javax.swing.DefaultListModel; -import javax.swing.DropMode; -import javax.swing.Icon; -import javax.swing.JComponent; -import javax.swing.JList; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.ListCellRenderer; -import javax.swing.SwingUtilities; -import javax.swing.TransferHandler; +import javax.swing.*; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; -import java.awt.Dimension; import java.awt.datatransfer.Transferable; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.image.ImageObserver; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; /** * richer:拖拽ToolBar button以实现自定义工具栏.服务器配置那儿的 @@ -65,29 +59,45 @@ public class DragToolBarPane extends WidgetToolBarPane { toolbarButtonList.setDropMode(DropMode.ON_OR_INSERT); toolbarButtonList.setDragEnabled(true); toolbarButtonList.setTransferHandler(new FromTransferHandler()); - northToolBar = new ToolBarPane(); - northToolBar.setPreferredSize(new Dimension(ImageObserver.WIDTH, 26)); - northToolBar.setBackground(Color.lightGray); - southToolBar = new ToolBarPane(); - southToolBar.setPreferredSize(new Dimension(ImageObserver.WIDTH, 26)); - southToolBar.setBackground(Color.lightGray); + toolbarButtonList.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); + + //顶部工具栏 JPanel northContentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + northToolBar = new ToolBarPane(); + northToolBar.setOpaque(false); + northToolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, UIManager.getColor("defaultBorderColor"))); SettingToolBar top = new SettingToolBar(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ToolBar_Top"), northToolBar); + top.setOpaque(false); northContentPane.add(top, BorderLayout.EAST); northContentPane.add(northToolBar, BorderLayout.CENTER); - northContentPane.setBackground(Color.lightGray); + northContentPane.setBorder(new ScaledEmptyBorder(4,0,4,0)); + northContentPane.setOpaque(false); + JPanel topToolbarPanel = new JPanel(new BorderLayout()); + topToolbarPanel.add(northContentPane); + topToolbarPanel.setBackground(FineUIUtils.getUIColor("Center.ZoneBorderColor", "defaultBorderColor")); + //底部工具栏 JPanel southContentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + southToolBar = new ToolBarPane(); + southToolBar.setOpaque(false); + southToolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, UIManager.getColor("defaultBorderColor"))); SettingToolBar bottom = new SettingToolBar(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ToolBar_Bottom"), southToolBar); + bottom.setOpaque(false); southContentPane.add(bottom, BorderLayout.EAST); southContentPane.add(southToolBar, BorderLayout.CENTER); - southContentPane.setBackground(Color.lightGray); - JPanel movePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - movePane.add(northContentPane, BorderLayout.NORTH); - movePane.add(toolbarButtonList, BorderLayout.CENTER); - movePane.add(southContentPane, BorderLayout.SOUTH); + southContentPane.setBorder(new ScaledEmptyBorder(4,0,4,0)); + southContentPane.setOpaque(false); + JPanel bottomToolbarPanel = new JPanel(new BorderLayout()); + bottomToolbarPanel.add(southContentPane); + bottomToolbarPanel.setBackground(FineUIUtils.getUIColor("Center.ZoneBorderColor", "defaultBorderColor")); - // SplitPane + //整体工具栏图标面板 + JPanel movePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + movePane.add(column(1, + cell(topToolbarPanel), + cell(toolbarButtonList), + cell(bottomToolbarPanel) + ).getComponent()); this.add(new JScrollPane(movePane), BorderLayout.CENTER); JPanel buttonPane = FRGUIPaneFactory.createCenterFlowInnerContainer_S_Pane(); @@ -98,7 +108,6 @@ public class DragToolBarPane extends WidgetToolBarPane { southToolBar.removeButtonList(); southToolBar.repaint(); northToolBar.removeButtonList(); - if (defaultToolBar == null) { return; } @@ -121,6 +130,7 @@ public class DragToolBarPane extends WidgetToolBarPane { northToolBar.repaint(); } }); + buttonPane.add(removeButton); this.add(buttonPane, BorderLayout.SOUTH); } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/EditReportServerParameterPane.java b/designer-realize/src/main/java/com/fr/design/webattr/EditReportServerParameterPane.java index 92885a3b3c..7aa80c8ade 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/EditReportServerParameterPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/EditReportServerParameterPane.java @@ -7,8 +7,8 @@ import com.fr.base.ConfigManager; import com.fr.base.print.PrintSettingsAttrMark; import com.fr.config.PrintConfig; import com.fr.config.ServerPreferenceConfig; +import com.fr.design.gui.frpane.FineTabbedPane; import com.fr.design.gui.frpane.LoadingBasicPane; -import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.webattr.printsettings.GlobalNativePrintSettingPane; @@ -28,7 +28,7 @@ import java.awt.BorderLayout; */ public class EditReportServerParameterPane extends LoadingBasicPane { - private UITabbedPane tabbedPane; + private FineTabbedPane tabbedPane; private PageToolBarPane pagePane; private ViewToolBarPane viewPane; @@ -54,20 +54,22 @@ public class EditReportServerParameterPane extends LoadingBasicPane { JPanel defaultPane = container; defaultPane.setLayout(FRGUIPaneFactory.createBorderLayout()); - //Tabbed Pane - tabbedPane = new UITabbedPane(); - defaultPane.add(tabbedPane, BorderLayout.CENTER); - - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_WEB_Pagination_Setting"), pagePane = new PageToolBarPane()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_WEB_Write_Setting"), writePane = new WriteToolBarPane()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_M_Data_Analysis_Settings"), viewPane = new ViewToolBarPane()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportServerP_Import_Css"), cssPane = new WebCssPane()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportServerP_Import_JavaScript"), jsPane = new WebJsPane()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Error_Handler_Template"), errorTemplatePane = new ErrorTemplatePane()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Print_Setting"), printSettingPane = new PrintSettingPane(new GlobalNativePrintSettingPane())); + //服务器-服务器配置 + FineTabbedPane.TabPaneBuilder tabPaneBuilder = FineTabbedPane.builder() + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_WEB_Pagination_Setting"), pagePane = new PageToolBarPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_WEB_Write_Setting"), writePane = new WriteToolBarPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_M_Data_Analysis_Settings"), viewPane = new ViewToolBarPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportServerP_Import_Css"), cssPane = new WebCssPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportServerP_Import_JavaScript"), jsPane = new WebJsPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Error_Handler_Template"), errorTemplatePane = new ErrorTemplatePane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Print_Setting"), printSettingPane = new PrintSettingPane(new GlobalNativePrintSettingPane())); if (WorkContext.getCurrent().isRoot()) { - tabbedPane.addTab(Toolkit.i18nText("Fine-Designer_PC_Fit_Attr"), serverFitAttrPane = new ServerFitAttrPane()); + tabPaneBuilder.addTab(Toolkit.i18nText("Fine-Designer_PC_Fit_Attr"), serverFitAttrPane = new ServerFitAttrPane()); + tabbedPane = tabPaneBuilder.withTabLayout(new int[]{4,4}).withHeadRatio(0.8f).build(); + } else { + tabbedPane = tabPaneBuilder.withTabLayout(new int[]{3,4}).withHeadRatio(0.8f).build(); } + defaultPane.add(tabbedPane, BorderLayout.CENTER); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/webattr/EditToolBar.java b/designer-realize/src/main/java/com/fr/design/webattr/EditToolBar.java index 17d411706e..56078062fe 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/EditToolBar.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/EditToolBar.java @@ -1,9 +1,14 @@ package com.fr.design.webattr; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.UpdateAction; -import com.fr.design.designer.IntervalConstants; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; @@ -20,13 +25,10 @@ import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.i18n.Toolkit; import com.fr.design.javascript.JavaScriptActionPane; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JWorkBook; import com.fr.design.menu.ToolBarDef; import com.fr.design.style.background.BackgroundPane; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.widget.IconDefinePane; import com.fr.form.ui.Button; import com.fr.form.ui.CustomToolBarButton; @@ -45,32 +47,23 @@ import com.fr.stable.StringUtils; import com.fr.widgettheme.util.WidgetThemeDesignerUtils; import com.fr.write.JavaScriptResourceInfo; -import javax.swing.BorderFactory; -import javax.swing.Box; -import javax.swing.DefaultListCellRenderer; -import javax.swing.DefaultListModel; -import javax.swing.ImageIcon; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JSplitPane; -import javax.swing.ListCellRenderer; -import javax.swing.SpinnerNumberModel; -import javax.swing.SwingUtilities; +import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import java.awt.BorderLayout; -import java.awt.CardLayout; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Image; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + public class EditToolBar extends BasicPane { private static final String EMAIL = "email"; @@ -102,9 +95,9 @@ public class EditToolBar extends BasicPane { lastButton = (ToolBarButton) list.getSelectedValue(); if (lastButton.getWidget() instanceof Button) { card.show(right, "button"); - bp.populate(lastButton.getWidget()); + bp.populate(lastButton.getWidget(), lastButton.getIcon()); } else { - bp.populate(lastButton.getWidget()); + bp.populate(lastButton.getWidget(), lastButton.getIcon()); card.show(right, "none"); } } @@ -140,51 +133,64 @@ public class EditToolBar extends BasicPane { * 初始化 */ public void initComponent() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel left = FRGUIPaneFactory.createBorderLayout_S_Pane(); + this.setLayout(new BorderLayout()); + //左侧按钮列表 + JPanel leftPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); listModel = new DefaultListModel(); list = new JList(listModel); list.setCellRenderer(render); - left.add(new JScrollPane(list), BorderLayout.CENTER); + list.addListSelectionListener(listSelectionListener); + list.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); + list.setPreferredSize(FineUIScale.scale(new Dimension(-1, 380))); + leftPanel.add(list, BorderLayout.CENTER); + //添加外边框 + leftPanel.setBorder(new FineRoundBorder()); if (listModel.getSize() > 0) { list.setSelectedIndex(0); } - + //左侧按钮列表上方工具栏,上移-下移-删除 ToolBarDef toolbarDef = new ToolBarDef(); toolbarDef.addShortCut(new MoveUpItemAction()); toolbarDef.addShortCut(new MoveDownItemAction()); toolbarDef.addShortCut(new RemoveAction()); UIToolbar toolBar = ToolBarDef.createJToolBar(); toolbarDef.updateToolBar(toolBar); - left.add(toolBar, BorderLayout.NORTH); - + toolBar.setBackground(FineUIUtils.getUIColor("Center.ZoneBorderColor", "defaultBorderColor")); + leftPanel.add(toolBar, BorderLayout.NORTH); + //右侧表单按钮属性面板 right = FRGUIPaneFactory.createCardLayout_S_Pane(); card = new CardLayout(); right.setLayout(card); bp = new ButtonPane(); right.add("none", FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane()); right.add("button", bp); + right.setBorder(new ScaledEmptyBorder(0,10,0,0)); + JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, leftPanel, right); + splitPane.setDividerLocation(150); - JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, left, right); - // splitPane.setDividerLocation(left.getMinimumSize().width); - splitPane.setDividerLocation(120); - this.add(splitPane); - list.addListSelectionListener(listSelectionListener); - JPanel backgroundPane = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, 0, 0, 0); + //下方样式设置面板 + JPanel backgroundPane = new JPanel(new BorderLayout()); UIButton bgButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Background")); defaultCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default_Background")); bgButton.addActionListener(actioner); - backgroundPane.add(defaultCheckBox); - backgroundPane.add(bgButton); - JPanel bgPanel = new JPanel(); - bgPanel.add(defaultCheckBox); - bgPanel.add(bgButton); - backgroundPane.add(bgPanel); + + //添加按钮颜色面板默认不可见,控件显示增强开启才显示 + JPanel buttonColorGroupPane = createButtonColorGroup(); + buttonColorGroupPane.setVisible(false); + //样式设置面板布局,默认背景-按钮颜色 + backgroundPane.add(column(10, + row(10, cell(defaultCheckBox).weight(0.15), cell(bgButton).weight(0.2), flex(0.65)).weight(1), + cell(buttonColorGroupPane).weight(1) + ).getComponent()); + if(WidgetThemeDesignerUtils.enableWidgetEnhance()) { - backgroundPane.add(createButtonColorGroup()); + buttonColorGroupPane.setVisible(true); } - backgroundPane.setBorder(BorderFactory.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_ToolBar_Style_Setting"))); - this.add(backgroundPane, BorderLayout.SOUTH); + //样式设置面板设置标题 + JPanel styleSettingPane = new JPanel(new BorderLayout()); + styleSettingPane.add(wrapComponentWithTitle(backgroundPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_ToolBar_Style_Setting"))); + styleSettingPane.setBorder(new ScaledEmptyBorder(10, 0, 0, 0));; + this.add(column(cell(splitPane), cell(styleSettingPane)).getComponent()); } ListCellRenderer render = new DefaultListCellRenderer() { @@ -273,7 +279,7 @@ public class EditToolBar extends BasicPane { public MoveUpItemAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Up")); this.setMnemonic('U'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/up.png")); + this.setSmallIcon(new LazyIcon("move_up")); } /** @@ -304,7 +310,7 @@ public class EditToolBar extends BasicPane { public MoveDownItemAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Down")); this.setMnemonic('D'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/down.png")); + this.setSmallIcon(new LazyIcon("move_down")); } /** @@ -338,7 +344,7 @@ public class EditToolBar extends BasicPane { public class RemoveAction extends UpdateAction { public RemoveAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Delete")); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); + this.setSmallIcon(new LazyIcon("clear")); } /** @@ -404,125 +410,120 @@ public class EditToolBar extends BasicPane { Set set = ExtraDesignClassManager.getInstance().getArray(ExportToolBarProvider.XML_TAG); exportToolBarProviders = set.toArray(new ExportToolBarProvider[set.size()]); this.setLayout(FRGUIPaneFactory.createBorderLayout()); + //'设置表单按钮属性'面板 JPanel north = FRGUIPaneFactory.createBorderLayout_S_Pane(); icon = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Icon")); text = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Text")); - - north.add(icon, BorderLayout.NORTH); - north.add(text, BorderLayout.CENTER); - - nameField = new UITextField(8); + nameField = new UITextField(); iconPane = new IconDefinePane(); javaScriptPane = JavaScriptActionPane.createDefault(); - - double p = TableLayout.PREFERRED; - double rowSize[] = {p, p}; - double columnSize[] = {p, p}; - - Component[][] coms = new Component[][]{{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Widget_Printer_Alias") + ":"), nameField}, {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Widget_Icon") + ":"), iconPane}}; - - JPanel nameIconPane = TableLayoutHelper.createTableLayoutPane(coms, rowSize, columnSize); - - north.add(nameIconPane, BorderLayout.SOUTH); - - north.setBorder(BorderFactory.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Form_Button_Property"))); + JPanel nameIconPane = column(LayoutConstants.VERTICAL_GAP, + //显示按钮图标,显示按钮名称 + row(LayoutConstants.HORIZONTAL_GAP, cell(icon), cell(text)), + //控件别名 + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Widget_Printer_Alias"))), + cell(nameField)), + //控件图标 + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Widget_Icon"))), + cell(iconPane)) + ).getComponent(); + nameIconPane.setBorder(new ScaledEmptyBorder(0, 0, 10, 0)); + north.add(wrapComponentWithTitle(nameIconPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Form_Button_Property")), BorderLayout.SOUTH); this.add(north, BorderLayout.NORTH); - JPanel none = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + + //不同图标额外的设置表单按钮属性面板 centerPane = FRGUIPaneFactory.createCardLayout_S_Pane(); card = new CardLayout(); centerPane.setLayout(card); - centerPane.add(CUSTOM, getCustomPane()); - centerPane.add(EXPORT, getExport()); - centerPane.add(EMAIL, getEmail()); - centerPane.add(NONE, none); - centerPane.add(getCpane(), APPEND_COUNT); - centerPane.add(getSubmitPane(), SUBMIT); + centerPane.add(CUSTOM, wrapComponentWithTitle(getCustomPane(), com.fr.design.i18n.Toolkit.i18nText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit") + "JS"))); + centerPane.add(EXPORT, wrapComponentWithTitle(getExport(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Form_Button_Property"))); + centerPane.add(EMAIL, wrapComponentWithTitle(getEmail(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Form_Button_Property"))); + centerPane.add(NONE, FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane()); + centerPane.add(APPEND_COUNT, column(LayoutConstants.VERTICAL_GAP,cell(getAppendCountPane())).getComponent()); + centerPane.add(SUBMIT, wrapComponentWithTitle(getSubmitPane(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Form_Button_Property"))); Set extraButtonSet = ExtraDesignClassManager.getInstance().getArray(ExtraButtonToolBarProvider.XML_TAG); for (ExtraButtonToolBarProvider provider : extraButtonSet) { provider.updateCenterPane(centerPane); } - this.add(centerPane, BorderLayout.CENTER); } - + /** + * 自定义按钮Pane + * @return + */ private JPanel getCustomPane() { - JPanel customPane = FRGUIPaneFactory.createCenterFlowInnerContainer_S_Pane(); - + JPanel customPane = new JPanel(new BorderLayout()); button = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_User_Defined_Event")); - customPane.add(button); - customPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit") + "JS", null)); + customPane.add(row(cell(button).weight(0.2), flex(0.8)).getComponent()); button.addActionListener(l); return customPane; } + /** + * 导出Pane + * @return + */ private JPanel getExport() { - JPanel export = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - // export.setLayout(new BoxLayout(export, BoxLayout.Y_AXIS)); + JPanel export = FRGUIPaneFactory.createBorderLayout_S_Pane(); pdf = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Output_PDF")); excelP = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Output_Excel_Page")); excelO = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Output_Excel_Simple")); excelS = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Output_Excel_Sheet")); word = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Output_Word")); image = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Image")); - export.add(pdf); - export.add(Box.createVerticalStrut(2)); - export.add(excelP); - export.add(Box.createVerticalStrut(2)); - export.add(excelO); - export.add(Box.createVerticalStrut(2)); - export.add(excelS); - export.add(Box.createVerticalStrut(2)); - export.add(word); - export.add(Box.createVerticalStrut(2)); - export.add(image); + export.add(column(10, cell(pdf), cell(excelP), cell(excelO), cell(excelS), cell(word), cell(image)).getComponent()); for (int i = 0; i < ArrayUtils.getLength(exportToolBarProviders); i++) { export = exportToolBarProviders[i].updateCenterPane(export); } - - export.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Form_Button_Property"), null)); return export; } + /** + * 邮件Pane + * @return + */ private JPanel getEmail() { - JPanel email = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + JPanel email = FRGUIPaneFactory.createBorderLayout_S_Pane(); customConsignee = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Custom_Consignee")); consigneeByDepartment = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Consignee_By_Department")); consigneeByRole = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Consignee_By_Role")); - email.add(customConsignee); - email.add(Box.createVerticalStrut(2)); - email.add(consigneeByDepartment); - email.add(Box.createVerticalStrut(2)); - email.add(consigneeByRole); - email.add(Box.createVerticalStrut(2)); - - email.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Form_Button_Property"), null)); + email.add(column(LayoutConstants.VERTICAL_GAP, + cell(customConsignee), + cell(consigneeByDepartment), + cell(consigneeByRole) + ).getComponent()); return email; } - private JPanel getCpane() { - JPanel appendCountPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); + /** + * 插入记录Pane + * @return + */ + private JPanel getAppendCountPane() { + JPanel appendCountPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); count = new UIBasicSpinner(new SpinnerNumberModel(1, 0, Integer.MAX_VALUE, 1)); - UILabel countLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Add_Row_Column_Numbers") + ":"); - JPanel cpane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - cpane.add(countLabel); - cpane.add(count); - appendCountPane.add(cpane); - return cpane; + UILabel countLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Add_Row_Column_Numbers")); + appendCountPane.add(row(LayoutConstants.HORIZONTAL_GAP, cell(countLabel), cell(count)).getComponent()); + return appendCountPane; } - + /** + * 提交Pane + * @return + */ private JPanel getSubmitPane() { isVerify = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Verify_Data_Verify")); failSubmit = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Verify_Fail_Still_Submit")); isCurSheet = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Only_Submit_Current_Sheet")); - JPanel submitPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); - submitPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Form_Button_Property"), null)); - submitPane.add(isVerify); - submitPane.add(failSubmit); - submitPane.add(isCurSheet); isVerify.addActionListener(actionListener); + JPanel submitPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + submitPane.add(column(LayoutConstants.VERTICAL_GAP, + cell(isVerify), + cell(failSubmit), + cell(isCurSheet) + ).getComponent()); return submitPane; } @@ -567,11 +568,11 @@ public class EditToolBar extends BasicPane { * * @param widget 对应组件 */ - public void populate(Widget widget) { + public void populate(Widget widget, Icon icon) { this.widget = widget; card.show(centerPane, "none"); if (widget instanceof Button) { - populateDefault(); + populateDefault(icon); } if (widget instanceof Export) { populateExport(); @@ -640,12 +641,13 @@ public class EditToolBar extends BasicPane { this.isCurSheet.setSelected(submit.isOnlySubmitSelect()); } - private void populateDefault() { + private void populateDefault(Icon icon) { Button button = (Button) widget; this.icon.setSelected(button.isShowIcon()); this.text.setSelected(button.isShowText()); this.nameField.setText(button.getText()); - this.iconPane.populate(((Button) widget).getIconName()); + //this.iconPane.populate(((Button) widget).getIconName()); + this.iconPane.populateIcon(((Button) widget).getIconName(), icon); } /** @@ -739,11 +741,7 @@ public class EditToolBar extends BasicPane { super.setSelectedIndex(newSelectedIndex, fireChanged); } }; - bgColorButtonGroup.setPreferredSize(new Dimension(135, bgColorButtonGroup.getPreferredSize().height)); - JPanel headPane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(IntervalConstants.INTERVAL_L5, 0); - headPane.add(headLabel); - headPane.add(bgColorButtonGroup); - headPane.setBorder(BorderFactory.createEmptyBorder(0, IntervalConstants.INTERVAL_L2, 0, 0)); - return headPane; + bgColorButtonGroup.setPreferredSize(FineUIScale.scale(new Dimension(135, bgColorButtonGroup.getPreferredSize().height))); + return row(10, cell(headLabel).weight(0.15), cell(bgColorButtonGroup).weight(0.3), flex(0.55)).getComponent(); } } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ErrorTemplatePane.java b/designer-realize/src/main/java/com/fr/design/webattr/ErrorTemplatePane.java index 20ff40f5fb..3cddcde2dc 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ErrorTemplatePane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ErrorTemplatePane.java @@ -1,47 +1,43 @@ package com.fr.design.webattr; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; - +import static com.fine.swing.ui.layout.Layouts.*; public class ErrorTemplatePane extends BasicBeanPane { private UITextField templateField = null; public ErrorTemplatePane() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); - - this.templateField = new UITextField(36); - - // TableLayout - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p, p}; - double[] columnSize = {p, p}; - - JPanel reportletNamePane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - reportletNamePane.add(this.templateField); - - Component[][] components = { - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Template_Path") + ":"), reportletNamePane}, - - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Template_Parameters") + ":"), null}, - {new UILabel("message" + ":"), new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Verify_Message"))}, - {new UILabel("charset" + ":"), new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Server_Charset"))}, - {new UILabel("exception" + ":"), new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Exception_Stack_Trace"))} - }; - JPanel northPane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); - - this.add(northPane, BorderLayout.NORTH); + this.setLayout(new BorderLayout()); + this.templateField = new UITextField(); + JPanel northPane = column(LayoutConstants.VERTICAL_GAP, + row(LayoutConstants.HORIZONTAL_GAP, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Template_Path"))), + cell(this.templateField).weight(1) + ), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Template_Parameters"))), + row( + cell(new UILabel("message" + ":")), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Verify_Message"))) + ), + row( + cell(new UILabel("charset" + ":")), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Server_Charset"))) + ), + row( + cell(new UILabel("exception" + ":")), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Exception_Stack_Trace"))) + ) + ).getComponent(); + northPane.setBorder(new ScaledEmptyBorder(10,10,10,10)); + this.add(northPane); } @Override @@ -59,6 +55,4 @@ public class ErrorTemplatePane extends BasicBeanPane { public String updateBean() { return this.templateField.getText(); } - - } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/EventPane.java b/designer-realize/src/main/java/com/fr/design/webattr/EventPane.java index ff4e4296db..5f3d43cf5c 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/EventPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/EventPane.java @@ -1,7 +1,11 @@ package com.fr.design.webattr; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.design.actions.UpdateAction; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.itoolbar.UIToolbar; @@ -32,6 +36,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; + /** * richer:调用该类并且对事件名字国际化时需要严格按照"FR-Engine_Event_事件名"来进行命名 */ @@ -53,14 +60,8 @@ public class EventPane extends BasicPane { int len = eventName.length; this.eventName = Arrays.copyOf(eventName, len); this.setLayout(FRGUIPaneFactory.createBorderLayout()); - listModel = new DefaultListModel(); - eventList = new JList(listModel); -// eventList.setFixedCellHeight(20); - eventList.setCellRenderer(render); - eventList.addMouseListener(editListener); - this.add(new UIScrollPane(eventList), BorderLayout.CENTER); + //按钮栏 addAction = new AddMenuDef(this.eventName); - editAction = new EditAction(); removeAction = new RemoveAction(); ToolBarDef def = new ToolBarDef(); @@ -69,8 +70,16 @@ public class EventPane extends BasicPane { def.addShortCut(removeAction); UIToolbar toolBar = ToolBarDef.createJToolBar(); def.updateToolBar(toolBar); - toolBar.setPreferredSize(new Dimension(toolBar.getWidth(), 26)); - this.add(toolBar, BorderLayout.NORTH); + //列表 + listModel = new DefaultListModel(); + eventList = new JList(listModel); + eventList.setCellRenderer(render); + eventList.addMouseListener(editListener); + eventList.setBackground(FlatUIUtils.getUIColor("fill.normal", Color.WHITE)); + JScrollPane scrollPane = new UIScrollPane(eventList); + scrollPane.setBorder(new FineRoundBorder()); + //让事件设置列表铺满,有特殊设置在外层调用处修改 + this.add(column(LayoutConstants.VGAP_SMALL, cell(toolBar), cell(scrollPane).weight(1)).getComponent()); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/webattr/PageToolBarPane.java b/designer-realize/src/main/java/com/fr/design/webattr/PageToolBarPane.java index 783bc0e6a3..cdf103c95e 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/PageToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/PageToolBarPane.java @@ -1,7 +1,10 @@ package com.fr.design.webattr; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.ConfigManager; import com.fr.config.Configuration; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.core.WidgetOption; @@ -11,8 +14,6 @@ import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.form.event.Listener; import com.fr.general.ComparatorUtils; @@ -28,7 +29,6 @@ import com.fr.design.i18n.Toolkit; import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputMethodEvent; @@ -44,6 +44,12 @@ import javax.swing.ButtonGroup; import javax.swing.JPanel; import javax.swing.SwingUtilities; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapBoldLabelWithUnderline; + public class PageToolBarPane extends AbstractEditToolBarPane { private UIRadioButton centerRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Center_Display")); @@ -59,7 +65,6 @@ public class PageToolBarPane extends AbstractEditToolBarPane { private UICheckBox isPageFixedRowBox; private UITextField pageFixedRowCountTextField; - private static final Color TIPS_FONT_COLOR = new Color(0x8f8f92); private static final Pattern ROW_COUNT = Pattern.compile("^[1-9][\\d]*$|^0"); //固定行数分页,每页最多500行,最少1行数据 @@ -68,14 +73,13 @@ public class PageToolBarPane extends AbstractEditToolBarPane { public PageToolBarPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.setBorder(new ScaledEmptyBorder(10,10,10,10)); ButtonGroup buttonGroup = new ButtonGroup(); leftRadioButton.setSelected(true); buttonGroup.add(centerRadioButton); buttonGroup.add(leftRadioButton); - JPanel buttonPane = new JPanel(FRGUIPaneFactory.createBoxFlowLayout()); - buttonPane.add(centerRadioButton); - buttonPane.add(leftRadioButton); + isShowAsImageBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Is_Paint_Page")); isAutoScaleBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_IS_Auto_Scale")); isTDHeavyBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_IS_TD_HEAVY_EXPORT"), false); @@ -87,56 +91,68 @@ public class PageToolBarPane extends AbstractEditToolBarPane { } }); editToolBarButton.addActionListener(editBtnListener); - JPanel editToolBarButtonPanel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - editToolBarButtonPanel.add(editToolBarButton); isUseToolBarCheckBox.setSelected(true); isUseToolBarCheckBox.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { editToolBarButton.setEnabled(isUseToolBarCheckBox.isSelected()); } }); - double p = TableLayout.PREFERRED; - - pageFixedRowCountTextField = new UITextField(5); + pageFixedRowCountTextField = new UITextField(); pageFixedRowCountTextField.setText("30"); pageFixedRowCountTextField.setToolTipText(Toolkit.i18nText("Fine-Design_Report_Page_Fixed_Row_Count_Tip")); - pageFixedRowCountTextField.addKeyListener(rowCountKeyListener); pageFixedRowCountTextField.addInputMethodListener(rowCountInputMethodListener); - UILabel linesPerPageLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Rows_Per_Page") + ":"); - Component[][] rowCountTextFieldComponents = {{linesPerPageLabel,pageFixedRowCountTextField}}; - JPanel linesPerPagePane = TableLayoutHelper.createTableLayoutPane(rowCountTextFieldComponents, new double[]{p}, new double[]{p,p}); UILabel tipLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Page_Fixed_Row_Tip")); - tipLabel.setForeground(TIPS_FONT_COLOR); - - double[] columnSize = {p, p, p, p}; - double[] rowSize = {p, p, p, p, p}; - Component[][] components = new Component[][]{ - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Report_Show_Location") + ":", UILabel.RIGHT), buttonPane, null, null}, - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Report_PageSetup_Page") + ":", UILabel.RIGHT), isShowAsImageBox, isAutoScaleBox, isTDHeavyBox}, - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Report_Paging_Settings") + ":", UILabel.RIGHT), isPageFixedRowBox, linesPerPagePane, null}, - new Component[]{null, tipLabel, null, null}, - new Component[]{isUseToolBarCheckBox, editToolBarButtonPanel, null, null} - }; + FineUIStyle.setStyle(tipLabel, FineUIStyle.LABEL_TIP); - JPanel northPanel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); - this.add(northPanel, BorderLayout.NORTH); + JPanel northPanel = column(LayoutConstants.VERTICAL_GAP, + //报表显示位置:居中展示-左展示 + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Location"))).weight(0.15), + cell(centerRadioButton).weight(0.2), + cell(leftRadioButton).weight(0.15), + flex(0.5) + ), + //页面:以图片方式显示-iframe嵌入时自动缩放-重方式输出格子 + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Page"))).weight(0.15), + cell(isShowAsImageBox).weight(0.2), + cell(isAutoScaleBox).weight(0.25), + cell(isTDHeavyBox).weight(0.2), + flex(0.2) + ), + //分页设置:按行分页-每页显示行数 + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Paging_Settings"))).weight(0.15), + cell(isPageFixedRowBox).weight(0.2), + cell(new UILabel(Toolkit.i18nText("Fine-Design_Report_Rows_Per_Page"))).weight(0.15), + cell(pageFixedRowCountTextField).weight(0.2), + flex(0.3) + ), + //提示 + cell(tipLabel), + //使用工具栏-编辑 + row(LayoutConstants.HORIZONTAL_GAP, cell(isUseToolBarCheckBox), cell(editToolBarButton)) + ).getComponent(); + //事件编辑 + JPanel eventPanel = new JPanel(new BorderLayout()); eventPane = new EventPane(new WebPage().supportedEvents()); - JPanel center = FRGUIPaneFactory.createBorderLayout_S_Pane(); - center.add(eventPane, BorderLayout.CENTER); + UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Editing_Listeners")); + wrapBoldLabelWithUnderline(label); + eventPanel.add(column(LayoutConstants.VGAP_SMALL, cell(label), cell(eventPane).weight(1)).getComponent()); + + this.add(column(LayoutConstants.VERTICAL_GAP, + cell(northPanel), + cell(eventPanel).weight(1) + ).getComponent()); + //wei : 默认没config.xml的情况下,就有默认工具栏 ToolBarManager toolBarManager = ToolBarManager.createDefaultToolBar(); toolBarManager.setToolBarLocation(Location.createTopEmbedLocation()); this.toolBarManagers = new ToolBarManager[]{toolBarManager}; - - this.add(center, BorderLayout.CENTER); } - + @Override protected WidgetOption[] getToolBarInstance() { return ReportWebWidgetConstants.getPageToolBarInstance(); diff --git a/designer-realize/src/main/java/com/fr/design/webattr/PageWebSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/PageWebSettingPane.java index 1a3d323e9f..d73beaaecc 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/PageWebSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/PageWebSettingPane.java @@ -1,14 +1,13 @@ package com.fr.design.webattr; +import com.fine.theme.utils.FineUIStyle; import com.fr.design.ExtraDesignClassManager; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.general.ComparatorUtils; import com.fr.report.web.ToolBarManager; import com.fr.report.web.WebPage; @@ -27,11 +26,15 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.ButtonGroup; import javax.swing.JPanel; -import java.awt.Component; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + public class PageWebSettingPane extends WebSettingPane { private UIRadioButton centerRadioButton; private UIRadioButton leftRadioButton; @@ -40,7 +43,6 @@ public class PageWebSettingPane extends WebSettingPane { private UICheckBox isTDHeavyBox; private UICheckBox isPageFixedRowBox; private UITextField pageFixedRowCountTextField; - private static final Color TIPS_FONT_COLOR = new Color(0x8f8f92); private static final Pattern ROW_COUNT = Pattern.compile("^[1-9][\\d]*$|^0"); private static final String DEFAULT_ROW_COUNT = "30"; @@ -52,6 +54,10 @@ public class PageWebSettingPane extends WebSettingPane { super(); } + /** + * 模板-模板Web属性-分页预览设置中其余设置面板,通用部分在父类绘制 + * @return + */ @Override protected JPanel createOtherSetPane() { centerRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Center_Display")); @@ -60,9 +66,7 @@ public class PageWebSettingPane extends WebSettingPane { leftRadioButton.setSelected(true); buttonGroup.add(centerRadioButton); buttonGroup.add(leftRadioButton); - JPanel buttonpane = new JPanel(FRGUIPaneFactory.createBoxFlowLayout()); - buttonpane.add(centerRadioButton); - buttonpane.add(leftRadioButton); + isShowAsImageBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Is_Paint_Page")); isAutoScaleBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_IS_Auto_Scale")); isTDHeavyBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_IS_TD_HEAVY_EXPORT"), false); @@ -74,9 +78,7 @@ public class PageWebSettingPane extends WebSettingPane { } }); - double p = TableLayout.PREFERRED; - - pageFixedRowCountTextField = new UITextField(5); + pageFixedRowCountTextField = new UITextField(); pageFixedRowCountTextField.setToolTipText(Toolkit.i18nText("Fine-Design_Report_Page_Fixed_Row_Count_Tip")); pageFixedRowCountTextField.addKeyListener(new KeyAdapter() { @Override @@ -101,23 +103,35 @@ public class PageWebSettingPane extends WebSettingPane { } }); - UILabel linesPerPageLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Rows_Per_Page") + ":"); - Component[][] rowCountTextFieldComponents = {{linesPerPageLabel,pageFixedRowCountTextField}}; - JPanel linesPerPagePane = TableLayoutHelper.createTableLayoutPane(rowCountTextFieldComponents, new double[]{p}, new double[]{p,p}); UILabel tipLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Page_Fixed_Row_Tip")); - tipLabel.setForeground(TIPS_FONT_COLOR); - - double[] columnSize = {p, p, p, p}; - double[] rowSize = {p, p, p, p}; - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Location") + ":", UILabel.RIGHT), buttonpane, null, null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Page") + ":", UILabel.RIGHT), isShowAsImageBox, isAutoScaleBox, isTDHeavyBox}, - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Report_Paging_Settings") + ":", UILabel.RIGHT), isPageFixedRowBox, linesPerPagePane, null}, - new Component[]{null, tipLabel, null, null} - - }; - - return TableLayoutHelper.createTableLayoutPane(components,rowSize,columnSize); + FineUIStyle.setStyle(tipLabel, FineUIStyle.LABEL_TIP); + + //其余设置面板布局 + return column(LayoutConstants.VERTICAL_GAP, + //报表显示位置 + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Location"))).weight(0.15), + cell(centerRadioButton).weight(0.2), + cell(leftRadioButton).weight(0.15), + flex(0.5) + ), + //页面 + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Page"))).weight(0.15), + cell(isShowAsImageBox).weight(0.2), + cell(isAutoScaleBox).weight(0.25), + cell(isTDHeavyBox).weight(0.2), + flex(0.2) + ), + //分页设置 + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Paging_Settings"))).weight(0.15), cell(isPageFixedRowBox).weight(0.2), + cell(new UILabel(Toolkit.i18nText("Fine-Design_Report_Rows_Per_Page"))).weight(0.15), + cell(pageFixedRowCountTextField).weight(0.2), + flex(0.3) + ), + //提示 + cell(tipLabel) + ).getComponent(); } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ReportServerPrinterPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ReportServerPrinterPane.java index 8a519df3cf..389af156c6 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ReportServerPrinterPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ReportServerPrinterPane.java @@ -4,9 +4,9 @@ package com.fr.design.webattr; -import javax.swing.BorderFactory; import javax.swing.JPanel; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.report.web.Printer; /** @@ -23,7 +23,7 @@ public class ReportServerPrinterPane extends JPanel { protected void initComponents() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(6, 2, 4, 2)); + this.setBorder(new ScaledEmptyBorder(10,10,10,10)); serverPrinterPane = new ServerPrinterPane(); this.add(serverPrinterPane); } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ReportWebAttrPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ReportWebAttrPane.java index c8cef4ff96..17254cc5ca 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ReportWebAttrPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ReportWebAttrPane.java @@ -3,8 +3,8 @@ */ package com.fr.design.webattr; +import com.fr.design.gui.frpane.FineTabbedPane; import com.fr.design.gui.frpane.LoadingBasicPane; -import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.style.background.BackgroundPane; import com.fr.design.style.background.BackgroundPane4Browser; @@ -19,19 +19,13 @@ import java.awt.*; */ public class ReportWebAttrPane extends LoadingBasicPane { private ReportWebAttr reportWebAttr; - - private UITabbedPane tabbedPane; private CommonPane commonPane; private ReportServerPrinterPane serverPrintPane; - private PageWebSettingPane pageWeb; private WriteWebSettingPane writeWeb; private ViewWebSettingPane viewWeb; - private BackgroundPane backgroundPane; - protected WebCssPane cssPane; - protected WebJsPane jsPane; @@ -39,20 +33,20 @@ public class ReportWebAttrPane extends LoadingBasicPane { protected synchronized void initComponents(JPanel container) { JPanel defaultPane = container; defaultPane.setLayout(FRGUIPaneFactory.createBorderLayout()); - - //Tabbed Pane - tabbedPane = new UITabbedPane(); + //模板-模板Web属性 + FineTabbedPane tabbedPane = FineTabbedPane.builder() + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Basic"), commonPane = new CommonPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Printer(Server)"), serverPrintPane = new ReportServerPrinterPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Pagination_Setting"), pageWeb = new PageWebSettingPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Write_Setting"), writeWeb = new WriteWebSettingPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Data_Analysis_Settings"), viewWeb = new ViewWebSettingPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Browser_Background"), backgroundPane = new BackgroundPane4Browser()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Import_Css"), cssPane = new WebCssPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Import_JavaScript"), jsPane = new WebJsPane()) + .withTabLayout(new int[]{4, 4}) + .withHeadRatio(0.8f) + .build(); defaultPane.add(tabbedPane, BorderLayout.CENTER); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Basic"), commonPane = new CommonPane()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Printer(Server)"), serverPrintPane = new ReportServerPrinterPane()); - - tabbedPane.add(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Pagination_Setting"), pageWeb = new PageWebSettingPane()); - tabbedPane.add(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Write_Setting"), writeWeb = new WriteWebSettingPane()); - tabbedPane.add(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Data_Analysis_Settings"), viewWeb = new ViewWebSettingPane()); - - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Browser_Background"), backgroundPane = new BackgroundPane4Browser()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Import_Css"), cssPane = new WebCssPane()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Import_JavaScript"), jsPane = new WebJsPane()); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ReportWebWidgetConstants.java b/designer-realize/src/main/java/com/fr/design/webattr/ReportWebWidgetConstants.java index ebfb53b80c..466f55e4d2 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ReportWebWidgetConstants.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ReportWebWidgetConstants.java @@ -1,5 +1,6 @@ package com.fr.design.webattr; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseUtils; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.core.WidgetOptionFactory; @@ -38,7 +39,6 @@ import com.fr.report.web.button.write.ImportExcelData; import com.fr.report.web.button.write.ShowCellValue; import com.fr.report.web.button.write.StashButton; import com.fr.report.web.button.write.Submit; -import com.fr.report.web.button.write.SubmitForcibly; import com.fr.report.web.button.write.Verify; public class ReportWebWidgetConstants { @@ -61,8 +61,8 @@ public class ReportWebWidgetConstants { } // 提交按钮 - public static final WidgetOption SUBMIT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Utils_Submit"), BaseUtils.readIcon("/com/fr/web/images/save.png"), - Submit.class); + public static final WidgetOption SUBMIT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Utils_Submit"), + BaseUtils.readIcon("/com/fr/web/images/save.png"), Submit.class); // flash打印按钮 public static final WidgetOption FLASHPRINT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Utils_Print[Client]"), @@ -70,102 +70,119 @@ public class ReportWebWidgetConstants { // appletprint public static final WidgetOption APPLETPRINT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Applet_Print"), - BaseUtils.readIcon("/com/fr/web/images/appletPrint.png"), AppletPrint.class); + new LazyIcon("printApplet"), AppletPrint.class); // PDF导出 - public static final WidgetOption PDF = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_PDF"), BaseUtils.readIcon("/com/fr/web/images/pdf.png"), - PDF.class); + public static final WidgetOption PDF = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_PDF"), + new LazyIcon("pdfFile"), PDF.class); // 客户端PDF打印 public static final WidgetOption PDFPRINT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Utils_Print[Client]"), - BaseUtils.readIcon("/com/fr/web/images/pdfPrint.png"), PDFPrint.class); - + new LazyIcon("printPdf"), PDFPrint.class); // 邮件发送 - public static final WidgetOption EMAIL = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Email"), BaseUtils.readIcon("/com/fr/web/images/email.png"), Email.class); - public static final WidgetOption PRINTPREVIEW = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PrintP_Print_Preview"), - BaseUtils.readIcon("/com/fr/web/images/preview.png"), PrintPreview.class); + public static final WidgetOption EMAIL = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Email"), + new LazyIcon("email"), Email.class); + // 打印预览 + public static final WidgetOption PRINTPREVIEW = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PrintP_Print_Preview"), + new LazyIcon("printPreview"), PrintPreview.class); // 导出成Excel 分页导出 public static final WidgetOption EXCELP = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Excel_Page"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), ExcelP.class); + new LazyIcon("excel_import"), ExcelP.class); // 导出成Excel 原样导出 public static final WidgetOption EXCELO = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Excel_Simple"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), ExcelO.class); + new LazyIcon("excel_import"), ExcelO.class); // 导出成Excel 分页分Sheet导出 public static final WidgetOption EXCELS = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Excel_Page_To_Sheet"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), ExcelS.class); + new LazyIcon("excel_import"), ExcelS.class); // 导出成Word - public static final WidgetOption WORD = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Word"), BaseUtils.readIcon("/com/fr/web/images/word.png"), Word.class); + public static final WidgetOption WORD = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Word"), + new LazyIcon("wordFile"), Word.class); + // 页面设置 - public static final WidgetOption PAGESETUP = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Page_Setup"), BaseUtils.readIcon("/com/fr/web/images/pageSetup.png"), PageSetup.class); + public static final WidgetOption PAGESETUP = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Page_Setup"), + new LazyIcon("pageSetup"), PageSetup.class); // 导出 - public static final WidgetOption EXPORT = WidgetOptionFactory - .createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Export"), BaseUtils.readIcon("/com/fr/web/images/export.png"), Export.class); + public static final WidgetOption EXPORT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Export"), + new LazyIcon("export"), Export.class); // 当前页/总页数 public static final WidgetOption PAGENAVI = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Page_Navi_Text"), - BaseUtils.readIcon("/com/fr/web/images/pageNumber.png"), PageNavi.class); + new LazyIcon("page_navi"), PageNavi.class); // 首页 - public static final WidgetOption FIRST = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_First"), BaseUtils.readIcon("/com/fr/web/images/first.png"), - First.class); + public static final WidgetOption FIRST = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_First"), + new LazyIcon("page_first"), First.class); // 末页 - public static final WidgetOption LAST = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_Last"), BaseUtils.readIcon("/com/fr/web/images/last.png"), - Last.class); + public static final WidgetOption LAST = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_Last"), + new LazyIcon("page_last"), Last.class); // 前一页 public static final WidgetOption PREVIOUS = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_Previous"), - BaseUtils.readIcon("/com/fr/web/images/previous.png"), Previous.class); + new LazyIcon("page_previous"), Previous.class); // 后一页 - public static final WidgetOption NEXT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_Next"), BaseUtils.readIcon("/com/fr/web/images/next.png"), - Next.class); - public static final WidgetOption SCALE = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Enlarge_Or_Reduce"), BaseUtils.readIcon("/com/fr/web/images/scale.png"), - Scale.class); - - public static final WidgetOption NEW_PRINT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Print"), BaseUtils.readIcon("/com/fr/web/images/print.png"), NewPrint.class); - public static final WidgetOption PRINT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Print_Compatible"), BaseUtils.readIcon("/com/fr/web/images/print.png"), Print.class); + public static final WidgetOption NEXT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_Next"), + new LazyIcon("page_next"), Next.class); + //缩放 + public static final WidgetOption SCALE = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Enlarge_Or_Reduce"), + new LazyIcon("scale"), Scale.class); + // 打印 + public static final WidgetOption NEW_PRINT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Print"), + new LazyIcon("print"), NewPrint.class); + // 打印兼容 + public static final WidgetOption PRINT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Print_Compatible"), + new LazyIcon("print"), Print.class); + + //插入记录 public static final WidgetOption APPENDCOLUMNROW = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Insert_Record"), BaseUtils.readIcon("/com/fr/web/images/appendRow.png"), AppendColumnRow.class); + //删除记录 public static final WidgetOption DELETECOLUMNROW = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Delete_Record"), BaseUtils.readIcon("/com/fr/web/images/deleteRow.png"), DeleteColumnRow.class); - public static final WidgetOption VERIFY = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Verify_Data_Verify"), BaseUtils.readIcon("/com/fr/web/images/verify.png"), - Verify.class); - public static final WidgetOption SUBMITFORCIBLY = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Submit_Forcibly"), - BaseUtils.readIcon("/com/fr/web/images/save2.png"), SubmitForcibly.class); - // show cell value + //数据校验 + public static final WidgetOption VERIFY = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Verify_Data_Verify"), + new LazyIcon("dataVerify"), Verify.class); + + // show cell value 显示单元格值 public static final WidgetOption SHOWCELLVALUE = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Show_Cell_Value"), BaseUtils.readIcon("/com/fr/web/images/showValue.png"), ShowCellValue.class); - // import excel data + // import excel data 导入excel public static final WidgetOption IMPORTEXCELDATA = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Import_Excel_Data"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), ImportExcelData.class); + new LazyIcon("excel_import"), ImportExcelData.class); + //自定义导入excel public static final WidgetOption IMPORTEXCELDATA_CUSTOMIZED = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Utils_Import_Excel_Data_Customized"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), CustomizeImportExcelData.class); + new LazyIcon("excel_import"), CustomizeImportExcelData.class); + // 打印机偏移设置 - public static final WidgetOption SETPRINTEROFFSET = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_SetPrinterOffset"), BaseUtils.readIcon("/com/fr/web/images/pianyi.png"), SetPrinterOffset.class); + public static final WidgetOption SETPRINTEROFFSET = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_SetPrinterOffset"), + new LazyIcon("printerOffset"), SetPrinterOffset.class); - public static final WidgetOption CUSTOM_BUTTON = WidgetOptionFactory - .createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Custom_Form_Button"), CustomToolBarButton.class); + //自定义按钮 + public static final WidgetOption CUSTOM_BUTTON = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Custom_Form_Button"), + new LazyIcon("customButton"), CustomToolBarButton.class); // 数据暂存 public static final WidgetOption WRITESTASH = WidgetOptionFactory .createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine-Write_Stash"), BaseUtils.readIcon("/com/fr/web/images/edit/stash.png"), StashButton.class); + // 数据清空 - public static final WidgetOption WRITESTASHCLEAR = WidgetOptionFactory - .createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine-Write_Clear"), BaseUtils.readIcon("/com/fr/web/images/edit/clearstash.png"), ClearStashedButton.class); - //Excel导入 + public static final WidgetOption WRITESTASHCLEAR = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine-Write_Clear"), + new LazyIcon("clearStash"), ClearStashedButton.class); + + //Excel导入_多次 public static final WidgetOption IMPORTEXCEL= WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Excel_Import_Repeat"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), ExcelImport.class); + new LazyIcon("excel_import"), ExcelImport.class); //Excel导入_覆盖 public static final WidgetOption IMPORTEXCEL_COVER= WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Excel_Import_Cover"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), ImExcelCover.class); + new LazyIcon("excel_import"), ImExcelCover.class); //Excel导入_清空 public static final WidgetOption IMPORTEXCEL_CLEAN= WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Excel_Import_Clean"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), ImExcelClean.class); + new LazyIcon("excel_import"), ImExcelClean.class); //Excel导入_增量 public static final WidgetOption IMPORTEXCEL_APPEND= WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Excel_Import_Append"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), ImExcelAppend.class); + new LazyIcon("excel_import"), ImExcelAppend.class); } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ServerFitAttrPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ServerFitAttrPane.java index 059d9ad64d..4e2245bb44 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ServerFitAttrPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ServerFitAttrPane.java @@ -1,5 +1,7 @@ package com.fr.design.webattr; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.config.Configuration; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; @@ -11,7 +13,7 @@ import com.fr.report.fit.ReportFitConfig; import com.fr.transaction.Configurations; import com.fr.transaction.Worker; -import java.awt.Color; +import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; @@ -78,10 +80,14 @@ public class ServerFitAttrPane extends BaseFitAttrPane { }; } + /** + * 服务器配置-PC端自适应属性面板中需要添加提示 + */ @Override protected void initPrompt() { UILabel uiLabel = new UILabel(Toolkit.i18nText("Fine-Designer_Fit_Attr_Pane_Hint")); - uiLabel.setForeground(Color.lightGray); + FineUIStyle.setStyle(uiLabel, FineUIStyle.LABEL_TIP); + uiLabel.setBorder(new ScaledEmptyBorder(5, 5, 5, 0)); contentJPanel.add(uiLabel); } } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ServerPrinterPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ServerPrinterPane.java index ef4dc97dca..fe45a9c54d 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ServerPrinterPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ServerPrinterPane.java @@ -3,7 +3,10 @@ */ package com.fr.design.webattr; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineRoundBorder; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; @@ -11,12 +14,10 @@ import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.general.GeneralUtils; import com.fr.report.web.Printer; import com.fr.stable.StringUtils; -import javax.swing.BorderFactory; import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListModel; import javax.swing.JList; @@ -27,8 +28,7 @@ import javax.swing.JToolBar; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import java.awt.BorderLayout; -import java.awt.Dimension; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; @@ -36,6 +36,8 @@ import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.*; + public class ServerPrinterPane extends BasicPane { private JList printerList; @@ -52,38 +54,28 @@ public class ServerPrinterPane extends BasicPane { } protected void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(6, 2, 4, 2)); - + this.setLayout(new BorderLayout()); //Kevin Wang: 为左侧打印机添加五个图形形式的按钮 JToolBar toolbar = new JToolBar(); - this.add(toolbar, BorderLayout.NORTH); - - Dimension preferDimension = new Dimension(24, 24); - addButton = new UIButton(BaseUtils.readIcon("/com/fr/base/images/cell/control/add.png")); + addButton = new UIButton(new LazyIcon("add")); addButton.addActionListener(addActionListener); addButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add"));//"add" - addButton.setPreferredSize(preferDimension); - editButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/edit.png")); + editButton = new UIButton(new LazyIcon("edit")); editButton.addActionListener(editActionListener); editButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Edit"));//"edit" - editButton.setPreferredSize(preferDimension); - removeButton = new UIButton(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); + removeButton = new UIButton(new LazyIcon("remove")); removeButton.addActionListener(this.removeActionListener); removeButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"));//"remove" - removeButton.setPreferredSize(preferDimension); - moveUpButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/up.png")); + moveUpButton = new UIButton(new LazyIcon("move_up")); moveUpButton.addActionListener(this.moveUpActionListener); moveUpButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Up"));//"moveUp" - moveUpButton.setPreferredSize(preferDimension); - moveDownButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/down.png")); + moveDownButton = new UIButton(new LazyIcon("move_down")); moveDownButton.addActionListener(this.moveDownActionListener); moveDownButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Down"));//"moveDown" - moveDownButton.setPreferredSize(preferDimension); toolbar.add(addButton); toolbar.add(editButton); @@ -93,11 +85,12 @@ public class ServerPrinterPane extends BasicPane { printerList = new JList(new DefaultListModel()); printerList.addListSelectionListener(printerSelectionListener); + printerList.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); + JScrollPane printerListScrollPane = new JScrollPane(printerList); + printerListScrollPane.setBorder(new FineRoundBorder()); //shark:双击printerlist也可以编辑 printerList.addMouseListener(mouseClickedListener); - this.add(new JScrollPane(printerList), BorderLayout.CENTER); - - // + this.add(column(cell(toolbar), cell(printerListScrollPane).weight(1)).getComponent()); this.checkButtonEnabled(); } @@ -105,7 +98,7 @@ public class ServerPrinterPane extends BasicPane { protected String title4PopupWindow() { return "printer"; } - + private void checkButtonEnabled() { this.editButton.setEnabled(false); this.removeButton.setEnabled(false); @@ -126,7 +119,7 @@ public class ServerPrinterPane extends BasicPane { } } } - + ActionListener addActionListener = new ActionListener(){ public void actionPerformed(ActionEvent evt){ final PrintersPane printersPane = new PrintersPane(); @@ -139,13 +132,13 @@ public class ServerPrinterPane extends BasicPane { defaultListModel.addElement(newPrintName); printerList.setSelectedIndex(defaultListModel.size() - 1); } - } - }); + } + }); printerDialog.setTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportServerP_Add_Printer") + "..."); printerDialog.setVisible(true); } }; - + ActionListener editActionListener = new ActionListener(){ public void actionPerformed(ActionEvent evt){ editPrinterList(); @@ -230,7 +223,7 @@ public class ServerPrinterPane extends BasicPane { checkButtonEnabled(); } }; - + MouseAdapter mouseClickedListener = new MouseAdapter(){ @Override public void mouseClicked(MouseEvent e){ @@ -253,14 +246,14 @@ public class ServerPrinterPane extends BasicPane { if (StringUtils.isNotBlank(newPrintName)) { DefaultListModel defaultListModel = (DefaultListModel) printerList.getModel(); - + //shark 把该列删除 再在原位置插入新列 相当于替换 - defaultListModel.remove(index); - defaultListModel.add(index, newPrintName); + defaultListModel.remove(index); + defaultListModel.add(index, newPrintName); printerList.setSelectedIndex(index); } - } - }); + } + }); printersPane.populate(printerList.getSelectedValue().toString()); printerDialog.setTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportServerP_Edit_Printer") + "..."); printerDialog.setVisible(true); @@ -287,7 +280,7 @@ public class ServerPrinterPane extends BasicPane { public Printer update() { Printer printer = new Printer(); - + List serverPrinterList = new ArrayList(); DefaultListModel defaultListModel = (DefaultListModel) this.printerList.getModel(); @@ -304,7 +297,7 @@ public class ServerPrinterPane extends BasicPane { } else { printer.setPrinters(null); } - + return printer; } @@ -315,25 +308,24 @@ public class ServerPrinterPane extends BasicPane { this.initComponents(); } - protected void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(20, 5, 0, 0)); - JPanel centerPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - centerPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Printer") + ":"), BorderLayout.WEST); - + this.setLayout(new BorderLayout()); DefaultComboBoxModel printerComboModel = new DefaultComboBoxModel(); - printerCombo = new UIComboBox(printerComboModel); - centerPane.add(printerCombo); - + //添加打印机面板 + JPanel centerPane = column( + flex(), + row(LayoutConstants.HORIZONTAL_GAP, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Printer") + ":")), + cell(printerCombo).weight(1) + ), + flex() + ).getComponent(); // populate printer list. String[] serverPrinterList = GeneralUtils.getSystemPrinterNameArray(); - for (int d = 0; d < serverPrinterList.length; d++) { printerComboModel.addElement(serverPrinterList[d]); } - this.add(centerPane); } @@ -354,7 +346,7 @@ public class ServerPrinterPane extends BasicPane { protected boolean isShowHelpButton() { return false; } - + @Override protected String title4PopupWindow() { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Printer"); diff --git a/designer-realize/src/main/java/com/fr/design/webattr/SettingToolBar.java b/designer-realize/src/main/java/com/fr/design/webattr/SettingToolBar.java index 5a97f75eff..75c17326e8 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/SettingToolBar.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/SettingToolBar.java @@ -1,40 +1,49 @@ package com.fr.design.webattr; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Icon; import javax.swing.JPanel; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.row; + public class SettingToolBar extends JPanel { - private Icon setIcon = BaseUtils.readIcon("com/fr/design/images/toolbarbtn/toolbarbtnsetting.png"); - private Icon delIcon = BaseUtils.readIcon("com/fr/design/images/toolbarbtn/toolbarbtnclear.png"); + private Icon setIcon = new LazyIcon("tool_config"); + private Icon delIcon = new LazyIcon("clear"); private UIButton setButton; private UIButton delButton; private ToolBarPane toolBarPane; public SettingToolBar(String name,ToolBarPane toolBarPane) { - super(); -// this.setBackground(Color.lightGray); - this.add(new UILabel(name)); + super(new BorderLayout()); this.toolBarPane = toolBarPane; - setButton = GUICoreUtils.createTransparentButton(setIcon, setIcon, setIcon); + setButton = new UIButton(setIcon); setButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Edit_Button_ToolBar")); setButton.setAction(new SetAction()); - delButton = GUICoreUtils.createTransparentButton(delIcon, delIcon, delIcon); + + delButton = new UIButton(delIcon); delButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Remove_Button_ToolBar")); delButton.setAction(new DelAction()); - this.add(setButton); - this.add(delButton); + + this.add(row(LayoutConstants.HGAP_LARGE, + fix(LayoutConstants.HGAP_LARGE), + cell(new UILabel(name)), + cell(setButton), + cell(delButton) + ).getComponent()); } public void setEnabled(boolean b) { diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarButton.java b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarButton.java index 5e61682d87..0bc3bfea43 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarButton.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarButton.java @@ -1,6 +1,5 @@ package com.fr.design.webattr; -import com.fr.base.BaseUtils; import com.fr.base.vcs.DesignerMode; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.mainframe.DesignerContext; @@ -8,8 +7,6 @@ import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.core.WidgetOption; import com.fr.form.ui.Widget; -import com.fr.form.ui.WidgetInfoConfig; -import com.fr.stable.StringUtils; import javax.swing.*; import java.awt.*; @@ -27,7 +24,7 @@ public class ToolBarButton extends UIButton implements MouseListener { public ToolBarButton(String text, Icon icon, Widget widget) { super(text, icon); this.widget = widget; - if (widget instanceof com.fr.form.ui.Button) { + /*if (widget instanceof com.fr.form.ui.Button) { com.fr.form.ui.Button button = (com.fr.form.ui.Button) widget; String iconName = button.getIconName(); if (StringUtils.isNotEmpty(iconName)) { @@ -36,7 +33,9 @@ public class ToolBarButton extends UIButton implements MouseListener { setIcon(new ImageIcon(iimage)); } } - } + }*/ + //直接设置Icon图标 + setIcon(icon); this.addMouseListener(this); setMargin(new Insets(0, 0, 0, 0)); } @@ -79,7 +78,6 @@ public class ToolBarButton extends UIButton implements MouseListener { this.no = no; } - protected void paintBorder(Graphics g) { this.setBorderType(UIButton.NORMAL_BORDER); super.paintBorder(g); diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java index 868475b524..9d978a8c21 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java @@ -1,11 +1,15 @@ package com.fr.design.webattr; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.ExtraDesignClassManager; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; import com.fr.design.utils.gui.GUICoreUtils; @@ -16,26 +20,20 @@ import com.fr.stable.ArrayUtils; import com.fr.stable.GraphDrawHelper; import com.fr.stable.StringUtils; -import javax.swing.Icon; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.ListSelectionModel; -import javax.swing.SwingUtilities; +import javax.swing.*; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumnModel; -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.image.ImageObserver; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; + /** * 新的拖拽ToolBar button以实现自定义工具栏 报表web设置那儿的.应该不叫ToolBarDragPane,因为实际没有提供drag功能 * @@ -48,9 +46,13 @@ public class ToolBarDragPane extends WidgetToolBarPane { private int row = 7; private DefaultTableModel toolbarButtonTableModel; private JTable layoutTable; - private UICheckBox isUseToolBarCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Use_ToolBar") + ":"); // 是否使用工具栏 - private boolean isEnabled; + //是否使用工具栏 + private UICheckBox isUseToolBarCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Use_ToolBar")); + private boolean isEnabled; + /** + * 工具栏Pane + */ public ToolBarDragPane() { WidgetOption[] options = ExtraDesignClassManager.getInstance().getWebWidgetOptions(); if(options != null){ @@ -59,10 +61,14 @@ public class ToolBarDragPane extends WidgetToolBarPane { } toolbarButtonTableModel = new TableModel(row ,COLUMN); this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel north = FRGUIPaneFactory.createBorderLayout_S_Pane(); - UIButton defaultButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Restore_Default")); - // 恢复默认按钮 - defaultButton.addActionListener(new ActionListener() { + + //工具栏上方面板 + JPanel northPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + isUseToolBarCheckBox.setSelected(true); + northPanel.add(isUseToolBarCheckBox, BorderLayout.WEST); + //恢复默认按钮 + UIButton defaultButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Restore_Default")); + defaultButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { northToolBar.removeButtonList(); northToolBar.removeAll(); @@ -78,26 +84,30 @@ public class ToolBarDragPane extends WidgetToolBarPane { ToolBarDragPane.this.repaint(); } }); + northPanel.add(defaultButton, BorderLayout.EAST); - north.add(isUseToolBarCheckBox, BorderLayout.WEST); - JPanel aa = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - aa.add(defaultButton); - north.add(aa, BorderLayout.CENTER); - this.add(north, BorderLayout.NORTH); - + //顶部工具栏 + JPanel northContentPane = new JPanel(new BorderLayout()); northToolBar = new ToolBarPane(); - northToolBar.setPreferredSize(new Dimension(ImageObserver.WIDTH, 26)); -// northToolBar.setBackground(Color.lightGray); - - UIButton topButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/arrow/arrow_up.png")); - topButton.setBorder(null); - // topButton.setMargin(null); - topButton.setOpaque(false); + northToolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, UIManager.getColor("defaultBorderColor"))); + northToolBar.setOpaque(false); + SettingToolBar top = new SettingToolBar(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ToolBar_Top"), northToolBar); + top.setOpaque(false); + northContentPane.add(northToolBar, BorderLayout.CENTER); + northContentPane.add(top, BorderLayout.EAST); + northContentPane.setOpaque(false); + northContentPane.setBorder(new ScaledEmptyBorder(4,0,4,0)); + JPanel topToolbarPanel = new JPanel(new BorderLayout()); + topToolbarPanel.add(northContentPane); + topToolbarPanel.setBackground(FineUIUtils.getUIColor("Center.ZoneBorderColor", "defaultBorderColor")); + + //移入顶部工具栏按钮 + UIButton topButton = new UIButton(new LazyIcon("move_up")); + topButton.setOpaque(false); topButton.setContentAreaFilled(false); topButton.setFocusPainted(false); topButton.setRequestFocusEnabled(false); topButton.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { if (isSelectedtable()) { @@ -113,15 +123,26 @@ public class ToolBarDragPane extends WidgetToolBarPane { } } }); - UIButton downButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/arrow/arrow_down.png")); - downButton.setBorder(null); + + //图标列表面板,增加外边距 + initLayoutTable(); + JPanel innerTablePanel = new JPanel(new BorderLayout()); + innerTablePanel.add(layoutTable); + innerTablePanel.setOpaque(false); + innerTablePanel.setBorder(new ScaledEmptyBorder(4,4,4,4)); + JPanel buttonTablePanel = new JPanel(new BorderLayout()); + buttonTablePanel.setBackground(FlatUIUtils.getUIColor("fill.normal", Color.WHITE)); + buttonTablePanel.setBorder(new FineRoundBorder()); + buttonTablePanel.add(innerTablePanel); + + //移入底部工具栏按钮 + UIButton downButton = new UIButton(new LazyIcon("move_down")); downButton.setMargin(null); downButton.setOpaque(false); downButton.setContentAreaFilled(false); downButton.setFocusPainted(false); downButton.setRequestFocusEnabled(false); downButton.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { if (isSelectedtable()) { @@ -138,48 +159,44 @@ public class ToolBarDragPane extends WidgetToolBarPane { } }); - initLayoutTable(); - - JPanel center = FRGUIPaneFactory.createBorderLayout_S_Pane(); -// center.setBackground(Color.WHITE); - center.add(topButton, BorderLayout.NORTH); - JPanel small = FRGUIPaneFactory.createBorderLayout_S_Pane(); -// small.setBackground(Color.WHITE); - small.add(new UILabel(StringUtils.BLANK), BorderLayout.NORTH); - small.add(layoutTable, BorderLayout.CENTER); - center.add(small, BorderLayout.CENTER); - center.add(downButton, BorderLayout.SOUTH); - southToolBar = new ToolBarPane(); - southToolBar.setPreferredSize(new Dimension(ImageObserver.WIDTH, 26)); -// southToolBar.setBackground(Color.lightGray); - JPanel movePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - JPanel northContentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - SettingToolBar top = new SettingToolBar(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ToolBar_Top"), northToolBar); - northContentPane.add(top, BorderLayout.EAST); - northContentPane.add(northToolBar, BorderLayout.CENTER); -// northContentPane.setBackground(Color.lightGray); - + //底部工具栏 JPanel southContentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + southToolBar = new ToolBarPane(); + southToolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, UIManager.getColor("defaultBorderColor"))); + southToolBar.setOpaque(false); SettingToolBar bottom = new SettingToolBar(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ToolBar_Bottom"), southToolBar); + bottom.setOpaque(false); southContentPane.add(bottom, BorderLayout.EAST); southContentPane.add(southToolBar, BorderLayout.CENTER); -// southContentPane.setBackground(Color.lightGray); + southContentPane.setOpaque(false); + southContentPane.setBorder(new ScaledEmptyBorder(4,0,4,0)); + JPanel bottomToolbarPanel = new JPanel(new BorderLayout()); + bottomToolbarPanel.add(southContentPane); + bottomToolbarPanel.setBackground(FineUIUtils.getUIColor("Center.ZoneBorderColor", "defaultBorderColor")); - movePane.add(northContentPane, BorderLayout.NORTH); - movePane.add(center, BorderLayout.CENTER); - movePane.add(southContentPane, BorderLayout.SOUTH); - - this.add(new JScrollPane(movePane), BorderLayout.CENTER); - isUseToolBarCheckBox.setSelected(true); + //工具栏面板center布局:顶部工具栏-上移动按钮-图标面板-下移动按钮-底部工具栏 + JPanel movePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + movePane.add(column(1, + cell(topToolbarPanel), + cell(topButton), + cell(buttonTablePanel), + cell(downButton), + cell(bottomToolbarPanel) + ).getComponent()); + //工具栏整体面板 + this.add(column(LayoutConstants.VERTICAL_GAP, cell(northPanel), cell(new JScrollPane(movePane))).getComponent()); } + /** + * 图标列表 + */ private void initLayoutTable() { layoutTable = new JTable(toolbarButtonTableModel); layoutTable.setDefaultRenderer(Object.class, tableRenderer); layoutTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); layoutTable.setColumnSelectionAllowed(false); layoutTable.setRowSelectionAllowed(false); -// layoutTable.setBackground(Color.WHITE); + layoutTable.setOpaque(false); layoutTable.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() > 1 && !(SwingUtilities.isRightMouseButton(e)) && isEnabled) { @@ -280,6 +297,7 @@ public class ToolBarDragPane extends WidgetToolBarPane { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + this.setOpaque(false); if (value instanceof WidgetOption) { WidgetOption nameOption = (WidgetOption)value; diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarPane.java index ef228699f6..747d0a2b75 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarPane.java @@ -13,7 +13,7 @@ import com.fr.report.web.annotation.OldPrintMethod; import javax.swing.BorderFactory; import javax.swing.SwingUtilities; import javax.swing.TransferHandler; -import java.awt.Component; +import java.awt.*; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.event.MouseAdapter; @@ -55,6 +55,7 @@ public class ToolBarPane extends BasicBeanPane { public void initComponent() { this.addMouseListener(listener); this.setLayout(FRGUIPaneFactory.createBoxFlowLayout()); + this.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 2)); this.setTransferHandler(new ToolBarHandler(TransferHandler.COPY)); this.setBorder(BorderFactory.createTitledBorder("")); } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ViewToolBarPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ViewToolBarPane.java index c396538dd4..f6bdc7e193 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ViewToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ViewToolBarPane.java @@ -1,7 +1,9 @@ package com.fr.design.webattr; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.ConfigManager; import com.fr.config.Configuration; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.core.WidgetOption; @@ -9,7 +11,6 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.form.event.Listener; import com.fr.report.web.Location; @@ -27,24 +28,25 @@ import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapBoldLabelWithUnderline; + public class ViewToolBarPane extends AbstractEditToolBarPane { private EventPane eventPane; - + private UICheckBox isUseToolBarCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Use_ToolBar")); private UIButton editToolBarButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit")); - private UILabel showListenersLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Editing_Listeners") + ":"); + private UILabel showListenersLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Editing_Listeners")); private UICheckBox sortCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Sort_Sort")); private UICheckBox conditonFilterBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Selection_Filter")); private UICheckBox listFilterBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_List_Filter")); - + public ViewToolBarPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel allPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); - - this.add(allPanel, BorderLayout.CENTER); - JPanel northPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(1); - allPanel.add(northPane, BorderLayout.NORTH); - editToolBarButton.addActionListener(editBtnListener); + this.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); + editToolBarButton.addActionListener(editBtnListener); isUseToolBarCheckBox.setSelected(true); isUseToolBarCheckBox.addActionListener(new ActionListener() { @Override @@ -56,25 +58,35 @@ public class ViewToolBarPane extends AbstractEditToolBarPane { sortCheckBox.setSelected(false); conditonFilterBox.setSelected(false); listFilterBox.setSelected(false); - northPane.add(GUICoreUtils.createFlowPane(new Component[]{sortCheckBox, conditonFilterBox, listFilterBox}, FlowLayout.LEFT, 6)); - northPane.add(GUICoreUtils.createFlowPane(new Component[] {isUseToolBarCheckBox, editToolBarButton}, FlowLayout.LEFT)); - northPane.add(GUICoreUtils.createFlowPane(showListenersLabel, FlowLayout.LEFT)); + JPanel northPanel = column(LayoutConstants.VERTICAL_GAP, + row(LayoutConstants.HORIZONTAL_GAP, cell(sortCheckBox), cell(conditonFilterBox), cell(listFilterBox)), + row(LayoutConstants.HORIZONTAL_GAP, cell(isUseToolBarCheckBox), cell(editToolBarButton)) + ).getComponent(); + + //事件编辑 + JPanel eventPanel = new JPanel(new BorderLayout()); eventPane = new EventPane(new WebView().supportedEvents()); - JPanel center = FRGUIPaneFactory.createBorderLayout_S_Pane(); - center.add(eventPane, BorderLayout.CENTER); - allPanel.add(center, BorderLayout.CENTER); + wrapBoldLabelWithUnderline(showListenersLabel); + eventPanel.add(column(LayoutConstants.VGAP_SMALL, cell(showListenersLabel), cell(eventPane).weight(1)).getComponent()); + + //整体布局 + this.add(column(LayoutConstants.VERTICAL_GAP, + cell(northPanel), + cell(eventPanel).weight(1) + ).getComponent()); + //wei : 默认没config.xml的情况下,就有默认工具栏 ToolBarManager toolBarManager = ToolBarManager.createDefaultViewToolBar(); toolBarManager.setToolBarLocation(Location.createTopEmbedLocation()); this.toolBarManagers = new ToolBarManager[] {toolBarManager}; } - + @Override public void setEnabled(boolean isEnabled) { super.setEnabled(isEnabled); - + this.eventPane.setEnabled(isEnabled); - + this.isUseToolBarCheckBox.setEnabled(isEnabled); this.sortCheckBox.setEnabled(isEnabled); this.conditonFilterBox.setEnabled(isEnabled); @@ -82,7 +94,7 @@ public class ViewToolBarPane extends AbstractEditToolBarPane { this.editToolBarButton.setEnabled(isEnabled && isUseToolBarCheckBox.isSelected()); this.showListenersLabel.setEnabled(isEnabled); } - + @Override protected String title4PopupWindow() { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_M_Data_Analysis_Settings"); @@ -132,9 +144,9 @@ public class ViewToolBarPane extends AbstractEditToolBarPane { return webView; } - /** - * 编辑服务器工具栏窗格 - */ + /** + * 编辑服务器工具栏窗格 + */ @Override public void editServerToolBarPane() { final ViewToolBarPane serverPageToolBarPane = new ViewToolBarPane(); @@ -144,7 +156,7 @@ public class ViewToolBarPane extends AbstractEditToolBarPane { } BasicDialog serverPageDialog = serverPageToolBarPane.showWindow(SwingUtilities.getWindowAncestor(ViewToolBarPane.this)); serverPageDialog.addDialogActionListener(new DialogActionAdapter() { - + @Override public void doOk() { Configurations.update(new Worker() { @@ -163,12 +175,12 @@ public class ViewToolBarPane extends AbstractEditToolBarPane { } }); serverPageDialog.setVisible(true); - + } - @Override - protected WidgetOption[] getToolBarInstance() { - return ReportWebWidgetConstants.getViewToolBarInstance(); - } + @Override + protected WidgetOption[] getToolBarInstance() { + return ReportWebWidgetConstants.getViewToolBarInstance(); + } } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ViewWebSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ViewWebSettingPane.java index 1d91f0d911..8cc054a80c 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ViewWebSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ViewWebSettingPane.java @@ -4,18 +4,20 @@ import com.fr.design.ExtraDesignClassManager; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.report.web.ToolBarManager; import com.fr.report.web.WebView; import com.fr.web.attr.ReportWebAttr; import javax.swing.*; -import java.awt.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + public class ViewWebSettingPane extends WebSettingPane { private UICheckBox sortCheckBox; private UICheckBox conditionFilterBox; @@ -25,17 +27,24 @@ public class ViewWebSettingPane extends WebSettingPane { super(); } + /** + * 模板-模板Web属性-数据分析设置中其余设置面板,通用部分在父类绘制 + * @return + */ @Override protected JPanel createOtherSetPane() { sortCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Sort_Sort")); conditionFilterBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Selection_Filter")); listFilterBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_List_Filter")); - sortCheckBox.setSelected(true); conditionFilterBox.setSelected(true); listFilterBox.setSelected(true); - return GUICoreUtils.createFlowPane(new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ViewPreview") + ":"), - sortCheckBox, conditionFilterBox, listFilterBox}, FlowLayout.LEFT, 6); + return row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ViewPreview"))).weight(0.15), + cell(sortCheckBox).weight(0.15), + cell(conditionFilterBox).weight(0.15), + cell(listFilterBox).weight(0.15), + flex(0.4) + ).getComponent(); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/webattr/WebCssPane.java b/designer-realize/src/main/java/com/fr/design/webattr/WebCssPane.java index 7dcd3e21b2..465f9c6b96 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/WebCssPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/WebCssPane.java @@ -1,5 +1,8 @@ package com.fr.design.webattr; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.frpane.EditingStringListPane; import com.fr.design.gui.ibutton.UIButton; @@ -16,57 +19,59 @@ import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; import com.fr.web.attr.ReportWebAttr; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.*; + public class WebCssPane extends BasicPane { private UITextField localText; UIButton chooseFile; private EditingStringListPane centerPane; public WebCssPane() { - this.setLayout(new BorderLayout(0, 20)); - this.setBorder(BorderFactory.createEmptyBorder(10, 5, 0, 0)); - - JPanel outnorth = new JPanel(new BorderLayout(0, 5)); - JPanel northPane = new JPanel(new FlowLayout(FlowLayout.LEFT,8,0)); + this.setLayout(new BorderLayout()); + this.setBorder(new ScaledEmptyBorder(10,10,10,10)); + + //磁盘文件 localText = new UITextField(); localText.setPreferredSize(DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.web.pane.text.field")); localText.setEditable(false); chooseFile = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Selection")); - chooseFile.setPreferredSize(new Dimension(75, 23)); chooseFile.addActionListener(chooseFileListener); - northPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Disk_File") + ":"), FlowLayout.LEFT); - northPane.add(localText, FlowLayout.CENTER); - northPane.add(chooseFile, FlowLayout.RIGHT); - outnorth.add(northPane,BorderLayout.NORTH); - UILabel infor = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CSS_Warning", - ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBAPP_NAME)); - infor.setForeground(new Color(207, 42, 39)); - outnorth.add(infor,BorderLayout.CENTER); - this.add(outnorth, BorderLayout.NORTH); - centerPane = new EditingStringListPane() { + //红色提示信息 + UILabel info = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CSS_Warning", + ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBAPP_NAME)); + FineUIStyle.setStyle(info, FineUIStyle.LABEL_WARNING_TIP); + centerPane = new EditingStringListPane() { @Override protected void selectedChanged(String selected) { localText.setText(selected); checkEnableState(); } - @Override protected String getAddOrEditString() { return localText.getText(); } }; - this.add(centerPane, BorderLayout.CENTER); + + JPanel workPanel = new JPanel(new BorderLayout()); + workPanel.add(column(LayoutConstants.VERTICAL_GAP, + row(LayoutConstants.VERTICAL_GAP, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Disk_File"))), + cell(localText).weight(0.8), + cell(chooseFile) + ), + cell(info), + cell(centerPane) + ).getComponent()); + this.add(workPanel); } private ActionListener chooseFileListener = new ActionListener() { @@ -122,6 +127,5 @@ public class WebCssPane extends BasicPane { String a = valueList.get(i); reportWebAttr.addCSSImport(a); } - } } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/WebJsPane.java b/designer-realize/src/main/java/com/fr/design/webattr/WebJsPane.java index 7b371802b6..09ff19b977 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/WebJsPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/WebJsPane.java @@ -1,5 +1,8 @@ package com.fr.design.webattr; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.frpane.EditingStringListPane; @@ -19,15 +22,12 @@ import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; import com.fr.web.attr.ReportWebAttr; -import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingUtilities; import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; @@ -40,6 +40,8 @@ import java.net.URLConnection; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.*; + public class WebJsPane extends BasicPane { private UITextField localText; private UITextField urlText; @@ -48,15 +50,15 @@ public class WebJsPane extends BasicPane { private EditingStringListPane editingPane; UIButton chooseFile; UIButton testConnection; - UILabel infor1; - UILabel infor2; + UILabel info1; + UILabel info2; public WebJsPane() { - this.setLayout(new BorderLayout(0, 20)); - this.setBorder(BorderFactory.createEmptyBorder(10, 5, 0, 0)); + this.setLayout(new BorderLayout()); + this.setBorder(new ScaledEmptyBorder(10,10,10,10)); - localFileRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Disk_File") + ":", true); - urlFileRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Url_Location")+ ":", false); + localFileRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Disk_File"), true); + urlFileRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Url_Location"), false); ButtonGroup bg = new ButtonGroup(); bg.add(localFileRadioButton); bg.add(urlFileRadioButton); @@ -85,38 +87,24 @@ public class WebJsPane extends BasicPane { testConnection.setPreferredSize(chooseFile.getPreferredSize()); } - createNorthPane(); - createEditingPane(); } private void createNorthPane() { - JPanel outnorth = new JPanel(new BorderLayout(0, 5)); - JPanel firstnorth = new JPanel(new BorderLayout(0, 5)); - JPanel northPane = new JPanel(new FlowLayout(FlowLayout.LEFT,7,0)); - northPane.add(localFileRadioButton); - northPane.add(localText); - northPane.add(chooseFile); - firstnorth.add(northPane,BorderLayout.NORTH); - infor1 = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JS_WARNING1", - ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBAPP_NAME)); - infor1.setForeground(new Color(207, 42, 39)); - firstnorth.add(infor1,BorderLayout.CENTER); - - JPanel secondnorth = new JPanel(new BorderLayout(0, 5)); - JPanel centerPane = new JPanel(new FlowLayout(FlowLayout.LEFT,7,0)); - centerPane.add(urlFileRadioButton); - centerPane.add(urlText); - centerPane.add(testConnection); - secondnorth.add(centerPane,BorderLayout.NORTH); - infor2 = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JS_WARNING2", ProjectConstants.WEBAPP_NAME)); - infor2.setForeground(new Color(207, 42, 39)); - secondnorth.add(infor2,BorderLayout.CENTER); - - outnorth.add(firstnorth,BorderLayout.NORTH); - outnorth.add(secondnorth,BorderLayout.CENTER); - this.add(outnorth, BorderLayout.NORTH); + info1 = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JS_WARNING1", ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBAPP_NAME)); + FineUIStyle.setStyle(info1, FineUIStyle.LABEL_WARNING_TIP); + info2 = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JS_WARNING2", ProjectConstants.WEBAPP_NAME)); + FineUIStyle.setStyle(info2, FineUIStyle.LABEL_WARNING_TIP); + JPanel outNorth = column(LayoutConstants.VERTICAL_GAP, + row(LayoutConstants.HORIZONTAL_GAP, cell(localFileRadioButton), cell(localText).weight(0.8), cell(chooseFile)), + cell(info1), + row(LayoutConstants.HORIZONTAL_GAP, cell(urlFileRadioButton), cell(urlText).weight(0.8), cell(testConnection)), + cell(info2) + ).getComponent(); + JPanel workPanel = new JPanel(new BorderLayout()); + workPanel.add(outNorth); + this.add(workPanel, BorderLayout.NORTH); } private void createEditingPane() { @@ -130,7 +118,7 @@ public class WebJsPane extends BasicPane { if (url.matches("^[a-zA-z]+://.+js")) { return url; } else { - FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(WebJsPane.this), com.fr.design.i18n.Toolkit.i18nText("Add_JS_warning")); + FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(WebJsPane.this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add_JS_warning")); return ""; } } @@ -153,6 +141,10 @@ public class WebJsPane extends BasicPane { checkEnableState(); } }; + + JPanel workPanel = new JPanel(new BorderLayout()); + editingPane.setBorder(new ScaledEmptyBorder(10,0,0,0)); + workPanel.add(editingPane); this.add(editingPane, BorderLayout.CENTER); } @@ -162,7 +154,6 @@ public class WebJsPane extends BasicPane { } private ActionListener chooseFileListener = new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { FILEChooserPane fileChooser = FILEChooserPane.getInstance(false, false, true, @@ -191,7 +182,7 @@ public class WebJsPane extends BasicPane { public void actionPerformed(ActionEvent arg0) { String uri = urlText.getText(); if (!uri.matches("^[a-zA-z]+://.+js")) { - FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(WebJsPane.this), com.fr.design.i18n.Toolkit.i18nText("Add_JS_warning")); + FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(WebJsPane.this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add_JS_warning")); return; } InputStream in = null; @@ -224,14 +215,14 @@ public class WebJsPane extends BasicPane { localRadioSelectAction(); urlFileRadioButton.setForeground(new Color(143, 142, 139)); localFileRadioButton.setForeground(Color.black); - infor1.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JS_WARNING1", ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBAPP_NAME)); - infor2.setText(" "); + info1.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JS_WARNING1", ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBAPP_NAME)); + info2.setText(" "); } else if (urlFileRadioButton.isSelected()) { urlRadioSelectAction(); localFileRadioButton.setForeground(new Color(143, 142, 139)); urlFileRadioButton.setForeground(Color.black); - infor2.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JS_WARNING2", ProjectConstants.WEBAPP_NAME)); - infor1.setText(" "); + info2.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JS_WARNING2", ProjectConstants.WEBAPP_NAME)); + info1.setText(" "); } if (StringUtils.isEmpty(urlText.getText()) && StringUtils.isEmpty(localText.getText())) { editingPane.setAddEnabled(false); diff --git a/designer-realize/src/main/java/com/fr/design/webattr/WebSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/WebSettingPane.java index 59b0d2316e..c39aa988c4 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/WebSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/WebSettingPane.java @@ -1,13 +1,14 @@ package com.fr.design.webattr; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.border.FineBorderFactory; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.form.event.Listener; import com.fr.report.web.ToolBarManager; @@ -22,6 +23,11 @@ import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapBoldLabelWithUnderline; + public abstract class WebSettingPane extends BasicBeanPane { private static final String[] CHOOSEITEM = new String[] { com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_I_Want_To_Set_Single"), @@ -37,52 +43,58 @@ public abstract class WebSettingPane extends BasicBeanPane private static final int ZERO = 0; private static final long LONGZERO = 0L; + /** + * 模板-模板Web属性-分页预览设置/填报页面设置/数据分析设置通用面板 + */ public WebSettingPane() { - JPanel buttonPane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 6)); + //以下设置 choseComboBox = new UIComboBox(CHOOSEITEM); choseComboBox.addItemListener(itemListener); - buttonPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Blow_Set") + ":")); - buttonPane.add(choseComboBox); + JPanel buttonPane = row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Blow_Set"))).weight(0.15), + cell(choseComboBox).weight(0.85) + ).getComponent(); + + //工具栏 dragToolBarPane = new ToolBarDragPane(); dragToolBarPane.setDefaultToolBar(getDefaultToolBarManager(), getToolBarInstance()); - JPanel eventpanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - eventpanel.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event_Set") + ':'), BorderLayout.NORTH); - eventPane = new EventPane(getEventNames()); - eventpanel.add(eventPane, BorderLayout.CENTER); - - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] columnSize = {f}; - - JPanel othersetpane = createOtherSetPane(); - JPanel panel ; - if (othersetpane != null) { - - Component[][] components = new Component[][]{ - new Component[]{buttonPane}, - new Component[]{othersetpane}, - new Component[]{dragToolBarPane}, - new Component[]{eventpanel} - }; - double[] rowSize1 = { p,p,p,f }; - - panel = TableLayoutHelper.createTableLayoutPane(components,rowSize1,columnSize); + //事件设置 + JPanel eventPanel = new JPanel(new BorderLayout()); + eventPane = new EventPane(getEventNames()); + UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event_Set")); + wrapBoldLabelWithUnderline(label); + eventPanel.add(column(LayoutConstants.VGAP_SMALL, cell(label), cell(eventPane)).getComponent()); + + //其余设置面板,不同页面中分别绘制 + JPanel otherSetPane = createOtherSetPane(); + + //横向分割线 + JPanel separatorLine = new JPanel(); + separatorLine.setBorder(FineBorderFactory.createDefaultUnderlineBorder()); + separatorLine.setPreferredSize(FineUIScale.scale(new Dimension(1, 1))); + + //整体布局 + JPanel panel = new JPanel(new BorderLayout()); + panel.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); + if (otherSetPane != null) { + panel.add(column(LayoutConstants.VERTICAL_GAP, + cell(buttonPane), + cell(otherSetPane), + cell(separatorLine), + cell(dragToolBarPane), + cell(eventPanel) + ).getComponent()); } else { - Component[][] components = new Component[][]{ - new Component[]{buttonPane}, - new Component[]{dragToolBarPane}, - new Component[]{eventpanel} - }; - double[] rowSize2 = { p,p,f }; - - panel = TableLayoutHelper.createTableLayoutPane(components,rowSize2,columnSize); + panel.add(column(LayoutConstants.VERTICAL_GAP, + cell(buttonPane), + cell(separatorLine), + cell(dragToolBarPane), + cell(eventPanel) + ).getComponent()); } - - this.setLayout(new BorderLayout()); - - UIScrollPane scrollPane = new UIScrollPane(panel); - this.add(scrollPane, BorderLayout.CENTER); + this.setLayout(new BorderLayout()); + this.add(new UIScrollPane(panel)); } ItemListener itemListener = new ItemListener() { diff --git a/designer-realize/src/main/java/com/fr/design/webattr/WriteToolBarPane.java b/designer-realize/src/main/java/com/fr/design/webattr/WriteToolBarPane.java index a2e0c53c2f..35bc1b081d 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/WriteToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/WriteToolBarPane.java @@ -1,9 +1,11 @@ package com.fr.design.webattr; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.ConfigManager; import com.fr.config.Configuration; import com.fr.design.ExtraDesignClassManager; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.core.WidgetOption; @@ -14,7 +16,6 @@ import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.form.event.Listener; import com.fr.report.web.Location; @@ -35,6 +36,12 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapBoldLabelWithUnderline; + public class WriteToolBarPane extends AbstractEditToolBarPane { private EventPane eventPane; private UICheckBox colorBox; @@ -45,66 +52,90 @@ public class WriteToolBarPane extends AbstractEditToolBarPane { private UILabel sheetShowLocationLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sheet_Label_Page_Display_Position")); private UIRadioButton centerRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Center_Display")); private UIRadioButton leftRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Left_Display")); - private UILabel rptShowLocationLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Location") + ":", UILabel.LEFT); + private UILabel rptShowLocationLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Location")); private UICheckBox isUseToolBarCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Use_ToolBar")); private UIButton editToolBarButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit")); - private UILabel showListenersLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Editing_Listeners") + ":"); + private UILabel showListenersLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Editing_Listeners")); private UICheckBox unloadCheck; private UICheckBox showWidgets; private UICheckBox isAutoStash;//自动暂存 public WriteToolBarPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel allPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); - this.add(allPanel, BorderLayout.CENTER); - JPanel northPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); - allPanel.add(northPane, BorderLayout.NORTH); + this.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); //sheet标签页显示位置 ButtonGroup sheetButtonGroup = new ButtonGroup(); bottomRadioButton.setSelected(true); sheetButtonGroup.add(topRadioButton); sheetButtonGroup.add(bottomRadioButton); - northPane.add(GUICoreUtils.createFlowPane(new Component[]{sheetShowLocationLabel, topRadioButton, bottomRadioButton}, FlowLayout.LEFT)); + JPanel sheetPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(sheetShowLocationLabel), + cell(topRadioButton), + cell(bottomRadioButton)).getComponent(); //Sean:报表显示位置 ButtonGroup rptButtonGroup = new ButtonGroup(); leftRadioButton.setSelected(true); rptButtonGroup.add(leftRadioButton); rptButtonGroup.add(centerRadioButton); - northPane.add(GUICoreUtils.createFlowPane(new Component[]{rptShowLocationLabel, centerRadioButton, leftRadioButton}, FlowLayout.LEFT)); - - colorBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Face_Write_Current_Edit_Row_Background") + ":"); + JPanel showLocPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(rptShowLocationLabel), + cell(centerRadioButton), + cell(leftRadioButton) + ).getComponent(); + + //当前编辑行背景设置 + colorBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Face_Write_Current_Edit_Row_Background")); colorBox.setSelected(false); colorBox.addActionListener(colorListener); - colorButton = new UINoThemeColorButton(BaseUtils.readIcon("/com/fr/design/images/gui/color/background.png")); - northPane.add(GUICoreUtils.createFlowPane(new Component[]{colorBox, colorButton}, FlowLayout.LEFT)); + colorButton = new UINoThemeColorButton(new LazyIcon("background")); + JPanel backgroundPane = row(cell(colorBox), fix(LayoutConstants.HGAP_SMALL), cell(colorButton)).getComponent(); + //勾选框 unloadCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unload_Check")); unloadCheck.setSelected(true); - showWidgets = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event_Show_Widgets")); showWidgets.setSelected(false); isAutoStash = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Write_Auto_Stash")); isAutoStash.setSelected(false); - northPane.add(GUICoreUtils.createFlowPane(new Component[]{unloadCheck, showWidgets, isAutoStash}, FlowLayout.LEFT)); + JPanel unloadCheckPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(unloadCheck), + cell(showWidgets), + cell(isAutoStash) + ).getComponent(); + + JPanel northPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); + northPane.add(sheetPane); + northPane.add(showLocPane); + northPane.add(backgroundPane); + northPane.add(unloadCheckPane); + //工具栏编辑 editToolBarButton.addActionListener(editBtnListener); isUseToolBarCheckBox.setSelected(true); isUseToolBarCheckBox.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { editToolBarButton.setEnabled(isUseToolBarCheckBox.isSelected()); } }); - northPane.add(GUICoreUtils.createFlowPane(new Component[]{isUseToolBarCheckBox, editToolBarButton}, FlowLayout.LEFT)); - northPane.add(new UILabel()); - northPane.add(GUICoreUtils.createFlowPane(showListenersLabel, FlowLayout.LEFT)); + + JPanel northPanel = column(LayoutConstants.VERTICAL_GAP, + cell(northPane), + row(LayoutConstants.HORIZONTAL_GAP, cell(isUseToolBarCheckBox), cell(editToolBarButton)) + ).getComponent(); + + //事件编辑 + JPanel eventPanel = new JPanel(new BorderLayout()); eventPane = new EventPane(new WebWrite().supportedEvents()); - JPanel center = FRGUIPaneFactory.createBorderLayout_S_Pane(); - center.add(eventPane, BorderLayout.CENTER); - allPanel.add(center, BorderLayout.CENTER); + wrapBoldLabelWithUnderline(showListenersLabel); + eventPanel.add(column(LayoutConstants.VGAP_SMALL, cell(showListenersLabel), cell(eventPane).weight(1)).getComponent()); + + this.add(column(LayoutConstants.VERTICAL_GAP, + cell(northPanel), + cell(eventPanel).weight(1) + ).getComponent()); //wei : 默认没config.xml的情况下,就有默认工具栏 ToolBarManager toolBarManager = ToolBarManager.createDefaultWriteToolBar(); toolBarManager.setToolBarLocation(Location.createTopEmbedLocation()); @@ -112,7 +143,6 @@ public class WriteToolBarPane extends AbstractEditToolBarPane { } private ActionListener editBtnListener = new ActionListener() { - public void actionPerformed(ActionEvent e) { final DragToolBarPane dragToolbarPane = new DragToolBarPane(); dragToolbarPane.setDefaultToolBar(ToolBarManager.createDefaultWriteToolBar(), getToolBarInstance()); diff --git a/designer-realize/src/main/java/com/fr/design/webattr/WriteWebSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/WriteWebSettingPane.java index dd93281acd..294116e60b 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/WriteWebSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/WriteWebSettingPane.java @@ -1,14 +1,14 @@ package com.fr.design.webattr; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.ExtraDesignClassManager; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.ibutton.UIColorButton; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.report.web.ToolBarManager; import com.fr.report.web.WebWrite; @@ -16,13 +16,15 @@ import com.fr.stable.Constants; import com.fr.web.attr.ReportWebAttr; import javax.swing.*; -import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + public class WriteWebSettingPane extends WebSettingPane { private UICheckBox colorBox; private UIColorButton colorButton; @@ -40,47 +42,63 @@ public class WriteWebSettingPane extends WebSettingPane { super(); } + /** + * 模板-模板Web属性-填报页面设置中其余设置面板,通用部分在父类绘制 + * @return + */ @Override protected JPanel createOtherSetPane() { - colorBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Background_Of_Current_Row") + ":"); - colorBox.setSelected(true); - colorButton = new UIColorButton(BaseUtils.readIcon("/com/fr/design/images/gui/color/background.png")); - colorBox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - colorButton.setEnabled(colorBox.isSelected()); - } - - }); - JPanel backgroundPane = GUICoreUtils.createFlowPane(new Component[]{colorBox, colorButton}, FlowLayout.LEFT); - //sheet标签页显示位置 topRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Top")); bottomRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bottom")); - sheetShowLocationLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sheet_Label_Page_Display_Position"), UILabel.LEFT); + sheetShowLocationLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sheet_Label_Page_Display_Position")); ButtonGroup buttonGroup = new ButtonGroup(); bottomRadioButton.setSelected(true); buttonGroup.add(topRadioButton); buttonGroup.add(bottomRadioButton); - JPanel sheetPane = GUICoreUtils.createFlowPane(new Component[]{sheetShowLocationLabel, topRadioButton, bottomRadioButton}, FlowLayout.LEFT); + JPanel sheetPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(sheetShowLocationLabel), + cell(topRadioButton), + cell(bottomRadioButton)).getComponent(); //Sean: 报表显示位置since 706 - rptShowLocationLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Location") + ":", UILabel.LEFT); + rptShowLocationLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Location")); centerRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Center_Display")); leftRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Left_Display")); ButtonGroup rptShowButtonGroup = new ButtonGroup(); leftRadioButton.setSelected(true); rptShowButtonGroup.add(centerRadioButton); rptShowButtonGroup.add(leftRadioButton); - JPanel showLocPane = GUICoreUtils.createFlowPane(new Component[]{rptShowLocationLabel, centerRadioButton, leftRadioButton}, FlowLayout.LEFT); + JPanel showLocPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(rptShowLocationLabel), + cell(centerRadioButton), + cell(leftRadioButton) + ).getComponent(); + + //填报当前编辑行背景设置 + colorBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Background_Of_Current_Row")); + colorBox.setSelected(true); + colorButton = new UIColorButton(new LazyIcon("background")); + colorBox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + colorButton.setEnabled(colorBox.isSelected()); + } + }); + JPanel backgroundPane = row(cell(colorBox), cell(colorButton)).getComponent(); + //勾选设置 unloadCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unload_Check")); unloadCheck.setSelected(true); - showWidgets = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event_Show_Widgets")); showWidgets.setSelected(false); isAutoStash = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Write_Auto_Stash")); isAutoStash.setSelected(false); - JPanel unloadCheckPane = GUICoreUtils.createFlowPane(new Component[]{unloadCheck, showWidgets, isAutoStash}, FlowLayout.LEFT); + JPanel unloadCheckPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(unloadCheck), + cell(showWidgets), + cell(isAutoStash) + ).getComponent(); + JPanel northPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); northPane.add(sheetPane); northPane.add(showLocPane); diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/AbstractNativePrintSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/AbstractNativePrintSettingPane.java index 2ff9d41800..6fe41a0d01 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/AbstractNativePrintSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/AbstractNativePrintSettingPane.java @@ -1,8 +1,11 @@ package com.fr.design.webattr.printsettings; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.PaperSize; import com.fr.base.Utils; import com.fr.base.print.NativePrintAttr; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icombobox.UIComboBox; @@ -12,8 +15,6 @@ import com.fr.design.gui.ispinner.UIBasicSpinner; import com.fr.design.gui.itextfield.UINumberField; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.report.UnitFieldPane; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; @@ -24,15 +25,12 @@ import com.fr.stable.StringUtils; import javax.print.DocFlavor; import javax.print.PrintService; import javax.print.PrintServiceLookup; -import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.SpinnerNumberModel; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.ItemEvent; @@ -42,6 +40,12 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + /** * Created by plough on 2018/3/5. */ @@ -82,37 +86,40 @@ public abstract class AbstractNativePrintSettingPane extends JPanel { } private void initComponents() { - JPanel printPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - - JPanel northPane = getHeaderPane(); - printPane.add(northPane, BorderLayout.NORTH); - - centerPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default_Settings")); - centerPane.add(getNativePrintMainSettingPane()); - - printPane.add(centerPane, BorderLayout.CENTER); - + //默认配置 + initCenterPane(); + JPanel printPane = column(LayoutConstants.VERTICAL_GAP, + cell(getHeaderPane()), + cell(wrapComponentWithTitle(centerPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default_Settings"))) + ).getComponent(); this.setLayout(new BorderLayout()); this.add(printPane, BorderLayout.CENTER); } + /** + * 打印设置-本地软件打印-headerPane + * @return + */ private JPanel getHeaderPane() { - UILabel tipDownload = GUICoreUtils.createTipLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tip_Native_Print_Need_Client")); - + UILabel tipDownload = new UILabel("Fine-Design_Report_Tip_Native_Print_Need_Client"); + FineUIStyle.setStyle(tipDownload, FineUIStyle.LABEL_TIP); // 打印时需要打印设置窗口 showDialogCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Show_Print_Setting_Window_When_Printing")); - showDialogCheck.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20)); - UILabel showDialogCheckTip = GUICoreUtils.createTipLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tip_Use_Default_Settings")); - JPanel showDialogCheckPane = GUICoreUtils.createFlowPane(new Component[]{ - showDialogCheck, showDialogCheckTip}, FlowLayout.LEFT); + UILabel showDialogTip = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tip_Use_Default_Settings")); + FineUIStyle.setStyle(showDialogTip, FineUIStyle.LABEL_TIP); + JPanel showDialogCheckPane = row(LayoutConstants.VERTICAL_GAP, + cell(showDialogCheck), + cell(showDialogTip) + ).getComponent(); // 打印需要指定 sheet needSelectSheetCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Need_Select_Sheet_When_Printing")); - needSelectSheetCheck.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20)); - UILabel needSelectSheetCheckTip = GUICoreUtils.createTipLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tip_Invalid_In_Page_View")); - JPanel needSelectSheetCheckPane = GUICoreUtils.createFlowPane(new Component[]{ - needSelectSheetCheck, needSelectSheetCheckTip}, FlowLayout.LEFT); - + UILabel needSelectSheetTip = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tip_Invalid_In_Page_View")); + FineUIStyle.setStyle(needSelectSheetTip, FineUIStyle.LABEL_TIP); + JPanel needSelectSheetCheckPane = row(LayoutConstants.VERTICAL_GAP, + cell(needSelectSheetCheck), + cell(needSelectSheetTip) + ).getComponent(); return createHeaderPane(tipDownload, showDialogCheckPane, needSelectSheetCheckPane); } @@ -166,62 +173,58 @@ public abstract class AbstractNativePrintSettingPane extends JPanel { }; } - private JPanel getNativePrintMainSettingPane() { + /** + * 打印设置-本地软件打印-默认配置Pane + */ + private void initCenterPane() { // 打印机 - String[] printerArray = getAllPrinterNames(); - printerComboBox = new UIComboBox(printerArray); - printerComboBox.setPreferredSize(new Dimension(200, printerComboBox.getPreferredSize().height)); - JPanel printerPane = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - printerPane.add(printerComboBox); - + printerComboBox = new UIComboBox(getAllPrinterNames()); // 份数 copySpinner = new UIBasicSpinner(new SpinnerNumberModel(1, 1, Integer.MAX_VALUE, 1)); - GUICoreUtils.setColumnForSpinner(copySpinner, 5); - JPanel copyPane = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - copyPane.add(copySpinner); - + // 页码标签 + JPanel printAreaLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + printAreaLabelPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Page_Number")), BorderLayout.NORTH); + printAreaLabelPane.setBorder(new ScaledEmptyBorder(2,0,0,0)); // 继承页面纸张设置 - inheritPagePaperSettingCheck = GUICoreUtils.createNoBorderCheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Inherit_Page_Paper_Setting")); + inheritPagePaperSettingCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Inherit_Page_Paper_Setting")); JPanel paperSettingPane = getPaperSettingPane(); JPanel paperSettingCheckPane = GUICoreUtils.createCheckboxAndDynamicPane(inheritPagePaperSettingCheck, paperSettingPane, true); - // 继承页面布局设置 inheritPageLayoutSettingCheck = GUICoreUtils.createNoBorderCheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Inherit_Page_Layout_Setting")); JPanel layoutSettingPane = getLayoutSettingPane(); JPanel layoutSettingCheckPane = GUICoreUtils.createCheckboxAndDynamicPane(inheritPageLayoutSettingCheck, layoutSettingPane, true); - - // 页码标签 - UILabel printAreaLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Page_Number") + ":"); - JPanel printAreaLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - printAreaLabelPane.add(printAreaLabel, BorderLayout.NORTH); - printAreaLabel.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); - // 边距 inheritPageMarginSettingCheck = GUICoreUtils.createNoBorderCheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Inherit_Page_Margin_Setting")); pageMarginSettingPane = new PageMarginSettingPane(); - pageMarginSettingPane.setBorder(BorderFactory.createEmptyBorder(10, -10, 0, 0)); JPanel pageMarginCheckPane = GUICoreUtils.createCheckboxAndDynamicPane(inheritPageMarginSettingCheck, pageMarginSettingPane, true); - // 缩放 fitPaperSizeCheck = GUICoreUtils.createNoBorderCheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Print_To_Fit_Paper_Size")); JPanel scalePane = getScalePane(); - scalePane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); JPanel scaleCheckPane = GUICoreUtils.createCheckboxAndDynamicPane(fitPaperSizeCheck, scalePane, true); - - // TableLayout - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p, p, p, p}; - double[] columnSize = {60, p}; - Component[][] components = { - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Printer") + ":"), printerPane}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Copy_Number") + ":"), copyPane}, - {printAreaLabelPane, getPrintAreaPane()}, - {getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Paper") + ":"), paperSettingCheckPane}, - {getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout") + ":"), layoutSettingCheckPane}, - {getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Margin") + ":"), pageMarginCheckPane}, - {getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Scale_EnlargeOrReduce") + ":"), scaleCheckPane}, - }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 15); + // 整体布局 + centerPane = column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Printer"))).weight(0.1), + cell(printerComboBox).weight(0.35), + flex(0.55)), + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Copy_Number"))).weight(0.1), + cell(copySpinner).weight(0.15), + flex(0.75)), + row(cell(printAreaLabelPane).weight(0.1), + cell(getPrintAreaPane()).weight(0.7), + flex(0.2)), + row(cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Paper"))).weight(0.1), + cell(paperSettingCheckPane).weight(0.5), + flex(0.4)), + row(cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout"))).weight(0.1), + cell(layoutSettingCheckPane).weight(0.2), + flex(0.7)), + row(cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Margin"))).weight(0.1), + cell(pageMarginCheckPane).weight(0.5), + flex(0.4)), + row(cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Scale_EnlargeOrReduce"))).weight(0.1), + cell(scaleCheckPane).weight(0.3), + flex(0.6)) + ).getComponent(); } private String[] getAllPrinterNames() { @@ -273,34 +276,24 @@ public abstract class AbstractNativePrintSettingPane extends JPanel { } }); - // 下拉框 - JPanel comboPanel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - comboPanel.add(predefinedPaperSizeComboBox); - comboPanel.setBorder(BorderFactory.createEmptyBorder(8, 0, 0, 0)); - customPaperSizePane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_M_Pane(); // 宽度设置 - JPanel customWidthPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - customWidthPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Designer_Width") + ":")); customWidthFieldPane = new UnitFieldPane(Constants.UNIT_MM); customWidthFieldPane.setUnitValue(DEFAULT_PAPERSIZE.getWidth()); - customWidthPane.add(customWidthFieldPane); // 高度设置 - JPanel customHeightPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - customHeightPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Height") + ":")); customHeightFieldPane = new UnitFieldPane(Constants.UNIT_MM); customHeightFieldPane.setUnitValue(DEFAULT_PAPERSIZE.getHeight()); - customHeightPane.add(customHeightFieldPane); - - customPaperSizePane.add(customWidthPane); - customPaperSizePane.add(customHeightPane); - customPaperSizePane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); - - JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - panel.add(comboPanel, BorderLayout.NORTH); - panel.add(customPaperSizePane, BorderLayout.CENTER); - - return panel; + customPaperSizePane = row(LayoutConstants.HORIZONTAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Designer_Width") + ":")), + cell(customWidthFieldPane) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Height") + ":")), + cell(customHeightFieldPane) + ) + ).getComponent(); + return column(10, cell(predefinedPaperSizeComboBox), cell(customPaperSizePane)).getComponent(); } private void updateCustomPaperSizeArea() { @@ -309,23 +302,19 @@ public abstract class AbstractNativePrintSettingPane extends JPanel { } private JPanel getLayoutSettingPane() { - JPanel layoutSettingPane = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - layoutSettingPane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); portraitRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Portrait")); - portraitRadioButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20)); landscapeRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Landscape")); - layoutSettingPane.add(portraitRadioButton); - layoutSettingPane.add(landscapeRadioButton); - ButtonGroup layoutButtonGroup = new ButtonGroup(); layoutButtonGroup.add(portraitRadioButton); layoutButtonGroup.add(landscapeRadioButton); - portraitRadioButton.setSelected(true); - return layoutSettingPane; + return row(10, cell(portraitRadioButton), cell(landscapeRadioButton)).getComponent(); } - // 页码范围 + /** + * 页码范围 + * @return + */ private JPanel getPrintAreaPane() { allPageRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_All_Pages")); currentPageRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Current_Page")); @@ -363,17 +352,12 @@ public abstract class AbstractNativePrintSettingPane extends JPanel { doublePrintComboBox.addItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_HF_Odd_Page")); doublePrintComboBox.addItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_HF_Even_Page")); - // TableLayout - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p}; - double[] columnSize = {p, p, p}; - Component[][] components = { - {allPageRadioButton, null, null}, - {currentPageRadioButton, null, null}, - {customPageRadioButton, specifiedAreaField, areaFieldTip}, - {doublePrintRadioButton, doublePrintComboBox, new JPanel()} - }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 8); + return column(LayoutConstants.VERTICAL_GAP, + cell(allPageRadioButton), + cell(currentPageRadioButton), + row(cell(customPageRadioButton).weight(0.1), cell(specifiedAreaField).weight(0.3), cell(areaFieldTip).weight(0.1)), + row(cell(doublePrintRadioButton).weight(0.1),cell(doublePrintComboBox).weight(0.3), flex(0.1)) + ).getComponent(); } private JPanel getScalePane() { @@ -381,25 +365,12 @@ public abstract class AbstractNativePrintSettingPane extends JPanel { scalePercentField.setMaxIntegerLength(3); scalePercentField.setMaxDecimalLength(0); scalePercentField.setMaxValue(200); - - UILabel percent = new UILabel("%"); - - // TableLayout - double p = TableLayout.PREFERRED; - double[] rowSize = {p}; - double[] columnSize = {p, p}; - Component[][] components = { - {scalePercentField, percent} - }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 0); + return row(cell(scalePercentField), cell(new UILabel("%"))).getComponent(); } // 返回包含一个标签的 panel,标签始终位于 panel 顶部 JPanel getTopAlignLabelPane(String labelText) { - JPanel labelPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - labelPane.add(new UILabel(labelText), BorderLayout.NORTH); - labelPane.add(new JPanel(), BorderLayout.CENTER); - return labelPane; + return column(LayoutConstants.VERTICAL_GAP, cell(new UILabel(labelText))).getComponent(); } public void populate(NativePrintAttr nativePrintAttr) { diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/GlobalNativePrintSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/GlobalNativePrintSettingPane.java index 7b3643899a..becbe926d3 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/GlobalNativePrintSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/GlobalNativePrintSettingPane.java @@ -1,46 +1,41 @@ package com.fr.design.webattr.printsettings; import com.fr.base.print.NativePrintAttr; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UIIntNumberField; import com.fr.design.gui.itextfield.UINumberField; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.Component; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + /** * 本地打印设置面板——全局 * Created by plough on 2018/10/31. */ public class GlobalNativePrintSettingPane extends AbstractNativePrintSettingPane { - private static final int PRINT_PORT_FIELD_COLUMNS = 8; - // 服务器配置面板特有的组件 private UICheckBox defaultDownloadUrlCheck; // 采用默认的软件下载地址 private UITextField customUrlFieldWin; private UITextField customUrlFieldMac; private UINumberField printPortField; // 打印软件端口号 - @Override JPanel createHeaderPane(Component... comps) { Component[] allComps = new Component[comps.length + 1]; System.arraycopy(comps, 0, allComps, 0, comps.length); allComps[comps.length] = getExtraSettingPane(); - - JPanel headerPane = GUICoreUtils.createHeaderLayoutPane(allComps); - headerPane.setBorder(BorderFactory.createEmptyBorder(2, 12, 5, 0)); - return headerPane; + return GUICoreUtils.createHeaderLayoutPane(allComps); } - @Override protected void extraUpdate(NativePrintAttr nativePrintAttr) { if (defaultDownloadUrlCheck.isSelected()) { @@ -61,56 +56,35 @@ public class GlobalNativePrintSettingPane extends AbstractNativePrintSettingPane printPortField.setValue(nativePrintAttr.getPrintPort()); } - // 服务器配置中,特有的设置面板 + /** + * 服务器配置中,特有的设置面板 + * @return + */ private JPanel getExtraSettingPane() { // 软件下载地址 defaultDownloadUrlCheck = GUICoreUtils.createNoBorderCheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default")); JPanel downloadUrlSettingCheckPane = GUICoreUtils.createCheckboxAndDynamicPane(defaultDownloadUrlCheck, getCustomUrlSettingPane(), true); - downloadUrlSettingCheckPane.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); - JPanel downloadTipPane = getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Software_Download_Url") + ": "); - downloadTipPane.setBorder(BorderFactory.createEmptyBorder(0, 0, -6, 0)); - + JPanel downloadUrlTitle = getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Software_Download_Url")); // 打印软件端口号 - UILabel printPortTip = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Native_Print_Port") + ": "); - JPanel printPortFiledPane = getPrintPortFieldPane(); - - // TableLayout - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p}; - double[] columnSize = {p, p}; - Component[][] components = { - { - downloadTipPane, downloadUrlSettingCheckPane - }, { - printPortTip, printPortFiledPane - } - }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 0); - } - - private JPanel getPrintPortFieldPane() { + UILabel printPortTip = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Native_Print_Port")); printPortField = new UIIntNumberField(); printPortField.setMaxValue(NativePrintAttr.MAX_PRINT_PORT_VALUE); - printPortField.setColumns(PRINT_PORT_FIELD_COLUMNS); - JPanel panel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - panel.add(printPortField); - return panel; + return column(LayoutConstants.VERTICAL_GAP, + row(cell(downloadUrlTitle).weight(0.25), cell(downloadUrlSettingCheckPane).weight(0.75)), + row(cell(printPortTip).weight(0.25), cell(printPortField).weight(0.25), flex(0.5)) + ).getComponent(); } + /** + * 自定义软件下载地址Pane + * @return + */ private JPanel getCustomUrlSettingPane() { customUrlFieldWin = new UITextField(20); customUrlFieldMac = new UITextField(20); - - // TableLayout - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p}; - double[] columnSize = {60, p}; - Component[][] components = { - {new UILabel("windows: "), customUrlFieldWin}, - {new UILabel("macOS: "), customUrlFieldMac} - }; - JPanel urlSettingPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 10); - urlSettingPane.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0)); - return urlSettingPane; + return column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel("windows")).weight(0.2), cell(customUrlFieldWin).weight(0.6), flex(0.2)).weight(1), + row(cell(new UILabel("macOS")).weight(0.2), cell(customUrlFieldMac).weight(0.6), flex(0.2)).weight(1) + ).getComponent(); } } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NoClientPrintSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NoClientPrintSettingPane.java index a5ed35a697..465d594394 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NoClientPrintSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NoClientPrintSettingPane.java @@ -1,21 +1,24 @@ package com.fr.design.webattr.printsettings; +import com.fine.theme.utils.FineUIStyle; import com.fr.base.print.NoClientPrintAttr; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.FlowLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + + /** * 零客户端打印设置面板 * Created by plough on 2018/3/5. @@ -34,60 +37,48 @@ public class NoClientPrintSettingPane extends JPanel { } private void initComponents() { - JPanel printPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - - printPane.add(createHeaderPane(), BorderLayout.NORTH); - initCenterPane(); - printPane.add(centerPane, BorderLayout.CENTER); - + JPanel printPane = column(LayoutConstants.VERTICAL_GAP, + cell(createHeaderPane()), + cell(wrapComponentWithTitle(centerPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default_Settings"))) + ).getComponent(); this.setLayout(new BorderLayout()); this.add(printPane, BorderLayout.CENTER); } + /** + * 打印设置-零客户端打印-默认配置 + */ private void initCenterPane() { - centerPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default_Settings")); - inheritPageMarginSettingCheck = GUICoreUtils.createNoBorderCheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Inherit_Page_Margin_Setting")); pageMarginSettingPane = new PageMarginSettingPane(); - pageMarginSettingPane.setBorder(BorderFactory.createEmptyBorder(10, -10, 0, 0)); JPanel pageMarginCheckPane = GUICoreUtils.createCheckboxAndDynamicPane(inheritPageMarginSettingCheck, pageMarginSettingPane, true); - - // TableLayout - double p = TableLayout.PREFERRED; - double[] rowSize = {p}; - double[] columnSize = {60, p}; - Component[][] components = { - {getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Margin") + ":"), pageMarginCheckPane} - }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 15); - - centerPane.add(panel); + centerPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Margin"))), + cell(pageMarginCheckPane)).getComponent(); } + /** + * 打印设置-零客户端打印-headerPane + * @return + */ private JPanel createHeaderPane() { + //打印时可设置打印边距 setMarginWhenPrintCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Set_Margin_When_Printing")); - setMarginWhenPrintCheck.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20)); - UILabel marginTip = GUICoreUtils.createTipLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tip_Use_Default_Print_Margin")); - JPanel setMarginWhenPrintPane = GUICoreUtils.createFlowPane(new Component[] { - setMarginWhenPrintCheck, marginTip}, FlowLayout.LEFT); - + UILabel setMarginWhenPrintTip = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tip_Use_Default_Print_Margin")); + FineUIStyle.setStyle(setMarginWhenPrintTip, FineUIStyle.LABEL_TIP); ieQuietPrintCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_No_Print_Settings_In_IE")); - ieQuietPrintCheck.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - + //针式打印优化 needlePrinterOptimizeCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Needle_Printer_Optimize")); - needlePrinterOptimizeCheck.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20)); - UILabel needleTip = GUICoreUtils.createTipLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Needle_Printer_Optimize_Tip")); - JPanel needlePrinterOptimizePane = GUICoreUtils.createFlowPane(new Component[] { - needlePrinterOptimizeCheck, needleTip}, FlowLayout.LEFT); - - JPanel headerPane = GUICoreUtils.createHeaderLayoutPane(setMarginWhenPrintPane, ieQuietPrintCheck, needlePrinterOptimizePane); - headerPane.setBorder(BorderFactory.createEmptyBorder(2, 12, 12, 0)); - return headerPane; + UILabel needlePrinterOptimizeTip = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Needle_Printer_Optimize_Tip")); + FineUIStyle.setStyle(needlePrinterOptimizeTip, FineUIStyle.LABEL_TIP); + return column(LayoutConstants.VERTICAL_GAP, + row(LayoutConstants.HORIZONTAL_GAP, cell(setMarginWhenPrintCheck), cell(setMarginWhenPrintTip)), + cell(ieQuietPrintCheck), + row(LayoutConstants.HORIZONTAL_GAP, cell(needlePrinterOptimizeCheck), cell(needlePrinterOptimizeTip)) + ).getComponent(); } - - private void initListeners() { setMarginWhenPrintCheck.addItemListener(new ItemListener() { @Override diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/PageMarginSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/PageMarginSettingPane.java index 1742a2b02a..feef4c9b03 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/PageMarginSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/PageMarginSettingPane.java @@ -1,8 +1,8 @@ package com.fr.design.webattr.printsettings; import com.fr.base.Margin; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.report.UnitFieldPane; import com.fr.stable.Constants; @@ -10,6 +10,10 @@ import com.fr.stable.Constants; import javax.swing.JPanel; import java.awt.BorderLayout; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; + /** * Created by plough on 2018/3/5. */ @@ -23,40 +27,25 @@ public class PageMarginSettingPane extends JPanel { initComponents(); } private void initComponents() { - // 页边距设置面板 - JPanel marginPane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_M_Pane(); // left - JPanel marginLeftPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - marginPane.add(marginLeftPane); - - JPanel marginLeftTextPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - marginLeftPane.add(marginLeftTextPane); - marginLeftTextPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Top_Duplicate") + ":")); marginTopUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - marginLeftTextPane.add(marginTopUnitFieldPane); - JPanel marginLeftUnitPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - marginLeftPane.add(marginLeftUnitPane); - marginLeftUnitPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bottom") + ":")); marginBottomUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - marginLeftUnitPane.add(marginBottomUnitFieldPane); - - // right - JPanel marginRightPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - marginPane.add(marginRightPane); + JPanel marginLeftPane = column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Top_Duplicate") + ":")), cell(marginTopUnitFieldPane)), + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bottom") + ":")), cell(marginBottomUnitFieldPane)) + ).getComponent(); // peter:这个一个垂直的上下的字符panel. - JPanel marginRightTextPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - marginRightPane.add(marginRightTextPane); - marginRightTextPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Left") + ":")); marginLeftUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - marginRightTextPane.add(marginLeftUnitFieldPane); - - JPanel marginRightUnitPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - marginRightPane.add(marginRightUnitPane); - marginRightUnitPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Right") + ":")); marginRightUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - marginRightUnitPane.add(marginRightUnitFieldPane); + JPanel marginRightPane = column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Left") + ":")), cell(marginLeftUnitFieldPane)), + row( cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Right") + ":")), cell(marginRightUnitFieldPane)) + ).getComponent(); + JPanel marginPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(marginLeftPane), + cell(marginRightPane)).getComponent(); this.setLayout(new BorderLayout()); this.add(marginPane, BorderLayout.CENTER); } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/PrintSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/PrintSettingPane.java index 883a0801fd..f5cf1effb5 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/PrintSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/PrintSettingPane.java @@ -1,22 +1,24 @@ package com.fr.design.webattr.printsettings; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.print.PrintSettingsAttrMark; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.CardLayout; -import java.awt.Component; -import java.awt.FlowLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; + /** * Created by plough on 2018/3/1. */ @@ -39,19 +41,11 @@ public class PrintSettingPane extends BasicPane { } private void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel allPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); - this.add(allPanel, BorderLayout.CENTER); - JPanel north = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); - allPanel.add(north, BorderLayout.NORTH); ButtonGroup buttonGroup = new ButtonGroup(); noClientPrintRadioButton.setSelected(true); buttonGroup.add(noClientPrintRadioButton); buttonGroup.add(nativePrintRadioButton); - noClientPrintRadioButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 50)); - JPanel radioGroupPane = GUICoreUtils.createFlowPane(new Component[] { - noClientPrintRadioButton, nativePrintRadioButton}, FlowLayout.LEFT, 0, 0); - north.add(radioGroupPane); + JPanel north = row(LayoutConstants.HORIZONTAL_GAP, cell(noClientPrintRadioButton), cell(nativePrintRadioButton)).getComponent(); noClientPrintSettingPane = new NoClientPrintSettingPane(); printCard = new CardLayout(); @@ -60,11 +54,12 @@ public class PrintSettingPane extends BasicPane { printPane.add(noClientPrintRadioButton.getText(), noClientPrintSettingPane); UIScrollPane scrollPane = new UIScrollPane(nativePrintSettingPane); - scrollPane.setBorder(null); printPane.add(nativePrintRadioButton.getText(), scrollPane); - north.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); - allPanel.add(printPane, BorderLayout.CENTER); + JPanel allPanel = column(LayoutConstants.VERTICAL_GAP, cell(north), cell(printPane)).getComponent(); + allPanel.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.add(allPanel, BorderLayout.CENTER); } private void initListener() { diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/ReportNativePrintSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/ReportNativePrintSettingPane.java index 87853a7a38..c33b13c094 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/ReportNativePrintSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/ReportNativePrintSettingPane.java @@ -2,7 +2,6 @@ package com.fr.design.webattr.printsettings; import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.Component; @@ -13,8 +12,6 @@ import java.awt.Component; public class ReportNativePrintSettingPane extends AbstractNativePrintSettingPane { @Override JPanel createHeaderPane(Component... comps) { - JPanel headerPane = GUICoreUtils.createHeaderLayoutPane(comps); - headerPane.setBorder(BorderFactory.createEmptyBorder(2, 12, 12, 0)); - return headerPane; + return GUICoreUtils.createHeaderLayoutPane(comps); } } From 28eede8586730f285308223f13cb5fa8021c4442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Fri, 26 Jul 2024 19:23:31 +0800 Subject: [PATCH 184/302] =?UTF-8?q?REPORT-113994=20=E3=80=90NewUI=E3=80=91?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0?= =?UTF-8?q?-=E5=9B=BE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../theme/utils/FineComponentsFactory.java | 44 ++++++++ .../fine/theme/utils/FineLayoutBuilder.java | 22 +++- .../com/fr/design/gui/style/FRFontPane.java | 51 +++------ .../ui/detail/ColorFillStylePane.java | 13 +-- .../chart/gui/data/TableDataPane.java | 9 +- .../ChartTextAttrPaneWithThemeStyle.java | 9 +- .../component/VanChartBeautyPane.java | 11 +- .../component/VanChartFillStylePane.java | 8 -- .../component/VanChartGanttTimeLinePane.java | 26 ++--- .../component/VanChartUIListControlPane.java | 13 +-- .../background/VanChartBackgroundPane.java | 11 +- ...rtBackgroundPaneWithOutImageAndShadow.java | 21 ---- .../VanChartMarkerBackgroundPane.java | 16 --- .../marker/VanChartCommonMarkerPane.java | 17 +-- .../chart/designer/other/AutoRefreshPane.java | 36 +++---- .../other/VanChartInteractivePane.java | 101 ++++++------------ .../designer/style/VanChartTitlePane.java | 9 +- .../VanChartAxisScrollPaneWithTypeSelect.java | 5 +- .../style/axis/VanChartBaseAxisPane.java | 70 +++++------- .../style/axis/VanChartTimeAxisPane.java | 22 ++-- .../style/axis/VanChartValueAxisPane.java | 37 +++---- .../component/VanChartAxisButtonPane.java | 6 +- .../axis/radar/VanChartRadarXAxisPane.java | 17 +-- .../axis/radar/VanChartRadarYAxisPane.java | 34 ++---- .../style/background/VanChartAreaPane.java | 6 +- .../background/VanChartAxisAreaPane.java | 46 +++----- .../VanChartGantPlotAreaBackgroundPane.java | 31 ++---- .../VanChartPieValueLabelDetailPane.java | 10 -- .../label/VanChartPlotLabelDetailPane.java | 2 +- .../VanChartAbstractPlotSeriesPane.java | 11 +- .../tooltip/VanChartPlotTooltipPane.java | 9 +- .../VanChartDrillMapInteractivePane.java | 47 +++----- .../data/VanChartGanttDataAndLinkPane.java | 2 + .../data/GanttPlotReportDataContentPane.java | 6 +- .../data/GanttPlotTableDataContentPane.java | 6 +- .../component/ComboBoxWithButtonPane.java | 20 ++-- .../component/GanttReportDataContentPane.java | 33 +++--- .../component/GanttReportDataProjectPane.java | 6 +- .../component/GanttTableDataContentPane.java | 16 +-- .../component/GanttTableDataProjectPane.java | 9 +- .../component/TinyFormulaWithButtonPane.java | 29 ++--- .../link/GanttLinkReportDataContentPane.java | 30 ++---- .../link/GanttLinkTableDataContentPane.java | 14 +-- .../style/axis/GanttAxisStylePane.java | 12 +-- .../axis/GanttAxisStylePaneWithPosition.java | 10 +- .../style/axis/GanttProcessAxisPane.java | 38 +++---- .../style/axis/GanttTimeAxisPane.java | 25 ++--- .../style/series/VanChartGanttSeriesPane.java | 47 +++----- .../chart/map/designer/type/GeoUrlPane.java | 21 ++-- .../chart/map/designer/type/GisLayerPane.java | 17 +-- .../map/designer/type/MapStatusPane.java | 19 +--- .../map/designer/type/TileLayerPane.java | 10 +- .../type/VanChartMapSourceChoosePane.java | 25 ++--- .../MultiPiePlotReportDataContentPane.java | 28 +---- .../StructurePlotReportDataContentPane.java | 11 +- .../StructurePlotTableDataContentPane.java | 14 +-- .../WordCloudPlotReportDataContentPane.java | 12 +-- .../WordCloudPlotTableDataContentPane.java | 13 +-- .../cell/editor/DSColumnCellEditor.java | 2 - .../design/cell/editor/RichTextToolBar.java | 71 +++++------- .../mainframe/cell/QuickEditorRegion.java | 1 - .../com/fr/design/report/RichTextPane.java | 20 ++-- .../chartquick/FloatChartQuickEditor.java | 5 +- 63 files changed, 457 insertions(+), 885 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/utils/FineComponentsFactory.java diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineComponentsFactory.java b/designer-base/src/main/java/com/fine/theme/utils/FineComponentsFactory.java new file mode 100644 index 0000000000..57fd6a63a0 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/utils/FineComponentsFactory.java @@ -0,0 +1,44 @@ +package com.fine.theme.utils; + +import com.fine.theme.icon.LazyIcon; +import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.stable.Constants; + +import javax.swing.Icon; + +/** + * 设计器典型组件组合工厂 + * + * @author Levy.Xie + * @since 11.0 + * Created on 2024/07/26 + */ +public class FineComponentsFactory { + + /** + * 创建水平对齐按钮组 + * + * @return 组件 + */ + public static UIButtonGroup createHorizontalAlignmentButtonGroup() { + Icon[][] alignmentIconArray = {{new LazyIcon("h_left"), new LazyIcon("h_left").white()}, + {new LazyIcon("h_center"), new LazyIcon("h_center").white()}, + {new LazyIcon("h_right"), new LazyIcon("h_right").white()}}; + Integer[] alignment = new Integer[]{Constants.LEFT, Constants.CENTER, Constants.RIGHT}; + return new UIButtonGroup<>(alignmentIconArray, alignment); + } + + /** + * 创建垂直对齐按钮组 + * + * @return 组件 + */ + public static UIButtonGroup createVerticalAlignmentButtonGroup() { + Icon[][] alignmentIconArray = {{new LazyIcon("v_top"), new LazyIcon("v_top").white()}, + {new LazyIcon("v_center"), new LazyIcon("v_center").white()}, + {new LazyIcon("v_bottom"), new LazyIcon("v_bottom").white()}}; + Integer[] alignment = new Integer[]{Constants.TOP, Constants.CENTER, Constants.BOTTOM}; + return new UIButtonGroup<>(alignmentIconArray, alignment); + } + +} diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineLayoutBuilder.java b/designer-base/src/main/java/com/fine/theme/utils/FineLayoutBuilder.java index 11d7137ec4..8bf7b3f0e7 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineLayoutBuilder.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineLayoutBuilder.java @@ -5,6 +5,7 @@ import com.fine.swing.ui.layout.Layouts; import com.fine.swing.ui.layout.Row; import com.fine.swing.ui.layout.Spacer; import com.fr.design.foldablepane.UIExpandablePane; +import com.fr.design.gui.ilable.UILabel; import com.fr.log.FineLoggerFactory; import com.fr.stable.collections.combination.Pair; @@ -131,15 +132,32 @@ public class FineLayoutBuilder { * @param elements 面板元素 * @return 面板 */ - public static Column createVerticalLayout(int spacing, JPanel... elements) { + public static Column createVerticalLayout(int spacing, Component... elements) { Column column = new Column(); column.setSpacing(spacing); - for (JPanel element : elements) { + for (Component element : elements) { column.add(element); } return column; } + /** + * 创建水平布局面板 + * + * @param spacing 间距 + * @param elements 面板元素 + * @return 面板 + */ + public static Row createHorizontalLayout(int spacing, double[] weight, Component... elements) { + Row row = new Row(); + row.setSpacing(spacing); + for (int i = 0; i < elements.length; i++) { + Layouts.populate(row, cell(elements[i]).weight(weight[i])); + } + return row; + } + + /** * 组件包装于BorderLayout中 * diff --git a/designer-base/src/main/java/com/fr/design/gui/style/FRFontPane.java b/designer-base/src/main/java/com/fr/design/gui/style/FRFontPane.java index 8a7431fd2a..9c9a68f466 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/FRFontPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/FRFontPane.java @@ -13,11 +13,11 @@ import com.fr.design.constants.LayoutConstants; import com.fr.design.constants.UIConstants; import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; -import com.fr.design.gui.core.ReactiveCardPane; import com.fr.design.gui.ibutton.UIColorButton; import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.icombobox.LineComboBox; import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.utils.DesignUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; @@ -28,16 +28,11 @@ import com.fr.stable.Constants; import javax.swing.JFrame; import javax.swing.JPanel; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import java.awt.BorderLayout; -import java.awt.Component; import java.util.Vector; -import static com.fine.swing.ui.layout.Layouts.Cell; import static com.fine.swing.ui.layout.Layouts.cell; import static com.fine.swing.ui.layout.Layouts.row; -import static com.fine.swing.ui.layout.Layouts.column; /** * Pane to edit Font. @@ -66,7 +61,7 @@ public class FRFontPane extends AbstractBasicStylePane implements GlobalNameObse private UIToggleButton isShadowCheckBox; private UIToggleButton superPane; private UIToggleButton subPane; - private ReactiveCardPane styleContainer; + private UIToolbar styleToolbar; public FRFontPane() { this.initComponents(); @@ -111,7 +106,6 @@ public class FRFontPane extends AbstractBasicStylePane implements GlobalNameObse int line = frFont.getUnderline(); if (line == Constants.LINE_NONE) { underline.setSelected(false); - styleContainer.removeAll(); } else { underline.setSelected(true); this.underlineCombo.setSelectedLineStyle(line); @@ -129,7 +123,7 @@ public class FRFontPane extends AbstractBasicStylePane implements GlobalNameObse this.superPane.setSelected(false); this.subPane.setSelected(false); } - styleContainer.select(underline.isSelected() ? "showLine" : "hideLine").populate(); + underlineCombo.setVisible(underline.isSelected()); } /** @@ -239,41 +233,35 @@ public class FRFontPane extends AbstractBasicStylePane implements GlobalNameObse isShadowCheckBox = new UIToggleButton(new LazyIcon("shadow")); superPane = new UIToggleButton(new LazyIcon("super")); subPane = new UIToggleButton(new LazyIcon("sub")); - styleContainer = ReactiveCardPane.create() - .addSupplier("showLine", this::createContentWithLine) - .addSupplier("hideLine", this:: createContentNoLine); + styleToolbar = createToolbar(); initAllNames(); setToolTips(); initListeners(); - styleContainer.select("hideLine").populate(); + underlineCombo.setVisible(false); this.setLayout(new BorderLayout()); this.add(Layouts.column(LayoutConstants.VERTICAL_GAP, cell(fontNameComboBox), row(5, cell(fontSizeStyleComboBox).weight(1), cell(fontSizeComboBox).weight(1)), - cell(styleContainer) + cell(styleToolbar), + cell(underlineCombo) ).getComponent(), BorderLayout.CENTER); DefaultValues defaultValues = FRContext.getDefaultValues(); populateBean(defaultValues.getFRFont()); } - private Component createContentNoLine() { - return createFontButtonRow().getComponent(); - } - - private Component createContentWithLine() { - return column(LayoutConstants.VERTICAL_GAP, - createFontButtonRow(), - cell(underlineCombo) - ).getComponent(); - } - - private Cell createFontButtonRow() { - return row(3, cell(colorSelectPane), cell(underline), cell(isStrikethroughCheckBox), cell(isShadowCheckBox), - cell(superPane), cell(subPane)); + private UIToolbar createToolbar() { + UIToolbar toolbar = new UIToolbar(); + toolbar.add(colorSelectPane); + toolbar.add(underline); + toolbar.add(isStrikethroughCheckBox); + toolbar.add(isShadowCheckBox); + toolbar.add(superPane); + toolbar.add(subPane); + return toolbar; } private void initAllNames() { @@ -303,12 +291,7 @@ public class FRFontPane extends AbstractBasicStylePane implements GlobalNameObse } private void initListeners() { - underline.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - styleContainer.select(underline.isSelected() ? "showLine" : "hideLine").populate(); - } - }); + underline.addChangeListener(e -> underlineCombo.setVisible(underline.isSelected())); } /** diff --git a/designer-base/src/main/java/com/fr/design/mainframe/predefined/ui/detail/ColorFillStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/predefined/ui/detail/ColorFillStylePane.java index 823dd6ff3a..d835e2f372 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/predefined/ui/detail/ColorFillStylePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/predefined/ui/detail/ColorFillStylePane.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.predefined.ui.detail; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.ChartColorMatching; import com.fr.base.ChartPreStyleConfig; import com.fr.base.Utils; @@ -7,14 +8,11 @@ import com.fr.chart.base.ChartConstants; import com.fr.config.predefined.ColorFillStyle; import com.fr.config.predefined.PredefinedColorStyle; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.constants.LayoutConstants; import com.fr.design.event.UIObserverListener; import com.fr.design.gui.icombobox.ColorSchemeComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.style.background.gradient.FixedGradientBarNoTheme; import com.fr.design.style.color.ColorAdjustPane; import com.fr.stable.StringUtils; @@ -158,14 +156,7 @@ public class ColorFillStylePane extends BasicBeanPane { } protected JPanel getContentPane() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = 155; - double[] columnSize = {f, e}; - double[] rowSize = {p, p, p}; - - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(contentPaneComponents(), rowSize, columnSize, 12, LayoutConstants.VGAP_LARGE); - return panel; + return FineLayoutBuilder.compatibleTableLayout(10, contentPaneComponents(), new double[]{1.2, 3}); } protected Component[][] contentPaneComponents() { diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/TableDataPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/TableDataPane.java index 0c84c65e63..52e2f32cbd 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/TableDataPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/TableDataPane.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.chart.gui.data; +import com.fine.swing.ui.layout.Column; import com.fine.theme.utils.FineUIScale; import com.fr.base.TableData; import com.fr.chart.chartattr.Chart; @@ -22,6 +23,7 @@ public class TableDataPane extends FurtherBasicBeanPane{ private static final long serialVersionUID = 4740461028440155147L; private DatabaseTableDataPane tableDataPane; private AbstractTableDataContentPane dataContentPane; + protected Column centerPane; private ChartDataPane parent; @@ -44,7 +46,10 @@ public class TableDataPane extends FurtherBasicBeanPane{ checkBoxUse(); } }; - this.add(tableDataPane, BorderLayout.NORTH); + centerPane = new Column(); + centerPane.setSpacing(10); + centerPane.add(tableDataPane); + this.add(centerPane, BorderLayout.CENTER); } /** @@ -116,7 +121,7 @@ public class TableDataPane extends FurtherBasicBeanPane{ } dataContentPane = contentPane; if(dataContentPane != null) { - add(dataContentPane, BorderLayout.CENTER); + centerPane.add(dataContentPane); } } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPaneWithThemeStyle.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPaneWithThemeStyle.java index 76862a7577..85362b1329 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPaneWithThemeStyle.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPaneWithThemeStyle.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.chart.gui.style; +import com.fine.theme.utils.FineLayoutBuilder; import com.fine.theme.utils.FineUIScale; import com.fr.chart.base.TextAttr; import com.fr.design.gui.ibutton.UIButtonGroup; @@ -37,13 +38,9 @@ public class ChartTextAttrPaneWithThemeStyle extends ChartTextAttrPane { preButton = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_Follow_Theme"), Toolkit.i18nText("Fine-Design_Chart_Custom")}); - double f = TableLayout.FILL; - double e = getEdithAreaWidth(); - double p = TableLayout.PREFERRED; - double[] columnSize = {f, e}; UILabel text = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Character"), SwingConstants.LEFT); - JPanel preButtonPane = TableLayout4VanChartHelper.createGapTableLayoutPane(new Component[][]{new Component[]{text, preButton}}, new double[]{p}, columnSize); - textFontPane = TableLayout4VanChartHelper.createGapTableLayoutPane(getComponents(buttonPane), getRowSize(), columnSize); + JPanel preButtonPane = FineLayoutBuilder.compatibleTableLayout(10, new Component[][]{new Component[]{text, preButton}}, new double[]{1.2, 3}); + textFontPane = FineLayoutBuilder.compatibleTableLayout(10, getComponents(buttonPane), new double[]{1.2, 3}); panel.add(preButtonPane, BorderLayout.CENTER); panel.add(textFontPane, BorderLayout.SOUTH); return panel; diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartBeautyPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartBeautyPane.java index 0fefa406e0..d82b6409c7 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartBeautyPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartBeautyPane.java @@ -1,14 +1,13 @@ package com.fr.van.chart.designer.component; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.base.GradientStyle; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; import com.fr.plugin.chart.type.GradientType; import com.fr.stable.StringUtils; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.JPanel; import java.awt.BorderLayout; @@ -37,17 +36,11 @@ public class VanChartBeautyPane extends BasicBeanPane { gradientTypeBox = new UIButtonGroup(names); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] rowSize = {p}; - Component[][] components = new Component[][]{ new Component[]{new UILabel(labelName()), gradientTypeBox}, }; - return TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } protected String[] getNameArray() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartFillStylePane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartFillStylePane.java index 3f7374c34d..c1b3424d15 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartFillStylePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartFillStylePane.java @@ -10,8 +10,6 @@ import com.fr.design.mainframe.chart.mode.ChartEditContext; import com.fr.design.mainframe.predefined.ui.detail.ColorFillStylePane; import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.BorderFactory; -import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; @@ -36,12 +34,6 @@ public class VanChartFillStylePane extends ColorFillStylePane implements Designe this.add(getContentPane(), BorderLayout.CENTER); } - protected JPanel getContentPane() { - JPanel contentPane = super.getContentPane(); - contentPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0)); - return contentPane; - } - protected Component[][] contentPaneComponents() { return new Component[][]{ new Component[]{null, null}, diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartGanttTimeLinePane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartGanttTimeLinePane.java index 0af3a24b13..716435b2e7 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartGanttTimeLinePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartGanttTimeLinePane.java @@ -1,17 +1,15 @@ package com.fr.van.chart.designer.component; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Plot; import com.fr.design.gui.frpane.UINumberDragPaneWithPercent; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; import com.fr.design.mainframe.chart.gui.ColorSelectBoxWithOutTransparent; import com.fr.plugin.chart.gantt.VanChartGanttPlot; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.JPanel; -import javax.swing.SwingConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; @@ -27,13 +25,12 @@ public class VanChartGanttTimeLinePane extends JPanel { public VanChartGanttTimeLinePane() { this.setLayout(new BorderLayout()); - this.add(createSwitchButtonPane(), BorderLayout.NORTH); - this.add(createCenterPane(), BorderLayout.CENTER); + this.add(FineLayoutBuilder.createVerticalLayout(10, + createSwitchButtonPane(), createCenterPane() + )); } private JPanel createSwitchButtonPane() { - double[] columnSize = {TableLayout.PREFERRED, TableLayout.FILL}; - double[] rowSize = {TableLayout.PREFERRED, TableLayout.PREFERRED}; String[] array = new String[]{Toolkit.i18nText("Fine-Design_Chart_Guide_Line_Not_Show"), Toolkit.i18nText("Fine-Design_Chart_Guide_Line_Show")}; switchButton = new UIButtonGroup<>(array); switchButton.addChangeListener(new ChangeListener() { @@ -42,25 +39,20 @@ public class VanChartGanttTimeLinePane extends JPanel { setCenterPaneVisibility(); } }); - UILabel text = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Guide_Line_Current_Line"), SwingConstants.LEFT); - return TableLayout4VanChartHelper.createGapTableLayoutPane(new Component[][] { - new Component[]{null, null}, + UILabel text = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Guide_Line_Current_Line")); + return FineLayoutBuilder.compatibleTableLayout(10, new Component[][] { new Component[] {text, switchButton} - }, rowSize, columnSize); + }, new double[]{1.2, 3}); } private JPanel createCenterPane() { - double[] columnSize = {TableLayout.FILL, TableLayout4VanChartHelper.EDIT_AREA_WIDTH}; - double[] rowSize = {TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.PREFERRED}; - colorSelect = new ColorSelectBoxWithOutTransparent(100); opacity = new UINumberDragPaneWithPercent(0, 100); - centerPane = TableLayout4VanChartHelper.createGapTableLayoutPane(new Component[][] { - new Component[]{null, null}, + centerPane = FineLayoutBuilder.compatibleTableLayout(10, new Component[][] { new Component[] {new UILabel(Toolkit.i18nText("Fine-Design_Chart_Color")), colorSelect}, new Component[] {new UILabel(Toolkit.i18nText("Fine-Design_Report_Alpha")), opacity} - }, rowSize, columnSize); + }, new double[]{1.2, 3}); centerPane.setVisible(false); diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartUIListControlPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartUIListControlPane.java index 1cf695ec2c..a3902abdc2 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartUIListControlPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartUIListControlPane.java @@ -1,6 +1,6 @@ package com.fr.van.chart.designer.component; -import com.fine.theme.light.ui.FineButtonBorder; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Plot; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; @@ -9,12 +9,9 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.mode.ChartEditContext; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.Nameable; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.BorderFactory; import javax.swing.JComponent; @@ -51,7 +48,6 @@ public abstract class VanChartUIListControlPane extends UIListControlPane implem public VanChartUIListControlPane() { super(); this.setBorder(null); - getToolBar().setBorder(new FineButtonBorder()); iniListener(); } @@ -104,15 +100,10 @@ public abstract class VanChartUIListControlPane extends UIListControlPane implem @Override protected JPanel getLeftTopPane(UIToolbar topToolBar) { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] rowSize = {p}; Component[][] components = new Component[][]{ new Component[]{new UILabel(getAddItemText()), topToolBar}, }; - return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1.2, 3}); } @Override diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/background/VanChartBackgroundPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/background/VanChartBackgroundPane.java index f3de5d17fb..f6d89b66a1 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/background/VanChartBackgroundPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/background/VanChartBackgroundPane.java @@ -1,5 +1,6 @@ package com.fr.van.chart.designer.component.background; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.background.ImageBackground; import com.fr.chart.chartglyph.GeneralInfo; import com.fr.design.dialog.BasicPane; @@ -9,7 +10,6 @@ import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; import com.fr.design.mainframe.backgroundpane.BackgroundQuickPane; import com.fr.design.mainframe.backgroundpane.ColorBackgroundQuickPane; import com.fr.design.mainframe.backgroundpane.ImageBackgroundQuickPane; @@ -17,7 +17,6 @@ import com.fr.design.mainframe.backgroundpane.NullBackgroundQuickPane; import com.fr.design.mainframe.backgroundpane.VanChartGradientPane; import com.fr.general.Background; import com.fr.stable.Constants; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; @@ -72,13 +71,7 @@ public class VanChartBackgroundPane extends BasicPane { } protected JPanel initContentPanel() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - - double[] rowSize = {p, p, p, p, p}; - return TableLayout4VanChartHelper.createGapTableLayoutPane(getPaneComponents(), rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(10, getPaneComponents(), new double[]{1.2, 3}); } protected void initComponents() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/background/VanChartBackgroundPaneWithOutImageAndShadow.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/background/VanChartBackgroundPaneWithOutImageAndShadow.java index d854f9917f..1c739b6b4b 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/background/VanChartBackgroundPaneWithOutImageAndShadow.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/background/VanChartBackgroundPaneWithOutImageAndShadow.java @@ -1,16 +1,10 @@ package com.fr.van.chart.designer.component.background; -import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.backgroundpane.ColorBackgroundQuickPane; import com.fr.design.mainframe.backgroundpane.NullBackgroundQuickPane; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; -import javax.swing.BorderFactory; -import javax.swing.JPanel; import java.awt.Component; /** @@ -27,21 +21,6 @@ public class VanChartBackgroundPaneWithOutImageAndShadow extends VanChartBackgro super(hasAuto); } - - @Override - protected JPanel initContentPanel() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - - double[] columnSize = {f, TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH}; - double[] rowSize = {p, p, p}; - - JPanel tableLayoutPane = TableLayoutHelper.createGapTableLayoutPane(getPaneComponents(), rowSize, columnSize, - TableLayout4VanChartHelper.COMPONENT_INTERVAL, LayoutConstants.VGAP_MEDIUM); - tableLayoutPane.setBorder(BorderFactory.createEmptyBorder(0, 12, 4, 0)); - return tableLayoutPane; - } - @Override protected void initList() { paneList.add(new NullBackgroundQuickPane() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/background/VanChartMarkerBackgroundPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/background/VanChartMarkerBackgroundPane.java index 9f2bdf6bc0..a3136fb3ed 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/background/VanChartMarkerBackgroundPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/background/VanChartMarkerBackgroundPane.java @@ -2,15 +2,10 @@ package com.fr.van.chart.designer.component.background; import com.fr.base.background.ColorBackground; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.backgroundpane.BackgroundQuickPane; import com.fr.design.mainframe.backgroundpane.ColorBackgroundQuickPane; import com.fr.design.mainframe.backgroundpane.NullBackgroundQuickPane; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; - -import javax.swing.JPanel; import java.awt.Component; /** @@ -19,17 +14,6 @@ import java.awt.Component; public class VanChartMarkerBackgroundPane extends VanChartBackgroundPane { private static final long serialVersionUID = -1032221277140976934L; - protected JPanel initContentPanel() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] rowSize = {p, p, p}; - - return TableLayoutHelper.createTableLayoutPane(getPaneComponents(), rowSize, columnSize); - } - protected Component[][] getPaneComponents() { return new Component[][]{ new Component[]{null, null}, diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/marker/VanChartCommonMarkerPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/marker/VanChartCommonMarkerPane.java index e2cdf0cb02..0afa4492a9 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/marker/VanChartCommonMarkerPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/marker/VanChartCommonMarkerPane.java @@ -1,5 +1,6 @@ package com.fr.van.chart.designer.component.marker; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartglyph.Marker; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.ilable.UILabel; @@ -8,7 +9,6 @@ import com.fr.design.gui.ispinner.chart.UISpinnerWithPx; import com.fr.design.gui.xcombox.MarkerComboBox; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.plugin.chart.base.VanChartAttrMarker; import com.fr.plugin.chart.marker.type.MarkerType; import com.fr.van.chart.designer.TableLayout4VanChartHelper; @@ -71,17 +71,6 @@ public class VanChartCommonMarkerPane extends BasicBeanPane public VanChartCommonMarkerPane() { markerTypeComboBox = new MarkerComboBox(getMarkers()); markerFillColor = new VanChartMarkerBackgroundPane() { - protected JPanel initContentPanel() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - - double e = getColumnSize()[1]; - double[] columnSize = {f, e}; - double[] rowSize = {p, p, p}; - - return TableLayoutHelper.createTableLayoutPane(getPaneComponents(), rowSize, columnSize); - } - protected Component[][] getPaneComponents() { return new Component[][]{ new Component[]{null, null}, @@ -94,8 +83,8 @@ public class VanChartCommonMarkerPane extends BasicBeanPane double p = TableLayout.PREFERRED; - markerTypePane = TableLayout4VanChartHelper.createGapTableLayoutPane(getMarkerTypeComponent(), new double[]{p}, getColumnSize()); - markerConfigPane = TableLayout4VanChartHelper.createGapTableLayoutPane(getMarkerConfigComponent(), new double[]{p, p}, getColumnSize()); + markerTypePane = FineLayoutBuilder.compatibleTableLayout(10, getMarkerTypeComponent(), new double[]{1.2, 3}); + markerConfigPane = FineLayoutBuilder.compatibleTableLayout(10, getMarkerConfigComponent(), new double[]{1.2, 3}); markerTypeComboBox.addActionListener(new ActionListener() { @Override diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/other/AutoRefreshPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/other/AutoRefreshPane.java index 1e656a8bf0..f5b1004d58 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/other/AutoRefreshPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/other/AutoRefreshPane.java @@ -1,6 +1,7 @@ package com.fr.van.chart.designer.other; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.design.beans.BasicBeanPane; import com.fr.design.dialog.DialogActionListener; import com.fr.design.dialog.UIDialog; @@ -9,23 +10,19 @@ import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; -import com.fr.design.layout.TableLayout; import com.fr.plugin.chart.attr.plot.VanChartPlot; import com.fr.plugin.chart.base.RefreshMoreLabel; import com.fr.plugin.chart.vanchart.VanChart; import com.fr.van.chart.designer.PlotFactory; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.style.tooltip.VanChartPlotTooltipPane; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -57,7 +54,6 @@ public class AutoRefreshPane extends BasicBeanPane { protected JPanel createContentPane() { - JPanel content = new JPanel(new BorderLayout(0, 6)); moreLabel = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Open"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Close")}); moreLabel.addChangeListener(new ChangeListener() { @Override @@ -82,34 +78,27 @@ public class AutoRefreshPane extends BasicBeanPane { jPanel.add(autoTooltip, BorderLayout.CENTER); jPanel.add(tooltipSet, BorderLayout.EAST); - JPanel moreLabelPane = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_More_Label"), moreLabel); + JPanel moreLabelPane = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_More_Label")), moreLabel); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, f, 20}; - double[] column = {f, 20}; - double[] rowSize = {p}; Component[][] components = initComponent(jPanel); - JPanel panel1 = TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); + JPanel panel1 = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 1.2, 1.2, 0.6}); contentPane = new JPanel(new BorderLayout()); contentPane.add(panel1, BorderLayout.CENTER); Component[][] AutoTooltipComponent = initAutoTooltipComponent(); - JPanel panel2 = TableLayout4VanChartHelper.createGapTableLayoutPane(AutoTooltipComponent, rowSize, column); - panel2.setBorder(BorderFactory.createEmptyBorder(10, 0,0,0)); + JPanel panel2 = FineLayoutBuilder.compatibleTableLayout(10, AutoTooltipComponent, new double[]{1.2, 2, 1}); contentPane.add(panel2, BorderLayout.SOUTH); - contentPane.setBorder(BorderFactory.createEmptyBorder(0, 72,0,0)); - content.add(moreLabelPane, BorderLayout.NORTH); - content.add(contentPane, BorderLayout.CENTER); - return content; + return FineLayoutBuilder.createVerticalLayout(10, moreLabelPane, contentPane); } protected Component[][] initComponent(JPanel autoTooltipPane){ return new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Time_Interval")), autoRefreshTime, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Time_Seconds"))}, - new Component[]{autoTooltip,null, tooltipSet}, + new Component[]{null, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Time_Interval")), + autoRefreshTime, new UILabel(" " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Time_Seconds"))}, + new Component[]{null, autoTooltip, null, tooltipSet}, }; } @@ -117,13 +106,12 @@ public class AutoRefreshPane extends BasicBeanPane { protected Component[][] initAutoTooltipComponent () { return new Component[][]{ - new Component[]{autoTooltip, tooltipSet}, + new Component[]{null, autoTooltip, tooltipSet}, }; } private void initTooltipSet() { - tooltipSet = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/config.png")); - tooltipSet.setPreferredSize(new Dimension(20, 20)); + tooltipSet = new UIButton(new LazyIcon("tool_config")); tooltipSet.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/other/VanChartInteractivePane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/other/VanChartInteractivePane.java index edf45b4ccc..334104128c 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/other/VanChartInteractivePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/other/VanChartInteractivePane.java @@ -1,5 +1,7 @@ package com.fr.van.chart.designer.other; +import com.fine.swing.ui.layout.Column; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.BaseFormula; import com.fr.base.Utils; import com.fr.chart.chartattr.Chart; @@ -7,6 +9,7 @@ import com.fr.chart.chartattr.Plot; import com.fr.chart.chartglyph.ConditionAttr; import com.fr.chart.chartglyph.ConditionCollection; import com.fr.chartx.attr.LargeDataModeType; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.formula.DefaultTinyFormulaPane; import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.frpane.UINumberDragPane; @@ -20,7 +23,6 @@ import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.ispinner.UnsignedIntUISpinner; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.mode.ChartEditContext; import com.fr.design.widget.FRWidgetFactory; import com.fr.plugin.chart.attr.axis.VanChartAxis; @@ -48,11 +50,9 @@ import com.fr.van.chart.designer.PlotFactory; import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.other.zoom.ZoomPane; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Component; import java.awt.Dimension; @@ -127,30 +127,23 @@ public class VanChartInteractivePane extends AbstractVanChartScrollPane { } protected JPanel getInteractivePane(VanChartPlot plot) { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] rowSize = {p, p, p, p, p, p, p}; - - Component[][] components = ChartEditContext.normalMode() ? new Component[][]{ - new Component[]{createToolBarPane(getToolBarRowSize(), columnSize), null}, + new Component[]{createToolBarPane(), null}, //大数据模式 恢复用注释。取消注释。 //new Component[]{createLargeDataModePane(), null}, new Component[]{createAnimationPane(), null}, - new Component[]{createAxisRotationPane(new double[]{p, p}, columnSize, plot), null}, + new Component[]{createAxisRotationPane(plot), null}, new Component[]{createZoomPane(plot), null}, new Component[]{createAutoRefreshPane(plot), null}, new Component[]{createHyperlinkPane(), null} } : new Component[][]{ - new Component[]{createToolBarPane(getToolBarRowSize(), columnSize), null}, + new Component[]{createToolBarPane(), null}, new Component[]{createAnimationPane(), null}, - new Component[]{createAxisRotationPane(new double[]{p, p}, columnSize, plot), null}, - new Component[]{createZoomPane(plot), null} + new Component[]{createAxisRotationPane(plot), null}, + new Component[]{createZoomPane(plot, false), null} }; - return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1, 0}); } //大数据模式 恢复用注释。取消注释。 @@ -192,27 +185,25 @@ public class VanChartInteractivePane extends AbstractVanChartScrollPane { } protected JPanel createZoomPane(VanChartPlot plot) { - //图表缩放新设计 恢复用注释。取消注释。 -// zoomPane = createZoomPane(); -// if (zoomPane == null) { -// return null; -// } -// return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Zoom"), zoomPane); + return this.createZoomPane(plot, true); + } - //图表缩放新设计 恢复用注释。删除下面方法体所有代码。 + protected JPanel createZoomPane(VanChartPlot plot, boolean withUnderline) { if (!plot.isSupportZoomDirection()) { return null; } zoomWidget = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Open_Zoom_Control")); zoomGesture = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Open"), Toolkit.i18nText("Fine-Design_Chart_Close")}); - JPanel zoomWidgetPane = TableLayout4VanChartHelper.createGapTableLayoutPaneWithoutTop(Toolkit.i18nText("Fine-Design_Chart_Zoom_Widget"), zoomWidget); - JPanel zoomGesturePane = TableLayout4VanChartHelper.createGapTableLayoutPaneWithoutTop(Toolkit.i18nText("Fine-Design_Chart_ZoomGesture"), zoomGesture); + JPanel zoomWidgetPane = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(Toolkit.i18nText("Fine-Design_Chart_Zoom_Widget")), zoomWidget); + JPanel zoomGesturePane = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(Toolkit.i18nText("Fine-Design_Chart_ZoomGesture")), zoomGesture); zoomType = new UIButtonGroup(getNameArray(), getValueArray()); zoomTypePane = getZoomTypePane(zoomType); JPanel panel = createZoomPaneContent(zoomWidgetPane, zoomGesturePane, plot); zoomWidget.addActionListener((event) -> checkZoomPane()); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Use_Zoom"), panel); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Use_Zoom"), panel, withUnderline); } private void createChangeEnablePane(VanChartRectanglePlot plot) { @@ -235,17 +226,11 @@ public class VanChartInteractivePane extends AbstractVanChartScrollPane { centerPane.add(scaleAxisPane, scaleAxis); centerPane.add(scrollPane, scroll); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] row = {p, p}; Component[][] components = new Component[][]{ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Control_Type")), controlType}, new Component[]{centerPane, null} }; - changeEnablePane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, columnSize); - changeEnablePane.setBorder(BorderFactory.createEmptyBorder(5, 12, 0, 0)); + changeEnablePane = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); controlType.addActionListener((event) -> checkCardPane()); } @@ -259,14 +244,7 @@ public class VanChartInteractivePane extends AbstractVanChartScrollPane { new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_From")), from}, new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_To")), to}, }; - - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] row = {p, p, p}; - JPanel resizePane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, columnSize); - return resizePane; + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } @@ -274,11 +252,6 @@ public class VanChartInteractivePane extends AbstractVanChartScrollPane { VanChartAxis vanChartAxis = plot.getCategoryAxisList().get(0); AxisType axisType = vanChartAxis.getAxisType(); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] row = {p}; Component[][] components; if (axisType == AxisType.AXIS_CATEGORY) { categoryNum = new UnsignedIntUISpinner(1, Double.MAX_VALUE, 1); @@ -291,7 +264,7 @@ public class VanChartInteractivePane extends AbstractVanChartScrollPane { new Component[]{FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Chart_Scaling")), scaling}, }; } - return TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, columnSize); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } protected void checkCardPane() { @@ -312,13 +285,14 @@ public class VanChartInteractivePane extends AbstractVanChartScrollPane { } protected JPanel createZoomPaneContent(JPanel zoomWidgetPane, JPanel zoomGesturePane, VanChartPlot plot) { - JPanel panel = new JPanel(new BorderLayout(0, 4)); + Column panel = new Column(); + panel.setSpacing(10); if (plot.isSupportZoomCategoryAxis()) {//支持缩放控件 createChangeEnablePane((VanChartRectanglePlot) plot); - panel.add(zoomWidgetPane, BorderLayout.NORTH); - panel.add(changeEnablePane, BorderLayout.CENTER); + panel.add(zoomWidgetPane); + panel.add(changeEnablePane); } - panel.add(zoomTypePane, BorderLayout.SOUTH); + panel.add(zoomTypePane); return panel; } @@ -430,7 +404,7 @@ public class VanChartInteractivePane extends AbstractVanChartScrollPane { return null; } - private JPanel createAxisRotationPane(double[] row, double[] col, VanChartPlot plot) { + private JPanel createAxisRotationPane(VanChartPlot plot) { if (!(plot.getAxisPlotType() == AxisPlotType.RECTANGLE)) { return null; } @@ -449,12 +423,12 @@ public class VanChartInteractivePane extends AbstractVanChartScrollPane { new Component[]{null, null}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Reversal")), axisRotation} }; - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis"), panel); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis"), panel, true); } - protected JPanel createToolBarPane(double[] row, double[] col) { + protected JPanel createToolBarPane() { isSort = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Sort")); exportImages = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Export_Image")); fullScreenDisplay = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_FullScreen_Display")); @@ -462,8 +436,8 @@ public class VanChartInteractivePane extends AbstractVanChartScrollPane { Component[][] components = createToolBarComponents(); - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_ToolBar"), panel); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_ToolBar"), panel, true); } protected double[] getToolBarRowSize() { @@ -492,24 +466,19 @@ public class VanChartInteractivePane extends AbstractVanChartScrollPane { protected JPanel createAnimationPane() { isChartAnimation = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Open"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Close")}); chartAnimationLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Chart_Animation_Effects")); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] rowSize = {p, p}; Component[][] components = new Component[][]{ new Component[]{null, null}, new Component[]{chartAnimationLabel, isChartAnimation} }; - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Animation"), panel); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Animation"), panel, true); } protected JPanel createAutoRefreshPane(VanChartPlot plot) { autoRefreshPane = getMoreLabelPane(plot); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Moniter_refresh"), autoRefreshPane); + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Moniter_refresh"), autoRefreshPane, true); } protected AutoRefreshPane getMoreLabelPane(VanChartPlot plot) { @@ -519,7 +488,7 @@ public class VanChartInteractivePane extends AbstractVanChartScrollPane { protected JPanel createHyperlinkPane() { superLink = new VanChartHyperLinkPane(); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_M_Insert_Hyperlink"), superLink); + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_M_Insert_Hyperlink"), superLink); } private void checkLargeDataMode() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/VanChartTitlePane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/VanChartTitlePane.java index 925d2c38b6..cc5199d3c2 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/VanChartTitlePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/VanChartTitlePane.java @@ -1,6 +1,6 @@ package com.fr.van.chart.designer.style; -import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineComponentsFactory; import com.fine.theme.utils.FineUIStyle; import com.fr.base.BaseFormula; import com.fr.base.Utils; @@ -33,7 +33,6 @@ import com.fr.van.chart.designer.AbstractVanChartScrollPane; import com.fr.van.chart.designer.component.VanChartFloatPositionPane; import com.fr.van.chart.designer.component.background.VanChartBackgroundWithOutShadowWithRadiusPane; -import javax.swing.Icon; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.event.ChangeEvent; @@ -144,11 +143,7 @@ public class VanChartTitlePane extends AbstractVanChartScrollPane { } private JPanel createTitlePositionPane() { - Icon[][] hAlignmentIconArray = {{new LazyIcon("h_left"), new LazyIcon("h_left").white()}, - {new LazyIcon("h_center"), new LazyIcon("h_center").white()}, - {new LazyIcon("h_right"), new LazyIcon("h_right").white()}}; - Integer[] alignment = new Integer[]{Constants.LEFT, Constants.CENTER, Constants.RIGHT}; - alignmentPane = new UIButtonGroup<>(hAlignmentIconArray, alignment); + alignmentPane = FineComponentsFactory.createHorizontalAlignmentButtonGroup(); customFloatPositionButton = new UIToggleButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom_Float_Position")); UIComponentUtils.setLineWrap(customFloatPositionButton); customFloatPositionButton.setEventBannded(true); diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisScrollPaneWithTypeSelect.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisScrollPaneWithTypeSelect.java index 46b210c7ec..61c3f18173 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisScrollPaneWithTypeSelect.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisScrollPaneWithTypeSelect.java @@ -1,5 +1,6 @@ package com.fr.van.chart.designer.style.axis; +import com.fine.theme.utils.FineUIScale; import com.fr.chart.base.ColorWithThemeStyle; import com.fr.chart.chartattr.Axis; import com.fr.design.beans.FurtherBasicBeanPane; @@ -16,7 +17,6 @@ import com.fr.van.chart.designer.AbstractVanChartScrollPane; import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.style.VanChartStylePane; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.util.ArrayList; import java.util.List; @@ -58,9 +58,8 @@ public class VanChartAxisScrollPaneWithTypeSelect extends AbstractVanChartScroll } protected void initLayout() { - this.setLayout(new BorderLayout(0,6)); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); JPanel northPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Type"), jcb); - northPane.setBorder(BorderFactory.createEmptyBorder(0,5,0,0)); this.add(northPane, BorderLayout.NORTH); this.add(cardPane, BorderLayout.CENTER); diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java index fed96db681..006a2c284f 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java @@ -1,13 +1,15 @@ package com.fr.van.chart.designer.style.axis; +import com.fine.theme.utils.FineComponentsFactory; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.BaseFormula; -import com.fr.base.BaseUtils; import com.fr.base.Utils; import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.base.TextAttr; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Title; import com.fr.design.beans.FurtherBasicBeanPane; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.formula.DefaultTinyFormulaPane; import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.frpane.UINumberDragPane; @@ -40,7 +42,6 @@ import com.fr.van.chart.designer.style.VanChartStylePane; import com.fr.van.chart.designer.style.axis.component.VanChartCategoryStylePaneWithCheckBox; import javax.swing.BorderFactory; -import javax.swing.Icon; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.event.ChangeEvent; @@ -143,10 +144,10 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { double[] column = {f, s}; double[] rowSize = {p, p, p, p, p, p, p, p}; Component[][] components = new Component[][]{ - new Component[]{createTitlePane(new double[]{p, p, p, p, p, p}, column, isXAxis), null}, - new Component[]{createLabelPane(new double[]{p, p, p}, column), null}, - new Component[]{createLineStylePane(new double[]{p, p, p, p, p}, columnSize), null}, - new Component[]{createAxisPositionPane(new double[]{p, p, p}, columnSize, isXAxis), null}, + new Component[]{createTitlePane(isXAxis), null}, + new Component[]{createLabelPane(), null}, + new Component[]{createLineStylePane(), null}, + new Component[]{createAxisPositionPane(isXAxis), null}, new Component[]{createDisplayStrategy(), null}, new Component[]{createValueStylePane(), null}, }; @@ -154,7 +155,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); } - protected JPanel createTitlePane(double[] row, double[] col, boolean isXAxis) { + protected JPanel createTitlePane(boolean isXAxis) { showTitle = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Use_Show"), Toolkit.i18nText("Fine-Design_Chart_Hidden")}); titleAlignPane = isXAxis ? getXAxisTitleAlignPane() : getYAxisTitleAlignPane(); titleAlignPane.setSelectedItem(Constants.CENTER); @@ -179,10 +180,10 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { UIComponentUtils.wrapWithBorderLayoutPane(titleTextRotation) }, }; - titlePane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); - titlePane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); + titlePane = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); - JPanel showTitlePane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Axis_Title"), showTitle); + JPanel showTitlePane = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(Toolkit.i18nText("Fine-Design_Chart_Axis_Title")), showTitle); showTitle.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -194,44 +195,34 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { jPanel.add(showTitlePane, BorderLayout.NORTH); jPanel.add(titlePane, BorderLayout.CENTER); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(PaneTitleConstants.CHART_STYLE_TITLE_TITLE, jPanel); + return new UIExpandablePane(PaneTitleConstants.CHART_STYLE_TITLE_TITLE, jPanel, true); } private UIButtonGroup getXAxisTitleAlignPane() { - Icon[] alignmentIconArray = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"), - BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"), - BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png")}; - Integer[] alignment = new Integer[]{Constants.LEFT, Constants.CENTER, Constants.RIGHT}; - - return new UIButtonGroup(alignmentIconArray, alignment); + return FineComponentsFactory.createHorizontalAlignmentButtonGroup(); } private UIButtonGroup getYAxisTitleAlignPane() { - Icon[] alignmentIconArray = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_top_normal.png"), - BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_center_normal.png"), - BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_down_normal.png")}; - Integer[] alignment = new Integer[]{Constants.TOP, Constants.CENTER, Constants.BOTTOM}; - - return new UIButtonGroup(alignmentIconArray, alignment); + return FineComponentsFactory.createVerticalAlignmentButtonGroup(); } - protected JPanel createLabelPane(double[] row, double[] col) { + protected JPanel createLabelPane() { initLabelComponents(); labelPane = new VanChartAxisStyleSettingPane(showLabelDisplay(), getChartTextAttrPane()); wholeDisplayLabelPanel = new VanChartAxisStyleSettingPane(showLabelDisplay(), getChartTextAttrPane()); - wholeDisplayLabelPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); addComponentsListener(); - JPanel showLabelPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Axis_Label"), showLabel); + JPanel showLabelPane = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(Toolkit.i18nText("Fine-Design_Chart_Axis_Label")), showLabel); JPanel labelContentPane = createLabelContentPane(); JPanel labelPane = new JPanel(new BorderLayout()); labelPane.add(showLabelPane, BorderLayout.NORTH); labelPane.add(labelContentPane, BorderLayout.CENTER); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(PaneTitleConstants.CHART_STYLE_LABEL_TITLE, labelPane); + return new UIExpandablePane(PaneTitleConstants.CHART_STYLE_LABEL_TITLE, labelPane, true); } private void initLabelComponents() { @@ -298,7 +289,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { */ private JPanel createCategoryStylePane() { categoryStylePane = new JPanel(new BorderLayout()); - categoryStylePane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); +// categoryStylePane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); return categoryStylePane; } @@ -316,7 +307,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { return VanChartAxisPaneHelper.createAxisTextAttrPane(); } - protected JPanel createLineStylePane(double[] row, double[] col) { + protected JPanel createLineStylePane() { axisLineStyle = createLineComboBox(); axisLineColor = new ColorSelectBoxWithThemeStyle(100); String[] strings = new String[]{Toolkit.i18nText("Fine-Design_Chart_Open"), Toolkit.i18nText("Fine-Design_Chart_Close")}; @@ -324,8 +315,8 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { mainTick = new UIButtonGroup(strings, values); secondTick = new UIButtonGroup(strings, values); - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(getLineStylePaneComponents(), row, col); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Axis_Line_Style"), panel); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, getLineStylePaneComponents(), new double[]{1.2, 3}); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Axis_Line_Style"), panel, true); } protected LineComboBox createLineComboBox() { @@ -342,7 +333,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { }; } - protected JPanel createAxisPositionPane(double[] row, double[] col, boolean isXAxis) { + protected JPanel createAxisPositionPane(boolean isXAxis) { position = new UIButtonGroup(getAxisPositionNameArray(isXAxis), getAxisPositionValueArray(isXAxis)); reversed = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_On"), Toolkit.i18nText("Fine-Design_Chart_Off")}, new Boolean[]{true, false}); Component[][] components = new Component[][]{ @@ -354,8 +345,8 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_AxisReversed")), reversed}, }; - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Layout_Position"), panel); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Layout_Position"), panel, true); } private String[] getAxisPositionNameArray(boolean isXAxis) { @@ -393,11 +384,8 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } }); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Display_Strategy"), panel); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Display_Strategy"), panel, true); - //区域显示策略 恢复用注释。取消注释。 -// limitPane = new LimitPane(); -// return limitPane; } protected JPanel createValueStylePane() { @@ -413,16 +401,12 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { centerPane.add(valueFormat, Toolkit.i18nText("Fine-Design_Chart_Common")); centerPane.add(htmlLabelPane, Toolkit.i18nText("Fine-Design_Chart_Custom")); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, f}; - double[] rowSize = {p, p, p}; Component[][] components = new Component[][]{ new Component[]{null, null}, new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Axis_Label_Format"), SwingConstants.LEFT), valueFormatStyle}, new Component[]{null, centerPane}, }; - JPanel contentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); + JPanel contentPane = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); valueFormatStyle.addActionListener(new ActionListener() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartTimeAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartTimeAxisPane.java index 500667963b..598465380b 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartTimeAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartTimeAxisPane.java @@ -1,5 +1,6 @@ package com.fr.van.chart.designer.style.axis; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.BaseFormula; import com.fr.base.Utils; import com.fr.design.chart.ChartSwingUtils; @@ -7,6 +8,7 @@ import com.fr.design.editor.ValueEditorPane; import com.fr.design.editor.editor.DateEditor; import com.fr.design.editor.editor.Editor; import com.fr.design.editor.editor.FormulaEditor; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.date.UIDatePicker; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icombobox.UIComboBox; @@ -15,7 +17,6 @@ import com.fr.design.gui.style.FormatPane; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.general.DateUtils; import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.attr.axis.VanChartAxis; @@ -61,24 +62,17 @@ public class VanChartTimeAxisPane extends VanChartBaseAxisPane { @Override protected JPanel createContentPane(boolean isXAxis){ - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double s = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] column = {f, s}; - double[] rowSize = {p,p,p,p,p,p,p,p,p,p,p,p,p,p}; Component[][] components = new Component[][]{ - new Component[]{createTitlePane(new double[]{p, p, p, p, p,p}, column, isXAxis),null}, - new Component[]{createLabelPane(new double[]{p, p, p}, column),null}, + new Component[]{createTitlePane(isXAxis),null}, + new Component[]{createLabelPane(),null}, new Component[]{createValueDefinition(),null}, - new Component[]{createLineStylePane(new double[]{p, p,p,p,p}, columnSize),null}, - new Component[]{createAxisPositionPane(new double[]{p, p, p}, columnSize, isXAxis),null}, + new Component[]{createLineStylePane(),null}, + new Component[]{createAxisPositionPane(isXAxis),null}, new Component[]{createDisplayStrategy(),null}, new Component[]{createValueStylePane(),null}, }; - return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1}); } protected boolean showLabelDisplay() { @@ -87,7 +81,7 @@ public class VanChartTimeAxisPane extends VanChartBaseAxisPane { private JPanel createValueDefinition(){ timeMinMaxValuePane = new TimeMinMaxValuePane(); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Value_Definition"), timeMinMaxValuePane); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Value_Definition"), timeMinMaxValuePane, true); } @Override diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java index 032642c93a..61371ee2f4 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java @@ -1,13 +1,13 @@ package com.fr.van.chart.designer.style.axis; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.BaseFormula; import com.fr.chart.base.ChartBaseUtils; import com.fr.design.chart.ChartSwingUtils; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.plugin.chart.attr.axis.VanChartAxis; import com.fr.plugin.chart.attr.axis.VanChartValueAxis; import com.fr.stable.StringUtils; @@ -42,35 +42,28 @@ public class VanChartValueAxisPane extends VanChartBaseAxisPane { @Override protected JPanel createContentPane(boolean isXAxis){ - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double s = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] column = {f, s}; - double[] rowSize = {p,p,p,p,p,p,p,p,p,p,p,p,p,p}; Component[][] components = new Component[][]{ - new Component[]{createTitlePane(new double[]{p, p, p, p, p, p}, column, isXAxis), null}, - new Component[]{createLabelPane(new double[]{p, p, p}, column), null}, - new Component[]{createMinMaxValuePane(new double[]{p, p}, columnSize), null}, - new Component[]{createLineStylePane(new double[]{p, p, p, p, p}, columnSize), null}, - new Component[]{createAxisPositionPane(new double[]{p, p, p}, columnSize, isXAxis), null}, + new Component[]{createTitlePane(isXAxis), null}, + new Component[]{createLabelPane(), null}, + new Component[]{createMinMaxValuePane(), null}, + new Component[]{createLineStylePane(), null}, + new Component[]{createAxisPositionPane(isXAxis), null}, new Component[]{createDisplayStrategy(), null}, new Component[]{createValueStylePane(), null}, }; - return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } protected boolean showLabelDisplay() { return false; } - protected JPanel createMinMaxValuePane(double[] row, double[] col){ - JPanel panel = createCommenValuePane(row,col); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Value_Definition"), panel); + protected JPanel createMinMaxValuePane(){ + JPanel panel = createCommenValuePane(); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Value_Definition"), panel, true); } - protected JPanel createCommenValuePane(double[] row, double[] col){ + protected JPanel createCommenValuePane(){ initMinMaxValuePane(); logBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Custom_LogBase_Value")); @@ -82,10 +75,6 @@ public class VanChartValueAxisPane extends VanChartBaseAxisPane { }); ChartSwingUtils.addListener(logBox, logBaseField); -// JPanel logPane = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); -// logPane.add(logBox); -// logPane.add(logBaseField); - logPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Log_Base_Value"), logBaseField, TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH); @@ -108,7 +97,7 @@ public class VanChartValueAxisPane extends VanChartBaseAxisPane { } }); - return TableLayoutHelper.createTableLayoutPane(components, row, col); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } protected void initMinMaxValuePane() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java index 3020093278..adaabb5dfd 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java @@ -1,5 +1,6 @@ package com.fr.van.chart.designer.style.axis.component; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseUtils; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.ibutton.UIButton; @@ -13,7 +14,6 @@ import com.fr.plugin.chart.attr.axis.VanChartAxis; import com.fr.plugin.chart.attr.plot.VanChartAxisPlot; import com.fr.van.chart.designer.style.axis.VanChartAxisPane; -import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.Icon; import javax.swing.JPanel; @@ -57,15 +57,13 @@ public class VanChartAxisButtonPane extends BasicBeanPane { this.parent = vanChartAxisPane; this.setLayout(new BorderLayout()); - addButton = new AddButton(BaseUtils.readIcon("/com/fr/design/images/control/addPopup.png")); + addButton = new AddButton(new LazyIcon("add_popup")); JPanel eastPane = new JPanel(new BorderLayout()); - eastPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 20)); eastPane.add(addButton, BorderLayout.NORTH); addButton.setVisible(false); this.add(eastPane, BorderLayout.EAST); buttonPane = new JPanel(); - buttonPane.setBorder(BorderFactory.createEmptyBorder(0, 5, 10, 0)); this.add(buttonPane, BorderLayout.CENTER); itemX = new UIMenuItem(VanChartAttrHelper.X_AXIS_PREFIX); diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/radar/VanChartRadarXAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/radar/VanChartRadarXAxisPane.java index 3558443c4f..6e82234ea3 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/radar/VanChartRadarXAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/radar/VanChartRadarXAxisPane.java @@ -1,13 +1,11 @@ package com.fr.van.chart.designer.style.axis.radar; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.design.gui.icombobox.LineComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.stable.CoreConstants; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.style.axis.VanChartBaseAxisPane; import javax.swing.JPanel; @@ -22,20 +20,13 @@ public class VanChartRadarXAxisPane extends VanChartBaseAxisPane { protected JPanel createContentPane(boolean isXAxis){ - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double s = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] column = {f, s}; - double[] rowSize = {p,p,p,p,p,p}; Component[][] components = new Component[][]{ - new Component[]{createLabelPane(new double[]{p, p, p}, column),null}, - new Component[]{createLineStylePane(new double[]{p, p, p, p}, columnSize),null}, + new Component[]{createLabelPane(),null}, + new Component[]{createLineStylePane(),null}, new Component[]{createValueStylePane(),null}, }; - return TableLayoutHelper.createTableLayoutPane(components,rowSize,columnSize); + return FineLayoutBuilder.compatibleTableLayout(10, components,new double[]{1}); } protected boolean showLabelDisplay() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/radar/VanChartRadarYAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/radar/VanChartRadarYAxisPane.java index 0015676882..635d04fa40 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/radar/VanChartRadarYAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/radar/VanChartRadarYAxisPane.java @@ -1,19 +1,17 @@ package com.fr.van.chart.designer.style.axis.radar; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.icombobox.LineComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.plugin.chart.attr.axis.VanChartAxis; import com.fr.plugin.chart.attr.axis.VanChartValueAxis; import com.fr.stable.CoreConstants; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.style.axis.VanChartValueAxisPane; import com.fr.van.chart.designer.style.axis.component.MinMaxValuePaneWithOutSecTick; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.CardLayout; @@ -33,21 +31,14 @@ public class VanChartRadarYAxisPane extends VanChartValueAxisPane { protected JPanel createContentPane(boolean isXAxis) { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double s = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] column = {f, s}; - double[] rowSize = {p, p, p, p, p, p, p, p}; Component[][] components = new Component[][]{ - new Component[]{createLabelPane(new double[]{p, p, p}, column), null}, - new Component[]{createMinMaxValuePane(new double[]{p, p, p}, columnSize), null}, - new Component[]{createLineStylePane(new double[]{p, p, p, p}, columnSize), null}, + new Component[]{createLabelPane(), null}, + new Component[]{createMinMaxValuePane(), null}, + new Component[]{createLineStylePane(), null}, new Component[]{createValueStylePane(), null}, }; - return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } protected LineComboBox createLineComboBox() { @@ -55,16 +46,11 @@ public class VanChartRadarYAxisPane extends VanChartValueAxisPane { } @Override - protected JPanel createMinMaxValuePane(double[] row, double[] col) { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - + protected JPanel createMinMaxValuePane() { valueStyle = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Axis_Unified_Count"), Toolkit.i18nText("Fine-Design_Chart_Respectively_Specified")}); - JPanel commenPane = createCommenValuePane(new double[]{p, p, p}, columnSize); + JPanel commenPane = createCommenValuePane(); tableDataPane = new RadarTableDataPane(); centerPane = new JPanel(new CardLayout()); @@ -81,9 +67,7 @@ public class VanChartRadarYAxisPane extends VanChartValueAxisPane { } }); - JPanel panel = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Value_Definition"), contentPane); - contentPane.setBorder(BorderFactory.createEmptyBorder(10, 5, 0, 0)); - return panel; + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Value_Definition"), contentPane, true); } protected Component[][] getLineStylePaneComponents() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaPane.java index ff50691601..7352ec7bc2 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaPane.java @@ -1,6 +1,5 @@ package com.fr.van.chart.designer.style.background; -import com.fine.theme.utils.FineUIScale; import com.fr.chart.chartattr.Plot; import com.fr.chartx.config.info.constant.ConfigType; import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; @@ -16,7 +15,6 @@ import java.util.ArrayList; import java.util.List; import java.awt.BorderLayout; -import static com.fine.swing.ui.layout.Layouts.cell; /** * 属性表, 图表样式-背景界面. @@ -35,10 +33,10 @@ public class VanChartAreaPane extends ThirdTabPane implements AutoSele protected void initLayout() { - this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); + this.setLayout(new BorderLayout()); if (!paneList.isEmpty()) { if (nameArray.length > 1) { - this.add(cell(tabPane).getComponent(), BorderLayout.NORTH); + this.add(tabPane, BorderLayout.NORTH); } } this.add(centerPane, BorderLayout.CENTER); diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAxisAreaPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAxisAreaPane.java index acd26d422d..6702db56bb 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAxisAreaPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAxisAreaPane.java @@ -1,12 +1,13 @@ package com.fr.van.chart.designer.style.background; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.style.ColorSelectBoxWithThemeStyle; import com.fr.design.style.color.ColorSelectBox; import com.fr.general.ComparatorUtils; @@ -17,7 +18,6 @@ import com.fr.plugin.chart.type.LineType; import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.LineTypeComboBox; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.CardLayout; @@ -59,19 +59,9 @@ public class VanChartAxisAreaPane extends BasicBeanPane { horizonLineType = new LineTypeComboBox(new LineType[]{LineType.NONE, LineType.SOLID, LineType.DASHED}); verticalLineType = new LineTypeComboBox(new LineType[]{LineType.NONE, LineType.SOLID, LineType.DASHED}); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double s = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; - double[] columnSize = {f}; - double[] rowSize = {p, p, p}; - - Component[][] components = new Component[][]{ - new Component[]{createGridLinePane()}, - new Component[]{createAlertLinePane()}, - new Component[]{createIntervalPane(new double[]{p, p, p, p}, new double[]{f, s})}, - }; - JPanel panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + JPanel panel = FineLayoutBuilder.createVerticalLayout(0, + createGridLinePane(), createAlertLinePane(), createIntervalPane() + ); this.setLayout(new BorderLayout()); this.add(panel, BorderLayout.CENTER); } @@ -79,12 +69,12 @@ public class VanChartAxisAreaPane extends BasicBeanPane { protected JPanel createGridLinePane() { initGridLineComponents(); - JPanel panel = new JPanel(new BorderLayout(0, 4)); + JPanel panel = new JPanel(new BorderLayout(0, FineUIScale.scale(10))); panel.add(createSingleGridLinePane(Toolkit.i18nText("Fine-Design_Chart_Direction_Horizontal"), true), BorderLayout.NORTH); panel.add(createSingleGridLinePane(Toolkit.i18nText("Fine-Design_Chart_Direction_Vertical"), false), BorderLayout.CENTER); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Grid_Line"), panel); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Grid_Line"), panel, true); } protected void initGridLineComponents() { @@ -127,9 +117,9 @@ public class VanChartAxisAreaPane extends BasicBeanPane { LineTypeComboBox lineTypeComboBox = isHorizontal ? horizonLineType : verticalLineType; JPanel colorSelectPane = isHorizontal ? horizontalColorPane : verticalColorPane; - JPanel lineTypePane = TableLayout4VanChartHelper.createGapTableLayoutPane(title, lineTypeComboBox); + JPanel lineTypePane = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, new UILabel(title), lineTypeComboBox); - JPanel singleGridLinePane = new JPanel(new BorderLayout()); + JPanel singleGridLinePane = new JPanel(new BorderLayout(0, FineUIScale.scale(10))); singleGridLinePane.add(lineTypePane, BorderLayout.NORTH); singleGridLinePane.add(colorSelectPane, BorderLayout.CENTER); @@ -139,22 +129,19 @@ public class VanChartAxisAreaPane extends BasicBeanPane { protected JPanel createAlertLinePane() { alertLine = getAlertLinePane(); - JPanel panel = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Alert_Line"), alertLine); - alertLine.setBorder(BorderFactory.createEmptyBorder(10, 5, 0, 0)); - return panel; + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Alert_Line"), alertLine, true); } protected AlertLineListControlPane getAlertLinePane() { return new AlertLineListControlPane(); } - protected JPanel createIntervalPane(double[] row, double[] col) { + protected JPanel createIntervalPane() { isDefaultIntervalBackground = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Default_Interval"), Toolkit.i18nText("Fine-Design_Chart_Custom_Interval_Background")}); horizontalColorBackground = new ColorSelectBox(100); verticalColorBackground = new ColorSelectBox(100); Component[][] components = getIntervalPaneComponents(); - JPanel defaultPane = TableLayoutHelper.createTableLayoutPane(components, row, col); - defaultPane.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0)); + JPanel defaultPane = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); customIntervalBackground = getBackgroundListControlPane(); cardLayout = new CardLayout(); @@ -168,12 +155,11 @@ public class VanChartAxisAreaPane extends BasicBeanPane { } }); JPanel intervalPane = new JPanel(new BorderLayout(0, 6)); - JPanel panel1 = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Interval_Background"), isDefaultIntervalBackground); + JPanel panel1 = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(Toolkit.i18nText("Fine-Design_Chart_Interval_Background")), isDefaultIntervalBackground); intervalPane.add(panel1, BorderLayout.NORTH); intervalPane.add(centerPane, BorderLayout.CENTER); - JPanel panel = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Interval_Background"), intervalPane); - intervalPane.setBorder(BorderFactory.createEmptyBorder(10, 5, 0, 0)); - return panel; + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Interval_Background"), intervalPane); } protected BackgroundListControlPane getBackgroundListControlPane() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartGantPlotAreaBackgroundPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartGantPlotAreaBackgroundPane.java index fbea849909..8df598dd05 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartGantPlotAreaBackgroundPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartGantPlotAreaBackgroundPane.java @@ -1,15 +1,14 @@ package com.fr.van.chart.designer.style.background; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ColorSelectBoxWithOutTransparent; import com.fr.plugin.chart.gantt.VanChartGanttPlot; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.JPanel; import java.awt.BorderLayout; @@ -26,16 +25,8 @@ public class VanChartGantPlotAreaBackgroundPane extends VanChartAreaBackgroundPa @Override protected JPanel createContentPane() { JPanel contentPane = new JPanel(new BorderLayout()); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f}; - double[] rowSize = {p, p}; - Component[][] components = new Component[][]{ - new Component[]{createAxisBorderPane()}, - new Component[]{createContentBorderPane()} - }; - - contentPane.add(TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize), BorderLayout.CENTER); + contentPane.add(FineLayoutBuilder.createVerticalLayout( + 0, createAxisBorderPane(), createContentBorderPane()), BorderLayout.CENTER); return contentPane; } @@ -69,34 +60,28 @@ public class VanChartGantPlotAreaBackgroundPane extends VanChartAreaBackgroundPa private JPanel createAxisBorderPane() { axisColorPane = new ColorSelectBoxWithOutTransparent(100); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle( + return new UIExpandablePane( Toolkit.i18nText("Fine-Design_Chart_Gant_Axis_Border"), - createBorderPane(axisColorPane) + createBorderPane(axisColorPane), true ); } private JPanel createContentBorderPane() { contentColorPane = new ColorSelectBoxWithOutTransparent(100); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle( + return new UIExpandablePane( Toolkit.i18nText("Fine-Design_Chart_Gant_Content_Border"), createBorderPane(contentColorPane) ); } private JPanel createBorderPane(ColorSelectBoxWithOutTransparent colorPane) { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f, TableLayout4VanChartHelper.EDIT_AREA_WIDTH}; - double[] rowSize = {p, p}; - Component[][] components = new Component[][]{ - new Component[]{null, null}, new Component[]{ new UILabel(Toolkit.i18nText("Fine-Design_Chart_Color")), colorPane } }; - return TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPieValueLabelDetailPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPieValueLabelDetailPane.java index 43f6da1e94..bd705b0e06 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPieValueLabelDetailPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPieValueLabelDetailPane.java @@ -68,16 +68,6 @@ public class VanChartPieValueLabelDetailPane extends VanChartPlotLabelDetailPane protected JPanel createLabelBackgroundPane() { VanChartBackgroundWithOutImagePane backgroundPane = new VanChartBackgroundWithOutImagePane() { - @Override - protected JPanel initContentPanel() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] rowSize = {p, p, p}; - return TableLayout4VanChartHelper.createGapTableLayoutPane(getPaneComponents(), rowSize, columnSize); - } - @Override protected Component[][] getPaneComponents() { return new Component[][]{ diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java index 2cf72679f3..ead3978acd 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java @@ -204,7 +204,7 @@ public class VanChartPlotLabelDetailPane extends BasicPane { } protected JPanel createTableLayoutPaneWithTitle(String title, JPanel panel) { - return new UIExpandablePane(title, panel); + return new UIExpandablePane(title, panel, true); } protected TwoTuple getPositionNamesAndValues() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java index 470e9ead02..9a2da2285a 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java @@ -1,6 +1,7 @@ package com.fr.van.chart.designer.style.series; import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.chart.chartdata.model.DataProcessor; import com.fr.base.chart.chartdata.model.LargeDataModel; @@ -105,7 +106,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP scrollPane.setViewportView(getContentInPlotType()); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); } - return column( + return column(10, cell(getColorPane()), cell(getContentInPlotType()) ).getComponent(); } @@ -125,7 +126,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP //获取颜色面板 protected JPanel getColorPane() { - JPanel panel = new JPanel(new BorderLayout()); + JPanel panel = new JPanel(new BorderLayout(0, FineUIScale.scale(10))); stylePane = createStylePane(); vanChartFillStylePane = getVanChartFillStylePane(); if (vanChartFillStylePane != null) { @@ -205,7 +206,8 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP checkLarge(); } }); - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Large_Model"), largeDataModelGroup); + JPanel panel = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(Toolkit.i18nText("Fine-Design_Chart_Large_Model")), largeDataModelGroup); return createLargeDataModelPane(panel); } @@ -227,8 +229,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP } protected JPanel createLargeDataModelPane(JPanel jPanel) { - JPanel panel = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Large_Data"), jPanel); - return panel; + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Large_Data"), jPanel, true); } protected UIButtonGroup createLargeDataModelGroup() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/tooltip/VanChartPlotTooltipPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/tooltip/VanChartPlotTooltipPane.java index 5c7e7dd2ed..e93c9690c7 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/tooltip/VanChartPlotTooltipPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/tooltip/VanChartPlotTooltipPane.java @@ -7,12 +7,10 @@ import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; import com.fr.design.utils.gui.UIComponentUtils; import com.fr.design.widget.FRWidgetFactory; import com.fr.plugin.chart.base.AttrTooltip; import com.fr.van.chart.designer.PlotFactory; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.VanChartTooltipContentPane; import com.fr.van.chart.designer.component.background.VanChartBackgroundWithOutImagePane; import com.fr.van.chart.designer.component.border.VanChartBorderWithRadiusPane; @@ -93,11 +91,6 @@ public class VanChartPlotTooltipPane extends BasicPane { showAllSeries = new UICheckBox(getShowAllSeriesLabelText()); followMouse = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Follow_Mouse"), Toolkit.i18nText("Fine-Design_Chart_Not_Follow_Mouse")}); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] rowSize = { p,p,p}; Component[][] components = new Component[3][2]; components[0] = new Component[]{null,null}; components[1] = new Component[]{FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Chart_Prompt_Box")), UIComponentUtils.wrapWithBorderLayoutPane(followMouse)}; @@ -105,7 +98,7 @@ public class VanChartPlotTooltipPane extends BasicPane { if(plot.isSupportTooltipSeriesType() && hasTooltipSeriesType()){ components[2] = new Component[]{showAllSeries,null}; } - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components,rowSize,columnSize); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Display_Strategy"), panel); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/other/VanChartDrillMapInteractivePane.java b/designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/other/VanChartDrillMapInteractivePane.java index 7ada5f9c58..16659efcd8 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/other/VanChartDrillMapInteractivePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/other/VanChartDrillMapInteractivePane.java @@ -1,11 +1,12 @@ package com.fr.van.chart.drillmap.designer.other; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.base.DrillMapTools; import com.fr.chart.chartattr.Chart; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.backgroundpane.ColorBackgroundQuickPane; import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; import com.fr.design.mainframe.chart.mode.ChartEditContext; @@ -16,11 +17,9 @@ import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.background.VanChartBackgroundPaneWithOutImageAndShadow; import com.fr.van.chart.designer.other.VanChartInteractivePaneWithMapZoom; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import java.awt.BorderLayout; import java.awt.Component; /** @@ -36,26 +35,21 @@ public class VanChartDrillMapInteractivePane extends VanChartInteractivePaneWith @Override protected JPanel getInteractivePane(VanChartPlot plot) { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] rowSize = {p, p, p, p, p, p, p, p, p, p, p}; Component[][] components = ChartEditContext.normalMode() ? new Component[][]{ - new Component[]{createToolBarPane(new double[]{p, p, p}, columnSize), null}, + new Component[]{createToolBarPane(), null}, new Component[]{createAnimationPane(), null}, new Component[]{createZoomPane(plot), null}, new Component[]{createDrillToolsPane(), null}, new Component[]{createAutoRefreshPane(plot), null}, new Component[]{createHyperlinkPane(), null} } : new Component[][]{ - new Component[]{createToolBarPane(new double[]{p, p, p}, columnSize), null}, + new Component[]{createToolBarPane(), null}, new Component[]{createAnimationPane(), null}, new Component[]{createZoomPane(plot), null}, new Component[]{createDrillToolsPane(), null} }; - return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } private JPanel createDrillToolsPane() { @@ -65,12 +59,7 @@ public class VanChartDrillMapInteractivePane extends VanChartInteractivePaneWith @Override protected JPanel getContentPane(JPanel buttonPane) { - double p = TableLayout.PREFERRED; - double e = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; - double[] columnSize = {e}; - double[] rowSize = {p, p}; - - return TableLayout4VanChartHelper.createGapTableLayoutPane(getComponents(buttonPane), rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(10, getComponents(buttonPane), new double[]{1.2, 3}); } @Override @@ -96,10 +85,6 @@ public class VanChartDrillMapInteractivePane extends VanChartInteractivePaneWith }; catalogSuperLink = new VanChartCatalogHyperLinkPane(); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f}; - double[] rowSize = {p, p, p, p, p, p}; Component[][] components = ChartEditContext.duchampMode() ? new Component[][]{ new Component[]{null}, new Component[]{createTitlePane(Toolkit.i18nText("Fine-Design_Chart_Character"), textAttrPane)}, @@ -112,11 +97,9 @@ public class VanChartDrillMapInteractivePane extends VanChartInteractivePaneWith new Component[]{selectBackgroundPane}, new Component[]{catalogSuperLink} }; - drillPane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + drillPane = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); - JPanel panel = new JPanel(new BorderLayout()); - panel.add(openOrClosePane, BorderLayout.NORTH); - panel.add(drillPane, BorderLayout.CENTER); + JPanel panel = FineLayoutBuilder.createVerticalLayout(10, openOrClosePane, drillPane); openOrClose.addChangeListener(new ChangeListener() { @Override @@ -124,16 +107,14 @@ public class VanChartDrillMapInteractivePane extends VanChartInteractivePaneWith checkEnable(); } }); - - JPanel panel1 = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Drill"), panel); - panel.setBorder(BorderFactory.createEmptyBorder(10, 5, 0, 0)); - return panel1; + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Drill"), panel); } private JPanel createTitlePane(String title, Component component) { - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(title, component, TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH); - panel.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0)); - return panel; + Component[][] components = new Component[][]{ + new Component[]{new UILabel(title), component} + }; + return FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1.2, 3}); } private void checkEnable() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/VanChartGanttDataAndLinkPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/VanChartGanttDataAndLinkPane.java index 150f9c913d..d22c3a3af3 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/VanChartGanttDataAndLinkPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/VanChartGanttDataAndLinkPane.java @@ -1,5 +1,6 @@ package com.fr.van.chart.gantt.designer.data; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; @@ -55,6 +56,7 @@ public class VanChartGanttDataAndLinkPane extends MultiTabPane paneList = initPaneList(); initComponents(); + setBorder(new ScaledEmptyBorder(10, 0, 0, 0)); } private void initComponents(){ diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/GanttPlotReportDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/GanttPlotReportDataContentPane.java index e5b2435b1e..1d53034ddf 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/GanttPlotReportDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/GanttPlotReportDataContentPane.java @@ -1,11 +1,11 @@ package com.fr.van.chart.gantt.designer.data.data; +import com.fine.theme.utils.FineUIScale; import com.fr.chart.chartattr.ChartCollection; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; import com.fr.van.chart.gantt.designer.data.data.component.GanttReportDataContentPane; import com.fr.van.chart.gantt.designer.data.data.component.GanttReportDataProjectPane; -import javax.swing.BorderFactory; import java.awt.BorderLayout; /** @@ -14,12 +14,10 @@ import java.awt.BorderLayout; public class GanttPlotReportDataContentPane extends AbstractReportDataContentPane { private GanttReportDataProjectPane projectPane; private GanttReportDataContentPane contentPane; - private static final int V_GAP = 7; public GanttPlotReportDataContentPane() { initComponent(); - this.setLayout(new BorderLayout(0, V_GAP)); - projectPane.setBorder(BorderFactory.createEmptyBorder(0,24,0,15)); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); this.add(projectPane, BorderLayout.NORTH); this.add(contentPane, BorderLayout.CENTER); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/GanttPlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/GanttPlotTableDataContentPane.java index feab3545db..347776827f 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/GanttPlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/GanttPlotTableDataContentPane.java @@ -1,11 +1,11 @@ package com.fr.van.chart.gantt.designer.data.data; +import com.fine.theme.utils.FineUIScale; import com.fr.chart.chartattr.ChartCollection; import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; import com.fr.van.chart.gantt.designer.data.data.component.GanttTableDataContentPane; import com.fr.van.chart.gantt.designer.data.data.component.GanttTableDataProjectPane; -import javax.swing.BorderFactory; import javax.swing.JSeparator; import java.awt.BorderLayout; import java.util.List; @@ -16,12 +16,10 @@ import java.util.List; public class GanttPlotTableDataContentPane extends AbstractTableDataContentPane { private GanttTableDataProjectPane projectPane; private GanttTableDataContentPane contentPane; - private static final int V_GAP = 7; public GanttPlotTableDataContentPane() { initComponent(); - this.setLayout(new BorderLayout(0, V_GAP)); - projectPane.setBorder(BorderFactory.createEmptyBorder(0,17,0,15)); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); this.add(projectPane, BorderLayout.NORTH); this.add(new JSeparator(), BorderLayout.CENTER); this.add(contentPane, BorderLayout.SOUTH); diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/ComboBoxWithButtonPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/ComboBoxWithButtonPane.java index c00109db92..9c5e671c2d 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/ComboBoxWithButtonPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/ComboBoxWithButtonPane.java @@ -6,13 +6,15 @@ import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.chart.gui.data.table.DataPaneHelper; -import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Dimension; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + /** * Created by hufan on 2017/1/10. */ @@ -20,8 +22,6 @@ public abstract class ComboBoxWithButtonPane extends JPanel { private UIComboBox comboBoxName; private UIButton button; private int index = 0; - private static final int H_GAP = 5; - private static final int LEFT_GAP = 7; private UIObserverListener listener; public ComboBoxWithButtonPane() { @@ -31,20 +31,16 @@ public abstract class ComboBoxWithButtonPane extends JPanel { public ComboBoxWithButtonPane(int index) { this.index = index; comboBoxName = new UIComboBox(); - comboBoxName.setPreferredSize(new Dimension(80,20)); button = new UIButton(getButtonIcon()); - button.setPreferredSize(new Dimension(20, 20)); button.addActionListener(getButtonListener()); UILabel title = new UILabel(getTitleText()); - title.setPreferredSize(new Dimension(80, 20)); - this.setLayout(new BorderLayout(H_GAP, 0)); - this.add(comboBoxName, BorderLayout.CENTER); - this.add(button, BorderLayout.EAST); - this.add(title, BorderLayout.WEST); - this.setBorder(BorderFactory.createEmptyBorder(0, LEFT_GAP, 0, 0)); + this.setLayout(new BorderLayout()); + this.add(row( + cell(title).weight(1.2), cell(comboBoxName).weight(2.4), flex(0.1), cell(button).weight(0.5) + ).getComponent()); } protected abstract String getTitleText(); diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/GanttReportDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/GanttReportDataContentPane.java index 57f2463865..398e59fbed 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/GanttReportDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/GanttReportDataContentPane.java @@ -1,21 +1,23 @@ package com.fr.van.chart.gantt.designer.data.data.component; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.chartattr.ChartCollection; import com.fr.design.formula.DefaultTinyFormulaPane; import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; import com.fr.plugin.chart.gantt.data.VanGanttReportDefinition; import com.fr.van.chart.gantt.designer.data.data.GanttDataPaneHelper; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; /** * Created by hufan on 2017/1/11. @@ -29,13 +31,11 @@ public class GanttReportDataContentPane extends AbstractReportDataContentPane{ private TinyFormulaPane linkID; public GanttReportDataContentPane() { - this.setLayout(new BorderLayout()); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); initAllComponent(); JPanel panel = getContentPane(); - panel.setBorder(BorderFactory.createEmptyBorder(10,24,0,15)); this.add(getJSeparator(), BorderLayout.NORTH); this.add(panel, BorderLayout.CENTER); - this.setPreferredSize(new Dimension(246,(int)this.getPreferredSize().getHeight())); } @@ -57,25 +57,16 @@ public class GanttReportDataContentPane extends AbstractReportDataContentPane{ return new DefaultTinyFormulaPane() { @Override protected void initLayout() { - this.setLayout(new BorderLayout(4, 0)); - + this.setLayout(new BorderLayout()); UILabel label = new UILabel(title); - label.setPreferredSize(new Dimension(75, 20)); - this.add(label, BorderLayout.WEST); - - formulaTextField.setPreferredSize(new Dimension(100, 20)); - this.add(formulaTextField, BorderLayout.CENTER); - this.add(formulaTextFieldButton, BorderLayout.EAST); + this.add(row( + cell(label).weight(1.2), cell(formulaTextField).weight(2.4), flex(0.1), cell(formulaTextFieldButton).weight(0.5) + ).getComponent()); } }; } private JPanel getContentPane(){ - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] row = {p,p,p,p,p,p}; - double[] col = {f}; - Component[][] components = new Component[][]{ new Component[]{seriesName}, new Component[]{startTime}, @@ -85,7 +76,7 @@ public class GanttReportDataContentPane extends AbstractReportDataContentPane{ new Component[]{linkID} }; - return TableLayoutHelper.createTableLayoutPane(components, row, col); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1}); } @Override diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/GanttReportDataProjectPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/GanttReportDataProjectPane.java index 14691049a1..6da45224d8 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/GanttReportDataProjectPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/GanttReportDataProjectPane.java @@ -1,5 +1,7 @@ package com.fr.van.chart.gantt.designer.data.data.component; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIScale; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartdata.TopDefinition; import com.fr.design.event.UIObserver; @@ -25,7 +27,7 @@ public class GanttReportDataProjectPane extends AbstractReportDataContentPane im private List processPaneList = new ArrayList(); public GanttReportDataProjectPane() { - firstProcessPane = new TinyFormulaWithButtonPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Project_Name"), "/com/fr/design/images/buttonicon/add.png") { + firstProcessPane = new TinyFormulaWithButtonPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Project_Name"), new LazyIcon("add")) { @Override protected void buttonEvent(TinyFormulaWithButtonPane pane) { addProcessPane(); @@ -38,7 +40,7 @@ public class GanttReportDataProjectPane extends AbstractReportDataContentPane im }; firstProcessPane.registerChangeListener(listener); - this.setLayout(new BorderLayout(0, 7)); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); this.add(firstProcessPane, BorderLayout.NORTH); if (center != null) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/GanttTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/GanttTableDataContentPane.java index 82bb26e438..aaf2db78d9 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/GanttTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/GanttTableDataContentPane.java @@ -1,11 +1,10 @@ package com.fr.van.chart.gantt.designer.data.data.component; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartdata.TopDefinition; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; import com.fr.general.ComparatorUtils; @@ -13,11 +12,9 @@ import com.fr.plugin.chart.gantt.data.VanGanttTableDefinition; import com.fr.stable.StringUtils; import com.fr.van.chart.gantt.designer.data.data.GanttDataPaneHelper; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; import java.util.List; /** @@ -36,10 +33,7 @@ public class GanttTableDataContentPane extends AbstractTableDataContentPane{ public GanttTableDataContentPane() { this.setLayout(new BorderLayout()); initAllComponent(); - JPanel panel = getContentPane(); - panel.setBorder(BorderFactory.createEmptyBorder(0,24,0,15)); - this.add(panel, BorderLayout.CENTER); - this.setPreferredSize(new Dimension(246,(int)this.getPreferredSize().getHeight())); + this.add(getContentPane(), BorderLayout.CENTER); } @@ -62,10 +56,6 @@ public class GanttTableDataContentPane extends AbstractTableDataContentPane{ } private JPanel getContentPane(){ - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] row = {p,p,p,p,p,p}; - double[] col = {p,f}; Component[][] components = new Component[][]{ new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Series_Name")), seriesComboBox}, @@ -76,7 +66,7 @@ public class GanttTableDataContentPane extends AbstractTableDataContentPane{ new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Task_ID")), taskIDComboBox} }; - return TableLayoutHelper.createGapTableLayoutPane(components, row, col,24,6); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } @Override diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/GanttTableDataProjectPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/GanttTableDataProjectPane.java index a7b9955406..abe44f4461 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/GanttTableDataProjectPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/GanttTableDataProjectPane.java @@ -1,6 +1,7 @@ package com.fr.van.chart.gantt.designer.data.data.component; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIScale; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartdata.TopDefinition; import com.fr.design.event.UIObserver; @@ -44,7 +45,7 @@ public class GanttTableDataProjectPane extends AbstractTableDataContentPane impl @Override protected Icon getButtonIcon(){ - return BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png"); + return new LazyIcon("add"); } @Override protected ActionListener getButtonListener(){ @@ -58,7 +59,7 @@ public class GanttTableDataProjectPane extends AbstractTableDataContentPane impl } }; - this.setLayout(new BorderLayout(0, V_GAP)); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); if (center != null) { this.add(center, BorderLayout.CENTER); @@ -93,7 +94,7 @@ public class GanttTableDataProjectPane extends AbstractTableDataContentPane impl @Override protected Icon getButtonIcon() { - return BaseUtils.readIcon("/com/fr/design/images/buttonicon/delete.png"); + return new LazyIcon("delete"); } @Override diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/TinyFormulaWithButtonPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/TinyFormulaWithButtonPane.java index 1dee2835ce..9a7911fb17 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/TinyFormulaWithButtonPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/data/component/TinyFormulaWithButtonPane.java @@ -1,20 +1,25 @@ package com.fr.van.chart.gantt.designer.data.data.component; +import com.fine.theme.icon.LazyIcon; +import com.fr.base.svg.IconUtils; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; import com.fr.design.formula.DefaultTinyFormulaPane; import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.mainframe.chart.gui.UIEditLabel; -import com.fr.general.IOUtils; +import javax.swing.Icon; import javax.swing.JPanel; import javax.swing.SwingConstants; import java.awt.BorderLayout; -import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + /** * Created by hufan on 2017/1/11. */ @@ -26,10 +31,10 @@ public abstract class TinyFormulaWithButtonPane extends JPanel implements UIObse protected UIObserverListener listener; public TinyFormulaWithButtonPane(String text) { - this(text, "/com/fr/design/images/buttonicon/delete.png"); + this(text, new LazyIcon("delete")); } - public TinyFormulaWithButtonPane(String text, String iconUrl) { + public TinyFormulaWithButtonPane(String text, Icon icon) { editLabel = new UIEditLabel(text,SwingConstants.LEFT){ protected void doAfterMousePress(){ clearAllBackground(); @@ -40,19 +45,19 @@ public abstract class TinyFormulaWithButtonPane extends JPanel implements UIObse return false; } }; - editLabel.setPreferredSize(new Dimension(80,20)); tinyFormulaPane = new DefaultTinyFormulaPane(); - UIButton button = new UIButton(IOUtils.readIcon(iconUrl)); - button.setPreferredSize(new Dimension(20, 20)); + UIButton button = new UIButton(icon); button.addActionListener(initButtonListener(this)); + this.setLayout(new BorderLayout()); + this.add(row( + cell(editLabel).weight(1.2), cell(tinyFormulaPane).weight(2.4), flex(0.1), cell(button).weight(0.5) + ).getComponent()); + } - this.setLayout(new BorderLayout(4, 0)); - - this.add(editLabel, BorderLayout.WEST); - this.add(tinyFormulaPane, BorderLayout.CENTER); - this.add(button, BorderLayout.EAST); + public TinyFormulaWithButtonPane(String text, String iconUrl) { + this(text, IconUtils.readIcon(iconUrl)); } private ActionListener initButtonListener(final TinyFormulaWithButtonPane pane){ diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/link/GanttLinkReportDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/link/GanttLinkReportDataContentPane.java index 1d1c602218..95482caf2f 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/link/GanttLinkReportDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/link/GanttLinkReportDataContentPane.java @@ -1,21 +1,21 @@ package com.fr.van.chart.gantt.designer.data.link; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.chartattr.ChartCollection; import com.fr.design.formula.DefaultTinyFormulaPane; import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; import com.fr.plugin.chart.gantt.data.VanGanttLinkReportDefinition; import com.fr.van.chart.gantt.designer.data.data.GanttDataPaneHelper; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; + +import static com.fine.swing.ui.layout.Layouts.*; +import static com.fine.swing.ui.layout.Layouts.cell; /** * Created by hufan on 2017/1/12. @@ -29,7 +29,6 @@ public class GanttLinkReportDataContentPane extends AbstractReportDataContentPan this.setLayout(new BorderLayout()); initAllComponent(); JPanel panel = getContentPane(); - panel.setBorder(BorderFactory.createEmptyBorder(0,24,0,15)); this.add(panel, BorderLayout.CENTER); } private void initAllComponent() { @@ -44,32 +43,23 @@ public class GanttLinkReportDataContentPane extends AbstractReportDataContentPan return new DefaultTinyFormulaPane() { @Override protected void initLayout() { - this.setLayout(new BorderLayout(4, 0)); - - UILabel label = new UILabel(title ); - label.setPreferredSize(new Dimension(75, 20)); - this.add(label, BorderLayout.WEST); - - formulaTextField.setPreferredSize(new Dimension(100, 20)); - this.add(formulaTextField, BorderLayout.CENTER); - this.add(formulaTextFieldButton, BorderLayout.EAST); + this.setLayout(new BorderLayout()); + UILabel label = new UILabel(title); + this.add(row( + cell(label).weight(1.2), cell(formulaTextField).weight(2.4), flex(0.1), cell(formulaTextFieldButton).weight(0.5) + ).getComponent()); } }; } private JPanel getContentPane(){ - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] row = {p,p,p}; - double[] col = {f}; - Component[][] components = new Component[][]{ new Component[]{startTaskID}, new Component[]{endTaskID}, new Component[]{linkType} }; - return TableLayoutHelper.createTableLayoutPane(components, row, col); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1}); } @Override diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/link/GanttLinkTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/link/GanttLinkTableDataContentPane.java index 427c5906d2..7ba594907b 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/link/GanttLinkTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/data/link/GanttLinkTableDataContentPane.java @@ -1,22 +1,19 @@ package com.fr.van.chart.gantt.designer.data.link; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartdata.TopDefinition; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; import com.fr.plugin.chart.gantt.data.VanGanttLinkTableDefinition; import com.fr.stable.StringUtils; import com.fr.van.chart.gantt.designer.data.data.GanttDataPaneHelper; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; import java.util.List; /** @@ -31,9 +28,7 @@ public class GanttLinkTableDataContentPane extends AbstractTableDataContentPane this.setLayout(new BorderLayout()); initAllComponent(); JPanel panel = getContentPane(); - panel.setBorder(BorderFactory.createEmptyBorder(0,24,0,15)); this.add(panel, BorderLayout.CENTER); - this.setPreferredSize(new Dimension(246,(int)this.getPreferredSize().getHeight())); } @@ -47,18 +42,13 @@ public class GanttLinkTableDataContentPane extends AbstractTableDataContentPane } private JPanel getContentPane(){ - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] row = {p,p,p}; - double[] col = {p,f}; - Component[][] components = new Component[][]{ new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Start_Task_ID")), startTaskIDComboBox}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_End_Task_ID")), endTaskIDComboBox}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Link_Type")), linkTypeComboBox} }; - return TableLayoutHelper.createGapTableLayoutPane(components, row, col,24,6); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } @Override diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/axis/GanttAxisStylePane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/axis/GanttAxisStylePane.java index fe0d2d6771..ca01053e85 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/axis/GanttAxisStylePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/axis/GanttAxisStylePane.java @@ -1,16 +1,14 @@ package com.fr.van.chart.gantt.designer.style.axis; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.frpane.UINumberDragPane; import com.fr.design.gui.frpane.UINumberDragPaneWithPercent; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ColorSelectBoxWithOutTransparent; import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; import com.fr.plugin.chart.gantt.attr.GanttAxisStyleAttr; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.JPanel; import java.awt.BorderLayout; @@ -39,15 +37,9 @@ public class GanttAxisStylePane extends BasicBeanPane { public GanttAxisStylePane() { initComponents(); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] row = {p, p, p, p}; - double[] col = {f, e}; - Component[][] components = getUsedComponents(); - JPanel content = TableLayoutHelper.createTableLayoutPane(components, row, col); + JPanel content = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); this.setLayout(new BorderLayout()); this.add(content, BorderLayout.CENTER); diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/axis/GanttAxisStylePaneWithPosition.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/axis/GanttAxisStylePaneWithPosition.java index 102b0c2321..7b920d7652 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/axis/GanttAxisStylePaneWithPosition.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/axis/GanttAxisStylePaneWithPosition.java @@ -1,14 +1,12 @@ package com.fr.van.chart.gantt.designer.style.axis; -import com.fr.base.BaseUtils; +import com.fine.theme.utils.FineComponentsFactory; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.plugin.chart.gantt.attr.GanttAxisStyleAttr; import com.fr.plugin.chart.gantt.attr.GanttAxisStyleAttrWithPosition; -import com.fr.stable.Constants; -import javax.swing.Icon; import java.awt.Component; /** @@ -22,11 +20,7 @@ public class GanttAxisStylePaneWithPosition extends GanttAxisStylePane { protected void initComponents() { super.initComponents(); - Icon[] alignmentIconArray = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"), - BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"), - BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png")}; - Integer[] alignment = new Integer[]{Constants.LEFT, Constants.CENTER, Constants.RIGHT}; - alignmentPane = new UIButtonGroup<>(alignmentIconArray, alignment); + alignmentPane = FineComponentsFactory.createHorizontalAlignmentButtonGroup(); } protected Component[][] getUsedComponents() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/axis/GanttProcessAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/axis/GanttProcessAxisPane.java index c2461899b5..cc37b54440 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/axis/GanttProcessAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/axis/GanttProcessAxisPane.java @@ -1,17 +1,16 @@ package com.fr.van.chart.gantt.designer.style.axis; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Plot; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.plugin.chart.gantt.VanChartGanttPlot; import com.fr.plugin.chart.gantt.attr.GanttProcessAxis; import com.fr.plugin.chart.vanchart.VanChart; import com.fr.van.chart.designer.AbstractVanChartScrollPane; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; @@ -32,20 +31,12 @@ public class GanttProcessAxisPane extends AbstractVanChartScrollPane { @Override protected JPanel createContentPane() { - - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] row = {p,p,p,p,p,p,p}; - double[] col = {f}; - - Component[][] components = new Component[][]{ - new Component[]{createHorizontalProportionPane()}, - new Component[]{createHorizontalHeaderPane()}, - new Component[]{createVerticalHeaderPane()}, - new Component[]{createBodyPane()} - }; - - return TableLayoutHelper.createTableLayoutPane(components, row, col); + return FineLayoutBuilder.createVerticalLayout(0, + createHorizontalProportionPane(), + createHorizontalHeaderPane(), + createVerticalHeaderPane(), + createBodyPane() + ); } protected void layoutContentPane() { @@ -56,19 +47,19 @@ public class GanttProcessAxisPane extends AbstractVanChartScrollPane { private Component createBodyPane() { bodyPane = new GanttAxisStylePaneWithPosition(); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Content"), bodyPane); + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Content"), bodyPane); } private Component createHorizontalHeaderPane() { horizontalHeaderPane = new GanttAxisStylePane(); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Horizontal_Table"), horizontalHeaderPane); + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Horizontal_Table"), horizontalHeaderPane, true); } private Component createVerticalHeaderPane() { verticalHeaderPane = new GanttAxisStylePaneWithPosition(); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Vertical_Table"), verticalHeaderPane); + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Vertical_Table"), verticalHeaderPane, true); } private Component createHorizontalProportionPane() { @@ -91,9 +82,10 @@ public class GanttProcessAxisPane extends AbstractVanChartScrollPane { } }); - JPanel jPanel = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Horizontal_Proportion"), panel); + JPanel jPanel = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Horizontal_Proportion")), panel); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_Function_Percent"), jPanel); + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_Function_Percent"), jPanel, true); } private void checkoutPaneVisible() { @@ -119,7 +111,7 @@ public class GanttProcessAxisPane extends AbstractVanChartScrollPane { @Override public void updateBean(VanChart vanChart){ - VanChartGanttPlot ganttPlot = (VanChartGanttPlot) vanChart.getPlot(); + VanChartGanttPlot ganttPlot = vanChart.getPlot(); GanttProcessAxis processAxis = new GanttProcessAxis(); processAxis.setCustomProportion(typeButton.getSelectedIndex() == 1); diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/axis/GanttTimeAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/axis/GanttTimeAxisPane.java index 2f65faeccc..bb40c4902d 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/axis/GanttTimeAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/axis/GanttTimeAxisPane.java @@ -1,17 +1,16 @@ package com.fr.van.chart.gantt.designer.style.axis; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.plugin.chart.gantt.VanChartGanttPlot; import com.fr.plugin.chart.gantt.attr.GanttTimeAxis; import com.fr.plugin.chart.type.ZoomLevel; import com.fr.plugin.chart.vanchart.VanChart; import com.fr.van.chart.designer.AbstractVanChartScrollPane; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.JPanel; import java.awt.Component; @@ -35,10 +34,6 @@ public class GanttTimeAxisPane extends AbstractVanChartScrollPane { @Override protected JPanel createContentPane() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] row = {p,p,p,p,p}; - double[] col = {f}; Component[][] components = new Component[][]{ new Component[]{createConditionConfigPane()}, @@ -46,7 +41,7 @@ public class GanttTimeAxisPane extends AbstractVanChartScrollPane { new Component[]{createDownHeadPane()}, }; - return TableLayoutHelper.createTableLayoutPane(components, row, col); + return FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1}); } protected void layoutContentPane() { @@ -57,13 +52,13 @@ public class GanttTimeAxisPane extends AbstractVanChartScrollPane { private Component createDownHeadPane() { downHeadPane = new GanttAxisStylePane(); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Down_Head_Table"),downHeadPane); + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Down_Head_Table"),downHeadPane); } private Component createUpHeadPane() { upHeadPane = new GanttAxisStylePane(); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Up_Head_Table"),upHeadPane); + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Up_Head_Table"),upHeadPane, true); } private Component createConditionConfigPane() { @@ -71,12 +66,6 @@ public class GanttTimeAxisPane extends AbstractVanChartScrollPane { initialLevel = new UIComboBox(ZOOM_LEVELS); weekendTooltip = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Open"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Close")}); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] row = {p, p, p, p}; - double[] col = {f, e}; - Component[][] components = new Component[][]{ new Component[]{null, null}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Time_Zoom")), timeZoom}, @@ -84,9 +73,9 @@ public class GanttTimeAxisPane extends AbstractVanChartScrollPane { new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Weekend_Tooltip")), weekendTooltip} }; - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Condition_Config"),panel); + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Condition_Config"),panel, true); } @Override diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartGanttSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartGanttSeriesPane.java index a62f054e7f..380047194b 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartGanttSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartGanttSeriesPane.java @@ -1,19 +1,18 @@ package com.fr.van.chart.gantt.designer.style.series; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.icombobox.LineComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.ColorSelectBoxWithOutTransparent; import com.fr.plugin.chart.base.VanChartAttrMarker; import com.fr.plugin.chart.gantt.VanChartGanttPlot; import com.fr.stable.CoreConstants; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.VanChartBeautyPane; import com.fr.van.chart.designer.component.VanChartGanttTimeLinePane; import com.fr.van.chart.designer.component.VanChartMarkerPane; @@ -40,49 +39,33 @@ public class VanChartGanttSeriesPane extends VanChartAbstractPlotSeriesPane { @Override protected JPanel getContentInPlotType() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] row = {p,p,p,p,p}; - double[] col = {f}; - - Component[][] components = new Component[][]{ - new Component[]{createGanntStylePane()}, - new Component[]{createLinkLinePane()}, - new Component[]{createMarkerPane()}, - new Component[]{createLargeDataModelPane()}, - new Component[]{createGuideLinePane()} - }; - - contentPane = TableLayoutHelper.createTableLayoutPane(components, row, col); + contentPane = FineLayoutBuilder.createVerticalLayout(0, + createGanntStylePane(), + createLinkLinePane(), + createLargeDataModelPane(), + createGuideLinePane() + ); return contentPane; } private JPanel createGanntStylePane(){ seriesNewLine = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Open"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Close")}); - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Series_New_Line"),seriesNewLine); - JPanel ganntStylePane = TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Pattern"), panel); - return ganntStylePane; + JPanel panel = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Series_New_Line")), seriesNewLine); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Pattern"), panel, true); } private JPanel createLinkLinePane(){ lineWidth = new LineComboBox(CoreConstants.STRIKE_LINE_STYLE_ARRAY_4_CHART); colorSelect = new ColorSelectBoxWithOutTransparent(100); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] col = {f, e}; - double[] row = {p,p,p}; - Component[][] components = new Component[][]{ - new Component[]{null, null}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Line_Style")), lineWidth}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Color")), colorSelect} }; - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); - JPanel linkLinePane = TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Link_Line"), panel); - return linkLinePane; + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, components,new double[]{1.2, 3}); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Link_Line"), panel, true); } //标记点类型 @@ -98,12 +81,12 @@ public class VanChartGanttSeriesPane extends VanChartAbstractPlotSeriesPane { return new VanChartImageMarkerWithoutWidthAndHeightPane(); } }; - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Gannt_Marker"), markerPane); + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Gannt_Marker"), markerPane, true); } protected JPanel createGuideLinePane() { timeLinePane = new VanChartGanttTimeLinePane(); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Guide_Line_Identify"), timeLinePane); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Guide_Line_Identify"), timeLinePane); } @Override diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/GeoUrlPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/GeoUrlPane.java index c69297fa86..23c8580495 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/GeoUrlPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/GeoUrlPane.java @@ -1,8 +1,9 @@ package com.fr.van.chart.map.designer.type; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.Parameter; import com.fr.decision.webservice.v10.map.geojson.helper.GEOJSONHelper; -import com.fr.design.constants.LayoutConstants; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; import com.fr.design.file.HistoryTemplateListCache; @@ -11,18 +12,14 @@ import com.fr.design.gui.icombobox.FRTreeComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.JTemplate; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; -import com.fr.general.IOUtils; import com.fr.plugin.chart.map.VanChartMapPlot; import com.fr.plugin.chart.map.designer.type.GEOJSONTreeHelper; import com.fr.plugin.chart.map.server.ChartGEOJSONHelper; import com.fr.plugin.chart.map.server.CompatibleGEOJSONHelper; import com.fr.plugin.chart.type.MapType; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.drillmap.designer.data.comp.MapDataTree; import com.fr.workspace.WorkContext; @@ -123,7 +120,7 @@ public class GeoUrlPane extends JPanel implements UIObserver { boolean hasRefreshButton = !WorkContext.getCurrent().isLocal(); - UIButton button = new UIButton(IOUtils.readIcon("/com/fr/design/images/control/refresh.png")); + UIButton button = new UIButton(new LazyIcon("refresh")); button.setToolTipText(Toolkit.i18nText("Fine-Design_Chart_Update_Remote_Map_JSON")); button.addActionListener(new ActionListener() { @Override @@ -133,23 +130,17 @@ public class GeoUrlPane extends JPanel implements UIObserver { } }); - double p = TableLayout.PREFERRED; - double d = TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double f = TableLayout.FILL; - double[] rowSize = {p, p}; - double[] columnSize = hasRefreshButton ? new double[]{d + 10, e - 20, 20} : new double[]{f, e}; - Component[] comps = hasRefreshButton ? new Component[]{sourceTitleLabel, sourceComboBox, button} : new Component[]{sourceTitleLabel, sourceComboBox}; - double hGap = hasRefreshButton ? 0 : TableLayout4VanChartHelper.COMPONENT_INTERVAL; + double[] weight = hasRefreshButton ? new double[]{1.2, 2.5, 0.5} : new double[]{1.2, 3}; + Component[][] components = new Component[][]{ new Component[]{null, null}, comps, }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, hGap, LayoutConstants.VGAP_LARGE); + return FineLayoutBuilder.compatibleTableLayout(0, components, weight); } protected UILabel createSourceTitleLabel() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/GisLayerPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/GisLayerPane.java index 37f178e196..17634d1406 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/GisLayerPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/GisLayerPane.java @@ -1,5 +1,6 @@ package com.fr.van.chart.map.designer.type; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.Utils; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; @@ -8,8 +9,6 @@ import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.chart.mode.ChartEditContext; import com.fr.general.ComparatorUtils; @@ -20,9 +19,7 @@ import com.fr.plugin.chart.map.server.MapLayerConfigManager; import com.fr.plugin.chart.type.GISLayerType; import com.fr.plugin.chart.type.GaoDeGisType; import com.fr.plugin.chart.type.ZoomLevel; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; -import javax.swing.BorderFactory; import javax.swing.DefaultComboBoxModel; import javax.swing.JPanel; import javax.swing.event.PopupMenuEvent; @@ -123,22 +120,12 @@ public class GisLayerPane extends JPanel implements UIObserver { layerPaneCheckPane.add(standardLayers, "standard"); layerPaneCheckPane.add(customLayers, "custom"); - - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] row = {p, p, p}; - double[] col = {f, e}; - Component[][] components = new Component[][]{ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Gis_Layer")), gisButton}, new Component[]{null, layerPaneCheckPane}, new Component[]{layerCardPane, null}, }; - - JPanel panel = TableLayoutHelper.createTableLayoutPane(components, row, col); - panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); - return panel; + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } private void initLayerCardPane() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/MapStatusPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/MapStatusPane.java index 668a9b7745..9bcb197e3d 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/MapStatusPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/MapStatusPane.java @@ -1,18 +1,17 @@ package com.fr.van.chart.map.designer.type; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; import com.fr.plugin.chart.base.ViewCenter; import com.fr.plugin.chart.map.VanChartMapPlot; import com.fr.plugin.chart.type.ZoomLevel; import com.fr.stable.ArrayUtils; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; @@ -76,30 +75,22 @@ public class MapStatusPane extends JPanel { longitude = new UISpinner(-Double.MAX_VALUE, Double.MAX_VALUE, 1, 0.0); latitude = new UISpinner(-Double.MAX_VALUE, Double.MAX_VALUE, 1, 0.0); - double p = TableLayout.PREFERRED; - double d = TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double s = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; - double[] rowSize = {p, p, p}; - double[] columnSize = {d, e}; - double[] column = {d, s}; Component[][] comps = new Component[][]{ new Component[]{null, null}, new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Zoom_Layer")), zoomLevel}, new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_View_Center")), viewCenterCom}, }; - levelAndCenterPane = TableLayout4VanChartHelper.createGapTableLayoutPane(comps, rowSize, columnSize); + levelAndCenterPane = FineLayoutBuilder.compatibleTableLayout(10, comps, new double[]{1.2, 3}); Component[][] longAndLatComps = new Component[][]{ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Longitude")), longitude}, new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Latitude")), latitude} }; - longAndLatPane = TableLayout4VanChartHelper.createGapTableLayoutPane(longAndLatComps, rowSize, column); - longAndLatPane.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0)); + longAndLatPane = FineLayoutBuilder.compatibleTableLayout(10, longAndLatComps, new double[]{1.2, 3}); longAndLatPane.setVisible(false); - this.setLayout(new BorderLayout(0, 6)); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); this.add(levelAndCenterPane, BorderLayout.NORTH); this.add(longAndLatPane, BorderLayout.CENTER); diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/TileLayerPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/TileLayerPane.java index 4101fbd9d5..25e4316df0 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/TileLayerPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/TileLayerPane.java @@ -1,10 +1,9 @@ package com.fr.van.chart.map.designer.type; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextarea.UITextArea; -import com.fr.design.layout.TableLayout; import com.fr.plugin.chart.base.GisLayer; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.JPanel; import java.awt.BorderLayout; @@ -22,18 +21,13 @@ public class TileLayerPane extends JPanel { public TileLayerPane() { - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p}; - double[] COLUMN_SIZE = {TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH, TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH - 3}; - customTileLayer = new UITextArea(); attribution = new UITextArea(); Component[][] comps = new Component[][]{ new Component[]{new UILabel("url"), customTileLayer}, new Component[]{new UILabel("Attribution"), attribution} }; - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(comps, rowSize, COLUMN_SIZE); - panel.setBorder(TableLayout4VanChartHelper.SECOND_EDIT_AREA_BORDER); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, comps, new double[]{1.2, 3}); this.setLayout(new BorderLayout()); this.add(panel, BorderLayout.CENTER); 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 5be437619c..43ef07ca67 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 @@ -1,15 +1,14 @@ package com.fr.van.chart.map.designer.type; +import com.fine.theme.utils.FineLayoutBuilder; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.plugin.chart.map.VanChartMapPlot; import com.fr.plugin.chart.map.server.CompatibleGEOJSONHelper; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; @@ -33,26 +32,18 @@ public class VanChartMapSourceChoosePane extends JPanel implements UIObserver { initGisLayerPane(); this.setLayout(new BorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(10, 5, 0, 0)); - double p = TableLayout.PREFERRED; - double[] columnSize = {230}; - double[] rowSize = {p, p, p, p, p, p, p, p}; + JPanel panel = FineLayoutBuilder.createVerticalLayout(10, geoUrlPane, gisLayerPane); - JPanel panel = new JPanel(new BorderLayout()); + JPanel basePane = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Basic"), panel, true); - panel.add(geoUrlPane, BorderLayout.NORTH); - panel.add(gisLayerPane, BorderLayout.CENTER); - - JPanel basePane = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Report_Basic"), panel); - - JPanel mapStatusPaneWithTitle = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Map_Init_Status"), mapStatusPane); + JPanel mapStatusPaneWithTitle = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Map_Init_Status"), mapStatusPane); Component[][] comps = new Component[][]{ new Component[]{basePane}, new Component[]{mapStatusPaneWithTitle} }; - JPanel contentPane = TableLayoutHelper.createTableLayoutPane(comps, rowSize, columnSize); - + JPanel contentPane = FineLayoutBuilder.compatibleTableLayout(0, comps, new double[]{1}); + this.setBorder(new ScaledEmptyBorder(0, 0, 0, 10)); this.add(contentPane, BorderLayout.CENTER); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotReportDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotReportDataContentPane.java index cace219db2..0e5b100530 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotReportDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotReportDataContentPane.java @@ -1,5 +1,7 @@ package com.fr.van.chart.multilayer.data; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.chartattr.ChartCollection; import com.fr.design.event.UIObserver; @@ -9,19 +11,15 @@ import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; import com.fr.plugin.chart.multilayer.data.MultiPieReportDataDefinition; import com.fr.stable.AssistUtils; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.JSeparator; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; import java.util.ArrayList; import java.util.List; @@ -57,19 +55,13 @@ public class MultiPiePlotReportDataContentPane extends AbstractReportDataContent contentPane = new JPanel(); - contentPane.setLayout(new BorderLayout(0, 5)); + contentPane.setLayout(new BorderLayout(0, FineUIScale.scale(10))); contentPane.add(north, BorderLayout.NORTH); contentPane.add(center, BorderLayout.CENTER); - contentPane.setBorder(BorderFactory.createEmptyBorder(0,20,4,10)); } private JPanel createNorthPane() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize_north = {f, COMPONENT_WIDTH}; - double[] rowSize_north = {p, p, p}; - levelNumEdit = new UISpinner(1, 15, 1, levelNum){ @Override protected void fireStateChanged() { @@ -90,7 +82,6 @@ public class MultiPiePlotReportDataContentPane extends AbstractReportDataContent }; nameField = new UITextField(); - nameField.setPreferredSize(new Dimension(WD, HT)); Component[][] components_north = new Component[][]{ new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name")), nameField}, @@ -98,7 +89,7 @@ public class MultiPiePlotReportDataContentPane extends AbstractReportDataContent new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Level_Number")), levelNumEdit}, }; - return TableLayoutHelper.createTableLayoutPane(components_north, rowSize_north, columnSize_north); + return FineLayoutBuilder.compatibleTableLayout(10, components_north, new double[]{1.2, 3}); } private void refreshCenterPane(){ @@ -119,16 +110,7 @@ public class MultiPiePlotReportDataContentPane extends AbstractReportDataContent } private JPanel createCenterPane() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize_center = {f, COMPONENT_WIDTH}; - double[] rowSize_center = new double[levelNum + 2]; - initLevelNameList(); - - for (int i = 0; i < levelNum + 2; i++){ - rowSize_center[i] = p; - } Component[][] components_center = new Component[levelNum + 2][]; for (int i = 0; i < levelNum; i++){ @@ -142,7 +124,7 @@ public class MultiPiePlotReportDataContentPane extends AbstractReportDataContent registerListener4Center(); - return TableLayoutHelper.createTableLayoutPane(components_center,rowSize_center,columnSize_center); + return FineLayoutBuilder.compatibleTableLayout(10, components_center,new double[]{1.2, 3}); } /** diff --git a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/data/StructurePlotReportDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/data/StructurePlotReportDataContentPane.java index 11f94ef87b..d01241c60b 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/data/StructurePlotReportDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/data/StructurePlotReportDataContentPane.java @@ -1,5 +1,6 @@ package com.fr.van.chart.structure.desinger.data; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.chartattr.ChartCollection; import com.fr.design.formula.DefaultTinyFormulaPane; @@ -7,12 +8,9 @@ import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; import com.fr.plugin.chart.structure.data.StructureReportDefinition; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; @@ -29,10 +27,6 @@ public class StructurePlotReportDataContentPane extends AbstractReportDataConten private TinyFormulaPane nodeValue; public StructurePlotReportDataContentPane() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, f}; - double[] rowSize = {p, p, p, p, p}; nodeName = new DefaultTinyFormulaPane(); nodeID = new DefaultTinyFormulaPane(); @@ -48,8 +42,7 @@ public class StructurePlotReportDataContentPane extends AbstractReportDataConten new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Series_Value")), nodeValue}, }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components,rowSize,columnSize,24,6); - panel.setBorder(BorderFactory.createEmptyBorder(0,24,0,15)); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, components,new double[]{1.2,3}); this.setLayout(new BorderLayout()); this.add(panel, BorderLayout.CENTER); diff --git a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/data/StructurePlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/data/StructurePlotTableDataContentPane.java index f91f6641eb..6ca5cdce50 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/data/StructurePlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/data/StructurePlotTableDataContentPane.java @@ -1,5 +1,6 @@ package com.fr.van.chart.structure.desinger.data; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.chartattr.ChartCollection; import com.fr.data.util.function.AbstractDataFunction; @@ -7,18 +8,14 @@ import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; import com.fr.plugin.chart.structure.data.StructureTableDefinition; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.util.List; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; /** * Created by shine on 2017/2/15. @@ -32,11 +29,6 @@ public class StructurePlotTableDataContentPane extends AbstractTableDataContentP private CalculateComboBox calculateCombox; public StructurePlotTableDataContentPane() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f, COMPONENT_WIDTH}; - double[] rowSize = {p, p, p, p, p, p}; - nodeName = new UIComboBox(); nodeId = new UIComboBox(); parenrId = new UIComboBox(); @@ -53,11 +45,9 @@ public class StructurePlotTableDataContentPane extends AbstractTableDataContentP new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Summary_Method")), calculateCombox} }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components,rowSize,columnSize,24,6); - panel.setBorder(BorderFactory.createEmptyBorder(0,24,0,15)); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, components,new double[]{1.2, 3}); this.setLayout(new BorderLayout()); this.add(panel, BorderLayout.CENTER); - this.setPreferredSize(new Dimension(246,(int)this.getPreferredSize().getHeight())); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/data/WordCloudPlotReportDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/data/WordCloudPlotReportDataContentPane.java index d924004881..749d0e3db1 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/data/WordCloudPlotReportDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/data/WordCloudPlotReportDataContentPane.java @@ -1,17 +1,15 @@ package com.fr.van.chart.wordcloud.designer.data; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.chartattr.ChartCollection; import com.fr.design.formula.DefaultTinyFormulaPane; import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; import com.fr.plugin.chart.wordcloud.data.WordCloudReportDefinition; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; @@ -26,10 +24,6 @@ public class WordCloudPlotReportDataContentPane extends AbstractReportDataConten private TinyFormulaPane wordValue; public WordCloudPlotReportDataContentPane() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f, COMPONENT_WIDTH}; - double[] rowSize = { p, p, p}; name = new UITextField(); wordName = new DefaultTinyFormulaPane(); @@ -41,9 +35,7 @@ public class WordCloudPlotReportDataContentPane extends AbstractReportDataConten new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Word_Value")), wordValue} }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components,rowSize,columnSize,24,6); - panel.setBorder(BorderFactory.createEmptyBorder(0,24,0,15)); - + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, components,new double[]{1.2, 3}); this.setLayout(new BorderLayout()); this.add(panel, BorderLayout.CENTER); diff --git a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/data/WordCloudPlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/data/WordCloudPlotTableDataContentPane.java index e7f5f2af08..6cd4f59b84 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/data/WordCloudPlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/data/WordCloudPlotTableDataContentPane.java @@ -1,23 +1,20 @@ package com.fr.van.chart.wordcloud.designer.data; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.chartattr.ChartCollection; import com.fr.data.util.function.AbstractDataFunction; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.layout.TableLayout; import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; import com.fr.plugin.chart.wordcloud.data.WordCloudTableDefinition; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; import java.util.List; /** @@ -31,10 +28,6 @@ public class WordCloudPlotTableDataContentPane extends AbstractTableDataContentP private CalculateComboBox calculateCombox; public WordCloudPlotTableDataContentPane() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f, COMPONENT_WIDTH}; - double[] rowSize = { p, p, p, p}; name = new UITextField(); wordName = new UIComboBox(); @@ -49,12 +42,10 @@ public class WordCloudPlotTableDataContentPane extends AbstractTableDataContentP new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Summary_Method")), calculateCombox} }; - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components,rowSize,columnSize); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, components,new double[]{1.2, 3}); this.setLayout(new BorderLayout()); - panel.setBorder(BorderFactory.createEmptyBorder(0,24,0,15)); this.add(panel, BorderLayout.CENTER); - this.setPreferredSize(new Dimension(246,(int)this.getPreferredSize().getHeight())); } diff --git a/designer-realize/src/main/java/com/fr/design/cell/editor/DSColumnCellEditor.java b/designer-realize/src/main/java/com/fr/design/cell/editor/DSColumnCellEditor.java index 97efbda442..2e622b6b08 100644 --- a/designer-realize/src/main/java/com/fr/design/cell/editor/DSColumnCellEditor.java +++ b/designer-realize/src/main/java/com/fr/design/cell/editor/DSColumnCellEditor.java @@ -13,7 +13,6 @@ import com.fr.report.core.SheetUtils; import com.fr.report.elementcase.TemplateElementCase; import com.fr.report.poly.PolyECBlock; import com.fr.report.worksheet.WorkSheet; -import com.fr.stable.ProductConstants; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; @@ -66,7 +65,6 @@ public class DSColumnCellEditor extends AbstractCellEditor implements DialogActi dsColumnPane.putElementcase(grid.getElementCasePane()); dsColumnPane.putCellElement(cellElement); BasicDialog dsColumnDialog = this.dsColumnPane.showWindowWithCustomSize(SwingUtilities.getWindowAncestor(grid), null, DSColumnPane.DEFAULT_DIMENSION); - dsColumnDialog.addDialogActionListener(this); try { diff --git a/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java b/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java index 0a5a93602d..9d2b1883ca 100644 --- a/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java +++ b/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java @@ -3,25 +3,23 @@ */ package com.fr.design.cell.editor; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseFormula; -import com.fr.base.BaseUtils; import com.fr.base.FRContext; -import com.fr.base.Utils; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.form.util.FontTransformUtil; import com.fr.design.formula.FormulaFactory; import com.fr.design.formula.UIFormula; import com.fr.design.fun.DefaultValueAdjustProvider; -import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.gui.style.FRFontPane; import com.fr.design.mainframe.DesignerContext; import com.fr.design.report.RichTextEditingPane; import com.fr.design.style.color.UIToolbarColorButton; import com.fr.design.utils.DesignUtils; -import com.fr.design.utils.DesignUtils; import com.fr.general.FRFont; import com.fr.log.FineLoggerFactory; import com.fr.report.cell.cellattr.core.RichTextConverter; @@ -43,9 +41,8 @@ import javax.swing.text.MutableAttributeSet; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; +import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; @@ -54,6 +51,9 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + /** * * @@ -61,8 +61,6 @@ import java.awt.event.MouseListener; */ public class RichTextToolBar extends BasicPane { - private static final Dimension BUTTON_SIZE = new Dimension(24, 20); - /** * 富文本字体下拉框默认首选字体 非设计器UI界面字体 */ @@ -78,6 +76,7 @@ public class RichTextToolBar extends BasicPane { private UIToggleButton superPane; private UIToggleButton subPane; private UIToggleButton formulaPane; + private UIToolbar toolbar; //外部传进来的 private RichTextEditingPane textPane; @@ -105,58 +104,44 @@ public class RichTextToolBar extends BasicPane { } private void initAllButton() { + toolbar = new UIToolbar(); fontNameComboBox = new UIComboBox(DesignUtils.getAvailableFontFamilyNames4Report()); - fontNameComboBox.setPreferredSize(new Dimension(144, 20)); fontSizeComboBox = new UIComboBox(FRFontPane.getFontSizes()); - colorSelectPane = new UIToolbarColorButton(BaseUtils.readIcon("/com/fr/design/images/gui/color/foreground.png")); + colorSelectPane = new UIToolbarColorButton(new LazyIcon("foreground")); colorSelectPane.set4Toolbar(); - bold = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold.png")); - italic = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic.png")); - underline = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/underline.png")); - superPane = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/sup.png")); - subPane = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/sub.png")); - formulaPane = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_insert/formula.png")); + bold = new UIToggleButton(new LazyIcon("bold")); + italic = new UIToggleButton(new LazyIcon("italic")); + underline = new UIToggleButton(new LazyIcon("underline")); + superPane = new UIToggleButton(new LazyIcon("super")); + subPane = new UIToggleButton(new LazyIcon("sub")); + formulaPane = new UIToggleButton(new LazyIcon("formula")); //名字 initAllNames(); //悬浮提示 setToolTips(); - //样式 - setAllButtonStyle(); + //设置ToolBar + addIntoToolBar(); //绑定监听器 bindListener(); } - private void setAllButtonStyle() { - setButtonStyle(bold); - setButtonStyle(italic); - setButtonStyle(underline); - setButtonStyle(subPane); - setButtonStyle(superPane); - setButtonStyle(formulaPane); + private void addIntoToolBar() { + toolbar.add(bold); + toolbar.add(italic); + toolbar.add(underline); + toolbar.add(subPane); + toolbar.add(superPane); + toolbar.add(formulaPane); } - private void setButtonStyle(UIButton button) { - button.setNormalPainted(false); - button.setBackground(null); - button.setOpaque(false); - button.setPreferredSize(BUTTON_SIZE); - button.setBorderPaintedOnlyWhenPressed(true); - } private void addToToolBar() { - this.setLayout(new FlowLayout(FlowLayout.LEFT)); - - this.add(fontNameComboBox); - this.add(fontSizeComboBox); - this.add(bold); - this.add(italic); - this.add(underline); - this.add(colorSelectPane); - this.add(superPane); - this.add(subPane); - this.add(formulaPane); + this.setLayout(new BorderLayout()); + this.add(row(10, + cell(fontNameComboBox).weight(0.3),cell(fontSizeComboBox).weight(0.1), cell(toolbar).weight(0.6) + ).getComponent()); } private void bindListener() { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/QuickEditorRegion.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/QuickEditorRegion.java index 6291c5ddfc..3f546b628c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/QuickEditorRegion.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/QuickEditorRegion.java @@ -33,7 +33,6 @@ public class QuickEditorRegion extends JPanel { if (EMPTY == null) { EMPTY = new JPanel(new BorderLayout()); UILabel content = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_None_Message_Property_Table") + "!"); - content.setBorder(BorderFactory.createEmptyBorder(0, 70, 0, 0)); EMPTY.add(content, BorderLayout.CENTER); } return EMPTY; diff --git a/designer-realize/src/main/java/com/fr/design/report/RichTextPane.java b/designer-realize/src/main/java/com/fr/design/report/RichTextPane.java index 26acc77513..94bb7322f0 100644 --- a/designer-realize/src/main/java/com/fr/design/report/RichTextPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/RichTextPane.java @@ -1,11 +1,11 @@ package com.fr.design.report; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatRoundBorder; import com.fr.base.BaseFormula; import com.fr.base.Style; import com.fr.design.cell.editor.RichTextToolBar; import com.fr.design.dialog.BasicPane; -import com.fr.design.gui.icontainer.UIScrollPane; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.DesignUtils; import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; @@ -20,7 +20,6 @@ import com.fr.stable.Constants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; -import javax.swing.JPanel; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultStyledDocument; @@ -33,6 +32,9 @@ import java.awt.Font; import java.math.BigDecimal; import java.util.Iterator; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; + public class RichTextPane extends BasicPane { //12号字体有个奇怪的bug, 字体下部分渲染会截断一部分, 换其他字体没问题, 字体改大小也没问题. @@ -48,17 +50,13 @@ public class RichTextPane extends BasicPane { } protected void initComponents() { - this.setLayout(FRGUIPaneFactory.createM_BorderLayout()); - JPanel northPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + this.setLayout(new BorderLayout()); textPane = new RichTextEditingPane(); + textPane.setBorder(new FlatRoundBorder()); + textPane.setBackground(FineUIUtils.getUIColor("background.normal", "background")); textPane.setFont(DEFAUL_FONT); toolBar = new RichTextToolBar(textPane); - northPane.add(toolBar); - - JPanel southPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - southPane.add(new UIScrollPane(textPane)); - this.add(southPane, BorderLayout.CENTER); - this.add(northPane, BorderLayout.NORTH); + this.add(column(10, cell(toolBar), cell(textPane).weight(1)).getComponent()); } @Override diff --git a/designer-realize/src/main/java/com/fr/quickeditor/chartquick/FloatChartQuickEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/chartquick/FloatChartQuickEditor.java index 723a3aba23..9d5ce49885 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/chartquick/FloatChartQuickEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/chartquick/FloatChartQuickEditor.java @@ -1,5 +1,6 @@ package com.fr.quickeditor.chartquick; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.chart.BaseChartCollection; import com.fr.design.gui.chart.BaseChartPropertyPane; import com.fr.design.mainframe.ElementCasePane; @@ -9,13 +10,13 @@ import com.fr.grid.selection.FloatSelection; import com.fr.grid.selection.Selection; import com.fr.report.cell.Elem; -import java.awt.*; +import java.awt.BorderLayout; public class FloatChartQuickEditor extends QuickEditor { public FloatChartQuickEditor() { setLayout(new BorderLayout()); - setBorder(null); + setBorder(new ScaledEmptyBorder(0, 10, 0, 10)); } @Override From 5ad2c6b311c99247bbcfaf31c1c024557fbfe2cf Mon Sep 17 00:00:00 2001 From: "Richard.Fang" Date: Fri, 26 Jul 2024 18:50:45 +0800 Subject: [PATCH 185/302] =?UTF-8?q?REPORT-127436=E3=80=90NewUI=E3=80=91?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0?= =?UTF-8?q?-=E6=A8=A1=E6=9D=BF=E7=9B=B8=E5=85=B3/=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E9=85=8D=E7=BD=AE/=E6=95=B0=E6=8D=AE=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/utils/FineUIStyle.java | 1 + .../data/datapane/TreeTableDataDictPane.java | 99 +++--- .../connect/DatabaseConnectionPane.java | 12 +- .../data/datapane/connect/JNDIDefPane.java | 116 ++++--- .../data/datapane/preview/PreviewLabel.java | 7 +- .../tabledatapane/ClassTableDataPane.java | 58 ++-- .../tabledatapane/EmbeddedTableDataPane.java | 6 +- .../tabledatapane/FileTableDataPane.java | 313 +++++++++--------- .../FileTableDataSmallHeightPane.java | 9 +- .../tabledatapane/FileTableDataSmallPane.java | 9 +- .../tabledatapane/MultiTDTableDataPane.java | 82 +++-- .../AbstractTemplateServerSettingPane.java | 24 +- .../java/com/fr/design/dialog/BasicPane.java | 27 +- .../gui/frpane/EditingStringListPane.java | 93 ++++-- .../fr/design/gui/ilable/FRExplainLabel.java | 5 +- .../fr/design/parameter/ParameterPane.java | 42 +-- .../com/fr/design/report/WatermarkPane.java | 170 ++++++---- .../design/report/WatermarkSettingPane.java | 2 +- .../fr/design/report/fit/BaseFitAttrPane.java | 47 ++- .../design/report/fit/FormFitConfigPane.java | 25 +- .../design/report/fit/NewFitPreviewPane.java | 3 +- .../report/fit/ReportFitConfigPane.java | 51 ++- .../com/fr/design/utils/gui/GUICoreUtils.java | 11 +- .../com/fr/design/widget/IconDefinePane.java | 42 ++- .../fine/theme/icon/toolbar/clearStash.svg | 3 + .../theme/icon/toolbar/clearStash_disable.svg | 3 + .../fine/theme/icon/toolbar/customButton.svg | 10 + .../icon/toolbar/customButton_disable.svg | 10 + .../fine/theme/icon/toolbar/dataVerify.svg | 3 + .../theme/icon/toolbar/dataVerify_disable.svg | 3 + .../com/fine/theme/icon/toolbar/email.svg | 3 + .../fine/theme/icon/toolbar/email_disable.svg | 3 + .../com/fine/theme/icon/toolbar/move_up.svg | 11 +- .../theme/icon/toolbar/move_up_disable.svg | 11 +- .../fine/theme/icon/toolbar/page_first.svg | 3 + .../theme/icon/toolbar/page_first_disable.svg | 3 + .../com/fine/theme/icon/toolbar/page_last.svg | 3 + .../theme/icon/toolbar/page_last_disbale.svg | 3 + .../com/fine/theme/icon/toolbar/page_navi.svg | 3 + .../theme/icon/toolbar/page_navi_disable.svg | 3 + .../com/fine/theme/icon/toolbar/page_next.svg | 3 + .../theme/icon/toolbar/page_next_disable.svg | 3 + .../fine/theme/icon/toolbar/page_previous.svg | 3 + .../icon/toolbar/page_previous_disable.svg | 3 + .../fine/theme/icon/toolbar/printApplet.svg | 3 + .../icon/toolbar/printApplet_disable.svg | 3 + .../com/fine/theme/icon/toolbar/printPdf.svg | 6 + .../theme/icon/toolbar/printPdf_disable.svg | 6 + .../fine/theme/icon/toolbar/printPreview.svg | 10 + .../icon/toolbar/printPreview_disable.svg | 10 + .../fine/theme/icon/toolbar/printerOffset.svg | 10 + .../icon/toolbar/printerOffset_disable.svg | 10 + .../com/fine/theme/icon/toolbar/scale.svg | 3 + .../fine/theme/icon/toolbar/scale_disable.svg | 3 + .../fine/theme/light/ui/fine_light.icon.json | 14 + .../light/ui/laf/FineLightLaf.properties | 4 + .../fr/design/i18n/dimension_zh.properties | 4 +- .../design/javascript/ListenerEditPane.java | 26 +- .../com/fr/design/report/ExcelExportPane.java | 97 +++--- .../fr/design/report/ExportUniversalPane.java | 23 +- .../com/fr/design/report/ImageExportPane.java | 78 ++--- .../com/fr/design/report/PDFExportPane.java | 34 +- .../com/fr/design/report/PageSetupPane.java | 290 +++++++--------- .../design/report/ReportExportAttrPane.java | 29 +- .../com/fr/design/report/WordExportPane.java | 80 ++--- .../report/mobile/AppFitBrowserPane.java | 26 +- .../report/mobile/AppFitPreviewPane.java | 26 +- .../report/mobile/MobileOthersPane.java | 18 +- .../report/mobile/MobileRadioGroupPane.java | 44 ++- .../report/mobile/MobileToolBarPane.java | 28 +- .../report/mobile/ReportMobileAttrPane.java | 30 +- .../ReportMobileTemplateSettingsPane.java | 58 ++-- .../com/fr/design/webattr/CommonPane.java | 53 ++- .../fr/design/webattr/DragToolBarPane.java | 56 +++- .../EditReportServerParameterPane.java | 30 +- .../com/fr/design/webattr/EditToolBar.java | 237 ++++++------- .../fr/design/webattr/ErrorTemplatePane.java | 60 ++-- .../java/com/fr/design/webattr/EventPane.java | 27 +- .../fr/design/webattr/PageToolBarPane.java | 86 +++-- .../fr/design/webattr/PageWebSettingPane.java | 69 ++-- .../webattr/ReportServerPrinterPane.java | 4 +- .../fr/design/webattr/ReportWebAttrPane.java | 34 +- .../webattr/ReportWebWidgetConstants.java | 115 ++++--- .../fr/design/webattr/ServerFitAttrPane.java | 10 +- .../fr/design/webattr/ServerPrinterPane.java | 92 +++-- .../com/fr/design/webattr/SettingToolBar.java | 31 +- .../com/fr/design/webattr/ToolBarButton.java | 21 +- .../fr/design/webattr/ToolBarDragPane.java | 137 +++++--- .../com/fr/design/webattr/ToolBarPane.java | 3 +- .../fr/design/webattr/ViewToolBarPane.java | 70 ++-- .../fr/design/webattr/ViewWebSettingPane.java | 19 +- .../com/fr/design/webattr/WebCssPane.java | 51 +-- .../java/com/fr/design/webattr/WebJsPane.java | 79 ++--- .../com/fr/design/webattr/WebSettingPane.java | 94 +++--- .../fr/design/webattr/WriteToolBarPane.java | 78 +++-- .../design/webattr/WriteWebSettingPane.java | 58 ++-- .../AbstractNativePrintSettingPane.java | 211 +++++------- .../GlobalNativePrintSettingPane.java | 76 ++--- .../NoClientPrintSettingPane.java | 75 ++--- .../printsettings/PageMarginSettingPane.java | 43 +-- .../printsettings/PrintSettingPane.java | 27 +- .../ReportNativePrintSettingPane.java | 5 +- 102 files changed, 2285 insertions(+), 1983 deletions(-) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/clearStash.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/clearStash_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/customButton.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/customButton_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/dataVerify.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/dataVerify_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/email.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/email_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_first.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_first_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_last.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_last_disbale.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_navi.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_navi_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_next.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_next_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_previous.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_previous_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/printApplet.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/printApplet_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPdf.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPdf_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPreview.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPreview_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/printerOffset.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/printerOffset_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/scale.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/toolbar/scale_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java index 4cf5637d94..155ffa7731 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java @@ -29,6 +29,7 @@ public interface FineUIStyle { String BUTTON_TAB_ACTION = "tabAction"; String LABEL_BOLD = "boldLabel"; String LABEL_TIP = "tipLabel"; + String LABEL_WARNING_TIP = "warningTipLabel"; String PLAIN_BUTTON = "plainButton"; String TOGGLE_GROUP = "inToggleGroup"; String COMPACT_BUTTON = "compactButton"; diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataDictPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataDictPane.java index 175ddbfda3..910a4c00c2 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataDictPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataDictPane.java @@ -1,6 +1,8 @@ package com.fr.design.data.datapane; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.data.impl.RecursionTableData; +import com.fr.design.constants.LayoutConstants; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.preview.PreviewLabel; import com.fr.design.data.datapane.preview.PreviewLabel.Previewable; @@ -18,19 +20,21 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.stable.StringUtils; -import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JPanel; -import javax.swing.SwingConstants; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + public class TreeTableDataDictPane extends BasicPane implements Previewable { private UILabel selectTableDataLabel; @@ -54,23 +58,28 @@ public class TreeTableDataDictPane extends BasicPane implements Previewable { } public TreeTableDataDictPane(String treeName) { - this.setLayout(new BorderLayout(5, 30)); - this.setBorder(BorderFactory.createEmptyBorder(20, 20, 0, 0)); - selectTableDataLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_TableData_Select_One") + " :"); + this.setLayout(new BorderLayout()); + this.setBorder(new ScaledEmptyBorder(10,10,10,10)); + //请选择一个数据集 + selectTableDataLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_TableData_Select_One") ); setTableDataNameComboBox(treeName); - tableDataNameComboBox.setPreferredSize(new Dimension(180, 20)); - JPanel tableFlowPane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(); - tableFlowPane.add(selectTableDataLabel); - tableFlowPane.add(tableDataNameComboBox); tableDataNameComboBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { tdChange(true); } }); - tableFlowPane.add(new PreviewLabel(this)); - this.add(tableFlowPane, BorderLayout.NORTH); + JPanel tableFlowPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + tableFlowPane.add(row(LayoutConstants.HGAP_LARGE, + cell(selectTableDataLabel).weight(0.12), + row(LayoutConstants.HGAP_LARGE, + cell(tableDataNameComboBox).weight(0.9), + cell(new PreviewLabel(this)).weight(0.1) + ).weight(0.3), + flex(0.58) + ).getComponent()); + + //中心面板 JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - this.add(centerPane, BorderLayout.CENTER); parentMarkRadio = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Build_Tree_Accord_Parent_Marked_Filed"), true); lengthMarkRadio = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Build_Tree_Accord_Marked_Filed_Length")); parentMarkRadio.addItemListener(new ItemListener() { @@ -95,45 +104,44 @@ public class TreeTableDataDictPane extends BasicPane implements Previewable { markButtonGroup.add(parentMarkRadio); markButtonGroup.add(lengthMarkRadio); - originFieldDependsOnParentLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Original_Marked_Filed") + " :", SwingConstants.RIGHT); - parentFieldLabel = new UILabel(" " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parent_Marked_Field") + " :", SwingConstants.RIGHT); - treeDataFieldLabel1 = new UILabel(" " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tree_Data_Field") + " :", SwingConstants.RIGHT); - originFieldDependsOnLengthLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Original_Marked_Filed") + " :", SwingConstants.RIGHT); - treeDataFieldLabel2 = new UILabel(" " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tree_Data_Field") + " :", SwingConstants.RIGHT); + //原始标记字段 + originFieldDependsOnParentLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Original_Marked_Filed")); + //父标记字段 + parentFieldLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parent_Marked_Field")); + treeDataFieldLabel1 = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tree_Data_Field")); + originFieldDependsOnLengthLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Original_Marked_Filed")); + treeDataFieldLabel2 = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tree_Data_Field")); -// originFieldDependsOnParentPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[] {new OldColumnIndexEditor(com.fr.design.i18n.Toolkit.i18nText("Columns"))}); -// parentFieldPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[] {new OldColumnIndexEditor(com.fr.design.i18n.Toolkit.i18nText("Columns"))}); -// originFieldDependsOnLengthPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[] {new OldColumnIndexEditor(com.fr.design.i18n.Toolkit.i18nText("Columns"))}); originFieldDependsOnParentPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()}); parentFieldPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()}); originFieldDependsOnLengthPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()}); - makeParentEnable(); - JPanel p1 = createCenterFlowZeroGapBorderPane(originFieldDependsOnParentLabel, originFieldDependsOnParentPane); - JPanel p2 = createCenterFlowZeroGapBorderPane(parentFieldLabel, parentFieldPane); - JPanel border1 = new JPanel(); - border1.setLayout(new BorderLayout(0, 10)); - border1.add(p1, BorderLayout.NORTH); - border1.add(p2, BorderLayout.CENTER); - JPanel p4 = createCenterFlowZeroGapBorderPane(originFieldDependsOnLengthLabel, originFieldDependsOnLengthPane); - JPanel border2 = new JPanel(); - border2.setLayout(new BorderLayout(0, 20)); - border2.add(p4, BorderLayout.NORTH); + //树数据集面板 + centerPane.add(column(10, + cell(parentMarkRadio), + row(LayoutConstants.HGAP_LARGE, + cell(originFieldDependsOnParentLabel).weight(0.12), + cell(originFieldDependsOnParentPane).weight(0.3), + flex(0.58) + ), + row(LayoutConstants.HGAP_LARGE, + cell(parentFieldLabel).weight(0.12), + cell(parentFieldPane).weight(0.3), + flex(0.58) + ), + cell(lengthMarkRadio), + row(LayoutConstants.HGAP_LARGE, + cell(originFieldDependsOnLengthLabel).weight(0.12), + cell(originFieldDependsOnLengthPane).weight(0.3), + flex(0.58) + ) + ).getComponent()); - JPanel xx = FRGUIPaneFactory.createBorderLayout_S_Pane(); - xx.add(parentMarkRadio, BorderLayout.NORTH); - xx.add(border1, BorderLayout.CENTER); - JPanel xxx = FRGUIPaneFactory.createBorderLayout_S_Pane(); - xxx.add(lengthMarkRadio, BorderLayout.NORTH); - xxx.add(border2, BorderLayout.CENTER); - JPanel buildTreePanel = new JPanel(new BorderLayout(5, 30)); - buildTreePanel.add(xx, BorderLayout.NORTH); - buildTreePanel.add(xxx, BorderLayout.CENTER); - centerPane.add(buildTreePanel, BorderLayout.NORTH); - JPanel previewPanel = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + //预览 + JPanel previewPanel = new JPanel(new BorderLayout()); UIButton treeDataPreviewButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview")); - previewPanel.add(treeDataPreviewButton); + previewPanel.add(treeDataPreviewButton, BorderLayout.WEST); treeDataPreviewButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -163,7 +171,8 @@ public class TreeTableDataDictPane extends BasicPane implements Previewable { PreviewTablePane.previewTableData(rtd); } }); - centerPane.add(previewPanel, BorderLayout.CENTER); + + this.add(column(LayoutConstants.VERTICAL_GAP, cell(tableFlowPane),cell(centerPane), cell(previewPanel)).getComponent()); } protected void setTableDataNameComboBox(String treeName) { diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java index 821c3fd482..370ce5219e 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java @@ -69,8 +69,10 @@ import java.net.URI; import java.util.concurrent.ExecutionException; import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.fix; import static com.fine.swing.ui.layout.Layouts.row; import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; /** * Database Connection pane. @@ -280,9 +282,13 @@ public abstract class DatabaseConnectionPane jndiMap = new HashMap(); @@ -66,57 +68,51 @@ public class JNDIDefPane extends JPanel { private JDialog otherAttrDialog; public JNDIDefPane() { - this.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); - this.setBorder(UITitledBorder.createBorderWithTitle("JNDI" + ":")); - JPanel innerthis = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - this.add(innerthis); - // NorthPane - JPanel nContentPane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); - innerthis.add(nContentPane); - nContentPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_JNDI_Name") + ":")); - jndiNameTextField = new UITextField(20); - nContentPane.add(jndiNameTextField, BorderLayout.NORTH); - - // CenterPane - JPanel outcenterPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Context")); - innerthis.add(outcenterPane); - JPanel centerPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - outcenterPane.add(centerPane); + this.setLayout(new BorderLayout()); + jndiNameTextField = new UITextField(20); JNDIFactoryComboBox = new UIComboBox(new String[] { "", "weblogic.jndi.WLInitialContextFactory", "com.ibm.websphere.naming.WsnInitialContextFactory", "org.jboss.naming.HttpNamingContextFactory", "org.jnp.interfaces.NamingContextFactory", "com.caucho.burlap.BurlapContextFactory", }); JNDIFactoryComboBox.setEditable(true); - JNDIFactoryComboBox.addActionListener(jndiListener); - JNDIFactoryComboBox.setPreferredSize(new Dimension(30, JNDIFactoryComboBox.getPreferredSize().height + 2)); - - // ContextPane - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] rowSize = { p, p, p, p }; - double[] columnSize = { f, f }; - Component[][] comps = { { new UILabel("INITIAL_CONTEXT_FACTORY:", SwingConstants.RIGHT), JNDIFactoryComboBox }, - { new UILabel("PROVIDER_URL:", SwingConstants.RIGHT), PROVIDER_URL_TF }, { new UILabel("SECURITY_PRINCIPAL:", SwingConstants.RIGHT), SECURITY_PRINCIPAL_TF }, - { new UILabel("SECURITY_CREDENTIALS:", SwingConstants.RIGHT), SECURITY_CREDENTIALS_TF } }; - centerPane.add(TableLayoutHelper.createCommonTableLayoutPane(comps, rowSize, columnSize, 2)); - - // ActionLabel - JPanel actionPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - centerPane.add(actionPane); - actionPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 4, 6)); - + JNDIFactoryComboBox.setPreferredSize(FineUIScale.scale(new Dimension(30, JNDIFactoryComboBox.getPreferredSize().height + 2))); + + // 上下文 + JPanel contextPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + contextPane.add(column(LayoutConstants.VERTICAL_GAP, + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("INITIAL_CONTEXT_FACTORY")).weight(0.35), cell(JNDIFactoryComboBox).weight(0.65)), + row(LayoutConstants.HORIZONTAL_GAP,cell(new UILabel("PROVIDER_URL")).weight(0.35), cell(PROVIDER_URL_TF).weight(0.65)), + row(LayoutConstants.HORIZONTAL_GAP,cell(new UILabel("SECURITY_PRINCIPAL")).weight(0.35), cell(SECURITY_PRINCIPAL_TF).weight(0.65)), + row(LayoutConstants.HORIZONTAL_GAP,cell(new UILabel("SECURITY_CREDENTIALS")).weight(0.35), cell(SECURITY_CREDENTIALS_TF).weight(0.65)) + ).getComponent()); + + //其他属性 + JPanel otherAttributePanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); ActionLabel actionLabel = new ActionLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Other_Attributes")); - actionPane.add(actionLabel, BorderLayout.EAST); actionLabel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { + //其他属性弹窗 JDialog wDialog = createJDialog(); wDialog.setVisible(true); } }); + otherAttributePanel.add(actionLabel, BorderLayout.EAST); + //注意描述 + JPanel jndiDesPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + jndiDesPanel.add(new JScrollPane(new FRExplainLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_JNDI_DES"))), BorderLayout.WEST); + //JNDI面板 + JPanel centerPanel = column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_JNDI_Name"))).weight(0.15), cell(jndiNameTextField).weight(0.85)), + row(cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Context"))).weight(0.15), cell(contextPane).weight(0.85)), + cell(otherAttributePanel), + cell(jndiDesPanel) + ).getComponent(); + this.add(wrapComponentWithTitle(centerPanel,"JNDI")); + } - // South Description - UILabel explainLabe11l = new FRExplainLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_JNDI_DES")); - innerthis.add(new JScrollPane(explainLabe11l)); + private JPanel getTopAlignLabelPane(String labelText) { + return column(LayoutConstants.VERTICAL_GAP, cell(new UILabel(labelText))) + .with(it -> it.setBorder(new ScaledEmptyBorder(2,0,0,0))).getComponent(); } public void populate(JNDIDatabaseConnection jndiDatabase) { @@ -216,21 +212,23 @@ public class JNDIDefPane extends JPanel { class OtherAttrPane extends BasicPane { public OtherAttrPane() { // JPanel northFlowPane - JPanel northFlowPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - this.add(northFlowPane, BorderLayout.NORTH); - + JPanel northFlowPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + northFlowPane.setBorder(new ScaledEmptyBorder(10,10,10,10)); // ContextPane - double f = TableLayout.FILL; - double[] rowSize = { f, f, f, f, f, f, f, f, f, f, f }; - double[] columnSize = { f, f }; - Component[][] comps = { { new UILabel("OBJECT_FACTORIES:", SwingConstants.RIGHT), OBJECT_FACTORIES_TF }, - { new UILabel("STATE_FACTORIES:", SwingConstants.RIGHT), STATE_FACTORIES_TF }, { new UILabel("URL_PKG_PREFIXES:", SwingConstants.RIGHT), URL_PKG_PREFIXES_TF }, - { new UILabel("DNS_URL:", SwingConstants.RIGHT), DNS_URL_TF }, { new UILabel("AUTHORITATIVE:", SwingConstants.RIGHT), AUTHORITATIVE_TF }, - { new UILabel("BATCHSIZE:", SwingConstants.RIGHT), BATCHSIZE_TF }, { new UILabel("REFERRAL:", SwingConstants.RIGHT), REFERRAL_TF }, - { new UILabel("SECURITY_PROTOCOL:", SwingConstants.RIGHT), SECURITY_PROTOCOL_TF }, - { new UILabel("SECURITY_AUTHENTICATION:", SwingConstants.RIGHT), SECURITY_AUTHENTICATION_TF }, { new UILabel("LANGUAGE:", SwingConstants.RIGHT), LANGUAGE_TF }, - { new UILabel("APPLET:", SwingConstants.RIGHT), APPLET_TF } }; - northFlowPane.add(TableLayoutHelper.createCommonTableLayoutPane(comps, rowSize, columnSize, 2)); + northFlowPane.add(column(LayoutConstants.VERTICAL_GAP, + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("OBJECT_FACTORIES")).weight(0.35), cell(OBJECT_FACTORIES_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("STATE_FACTORIES")).weight(0.35), cell(STATE_FACTORIES_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("URL_PKG_PREFIXES")).weight(0.35), cell(URL_PKG_PREFIXES_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("DNS_URL")).weight(0.35), cell(DNS_URL_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("AUTHORITATIVE")).weight(0.35), cell(AUTHORITATIVE_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("BATCHSIZE")).weight(0.35), cell(BATCHSIZE_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("REFERRAL")).weight(0.35), cell(REFERRAL_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("SECURITY_PROTOCOL")).weight(0.35), cell(SECURITY_PROTOCOL_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("SECURITY_AUTHENTICATION")).weight(0.35), cell(SECURITY_AUTHENTICATION_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("LANGUAGE")).weight(0.35), cell(LANGUAGE_TF)).weight(0.65), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel("APPLET")).weight(0.35), cell(APPLET_TF)).weight(0.65) + ).getComponent()); + this.add(northFlowPane, BorderLayout.NORTH); } @Override diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewLabel.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewLabel.java index 4fa695fd21..48df699015 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewLabel.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewLabel.java @@ -5,7 +5,8 @@ import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIScale; import com.fr.design.gui.ibutton.UIButton; @@ -16,7 +17,7 @@ public class PreviewLabel extends UIButton { Previewable previewable; public PreviewLabel(Previewable previewable) { - super(BaseUtils.readIcon("/com/fr/design/images/m_file/preview.png")); + super(new LazyIcon("preview")); this.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview")); this.setCursor(new Cursor(Cursor.HAND_CURSOR)); this.previewable = previewable; @@ -27,7 +28,7 @@ public class PreviewLabel extends UIButton { PreviewLabel.this.previewable.preview(); } }); - this.setPreferredSize(new Dimension(24, 20)); + this.setPreferredSize(FineUIScale.scale(new Dimension(24, 24))); } public static interface Previewable { diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java index e2f7efc70b..04bda940c0 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java @@ -1,7 +1,9 @@ package com.fr.design.data.tabledata.tabledatapane; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.Parameter; import com.fr.data.impl.ClassTableData; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.ibutton.UIButton; @@ -11,8 +13,6 @@ import com.fr.design.gui.itableeditorpane.UITableEditAction; import com.fr.design.gui.itableeditorpane.UITableEditorPane; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.general.IOUtils; import com.fr.script.Calculator; import com.fr.stable.ParameterProvider; @@ -23,35 +23,29 @@ import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingUtilities; import java.awt.BorderLayout; -import java.awt.Component; import java.awt.Dialog; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + public class ClassTableDataPane extends AbstractTableDataPane { private UITextField classNameTextField; private UITableEditorPane editorPane; public ClassTableDataPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); - - // TableLayout - double p = TableLayout.PREFERRED; - - double[] rowSize = {p, p, p, p}; - double[] columnSize = {p, p}; - //Reportlet. - JPanel reportletNamePane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(); - classNameTextField = new UITextField(36); - reportletNamePane.add(classNameTextField); + this.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); + //类名 + classNameTextField = new UITextField(); UIButton browserButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Select")); - browserButton.setPreferredSize(new Dimension( - browserButton.getPreferredSize().width, - classNameTextField.getPreferredSize().height)); - reportletNamePane.add(browserButton); + browserButton.setPreferredSize(new Dimension(browserButton.getPreferredSize().width, classNameTextField.getPreferredSize().height)); browserButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { final ClassNameSelectPane bPane = new ClassNameSelectPane(); @@ -69,15 +63,26 @@ public class ClassTableDataPane extends AbstractTableDataPane { } }); - Component[][] components = { - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DS_Class_Name") + ":"), reportletNamePane}, - {null, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Function_The_Class_Must_Implement_The_Interface") + "\"com.fr.data.Tabledata\"")}, - {null, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Example") + ":\"com.fr.data.impl.ArrayTableData\"")}, - {null,new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Class_Location_Description", StableUtils.pathJoin(ProjectConstants.WEBINF_NAME, ProjectConstants.CLASSES_NAME)))} - }; - JPanel northPane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + JPanel tipPanel = column(LayoutConstants.VERTICAL_GAP, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Function_The_Class_Must_Implement_The_Interface") + "\"com.fr.data.Tabledata\"")), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Example") + ":\"com.fr.data.impl.ArrayTableData\"")), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Class_Location_Description", StableUtils.pathJoin(ProjectConstants.WEBINF_NAME, ProjectConstants.CLASSES_NAME)))) + ).getComponent(); + + JPanel northPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + northPane.add(column(LayoutConstants.VERTICAL_GAP, + row(LayoutConstants.HGAP_LARGE, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DS_Class_Name"))).weight(0.12), + row(LayoutConstants.HGAP_LARGE, + cell(classNameTextField).weight(0.85), + cell(browserButton).weight(0.15) + ).weight(0.58), + flex(0.3) + ), + row(LayoutConstants.HGAP_LARGE, flex(0.12), cell(tipPanel).weight(0.88)) + ).with(it -> it.setBorder(new ScaledEmptyBorder(0, 0,10, 0))).getComponent()); this.add(northPane, BorderLayout.NORTH); - this.add(initSouthPanel(), BorderLayout.SOUTH); + this.add(initSouthPanel(), BorderLayout.CENTER); } private JPanel initSouthPanel() { JPanel jpanel = new JPanel(); @@ -95,7 +100,6 @@ public class ClassTableDataPane extends AbstractTableDataPane { }, " " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_TableData_Default_Para")); jpanel.add(editorPane, BorderLayout.CENTER); - return jpanel; } diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java index 731816243e..90de902a9a 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java @@ -1,5 +1,6 @@ package com.fr.design.data.tabledata.tabledatapane; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.data.impl.EmbeddedTableData; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; @@ -52,7 +53,8 @@ public class EmbeddedTableDataPane extends AbstractTableDataPane { private static final int TEXT = 0; private static final int EXCEL = 1; @@ -104,8 +108,6 @@ public class FileTableDataPane extends AbstractTableDataPane { private UIButton testConnection; private XMLNodeTree xmlNodeTree; private Parameter[] params; - private JPanel filePath; - private XMLNodeTreePane nodeTreePane; private UICheckBox needColumnNameCheckBox;// 第一行是否作为标题 private UIRadioButton tableDismemberRadioButton;// 制表符 @@ -116,41 +118,32 @@ public class FileTableDataPane extends AbstractTableDataPane { private UICheckBox ignoreOneMoreDelimiterCheckBox;// 连续分隔符是否作为单一 private UIComboBox charsetComboBox; private UILabel encodeLabel; - private UILabel dismenberLabel; private UILabel keyPointLaber; private ExpandMutableTreeNode selectedNode = null; private ExpandMutableTreeNode finalSelectedNode = null; - private ArrayList xmlColumnsList = new ArrayList(); - private static final int SETPANELWIDTH = 337; - private static final int WIDTH = 317; - private static final int HEIGHT = 453; - private static final int GAP = 23; - + private static final double LOCAL_WIDTH_RATIO = 0.62; + private static final double URL_WIDTH_RATIO = 0.56; public FileTableDataPane() { - this(SETPANELWIDTH, WIDTH, HEIGHT, GAP); + this(LOCAL_WIDTH_RATIO, URL_WIDTH_RATIO); } - public FileTableDataPane(int setPanelWidth, int width, int height, int gap) { - this.setLayout(new BorderLayout(gap, 0)); - JPanel northPanel = new JPanel(new BorderLayout()); - JPanel type = new JPanel(); - type.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_File_Type") + ":")); + public FileTableDataPane(double localWidthRatio, double urlWidthRatio) { + this.setLayout(new BorderLayout()); + this.setBorder(new ScaledEmptyBorder(10,10,10,10)); + //文件类型 + JPanel fileType = new JPanel(new BorderLayout()); String[] item = {"TXT", "Excel", "XML"}; fileTypeComboBox = new UIComboBox(item); - fileTypeComboBox.setPreferredSize(new Dimension(100, 20)); - type.add(fileTypeComboBox); - northPanel.add(type, BorderLayout.WEST); - - // 最上面的pane,文件选择 - JPanel centerPanel = new JPanel(); - centerPanel.setPreferredSize(new Dimension(522, 200)); - centerPanel.setBorder(BorderFactory.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_File_Address"))); - addToCenterPanel(centerPanel); + fileType.add(row(LayoutConstants.HGAP_LARGE, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_File_Type"))).weight(0.12), + cell(fileTypeComboBox).weight(0.18), + flex(0.7) + ).getComponent()); - // 下面的pane,参数面板 + //参数面板 ParameterTableModel model = new ParameterTableModel() { @Override public UITableEditAction[] createAction() { @@ -158,65 +151,75 @@ public class FileTableDataPane extends AbstractTableDataPane { } }; editorPane = new UITableEditorPane(model); - editorPane.setPreferredSize(new Dimension(355, 130)); - centerPanel.add(editorPane, BorderLayout.SOUTH); - - JPanel southPanel = new JPanel(new BorderLayout()); - JPanel setPanel = new JPanel(); - southPanel.add(setPanel, BorderLayout.CENTER); - setPanel.setPreferredSize(new Dimension(setPanelWidth, 460)); - setPanel.setBorder(BorderFactory.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set"))); - JPanel controlPane = textSetPanel(width, height); - setPanel.add(controlPane, BorderLayout.NORTH); - fileTypeComboBox.addActionListener(getFileTypeListener(setPanel, width, height)); - - this.add(northPanel, BorderLayout.NORTH); - this.add(centerPanel, BorderLayout.CENTER); - this.add(southPanel, BorderLayout.EAST); + editorPane.setBorder(new ScaledEmptyBorder(0,0,0,10)); + editorPane.setPreferredSize(FineUIScale.scale(new Dimension(-1, 150))); + + //左侧文件地址pane + JPanel leftPanel = new JPanel(new BorderLayout()); + leftPanel.add(column( + LayoutConstants.VERTICAL_GAP, + cell(getCenterPanel(localWidthRatio, urlWidthRatio)), + cell(editorPane) + ).getComponent()); + //右侧设定pane + JPanel rightPanel = new JPanel(new BorderLayout()); + rightPanel.setBorder(new ScaledEmptyBorder(0,0,0,10)); + rightPanel.add(getTextSetPanel()); + fileTypeComboBox.addActionListener(getFileTypeListener(rightPanel)); + + //文件数据集整体布局,服务器数据集/模板数据集下的文件数据集,创建文件数据集,三处面板通用布局 + this.add(column(LayoutConstants.VERTICAL_GAP, + cell(fileType), + row(20, + cell(wrapComponentWithTitle(leftPanel, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_File_Address"))).weight(0.5), + cell(wrapComponentWithTitle(rightPanel, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set"))).weight(0.5) + ) + ).getComponent()); } - private void addToCenterPanel(JPanel centerPanel) { - localFileRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Local_File") + ":", true); - urlFileRadioButton = new UIRadioButton("URL:", false); + /** + * 文件地址上方的面板-文件选择 + * @return + */ + private JPanel getCenterPanel(double localWidthRatio, double urlWidthRatio) { + // 本地文件/URL + localFileRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Local_File"), true); + urlFileRadioButton = new UIRadioButton("URL", false); ButtonGroup bg = new ButtonGroup(); bg.add(localFileRadioButton); bg.add(urlFileRadioButton); localFileRadioButton.addActionListener(radioActionListener); urlFileRadioButton.addActionListener(radioActionListener); - urlFileRadioButton.setForeground(new Color(143, 142, 139)); - localFileRadioButton.setForeground(Color.black); localText = new UITextField(); - localText.setPreferredSize(new Dimension(195, 20)); urlText = new UITextField(); - urlText.setPreferredSize(new Dimension(195, 20)); urlText.setEditable(false); + // 选择按钮 chooseFile = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Selection")); chooseFile.addActionListener(chooseFileListener); - + // 测试连接按钮 testConnection = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Test_Connection")); testConnection.setEnabled(false); - testConnection.addActionListener(testConnectionListener);// 测试连接按钮 - - JPanel textPanel = new JPanel(new GridLayout(2, 1, 15, 15)); - JPanel textFieldPanel = new JPanel(new GridLayout(2, 1, 15, 15)); - JPanel buttonPanel = new JPanel(new GridLayout(2, 1, 15, 15)); - textPanel.add(localFileRadioButton); - textPanel.add(urlFileRadioButton); - textFieldPanel.add(localText); - textFieldPanel.add(urlText); - buttonPanel.add(chooseFile); - buttonPanel.add(testConnection); - filePath = FRGUIPaneFactory.createBorderLayout_S_Pane(); - filePath.add(textPanel, BorderLayout.WEST); - filePath.add(textFieldPanel, BorderLayout.CENTER); - filePath.add(buttonPanel, BorderLayout.EAST); - centerPanel.add(filePath, BorderLayout.NORTH); - - // 中间的pane,提示信息 + testConnection.addActionListener(testConnectionListener); + // 提示信息 String tipContent = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Type_Parameter") + "reportlets/excel/FineReport${abc}." + "txt" + "
" + "http://192.168.100.120:8080/XXServer/Report/excel${abc}.jsp
" + "  "; tips = new UILabel(tipContent); - centerPanel.add(tips, BorderLayout.CENTER); + return column( + LayoutConstants.VERTICAL_GAP, + row( + LayoutConstants.HGAP_LARGE, + cell(localFileRadioButton).weight(0.25), + cell(localText).weight(localWidthRatio), + cell(chooseFile).weight(0.75 - localWidthRatio) + ), + row( + LayoutConstants.HGAP_LARGE, + cell(urlFileRadioButton).weight(0.25), + cell(urlText).weight(urlWidthRatio), + cell(testConnection).weight(0.75 - urlWidthRatio) + ), + cell(tips).weight(1) + ).with(it -> it.setBorder(new ScaledEmptyBorder(0,0,0,10))).getComponent(); } private ActionListener testConnectionListener = new ActionListener() { @@ -249,7 +252,7 @@ public class FileTableDataPane extends AbstractTableDataPane { } }; - private void previewPanel(JPanel jPanel) { + private JPanel getPreviewPanel() { JPanel previewPanel = new JPanel(new BorderLayout()); UIButton preview = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview")); preview.addActionListener(new ActionListener() { @@ -259,56 +262,33 @@ public class FileTableDataPane extends AbstractTableDataPane { } }); previewPanel.add(preview, BorderLayout.EAST); - jPanel.add(previewPanel, BorderLayout.SOUTH); + return previewPanel; } - private JPanel xmlSetPanel(int width, int height) { + /** + * XML设定Pane + * @return + */ + private JPanel getXmlSetPanel() { // xml设置pane - JPanel controlPane = new JPanel(); - JPanel northPane = new JPanel(new BorderLayout(8, 8)); - JPanel northTopPane = new JPanel(new BorderLayout(8, 8)); - JPanel southPane = new JPanel(new BorderLayout(8, 8)); - JPanel southTopPane = new JPanel(new BorderLayout(8, 8)); - controlPane.setLayout(new BorderLayout(8, 8)); - controlPane.setPreferredSize(new Dimension(width, height)); - JPanel comboboxPanel = new JPanel(new BorderLayout(8, 8)); - encodeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Encoding_Type") + ":"); + encodeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Encoding_Type")); encodingComboBox = new UIComboBox(EncodeConstants.ALL_ENCODING_ARRAY); encodingComboBox.setSelectedIndex(4); - encodingComboBox.setPreferredSize(new Dimension(90, 20)); - - JPanel treeContainerPane = new JPanel(); - treeContainerPane.setLayout(new BorderLayout(8, 8)); - nodeTreePane = new XMLNodeTreePane(); - treeContainerPane.add(nodeTreePane, BorderLayout.CENTER); - - - comboboxPanel.add(encodeLabel, BorderLayout.WEST); - comboboxPanel.add(encodingComboBox, BorderLayout.CENTER); - - northPane.add(comboboxPanel, BorderLayout.EAST); - northTopPane.add(northPane, BorderLayout.WEST); - southTopPane.add(southPane, BorderLayout.WEST); - southTopPane.add(treeContainerPane, BorderLayout.CENTER); - controlPane.add(northTopPane, BorderLayout.NORTH); - controlPane.add(southTopPane, BorderLayout.CENTER); - previewPanel(controlPane); - return controlPane; + return column( + LayoutConstants.VGAP_MEDIUM, + row(LayoutConstants.HORIZONTAL_GAP, cell(encodeLabel).weight(0.2), cell(encodingComboBox).weight(0.8)), + cell(new XMLNodeTreePane()), + cell(getPreviewPanel()) + ).getComponent(); } - private JPanel excelSetPanel(int width, int height) { - // excel设置pane - int checkBoxWidth = width - EIGHT; - JPanel controlPane = new JPanel(); - JPanel northPane = new JPanel(new BorderLayout(8, 8)); - controlPane.setLayout(new BorderLayout()); - controlPane.setPreferredSize(new Dimension(width, height)); + /** + * Excel设定Pane + * @return + */ + private JPanel getExcelSetPanel() { needColumnNameCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FirstRow_IS_Column_Name"), false); - needColumnNameCheckBox.setPreferredSize(new Dimension(checkBoxWidth, 20)); - northPane.add(needColumnNameCheckBox, BorderLayout.EAST); - controlPane.add(northPane, BorderLayout.NORTH); - previewPanel(controlPane); - return controlPane; + return column(cell(needColumnNameCheckBox), cell(getPreviewPanel())).getComponent(); } private String getFilePathFromUrlOrLocal() { @@ -346,34 +326,31 @@ public class FileTableDataPane extends AbstractTableDataPane { // return (uri.matches("https*://.+|\\$\\{.+\\}.*")); } - private JPanel textSetPanel(int width, int height) { - // text设置pane - JPanel controlPane = new JPanel(); - controlPane.setLayout(new BorderLayout()); - controlPane.setPreferredSize(new Dimension(width, height)); - JPanel northPane = new JPanel(new BorderLayout(8, 8)); - addToNorthPane(northPane); - controlPane.add(northPane, BorderLayout.WEST); - previewPanel(controlPane); - return controlPane; + /** + * TXT设定Pane + * @return + */ + private JPanel getTextSetPanel() { + initRatioButton(); + //编码类型 + encodeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Encoding_Type")); + charsetComboBox = new UIComboBox(EncodeConstants.ALL_ENCODING_ARRAY); + return column(cell(getTxtCenterPane()), cell(getPreviewPanel())).getComponent(); } - private void addToNorthPane(JPanel northPane) { - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] columnSize = {f, p, p}; - double[] rowSize = {B, B, B, B, B, B, B}; - needColumnNameCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FirstRow_IS_Column_Name"), true); - dismenberLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dismenber") + ":"); + /** + * 初始化Button + */ + private void initRatioButton(){ tableDismemberRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Table_Dismember"), false); tableDismemberRadioButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Table_Dismember")); spaceDismenberRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Space"), true); spaceDismenberRadioButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Space")); commaDismenberRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Comma_Dismenber"), false); commaDismenberRadioButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Comma_Dismenber")); - otherDismenberRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Other") + ":", false); + otherDismenberRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Other"), false); otherDismenberRadioButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Other")); - otherDismenberTextField = new UITextField(8); + otherDismenberTextField = new UITextField(); otherDismenberTextField.setEditable(false); otherDismenberRadioButton.addChangeListener(new ChangeListener() { @Override @@ -385,6 +362,7 @@ public class FileTableDataPane extends AbstractTableDataPane { } } }); + needColumnNameCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FirstRow_IS_Column_Name"), true); ButtonGroup bg2 = new ButtonGroup(); bg2.add(tableDismemberRadioButton); bg2.add(spaceDismenberRadioButton); @@ -392,18 +370,38 @@ public class FileTableDataPane extends AbstractTableDataPane { bg2.add(otherDismenberRadioButton); ignoreOneMoreDelimiterCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Series_Dismenber_As_Single"), true); UIComponentUtils.setLineWrap(ignoreOneMoreDelimiterCheckBox); - encodeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Encoding_Type") + ":"); - charsetComboBox = new UIComboBox(EncodeConstants.ALL_ENCODING_ARRAY); - Component[][] comps = { - {encodeLabel, charsetComboBox, null}, - {needColumnNameCheckBox, null, null}, - {dismenberLabel, tableDismemberRadioButton, null}, - {null, spaceDismenberRadioButton, null}, - {null, commaDismenberRadioButton, null}, - {null, otherDismenberRadioButton, otherDismenberTextField}, - {ignoreOneMoreDelimiterCheckBox, null, null} - }; - northPane.add(TableLayoutHelper.createTableLayoutPane(comps, rowSize, columnSize), BorderLayout.EAST); + } + + + /** + * 获取TXT中心Pane + * @return + */ + private JPanel getTxtCenterPane(){ + //分隔符选项 + JPanel separatorOptionsPanel = column( + LayoutConstants.VERTICAL_GAP, + cell(tableDismemberRadioButton), + cell(spaceDismenberRadioButton), + cell(commaDismenberRadioButton), + row(cell(otherDismenberRadioButton).weight(0.2), cell(otherDismenberTextField).weight(0.8)) + ).getComponent(); + //TXT设定主要面板 + return column( + LayoutConstants.VERTICAL_GAP, + row(10, cell(encodeLabel).weight(0.2), cell(charsetComboBox).weight(0.8)), + cell(needColumnNameCheckBox), + row(10, + cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dismenber"))).weight(0.2), + cell(separatorOptionsPanel).weight(0.8) + ), + cell(ignoreOneMoreDelimiterCheckBox) + ).getComponent(); + } + + private JPanel getTopAlignLabelPane(String labelText) { + return column(LayoutConstants.VERTICAL_GAP, cell(new UILabel(labelText))) + .with(it-> it.setBorder(new ScaledEmptyBorder(2,0,0,0))).getComponent(); } private ActionListener radioActionListener = new ActionListener() { @@ -480,24 +478,24 @@ public class FileTableDataPane extends AbstractTableDataPane { return suffixToString; } - private ActionListener getFileTypeListener(final JPanel setPanel, final int width, final int height) { + private ActionListener getFileTypeListener(final JPanel rightPanel) { ActionListener fileTypeListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - setPanel.removeAll(); + rightPanel.removeAll(); localText.setText(""); urlText.setText(""); if (fileTypeComboBox.getSelectedIndex() == XML) { - setPanel.add(xmlSetPanel(width, height), BorderLayout.NORTH); + rightPanel.add(getXmlSetPanel()); } else if (fileTypeComboBox.getSelectedIndex() == EXCEL) { - setPanel.add(excelSetPanel(width, height), BorderLayout.NORTH); + rightPanel.add(getExcelSetPanel()); } else { - setPanel.add(textSetPanel(width, height), BorderLayout.NORTH); + rightPanel.add(getTextSetPanel()); } String tipContent = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Type_Parameter") + "reportlets/excel/FineReport${abc}." + getFileSuffixToString() + "
" + "http://192.168.100.120:8080/XXServer/Report/excel${abc}.jsp
" + "  "; tips.setText(tipContent); - setPanel.revalidate(); + rightPanel.revalidate(); } }; @@ -507,7 +505,7 @@ public class FileTableDataPane extends AbstractTableDataPane { private class RefreshAction extends UITableEditAction { public RefreshAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Refresh")); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); + this.setSmallIcon(new LazyIcon("refresh")); } @Override @@ -818,9 +816,10 @@ public class FileTableDataPane extends AbstractTableDataPane { JPanel toolbarPanel = new JPanel(new BorderLayout()); this.setLayout(new BorderLayout()); xmlNodeTree = new XMLNodeTree(); + xmlNodeTree.setBackground(FlatUIUtils.getUIColor("fill.normal", Color.WHITE)); this.add(new JScrollPane(xmlNodeTree)); - keyPointLaber = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Key_Point") + ":"); + keyPointLaber = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Key_Point")); refreshAction = new RefreshParameterAction(); ToolBarDef toolbarDef = new ToolBarDef(); toolbarDef.addShortCut(refreshAction); @@ -840,7 +839,7 @@ public class FileTableDataPane extends AbstractTableDataPane { public RefreshParameterAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Refresh")); this.setMnemonic('r'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); + this.setSmallIcon(new LazyIcon("refresh")); } @Override diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallHeightPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallHeightPane.java index 4ce5da98d6..06963c3810 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallHeightPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallHeightPane.java @@ -9,11 +9,10 @@ package com.fr.design.data.tabledata.tabledatapane; */ public class FileTableDataSmallHeightPane extends FileTableDataPane{ //wikky:文件数据集在模板数据集下面的界面参数。 - private static final int SETPANELWIDTH = 265; - private static final int WIDTH = 245; - private static final int HEIGHT = 475; - private static final int GAP = 13; + private static final double LOCAL_WIDTH_RATIO = 0.58; + private static final double URL_WIDTH_RATIO = 0.51; + public FileTableDataSmallHeightPane(){ - super(SETPANELWIDTH,WIDTH,HEIGHT,GAP); + super(LOCAL_WIDTH_RATIO, URL_WIDTH_RATIO); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallPane.java index b81d2b904e..0c33c054af 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallPane.java @@ -9,11 +9,10 @@ package com.fr.design.data.tabledata.tabledatapane; */ public class FileTableDataSmallPane extends FileTableDataPane{ //wikky:文件数据集在服务器数据集下面的界面参数。 - private static final int SETPANELWIDTH = 265; - private static final int WIDTH = 245; - private static final int HEIGHT = 436; - private static final int GAP = 13; + private static final double LOCAL_WIDTH_RATIO = 0.59; + private static final double URL_WIDTH_RATIO = 0.52; + public FileTableDataSmallPane(){ - super(SETPANELWIDTH,WIDTH,HEIGHT,GAP); + super(LOCAL_WIDTH_RATIO, URL_WIDTH_RATIO); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java index 66674f166a..33c1377496 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java @@ -1,9 +1,13 @@ package com.fr.design.data.tabledata.tabledatapane; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.*; import com.fr.data.impl.ConditionTableData; import com.fr.data.impl.MultiTDTableData; import com.fr.data.impl.UnionTableData; +import com.fr.design.constants.LayoutConstants; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.tabledata.wrapper.TableDataWrapper; import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper; @@ -39,6 +43,10 @@ import java.util.Iterator; import java.util.List; import java.util.Map.Entry; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + public class MultiTDTableDataPane extends AbstractTableDataPane { private static final int MAX_LENTH_OF_DATASET = 130; //关联数据集面板最大显示的数据集长度,超出这个长度显示数据集名称+“...” @@ -52,28 +60,25 @@ public class MultiTDTableDataPane extends AbstractTableDataPane stringTableDataWrapperEntry : resMap.entrySet()) { TableDataWrapper tableDataWrappe = stringTableDataWrapperEntry.getValue(); @@ -103,7 +110,6 @@ public class MultiTDTableDataPane extends AbstractTableDataPane MAX_LENTH_OF_DATASET) { @@ -299,25 +298,40 @@ public class MultiTDTableDataPane extends AbstractTableDataPane it.setBorder(new ScaledEmptyBorder(0,10,0,0))).getComponent(); this.setLayout(new BorderLayout()); - this.add(buttonPane, BorderLayout.NORTH); this.contentPane = getContentPane(); - this.add(contentPane, BorderLayout.CENTER); + this.add(column(cell(buttonPane), cell(contentPane)).getComponent()); } /** 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 5b77b9571a..a15e6335cc 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 @@ -1,6 +1,9 @@ package com.fr.design.dialog; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.common.annotations.Open; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.DesignSizeI18nManager; @@ -17,6 +20,9 @@ import java.awt.Dimension; import java.awt.Frame; import java.awt.Window; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + @Open public abstract class BasicPane extends JPanel { @@ -299,16 +305,19 @@ public abstract class BasicPane extends JPanel { private PropertyChangeAdapter changeListener; public NamePane(BasicPane bPane) { - this.setLayout(new BorderLayout(4, 4)); - - nameTextField = new UITextField(30); - Name = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Name") + ":"); - JPanel northPane = new JPanel(new BorderLayout(4, 4)); - northPane.add(Name, BorderLayout.WEST); - northPane.add(nameTextField, BorderLayout.CENTER); - northPane.add(showfield = new UILabel(" "), BorderLayout.EAST); + this.setLayout(new BorderLayout()); + nameTextField = new UITextField(); + Name = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Name")); + JPanel northPane = new JPanel(new BorderLayout()); + northPane.setBorder(new ScaledEmptyBorder(0,10,0,10)); + northPane.add(row( + LayoutConstants.HGAP_LARGE, + cell(Name).weight(0.12), + cell(nameTextField).weight(0.58), + cell(showfield = new UILabel(" ")).weight(0.3) + ).getComponent()); showfield.setForeground(new Color(204, 0, 1)); - showfield.setPreferredSize(new Dimension(220, showfield.getPreferredSize().height)); + showfield.setPreferredSize(FineUIScale.scale(new Dimension(220, showfield.getPreferredSize().height))); this.add(northPane, BorderLayout.NORTH); this.centerPane = bPane; this.add(bPane, BorderLayout.CENTER); diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/EditingStringListPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/EditingStringListPane.java index ebe6abb672..63d1d8e69f 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/EditingStringListPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/EditingStringListPane.java @@ -1,27 +1,33 @@ package com.fr.design.gui.frpane; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.JListUtils; import com.fr.stable.StringUtils; -import javax.swing.BorderFactory; -import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JList; -import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; -import javax.swing.ListSelectionModel; +import javax.swing.JOptionPane; +import javax.swing.DefaultListCellRenderer; import javax.swing.SwingUtilities; +import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Component; +import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; @@ -29,13 +35,17 @@ import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + public abstract class EditingStringListPane extends BasicBeanPane> { private static final long serialVersionUID = 1L; private DefaultListModel model; private JList jlist; private UIButton addButton; - private UIButton editButton; + private UIButton modifyButton; private UIButton removeButton; private UIButton moveUpButton; private UIButton moveDownButton; @@ -43,6 +53,11 @@ public abstract class EditingStringListPane extends BasicBeanPane> public EditingStringListPane() { super(); this.setLayout(FRGUIPaneFactory.createBorderLayout()); + //按钮 + JPanel buttonPane = initButtonPane(); + buttonPane.setBorder(new ScaledEmptyBorder(0,0,10,0)); + this.add(buttonPane, BorderLayout.NORTH); + //列表 model = new DefaultListModel(); jlist = new JList(model); jlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); @@ -56,34 +71,43 @@ public abstract class EditingStringListPane extends BasicBeanPane> } }); - - addButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add")); - editButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Modify")); - removeButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove")); - moveUpButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Up")); - moveDownButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Down")); - - JPanel eastPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(1); - eastPane.add(editButton); - eastPane.add(removeButton); - eastPane.add(moveUpButton); - eastPane.add(moveDownButton); - this.add(GUICoreUtils.createBorderPane(eastPane, BorderLayout.NORTH), BorderLayout.EAST); - - JPanel centerPane = new JPanel(new BorderLayout(0, 5)); - this.add(centerPane, BorderLayout.CENTER); - JPanel northcenterPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - northcenterPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); - northcenterPane.add(addButton, BorderLayout.EAST); - centerPane.add(northcenterPane, BorderLayout.NORTH); - centerPane.add(new JScrollPane(jlist), BorderLayout.CENTER); - + jlist.setBackground(FlatUIUtils.getUIColor("fill.normal", Color.WHITE)); + JScrollPane scrollPane = new JScrollPane(jlist); + scrollPane.setPreferredSize(FineUIScale.scale(new Dimension(620,350))); + scrollPane.setBorder(new FineRoundBorder()); + this.add(scrollPane, BorderLayout.CENTER); + //统一加按钮事件 this.addListener(); - this.addButton.setEnabled(false); this.checkEnableState(); } + private JPanel initButtonPane() { + addButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add"), new LazyIcon("add")); + addButton.setDisabledIcon(new LazyIcon("add").disabled()); + + modifyButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Modify"), new LazyIcon("edit")); + modifyButton.setDisabledIcon(new LazyIcon("edit").disabled()); + + removeButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"), new LazyIcon("remove")); + removeButton.setDisabledIcon(new LazyIcon("remove").disabled()); + + moveUpButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Up"), new LazyIcon("move_up")); + moveUpButton.setDisabledIcon(new LazyIcon("move_up").disabled()); + + moveDownButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Down"), new LazyIcon("move_down")); + moveDownButton.setDisabledIcon(new LazyIcon("move_down").disabled()); + + return row(LayoutConstants.HORIZONTAL_GAP, + flex(), + cell(addButton), + cell(modifyButton), + cell(removeButton), + cell(moveUpButton), + cell(moveDownButton) + ).getComponent(); + } + private void addListener() { addListener1(); @@ -119,7 +143,6 @@ public abstract class EditingStringListPane extends BasicBeanPane> private void addListener1() { addButton.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { String newvalue = getAddOrEditString(); @@ -133,7 +156,7 @@ public abstract class EditingStringListPane extends BasicBeanPane> } } }); - editButton.addActionListener(new ActionListener() { + modifyButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -152,9 +175,9 @@ public abstract class EditingStringListPane extends BasicBeanPane> Object selected = jlist.getSelectedValue(); if (selected != null) { int re = FineJOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(EditingStringListPane.this), - Toolkit.i18nText("Fine-Design_Basic_Sure_To_Delete") + selected.toString() + "?", - Toolkit.i18nText("Fine-Design_Basic_Dialog_Prompt"), - JOptionPane.OK_CANCEL_OPTION); + Toolkit.i18nText("Fine-Design_Basic_Sure_To_Delete") + selected.toString() + "?", + Toolkit.i18nText("Fine-Design_Basic_Dialog_Prompt"), + JOptionPane.OK_CANCEL_OPTION); if (re == JOptionPane.OK_OPTION) { JListUtils.removeSelectedListItems(jlist); } @@ -174,7 +197,7 @@ public abstract class EditingStringListPane extends BasicBeanPane> private void setEditEnabled(boolean enabled) { this.removeButton.setEnabled(enabled); - this.editButton.setEnabled(enabled); + this.modifyButton.setEnabled(enabled); this.moveUpButton.setEnabled(enabled); this.moveDownButton.setEnabled(enabled); } diff --git a/designer-base/src/main/java/com/fr/design/gui/ilable/FRExplainLabel.java b/designer-base/src/main/java/com/fr/design/gui/ilable/FRExplainLabel.java index d0c5f4a496..e4224535c3 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ilable/FRExplainLabel.java +++ b/designer-base/src/main/java/com/fr/design/gui/ilable/FRExplainLabel.java @@ -1,10 +1,9 @@ package com.fr.design.gui.ilable; -import java.awt.Color; +import com.fine.theme.utils.FineUIStyle; import javax.swing.Icon; import javax.swing.ImageIcon; -import com.fr.design.gui.ilable.UILabel; public class FRExplainLabel extends UILabel { @@ -19,6 +18,6 @@ public class FRExplainLabel extends UILabel { private void init(){ setIcon(icon); - setForeground(new Color(255, 0, 0)); + FineUIStyle.setStyle(this, FineUIStyle.LABEL_WARNING_TIP); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/parameter/ParameterPane.java b/designer-base/src/main/java/com/fr/design/parameter/ParameterPane.java index 063a685d80..340f9a5232 100644 --- a/designer-base/src/main/java/com/fr/design/parameter/ParameterPane.java +++ b/designer-base/src/main/java/com/fr/design/parameter/ParameterPane.java @@ -1,18 +1,21 @@ package com.fr.design.parameter; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.Parameter; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.LayoutConstants; import com.fr.design.editor.ValueEditorPane; import com.fr.design.editor.ValueEditorPaneFactory; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; public class ParameterPane extends BasicBeanPane { @@ -34,27 +37,24 @@ public class ParameterPane extends BasicBeanPane { } protected void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.setLayout(new BorderLayout()); + //名字 nameTextField = new UITextField(10); nameTextField.setEditable(false); - - JPanel textFieldPanel=FRGUIPaneFactory.createBorderLayout_S_Pane(); - textFieldPanel.add(nameTextField,BorderLayout.CENTER); - + //默认值 valueEditor = ValueEditorPaneFactory.createBasicValueEditorPane(); - // richer:要排列显示的控件 - Component[][] components = {{null}, - { null, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Name") + ":"),textFieldPanel }, - { null, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Default_Value") + ":"),valueEditor } - }; - double p =TableLayout.PREFERRED; - double f =TableLayout.FILL; - double[] rowSize = {p, p, p, p}; - double[] columnSize = {p, p, f, p, p}; - - JPanel centerPane = TableLayoutHelper.createGapTableLayoutPane( - components, rowSize, columnSize, 20, 10); + JPanel centerPane = column(LayoutConstants.VERTICAL_GAP, + row(20, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Name") + ":")).weight(0.1), + cell(nameTextField).weight(0.8), + flex(0.1)), + row(20, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Default_Value") + ":")).weight(0.1), + cell(valueEditor).weight(0.8), + flex(0.1)) + ).getComponent(); + centerPane.setBorder(new ScaledEmptyBorder(0, 20, 0, 0)); this.add(centerPane, BorderLayout.CENTER); } diff --git a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java index e06046e079..b322cc910c 100644 --- a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java +++ b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java @@ -1,46 +1,52 @@ package com.fr.design.report; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.BaseFormula; import com.fr.base.iofile.attr.WatermarkAttr; +import com.fr.design.border.FineBorderFactory; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.editor.editor.FormulaEditor; import com.fr.design.gui.icombobox.UIComboBox; -import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.ispinner.UnsignedIntUISpinner; import com.fr.design.gui.style.FRFontPane; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.style.color.NewColorSelectPane; -import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.BorderFactory; -import javax.swing.SwingConstants; -import javax.swing.JComponent; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import javax.swing.JDialog; -import javax.swing.SwingUtilities; -import javax.swing.UIManager; -import java.awt.Dimension; import java.awt.BorderLayout; import java.awt.Color; +import java.awt.Dimension; +import java.awt.Dialog; +import java.awt.FlowLayout; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; import java.awt.event.FocusAdapter; -import java.awt.Dialog; -import java.awt.FlowLayout; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; /** @@ -57,7 +63,7 @@ public class WatermarkPane extends BasicPane { private UIComboBox fontSizeComboBox; //横向间距 private UISpinner horizontalGapSpinner; - //横向间距 + //纵向间距 private UISpinner verticalGapSpinner; // 文字颜色 private NewColorSelectPane colorPane; @@ -69,7 +75,7 @@ public class WatermarkPane extends BasicPane { //纵向间距最小值 public static final int VERTICAL_GAP_MIX = 50; - private static final Dimension SPINNER_DIMENSION = new Dimension(75, 20); + private JPanel leftPane; public WatermarkPane() { initComponents(); @@ -77,26 +83,45 @@ public class WatermarkPane extends BasicPane { private void initComponents() { message = new UILabel(); - this.setBorder(BorderFactory.createEmptyBorder(4, 4, -5, 4)); this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel contentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - this.add(contentPane, BorderLayout.CENTER); - - // 预览 - JPanel leftPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - contentPane.add(leftPane, BorderLayout.CENTER); - leftPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Style_Preview"), null)); + //左侧预览面板 JPanel previewPaneWrapper = FRGUIPaneFactory.createBorderLayout_S_Pane(); - leftPane.add(previewPaneWrapper, BorderLayout.CENTER); - previewPaneWrapper.setBorder(BorderFactory.createEmptyBorder(2, 8, 4, 8)); + //预览外边框,宽度跟随全局权重 + previewPaneWrapper.setBorder(new FineRoundBorder()); + previewPaneWrapper.setPreferredSize(FineUIScale.scale(new Dimension(-1,415))); + previewPaneWrapper.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); watermarkPreviewPane = new WatermarkPreviewPane(); + watermarkPreviewPane.setOpaque(false); previewPaneWrapper.add(watermarkPreviewPane, BorderLayout.CENTER); - - // 设置 - JPanel rightPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - contentPane.add(rightPane, BorderLayout.EAST); - rightPane.add(initRightPane(), BorderLayout.NORTH); + leftPane = column( + LayoutConstants.VGAP_SMALL, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Style_Preview"))), + cell(previewPaneWrapper) + ).getComponent(); + + // 分割线 + JPanel separatorLine = new JPanel(); + separatorLine.setBorder(FineBorderFactory.createDefaultUnderlineBorder()); + + //在预览与配置外创建一个大的外边框并设置边距 + JPanel innerPanel = row( + LayoutConstants.HORIZONTAL_GAP, + cell(leftPane).weight(0.55), + cell(wrapComponentWithTitle(getRightPane(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Config"))).weight(0.45) + ).with(it -> it.setBorder(new ScaledEmptyBorder(10,10,10,10))).getComponent(); + JPanel outerPanel = new JPanel(new BorderLayout()); + outerPanel.setBorder(new FineRoundBorder()); + outerPanel.setBackground(FineUIUtils.getUIColor("fill.gray", "defaultBorderColor")); + outerPanel.add(innerPanel); + + // 分割线下方,左侧预览,右侧配置 + JPanel centerPanel = column(LayoutConstants.VERTICAL_GAP, + cell(separatorLine), + cell(outerPanel) + ).getComponent(); + centerPanel.setBorder(new ScaledEmptyBorder(0, 10, 0, 10)); + this.add(centerPanel, BorderLayout.CENTER); } public void populate(WatermarkAttr watermark) { @@ -129,60 +154,59 @@ public class WatermarkPane extends BasicPane { this.formulaPane = formulaPane; } - protected UIScrollPane initRightPane() { + /** + * 配置Pane + * @return + */ + protected JPanel getRightPane() { + // 文字 formulaPane = new FormulaEditor(Toolkit.i18nText("Fine-Design_Report_Parameter_Formula")); + // 字号 fontSizeComboBox = new UIComboBox(FRFontPane.FONT_SIZES); fontSizeComboBox.setEditable(true); + + //水印间距 horizontalGapSpinner = new UnsignedIntUISpinner(100, Integer.MAX_VALUE, 1, 200); verticalGapSpinner = new UnsignedIntUISpinner(50, Integer.MAX_VALUE, 1, 100); - horizontalGapSpinner.setPreferredSize(SPINNER_DIMENSION); - verticalGapSpinner.setPreferredSize(SPINNER_DIMENSION); - message.setBorder(BorderFactory.createEmptyBorder(8, 5, 0, 0)); //失去焦点时要判断是否要弹出提示 horizontalGapSpinner.getTextField().addFocusListener( createFocusListener4GapNumberField(horizontalGapSpinner, HORIZONTAL_GAP_MIX, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Horizontal_Gap_Over_Warning"))); verticalGapSpinner.getTextField().addFocusListener(createFocusListener4GapNumberField(verticalGapSpinner, VERTICAL_GAP_MIX, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Vertical_Gap_Over_Warning"))); - //next 按钮 释放时也要判断是否要弹出提示 horizontalGapSpinner.getNextButton().addMouseListener(createMouseListener4GapNextButton(horizontalGapSpinner, HORIZONTAL_GAP_MIX, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Horizontal_Gap_Over_Warning"))); verticalGapSpinner.getNextButton().addMouseListener(createMouseListener4GapNextButton(verticalGapSpinner, VERTICAL_GAP_MIX, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Vertical_Gap_Over_Warning"))); - - JPanel fontSizeTypePane = new JPanel(new BorderLayout(10, 0)); - fontSizeTypePane.add(fontSizeComboBox, BorderLayout.CENTER); - - //水印间距面板 - JPanel watermarkGapPane = new JPanel(new BorderLayout(10, 0)); - JPanel jp = FRGUIPaneFactory.createNColumnGridInnerContainer_Pane(2, 10, 0); - jp.add(horizontalGapSpinner); - jp.add(verticalGapSpinner); - watermarkGapPane.add(jp, BorderLayout.CENTER); - - JPanel watermarkGapTipsPane = new JPanel(new BorderLayout()); - JPanel tipsJp = FRGUIPaneFactory.createNColumnGridInnerContainer_Pane(2, 10, 0); - tipsJp.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Direction_Horizontal"), SwingConstants.CENTER)); - tipsJp.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Direction_Vertical"), SwingConstants.CENTER)); - watermarkGapTipsPane.add(tipsJp, BorderLayout.CENTER); - + //水印间距提示居中布局 + JPanel watermarkGapTipsPane = row(LayoutConstants.HGAP_LARGE, + flex(0.15), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Direction_Horizontal"))).weight(0.2), + flex(0.3), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Direction_Vertical"))).weight(0.2), + flex(0.15) + ).getComponent(); + //水印间距排列 + JPanel watermarkGapPane = column( + row(LayoutConstants.HGAP_LARGE, + cell(horizontalGapSpinner).weight(0.5), + cell(verticalGapSpinner).weight(0.5) + ), + cell(watermarkGapTipsPane) + ).getComponent(); + // 颜色选择器 colorPane = new NewColorSelectPane(false); - JPanel colorLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - colorLabelPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Text_Color")), BorderLayout.NORTH); - - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p, p}; - double[] columnSize = {p, MAX_WIDTH}; - - JPanel rightContentPane = TableLayoutHelper.createCommonTableLayoutPane(new JComponent[][]{ - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Watermark_Text")), formulaPane}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Font_Size")), fontSizeTypePane}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Watermark_Gap")), watermarkGapPane}, - {null, watermarkGapTipsPane}, - {colorLabelPane, colorPane}, - }, rowSize, columnSize, 10); - rightContentPane.setBorder(BorderFactory.createEmptyBorder(15, 12, 10, 12)); - - UIScrollPane configPane = new UIScrollPane(rightContentPane); - configPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Config"), null)); - return configPane; + // 配置面板排列布局 + JPanel rightContentPane = column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Watermark_Text"))).weight(0.3), cell(formulaPane).weight(0.7)), + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Font_Size"))).weight(0.3), cell(fontSizeComboBox).weight(0.7)), + row(cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Watermark_Gap"))).weight(0.3), cell(watermarkGapPane).weight(0.7)), + row(cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Text_Color"))).weight(0.3), cell(colorPane).weight(0.7)) + ).getComponent(); + rightContentPane.setOpaque(false); + return rightContentPane; + } + + private JPanel getTopAlignLabelPane(String labelText) { + return column(LayoutConstants.VERTICAL_GAP, cell(new UILabel(labelText))). + with(it -> it.setBorder(new ScaledEmptyBorder(2,0,0,0))).getComponent(); } protected void populateFontSize(int fontSize) { diff --git a/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java b/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java index f3de6eef96..da5ee01db7 100644 --- a/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java +++ b/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java @@ -20,7 +20,7 @@ public class WatermarkSettingPane extends AbstractTemplateServerSettingPane { } private void initComponents() { - buttonPane.setBorder(BorderFactory.createEmptyBorder(10, 8, 0, 0)); + //buttonPane.setBorder(BorderFactory.createEmptyBorder(10, 8, 0, 0)); } @Override diff --git a/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java b/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java index 48d6a5686e..901f1b6010 100644 --- a/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java +++ b/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java @@ -1,12 +1,12 @@ package com.fr.design.report.fit; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.report.fit.provider.FitAttrModelProvider; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.report.fit.ReportFitAttr; import javax.swing.*; @@ -17,6 +17,8 @@ import java.util.Comparator; import java.util.Set; import java.util.stream.Collectors; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; import static com.fr.design.i18n.Toolkit.i18nText; public abstract class BaseFitAttrPane extends BasicBeanPane { @@ -26,26 +28,23 @@ public abstract class BaseFitAttrPane extends BasicBeanPane { protected UIComboBox itemChoose; protected java.util.List fitAttrModelList = new ArrayList<>(); private ReportFitConfigPane fitConfigPane; - public FitAttrModel fitAttrModel; - private static final int BELOW_SET_COMPONENT_HSPACE = 8; - protected BaseFitAttrPane() { initFitAttrModel(); } private void initFitAttrModel() { + //旧决策报表 fitAttrModelList.add(new FrmFitAttrModel()); + //普通报表 fitAttrModelList.add(new CptFitAttrModel()); + //决策报表 fitAttrModelList.add(new AdaptiveFrmFitAttrModel()); - Set fitAttrModelProviders = ExtraDesignClassManager.getInstance().getArray(FitAttrModelProvider.XML_TAG); - for (FitAttrModelProvider fitAttrModelProvider : fitAttrModelProviders) { fitAttrModelList.add(fitAttrModelProvider); } - fitAttrModelList = fitAttrModelList.stream().sorted(Comparator.comparing(FitAttrModel::getPriority).reversed()).collect(Collectors.toList()); } @@ -55,6 +54,7 @@ public abstract class BaseFitAttrPane extends BasicBeanPane { contentJPanel.remove(fitConfigPane); } this.fitConfigPane = fitAttrModel instanceof CptFitAttrModel ? new ReportFitConfigPane(fitAttrModel, true) : new FormFitConfigPane(fitAttrModel, true); + //添加自适应面板 contentJPanel.add(fitConfigPane); } @@ -82,34 +82,33 @@ public abstract class BaseFitAttrPane extends BasicBeanPane { protected abstract String[] getItemNames(); protected void initComponents() { - this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - contentJPanel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(false, FlowLayout.LEFT, 0, 0); - this.add(contentJPanel); + //添加以下设置 initItemChoose(); + //服务器配置-PC端自适应属性面板中需要添加提示 initPrompt(); + this.setLayout(new BorderLayout()); + this.add(contentJPanel); } - + /** + * 以下设置Pane + */ private void initItemChoose() { - JPanel chooseJPanel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - ItemListener itemListener = getItemListener(); + belowSetLabel = new UILabel(i18nText("Fine-Design_Report_Blow_Set")); itemChoose = new UIComboBox(getItemNames()); + ItemListener itemListener = getItemListener(); itemChoose.addItemListener(itemListener); - belowSetLabel = new UILabel(i18nText("Fine-Design_Report_Blow_Set")); - JPanel hSpaceLabel = new JPanel(); - hSpaceLabel.setSize(BELOW_SET_COMPONENT_HSPACE, 0); - JPanel buttonPane = GUICoreUtils.createFlowPane(new Component[]{ - belowSetLabel, hSpaceLabel, itemChoose}, FlowLayout.LEFT); - chooseJPanel.add(buttonPane); - chooseJPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0)); - contentJPanel.add(chooseJPanel); + //以下设置横向布局 + JPanel buttonPane = row(20, cell(belowSetLabel), cell(itemChoose)).getComponent(); + buttonPane.setBorder(new ScaledEmptyBorder(0,5,5,0)); + //整体面板添加‘以下设置Pane’ + contentJPanel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(false, FlowLayout.LEFT, 0, 0); + contentJPanel.setBorder(new ScaledEmptyBorder(5,10,5,10)); + contentJPanel.add(buttonPane); } - protected abstract ItemListener getItemListener(); - public void populate(ReportFitAttr reportFitAttr) { } diff --git a/designer-base/src/main/java/com/fr/design/report/fit/FormFitConfigPane.java b/designer-base/src/main/java/com/fr/design/report/fit/FormFitConfigPane.java index d88a3a16eb..acd8ee1f73 100644 --- a/designer-base/src/main/java/com/fr/design/report/fit/FormFitConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/report/fit/FormFitConfigPane.java @@ -1,11 +1,12 @@ package com.fr.design.report.fit; +import com.fine.theme.utils.FineUIStyle; import com.fr.base.svg.SVGLoader; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.report.fit.menupane.FitRadioGroup; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; @@ -23,13 +24,16 @@ import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; + public class FormFitConfigPane extends ReportFitConfigPane { private static final int ICON_OFFSET_X = 25; private static final int ICON_OFFSET_Y = 3; private static final int ICON_SIZE = 16; + //待调整 private static final Image HOVER_IMAGE = SVGLoader.load("/com/fr/design/icon/icon_ec_default_fit.svg"); private static final int DEFAULT_ITEM = 0; - private static final int CUSTOM_ITEM = 1; public FormFitConfigPane(FitAttrModel fitAttrModel) { @@ -41,12 +45,11 @@ public class FormFitConfigPane extends ReportFitConfigPane { } protected JPanel initECConfigPane() { - JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + JPanel jPanel = new JPanel(new BorderLayout()); if (fitAttrModel.getFitTypeNames().length != 0) { Component[] ecComponents = new Component[fitAttrModel.getFitTypeNames().length + 1]; initRadioGroup(ecConfigRadioGroup, fitAttrModel.getFitName(), fitAttrModel.getFitTypeNames(), ecComponents); - jPanel.add(createSubAttrPane(ecComponents), BorderLayout.CENTER); - jPanel.add(createTipPane(), BorderLayout.SOUTH); + jPanel.add(column(10, cell(createSubAttrPane(ecComponents)), cell(createTipPane())).getComponent()); } return jPanel; } @@ -79,7 +82,6 @@ public class FormFitConfigPane extends ReportFitConfigPane { UIPopupMenu uiPopupMenu = new UIPopupMenu() { @Override protected void paintBorder(Graphics g) { - } }; uiPopupMenu.setLayout(new BorderLayout(0, 0)); @@ -107,7 +109,6 @@ public class FormFitConfigPane extends ReportFitConfigPane { } else { hidePreviewPane(); } - } }); } @@ -138,13 +139,12 @@ public class FormFitConfigPane extends ReportFitConfigPane { } private JPanel createTipPane() { - JPanel jPanel = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); + JPanel jPanel = new JPanel(new BorderLayout()); UILabel label1 = new UILabel(Toolkit.i18nText("Fine-Design_Form_PC_FIT_Config_Tip1")); - jPanel.add(label1); - label1.setForeground(Color.lightGray); + FineUIStyle.setStyle(label1, FineUIStyle.LABEL_TIP); UILabel label2 = new UILabel(Toolkit.i18nText("Fine-Design_Form_PC_FIT_Config_Tip2")); - jPanel.add(label2); - label2.setForeground(Color.lightGray); + FineUIStyle.setStyle(label2, FineUIStyle.LABEL_TIP); + jPanel.add(column(LayoutConstants.HORIZONTAL_GAP, cell(label1), cell(label2)).getComponent()); return jPanel; } @@ -159,5 +159,4 @@ public class FormFitConfigPane extends ReportFitConfigPane { protected void updateECConfigRadioGroup(ReportFitAttr reportFitAttr) { reportFitAttr.setFitStateInPC(ecConfigRadioGroup.getSelectRadioIndex()); } - } diff --git a/designer-base/src/main/java/com/fr/design/report/fit/NewFitPreviewPane.java b/designer-base/src/main/java/com/fr/design/report/fit/NewFitPreviewPane.java index 2bc69cedc7..36209972fc 100644 --- a/designer-base/src/main/java/com/fr/design/report/fit/NewFitPreviewPane.java +++ b/designer-base/src/main/java/com/fr/design/report/fit/NewFitPreviewPane.java @@ -1,5 +1,6 @@ package com.fr.design.report.fit; +import com.fine.theme.utils.FineUIScale; import com.fr.base.GraphHelper; import com.fr.general.FRFont; @@ -17,7 +18,7 @@ public class NewFitPreviewPane extends JPanel { private static final Color DEFAULT_PAINT_COLOR = Color.decode("#419BF9"); private static final int FIT_FONT_SIZE = 15; private static final int NO_FIT_FONT_SIZE = 10; - private static final Dimension NO_FIT_CONTAINER_DIMENSION = new Dimension(230, 80); + private static final Dimension NO_FIT_CONTAINER_DIMENSION = FineUIScale.scale(new Dimension(230, 80)); public NewFitPreviewPane(){ diff --git a/designer-base/src/main/java/com/fr/design/report/fit/ReportFitConfigPane.java b/designer-base/src/main/java/com/fr/design/report/fit/ReportFitConfigPane.java index 158089602f..20c2688392 100644 --- a/designer-base/src/main/java/com/fr/design/report/fit/ReportFitConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/report/fit/ReportFitConfigPane.java @@ -1,5 +1,6 @@ package com.fr.design.report.fit; +import com.fine.theme.utils.FineUIScale; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.DesignSizeI18nManager; @@ -10,15 +11,16 @@ import com.fr.design.report.fit.menupane.FontRadioGroup; import com.fr.general.ComparatorUtils; import com.fr.report.fit.ReportFitAttr; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; import static com.fr.design.i18n.Toolkit.i18nText; public class ReportFitConfigPane extends JPanel { @@ -36,21 +38,24 @@ public class ReportFitConfigPane extends JPanel { } private void initComponent() { - JPanel contentJPanel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(false, FlowLayout.LEFT, 0, 0); - this.add(contentJPanel); fontRadioGroup = new FontRadioGroup(); ecConfigRadioGroup = new FitRadioGroup(); - contentJPanel.add(initAttrJPanel()); - contentJPanel.add(initPreviewJPanel()); + this.add(initContentPanel()); } - private JPanel initAttrJPanel() { - JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + private JPanel initContentPanel() { + //字体 Component[] fontComponents = new Component[3]; initRadioGroup(fontRadioGroup, i18nText("Fine-Designer_Fit-Font"), new String[]{i18nText("Fine-Designer_Fit"), i18nText("Fine-Designer_Fit-No")}, fontComponents); - jPanel.add(createSubAttrPane(fontComponents), BorderLayout.NORTH); - jPanel.add(initECConfigPane(), BorderLayout.CENTER); - return jPanel; + //预览区域 + previewJPanel = new NewFitPreviewPane(); + previewJPanel.setPreferredSize(FineUIScale.scale(new Dimension(300, 204))); + //面板布局 字体-(null/报表块/表格)-预览区域 + return column(10, + cell(createSubAttrPane(fontComponents)), + cell(initECConfigPane()), + cell(previewJPanel) + ).getComponent(); } protected JPanel initECConfigPane() { @@ -61,21 +66,14 @@ public class ReportFitConfigPane extends JPanel { return jPanel; } - protected JPanel createSubAttrPane(Component[] components) { double[] rowSize = new double[]{20}; double[] columnSize = new double[components.length]; - for (int i = 0; i < columnSize.length; i++) { - if (i == 0) { - columnSize[i] = DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.fit.firstColumn").getWidth(); - } else { - columnSize[i] = DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.fit.column").getWidth(); - } + for (int i = 1; i < columnSize.length; i++) { + columnSize[i] = DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.fit.column").getWidth(); } - JPanel attrJPanel = TableLayoutHelper.createTableLayoutPane(new Component[][]{components}, rowSize, columnSize); - attrJPanel.setBorder(BorderFactory.createEmptyBorder(5, 0, 10, 0)); - return attrJPanel; + return row(cell(components[0]).weight(0.16),cell(attrJPanel).weight(0.84)).getComponent(); } protected void initRadioGroup(FitRadioGroup fitRadioGroup, String name, String[] options, Component[] components) { @@ -110,17 +108,6 @@ public class ReportFitConfigPane extends JPanel { previewJPanel.refreshPreview(fontRadioGroup.isFontFit(), FitType.parse(updateBean())); } - private JPanel initPreviewJPanel() { - JPanel wrapperPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - previewJPanel = new NewFitPreviewPane(); - wrapperPane.add(previewJPanel, BorderLayout.CENTER); - int leftIndent = globalConfig ? (int) DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.fit.firstColumn").getWidth() : 0; - wrapperPane.setBorder(BorderFactory.createEmptyBorder(0, leftIndent, 0, 0)); - wrapperPane.setPreferredSize(new Dimension(300 + leftIndent, 204)); - return wrapperPane; - } - - public void populateBean(ReportFitAttr ob) { fontRadioGroup.selectIndexButton(ob.isFitFont() ? 0 : 1); populateECConfigRadioGroup(ob.fitStateInPC()); diff --git a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java index 91661301f1..ba1c377965 100644 --- a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java @@ -16,6 +16,7 @@ import com.fr.data.util.function.SumFunction; import com.fr.design.actions.UpdateAction; import com.fr.design.actions.core.ActionFactory; import com.fr.design.border.UITitledBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.fun.DefaultValueAdjustProvider; import com.fr.design.gui.ibutton.UIButton; @@ -90,6 +91,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; + // Noninstantiable utility class public final class GUICoreUtils { @@ -992,12 +996,7 @@ public final class GUICoreUtils { dynamicPane.setVisible(e.getStateChange() == visibleState); } }); - JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - panel.add(checkBox, BorderLayout.NORTH); - JPanel dynamicPaneWrapper = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - dynamicPaneWrapper.add(dynamicPane); - panel.add(dynamicPaneWrapper, BorderLayout.CENTER); - return panel; + return column(LayoutConstants.VERTICAL_GAP, cell(checkBox), cell(dynamicPane)).getComponent(); } /** diff --git a/designer-base/src/main/java/com/fr/design/widget/IconDefinePane.java b/designer-base/src/main/java/com/fr/design/widget/IconDefinePane.java index 69805979ba..cface962b6 100644 --- a/designer-base/src/main/java/com/fr/design/widget/IconDefinePane.java +++ b/designer-base/src/main/java/com/fr/design/widget/IconDefinePane.java @@ -1,40 +1,38 @@ package com.fr.design.widget; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; import com.fr.design.web.CustomIconPane; import com.fr.form.ui.WidgetInfoConfig; - -import javax.swing.*; -import java.awt.*; +import javax.swing.Icon; +import javax.swing.JPanel; +import javax.swing.ImageIcon; +import java.awt.Image; +import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + public class IconDefinePane extends BasicPane { private UILabel showIconImageLable; private UIButton editIconButton; private UIButton removeIconButton; private String curIconName; + private Icon curIcon; public IconDefinePane() { - JPanel iconPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - JPanel labelPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - labelPane.setLayout(new /**/ FlowLayout(FlowLayout.LEFT, 20, 0)); showIconImageLable = new UILabel(); - showIconImageLable.setPreferredSize(new Dimension(20, 20)); editIconButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit")); - JPanel iconButtonPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - labelPane.add(showIconImageLable); - iconPane.add(labelPane, BorderLayout.WEST); - iconPane.add(iconButtonPane, BorderLayout.EAST); - iconButtonPane.add(editIconButton); editIconButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -54,7 +52,6 @@ public class IconDefinePane extends BasicPane { }); removeIconButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Delete")); - iconButtonPane.add(removeIconButton); removeIconButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { curIconName = null; @@ -62,9 +59,10 @@ public class IconDefinePane extends BasicPane { } }); - this.add(this.showIconImageLable); - this.add(this.editIconButton); - this.add(this.removeIconButton); + JPanel iconButtonPane = row(LayoutConstants.HORIZONTAL_GAP, cell(this.showIconImageLable), cell(this.editIconButton), cell(this.removeIconButton)).getComponent(); + iconButtonPane.setBorder(new ScaledEmptyBorder(0,0,0,0)); + this.setLayout(new BorderLayout()); + this.add(iconButtonPane, BorderLayout.CENTER); } @Override @@ -86,6 +84,16 @@ public class IconDefinePane extends BasicPane { setShowIconImage(); } + /** + * 直接更新icon + * @param iconName + * @param icon + */ + public void populateIcon(String iconName, Icon icon) { + this.curIconName = iconName; + showIconImageLable.setIcon(icon); + } + public String update() { return this.curIconName; } diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/clearStash.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/clearStash.svg new file mode 100644 index 0000000000..1c1214522d --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/clearStash.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/clearStash_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/clearStash_disable.svg new file mode 100644 index 0000000000..6d62bdb21a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/clearStash_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/customButton.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/customButton.svg new file mode 100644 index 0000000000..af4281adf2 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/customButton.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/customButton_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/customButton_disable.svg new file mode 100644 index 0000000000..28c9902293 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/customButton_disable.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/dataVerify.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/dataVerify.svg new file mode 100644 index 0000000000..6cfda99d8a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/dataVerify.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/dataVerify_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/dataVerify_disable.svg new file mode 100644 index 0000000000..6672c764ea --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/dataVerify_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/email.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/email.svg new file mode 100644 index 0000000000..13b48174b7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/email.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/email_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/email_disable.svg new file mode 100644 index 0000000000..74499db085 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/email_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up.svg index 1da5e45a17..df2a4fcb0a 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up.svg @@ -1,3 +1,10 @@ - - + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up_disable.svg index cae74fbe52..2b6c72634e 100644 --- a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/move_up_disable.svg @@ -1,3 +1,10 @@ - - + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_first.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_first.svg new file mode 100644 index 0000000000..ac5c1f0c12 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_first.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_first_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_first_disable.svg new file mode 100644 index 0000000000..f7e6a77895 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_first_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_last.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_last.svg new file mode 100644 index 0000000000..7f14b98388 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_last.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_last_disbale.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_last_disbale.svg new file mode 100644 index 0000000000..80384418da --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_last_disbale.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_navi.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_navi.svg new file mode 100644 index 0000000000..afc2ecb557 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_navi.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_navi_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_navi_disable.svg new file mode 100644 index 0000000000..365e6dc5fa --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_navi_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_next.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_next.svg new file mode 100644 index 0000000000..12c49708d8 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_next.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_next_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_next_disable.svg new file mode 100644 index 0000000000..f1ac806195 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_next_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_previous.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_previous.svg new file mode 100644 index 0000000000..37df1e9546 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_previous.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_previous_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_previous_disable.svg new file mode 100644 index 0000000000..e53a285ed6 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/page_previous_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printApplet.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printApplet.svg new file mode 100644 index 0000000000..ddf8873655 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printApplet.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printApplet_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printApplet_disable.svg new file mode 100644 index 0000000000..4dd13115b8 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printApplet_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPdf.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPdf.svg new file mode 100644 index 0000000000..405640d101 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPdf.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPdf_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPdf_disable.svg new file mode 100644 index 0000000000..0044218667 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPdf_disable.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPreview.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPreview.svg new file mode 100644 index 0000000000..479384b117 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPreview.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPreview_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPreview_disable.svg new file mode 100644 index 0000000000..b3b7dce3df --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printPreview_disable.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printerOffset.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printerOffset.svg new file mode 100644 index 0000000000..90d01097be --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printerOffset.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printerOffset_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printerOffset_disable.svg new file mode 100644 index 0000000000..0eb451e6f1 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/printerOffset_disable.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/scale.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/scale.svg new file mode 100644 index 0000000000..fd9b1ba386 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/scale.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/toolbar/scale_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/scale_disable.svg new file mode 100644 index 0000000000..d51fced4d0 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/toolbar/scale_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json b/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json index 4e3213695b..cfcdb3c99a 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json @@ -179,7 +179,12 @@ "reportFit": "toolbar/reportFit.svg", "mobileAttr": "toolbar/mobileAttr.svg", "watermark": "toolbar/watermark.svg", + "dataVerify": "toolbar/dataVerify.svg", + "clearStash": "toolbar/clearStash.svg", "print": "toolbar/print.svg", + "printPdf": "toolbar/printPdf.svg", + "printApplet": "toolbar/printApplet.svg", + "printPreview": "toolbar/printPreview.svg", "pageSetup": "toolbar/pageSetup.svg", "reportHeader": "toolbar/reportHeader.svg", "reportFooter": "toolbar/reportFooter.svg", @@ -215,6 +220,15 @@ "workOrderCenter": "toolbar/workOrderCenter.svg", "actCenter": "toolbar/actCenter.svg", "sign": "toolbar/sign.svg", + "page_first": "toolbar/page_first.svg", + "page_next": "toolbar/page_next.svg", + "page_previous": "toolbar/page_previous.svg", + "page_last": "toolbar/page_last.svg", + "page_navi": "toolbar/page_navi.svg", + "email": "toolbar/email.svg", + "scale": "toolbar/scale.svg", + "printerOffset": "toolbar/printerOffset.svg", + "customButton": "toolbar/customButton.svg", "cellelement_small": "cellelement.svg", "forbid": "expand/forbid.svg", "horizontal_expand": "expand/horizontal.svg", diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index d20add6df5..1274335f8b 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -399,6 +399,7 @@ Label.tipColor = @BrandTipColor Label.borderColor = $defaultBorderColor Label.hyperLinkColor = #2576EF Label.strongHintColor = #FF0000 +Label.warningColor = #F1393C #---- HelpButton ---- @@ -1305,6 +1306,9 @@ CellOtherSetPane.height=$Component.defaultHeight [style]Label.tipLabel = \ foreground: $Label.tipColor +[style]Label.warningTipLabel = \ + foreground: $Label.warningColor + [style]Button.plainButton = \ border: null; \ background: null; \ diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties index 2a10d13c7f..e69042470d 100644 --- a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties +++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties @@ -9,7 +9,7 @@ com.fr.design.version.detail.label=450*30 com.fr.design.version.detail.dialog=600*500 com.fr.env.SyncFailedPluginsDialog.messageWithLink=316*20 com.fr.design.web.pane.text.field=450*20 -com.fr.design.actions.server.dialog=700*630 +com.fr.design.actions.server.dialog=660*600 com.fr.design.report.fit.templatePane.dialog=600*400 com.fr.design.report.fit.firstColumn=80*20 com.fr.design.report.fit.column=100*20 @@ -22,7 +22,7 @@ com.fr.design.ds.column.sort.pane=220*150 com.fr.design.sort.expand.header.pane=108*10 com.fr.design.plugin.remind.PluginInvalidateRemindDialog.dialog=600*500 com.fr.design.plugin.remind.PluginInvalidateRemindDialog.centerPane=580*369 -com.fr.design.report.WatermarkSettingPane=720*600 +com.fr.design.report.WatermarkSettingPane=660*600 com.fr.design.file.MultiTemplateTabPane.popUpMenu=170*65 com.fr.design.formula.FormulaPane=900*600 com.fr.design.formula.FormulaPaneWhenReserveFormula=900*600 diff --git a/designer-realize/src/main/java/com/fr/design/javascript/ListenerEditPane.java b/designer-realize/src/main/java/com/fr/design/javascript/ListenerEditPane.java index 0567078968..8c27cff970 100644 --- a/designer-realize/src/main/java/com/fr/design/javascript/ListenerEditPane.java +++ b/designer-realize/src/main/java/com/fr/design/javascript/ListenerEditPane.java @@ -12,7 +12,6 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.write.submit.DBManipulationPane; import com.fr.form.event.Listener; import com.fr.js.JavaScript; @@ -23,8 +22,6 @@ import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.CardLayout; -import java.awt.Component; -import java.awt.FlowLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.ArrayList; @@ -32,6 +29,11 @@ import java.util.Arrays; import java.util.List; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + public class ListenerEditPane extends BasicBeanPane { private UITextField nameText; private UIComboBox styleBox; @@ -66,10 +68,10 @@ public class ListenerEditPane extends BasicBeanPane { public void initComponents(String[] defaultArgs) { cards = new ArrayList<>(); this.setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel namePane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); nameText = new UITextField(8); nameText.setEditable(false); - namePane.add(nameText, BorderLayout.WEST); final List style = new ArrayList<>(Arrays.asList(JS, DBCOMMIT, CUSTOMACTION, EMAIL, MOBILEPOPUP)); styleBox = new UIComboBox(style.toArray()); boolean workbook = DesignerContext.getDesignerFrame().getSelectedJTemplate().isJWorkBook(); @@ -77,15 +79,13 @@ public class ListenerEditPane extends BasicBeanPane { style.add(EXPORT); } styleBox = new UIComboBox(style.toArray()); - namePane.add(styleBox); - namePane = GUICoreUtils.createFlowPane(new Component[]{ - new UILabel(" " + Toolkit.i18nText("Fine-Design_Report_Event_Name") + ":"), - nameText, - new UILabel(" " + Toolkit.i18nText("Fine-Design_Report_Event_Type") + ":"), - styleBox}, - FlowLayout.LEFT); - namePane.setBorder(BorderFactory.createTitledBorder(Toolkit.i18nText("Fine-Design_Report_Event_Name_Type"))); - this.add(namePane, BorderLayout.NORTH); + + JPanel eventName = row(10, cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event_Name"))), cell(nameText)).getComponent(); + JPanel eventType = row(10, cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event_Type"))), cell(styleBox)).getComponent(); + namePane = row(cell(eventName).weight(0.3), cell(eventType).weight(0.4), flex(0.3)).getComponent(); + + this.add(wrapComponentWithTitle(namePane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event_Name_Type")), BorderLayout.NORTH); + card = new CardLayout(); hyperlinkPane = FRGUIPaneFactory.createCardLayout_S_Pane(); hyperlinkPane.setLayout(card); diff --git a/designer-realize/src/main/java/com/fr/design/report/ExcelExportPane.java b/designer-realize/src/main/java/com/fr/design/report/ExcelExportPane.java index e00b5e22a4..967816998c 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ExcelExportPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ExcelExportPane.java @@ -1,6 +1,9 @@ package com.fr.design.report; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIRadioButton; @@ -14,14 +17,18 @@ import com.fr.io.attr.ExcelExportAttr; import com.fr.stable.StringUtils; import javax.swing.AbstractButton; -import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JPanel; -import java.awt.Color; -import java.awt.Dimension; +import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + public class ExcelExportPane extends BasicPane { private UICheckBox isExportHidedRow; private UICheckBox isExportHidenColumn; @@ -48,81 +55,52 @@ public class ExcelExportPane extends BasicPane { } protected void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - JPanel outPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane("Excel" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportD_Excel_Export")); - JPanel outNorthPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Export_Setting")); - outNorthPane.setPreferredSize(new Dimension(580, 85)); - this.add(outPane); - outPane.add(outNorthPane); + this.setLayout(new BorderLayout()); isExportHidedRow = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportD_Export_Hided_Row")); isExportHidedRow.setSelected(false); - outNorthPane.add(isExportHidedRow); isExportHidenColumn = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportD_Export_Hided_Column")); isExportHidenColumn.setSelected(false); - outNorthPane.add(isExportHidenColumn); - // 内容保护 - JPanel outSouthPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Export_Content_Protect")); - outSouthPane.setPreferredSize(new Dimension(580, 280)); - outPane.add(outSouthPane); + JPanel exportSettingPane = column(LayoutConstants.VERTICAL_GAP, row(cell(isExportHidedRow)), row(cell(isExportHidenColumn))).getComponent(); + // 文件保护 fileProtect = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Export_File_Protect"), false); - outSouthPane.add(fileProtect); // 文件密码和密码框 passwordWritePane = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); - JPanel passwordWriteFlowPane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); UILabel filePassword = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_File_Password")); - passwordWriteFlowPane.add(filePassword); passwordField = new UITextField(11); - passwordWriteFlowPane.add(passwordField); - passwordWritePane.add(passwordWriteFlowPane); fileProtect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - if (fileProtect.isSelected()) { - passwordWritePane.setVisible(true); - } else { - passwordWritePane.setVisible(false); - } + passwordWritePane.setVisible(fileProtect.isSelected()); } - }); - outSouthPane.add(passwordWritePane); + passwordWritePane.add(row(cell(filePassword), fix(5), cell(passwordField)) + .with(it->it.setBorder(new ScaledEmptyBorder(0,20,0,0))).getComponent()); + // 编辑保护 writeProtect = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Export_Write_Protect"), false); - outSouthPane.add(writeProtect); // 编辑保护勾选后展示的内容 writeProtectPane = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); - outSouthPane.add(writeProtectPane); // 工作表密码 workbookPassword = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sheet_Password"), true); - JPanel protectedWordPane =FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); protectedField = new UITextField(11); - protectedWordPane.add(workbookPassword); - protectedWordPane.add(protectedField); + // 仅限预览 onlyForPreview = new UIRadioButton(Toolkit.i18nText("Fine-Design_Report_Export_Only_For_Preview")); - JPanel onlyForPreviewPane =FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); - onlyForPreviewPane.add(onlyForPreview); wrapButtonsInButtonGroup(workbookPassword, onlyForPreview); - writeProtectPane.add(protectedWordPane); - writeProtectPane.add(onlyForPreviewPane); + writeProtectPane.add(column(LayoutConstants.VERTICAL_GAP, + row(cell(workbookPassword), fix(5), cell(protectedField)), + row(cell(onlyForPreview)) + ).with(it-> it.setBorder(new ScaledEmptyBorder(0,20,0,0) )).getComponent()); writeProtect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - if (writeProtect.isSelected()) { - writeProtectPane.setVisible(true); - } else { - writeProtectPane.setVisible(false); - } + writeProtectPane.setVisible(writeProtect.isSelected()); } }); // 导出水印 exportWaterMark = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Export_WaterMark"), false); - outSouthPane.add(exportWaterMark); - - JPanel tips = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(5, 5, 0); UILabel uiLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Export_WaterMark_Tips")); - uiLabel.setForeground(Color.GRAY); + FineUIStyle.setStyle(uiLabel, FineUIStyle.LABEL_TIP); ActionLabel actionLabel = new ActionLabel(Toolkit.i18nText("Fine-Design_Report_Export_WaterMark_Use"), UIConstants.FLESH_BLUE); actionLabel.addActionListener(new ActionListener() { @Override @@ -133,10 +111,31 @@ public class ExcelExportPane extends BasicPane { exportWaterMark.setSelected(true); } }); - tips.add(uiLabel); - tips.add(actionLabel); - outSouthPane.add(tips); + //内容保护 + JPanel contextProtectPane = column(LayoutConstants.VERTICAL_GAP, + cell(fileProtect), + cell(passwordWritePane), + cell(writeProtect), + cell(writeProtectPane), + cell(exportWaterMark), + row(cell(uiLabel), cell(actionLabel)) + ).getComponent(); + + JPanel centerPanel = column(LayoutConstants.VERTICAL_GAP, + row(20, + cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Setting"))), + cell(exportSettingPane).weight(1) + ), + row(20, + cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Content_Protect"))), + cell(contextProtectPane).weight(1) + ) + ).getComponent(); + this.add(wrapComponentWithTitle(centerPanel, "Excel" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportD_Excel_Export"))); + } + private JPanel getTopAlignLabelPane(String labelText) { + return column(LayoutConstants.VERTICAL_GAP, cell(new UILabel(labelText))).with(it-> it.setBorder(new ScaledEmptyBorder(2,0,0,0))).getComponent(); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java b/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java index 9c07bd157b..32963f1d10 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java @@ -1,17 +1,18 @@ package com.fr.design.report; +import com.fine.theme.utils.FineUIUtils; import com.fr.base.CustomConfig; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.io.attr.ReportExportAttr; import com.fr.transaction.Configurations; import com.fr.transaction.WorkerFacade; -import javax.swing.BorderFactory; -import javax.swing.JPanel; +import java.awt.BorderLayout; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; /** * 通用 @@ -38,17 +39,15 @@ public class ExportUniversalPane extends BasicPane { private UICheckBox passwordSupportFormula; public ExportUniversalPane() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - JPanel outerNorthPane = FRGUIPaneFactory.createTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Universal_Export_Config")); - JPanel northPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - JPanel passwordSupportPane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); + this.setLayout(new BorderLayout()); passwordSupportFormula = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Universal_Export_Password_Support_Formula")); passwordSupportFormula.setSelected(false); - passwordSupportPane.add(passwordSupportFormula); - northPane.add(passwordSupportPane); - outerNorthPane.add(northPane); - this.add(outerNorthPane); + + this.add( + FineUIUtils.wrapComponentWithTitle((column(10, + cell(passwordSupportFormula) + ).getComponent()), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Universal_Export_Config"))); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/report/ImageExportPane.java b/designer-realize/src/main/java/com/fr/design/report/ImageExportPane.java index ba4eccb63a..0e1e8fe76a 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ImageExportPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ImageExportPane.java @@ -1,23 +1,26 @@ package com.fr.design.report; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.extension.FileExtension; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.io.attr.ImageExportAttr; import com.fr.io.attr.ReportExportAttr; import javax.swing.AbstractButton; -import javax.swing.BorderFactory; import javax.swing.ButtonGroup; -import javax.swing.JComponent; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; +import java.awt.Component; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; /** * 导出图片配置 @@ -49,40 +52,37 @@ public class ImageExportPane extends AbstractExportPane { public static final String GLOBAL_CONF = Toolkit.i18nText("Fine-Design_Image_Export_Setting"); public ImageExportPane() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - JPanel globalTitlePane = FRGUIPaneFactory.createTitledBorderPane(GLOBAL_CONF); - JPanel outNorthPane = FRGUIPaneFactory.createTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Export_Setting")); - outNorthPane.setPreferredSize(new Dimension(580, 230)); + this.setLayout(new BorderLayout()); UILabel tipLabel = new UILabel(Toolkit.i18nText("Fine-Design_Image_Export_Tips")); - tipLabel.setForeground(Color.GRAY); - JPanel tipsTitlePane = new JPanel(); - tipsTitlePane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); - tipsTitlePane.setLayout(FRGUIPaneFactory.createBorderLayout()); - tipsTitlePane.add(tipLabel); - this.add(globalTitlePane); - globalTitlePane.add(outNorthPane); + FineUIStyle.setStyle(tipLabel, FineUIStyle.LABEL_TIP); initGlobalSettings(); - - JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - JComponent[][] comps = { - {new UILabel(Toolkit.i18nText("Fine-Design_Image_Export_Resolution") + ":"), this.globalResolutionBtnS, this.globalResolutionBtnM, this.globalResolutionBtnL}, - {new UILabel(Toolkit.i18nText("Fine-Design_Report_Format") + ":"), this.globalFormatJpg, null, this.globalFormatPng}, - {new UILabel(Toolkit.i18nText("Fine-Design_Image_Export_Rendering_Quality") + ":"), this.globalRenderQuality, null, this.globalRenderSpeed}, - {new UILabel(Toolkit.i18nText("Fine-Design_Image_Export_Typesetting") + ":"), this.templateThumbnail, null, this.templatePaging} - }; - centerPane.add( - TableLayoutHelper.createCommonTableLayoutPane( - comps, - new double[]{TableLayout.FILL, TableLayout.FILL, TableLayout.FILL, TableLayout.FILL}, - new double[]{TableLayout.FILL, TableLayout.FILL, TableLayout.FILL, TableLayout.FILL}, - GAP), - BorderLayout.CENTER); - centerPane.add(tipsTitlePane,BorderLayout.SOUTH); - outNorthPane.add(centerPane, BorderLayout.CENTER); + Component centerPane = column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel(Toolkit.i18nText("Fine-Design_Image_Export_Resolution") + ":")).weight(0.4), + cell(this.globalResolutionBtnS).weight(0.4), + cell(this.globalResolutionBtnM).weight(0.4), + cell(this.globalResolutionBtnL).weight(0.4), + flex()), + row(cell(new UILabel(Toolkit.i18nText("Fine-Design_Report_Format") + ":")).weight(0.4), + cell(this.globalFormatJpg).weight(0.8), + cell(this.globalFormatPng).weight(0.4), + flex()), + row(cell(new UILabel(Toolkit.i18nText("Fine-Design_Image_Export_Rendering_Quality") + ":")).weight(0.4), + cell(this.globalRenderQuality).weight(0.8), + cell(this.globalRenderSpeed).weight(0.4), + flex()), + row(cell(new UILabel(Toolkit.i18nText("Fine-Design_Image_Export_Typesetting") + ":")).weight(0.4), + cell(this.templateThumbnail).weight(0.8), + cell(this.templatePaging).weight(0.4), + flex()), + cell(tipLabel) + ).getComponent(); + + this.add(wrapComponentWithTitle( + row(GAP, cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Setting"))), + cell(centerPane).weight(1) + ).getComponent(), com.fr.design.i18n.Toolkit.i18nText(GLOBAL_CONF))); } - private void initGlobalSettings() { globalResolutionBtnS = new UIRadioButton("96dpi"); globalResolutionBtnM = new UIRadioButton("192dpi", true); @@ -111,6 +111,10 @@ public class ImageExportPane extends AbstractExportPane { } } + private JPanel getTopAlignLabelPane(String labelText) { + return column(LayoutConstants.VERTICAL_GAP, cell(new UILabel(labelText))).with(it-> it.setBorder(new ScaledEmptyBorder(2,0,0,0))).getComponent(); + } + /** * 展示界面 */ diff --git a/designer-realize/src/main/java/com/fr/design/report/PDFExportPane.java b/designer-realize/src/main/java/com/fr/design/report/PDFExportPane.java index f8e5767478..2784511bae 100644 --- a/designer-realize/src/main/java/com/fr/design/report/PDFExportPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/PDFExportPane.java @@ -1,20 +1,23 @@ package com.fr.design.report; - import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.io.attr.PDFExportAttr; import com.fr.stable.StringUtils; -import javax.swing.BorderFactory; import javax.swing.JPanel; -import java.awt.Dimension; +import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + public class PDFExportPane extends BasicPane { private UICheckBox isNeedPassword; private UITextField passwordField; @@ -25,20 +28,9 @@ public class PDFExportPane extends BasicPane { } protected void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - JPanel outPane =FRGUIPaneFactory.createTopVerticalTitledBorderPane("PDF" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportD_Excel_Export")); - this.add(outPane); - // 内容保护 - JPanel outNorthPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Export_Content_Protect")); - outNorthPane.setPreferredSize(new Dimension(580, 100)); - outPane.add(outNorthPane); - + this.setLayout(new BorderLayout()); isNeedPassword = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_File_Password"), false); - JPanel passwordPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - passwordPane.add(isNeedPassword); - passwordWritePane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - passwordPane.add(passwordWritePane); + passwordWritePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); passwordField = new UITextField(11); passwordWritePane.add(passwordField); isNeedPassword.addActionListener(new ActionListener() { @@ -46,8 +38,12 @@ public class PDFExportPane extends BasicPane { passwordWritePane.setVisible(isNeedPassword.isSelected()); } }); - outNorthPane.add(passwordPane); - } + JPanel contextProtectPane = row(20, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Content_Protect"))), + row(cell(isNeedPassword), fix(5), cell(passwordWritePane)) + ).getComponent(); + this.add(wrapComponentWithTitle(contextProtectPane, "PDF" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportD_Excel_Export"))); + } @Override protected String title4PopupWindow() { diff --git a/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java b/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java index 3074bb009a..ef4c2966b7 100644 --- a/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java @@ -19,12 +19,18 @@ import java.awt.event.FocusEvent; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; -import javax.swing.*; - -import com.fr.design.gui.ispinner.ColumnRowSpinner; +import javax.swing.Icon; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.ButtonGroup; +import javax.swing.JSpinner; +import javax.swing.SpinnerNumberModel; +import javax.swing.JFormattedTextField; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.gui.frpane.FineTabbedPane; import com.fr.page.PaperSettingProvider; import com.fr.page.ReportSettingsProvider; -import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; @@ -59,6 +65,13 @@ import com.fr.stable.unit.INCH; import com.fr.stable.unit.MM; import com.fr.design.utils.gui.GUICoreUtils; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + /** * @author richer * @since 6.5.5 创建于2011-6-14 页面设置面板 @@ -74,14 +87,12 @@ public class PageSetupPane extends BasicPane { } private void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - UITabbedPane centerTabbedPane = new UITabbedPane(); - this.add(centerTabbedPane, BorderLayout.CENTER); - + this.setLayout(new BorderLayout()); pagePane = new PagePane(); otherPane = new OtherPane(); - centerTabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Page"), pagePane); - centerTabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Other"), otherPane); + FineTabbedPane tabbedPane = FineTabbedPane.builder().addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Page"), pagePane) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Other"), otherPane).build(); + this.add(tabbedPane, BorderLayout.CENTER); } @Override @@ -149,61 +160,39 @@ public class PageSetupPane extends BasicPane { private Report report; public PagePane() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - - JPanel defaultPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - this.add(defaultPane, BorderLayout.NORTH); - JPanel twoPane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); - twoPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - JPanel orientationPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Page_Setup_Orientation")); - JPanel innerorientationPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - orientationPane.add(innerorientationPane); - twoPane.add(orientationPane); - - JPanel portraitpanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + this.setLayout(new BorderLayout()); + + //方向 portraitRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Portrait")); portraitRadioButton.setMnemonic('t'); - portraitpanel.add(portraitRadioButton); - innerorientationPane.add(portraitpanel); portraitRadioButton.addActionListener(previewListener); - - JPanel landscapepanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); landscapeRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Landscape")); - innerorientationPane.add(landscapepanel); landscapeRadioButton.setMnemonic('L'); - landscapepanel.add(landscapeRadioButton); landscapeRadioButton.addActionListener(previewListener); ButtonGroup layoutButtonGroup = new ButtonGroup(); layoutButtonGroup.add(portraitRadioButton); layoutButtonGroup.add(landscapeRadioButton); - portraitRadioButton.setSelected(true); + JPanel orientationPane = column(LayoutConstants.VERTICAL_GAP, cell(portraitRadioButton), cell(landscapeRadioButton)).getComponent(); - JPanel spp = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview")); showPagePane = new ShowPagePane(); - spp.add(showPagePane); - defaultPane.add(spp); - defaultPane.add(twoPane); + Component spp = wrapComponentWithTitle( + row(cell(showPagePane), + flex()).getComponent(), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview") + ); // paper size - JPanel paperSizePane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Paper_Size")); - JPanel innerpaperSizePane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - paperSizePane.add(innerpaperSizePane); - defaultPane.add(paperSizePane); - - - predefinedRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Predefined") + ":"); + predefinedRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Predefined")); predefinedRadioButton.setMnemonic('P'); predefinedRadioButton.addActionListener(previewListener); - - customRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Custom") + ":"); + customRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Custom")); customRadioButton.setMnemonic('C'); customRadioButton.addActionListener(previewListener); predefinedComboBox = new UIComboBox(); - paperWidthSpinner = new UIBasicSpinner(new SpinnerNumberModel(0.0, 0.0, Double.MAX_VALUE, 1.0)); ((JSpinner.DefaultEditor) paperWidthSpinner.getEditor()).getTextField().setColumns(7); paperHeightSpinner = new UIBasicSpinner(new SpinnerNumberModel(0.0, 0.0, Double.MAX_VALUE, 1.0)); @@ -214,7 +203,6 @@ public class PageSetupPane extends BasicPane { txt = ((JSpinner.NumberEditor) paperHeightSpinner.getEditor()).getTextField(); ((NumberFormatter) txt.getFormatter()).setAllowsInvalid(false); - unitLabel = new UnitFieldPane.UnitLabel(Constants.UNIT_MM, paperHeightSpinner.getPreferredSize().height); String[] inch = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unit_MM"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unit_INCH")}; @@ -238,35 +226,28 @@ public class PageSetupPane extends BasicPane { Object[] tmpPaperSizeNameArray = ReportConstants.PaperSizeNameSizeArray[i]; predefinedComboBox.addItem(tmpPaperSizeNameArray[1]); } - - // tow radio buttons. - JPanel radioButtonPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - innerpaperSizePane.add(radioButtonPane); - - radioButtonPane.add(predefinedRadioButton); - radioButtonPane.add(predefinedComboBox); - ButtonGroup paperSizeRadioButtonGroup = new ButtonGroup(); paperSizeRadioButtonGroup.add(predefinedRadioButton); paperSizeRadioButtonGroup.add(customRadioButton); - // size and textfields. - JPanel paperSizeRightPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - innerpaperSizePane.add(paperSizeRightPane); - - paperSizeRightPane.add(customRadioButton); - paperSizeRightPane.add(paperWidthSpinner); - paperSizeRightPane.add(new UILabel("x")); - paperSizeRightPane.add(paperHeightSpinner); - paperSizeRightPane.add(switchInch); - + // tow radio buttons. + JPanel innerPaperSizePane = column(10, + row(10, cell(predefinedRadioButton), cell(predefinedComboBox).weight(0.8), flex()), + row(cell(customRadioButton), + fix(10), + cell(paperWidthSpinner).weight(0.4), + fix(5), + cell(new UILabel("x")), + fix(5), + cell(paperHeightSpinner).weight(0.4), + fix(5), + cell(switchInch).weight(0.4), + flex() + ) + ).getComponent(); + Component paperSizePane = wrapComponentWithTitle(innerPaperSizePane,com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Paper_Size")); // peter:设置边距.. - JPanel outermarginPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Margin")); - JPanel marginPane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_M_Pane(); - outermarginPane.add(marginPane); - twoPane.add(outermarginPane); - StringBuffer temp = new StringBuffer(); for (int i = 0; i < 11; i++) { temp.append(" "); @@ -275,70 +256,50 @@ public class PageSetupPane extends BasicPane { zeroMarginWarn.setForeground(Color.RED); // left - JPanel marginLeftPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - marginPane.add(marginLeftPane); - - JPanel marginLeftTextPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - marginLeftPane.add(marginLeftTextPane); - marginLeftTextPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Top_Duplicate") + ":")); marginTopUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - marginLeftTextPane.add(marginTopUnitFieldPane); - JPanel marginLeftUnitPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - marginLeftPane.add(marginLeftUnitPane); - marginLeftUnitPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bottom") + ":")); marginBottomUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - marginLeftUnitPane.add(marginBottomUnitFieldPane); - - // right - JPanel marginRightPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - marginPane.add(marginRightPane); + JPanel marginLeftPane = column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Top_Duplicate") + ":")), cell(marginTopUnitFieldPane)), + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bottom") + ":")), cell(marginBottomUnitFieldPane)) + ).getComponent(); // peter:这个一个垂直的上下的字符panel. - JPanel marginRightTextPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - marginRightPane.add(marginRightTextPane); - marginRightTextPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Left") + ":")); marginLeftUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - marginRightTextPane.add(marginLeftUnitFieldPane); - - JPanel marginRightUnitPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - marginRightPane.add(marginRightUnitPane); - marginRightUnitPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Right") + ":")); marginRightUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - marginRightUnitPane.add(marginRightUnitFieldPane); + JPanel marginRightPane = column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Left") + ":")), cell(marginLeftUnitFieldPane)), + row( cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Right") + ":")), cell(marginRightUnitFieldPane)) + ).getComponent(); marginTopUnitFieldPane.getTextField().addFocusListener(fa); marginBottomUnitFieldPane.getTextField().addFocusListener(fa); marginLeftUnitFieldPane.getTextField().addFocusListener(fa); marginRightUnitFieldPane.getTextField().addFocusListener(fa); + JPanel marginPane = row(24, cell(marginLeftPane), cell(marginRightPane), cell(zeroMarginWarn)).getComponent(); - marginPane.add(zeroMarginWarn); - - // header and footer - JPanel outhfHeightPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Height")); - JPanel hfHeightPane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); - defaultPane.add(outhfHeightPane); - outhfHeightPane.add(hfHeightPane); - - // header height. - JPanel headerHeightPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - hfHeightPane.add(headerHeightPane); - headerHeightPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Header") + ":")); + //方向-页边距 + JPanel twoPane = row(10, + cell(wrapComponentWithTitle(orientationPane,com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Page_Setup_Orientation"))).weight(0.25), + cell(wrapComponentWithTitle(marginPane,com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Margin"))).weight(0.8) + ).getComponent(); + //高度 headerUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - headerHeightPane.add(headerUnitFieldPane); - - // footer height. - JPanel footerHeightPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - hfHeightPane.add(footerHeightPane); - footerHeightPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Footer") + ":")); - footerUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - footerHeightPane.add(footerUnitFieldPane); + JPanel hfHeightPane = row( + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Header"))), cell(headerUnitFieldPane)), + fix(24), + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Footer"))), cell(footerUnitFieldPane)) + ).getComponent(); + Component heightPane = wrapComponentWithTitle(hfHeightPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Height")); // print gridlines. - JPanel printOptionPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(1); - defaultPane.add(printOptionPane); - printOptionPane.setBorder(BorderFactory.createEmptyBorder(4, 0, 0, 0)); + Component defaultPane = column(LayoutConstants.VERTICAL_GAP, cell(spp), cell(twoPane), cell(paperSizePane), cell(heightPane)).getComponent(); + + JPanel workPanel = new JPanel(new BorderLayout()); + workPanel.add(defaultPane); + workPanel.setBorder(new ScaledEmptyBorder(10,10,10,10)); + this.add(workPanel); } @Override @@ -387,11 +348,6 @@ public class PageSetupPane extends BasicPane { } }; - /** - * Populate - * - * @param reportSettings rpt settings. - */ public void populate(Report report, int unitType) { this.report = report; ReportSettingsProvider reportSettings = report.getReportSettings(); @@ -602,13 +558,11 @@ public class PageSetupPane extends BasicPane { * Create icon radio pane for Portrait and Landscape. */ private JPanel createIconRadioPane(Icon icon, UIRadioButton radioButton) { - JPanel iconRadioPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); -// iconRadioPane.setLayout(FRGUIPaneFactory.createCenterFlowLayout()); - iconRadioPane.add(new UILabel(icon)); - iconRadioPane.add(radioButton); - - return iconRadioPane; + return column( + cell(new UILabel(icon)), + cell(radioButton) + ).getComponent(); } /** @@ -881,80 +835,76 @@ public class PageSetupPane extends BasicPane { private UIRadioButton isShrinkToFit4Width; public OtherPane() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - - JPanel defaultPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - this.add(defaultPane, BorderLayout.NORTH); - - // page order - JPanel outpageOrderPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Page_Order")); - JPanel pageOrderPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); - outpageOrderPane.add(pageOrderPane); - defaultPane.add(outpageOrderPane); - + this.setLayout(new BorderLayout()); + // page order 分页顺序 Icon topBottomIcon = BaseUtils.readIcon("/com/fr/base/images/dialog/pagesetup/down.png"); topBottomRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Top_To_Bottom"),false,false); - pageOrderPane.add(FRGUIPaneFactory.createIconRadio_S_Pane(topBottomIcon, topBottomRadioButton)); topBottomRadioButton.setMnemonic('B'); Icon leftRightIcon = BaseUtils.readIcon("/com/fr/base/images/dialog/pagesetup/over.png"); leftRightRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Left_To_Right"), false, false); - pageOrderPane.add(FRGUIPaneFactory.createIconRadio_S_Pane(leftRightIcon, leftRightRadioButton)); leftRightRadioButton.setMnemonic('R'); - ButtonGroup pageOrderButtonGroup = new ButtonGroup(); pageOrderButtonGroup.add(topBottomRadioButton); pageOrderButtonGroup.add(leftRightRadioButton); - topBottomRadioButton.setSelected(true); - // center on page - JPanel outcenterOnPagePane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Placement_Center_On_Page")); - JPanel centerOnPagePane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); - outcenterOnPagePane.add(centerOnPagePane); - defaultPane.add(outcenterOnPagePane); - + JPanel pageOrderPane = row( + cell(new UILabel(topBottomIcon)), + cell(topBottomRadioButton), + fix(20), + cell(new UILabel(leftRightIcon)), + cell(leftRightRadioButton) + ).getComponent(); + Component outPageOrderPane = wrapComponentWithTitle(pageOrderPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Page_Order")); + // center on page 居中方式 this.horizonalCenterCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Horizontally"), false, false); this.horizonalCenterCheckBox.setMnemonic('H'); this.verticalCenterCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Vertically"), false, false); this.verticalCenterCheckBox.setMnemonic('V'); + JPanel centerOnPagePane = row(LayoutConstants.HORIZONTAL_GAP, + cell(GUICoreUtils.createFlowPane(horizonalCenterCheckBox, FlowLayout.CENTER)), + cell(GUICoreUtils.createFlowPane(verticalCenterCheckBox, FlowLayout.CENTER)) + ).getComponent(); + Component outCenterOnPagePane = wrapComponentWithTitle(centerOnPagePane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Placement_Center_On_Page")); - centerOnPagePane.add(GUICoreUtils.createFlowPane(horizonalCenterCheckBox, FlowLayout.CENTER)); - centerOnPagePane.add(GUICoreUtils.createFlowPane(verticalCenterCheckBox, FlowLayout.CENTER)); - - // first page number. - JPanel firstPaneNumberPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - defaultPane.add(firstPaneNumberPane); - - firstPaneNumberPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_First_Page_Number") + ": ")); + // first page number. 起始页码 // marks: 这个地方必须为大于零的整数 firstPageNumberSpinner = new UISpinner(1, Integer.MAX_VALUE, 1, 1); - firstPaneNumberPane.add(firstPageNumberSpinner); + JPanel firstPaneNumberPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_First_Page_Number"))), + cell(firstPageNumberSpinner) + ).getComponent(); - defaultPane.add(Box.createVerticalStrut(4)); - - // print gridlines. - JPanel printOptionPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(1); - defaultPane.add(printOptionPane); - printOptionPane.setBorder(BorderFactory.createEmptyBorder(4, 0, 0, 0)); - - JPanel autoShrinkPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - autoShrinkPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Shrink_To_Fit_Content"))); + // print gridlines. 根据单元格内容自动调整 isShrinkToFit4None = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No")); isShrinkToFit4Height = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Row_Height")); isShrinkToFit4Width = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Column_Width")); - ButtonGroup bp = new ButtonGroup(); - autoShrinkPane.add(isShrinkToFit4None); - autoShrinkPane.add(isShrinkToFit4Height); - autoShrinkPane.add(isShrinkToFit4Width); bp.add(isShrinkToFit4None); bp.add(isShrinkToFit4Height); bp.add(isShrinkToFit4Width); - - printOptionPane.add(autoShrinkPane); + JPanel autoShrinkPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Shrink_To_Fit_Content"))), + cell(isShrinkToFit4None), + cell(isShrinkToFit4Height), + cell(isShrinkToFit4Width) + ).getComponent(); + + //整体布局 + JPanel defaultPane = column(LayoutConstants.HORIZONTAL_GAP, + cell(outPageOrderPane), + cell(outCenterOnPagePane), + cell(firstPaneNumberPane), + cell(autoShrinkPane) + ).getComponent(); + + JPanel workPanel = new JPanel(new BorderLayout()); + workPanel.add(defaultPane); + workPanel.setBorder(new ScaledEmptyBorder(10,10,10,10)); + this.add(workPanel); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/report/ReportExportAttrPane.java b/designer-realize/src/main/java/com/fr/design/report/ReportExportAttrPane.java index cd992c3fdf..9256e3e103 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ReportExportAttrPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ReportExportAttrPane.java @@ -1,10 +1,11 @@ package com.fr.design.report; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicStorePane; import com.fr.design.dialog.BasicPane; import com.fr.design.fun.ExportAttrTabProvider; -import com.fr.design.gui.frpane.UITabbedPane; +import com.fr.design.gui.frpane.FineTabbedPane; import com.fr.design.i18n.Toolkit; import com.fr.io.attr.ReportExportAttr; @@ -15,7 +16,8 @@ import java.util.Set; public class ReportExportAttrPane extends BasicPane { - UITabbedPane uiTabbedPane; + FineTabbedPane uiTabbedPane; + FineTabbedPane.TabPaneBuilder tabPaneBuilder; private ExcelExportPane excelExportPane; private PDFExportPane pdfExportPane; private WordExportPane wordExportPane; @@ -23,31 +25,28 @@ public class ReportExportAttrPane extends BasicPane { private List> paneList; public ReportExportAttrPane() { - uiTabbedPane = new UITabbedPane(); this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - exportUniversalPane = new ExportUniversalPane(); - uiTabbedPane.addTab(Toolkit.i18nText("Fine-Design_Report_Universal_Export"), exportUniversalPane); - excelExportPane = new ExcelExportPane(); - uiTabbedPane.addTab("Excel", excelExportPane); - pdfExportPane = new PDFExportPane(); - uiTabbedPane.addTab("PDF", pdfExportPane); - wordExportPane = new WordExportPane(); - uiTabbedPane.addTab("Word", wordExportPane); + this.setBorder(new ScaledEmptyBorder(10,10,10,10)); + tabPaneBuilder = FineTabbedPane.builder() + .addTab(Toolkit.i18nText("Fine-Design_Report_Universal_Export"), exportUniversalPane = new ExportUniversalPane()) + .addTab("Excel", excelExportPane = new ExcelExportPane()) + .addTab("PDF", pdfExportPane = new PDFExportPane()) + .addTab("Word", wordExportPane = new WordExportPane()); Set providers = ExtraDesignClassManager.getInstance().getArray(ExportAttrTabProvider.XML_TAG); paneList = new ArrayList<>(); initPane(new ImageExportPane()); for (ExportAttrTabProvider provider : providers) { BasicStorePane storePane = provider.toServiceComponent(); - uiTabbedPane.addTab(storePane.getTitle(), storePane); + tabPaneBuilder.addTab(storePane.getTitle(), storePane); paneList.add(storePane); } + uiTabbedPane = tabPaneBuilder.build(); this.add(uiTabbedPane); } private void initPane(BasicStorePane exportPane) { - uiTabbedPane.addTab(exportPane.getTitle(), exportPane); - paneList.add(exportPane); + tabPaneBuilder.addTab(new ImageExportPane().getTitle(), new ImageExportPane()); + paneList.add(new ImageExportPane()); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/report/WordExportPane.java b/designer-realize/src/main/java/com/fr/design/report/WordExportPane.java index c252a4e627..26f40b1d05 100644 --- a/designer-realize/src/main/java/com/fr/design/report/WordExportPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/WordExportPane.java @@ -1,6 +1,9 @@ package com.fr.design.report; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIRadioButton; @@ -15,14 +18,17 @@ import com.fr.io.attr.WordExportAttr; import com.fr.stable.StringUtils; import javax.swing.AbstractButton; -import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JPanel; import java.awt.Color; -import java.awt.Dimension; +import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.*; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + public class WordExportPane extends BasicPane { private UICheckBox isExportAsTable; // 编辑保护 @@ -43,46 +49,31 @@ public class WordExportPane extends BasicPane { } protected void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - JPanel outPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane("Word" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportD_Excel_Export")); - JPanel outNorthPane =FRGUIPaneFactory.createTopVerticalTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Export_Setting")); - outNorthPane.setPreferredSize(new Dimension(580, 110)); - this.add(outPane); - outPane.add(outNorthPane); + this.setLayout(new BorderLayout()); isExportAsTable = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Is_Need_Word_Adjust"), false); - MultilineLabel wordLineLabel = new MultilineLabel(); - wordLineLabel.setPreferredSize(new Dimension(560, 50)); wordLineLabel.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Alert_Word")); - wordLineLabel.setForeground(Color.GRAY); - - outNorthPane.add(isExportAsTable); - outNorthPane.add(wordLineLabel); - // 内容保护 - JPanel outSouthPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Export_Content_Protect")); - outSouthPane.setPreferredSize(new Dimension(580, 250)); - outPane.add(outSouthPane); + wordLineLabel.setForeground(Color.GRAY); + + JPanel exportSettingPane = new JPanel(new BorderLayout()); + exportSettingPane.add(column(LayoutConstants.VERTICAL_GAP, cell(isExportAsTable), cell(wordLineLabel)).getComponent()); // 编辑保护 writeProtect = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Export_Write_Protect"), false); - outSouthPane.add(writeProtect); // 编辑保护勾选后展示的内容 writeProtectPane = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); - outSouthPane.add(writeProtectPane); // 工作表密码 workbookPassword = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sheet_Password"), true); - JPanel protectedWordPane =FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); protectedField = new UITextField(11); - protectedWordPane.add(workbookPassword); - protectedWordPane.add(protectedField); + // 仅限预览 onlyForPreview = new UIRadioButton(Toolkit.i18nText("Fine-Design_Report_Export_Only_For_Preview")); - JPanel onlyForPreviewPane =FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); - onlyForPreviewPane.add(onlyForPreview); wrapButtonsInButtonGroup(workbookPassword, onlyForPreview); - writeProtectPane.add(protectedWordPane); - writeProtectPane.add(onlyForPreviewPane); + writeProtectPane.add(column(LayoutConstants.VERTICAL_GAP, + row(cell(workbookPassword), fix(5), cell(protectedField)), + row(cell(onlyForPreview)) + ).with(it-> it.setBorder(new ScaledEmptyBorder(0,20,0,0) )).getComponent()); + writeProtect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (writeProtect.isSelected()) { @@ -91,15 +82,11 @@ public class WordExportPane extends BasicPane { writeProtectPane.setVisible(false); } } - }); // 导出水印 exportWaterMark = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Export_WaterMark"), false); - outSouthPane.add(exportWaterMark); - - JPanel tips = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(5, 5, 0); UILabel uiLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Export_WaterMark_Tips")); - uiLabel.setForeground(Color.GRAY); + FineUIStyle.setStyle(uiLabel, FineUIStyle.LABEL_TIP); ActionLabel actionLabel = new ActionLabel(Toolkit.i18nText("Fine-Design_Report_Export_WaterMark_Use"), UIConstants.FLESH_BLUE); actionLabel.addActionListener(new ActionListener() { @Override @@ -110,16 +97,35 @@ public class WordExportPane extends BasicPane { exportWaterMark.setSelected(true); } }); - tips.add(uiLabel); - tips.add(actionLabel); - outSouthPane.add(tips); - } + //内容保护 + JPanel contextProtectPane = column(10, + cell(writeProtect), + cell(writeProtectPane), + cell(exportWaterMark), + row(cell(uiLabel), cell(actionLabel)) + ).getComponent(); + JPanel centerPanel = column(LayoutConstants.VERTICAL_GAP, + row(20, + cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Setting"))), + cell(exportSettingPane).weight(1) + ), + row(20, + cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Content_Protect"))), + cell(contextProtectPane).weight(1) + ) + ).getComponent(); + this.add(wrapComponentWithTitle(centerPanel, "Word" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportD_Excel_Export"))); + } @Override protected String title4PopupWindow() { return "WordExport"; } + private JPanel getTopAlignLabelPane(String labelText) { + return column(LayoutConstants.VERTICAL_GAP, cell(new UILabel(labelText))).with(it-> it.setBorder(new ScaledEmptyBorder(2,0,0,0))).getComponent(); + } + public void populate(WordExportAttr wordExportAttr) { if(wordExportAttr == null){ return; diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitBrowserPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitBrowserPane.java index 1d415d0b75..5679407914 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitBrowserPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitBrowserPane.java @@ -2,15 +2,18 @@ package com.fr.design.report.mobile; import com.fr.base.mobile.MobileFitAttrState; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.report.mobile.ElementCaseMobileAttr; -import javax.swing.*; -import java.awt.*; +import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + /** * Created by 夏翔 on 2016/5/28. */ @@ -25,22 +28,23 @@ public class AppFitBrowserPane extends BasicBeanPane { public AppFitBrowserPane(){ initComponents(); - } + /** + * 自适应面板 + */ private void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel borderPane = FRGUIPaneFactory.createTitledBorderPane(this.title4PopupWindow()); - JPanel fitOpsPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + this.setLayout(new BorderLayout()); horizionPane = new MobileRadioGroupPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Horizontal")); verticalPane = new MobileRadioGroupPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Vertical")); ActionListener actionListener = getAppPreviewActionListener(); horizionPane.addActionListener(actionListener); verticalPane.addActionListener(actionListener); - fitOpsPane.add(horizionPane, BorderLayout.NORTH); - fitOpsPane.add(verticalPane, BorderLayout.SOUTH); - borderPane.add(fitOpsPane); - this.add(borderPane); + this.add( + wrapComponentWithTitle((column(10, + row(cell(horizionPane)), + row(cell(verticalPane)) + ).getComponent()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Fit"))); } public void setAppFitPreviewPane(AppFitPreviewPane appFitPreviewPane) { diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitPreviewPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitPreviewPane.java index f0a61222a5..6f720fd919 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitPreviewPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitPreviewPane.java @@ -1,14 +1,19 @@ package com.fr.design.report.mobile; +import com.fine.theme.utils.FineUIUtils; import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.FRGUIPaneFactory; - -import javax.swing.*; +import javax.swing.ImageIcon; +import java.awt.BorderLayout; import java.util.ArrayList; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + /** * Created by 夏翔 on 2016/5/28. */ @@ -44,18 +49,21 @@ public class AppFitPreviewPane extends BasicPane{ } private void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - - JPanel outnorthPane = FRGUIPaneFactory.createTitledBorderPane(this.title4PopupWindow()); - this.add(outnorthPane); + this.setLayout(new BorderLayout()); horizontalImageLabel = new UILabel(); horizontalImageLabel.setIcon(cachedHorizonPreviewImage.get(1)); - outnorthPane.add(horizontalImageLabel); verticalImagelabel = new UILabel(); verticalImagelabel.setIcon(cachedVerticalPreviewImage.get(0)); - outnorthPane.add(verticalImagelabel); + this.add( + FineUIUtils.wrapComponentWithTitle((column(10, + row(10, + column(cell(horizontalImageLabel)), + column(cell(verticalImagelabel)), + flex() + )).getComponent()), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Plugin_Preview"))); } public void refreshPreview(int[] index) { 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 3948c26f3c..e62eda1efe 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 @@ -1,15 +1,15 @@ package com.fr.design.report.mobile; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.designer.IntervalConstants; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.mobile.MobileRadioCheckPane; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.report.mobile.ElementCaseMobileAttr; -import javax.swing.BorderFactory; -import javax.swing.JPanel; -import java.awt.BorderLayout; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; /** * Created by plough on 2018/5/31. @@ -27,15 +27,11 @@ public class MobileOthersPane extends BasicBeanPane { private void initComponents() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel borderPane = FRGUIPaneFactory.createTitledBorderPane(this.title4PopupWindow()); - JPanel contentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - 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("Fine-Design_Report_Mobile_Attr_Allow_Zoom")); - contentPane.add(allowDoubleClickOrZoomCheckPane, BorderLayout.CENTER); - borderPane.add(contentPane); - this.add(borderPane); + this.add(wrapComponentWithTitle(row(LayoutConstants.HORIZONTAL_GAP, cell(appearRefreshCheckPane), cell(allowDoubleClickOrZoomCheckPane)).getComponent(), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Other"))); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/MobileRadioGroupPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/MobileRadioGroupPane.java index dd1a6dad79..d449dd1fcb 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/MobileRadioGroupPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/MobileRadioGroupPane.java @@ -4,17 +4,19 @@ import com.fr.base.mobile.MobileFitAttrState; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; -import com.fr.general.data.index.Index; import com.fr.stable.StringUtils; -import javax.swing.*; -import java.awt.*; +import javax.swing.ButtonGroup; +import java.awt.Component; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.fix; + /** * Created by Administrator on 2016/5/16/0016. */ @@ -27,10 +29,6 @@ public class MobileRadioGroupPane extends BasicBeanPane{ } private void initComponents(String title) { - double p = TableLayout.PREFERRED; - double[] rowSize = {p}; - double[] columnSize = {p, p, p, p, p}; - IndexRadioButton horizonRadio = new IndexRadioButton(MobileFitAttrState.HORIZONTAL.description(), MobileFitAttrState.HORIZONTAL); horizonRadio.setSelected(true); IndexRadioButton verticalRadio = new IndexRadioButton(MobileFitAttrState.VERTICAL.description(), MobileFitAttrState.VERTICAL); @@ -38,19 +36,20 @@ public class MobileRadioGroupPane extends BasicBeanPane{ IndexRadioButton notFitRadio = new IndexRadioButton(MobileFitAttrState.NONE.description(), MobileFitAttrState.NONE); addToButtonGroup(horizonRadio, verticalRadio, notFitRadio, bidirectionalRadio); - - Component[][] components = new Component[][]{ - new Component[] { - new UILabel(title), - horizonRadio, - verticalRadio, - bidirectionalRadio, - notFitRadio - } - }; - JPanel fitOpsPane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); - fitOpsPane.setBorder(BorderFactory.createEmptyBorder(10, 13, 10, 10)); - this.add(fitOpsPane); + Component row = + row( + cell(new UILabel(title)), + fix(10), + cell(horizonRadio), + fix(5), + cell(verticalRadio), + fix(5), + cell(bidirectionalRadio), + fix(5), + cell(notFitRadio), + flex() + ).getComponent(); + this.add(row); } private void addToButtonGroup(IndexRadioButton... radios) { @@ -81,7 +80,6 @@ public class MobileRadioGroupPane extends BasicBeanPane{ return radioButtons.get(i).getRadioButtonIndex(); } } - return 0; } diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/MobileToolBarPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/MobileToolBarPane.java index 7a2d99a2b8..9afc207db6 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/MobileToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/MobileToolBarPane.java @@ -1,14 +1,18 @@ package com.fr.design.report.mobile; +import com.fine.theme.utils.FineUIUtils; import com.fr.design.beans.BasicBeanPane; import com.fr.design.dialog.mobile.MobileRadioCheckPane; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.report.mobile.ElementCaseMobileAttr; -import javax.swing.*; -import java.awt.*; +import javax.swing.BorderFactory; +import java.awt.BorderLayout; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; /** * Created by 方磊 on 2016/11/8. @@ -25,20 +29,20 @@ public class MobileToolBarPane extends BasicBeanPane { } private void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel borderPane = FRGUIPaneFactory.createTitledBorderPane(this.title4PopupWindow()); - JPanel toobarsPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - + this.setLayout(new BorderLayout()); UILabel uiLabel = new UILabel("html5"); uiLabel.setBorder(BorderFactory.createEmptyBorder(5, 15, 10, 15)); zoomCheckPane = new MobileRadioCheckPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Zoom")); refreshCheckPane = new MobileRadioCheckPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Refresh")); - toobarsPane.add(uiLabel, BorderLayout.WEST); - toobarsPane.add(zoomCheckPane, BorderLayout.CENTER); - toobarsPane.add(refreshCheckPane, BorderLayout.EAST); - borderPane.add(toobarsPane); - this.add(borderPane); + this.add( + FineUIUtils.wrapComponentWithTitle((column(10, + row(cell(uiLabel)), + row(cell(zoomCheckPane)), + row(cell(refreshCheckPane)), + flex() + ).getComponent()), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_ToolBar"))); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileAttrPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileAttrPane.java index 668027f5f8..93533777e2 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileAttrPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileAttrPane.java @@ -1,11 +1,17 @@ package com.fr.design.report.mobile; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.report.mobile.ElementCaseMobileAttr; -import javax.swing.*; +import javax.swing.JPanel; +import java.awt.BorderLayout; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; /** * Created by Administrator on 2016/5/12/0012. @@ -23,23 +29,19 @@ public class ReportMobileAttrPane extends BasicBeanPane{ } private void initComponents() { + this.setLayout(new BorderLayout()); AppFitPreviewPane appFitPreviewPane = new AppFitPreviewPane(); - this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - JPanel jPanel = new JPanel(); - jPanel.setLayout(new BoxLayout(jPanel, BoxLayout.Y_AXIS)); - jPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - reportMobileTemplateSettingsPane = new ReportMobileTemplateSettingsPane(); - jPanel.add(reportMobileTemplateSettingsPane); - appFitBrowserPane = new AppFitBrowserPane(); appFitBrowserPane.setAppFitPreviewPane(appFitPreviewPane); - jPanel.add(appFitBrowserPane); - - jPanel.add(mobileOthersPane = new MobileOthersPane()); - - jPanel.add(appFitPreviewPane); - UIScrollPane scrollPane = new UIScrollPane(jPanel); + JPanel panel = new JPanel(new BorderLayout()); + panel.add(column(LayoutConstants.VERTICAL_GAP, + cell(reportMobileTemplateSettingsPane), + cell(appFitBrowserPane), + cell(mobileOthersPane = new MobileOthersPane()), + cell(appFitPreviewPane) + ).with(it -> it.setBorder(new ScaledEmptyBorder(10,10,10,10))).getComponent()); + UIScrollPane scrollPane = new UIScrollPane(panel); this.add(scrollPane); } diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileTemplateSettingsPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileTemplateSettingsPane.java index f1b00f19af..71b61faeed 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileTemplateSettingsPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileTemplateSettingsPane.java @@ -1,17 +1,21 @@ package com.fr.design.report.mobile; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.designer.IntervalConstants; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.report.mobile.ElementCaseMobileAttr; -import javax.swing.*; -import java.awt.*; +import javax.swing.JPanel; +import java.awt.BorderLayout; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; /** * Created by plough on 2018/1/8. @@ -25,51 +29,37 @@ public class ReportMobileTemplateSettingsPane extends BasicBeanPane it.setBorder(new ScaledEmptyBorder(10,10,10,10))).getComponent()); + this.add(workPanel); } public void populate(ReportWebAttr reportWebAttr) { diff --git a/designer-realize/src/main/java/com/fr/design/webattr/DragToolBarPane.java b/designer-realize/src/main/java/com/fr/design/webattr/DragToolBarPane.java index b79e19e13f..5720e53232 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/DragToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/DragToolBarPane.java @@ -1,5 +1,8 @@ package com.fr.design.webattr; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.layout.FRGUIPaneFactory; @@ -7,7 +10,6 @@ import com.fr.form.ui.Widget; import com.fr.report.web.Location; import com.fr.report.web.ToolBarManager; -import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.DropMode; import javax.swing.Icon; @@ -16,18 +18,22 @@ import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListCellRenderer; +import javax.swing.DefaultListCellRenderer; import javax.swing.SwingUtilities; import javax.swing.TransferHandler; +import javax.swing.BorderFactory; +import javax.swing.UIManager; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; -import java.awt.Dimension; import java.awt.datatransfer.Transferable; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.image.ImageObserver; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; /** * richer:拖拽ToolBar button以实现自定义工具栏.服务器配置那儿的 @@ -65,29 +71,45 @@ public class DragToolBarPane extends WidgetToolBarPane { toolbarButtonList.setDropMode(DropMode.ON_OR_INSERT); toolbarButtonList.setDragEnabled(true); toolbarButtonList.setTransferHandler(new FromTransferHandler()); - northToolBar = new ToolBarPane(); - northToolBar.setPreferredSize(new Dimension(ImageObserver.WIDTH, 26)); - northToolBar.setBackground(Color.lightGray); - southToolBar = new ToolBarPane(); - southToolBar.setPreferredSize(new Dimension(ImageObserver.WIDTH, 26)); - southToolBar.setBackground(Color.lightGray); + toolbarButtonList.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); + + //顶部工具栏 JPanel northContentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + northToolBar = new ToolBarPane(); + northToolBar.setOpaque(false); + northToolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, UIManager.getColor("defaultBorderColor"))); SettingToolBar top = new SettingToolBar(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ToolBar_Top"), northToolBar); + top.setOpaque(false); northContentPane.add(top, BorderLayout.EAST); northContentPane.add(northToolBar, BorderLayout.CENTER); - northContentPane.setBackground(Color.lightGray); + northContentPane.setBorder(new ScaledEmptyBorder(4,0,4,0)); + northContentPane.setOpaque(false); + JPanel topToolbarPanel = new JPanel(new BorderLayout()); + topToolbarPanel.add(northContentPane); + topToolbarPanel.setBackground(FineUIUtils.getUIColor("Center.ZoneBorderColor", "defaultBorderColor")); + //底部工具栏 JPanel southContentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + southToolBar = new ToolBarPane(); + southToolBar.setOpaque(false); + southToolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, UIManager.getColor("defaultBorderColor"))); SettingToolBar bottom = new SettingToolBar(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ToolBar_Bottom"), southToolBar); + bottom.setOpaque(false); southContentPane.add(bottom, BorderLayout.EAST); southContentPane.add(southToolBar, BorderLayout.CENTER); - southContentPane.setBackground(Color.lightGray); - JPanel movePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - movePane.add(northContentPane, BorderLayout.NORTH); - movePane.add(toolbarButtonList, BorderLayout.CENTER); - movePane.add(southContentPane, BorderLayout.SOUTH); + southContentPane.setBorder(new ScaledEmptyBorder(4,0,4,0)); + southContentPane.setOpaque(false); + JPanel bottomToolbarPanel = new JPanel(new BorderLayout()); + bottomToolbarPanel.add(southContentPane); + bottomToolbarPanel.setBackground(FineUIUtils.getUIColor("Center.ZoneBorderColor", "defaultBorderColor")); - // SplitPane + //整体工具栏图标面板 + JPanel movePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + movePane.add(column(1, + cell(topToolbarPanel), + cell(toolbarButtonList), + cell(bottomToolbarPanel) + ).getComponent()); this.add(new JScrollPane(movePane), BorderLayout.CENTER); JPanel buttonPane = FRGUIPaneFactory.createCenterFlowInnerContainer_S_Pane(); @@ -98,7 +120,6 @@ public class DragToolBarPane extends WidgetToolBarPane { southToolBar.removeButtonList(); southToolBar.repaint(); northToolBar.removeButtonList(); - if (defaultToolBar == null) { return; } @@ -121,6 +142,7 @@ public class DragToolBarPane extends WidgetToolBarPane { northToolBar.repaint(); } }); + buttonPane.add(removeButton); this.add(buttonPane, BorderLayout.SOUTH); } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/EditReportServerParameterPane.java b/designer-realize/src/main/java/com/fr/design/webattr/EditReportServerParameterPane.java index 92885a3b3c..7aa80c8ade 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/EditReportServerParameterPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/EditReportServerParameterPane.java @@ -7,8 +7,8 @@ import com.fr.base.ConfigManager; import com.fr.base.print.PrintSettingsAttrMark; import com.fr.config.PrintConfig; import com.fr.config.ServerPreferenceConfig; +import com.fr.design.gui.frpane.FineTabbedPane; import com.fr.design.gui.frpane.LoadingBasicPane; -import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.webattr.printsettings.GlobalNativePrintSettingPane; @@ -28,7 +28,7 @@ import java.awt.BorderLayout; */ public class EditReportServerParameterPane extends LoadingBasicPane { - private UITabbedPane tabbedPane; + private FineTabbedPane tabbedPane; private PageToolBarPane pagePane; private ViewToolBarPane viewPane; @@ -54,20 +54,22 @@ public class EditReportServerParameterPane extends LoadingBasicPane { JPanel defaultPane = container; defaultPane.setLayout(FRGUIPaneFactory.createBorderLayout()); - //Tabbed Pane - tabbedPane = new UITabbedPane(); - defaultPane.add(tabbedPane, BorderLayout.CENTER); - - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_WEB_Pagination_Setting"), pagePane = new PageToolBarPane()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_WEB_Write_Setting"), writePane = new WriteToolBarPane()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_M_Data_Analysis_Settings"), viewPane = new ViewToolBarPane()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportServerP_Import_Css"), cssPane = new WebCssPane()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportServerP_Import_JavaScript"), jsPane = new WebJsPane()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Error_Handler_Template"), errorTemplatePane = new ErrorTemplatePane()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Print_Setting"), printSettingPane = new PrintSettingPane(new GlobalNativePrintSettingPane())); + //服务器-服务器配置 + FineTabbedPane.TabPaneBuilder tabPaneBuilder = FineTabbedPane.builder() + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_WEB_Pagination_Setting"), pagePane = new PageToolBarPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_WEB_Write_Setting"), writePane = new WriteToolBarPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_M_Data_Analysis_Settings"), viewPane = new ViewToolBarPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportServerP_Import_Css"), cssPane = new WebCssPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportServerP_Import_JavaScript"), jsPane = new WebJsPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Error_Handler_Template"), errorTemplatePane = new ErrorTemplatePane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Print_Setting"), printSettingPane = new PrintSettingPane(new GlobalNativePrintSettingPane())); if (WorkContext.getCurrent().isRoot()) { - tabbedPane.addTab(Toolkit.i18nText("Fine-Designer_PC_Fit_Attr"), serverFitAttrPane = new ServerFitAttrPane()); + tabPaneBuilder.addTab(Toolkit.i18nText("Fine-Designer_PC_Fit_Attr"), serverFitAttrPane = new ServerFitAttrPane()); + tabbedPane = tabPaneBuilder.withTabLayout(new int[]{4,4}).withHeadRatio(0.8f).build(); + } else { + tabbedPane = tabPaneBuilder.withTabLayout(new int[]{3,4}).withHeadRatio(0.8f).build(); } + defaultPane.add(tabbedPane, BorderLayout.CENTER); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/webattr/EditToolBar.java b/designer-realize/src/main/java/com/fr/design/webattr/EditToolBar.java index 17d411706e..0c1e2280ce 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/EditToolBar.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/EditToolBar.java @@ -1,9 +1,14 @@ package com.fr.design.webattr; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.UpdateAction; -import com.fr.design.designer.IntervalConstants; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; @@ -20,13 +25,10 @@ import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.i18n.Toolkit; import com.fr.design.javascript.JavaScriptActionPane; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JWorkBook; import com.fr.design.menu.ToolBarDef; import com.fr.design.style.background.BackgroundPane; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.widget.IconDefinePane; import com.fr.form.ui.Button; import com.fr.form.ui.CustomToolBarButton; @@ -45,22 +47,21 @@ import com.fr.stable.StringUtils; import com.fr.widgettheme.util.WidgetThemeDesignerUtils; import com.fr.write.JavaScriptResourceInfo; -import javax.swing.BorderFactory; -import javax.swing.Box; -import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; +import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; -import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.ListCellRenderer; import javax.swing.SpinnerNumberModel; import javax.swing.SwingUtilities; +import javax.swing.DefaultListCellRenderer; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.CardLayout; import java.awt.Component; import java.awt.Dimension; @@ -71,6 +72,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + public class EditToolBar extends BasicPane { private static final String EMAIL = "email"; @@ -102,9 +109,9 @@ public class EditToolBar extends BasicPane { lastButton = (ToolBarButton) list.getSelectedValue(); if (lastButton.getWidget() instanceof Button) { card.show(right, "button"); - bp.populate(lastButton.getWidget()); + bp.populate(lastButton.getWidget(), lastButton.getIcon()); } else { - bp.populate(lastButton.getWidget()); + bp.populate(lastButton.getWidget(), lastButton.getIcon()); card.show(right, "none"); } } @@ -140,51 +147,64 @@ public class EditToolBar extends BasicPane { * 初始化 */ public void initComponent() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel left = FRGUIPaneFactory.createBorderLayout_S_Pane(); + this.setLayout(new BorderLayout()); + //左侧按钮列表 + JPanel leftPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); listModel = new DefaultListModel(); list = new JList(listModel); list.setCellRenderer(render); - left.add(new JScrollPane(list), BorderLayout.CENTER); + list.addListSelectionListener(listSelectionListener); + list.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); + list.setPreferredSize(FineUIScale.scale(new Dimension(-1, 380))); + leftPanel.add(list, BorderLayout.CENTER); + //添加外边框 + leftPanel.setBorder(new FineRoundBorder()); if (listModel.getSize() > 0) { list.setSelectedIndex(0); } - + //左侧按钮列表上方工具栏,上移-下移-删除 ToolBarDef toolbarDef = new ToolBarDef(); toolbarDef.addShortCut(new MoveUpItemAction()); toolbarDef.addShortCut(new MoveDownItemAction()); toolbarDef.addShortCut(new RemoveAction()); UIToolbar toolBar = ToolBarDef.createJToolBar(); toolbarDef.updateToolBar(toolBar); - left.add(toolBar, BorderLayout.NORTH); - + toolBar.setBackground(FineUIUtils.getUIColor("Center.ZoneBorderColor", "defaultBorderColor")); + leftPanel.add(toolBar, BorderLayout.NORTH); + //右侧表单按钮属性面板 right = FRGUIPaneFactory.createCardLayout_S_Pane(); card = new CardLayout(); right.setLayout(card); bp = new ButtonPane(); right.add("none", FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane()); right.add("button", bp); + right.setBorder(new ScaledEmptyBorder(0,10,0,0)); + JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, leftPanel, right); + splitPane.setDividerLocation(150); - JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, left, right); - // splitPane.setDividerLocation(left.getMinimumSize().width); - splitPane.setDividerLocation(120); - this.add(splitPane); - list.addListSelectionListener(listSelectionListener); - JPanel backgroundPane = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, 0, 0, 0); + //下方样式设置面板 + JPanel backgroundPane = new JPanel(new BorderLayout()); UIButton bgButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Background")); defaultCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default_Background")); bgButton.addActionListener(actioner); - backgroundPane.add(defaultCheckBox); - backgroundPane.add(bgButton); - JPanel bgPanel = new JPanel(); - bgPanel.add(defaultCheckBox); - bgPanel.add(bgButton); - backgroundPane.add(bgPanel); + + //添加按钮颜色面板默认不可见,控件显示增强开启才显示 + JPanel buttonColorGroupPane = createButtonColorGroup(); + buttonColorGroupPane.setVisible(false); + //样式设置面板布局,默认背景-按钮颜色 + backgroundPane.add(column(10, + row(10, cell(defaultCheckBox).weight(0.15), cell(bgButton).weight(0.2), flex(0.65)).weight(1), + cell(buttonColorGroupPane).weight(1) + ).getComponent()); + if(WidgetThemeDesignerUtils.enableWidgetEnhance()) { - backgroundPane.add(createButtonColorGroup()); + buttonColorGroupPane.setVisible(true); } - backgroundPane.setBorder(BorderFactory.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_ToolBar_Style_Setting"))); - this.add(backgroundPane, BorderLayout.SOUTH); + //样式设置面板设置标题 + JPanel styleSettingPane = new JPanel(new BorderLayout()); + styleSettingPane.add(wrapComponentWithTitle(backgroundPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_ToolBar_Style_Setting"))); + styleSettingPane.setBorder(new ScaledEmptyBorder(10, 0, 0, 0));; + this.add(column(cell(splitPane), cell(styleSettingPane)).getComponent()); } ListCellRenderer render = new DefaultListCellRenderer() { @@ -273,7 +293,7 @@ public class EditToolBar extends BasicPane { public MoveUpItemAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Up")); this.setMnemonic('U'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/up.png")); + this.setSmallIcon(new LazyIcon("move_up")); } /** @@ -304,7 +324,7 @@ public class EditToolBar extends BasicPane { public MoveDownItemAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Down")); this.setMnemonic('D'); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/down.png")); + this.setSmallIcon(new LazyIcon("move_down")); } /** @@ -338,7 +358,7 @@ public class EditToolBar extends BasicPane { public class RemoveAction extends UpdateAction { public RemoveAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Delete")); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); + this.setSmallIcon(new LazyIcon("clear")); } /** @@ -404,125 +424,120 @@ public class EditToolBar extends BasicPane { Set set = ExtraDesignClassManager.getInstance().getArray(ExportToolBarProvider.XML_TAG); exportToolBarProviders = set.toArray(new ExportToolBarProvider[set.size()]); this.setLayout(FRGUIPaneFactory.createBorderLayout()); + //'设置表单按钮属性'面板 JPanel north = FRGUIPaneFactory.createBorderLayout_S_Pane(); icon = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Icon")); text = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Text")); - - north.add(icon, BorderLayout.NORTH); - north.add(text, BorderLayout.CENTER); - - nameField = new UITextField(8); + nameField = new UITextField(); iconPane = new IconDefinePane(); javaScriptPane = JavaScriptActionPane.createDefault(); - - double p = TableLayout.PREFERRED; - double rowSize[] = {p, p}; - double columnSize[] = {p, p}; - - Component[][] coms = new Component[][]{{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Widget_Printer_Alias") + ":"), nameField}, {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Widget_Icon") + ":"), iconPane}}; - - JPanel nameIconPane = TableLayoutHelper.createTableLayoutPane(coms, rowSize, columnSize); - - north.add(nameIconPane, BorderLayout.SOUTH); - - north.setBorder(BorderFactory.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Form_Button_Property"))); + JPanel nameIconPane = column(LayoutConstants.VERTICAL_GAP, + //显示按钮图标,显示按钮名称 + row(LayoutConstants.HORIZONTAL_GAP, cell(icon), cell(text)), + //控件别名 + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Widget_Printer_Alias"))), + cell(nameField)), + //控件图标 + row(LayoutConstants.HORIZONTAL_GAP, cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Widget_Icon"))), + cell(iconPane)) + ).getComponent(); + nameIconPane.setBorder(new ScaledEmptyBorder(0, 0, 10, 0)); + north.add(wrapComponentWithTitle(nameIconPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Form_Button_Property")), BorderLayout.SOUTH); this.add(north, BorderLayout.NORTH); - JPanel none = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + + //不同图标额外的设置表单按钮属性面板 centerPane = FRGUIPaneFactory.createCardLayout_S_Pane(); card = new CardLayout(); centerPane.setLayout(card); - centerPane.add(CUSTOM, getCustomPane()); - centerPane.add(EXPORT, getExport()); - centerPane.add(EMAIL, getEmail()); - centerPane.add(NONE, none); - centerPane.add(getCpane(), APPEND_COUNT); - centerPane.add(getSubmitPane(), SUBMIT); + centerPane.add(CUSTOM, wrapComponentWithTitle(getCustomPane(), com.fr.design.i18n.Toolkit.i18nText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit") + "JS"))); + centerPane.add(EXPORT, wrapComponentWithTitle(getExport(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Form_Button_Property"))); + centerPane.add(EMAIL, wrapComponentWithTitle(getEmail(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Form_Button_Property"))); + centerPane.add(NONE, FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane()); + centerPane.add(APPEND_COUNT, column(LayoutConstants.VERTICAL_GAP,cell(getAppendCountPane())).getComponent()); + centerPane.add(SUBMIT, wrapComponentWithTitle(getSubmitPane(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Form_Button_Property"))); Set extraButtonSet = ExtraDesignClassManager.getInstance().getArray(ExtraButtonToolBarProvider.XML_TAG); for (ExtraButtonToolBarProvider provider : extraButtonSet) { provider.updateCenterPane(centerPane); } - this.add(centerPane, BorderLayout.CENTER); } - + /** + * 自定义按钮Pane + * @return + */ private JPanel getCustomPane() { - JPanel customPane = FRGUIPaneFactory.createCenterFlowInnerContainer_S_Pane(); - + JPanel customPane = new JPanel(new BorderLayout()); button = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_User_Defined_Event")); - customPane.add(button); - customPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit") + "JS", null)); + customPane.add(row(cell(button).weight(0.2), flex(0.8)).getComponent()); button.addActionListener(l); return customPane; } + /** + * 导出Pane + * @return + */ private JPanel getExport() { - JPanel export = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - // export.setLayout(new BoxLayout(export, BoxLayout.Y_AXIS)); + JPanel export = FRGUIPaneFactory.createBorderLayout_S_Pane(); pdf = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Output_PDF")); excelP = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Output_Excel_Page")); excelO = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Output_Excel_Simple")); excelS = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Output_Excel_Sheet")); word = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Output_Word")); image = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Image")); - export.add(pdf); - export.add(Box.createVerticalStrut(2)); - export.add(excelP); - export.add(Box.createVerticalStrut(2)); - export.add(excelO); - export.add(Box.createVerticalStrut(2)); - export.add(excelS); - export.add(Box.createVerticalStrut(2)); - export.add(word); - export.add(Box.createVerticalStrut(2)); - export.add(image); + export.add(column(10, cell(pdf), cell(excelP), cell(excelO), cell(excelS), cell(word), cell(image)).getComponent()); for (int i = 0; i < ArrayUtils.getLength(exportToolBarProviders); i++) { export = exportToolBarProviders[i].updateCenterPane(export); } - - export.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Form_Button_Property"), null)); return export; } + /** + * 邮件Pane + * @return + */ private JPanel getEmail() { - JPanel email = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + JPanel email = FRGUIPaneFactory.createBorderLayout_S_Pane(); customConsignee = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Custom_Consignee")); consigneeByDepartment = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Consignee_By_Department")); consigneeByRole = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Consignee_By_Role")); - email.add(customConsignee); - email.add(Box.createVerticalStrut(2)); - email.add(consigneeByDepartment); - email.add(Box.createVerticalStrut(2)); - email.add(consigneeByRole); - email.add(Box.createVerticalStrut(2)); - - email.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Form_Button_Property"), null)); + email.add(column(LayoutConstants.VERTICAL_GAP, + cell(customConsignee), + cell(consigneeByDepartment), + cell(consigneeByRole) + ).getComponent()); return email; } - private JPanel getCpane() { - JPanel appendCountPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); + /** + * 插入记录Pane + * @return + */ + private JPanel getAppendCountPane() { + JPanel appendCountPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); count = new UIBasicSpinner(new SpinnerNumberModel(1, 0, Integer.MAX_VALUE, 1)); - UILabel countLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Add_Row_Column_Numbers") + ":"); - JPanel cpane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - cpane.add(countLabel); - cpane.add(count); - appendCountPane.add(cpane); - return cpane; + UILabel countLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Add_Row_Column_Numbers")); + appendCountPane.add(row(LayoutConstants.HORIZONTAL_GAP, cell(countLabel), cell(count)).getComponent()); + return appendCountPane; } - + /** + * 提交Pane + * @return + */ private JPanel getSubmitPane() { isVerify = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Verify_Data_Verify")); failSubmit = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Verify_Fail_Still_Submit")); isCurSheet = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Only_Submit_Current_Sheet")); - JPanel submitPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); - submitPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Form_Button_Property"), null)); - submitPane.add(isVerify); - submitPane.add(failSubmit); - submitPane.add(isCurSheet); isVerify.addActionListener(actionListener); + JPanel submitPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + submitPane.add(column(LayoutConstants.VERTICAL_GAP, + cell(isVerify), + cell(failSubmit), + cell(isCurSheet) + ).getComponent()); return submitPane; } @@ -567,11 +582,11 @@ public class EditToolBar extends BasicPane { * * @param widget 对应组件 */ - public void populate(Widget widget) { + public void populate(Widget widget, Icon icon) { this.widget = widget; card.show(centerPane, "none"); if (widget instanceof Button) { - populateDefault(); + populateDefault(icon); } if (widget instanceof Export) { populateExport(); @@ -640,12 +655,12 @@ public class EditToolBar extends BasicPane { this.isCurSheet.setSelected(submit.isOnlySubmitSelect()); } - private void populateDefault() { + private void populateDefault(Icon icon) { Button button = (Button) widget; this.icon.setSelected(button.isShowIcon()); this.text.setSelected(button.isShowText()); this.nameField.setText(button.getText()); - this.iconPane.populate(((Button) widget).getIconName()); + this.iconPane.populateIcon(((Button) widget).getIconName(), icon); } /** @@ -739,11 +754,7 @@ public class EditToolBar extends BasicPane { super.setSelectedIndex(newSelectedIndex, fireChanged); } }; - bgColorButtonGroup.setPreferredSize(new Dimension(135, bgColorButtonGroup.getPreferredSize().height)); - JPanel headPane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(IntervalConstants.INTERVAL_L5, 0); - headPane.add(headLabel); - headPane.add(bgColorButtonGroup); - headPane.setBorder(BorderFactory.createEmptyBorder(0, IntervalConstants.INTERVAL_L2, 0, 0)); - return headPane; + bgColorButtonGroup.setPreferredSize(FineUIScale.scale(new Dimension(135, bgColorButtonGroup.getPreferredSize().height))); + return row(10, cell(headLabel).weight(0.15), cell(bgColorButtonGroup).weight(0.3), flex(0.55)).getComponent(); } } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ErrorTemplatePane.java b/designer-realize/src/main/java/com/fr/design/webattr/ErrorTemplatePane.java index 20ff40f5fb..dd1ec883e8 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ErrorTemplatePane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ErrorTemplatePane.java @@ -1,47 +1,45 @@ package com.fr.design.webattr; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; - +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; public class ErrorTemplatePane extends BasicBeanPane { private UITextField templateField = null; public ErrorTemplatePane() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); - - this.templateField = new UITextField(36); - - // TableLayout - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p, p}; - double[] columnSize = {p, p}; - - JPanel reportletNamePane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - reportletNamePane.add(this.templateField); - - Component[][] components = { - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Template_Path") + ":"), reportletNamePane}, - - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Template_Parameters") + ":"), null}, - {new UILabel("message" + ":"), new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Verify_Message"))}, - {new UILabel("charset" + ":"), new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Server_Charset"))}, - {new UILabel("exception" + ":"), new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Exception_Stack_Trace"))} - }; - JPanel northPane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); - - this.add(northPane, BorderLayout.NORTH); + this.setLayout(new BorderLayout()); + this.templateField = new UITextField(); + JPanel northPane = column(LayoutConstants.VERTICAL_GAP, + row(LayoutConstants.HORIZONTAL_GAP, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Template_Path"))), + cell(this.templateField).weight(1) + ), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Template_Parameters"))), + row( + cell(new UILabel("message" + ":")), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Verify_Message"))) + ), + row( + cell(new UILabel("charset" + ":")), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Server_Charset"))) + ), + row( + cell(new UILabel("exception" + ":")), + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Exception_Stack_Trace"))) + ) + ).getComponent(); + northPane.setBorder(new ScaledEmptyBorder(10,10,10,10)); + this.add(northPane); } @Override @@ -59,6 +57,4 @@ public class ErrorTemplatePane extends BasicBeanPane { public String updateBean() { return this.templateField.getText(); } - - } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/EventPane.java b/designer-realize/src/main/java/com/fr/design/webattr/EventPane.java index ff4e4296db..5f3d43cf5c 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/EventPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/EventPane.java @@ -1,7 +1,11 @@ package com.fr.design.webattr; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.design.actions.UpdateAction; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.itoolbar.UIToolbar; @@ -32,6 +36,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; + /** * richer:调用该类并且对事件名字国际化时需要严格按照"FR-Engine_Event_事件名"来进行命名 */ @@ -53,14 +60,8 @@ public class EventPane extends BasicPane { int len = eventName.length; this.eventName = Arrays.copyOf(eventName, len); this.setLayout(FRGUIPaneFactory.createBorderLayout()); - listModel = new DefaultListModel(); - eventList = new JList(listModel); -// eventList.setFixedCellHeight(20); - eventList.setCellRenderer(render); - eventList.addMouseListener(editListener); - this.add(new UIScrollPane(eventList), BorderLayout.CENTER); + //按钮栏 addAction = new AddMenuDef(this.eventName); - editAction = new EditAction(); removeAction = new RemoveAction(); ToolBarDef def = new ToolBarDef(); @@ -69,8 +70,16 @@ public class EventPane extends BasicPane { def.addShortCut(removeAction); UIToolbar toolBar = ToolBarDef.createJToolBar(); def.updateToolBar(toolBar); - toolBar.setPreferredSize(new Dimension(toolBar.getWidth(), 26)); - this.add(toolBar, BorderLayout.NORTH); + //列表 + listModel = new DefaultListModel(); + eventList = new JList(listModel); + eventList.setCellRenderer(render); + eventList.addMouseListener(editListener); + eventList.setBackground(FlatUIUtils.getUIColor("fill.normal", Color.WHITE)); + JScrollPane scrollPane = new UIScrollPane(eventList); + scrollPane.setBorder(new FineRoundBorder()); + //让事件设置列表铺满,有特殊设置在外层调用处修改 + this.add(column(LayoutConstants.VGAP_SMALL, cell(toolBar), cell(scrollPane).weight(1)).getComponent()); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/webattr/PageToolBarPane.java b/designer-realize/src/main/java/com/fr/design/webattr/PageToolBarPane.java index 783bc0e6a3..cdf103c95e 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/PageToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/PageToolBarPane.java @@ -1,7 +1,10 @@ package com.fr.design.webattr; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.ConfigManager; import com.fr.config.Configuration; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.core.WidgetOption; @@ -11,8 +14,6 @@ import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.form.event.Listener; import com.fr.general.ComparatorUtils; @@ -28,7 +29,6 @@ import com.fr.design.i18n.Toolkit; import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputMethodEvent; @@ -44,6 +44,12 @@ import javax.swing.ButtonGroup; import javax.swing.JPanel; import javax.swing.SwingUtilities; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapBoldLabelWithUnderline; + public class PageToolBarPane extends AbstractEditToolBarPane { private UIRadioButton centerRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Center_Display")); @@ -59,7 +65,6 @@ public class PageToolBarPane extends AbstractEditToolBarPane { private UICheckBox isPageFixedRowBox; private UITextField pageFixedRowCountTextField; - private static final Color TIPS_FONT_COLOR = new Color(0x8f8f92); private static final Pattern ROW_COUNT = Pattern.compile("^[1-9][\\d]*$|^0"); //固定行数分页,每页最多500行,最少1行数据 @@ -68,14 +73,13 @@ public class PageToolBarPane extends AbstractEditToolBarPane { public PageToolBarPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.setBorder(new ScaledEmptyBorder(10,10,10,10)); ButtonGroup buttonGroup = new ButtonGroup(); leftRadioButton.setSelected(true); buttonGroup.add(centerRadioButton); buttonGroup.add(leftRadioButton); - JPanel buttonPane = new JPanel(FRGUIPaneFactory.createBoxFlowLayout()); - buttonPane.add(centerRadioButton); - buttonPane.add(leftRadioButton); + isShowAsImageBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Is_Paint_Page")); isAutoScaleBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_IS_Auto_Scale")); isTDHeavyBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_IS_TD_HEAVY_EXPORT"), false); @@ -87,56 +91,68 @@ public class PageToolBarPane extends AbstractEditToolBarPane { } }); editToolBarButton.addActionListener(editBtnListener); - JPanel editToolBarButtonPanel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - editToolBarButtonPanel.add(editToolBarButton); isUseToolBarCheckBox.setSelected(true); isUseToolBarCheckBox.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { editToolBarButton.setEnabled(isUseToolBarCheckBox.isSelected()); } }); - double p = TableLayout.PREFERRED; - - pageFixedRowCountTextField = new UITextField(5); + pageFixedRowCountTextField = new UITextField(); pageFixedRowCountTextField.setText("30"); pageFixedRowCountTextField.setToolTipText(Toolkit.i18nText("Fine-Design_Report_Page_Fixed_Row_Count_Tip")); - pageFixedRowCountTextField.addKeyListener(rowCountKeyListener); pageFixedRowCountTextField.addInputMethodListener(rowCountInputMethodListener); - UILabel linesPerPageLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Rows_Per_Page") + ":"); - Component[][] rowCountTextFieldComponents = {{linesPerPageLabel,pageFixedRowCountTextField}}; - JPanel linesPerPagePane = TableLayoutHelper.createTableLayoutPane(rowCountTextFieldComponents, new double[]{p}, new double[]{p,p}); UILabel tipLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Page_Fixed_Row_Tip")); - tipLabel.setForeground(TIPS_FONT_COLOR); - - double[] columnSize = {p, p, p, p}; - double[] rowSize = {p, p, p, p, p}; - Component[][] components = new Component[][]{ - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Report_Show_Location") + ":", UILabel.RIGHT), buttonPane, null, null}, - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Report_PageSetup_Page") + ":", UILabel.RIGHT), isShowAsImageBox, isAutoScaleBox, isTDHeavyBox}, - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Report_Paging_Settings") + ":", UILabel.RIGHT), isPageFixedRowBox, linesPerPagePane, null}, - new Component[]{null, tipLabel, null, null}, - new Component[]{isUseToolBarCheckBox, editToolBarButtonPanel, null, null} - }; + FineUIStyle.setStyle(tipLabel, FineUIStyle.LABEL_TIP); - JPanel northPanel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); - this.add(northPanel, BorderLayout.NORTH); + JPanel northPanel = column(LayoutConstants.VERTICAL_GAP, + //报表显示位置:居中展示-左展示 + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Location"))).weight(0.15), + cell(centerRadioButton).weight(0.2), + cell(leftRadioButton).weight(0.15), + flex(0.5) + ), + //页面:以图片方式显示-iframe嵌入时自动缩放-重方式输出格子 + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Page"))).weight(0.15), + cell(isShowAsImageBox).weight(0.2), + cell(isAutoScaleBox).weight(0.25), + cell(isTDHeavyBox).weight(0.2), + flex(0.2) + ), + //分页设置:按行分页-每页显示行数 + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Paging_Settings"))).weight(0.15), + cell(isPageFixedRowBox).weight(0.2), + cell(new UILabel(Toolkit.i18nText("Fine-Design_Report_Rows_Per_Page"))).weight(0.15), + cell(pageFixedRowCountTextField).weight(0.2), + flex(0.3) + ), + //提示 + cell(tipLabel), + //使用工具栏-编辑 + row(LayoutConstants.HORIZONTAL_GAP, cell(isUseToolBarCheckBox), cell(editToolBarButton)) + ).getComponent(); + //事件编辑 + JPanel eventPanel = new JPanel(new BorderLayout()); eventPane = new EventPane(new WebPage().supportedEvents()); - JPanel center = FRGUIPaneFactory.createBorderLayout_S_Pane(); - center.add(eventPane, BorderLayout.CENTER); + UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Editing_Listeners")); + wrapBoldLabelWithUnderline(label); + eventPanel.add(column(LayoutConstants.VGAP_SMALL, cell(label), cell(eventPane).weight(1)).getComponent()); + + this.add(column(LayoutConstants.VERTICAL_GAP, + cell(northPanel), + cell(eventPanel).weight(1) + ).getComponent()); + //wei : 默认没config.xml的情况下,就有默认工具栏 ToolBarManager toolBarManager = ToolBarManager.createDefaultToolBar(); toolBarManager.setToolBarLocation(Location.createTopEmbedLocation()); this.toolBarManagers = new ToolBarManager[]{toolBarManager}; - - this.add(center, BorderLayout.CENTER); } - + @Override protected WidgetOption[] getToolBarInstance() { return ReportWebWidgetConstants.getPageToolBarInstance(); diff --git a/designer-realize/src/main/java/com/fr/design/webattr/PageWebSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/PageWebSettingPane.java index 1a3d323e9f..1adc107ed2 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/PageWebSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/PageWebSettingPane.java @@ -1,14 +1,13 @@ package com.fr.design.webattr; +import com.fine.theme.utils.FineUIStyle; import com.fr.design.ExtraDesignClassManager; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.general.ComparatorUtils; import com.fr.report.web.ToolBarManager; import com.fr.report.web.WebPage; @@ -16,7 +15,6 @@ import com.fr.stable.StringUtils; import com.fr.web.attr.ReportWebAttr; import com.fr.design.i18n.Toolkit; -import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputMethodEvent; @@ -27,11 +25,15 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.ButtonGroup; import javax.swing.JPanel; -import java.awt.Component; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + public class PageWebSettingPane extends WebSettingPane { private UIRadioButton centerRadioButton; private UIRadioButton leftRadioButton; @@ -40,7 +42,6 @@ public class PageWebSettingPane extends WebSettingPane { private UICheckBox isTDHeavyBox; private UICheckBox isPageFixedRowBox; private UITextField pageFixedRowCountTextField; - private static final Color TIPS_FONT_COLOR = new Color(0x8f8f92); private static final Pattern ROW_COUNT = Pattern.compile("^[1-9][\\d]*$|^0"); private static final String DEFAULT_ROW_COUNT = "30"; @@ -52,6 +53,10 @@ public class PageWebSettingPane extends WebSettingPane { super(); } + /** + * 模板-模板Web属性-分页预览设置中其余设置面板,通用部分在父类绘制 + * @return + */ @Override protected JPanel createOtherSetPane() { centerRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Center_Display")); @@ -60,9 +65,7 @@ public class PageWebSettingPane extends WebSettingPane { leftRadioButton.setSelected(true); buttonGroup.add(centerRadioButton); buttonGroup.add(leftRadioButton); - JPanel buttonpane = new JPanel(FRGUIPaneFactory.createBoxFlowLayout()); - buttonpane.add(centerRadioButton); - buttonpane.add(leftRadioButton); + isShowAsImageBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Is_Paint_Page")); isAutoScaleBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_IS_Auto_Scale")); isTDHeavyBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_IS_TD_HEAVY_EXPORT"), false); @@ -74,9 +77,7 @@ public class PageWebSettingPane extends WebSettingPane { } }); - double p = TableLayout.PREFERRED; - - pageFixedRowCountTextField = new UITextField(5); + pageFixedRowCountTextField = new UITextField(); pageFixedRowCountTextField.setToolTipText(Toolkit.i18nText("Fine-Design_Report_Page_Fixed_Row_Count_Tip")); pageFixedRowCountTextField.addKeyListener(new KeyAdapter() { @Override @@ -101,23 +102,35 @@ public class PageWebSettingPane extends WebSettingPane { } }); - UILabel linesPerPageLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Rows_Per_Page") + ":"); - Component[][] rowCountTextFieldComponents = {{linesPerPageLabel,pageFixedRowCountTextField}}; - JPanel linesPerPagePane = TableLayoutHelper.createTableLayoutPane(rowCountTextFieldComponents, new double[]{p}, new double[]{p,p}); UILabel tipLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Page_Fixed_Row_Tip")); - tipLabel.setForeground(TIPS_FONT_COLOR); - - double[] columnSize = {p, p, p, p}; - double[] rowSize = {p, p, p, p}; - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Location") + ":", UILabel.RIGHT), buttonpane, null, null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Page") + ":", UILabel.RIGHT), isShowAsImageBox, isAutoScaleBox, isTDHeavyBox}, - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Report_Paging_Settings") + ":", UILabel.RIGHT), isPageFixedRowBox, linesPerPagePane, null}, - new Component[]{null, tipLabel, null, null} - - }; - - return TableLayoutHelper.createTableLayoutPane(components,rowSize,columnSize); + FineUIStyle.setStyle(tipLabel, FineUIStyle.LABEL_TIP); + + //其余设置面板布局 + return column(LayoutConstants.VERTICAL_GAP, + //报表显示位置 + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Location"))).weight(0.15), + cell(centerRadioButton).weight(0.2), + cell(leftRadioButton).weight(0.15), + flex(0.5) + ), + //页面 + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Page"))).weight(0.15), + cell(isShowAsImageBox).weight(0.2), + cell(isAutoScaleBox).weight(0.25), + cell(isTDHeavyBox).weight(0.2), + flex(0.2) + ), + //分页设置 + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Paging_Settings"))).weight(0.15), cell(isPageFixedRowBox).weight(0.2), + cell(new UILabel(Toolkit.i18nText("Fine-Design_Report_Rows_Per_Page"))).weight(0.15), + cell(pageFixedRowCountTextField).weight(0.2), + flex(0.3) + ), + //提示 + cell(tipLabel) + ).getComponent(); } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ReportServerPrinterPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ReportServerPrinterPane.java index 8a519df3cf..389af156c6 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ReportServerPrinterPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ReportServerPrinterPane.java @@ -4,9 +4,9 @@ package com.fr.design.webattr; -import javax.swing.BorderFactory; import javax.swing.JPanel; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.report.web.Printer; /** @@ -23,7 +23,7 @@ public class ReportServerPrinterPane extends JPanel { protected void initComponents() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(6, 2, 4, 2)); + this.setBorder(new ScaledEmptyBorder(10,10,10,10)); serverPrinterPane = new ServerPrinterPane(); this.add(serverPrinterPane); } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ReportWebAttrPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ReportWebAttrPane.java index c8cef4ff96..17254cc5ca 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ReportWebAttrPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ReportWebAttrPane.java @@ -3,8 +3,8 @@ */ package com.fr.design.webattr; +import com.fr.design.gui.frpane.FineTabbedPane; import com.fr.design.gui.frpane.LoadingBasicPane; -import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.style.background.BackgroundPane; import com.fr.design.style.background.BackgroundPane4Browser; @@ -19,19 +19,13 @@ import java.awt.*; */ public class ReportWebAttrPane extends LoadingBasicPane { private ReportWebAttr reportWebAttr; - - private UITabbedPane tabbedPane; private CommonPane commonPane; private ReportServerPrinterPane serverPrintPane; - private PageWebSettingPane pageWeb; private WriteWebSettingPane writeWeb; private ViewWebSettingPane viewWeb; - private BackgroundPane backgroundPane; - protected WebCssPane cssPane; - protected WebJsPane jsPane; @@ -39,20 +33,20 @@ public class ReportWebAttrPane extends LoadingBasicPane { protected synchronized void initComponents(JPanel container) { JPanel defaultPane = container; defaultPane.setLayout(FRGUIPaneFactory.createBorderLayout()); - - //Tabbed Pane - tabbedPane = new UITabbedPane(); + //模板-模板Web属性 + FineTabbedPane tabbedPane = FineTabbedPane.builder() + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Basic"), commonPane = new CommonPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Printer(Server)"), serverPrintPane = new ReportServerPrinterPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Pagination_Setting"), pageWeb = new PageWebSettingPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Write_Setting"), writeWeb = new WriteWebSettingPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Data_Analysis_Settings"), viewWeb = new ViewWebSettingPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Browser_Background"), backgroundPane = new BackgroundPane4Browser()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Import_Css"), cssPane = new WebCssPane()) + .addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Import_JavaScript"), jsPane = new WebJsPane()) + .withTabLayout(new int[]{4, 4}) + .withHeadRatio(0.8f) + .build(); defaultPane.add(tabbedPane, BorderLayout.CENTER); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Basic"), commonPane = new CommonPane()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Printer(Server)"), serverPrintPane = new ReportServerPrinterPane()); - - tabbedPane.add(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Pagination_Setting"), pageWeb = new PageWebSettingPane()); - tabbedPane.add(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Write_Setting"), writeWeb = new WriteWebSettingPane()); - tabbedPane.add(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Data_Analysis_Settings"), viewWeb = new ViewWebSettingPane()); - - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Browser_Background"), backgroundPane = new BackgroundPane4Browser()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Import_Css"), cssPane = new WebCssPane()); - tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Import_JavaScript"), jsPane = new WebJsPane()); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ReportWebWidgetConstants.java b/designer-realize/src/main/java/com/fr/design/webattr/ReportWebWidgetConstants.java index ebfb53b80c..466f55e4d2 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ReportWebWidgetConstants.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ReportWebWidgetConstants.java @@ -1,5 +1,6 @@ package com.fr.design.webattr; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseUtils; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.core.WidgetOptionFactory; @@ -38,7 +39,6 @@ import com.fr.report.web.button.write.ImportExcelData; import com.fr.report.web.button.write.ShowCellValue; import com.fr.report.web.button.write.StashButton; import com.fr.report.web.button.write.Submit; -import com.fr.report.web.button.write.SubmitForcibly; import com.fr.report.web.button.write.Verify; public class ReportWebWidgetConstants { @@ -61,8 +61,8 @@ public class ReportWebWidgetConstants { } // 提交按钮 - public static final WidgetOption SUBMIT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Utils_Submit"), BaseUtils.readIcon("/com/fr/web/images/save.png"), - Submit.class); + public static final WidgetOption SUBMIT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Utils_Submit"), + BaseUtils.readIcon("/com/fr/web/images/save.png"), Submit.class); // flash打印按钮 public static final WidgetOption FLASHPRINT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Utils_Print[Client]"), @@ -70,102 +70,119 @@ public class ReportWebWidgetConstants { // appletprint public static final WidgetOption APPLETPRINT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Applet_Print"), - BaseUtils.readIcon("/com/fr/web/images/appletPrint.png"), AppletPrint.class); + new LazyIcon("printApplet"), AppletPrint.class); // PDF导出 - public static final WidgetOption PDF = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_PDF"), BaseUtils.readIcon("/com/fr/web/images/pdf.png"), - PDF.class); + public static final WidgetOption PDF = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_PDF"), + new LazyIcon("pdfFile"), PDF.class); // 客户端PDF打印 public static final WidgetOption PDFPRINT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Utils_Print[Client]"), - BaseUtils.readIcon("/com/fr/web/images/pdfPrint.png"), PDFPrint.class); - + new LazyIcon("printPdf"), PDFPrint.class); // 邮件发送 - public static final WidgetOption EMAIL = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Email"), BaseUtils.readIcon("/com/fr/web/images/email.png"), Email.class); - public static final WidgetOption PRINTPREVIEW = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PrintP_Print_Preview"), - BaseUtils.readIcon("/com/fr/web/images/preview.png"), PrintPreview.class); + public static final WidgetOption EMAIL = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Email"), + new LazyIcon("email"), Email.class); + // 打印预览 + public static final WidgetOption PRINTPREVIEW = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PrintP_Print_Preview"), + new LazyIcon("printPreview"), PrintPreview.class); // 导出成Excel 分页导出 public static final WidgetOption EXCELP = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Excel_Page"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), ExcelP.class); + new LazyIcon("excel_import"), ExcelP.class); // 导出成Excel 原样导出 public static final WidgetOption EXCELO = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Excel_Simple"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), ExcelO.class); + new LazyIcon("excel_import"), ExcelO.class); // 导出成Excel 分页分Sheet导出 public static final WidgetOption EXCELS = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Excel_Page_To_Sheet"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), ExcelS.class); + new LazyIcon("excel_import"), ExcelS.class); // 导出成Word - public static final WidgetOption WORD = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Word"), BaseUtils.readIcon("/com/fr/web/images/word.png"), Word.class); + public static final WidgetOption WORD = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Word"), + new LazyIcon("wordFile"), Word.class); + // 页面设置 - public static final WidgetOption PAGESETUP = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Page_Setup"), BaseUtils.readIcon("/com/fr/web/images/pageSetup.png"), PageSetup.class); + public static final WidgetOption PAGESETUP = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Page_Setup"), + new LazyIcon("pageSetup"), PageSetup.class); // 导出 - public static final WidgetOption EXPORT = WidgetOptionFactory - .createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Export"), BaseUtils.readIcon("/com/fr/web/images/export.png"), Export.class); + public static final WidgetOption EXPORT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Export"), + new LazyIcon("export"), Export.class); // 当前页/总页数 public static final WidgetOption PAGENAVI = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Page_Navi_Text"), - BaseUtils.readIcon("/com/fr/web/images/pageNumber.png"), PageNavi.class); + new LazyIcon("page_navi"), PageNavi.class); // 首页 - public static final WidgetOption FIRST = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_First"), BaseUtils.readIcon("/com/fr/web/images/first.png"), - First.class); + public static final WidgetOption FIRST = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_First"), + new LazyIcon("page_first"), First.class); // 末页 - public static final WidgetOption LAST = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_Last"), BaseUtils.readIcon("/com/fr/web/images/last.png"), - Last.class); + public static final WidgetOption LAST = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_Last"), + new LazyIcon("page_last"), Last.class); // 前一页 public static final WidgetOption PREVIOUS = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_Previous"), - BaseUtils.readIcon("/com/fr/web/images/previous.png"), Previous.class); + new LazyIcon("page_previous"), Previous.class); // 后一页 - public static final WidgetOption NEXT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_Next"), BaseUtils.readIcon("/com/fr/web/images/next.png"), - Next.class); - public static final WidgetOption SCALE = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Enlarge_Or_Reduce"), BaseUtils.readIcon("/com/fr/web/images/scale.png"), - Scale.class); - - public static final WidgetOption NEW_PRINT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Print"), BaseUtils.readIcon("/com/fr/web/images/print.png"), NewPrint.class); - public static final WidgetOption PRINT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Print_Compatible"), BaseUtils.readIcon("/com/fr/web/images/print.png"), Print.class); + public static final WidgetOption NEXT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ReportServerP_Next"), + new LazyIcon("page_next"), Next.class); + //缩放 + public static final WidgetOption SCALE = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Enlarge_Or_Reduce"), + new LazyIcon("scale"), Scale.class); + // 打印 + public static final WidgetOption NEW_PRINT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Print"), + new LazyIcon("print"), NewPrint.class); + // 打印兼容 + public static final WidgetOption PRINT = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Print_Compatible"), + new LazyIcon("print"), Print.class); + + //插入记录 public static final WidgetOption APPENDCOLUMNROW = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Insert_Record"), BaseUtils.readIcon("/com/fr/web/images/appendRow.png"), AppendColumnRow.class); + //删除记录 public static final WidgetOption DELETECOLUMNROW = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Delete_Record"), BaseUtils.readIcon("/com/fr/web/images/deleteRow.png"), DeleteColumnRow.class); - public static final WidgetOption VERIFY = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Verify_Data_Verify"), BaseUtils.readIcon("/com/fr/web/images/verify.png"), - Verify.class); - public static final WidgetOption SUBMITFORCIBLY = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Submit_Forcibly"), - BaseUtils.readIcon("/com/fr/web/images/save2.png"), SubmitForcibly.class); - // show cell value + //数据校验 + public static final WidgetOption VERIFY = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Verify_Data_Verify"), + new LazyIcon("dataVerify"), Verify.class); + + // show cell value 显示单元格值 public static final WidgetOption SHOWCELLVALUE = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Show_Cell_Value"), BaseUtils.readIcon("/com/fr/web/images/showValue.png"), ShowCellValue.class); - // import excel data + // import excel data 导入excel public static final WidgetOption IMPORTEXCELDATA = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Import_Excel_Data"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), ImportExcelData.class); + new LazyIcon("excel_import"), ImportExcelData.class); + //自定义导入excel public static final WidgetOption IMPORTEXCELDATA_CUSTOMIZED = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Utils_Import_Excel_Data_Customized"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), CustomizeImportExcelData.class); + new LazyIcon("excel_import"), CustomizeImportExcelData.class); + // 打印机偏移设置 - public static final WidgetOption SETPRINTEROFFSET = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_SetPrinterOffset"), BaseUtils.readIcon("/com/fr/web/images/pianyi.png"), SetPrinterOffset.class); + public static final WidgetOption SETPRINTEROFFSET = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_SetPrinterOffset"), + new LazyIcon("printerOffset"), SetPrinterOffset.class); - public static final WidgetOption CUSTOM_BUTTON = WidgetOptionFactory - .createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Custom_Form_Button"), CustomToolBarButton.class); + //自定义按钮 + public static final WidgetOption CUSTOM_BUTTON = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Custom_Form_Button"), + new LazyIcon("customButton"), CustomToolBarButton.class); // 数据暂存 public static final WidgetOption WRITESTASH = WidgetOptionFactory .createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine-Write_Stash"), BaseUtils.readIcon("/com/fr/web/images/edit/stash.png"), StashButton.class); + // 数据清空 - public static final WidgetOption WRITESTASHCLEAR = WidgetOptionFactory - .createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine-Write_Clear"), BaseUtils.readIcon("/com/fr/web/images/edit/clearstash.png"), ClearStashedButton.class); - //Excel导入 + public static final WidgetOption WRITESTASHCLEAR = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine-Write_Clear"), + new LazyIcon("clearStash"), ClearStashedButton.class); + + //Excel导入_多次 public static final WidgetOption IMPORTEXCEL= WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Excel_Import_Repeat"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), ExcelImport.class); + new LazyIcon("excel_import"), ExcelImport.class); //Excel导入_覆盖 public static final WidgetOption IMPORTEXCEL_COVER= WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Excel_Import_Cover"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), ImExcelCover.class); + new LazyIcon("excel_import"), ImExcelCover.class); //Excel导入_清空 public static final WidgetOption IMPORTEXCEL_CLEAN= WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Excel_Import_Clean"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), ImExcelClean.class); + new LazyIcon("excel_import"), ImExcelClean.class); //Excel导入_增量 public static final WidgetOption IMPORTEXCEL_APPEND= WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Excel_Import_Append"), - BaseUtils.readIcon("/com/fr/web/images/excel.png"), ImExcelAppend.class); + new LazyIcon("excel_import"), ImExcelAppend.class); } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ServerFitAttrPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ServerFitAttrPane.java index 059d9ad64d..4e2245bb44 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ServerFitAttrPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ServerFitAttrPane.java @@ -1,5 +1,7 @@ package com.fr.design.webattr; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.config.Configuration; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; @@ -11,7 +13,7 @@ import com.fr.report.fit.ReportFitConfig; import com.fr.transaction.Configurations; import com.fr.transaction.Worker; -import java.awt.Color; +import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; @@ -78,10 +80,14 @@ public class ServerFitAttrPane extends BaseFitAttrPane { }; } + /** + * 服务器配置-PC端自适应属性面板中需要添加提示 + */ @Override protected void initPrompt() { UILabel uiLabel = new UILabel(Toolkit.i18nText("Fine-Designer_Fit_Attr_Pane_Hint")); - uiLabel.setForeground(Color.lightGray); + FineUIStyle.setStyle(uiLabel, FineUIStyle.LABEL_TIP); + uiLabel.setBorder(new ScaledEmptyBorder(5, 5, 5, 0)); contentJPanel.add(uiLabel); } } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ServerPrinterPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ServerPrinterPane.java index ef4dc97dca..6a59579ddc 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ServerPrinterPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ServerPrinterPane.java @@ -3,7 +3,10 @@ */ package com.fr.design.webattr; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineRoundBorder; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; @@ -11,12 +14,10 @@ import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.general.GeneralUtils; import com.fr.report.web.Printer; import com.fr.stable.StringUtils; -import javax.swing.BorderFactory; import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListModel; import javax.swing.JList; @@ -28,7 +29,7 @@ import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.BorderLayout; -import java.awt.Dimension; +import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; @@ -36,6 +37,11 @@ import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + public class ServerPrinterPane extends BasicPane { private JList printerList; @@ -52,38 +58,28 @@ public class ServerPrinterPane extends BasicPane { } protected void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(6, 2, 4, 2)); - + this.setLayout(new BorderLayout()); //Kevin Wang: 为左侧打印机添加五个图形形式的按钮 JToolBar toolbar = new JToolBar(); - this.add(toolbar, BorderLayout.NORTH); - - Dimension preferDimension = new Dimension(24, 24); - addButton = new UIButton(BaseUtils.readIcon("/com/fr/base/images/cell/control/add.png")); + addButton = new UIButton(new LazyIcon("add")); addButton.addActionListener(addActionListener); addButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add"));//"add" - addButton.setPreferredSize(preferDimension); - editButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/edit.png")); + editButton = new UIButton(new LazyIcon("edit")); editButton.addActionListener(editActionListener); editButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Edit"));//"edit" - editButton.setPreferredSize(preferDimension); - removeButton = new UIButton(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); + removeButton = new UIButton(new LazyIcon("remove")); removeButton.addActionListener(this.removeActionListener); removeButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"));//"remove" - removeButton.setPreferredSize(preferDimension); - moveUpButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/up.png")); + moveUpButton = new UIButton(new LazyIcon("move_up")); moveUpButton.addActionListener(this.moveUpActionListener); moveUpButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Up"));//"moveUp" - moveUpButton.setPreferredSize(preferDimension); - moveDownButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/down.png")); + moveDownButton = new UIButton(new LazyIcon("move_down")); moveDownButton.addActionListener(this.moveDownActionListener); moveDownButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Move_Down"));//"moveDown" - moveDownButton.setPreferredSize(preferDimension); toolbar.add(addButton); toolbar.add(editButton); @@ -93,11 +89,12 @@ public class ServerPrinterPane extends BasicPane { printerList = new JList(new DefaultListModel()); printerList.addListSelectionListener(printerSelectionListener); + printerList.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); + JScrollPane printerListScrollPane = new JScrollPane(printerList); + printerListScrollPane.setBorder(new FineRoundBorder()); //shark:双击printerlist也可以编辑 printerList.addMouseListener(mouseClickedListener); - this.add(new JScrollPane(printerList), BorderLayout.CENTER); - - // + this.add(column(cell(toolbar), cell(printerListScrollPane).weight(1)).getComponent()); this.checkButtonEnabled(); } @@ -105,7 +102,7 @@ public class ServerPrinterPane extends BasicPane { protected String title4PopupWindow() { return "printer"; } - + private void checkButtonEnabled() { this.editButton.setEnabled(false); this.removeButton.setEnabled(false); @@ -126,7 +123,7 @@ public class ServerPrinterPane extends BasicPane { } } } - + ActionListener addActionListener = new ActionListener(){ public void actionPerformed(ActionEvent evt){ final PrintersPane printersPane = new PrintersPane(); @@ -139,13 +136,13 @@ public class ServerPrinterPane extends BasicPane { defaultListModel.addElement(newPrintName); printerList.setSelectedIndex(defaultListModel.size() - 1); } - } - }); + } + }); printerDialog.setTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportServerP_Add_Printer") + "..."); printerDialog.setVisible(true); } }; - + ActionListener editActionListener = new ActionListener(){ public void actionPerformed(ActionEvent evt){ editPrinterList(); @@ -230,7 +227,7 @@ public class ServerPrinterPane extends BasicPane { checkButtonEnabled(); } }; - + MouseAdapter mouseClickedListener = new MouseAdapter(){ @Override public void mouseClicked(MouseEvent e){ @@ -253,14 +250,14 @@ public class ServerPrinterPane extends BasicPane { if (StringUtils.isNotBlank(newPrintName)) { DefaultListModel defaultListModel = (DefaultListModel) printerList.getModel(); - + //shark 把该列删除 再在原位置插入新列 相当于替换 - defaultListModel.remove(index); - defaultListModel.add(index, newPrintName); + defaultListModel.remove(index); + defaultListModel.add(index, newPrintName); printerList.setSelectedIndex(index); } - } - }); + } + }); printersPane.populate(printerList.getSelectedValue().toString()); printerDialog.setTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportServerP_Edit_Printer") + "..."); printerDialog.setVisible(true); @@ -287,7 +284,7 @@ public class ServerPrinterPane extends BasicPane { public Printer update() { Printer printer = new Printer(); - + List serverPrinterList = new ArrayList(); DefaultListModel defaultListModel = (DefaultListModel) this.printerList.getModel(); @@ -304,7 +301,7 @@ public class ServerPrinterPane extends BasicPane { } else { printer.setPrinters(null); } - + return printer; } @@ -315,25 +312,24 @@ public class ServerPrinterPane extends BasicPane { this.initComponents(); } - protected void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(20, 5, 0, 0)); - JPanel centerPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - centerPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Printer") + ":"), BorderLayout.WEST); - + this.setLayout(new BorderLayout()); DefaultComboBoxModel printerComboModel = new DefaultComboBoxModel(); - printerCombo = new UIComboBox(printerComboModel); - centerPane.add(printerCombo); - + //添加打印机面板 + JPanel centerPane = column( + flex(), + row(LayoutConstants.HORIZONTAL_GAP, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Printer") + ":")), + cell(printerCombo).weight(1) + ), + flex() + ).getComponent(); // populate printer list. String[] serverPrinterList = GeneralUtils.getSystemPrinterNameArray(); - for (int d = 0; d < serverPrinterList.length; d++) { printerComboModel.addElement(serverPrinterList[d]); } - this.add(centerPane); } @@ -354,7 +350,7 @@ public class ServerPrinterPane extends BasicPane { protected boolean isShowHelpButton() { return false; } - + @Override protected String title4PopupWindow() { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Printer"); diff --git a/designer-realize/src/main/java/com/fr/design/webattr/SettingToolBar.java b/designer-realize/src/main/java/com/fr/design/webattr/SettingToolBar.java index 5a97f75eff..75c17326e8 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/SettingToolBar.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/SettingToolBar.java @@ -1,40 +1,49 @@ package com.fr.design.webattr; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Icon; import javax.swing.JPanel; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.row; + public class SettingToolBar extends JPanel { - private Icon setIcon = BaseUtils.readIcon("com/fr/design/images/toolbarbtn/toolbarbtnsetting.png"); - private Icon delIcon = BaseUtils.readIcon("com/fr/design/images/toolbarbtn/toolbarbtnclear.png"); + private Icon setIcon = new LazyIcon("tool_config"); + private Icon delIcon = new LazyIcon("clear"); private UIButton setButton; private UIButton delButton; private ToolBarPane toolBarPane; public SettingToolBar(String name,ToolBarPane toolBarPane) { - super(); -// this.setBackground(Color.lightGray); - this.add(new UILabel(name)); + super(new BorderLayout()); this.toolBarPane = toolBarPane; - setButton = GUICoreUtils.createTransparentButton(setIcon, setIcon, setIcon); + setButton = new UIButton(setIcon); setButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Edit_Button_ToolBar")); setButton.setAction(new SetAction()); - delButton = GUICoreUtils.createTransparentButton(delIcon, delIcon, delIcon); + + delButton = new UIButton(delIcon); delButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Remove_Button_ToolBar")); delButton.setAction(new DelAction()); - this.add(setButton); - this.add(delButton); + + this.add(row(LayoutConstants.HGAP_LARGE, + fix(LayoutConstants.HGAP_LARGE), + cell(new UILabel(name)), + cell(setButton), + cell(delButton) + ).getComponent()); } public void setEnabled(boolean b) { diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarButton.java b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarButton.java index 5e61682d87..b3e1e4e9f9 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarButton.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarButton.java @@ -1,6 +1,5 @@ package com.fr.design.webattr; -import com.fr.base.BaseUtils; import com.fr.base.vcs.DesignerMode; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.mainframe.DesignerContext; @@ -8,13 +7,12 @@ import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.core.WidgetOption; import com.fr.form.ui.Widget; -import com.fr.form.ui.WidgetInfoConfig; -import com.fr.stable.StringUtils; -import javax.swing.*; -import java.awt.*; +import java.awt.Insets; +import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; +import javax.swing.Icon; public class ToolBarButton extends UIButton implements MouseListener { private Widget widget; @@ -27,16 +25,8 @@ public class ToolBarButton extends UIButton implements MouseListener { public ToolBarButton(String text, Icon icon, Widget widget) { super(text, icon); this.widget = widget; - if (widget instanceof com.fr.form.ui.Button) { - com.fr.form.ui.Button button = (com.fr.form.ui.Button) widget; - String iconName = button.getIconName(); - if (StringUtils.isNotEmpty(iconName)) { - Image iimage = WidgetInfoConfig.getInstance().getIconManager().getIconImage(iconName); - if (iimage != null) { - setIcon(new ImageIcon(iimage)); - } - } - } + //直接设置Icon图标 + setIcon(icon); this.addMouseListener(this); setMargin(new Insets(0, 0, 0, 0)); } @@ -79,7 +69,6 @@ public class ToolBarButton extends UIButton implements MouseListener { this.no = no; } - protected void paintBorder(Graphics g) { this.setBorderType(UIButton.NORMAL_BORDER); super.paintBorder(g); diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java index 868475b524..d7fbe0ac05 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java @@ -1,11 +1,15 @@ package com.fr.design.webattr; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.ExtraDesignClassManager; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; import com.fr.design.utils.gui.GUICoreUtils; @@ -23,19 +27,23 @@ import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; +import javax.swing.BorderFactory; +import javax.swing.UIManager; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumnModel; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; +import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.image.ImageObserver; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; + /** * 新的拖拽ToolBar button以实现自定义工具栏 报表web设置那儿的.应该不叫ToolBarDragPane,因为实际没有提供drag功能 * @@ -48,9 +56,12 @@ public class ToolBarDragPane extends WidgetToolBarPane { private int row = 7; private DefaultTableModel toolbarButtonTableModel; private JTable layoutTable; - private UICheckBox isUseToolBarCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Use_ToolBar") + ":"); // 是否使用工具栏 + private UICheckBox isUseToolBarCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Use_ToolBar")); // 是否使用工具栏 private boolean isEnabled; + /** + * 工具栏Pane + */ public ToolBarDragPane() { WidgetOption[] options = ExtraDesignClassManager.getInstance().getWebWidgetOptions(); if(options != null){ @@ -59,10 +70,14 @@ public class ToolBarDragPane extends WidgetToolBarPane { } toolbarButtonTableModel = new TableModel(row ,COLUMN); this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel north = FRGUIPaneFactory.createBorderLayout_S_Pane(); - UIButton defaultButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Restore_Default")); - // 恢复默认按钮 - defaultButton.addActionListener(new ActionListener() { + + //工具栏上方面板 + JPanel northPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + isUseToolBarCheckBox.setSelected(true); + northPanel.add(isUseToolBarCheckBox, BorderLayout.WEST); + //恢复默认按钮 + UIButton defaultButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Restore_Default")); + defaultButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { northToolBar.removeButtonList(); northToolBar.removeAll(); @@ -78,26 +93,30 @@ public class ToolBarDragPane extends WidgetToolBarPane { ToolBarDragPane.this.repaint(); } }); + northPanel.add(defaultButton, BorderLayout.EAST); - north.add(isUseToolBarCheckBox, BorderLayout.WEST); - JPanel aa = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - aa.add(defaultButton); - north.add(aa, BorderLayout.CENTER); - this.add(north, BorderLayout.NORTH); - + //顶部工具栏 + JPanel northContentPane = new JPanel(new BorderLayout()); northToolBar = new ToolBarPane(); - northToolBar.setPreferredSize(new Dimension(ImageObserver.WIDTH, 26)); -// northToolBar.setBackground(Color.lightGray); - - UIButton topButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/arrow/arrow_up.png")); - topButton.setBorder(null); - // topButton.setMargin(null); - topButton.setOpaque(false); + northToolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, UIManager.getColor("defaultBorderColor"))); + northToolBar.setOpaque(false); + SettingToolBar top = new SettingToolBar(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ToolBar_Top"), northToolBar); + top.setOpaque(false); + northContentPane.add(northToolBar, BorderLayout.CENTER); + northContentPane.add(top, BorderLayout.EAST); + northContentPane.setOpaque(false); + northContentPane.setBorder(new ScaledEmptyBorder(4,0,4,0)); + JPanel topToolbarPanel = new JPanel(new BorderLayout()); + topToolbarPanel.add(northContentPane); + topToolbarPanel.setBackground(FineUIUtils.getUIColor("Center.ZoneBorderColor", "defaultBorderColor")); + + //移入顶部工具栏按钮 + UIButton topButton = new UIButton(new LazyIcon("move_up")); + topButton.setOpaque(false); topButton.setContentAreaFilled(false); topButton.setFocusPainted(false); topButton.setRequestFocusEnabled(false); topButton.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { if (isSelectedtable()) { @@ -113,15 +132,26 @@ public class ToolBarDragPane extends WidgetToolBarPane { } } }); - UIButton downButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/arrow/arrow_down.png")); - downButton.setBorder(null); + + //图标列表面板,增加外边距 + initLayoutTable(); + JPanel innerTablePanel = new JPanel(new BorderLayout()); + innerTablePanel.add(layoutTable); + innerTablePanel.setOpaque(false); + innerTablePanel.setBorder(new ScaledEmptyBorder(4,4,4,4)); + JPanel buttonTablePanel = new JPanel(new BorderLayout()); + buttonTablePanel.setBackground(FlatUIUtils.getUIColor("fill.normal", Color.WHITE)); + buttonTablePanel.setBorder(new FineRoundBorder()); + buttonTablePanel.add(innerTablePanel); + + //移入底部工具栏按钮 + UIButton downButton = new UIButton(new LazyIcon("move_down")); downButton.setMargin(null); downButton.setOpaque(false); downButton.setContentAreaFilled(false); downButton.setFocusPainted(false); downButton.setRequestFocusEnabled(false); downButton.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { if (isSelectedtable()) { @@ -138,48 +168,44 @@ public class ToolBarDragPane extends WidgetToolBarPane { } }); - initLayoutTable(); - - JPanel center = FRGUIPaneFactory.createBorderLayout_S_Pane(); -// center.setBackground(Color.WHITE); - center.add(topButton, BorderLayout.NORTH); - JPanel small = FRGUIPaneFactory.createBorderLayout_S_Pane(); -// small.setBackground(Color.WHITE); - small.add(new UILabel(StringUtils.BLANK), BorderLayout.NORTH); - small.add(layoutTable, BorderLayout.CENTER); - center.add(small, BorderLayout.CENTER); - center.add(downButton, BorderLayout.SOUTH); - southToolBar = new ToolBarPane(); - southToolBar.setPreferredSize(new Dimension(ImageObserver.WIDTH, 26)); -// southToolBar.setBackground(Color.lightGray); - JPanel movePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - JPanel northContentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - SettingToolBar top = new SettingToolBar(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ToolBar_Top"), northToolBar); - northContentPane.add(top, BorderLayout.EAST); - northContentPane.add(northToolBar, BorderLayout.CENTER); -// northContentPane.setBackground(Color.lightGray); - + //底部工具栏 JPanel southContentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + southToolBar = new ToolBarPane(); + southToolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, UIManager.getColor("defaultBorderColor"))); + southToolBar.setOpaque(false); SettingToolBar bottom = new SettingToolBar(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ToolBar_Bottom"), southToolBar); + bottom.setOpaque(false); southContentPane.add(bottom, BorderLayout.EAST); southContentPane.add(southToolBar, BorderLayout.CENTER); -// southContentPane.setBackground(Color.lightGray); + southContentPane.setOpaque(false); + southContentPane.setBorder(new ScaledEmptyBorder(4,0,4,0)); + JPanel bottomToolbarPanel = new JPanel(new BorderLayout()); + bottomToolbarPanel.add(southContentPane); + bottomToolbarPanel.setBackground(FineUIUtils.getUIColor("Center.ZoneBorderColor", "defaultBorderColor")); - movePane.add(northContentPane, BorderLayout.NORTH); - movePane.add(center, BorderLayout.CENTER); - movePane.add(southContentPane, BorderLayout.SOUTH); - - this.add(new JScrollPane(movePane), BorderLayout.CENTER); - isUseToolBarCheckBox.setSelected(true); + //工具栏面板center布局:顶部工具栏-上移动按钮-图标面板-下移动按钮-底部工具栏 + JPanel movePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + movePane.add(column(1, + cell(topToolbarPanel), + cell(topButton), + cell(buttonTablePanel), + cell(downButton), + cell(bottomToolbarPanel) + ).getComponent()); + //工具栏整体面板 + this.add(column(LayoutConstants.VERTICAL_GAP, cell(northPanel), cell(new JScrollPane(movePane))).getComponent()); } + /** + * 图标列表 + */ private void initLayoutTable() { layoutTable = new JTable(toolbarButtonTableModel); layoutTable.setDefaultRenderer(Object.class, tableRenderer); layoutTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); layoutTable.setColumnSelectionAllowed(false); layoutTable.setRowSelectionAllowed(false); -// layoutTable.setBackground(Color.WHITE); + layoutTable.setOpaque(false); layoutTable.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() > 1 && !(SwingUtilities.isRightMouseButton(e)) && isEnabled) { @@ -280,6 +306,7 @@ public class ToolBarDragPane extends WidgetToolBarPane { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + this.setOpaque(false); if (value instanceof WidgetOption) { WidgetOption nameOption = (WidgetOption)value; diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarPane.java index ef228699f6..747d0a2b75 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarPane.java @@ -13,7 +13,7 @@ import com.fr.report.web.annotation.OldPrintMethod; import javax.swing.BorderFactory; import javax.swing.SwingUtilities; import javax.swing.TransferHandler; -import java.awt.Component; +import java.awt.*; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.event.MouseAdapter; @@ -55,6 +55,7 @@ public class ToolBarPane extends BasicBeanPane { public void initComponent() { this.addMouseListener(listener); this.setLayout(FRGUIPaneFactory.createBoxFlowLayout()); + this.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 2)); this.setTransferHandler(new ToolBarHandler(TransferHandler.COPY)); this.setBorder(BorderFactory.createTitledBorder("")); } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ViewToolBarPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ViewToolBarPane.java index c396538dd4..f6bdc7e193 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ViewToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ViewToolBarPane.java @@ -1,7 +1,9 @@ package com.fr.design.webattr; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.ConfigManager; import com.fr.config.Configuration; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.core.WidgetOption; @@ -9,7 +11,6 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.form.event.Listener; import com.fr.report.web.Location; @@ -27,24 +28,25 @@ import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapBoldLabelWithUnderline; + public class ViewToolBarPane extends AbstractEditToolBarPane { private EventPane eventPane; - + private UICheckBox isUseToolBarCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Use_ToolBar")); private UIButton editToolBarButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit")); - private UILabel showListenersLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Editing_Listeners") + ":"); + private UILabel showListenersLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Editing_Listeners")); private UICheckBox sortCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Sort_Sort")); private UICheckBox conditonFilterBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Selection_Filter")); private UICheckBox listFilterBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_List_Filter")); - + public ViewToolBarPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel allPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); - - this.add(allPanel, BorderLayout.CENTER); - JPanel northPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(1); - allPanel.add(northPane, BorderLayout.NORTH); - editToolBarButton.addActionListener(editBtnListener); + this.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); + editToolBarButton.addActionListener(editBtnListener); isUseToolBarCheckBox.setSelected(true); isUseToolBarCheckBox.addActionListener(new ActionListener() { @Override @@ -56,25 +58,35 @@ public class ViewToolBarPane extends AbstractEditToolBarPane { sortCheckBox.setSelected(false); conditonFilterBox.setSelected(false); listFilterBox.setSelected(false); - northPane.add(GUICoreUtils.createFlowPane(new Component[]{sortCheckBox, conditonFilterBox, listFilterBox}, FlowLayout.LEFT, 6)); - northPane.add(GUICoreUtils.createFlowPane(new Component[] {isUseToolBarCheckBox, editToolBarButton}, FlowLayout.LEFT)); - northPane.add(GUICoreUtils.createFlowPane(showListenersLabel, FlowLayout.LEFT)); + JPanel northPanel = column(LayoutConstants.VERTICAL_GAP, + row(LayoutConstants.HORIZONTAL_GAP, cell(sortCheckBox), cell(conditonFilterBox), cell(listFilterBox)), + row(LayoutConstants.HORIZONTAL_GAP, cell(isUseToolBarCheckBox), cell(editToolBarButton)) + ).getComponent(); + + //事件编辑 + JPanel eventPanel = new JPanel(new BorderLayout()); eventPane = new EventPane(new WebView().supportedEvents()); - JPanel center = FRGUIPaneFactory.createBorderLayout_S_Pane(); - center.add(eventPane, BorderLayout.CENTER); - allPanel.add(center, BorderLayout.CENTER); + wrapBoldLabelWithUnderline(showListenersLabel); + eventPanel.add(column(LayoutConstants.VGAP_SMALL, cell(showListenersLabel), cell(eventPane).weight(1)).getComponent()); + + //整体布局 + this.add(column(LayoutConstants.VERTICAL_GAP, + cell(northPanel), + cell(eventPanel).weight(1) + ).getComponent()); + //wei : 默认没config.xml的情况下,就有默认工具栏 ToolBarManager toolBarManager = ToolBarManager.createDefaultViewToolBar(); toolBarManager.setToolBarLocation(Location.createTopEmbedLocation()); this.toolBarManagers = new ToolBarManager[] {toolBarManager}; } - + @Override public void setEnabled(boolean isEnabled) { super.setEnabled(isEnabled); - + this.eventPane.setEnabled(isEnabled); - + this.isUseToolBarCheckBox.setEnabled(isEnabled); this.sortCheckBox.setEnabled(isEnabled); this.conditonFilterBox.setEnabled(isEnabled); @@ -82,7 +94,7 @@ public class ViewToolBarPane extends AbstractEditToolBarPane { this.editToolBarButton.setEnabled(isEnabled && isUseToolBarCheckBox.isSelected()); this.showListenersLabel.setEnabled(isEnabled); } - + @Override protected String title4PopupWindow() { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_M_Data_Analysis_Settings"); @@ -132,9 +144,9 @@ public class ViewToolBarPane extends AbstractEditToolBarPane { return webView; } - /** - * 编辑服务器工具栏窗格 - */ + /** + * 编辑服务器工具栏窗格 + */ @Override public void editServerToolBarPane() { final ViewToolBarPane serverPageToolBarPane = new ViewToolBarPane(); @@ -144,7 +156,7 @@ public class ViewToolBarPane extends AbstractEditToolBarPane { } BasicDialog serverPageDialog = serverPageToolBarPane.showWindow(SwingUtilities.getWindowAncestor(ViewToolBarPane.this)); serverPageDialog.addDialogActionListener(new DialogActionAdapter() { - + @Override public void doOk() { Configurations.update(new Worker() { @@ -163,12 +175,12 @@ public class ViewToolBarPane extends AbstractEditToolBarPane { } }); serverPageDialog.setVisible(true); - + } - @Override - protected WidgetOption[] getToolBarInstance() { - return ReportWebWidgetConstants.getViewToolBarInstance(); - } + @Override + protected WidgetOption[] getToolBarInstance() { + return ReportWebWidgetConstants.getViewToolBarInstance(); + } } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ViewWebSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ViewWebSettingPane.java index 1d91f0d911..8cc054a80c 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ViewWebSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ViewWebSettingPane.java @@ -4,18 +4,20 @@ import com.fr.design.ExtraDesignClassManager; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.report.web.ToolBarManager; import com.fr.report.web.WebView; import com.fr.web.attr.ReportWebAttr; import javax.swing.*; -import java.awt.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + public class ViewWebSettingPane extends WebSettingPane { private UICheckBox sortCheckBox; private UICheckBox conditionFilterBox; @@ -25,17 +27,24 @@ public class ViewWebSettingPane extends WebSettingPane { super(); } + /** + * 模板-模板Web属性-数据分析设置中其余设置面板,通用部分在父类绘制 + * @return + */ @Override protected JPanel createOtherSetPane() { sortCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Sort_Sort")); conditionFilterBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Selection_Filter")); listFilterBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_List_Filter")); - sortCheckBox.setSelected(true); conditionFilterBox.setSelected(true); listFilterBox.setSelected(true); - return GUICoreUtils.createFlowPane(new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ViewPreview") + ":"), - sortCheckBox, conditionFilterBox, listFilterBox}, FlowLayout.LEFT, 6); + return row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ViewPreview"))).weight(0.15), + cell(sortCheckBox).weight(0.15), + cell(conditionFilterBox).weight(0.15), + cell(listFilterBox).weight(0.15), + flex(0.4) + ).getComponent(); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/webattr/WebCssPane.java b/designer-realize/src/main/java/com/fr/design/webattr/WebCssPane.java index 7dcd3e21b2..240394940d 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/WebCssPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/WebCssPane.java @@ -1,5 +1,8 @@ package com.fr.design.webattr; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.frpane.EditingStringListPane; import com.fr.design.gui.ibutton.UIButton; @@ -16,57 +19,60 @@ import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; import com.fr.web.attr.ReportWebAttr; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; + public class WebCssPane extends BasicPane { private UITextField localText; UIButton chooseFile; private EditingStringListPane centerPane; public WebCssPane() { - this.setLayout(new BorderLayout(0, 20)); - this.setBorder(BorderFactory.createEmptyBorder(10, 5, 0, 0)); - - JPanel outnorth = new JPanel(new BorderLayout(0, 5)); - JPanel northPane = new JPanel(new FlowLayout(FlowLayout.LEFT,8,0)); + this.setLayout(new BorderLayout()); + this.setBorder(new ScaledEmptyBorder(10,10,10,10)); + + //磁盘文件 localText = new UITextField(); localText.setPreferredSize(DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.web.pane.text.field")); localText.setEditable(false); chooseFile = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Selection")); - chooseFile.setPreferredSize(new Dimension(75, 23)); chooseFile.addActionListener(chooseFileListener); - northPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Disk_File") + ":"), FlowLayout.LEFT); - northPane.add(localText, FlowLayout.CENTER); - northPane.add(chooseFile, FlowLayout.RIGHT); - outnorth.add(northPane,BorderLayout.NORTH); - UILabel infor = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CSS_Warning", - ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBAPP_NAME)); - infor.setForeground(new Color(207, 42, 39)); - outnorth.add(infor,BorderLayout.CENTER); - this.add(outnorth, BorderLayout.NORTH); - centerPane = new EditingStringListPane() { + //红色提示信息 + UILabel info = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_CSS_Warning", + ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBAPP_NAME)); + FineUIStyle.setStyle(info, FineUIStyle.LABEL_WARNING_TIP); + centerPane = new EditingStringListPane() { @Override protected void selectedChanged(String selected) { localText.setText(selected); checkEnableState(); } - @Override protected String getAddOrEditString() { return localText.getText(); } }; - this.add(centerPane, BorderLayout.CENTER); + + JPanel workPanel = new JPanel(new BorderLayout()); + workPanel.add(column(LayoutConstants.VERTICAL_GAP, + row(LayoutConstants.VERTICAL_GAP, + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Disk_File"))), + cell(localText).weight(0.8), + cell(chooseFile) + ), + cell(info), + cell(centerPane) + ).getComponent()); + this.add(workPanel); } private ActionListener chooseFileListener = new ActionListener() { @@ -122,6 +128,5 @@ public class WebCssPane extends BasicPane { String a = valueList.get(i); reportWebAttr.addCSSImport(a); } - } } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/WebJsPane.java b/designer-realize/src/main/java/com/fr/design/webattr/WebJsPane.java index 7b371802b6..408d9aa459 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/WebJsPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/WebJsPane.java @@ -1,5 +1,8 @@ package com.fr.design.webattr; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.frpane.EditingStringListPane; @@ -19,15 +22,12 @@ import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; import com.fr.web.attr.ReportWebAttr; -import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingUtilities; import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; @@ -40,6 +40,10 @@ import java.net.URLConnection; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; + public class WebJsPane extends BasicPane { private UITextField localText; private UITextField urlText; @@ -48,15 +52,15 @@ public class WebJsPane extends BasicPane { private EditingStringListPane editingPane; UIButton chooseFile; UIButton testConnection; - UILabel infor1; - UILabel infor2; + UILabel info1; + UILabel info2; public WebJsPane() { - this.setLayout(new BorderLayout(0, 20)); - this.setBorder(BorderFactory.createEmptyBorder(10, 5, 0, 0)); + this.setLayout(new BorderLayout()); + this.setBorder(new ScaledEmptyBorder(10,10,10,10)); - localFileRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Disk_File") + ":", true); - urlFileRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Url_Location")+ ":", false); + localFileRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Disk_File"), true); + urlFileRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Url_Location"), false); ButtonGroup bg = new ButtonGroup(); bg.add(localFileRadioButton); bg.add(urlFileRadioButton); @@ -85,38 +89,24 @@ public class WebJsPane extends BasicPane { testConnection.setPreferredSize(chooseFile.getPreferredSize()); } - createNorthPane(); - createEditingPane(); } private void createNorthPane() { - JPanel outnorth = new JPanel(new BorderLayout(0, 5)); - JPanel firstnorth = new JPanel(new BorderLayout(0, 5)); - JPanel northPane = new JPanel(new FlowLayout(FlowLayout.LEFT,7,0)); - northPane.add(localFileRadioButton); - northPane.add(localText); - northPane.add(chooseFile); - firstnorth.add(northPane,BorderLayout.NORTH); - infor1 = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JS_WARNING1", - ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBAPP_NAME)); - infor1.setForeground(new Color(207, 42, 39)); - firstnorth.add(infor1,BorderLayout.CENTER); - - JPanel secondnorth = new JPanel(new BorderLayout(0, 5)); - JPanel centerPane = new JPanel(new FlowLayout(FlowLayout.LEFT,7,0)); - centerPane.add(urlFileRadioButton); - centerPane.add(urlText); - centerPane.add(testConnection); - secondnorth.add(centerPane,BorderLayout.NORTH); - infor2 = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JS_WARNING2", ProjectConstants.WEBAPP_NAME)); - infor2.setForeground(new Color(207, 42, 39)); - secondnorth.add(infor2,BorderLayout.CENTER); - - outnorth.add(firstnorth,BorderLayout.NORTH); - outnorth.add(secondnorth,BorderLayout.CENTER); - this.add(outnorth, BorderLayout.NORTH); + info1 = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JS_WARNING1", ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBAPP_NAME)); + FineUIStyle.setStyle(info1, FineUIStyle.LABEL_WARNING_TIP); + info2 = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JS_WARNING2", ProjectConstants.WEBAPP_NAME)); + FineUIStyle.setStyle(info2, FineUIStyle.LABEL_WARNING_TIP); + JPanel outNorth = column(LayoutConstants.VERTICAL_GAP, + row(LayoutConstants.HORIZONTAL_GAP, cell(localFileRadioButton), cell(localText).weight(0.8), cell(chooseFile)), + cell(info1), + row(LayoutConstants.HORIZONTAL_GAP, cell(urlFileRadioButton), cell(urlText).weight(0.8), cell(testConnection)), + cell(info2) + ).getComponent(); + JPanel workPanel = new JPanel(new BorderLayout()); + workPanel.add(outNorth); + this.add(workPanel, BorderLayout.NORTH); } private void createEditingPane() { @@ -130,7 +120,7 @@ public class WebJsPane extends BasicPane { if (url.matches("^[a-zA-z]+://.+js")) { return url; } else { - FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(WebJsPane.this), com.fr.design.i18n.Toolkit.i18nText("Add_JS_warning")); + FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(WebJsPane.this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add_JS_warning")); return ""; } } @@ -153,6 +143,10 @@ public class WebJsPane extends BasicPane { checkEnableState(); } }; + + JPanel workPanel = new JPanel(new BorderLayout()); + editingPane.setBorder(new ScaledEmptyBorder(10,0,0,0)); + workPanel.add(editingPane); this.add(editingPane, BorderLayout.CENTER); } @@ -162,7 +156,6 @@ public class WebJsPane extends BasicPane { } private ActionListener chooseFileListener = new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { FILEChooserPane fileChooser = FILEChooserPane.getInstance(false, false, true, @@ -191,7 +184,7 @@ public class WebJsPane extends BasicPane { public void actionPerformed(ActionEvent arg0) { String uri = urlText.getText(); if (!uri.matches("^[a-zA-z]+://.+js")) { - FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(WebJsPane.this), com.fr.design.i18n.Toolkit.i18nText("Add_JS_warning")); + FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(WebJsPane.this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add_JS_warning")); return; } InputStream in = null; @@ -224,14 +217,14 @@ public class WebJsPane extends BasicPane { localRadioSelectAction(); urlFileRadioButton.setForeground(new Color(143, 142, 139)); localFileRadioButton.setForeground(Color.black); - infor1.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JS_WARNING1", ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBAPP_NAME)); - infor2.setText(" "); + info1.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JS_WARNING1", ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBAPP_NAME)); + info2.setText(" "); } else if (urlFileRadioButton.isSelected()) { urlRadioSelectAction(); localFileRadioButton.setForeground(new Color(143, 142, 139)); urlFileRadioButton.setForeground(Color.black); - infor2.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JS_WARNING2", ProjectConstants.WEBAPP_NAME)); - infor1.setText(" "); + info2.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JS_WARNING2", ProjectConstants.WEBAPP_NAME)); + info1.setText(" "); } if (StringUtils.isEmpty(urlText.getText()) && StringUtils.isEmpty(localText.getText())) { editingPane.setAddEnabled(false); diff --git a/designer-realize/src/main/java/com/fr/design/webattr/WebSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/WebSettingPane.java index 59b0d2316e..c39aa988c4 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/WebSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/WebSettingPane.java @@ -1,13 +1,14 @@ package com.fr.design.webattr; +import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.border.FineBorderFactory; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.form.event.Listener; import com.fr.report.web.ToolBarManager; @@ -22,6 +23,11 @@ import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapBoldLabelWithUnderline; + public abstract class WebSettingPane extends BasicBeanPane { private static final String[] CHOOSEITEM = new String[] { com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_I_Want_To_Set_Single"), @@ -37,52 +43,58 @@ public abstract class WebSettingPane extends BasicBeanPane private static final int ZERO = 0; private static final long LONGZERO = 0L; + /** + * 模板-模板Web属性-分页预览设置/填报页面设置/数据分析设置通用面板 + */ public WebSettingPane() { - JPanel buttonPane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 6)); + //以下设置 choseComboBox = new UIComboBox(CHOOSEITEM); choseComboBox.addItemListener(itemListener); - buttonPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Blow_Set") + ":")); - buttonPane.add(choseComboBox); + JPanel buttonPane = row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Blow_Set"))).weight(0.15), + cell(choseComboBox).weight(0.85) + ).getComponent(); + + //工具栏 dragToolBarPane = new ToolBarDragPane(); dragToolBarPane.setDefaultToolBar(getDefaultToolBarManager(), getToolBarInstance()); - JPanel eventpanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - eventpanel.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event_Set") + ':'), BorderLayout.NORTH); - eventPane = new EventPane(getEventNames()); - eventpanel.add(eventPane, BorderLayout.CENTER); - - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] columnSize = {f}; - - JPanel othersetpane = createOtherSetPane(); - JPanel panel ; - if (othersetpane != null) { - - Component[][] components = new Component[][]{ - new Component[]{buttonPane}, - new Component[]{othersetpane}, - new Component[]{dragToolBarPane}, - new Component[]{eventpanel} - }; - double[] rowSize1 = { p,p,p,f }; - - panel = TableLayoutHelper.createTableLayoutPane(components,rowSize1,columnSize); + //事件设置 + JPanel eventPanel = new JPanel(new BorderLayout()); + eventPane = new EventPane(getEventNames()); + UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event_Set")); + wrapBoldLabelWithUnderline(label); + eventPanel.add(column(LayoutConstants.VGAP_SMALL, cell(label), cell(eventPane)).getComponent()); + + //其余设置面板,不同页面中分别绘制 + JPanel otherSetPane = createOtherSetPane(); + + //横向分割线 + JPanel separatorLine = new JPanel(); + separatorLine.setBorder(FineBorderFactory.createDefaultUnderlineBorder()); + separatorLine.setPreferredSize(FineUIScale.scale(new Dimension(1, 1))); + + //整体布局 + JPanel panel = new JPanel(new BorderLayout()); + panel.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); + if (otherSetPane != null) { + panel.add(column(LayoutConstants.VERTICAL_GAP, + cell(buttonPane), + cell(otherSetPane), + cell(separatorLine), + cell(dragToolBarPane), + cell(eventPanel) + ).getComponent()); } else { - Component[][] components = new Component[][]{ - new Component[]{buttonPane}, - new Component[]{dragToolBarPane}, - new Component[]{eventpanel} - }; - double[] rowSize2 = { p,p,f }; - - panel = TableLayoutHelper.createTableLayoutPane(components,rowSize2,columnSize); + panel.add(column(LayoutConstants.VERTICAL_GAP, + cell(buttonPane), + cell(separatorLine), + cell(dragToolBarPane), + cell(eventPanel) + ).getComponent()); } - - this.setLayout(new BorderLayout()); - - UIScrollPane scrollPane = new UIScrollPane(panel); - this.add(scrollPane, BorderLayout.CENTER); + this.setLayout(new BorderLayout()); + this.add(new UIScrollPane(panel)); } ItemListener itemListener = new ItemListener() { diff --git a/designer-realize/src/main/java/com/fr/design/webattr/WriteToolBarPane.java b/designer-realize/src/main/java/com/fr/design/webattr/WriteToolBarPane.java index a2e0c53c2f..35bc1b081d 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/WriteToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/WriteToolBarPane.java @@ -1,9 +1,11 @@ package com.fr.design.webattr; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.ConfigManager; import com.fr.config.Configuration; import com.fr.design.ExtraDesignClassManager; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.core.WidgetOption; @@ -14,7 +16,6 @@ import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.form.event.Listener; import com.fr.report.web.Location; @@ -35,6 +36,12 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.fix; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapBoldLabelWithUnderline; + public class WriteToolBarPane extends AbstractEditToolBarPane { private EventPane eventPane; private UICheckBox colorBox; @@ -45,66 +52,90 @@ public class WriteToolBarPane extends AbstractEditToolBarPane { private UILabel sheetShowLocationLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sheet_Label_Page_Display_Position")); private UIRadioButton centerRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Center_Display")); private UIRadioButton leftRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Left_Display")); - private UILabel rptShowLocationLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Location") + ":", UILabel.LEFT); + private UILabel rptShowLocationLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Location")); private UICheckBox isUseToolBarCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Use_ToolBar")); private UIButton editToolBarButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit")); - private UILabel showListenersLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Editing_Listeners") + ":"); + private UILabel showListenersLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Editing_Listeners")); private UICheckBox unloadCheck; private UICheckBox showWidgets; private UICheckBox isAutoStash;//自动暂存 public WriteToolBarPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel allPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); - this.add(allPanel, BorderLayout.CENTER); - JPanel northPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); - allPanel.add(northPane, BorderLayout.NORTH); + this.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); //sheet标签页显示位置 ButtonGroup sheetButtonGroup = new ButtonGroup(); bottomRadioButton.setSelected(true); sheetButtonGroup.add(topRadioButton); sheetButtonGroup.add(bottomRadioButton); - northPane.add(GUICoreUtils.createFlowPane(new Component[]{sheetShowLocationLabel, topRadioButton, bottomRadioButton}, FlowLayout.LEFT)); + JPanel sheetPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(sheetShowLocationLabel), + cell(topRadioButton), + cell(bottomRadioButton)).getComponent(); //Sean:报表显示位置 ButtonGroup rptButtonGroup = new ButtonGroup(); leftRadioButton.setSelected(true); rptButtonGroup.add(leftRadioButton); rptButtonGroup.add(centerRadioButton); - northPane.add(GUICoreUtils.createFlowPane(new Component[]{rptShowLocationLabel, centerRadioButton, leftRadioButton}, FlowLayout.LEFT)); - - colorBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Face_Write_Current_Edit_Row_Background") + ":"); + JPanel showLocPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(rptShowLocationLabel), + cell(centerRadioButton), + cell(leftRadioButton) + ).getComponent(); + + //当前编辑行背景设置 + colorBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Face_Write_Current_Edit_Row_Background")); colorBox.setSelected(false); colorBox.addActionListener(colorListener); - colorButton = new UINoThemeColorButton(BaseUtils.readIcon("/com/fr/design/images/gui/color/background.png")); - northPane.add(GUICoreUtils.createFlowPane(new Component[]{colorBox, colorButton}, FlowLayout.LEFT)); + colorButton = new UINoThemeColorButton(new LazyIcon("background")); + JPanel backgroundPane = row(cell(colorBox), fix(LayoutConstants.HGAP_SMALL), cell(colorButton)).getComponent(); + //勾选框 unloadCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unload_Check")); unloadCheck.setSelected(true); - showWidgets = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event_Show_Widgets")); showWidgets.setSelected(false); isAutoStash = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Write_Auto_Stash")); isAutoStash.setSelected(false); - northPane.add(GUICoreUtils.createFlowPane(new Component[]{unloadCheck, showWidgets, isAutoStash}, FlowLayout.LEFT)); + JPanel unloadCheckPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(unloadCheck), + cell(showWidgets), + cell(isAutoStash) + ).getComponent(); + + JPanel northPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); + northPane.add(sheetPane); + northPane.add(showLocPane); + northPane.add(backgroundPane); + northPane.add(unloadCheckPane); + //工具栏编辑 editToolBarButton.addActionListener(editBtnListener); isUseToolBarCheckBox.setSelected(true); isUseToolBarCheckBox.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { editToolBarButton.setEnabled(isUseToolBarCheckBox.isSelected()); } }); - northPane.add(GUICoreUtils.createFlowPane(new Component[]{isUseToolBarCheckBox, editToolBarButton}, FlowLayout.LEFT)); - northPane.add(new UILabel()); - northPane.add(GUICoreUtils.createFlowPane(showListenersLabel, FlowLayout.LEFT)); + + JPanel northPanel = column(LayoutConstants.VERTICAL_GAP, + cell(northPane), + row(LayoutConstants.HORIZONTAL_GAP, cell(isUseToolBarCheckBox), cell(editToolBarButton)) + ).getComponent(); + + //事件编辑 + JPanel eventPanel = new JPanel(new BorderLayout()); eventPane = new EventPane(new WebWrite().supportedEvents()); - JPanel center = FRGUIPaneFactory.createBorderLayout_S_Pane(); - center.add(eventPane, BorderLayout.CENTER); - allPanel.add(center, BorderLayout.CENTER); + wrapBoldLabelWithUnderline(showListenersLabel); + eventPanel.add(column(LayoutConstants.VGAP_SMALL, cell(showListenersLabel), cell(eventPane).weight(1)).getComponent()); + + this.add(column(LayoutConstants.VERTICAL_GAP, + cell(northPanel), + cell(eventPanel).weight(1) + ).getComponent()); //wei : 默认没config.xml的情况下,就有默认工具栏 ToolBarManager toolBarManager = ToolBarManager.createDefaultWriteToolBar(); toolBarManager.setToolBarLocation(Location.createTopEmbedLocation()); @@ -112,7 +143,6 @@ public class WriteToolBarPane extends AbstractEditToolBarPane { } private ActionListener editBtnListener = new ActionListener() { - public void actionPerformed(ActionEvent e) { final DragToolBarPane dragToolbarPane = new DragToolBarPane(); dragToolbarPane.setDefaultToolBar(ToolBarManager.createDefaultWriteToolBar(), getToolBarInstance()); diff --git a/designer-realize/src/main/java/com/fr/design/webattr/WriteWebSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/WriteWebSettingPane.java index dd93281acd..294116e60b 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/WriteWebSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/WriteWebSettingPane.java @@ -1,14 +1,14 @@ package com.fr.design.webattr; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.design.ExtraDesignClassManager; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.ibutton.UIColorButton; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.report.web.ToolBarManager; import com.fr.report.web.WebWrite; @@ -16,13 +16,15 @@ import com.fr.stable.Constants; import com.fr.web.attr.ReportWebAttr; import javax.swing.*; -import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + public class WriteWebSettingPane extends WebSettingPane { private UICheckBox colorBox; private UIColorButton colorButton; @@ -40,47 +42,63 @@ public class WriteWebSettingPane extends WebSettingPane { super(); } + /** + * 模板-模板Web属性-填报页面设置中其余设置面板,通用部分在父类绘制 + * @return + */ @Override protected JPanel createOtherSetPane() { - colorBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Background_Of_Current_Row") + ":"); - colorBox.setSelected(true); - colorButton = new UIColorButton(BaseUtils.readIcon("/com/fr/design/images/gui/color/background.png")); - colorBox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - colorButton.setEnabled(colorBox.isSelected()); - } - - }); - JPanel backgroundPane = GUICoreUtils.createFlowPane(new Component[]{colorBox, colorButton}, FlowLayout.LEFT); - //sheet标签页显示位置 topRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Top")); bottomRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bottom")); - sheetShowLocationLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sheet_Label_Page_Display_Position"), UILabel.LEFT); + sheetShowLocationLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sheet_Label_Page_Display_Position")); ButtonGroup buttonGroup = new ButtonGroup(); bottomRadioButton.setSelected(true); buttonGroup.add(topRadioButton); buttonGroup.add(bottomRadioButton); - JPanel sheetPane = GUICoreUtils.createFlowPane(new Component[]{sheetShowLocationLabel, topRadioButton, bottomRadioButton}, FlowLayout.LEFT); + JPanel sheetPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(sheetShowLocationLabel), + cell(topRadioButton), + cell(bottomRadioButton)).getComponent(); //Sean: 报表显示位置since 706 - rptShowLocationLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Location") + ":", UILabel.LEFT); + rptShowLocationLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Location")); centerRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Center_Display")); leftRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Left_Display")); ButtonGroup rptShowButtonGroup = new ButtonGroup(); leftRadioButton.setSelected(true); rptShowButtonGroup.add(centerRadioButton); rptShowButtonGroup.add(leftRadioButton); - JPanel showLocPane = GUICoreUtils.createFlowPane(new Component[]{rptShowLocationLabel, centerRadioButton, leftRadioButton}, FlowLayout.LEFT); + JPanel showLocPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(rptShowLocationLabel), + cell(centerRadioButton), + cell(leftRadioButton) + ).getComponent(); + + //填报当前编辑行背景设置 + colorBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Background_Of_Current_Row")); + colorBox.setSelected(true); + colorButton = new UIColorButton(new LazyIcon("background")); + colorBox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + colorButton.setEnabled(colorBox.isSelected()); + } + }); + JPanel backgroundPane = row(cell(colorBox), cell(colorButton)).getComponent(); + //勾选设置 unloadCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unload_Check")); unloadCheck.setSelected(true); - showWidgets = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event_Show_Widgets")); showWidgets.setSelected(false); isAutoStash = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Write_Auto_Stash")); isAutoStash.setSelected(false); - JPanel unloadCheckPane = GUICoreUtils.createFlowPane(new Component[]{unloadCheck, showWidgets, isAutoStash}, FlowLayout.LEFT); + JPanel unloadCheckPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(unloadCheck), + cell(showWidgets), + cell(isAutoStash) + ).getComponent(); + JPanel northPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); northPane.add(sheetPane); northPane.add(showLocPane); diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/AbstractNativePrintSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/AbstractNativePrintSettingPane.java index 2ff9d41800..6fe41a0d01 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/AbstractNativePrintSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/AbstractNativePrintSettingPane.java @@ -1,8 +1,11 @@ package com.fr.design.webattr.printsettings; +import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.PaperSize; import com.fr.base.Utils; import com.fr.base.print.NativePrintAttr; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icombobox.UIComboBox; @@ -12,8 +15,6 @@ import com.fr.design.gui.ispinner.UIBasicSpinner; import com.fr.design.gui.itextfield.UINumberField; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.report.UnitFieldPane; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; @@ -24,15 +25,12 @@ import com.fr.stable.StringUtils; import javax.print.DocFlavor; import javax.print.PrintService; import javax.print.PrintServiceLookup; -import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.SpinnerNumberModel; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.ItemEvent; @@ -42,6 +40,12 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + /** * Created by plough on 2018/3/5. */ @@ -82,37 +86,40 @@ public abstract class AbstractNativePrintSettingPane extends JPanel { } private void initComponents() { - JPanel printPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - - JPanel northPane = getHeaderPane(); - printPane.add(northPane, BorderLayout.NORTH); - - centerPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default_Settings")); - centerPane.add(getNativePrintMainSettingPane()); - - printPane.add(centerPane, BorderLayout.CENTER); - + //默认配置 + initCenterPane(); + JPanel printPane = column(LayoutConstants.VERTICAL_GAP, + cell(getHeaderPane()), + cell(wrapComponentWithTitle(centerPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default_Settings"))) + ).getComponent(); this.setLayout(new BorderLayout()); this.add(printPane, BorderLayout.CENTER); } + /** + * 打印设置-本地软件打印-headerPane + * @return + */ private JPanel getHeaderPane() { - UILabel tipDownload = GUICoreUtils.createTipLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tip_Native_Print_Need_Client")); - + UILabel tipDownload = new UILabel("Fine-Design_Report_Tip_Native_Print_Need_Client"); + FineUIStyle.setStyle(tipDownload, FineUIStyle.LABEL_TIP); // 打印时需要打印设置窗口 showDialogCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Show_Print_Setting_Window_When_Printing")); - showDialogCheck.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20)); - UILabel showDialogCheckTip = GUICoreUtils.createTipLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tip_Use_Default_Settings")); - JPanel showDialogCheckPane = GUICoreUtils.createFlowPane(new Component[]{ - showDialogCheck, showDialogCheckTip}, FlowLayout.LEFT); + UILabel showDialogTip = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tip_Use_Default_Settings")); + FineUIStyle.setStyle(showDialogTip, FineUIStyle.LABEL_TIP); + JPanel showDialogCheckPane = row(LayoutConstants.VERTICAL_GAP, + cell(showDialogCheck), + cell(showDialogTip) + ).getComponent(); // 打印需要指定 sheet needSelectSheetCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Need_Select_Sheet_When_Printing")); - needSelectSheetCheck.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20)); - UILabel needSelectSheetCheckTip = GUICoreUtils.createTipLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tip_Invalid_In_Page_View")); - JPanel needSelectSheetCheckPane = GUICoreUtils.createFlowPane(new Component[]{ - needSelectSheetCheck, needSelectSheetCheckTip}, FlowLayout.LEFT); - + UILabel needSelectSheetTip = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tip_Invalid_In_Page_View")); + FineUIStyle.setStyle(needSelectSheetTip, FineUIStyle.LABEL_TIP); + JPanel needSelectSheetCheckPane = row(LayoutConstants.VERTICAL_GAP, + cell(needSelectSheetCheck), + cell(needSelectSheetTip) + ).getComponent(); return createHeaderPane(tipDownload, showDialogCheckPane, needSelectSheetCheckPane); } @@ -166,62 +173,58 @@ public abstract class AbstractNativePrintSettingPane extends JPanel { }; } - private JPanel getNativePrintMainSettingPane() { + /** + * 打印设置-本地软件打印-默认配置Pane + */ + private void initCenterPane() { // 打印机 - String[] printerArray = getAllPrinterNames(); - printerComboBox = new UIComboBox(printerArray); - printerComboBox.setPreferredSize(new Dimension(200, printerComboBox.getPreferredSize().height)); - JPanel printerPane = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - printerPane.add(printerComboBox); - + printerComboBox = new UIComboBox(getAllPrinterNames()); // 份数 copySpinner = new UIBasicSpinner(new SpinnerNumberModel(1, 1, Integer.MAX_VALUE, 1)); - GUICoreUtils.setColumnForSpinner(copySpinner, 5); - JPanel copyPane = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - copyPane.add(copySpinner); - + // 页码标签 + JPanel printAreaLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + printAreaLabelPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Page_Number")), BorderLayout.NORTH); + printAreaLabelPane.setBorder(new ScaledEmptyBorder(2,0,0,0)); // 继承页面纸张设置 - inheritPagePaperSettingCheck = GUICoreUtils.createNoBorderCheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Inherit_Page_Paper_Setting")); + inheritPagePaperSettingCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Inherit_Page_Paper_Setting")); JPanel paperSettingPane = getPaperSettingPane(); JPanel paperSettingCheckPane = GUICoreUtils.createCheckboxAndDynamicPane(inheritPagePaperSettingCheck, paperSettingPane, true); - // 继承页面布局设置 inheritPageLayoutSettingCheck = GUICoreUtils.createNoBorderCheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Inherit_Page_Layout_Setting")); JPanel layoutSettingPane = getLayoutSettingPane(); JPanel layoutSettingCheckPane = GUICoreUtils.createCheckboxAndDynamicPane(inheritPageLayoutSettingCheck, layoutSettingPane, true); - - // 页码标签 - UILabel printAreaLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Page_Number") + ":"); - JPanel printAreaLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - printAreaLabelPane.add(printAreaLabel, BorderLayout.NORTH); - printAreaLabel.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); - // 边距 inheritPageMarginSettingCheck = GUICoreUtils.createNoBorderCheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Inherit_Page_Margin_Setting")); pageMarginSettingPane = new PageMarginSettingPane(); - pageMarginSettingPane.setBorder(BorderFactory.createEmptyBorder(10, -10, 0, 0)); JPanel pageMarginCheckPane = GUICoreUtils.createCheckboxAndDynamicPane(inheritPageMarginSettingCheck, pageMarginSettingPane, true); - // 缩放 fitPaperSizeCheck = GUICoreUtils.createNoBorderCheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Print_To_Fit_Paper_Size")); JPanel scalePane = getScalePane(); - scalePane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); JPanel scaleCheckPane = GUICoreUtils.createCheckboxAndDynamicPane(fitPaperSizeCheck, scalePane, true); - - // TableLayout - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p, p, p, p}; - double[] columnSize = {60, p}; - Component[][] components = { - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Printer") + ":"), printerPane}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Copy_Number") + ":"), copyPane}, - {printAreaLabelPane, getPrintAreaPane()}, - {getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Paper") + ":"), paperSettingCheckPane}, - {getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout") + ":"), layoutSettingCheckPane}, - {getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Margin") + ":"), pageMarginCheckPane}, - {getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Scale_EnlargeOrReduce") + ":"), scaleCheckPane}, - }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 15); + // 整体布局 + centerPane = column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Printer"))).weight(0.1), + cell(printerComboBox).weight(0.35), + flex(0.55)), + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Copy_Number"))).weight(0.1), + cell(copySpinner).weight(0.15), + flex(0.75)), + row(cell(printAreaLabelPane).weight(0.1), + cell(getPrintAreaPane()).weight(0.7), + flex(0.2)), + row(cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Paper"))).weight(0.1), + cell(paperSettingCheckPane).weight(0.5), + flex(0.4)), + row(cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout"))).weight(0.1), + cell(layoutSettingCheckPane).weight(0.2), + flex(0.7)), + row(cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Margin"))).weight(0.1), + cell(pageMarginCheckPane).weight(0.5), + flex(0.4)), + row(cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Scale_EnlargeOrReduce"))).weight(0.1), + cell(scaleCheckPane).weight(0.3), + flex(0.6)) + ).getComponent(); } private String[] getAllPrinterNames() { @@ -273,34 +276,24 @@ public abstract class AbstractNativePrintSettingPane extends JPanel { } }); - // 下拉框 - JPanel comboPanel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - comboPanel.add(predefinedPaperSizeComboBox); - comboPanel.setBorder(BorderFactory.createEmptyBorder(8, 0, 0, 0)); - customPaperSizePane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_M_Pane(); // 宽度设置 - JPanel customWidthPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - customWidthPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Designer_Width") + ":")); customWidthFieldPane = new UnitFieldPane(Constants.UNIT_MM); customWidthFieldPane.setUnitValue(DEFAULT_PAPERSIZE.getWidth()); - customWidthPane.add(customWidthFieldPane); // 高度设置 - JPanel customHeightPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - customHeightPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Height") + ":")); customHeightFieldPane = new UnitFieldPane(Constants.UNIT_MM); customHeightFieldPane.setUnitValue(DEFAULT_PAPERSIZE.getHeight()); - customHeightPane.add(customHeightFieldPane); - - customPaperSizePane.add(customWidthPane); - customPaperSizePane.add(customHeightPane); - customPaperSizePane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); - - JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - panel.add(comboPanel, BorderLayout.NORTH); - panel.add(customPaperSizePane, BorderLayout.CENTER); - - return panel; + customPaperSizePane = row(LayoutConstants.HORIZONTAL_GAP, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Designer_Width") + ":")), + cell(customWidthFieldPane) + ), + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Height") + ":")), + cell(customHeightFieldPane) + ) + ).getComponent(); + return column(10, cell(predefinedPaperSizeComboBox), cell(customPaperSizePane)).getComponent(); } private void updateCustomPaperSizeArea() { @@ -309,23 +302,19 @@ public abstract class AbstractNativePrintSettingPane extends JPanel { } private JPanel getLayoutSettingPane() { - JPanel layoutSettingPane = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - layoutSettingPane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); portraitRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Portrait")); - portraitRadioButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20)); landscapeRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_PageSetup_Landscape")); - layoutSettingPane.add(portraitRadioButton); - layoutSettingPane.add(landscapeRadioButton); - ButtonGroup layoutButtonGroup = new ButtonGroup(); layoutButtonGroup.add(portraitRadioButton); layoutButtonGroup.add(landscapeRadioButton); - portraitRadioButton.setSelected(true); - return layoutSettingPane; + return row(10, cell(portraitRadioButton), cell(landscapeRadioButton)).getComponent(); } - // 页码范围 + /** + * 页码范围 + * @return + */ private JPanel getPrintAreaPane() { allPageRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_All_Pages")); currentPageRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Current_Page")); @@ -363,17 +352,12 @@ public abstract class AbstractNativePrintSettingPane extends JPanel { doublePrintComboBox.addItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_HF_Odd_Page")); doublePrintComboBox.addItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_HF_Even_Page")); - // TableLayout - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p}; - double[] columnSize = {p, p, p}; - Component[][] components = { - {allPageRadioButton, null, null}, - {currentPageRadioButton, null, null}, - {customPageRadioButton, specifiedAreaField, areaFieldTip}, - {doublePrintRadioButton, doublePrintComboBox, new JPanel()} - }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 8); + return column(LayoutConstants.VERTICAL_GAP, + cell(allPageRadioButton), + cell(currentPageRadioButton), + row(cell(customPageRadioButton).weight(0.1), cell(specifiedAreaField).weight(0.3), cell(areaFieldTip).weight(0.1)), + row(cell(doublePrintRadioButton).weight(0.1),cell(doublePrintComboBox).weight(0.3), flex(0.1)) + ).getComponent(); } private JPanel getScalePane() { @@ -381,25 +365,12 @@ public abstract class AbstractNativePrintSettingPane extends JPanel { scalePercentField.setMaxIntegerLength(3); scalePercentField.setMaxDecimalLength(0); scalePercentField.setMaxValue(200); - - UILabel percent = new UILabel("%"); - - // TableLayout - double p = TableLayout.PREFERRED; - double[] rowSize = {p}; - double[] columnSize = {p, p}; - Component[][] components = { - {scalePercentField, percent} - }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 0); + return row(cell(scalePercentField), cell(new UILabel("%"))).getComponent(); } // 返回包含一个标签的 panel,标签始终位于 panel 顶部 JPanel getTopAlignLabelPane(String labelText) { - JPanel labelPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - labelPane.add(new UILabel(labelText), BorderLayout.NORTH); - labelPane.add(new JPanel(), BorderLayout.CENTER); - return labelPane; + return column(LayoutConstants.VERTICAL_GAP, cell(new UILabel(labelText))).getComponent(); } public void populate(NativePrintAttr nativePrintAttr) { diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/GlobalNativePrintSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/GlobalNativePrintSettingPane.java index 7b3643899a..becbe926d3 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/GlobalNativePrintSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/GlobalNativePrintSettingPane.java @@ -1,46 +1,41 @@ package com.fr.design.webattr.printsettings; import com.fr.base.print.NativePrintAttr; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UIIntNumberField; import com.fr.design.gui.itextfield.UINumberField; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.Component; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + /** * 本地打印设置面板——全局 * Created by plough on 2018/10/31. */ public class GlobalNativePrintSettingPane extends AbstractNativePrintSettingPane { - private static final int PRINT_PORT_FIELD_COLUMNS = 8; - // 服务器配置面板特有的组件 private UICheckBox defaultDownloadUrlCheck; // 采用默认的软件下载地址 private UITextField customUrlFieldWin; private UITextField customUrlFieldMac; private UINumberField printPortField; // 打印软件端口号 - @Override JPanel createHeaderPane(Component... comps) { Component[] allComps = new Component[comps.length + 1]; System.arraycopy(comps, 0, allComps, 0, comps.length); allComps[comps.length] = getExtraSettingPane(); - - JPanel headerPane = GUICoreUtils.createHeaderLayoutPane(allComps); - headerPane.setBorder(BorderFactory.createEmptyBorder(2, 12, 5, 0)); - return headerPane; + return GUICoreUtils.createHeaderLayoutPane(allComps); } - @Override protected void extraUpdate(NativePrintAttr nativePrintAttr) { if (defaultDownloadUrlCheck.isSelected()) { @@ -61,56 +56,35 @@ public class GlobalNativePrintSettingPane extends AbstractNativePrintSettingPane printPortField.setValue(nativePrintAttr.getPrintPort()); } - // 服务器配置中,特有的设置面板 + /** + * 服务器配置中,特有的设置面板 + * @return + */ private JPanel getExtraSettingPane() { // 软件下载地址 defaultDownloadUrlCheck = GUICoreUtils.createNoBorderCheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default")); JPanel downloadUrlSettingCheckPane = GUICoreUtils.createCheckboxAndDynamicPane(defaultDownloadUrlCheck, getCustomUrlSettingPane(), true); - downloadUrlSettingCheckPane.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); - JPanel downloadTipPane = getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Software_Download_Url") + ": "); - downloadTipPane.setBorder(BorderFactory.createEmptyBorder(0, 0, -6, 0)); - + JPanel downloadUrlTitle = getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Software_Download_Url")); // 打印软件端口号 - UILabel printPortTip = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Native_Print_Port") + ": "); - JPanel printPortFiledPane = getPrintPortFieldPane(); - - // TableLayout - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p}; - double[] columnSize = {p, p}; - Component[][] components = { - { - downloadTipPane, downloadUrlSettingCheckPane - }, { - printPortTip, printPortFiledPane - } - }; - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 0); - } - - private JPanel getPrintPortFieldPane() { + UILabel printPortTip = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Native_Print_Port")); printPortField = new UIIntNumberField(); printPortField.setMaxValue(NativePrintAttr.MAX_PRINT_PORT_VALUE); - printPortField.setColumns(PRINT_PORT_FIELD_COLUMNS); - JPanel panel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - panel.add(printPortField); - return panel; + return column(LayoutConstants.VERTICAL_GAP, + row(cell(downloadUrlTitle).weight(0.25), cell(downloadUrlSettingCheckPane).weight(0.75)), + row(cell(printPortTip).weight(0.25), cell(printPortField).weight(0.25), flex(0.5)) + ).getComponent(); } + /** + * 自定义软件下载地址Pane + * @return + */ private JPanel getCustomUrlSettingPane() { customUrlFieldWin = new UITextField(20); customUrlFieldMac = new UITextField(20); - - // TableLayout - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p}; - double[] columnSize = {60, p}; - Component[][] components = { - {new UILabel("windows: "), customUrlFieldWin}, - {new UILabel("macOS: "), customUrlFieldMac} - }; - JPanel urlSettingPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 10); - urlSettingPane.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0)); - return urlSettingPane; + return column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel("windows")).weight(0.2), cell(customUrlFieldWin).weight(0.6), flex(0.2)).weight(1), + row(cell(new UILabel("macOS")).weight(0.2), cell(customUrlFieldMac).weight(0.6), flex(0.2)).weight(1) + ).getComponent(); } } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NoClientPrintSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NoClientPrintSettingPane.java index a5ed35a697..465d594394 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NoClientPrintSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NoClientPrintSettingPane.java @@ -1,21 +1,24 @@ package com.fr.design.webattr.printsettings; +import com.fine.theme.utils.FineUIStyle; import com.fr.base.print.NoClientPrintAttr; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.FlowLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + + /** * 零客户端打印设置面板 * Created by plough on 2018/3/5. @@ -34,60 +37,48 @@ public class NoClientPrintSettingPane extends JPanel { } private void initComponents() { - JPanel printPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - - printPane.add(createHeaderPane(), BorderLayout.NORTH); - initCenterPane(); - printPane.add(centerPane, BorderLayout.CENTER); - + JPanel printPane = column(LayoutConstants.VERTICAL_GAP, + cell(createHeaderPane()), + cell(wrapComponentWithTitle(centerPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default_Settings"))) + ).getComponent(); this.setLayout(new BorderLayout()); this.add(printPane, BorderLayout.CENTER); } + /** + * 打印设置-零客户端打印-默认配置 + */ private void initCenterPane() { - centerPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default_Settings")); - inheritPageMarginSettingCheck = GUICoreUtils.createNoBorderCheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Inherit_Page_Margin_Setting")); pageMarginSettingPane = new PageMarginSettingPane(); - pageMarginSettingPane.setBorder(BorderFactory.createEmptyBorder(10, -10, 0, 0)); JPanel pageMarginCheckPane = GUICoreUtils.createCheckboxAndDynamicPane(inheritPageMarginSettingCheck, pageMarginSettingPane, true); - - // TableLayout - double p = TableLayout.PREFERRED; - double[] rowSize = {p}; - double[] columnSize = {60, p}; - Component[][] components = { - {getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Margin") + ":"), pageMarginCheckPane} - }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 15); - - centerPane.add(panel); + centerPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Margin"))), + cell(pageMarginCheckPane)).getComponent(); } + /** + * 打印设置-零客户端打印-headerPane + * @return + */ private JPanel createHeaderPane() { + //打印时可设置打印边距 setMarginWhenPrintCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Set_Margin_When_Printing")); - setMarginWhenPrintCheck.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20)); - UILabel marginTip = GUICoreUtils.createTipLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tip_Use_Default_Print_Margin")); - JPanel setMarginWhenPrintPane = GUICoreUtils.createFlowPane(new Component[] { - setMarginWhenPrintCheck, marginTip}, FlowLayout.LEFT); - + UILabel setMarginWhenPrintTip = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tip_Use_Default_Print_Margin")); + FineUIStyle.setStyle(setMarginWhenPrintTip, FineUIStyle.LABEL_TIP); ieQuietPrintCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_No_Print_Settings_In_IE")); - ieQuietPrintCheck.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - + //针式打印优化 needlePrinterOptimizeCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Needle_Printer_Optimize")); - needlePrinterOptimizeCheck.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20)); - UILabel needleTip = GUICoreUtils.createTipLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Needle_Printer_Optimize_Tip")); - JPanel needlePrinterOptimizePane = GUICoreUtils.createFlowPane(new Component[] { - needlePrinterOptimizeCheck, needleTip}, FlowLayout.LEFT); - - JPanel headerPane = GUICoreUtils.createHeaderLayoutPane(setMarginWhenPrintPane, ieQuietPrintCheck, needlePrinterOptimizePane); - headerPane.setBorder(BorderFactory.createEmptyBorder(2, 12, 12, 0)); - return headerPane; + UILabel needlePrinterOptimizeTip = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Needle_Printer_Optimize_Tip")); + FineUIStyle.setStyle(needlePrinterOptimizeTip, FineUIStyle.LABEL_TIP); + return column(LayoutConstants.VERTICAL_GAP, + row(LayoutConstants.HORIZONTAL_GAP, cell(setMarginWhenPrintCheck), cell(setMarginWhenPrintTip)), + cell(ieQuietPrintCheck), + row(LayoutConstants.HORIZONTAL_GAP, cell(needlePrinterOptimizeCheck), cell(needlePrinterOptimizeTip)) + ).getComponent(); } - - private void initListeners() { setMarginWhenPrintCheck.addItemListener(new ItemListener() { @Override diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/PageMarginSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/PageMarginSettingPane.java index 1742a2b02a..feef4c9b03 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/PageMarginSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/PageMarginSettingPane.java @@ -1,8 +1,8 @@ package com.fr.design.webattr.printsettings; import com.fr.base.Margin; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.report.UnitFieldPane; import com.fr.stable.Constants; @@ -10,6 +10,10 @@ import com.fr.stable.Constants; import javax.swing.JPanel; import java.awt.BorderLayout; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; + /** * Created by plough on 2018/3/5. */ @@ -23,40 +27,25 @@ public class PageMarginSettingPane extends JPanel { initComponents(); } private void initComponents() { - // 页边距设置面板 - JPanel marginPane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_M_Pane(); // left - JPanel marginLeftPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - marginPane.add(marginLeftPane); - - JPanel marginLeftTextPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - marginLeftPane.add(marginLeftTextPane); - marginLeftTextPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Top_Duplicate") + ":")); marginTopUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - marginLeftTextPane.add(marginTopUnitFieldPane); - JPanel marginLeftUnitPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - marginLeftPane.add(marginLeftUnitPane); - marginLeftUnitPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bottom") + ":")); marginBottomUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - marginLeftUnitPane.add(marginBottomUnitFieldPane); - - // right - JPanel marginRightPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - marginPane.add(marginRightPane); + JPanel marginLeftPane = column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Top_Duplicate") + ":")), cell(marginTopUnitFieldPane)), + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bottom") + ":")), cell(marginBottomUnitFieldPane)) + ).getComponent(); // peter:这个一个垂直的上下的字符panel. - JPanel marginRightTextPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - marginRightPane.add(marginRightTextPane); - marginRightTextPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Left") + ":")); marginLeftUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - marginRightTextPane.add(marginLeftUnitFieldPane); - - JPanel marginRightUnitPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - marginRightPane.add(marginRightUnitPane); - marginRightUnitPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Right") + ":")); marginRightUnitFieldPane = new UnitFieldPane(Constants.UNIT_MM); - marginRightUnitPane.add(marginRightUnitFieldPane); + JPanel marginRightPane = column(LayoutConstants.VERTICAL_GAP, + row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Left") + ":")), cell(marginLeftUnitFieldPane)), + row( cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Right") + ":")), cell(marginRightUnitFieldPane)) + ).getComponent(); + JPanel marginPane = row(LayoutConstants.HORIZONTAL_GAP, + cell(marginLeftPane), + cell(marginRightPane)).getComponent(); this.setLayout(new BorderLayout()); this.add(marginPane, BorderLayout.CENTER); } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/PrintSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/PrintSettingPane.java index 883a0801fd..f5cf1effb5 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/PrintSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/PrintSettingPane.java @@ -1,22 +1,24 @@ package com.fr.design.webattr.printsettings; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.print.PrintSettingsAttrMark; +import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.CardLayout; -import java.awt.Component; -import java.awt.FlowLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; + /** * Created by plough on 2018/3/1. */ @@ -39,19 +41,11 @@ public class PrintSettingPane extends BasicPane { } private void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel allPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); - this.add(allPanel, BorderLayout.CENTER); - JPanel north = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); - allPanel.add(north, BorderLayout.NORTH); ButtonGroup buttonGroup = new ButtonGroup(); noClientPrintRadioButton.setSelected(true); buttonGroup.add(noClientPrintRadioButton); buttonGroup.add(nativePrintRadioButton); - noClientPrintRadioButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 50)); - JPanel radioGroupPane = GUICoreUtils.createFlowPane(new Component[] { - noClientPrintRadioButton, nativePrintRadioButton}, FlowLayout.LEFT, 0, 0); - north.add(radioGroupPane); + JPanel north = row(LayoutConstants.HORIZONTAL_GAP, cell(noClientPrintRadioButton), cell(nativePrintRadioButton)).getComponent(); noClientPrintSettingPane = new NoClientPrintSettingPane(); printCard = new CardLayout(); @@ -60,11 +54,12 @@ public class PrintSettingPane extends BasicPane { printPane.add(noClientPrintRadioButton.getText(), noClientPrintSettingPane); UIScrollPane scrollPane = new UIScrollPane(nativePrintSettingPane); - scrollPane.setBorder(null); printPane.add(nativePrintRadioButton.getText(), scrollPane); - north.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); - allPanel.add(printPane, BorderLayout.CENTER); + JPanel allPanel = column(LayoutConstants.VERTICAL_GAP, cell(north), cell(printPane)).getComponent(); + allPanel.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.add(allPanel, BorderLayout.CENTER); } private void initListener() { diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/ReportNativePrintSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/ReportNativePrintSettingPane.java index 87853a7a38..c33b13c094 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/ReportNativePrintSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/ReportNativePrintSettingPane.java @@ -2,7 +2,6 @@ package com.fr.design.webattr.printsettings; import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.Component; @@ -13,8 +12,6 @@ import java.awt.Component; public class ReportNativePrintSettingPane extends AbstractNativePrintSettingPane { @Override JPanel createHeaderPane(Component... comps) { - JPanel headerPane = GUICoreUtils.createHeaderLayoutPane(comps); - headerPane.setBorder(BorderFactory.createEmptyBorder(2, 12, 12, 0)); - return headerPane; + return GUICoreUtils.createHeaderLayoutPane(comps); } } From 5d17f671772925236a61896e435800c720f01b83 Mon Sep 17 00:00:00 2001 From: "Richard.Fang" Date: Fri, 26 Jul 2024 23:29:15 +0800 Subject: [PATCH 186/302] =?UTF-8?q?REPORT-127436=E3=80=90NewUI=E3=80=91?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0?= =?UTF-8?q?-=E6=A8=A1=E6=9D=BF=E7=9B=B8=E5=85=B3/=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E9=85=8D=E7=BD=AE/=E6=95=B0=E6=8D=AE=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/mobile/AppFitBrowserPane.java | 25 +++++++++---------- .../report/mobile/MobileToolBarPane.java | 2 -- .../ReportMobileTemplateSettingsPane.java | 3 --- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitBrowserPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitBrowserPane.java index 1d415d0b75..59a29b5d93 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitBrowserPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/AppFitBrowserPane.java @@ -2,15 +2,18 @@ package com.fr.design.report.mobile; import com.fr.base.mobile.MobileFitAttrState; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.report.mobile.ElementCaseMobileAttr; -import javax.swing.*; -import java.awt.*; +import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; + /** * Created by 夏翔 on 2016/5/28. */ @@ -29,18 +32,17 @@ public class AppFitBrowserPane extends BasicBeanPane { } private void initComponents() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel borderPane = FRGUIPaneFactory.createTitledBorderPane(this.title4PopupWindow()); - JPanel fitOpsPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + this.setLayout(new BorderLayout()); horizionPane = new MobileRadioGroupPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Horizontal")); verticalPane = new MobileRadioGroupPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Vertical")); ActionListener actionListener = getAppPreviewActionListener(); horizionPane.addActionListener(actionListener); verticalPane.addActionListener(actionListener); - fitOpsPane.add(horizionPane, BorderLayout.NORTH); - fitOpsPane.add(verticalPane, BorderLayout.SOUTH); - borderPane.add(fitOpsPane); - this.add(borderPane); + this.add( + wrapComponentWithTitle((column(10, + row(cell(horizionPane)), + row(cell(verticalPane)) + ).getComponent()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Fit"))); } public void setAppFitPreviewPane(AppFitPreviewPane appFitPreviewPane) { @@ -59,7 +61,6 @@ public class AppFitBrowserPane extends BasicBeanPane { } horizionPane.populateBean(ob.getHorziontalAttr()); verticalPane.populateBean(ob.getVerticalAttr()); -// radioCheckPane.populateBean(ob.isZoom()); appFitPreviewPane.refreshPreview(getCurrentFitOptions()); } @@ -68,8 +69,6 @@ public class AppFitBrowserPane extends BasicBeanPane { public ElementCaseMobileAttr updateBean() { MobileFitAttrState horizonState = horizionPane.updateBean(); MobileFitAttrState verticalState = verticalPane.updateBean(); -// boolean isZoom = radioCheckPane.updateBean(); -// return new ElementCaseMobileAttr(horizonState, verticalState, isZoom); return new ElementCaseMobileAttr(horizonState, verticalState); } diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/MobileToolBarPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/MobileToolBarPane.java index 0415c95c05..9afc207db6 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/MobileToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/MobileToolBarPane.java @@ -14,8 +14,6 @@ import static com.fine.swing.ui.layout.Layouts.column; import static com.fine.swing.ui.layout.Layouts.flex; import static com.fine.swing.ui.layout.Layouts.row; -import static com.fine.swing.ui.layout.Layouts.*; - /** * Created by 方磊 on 2016/11/8. */ diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileTemplateSettingsPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileTemplateSettingsPane.java index 5adf3020e4..71b61faeed 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileTemplateSettingsPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/ReportMobileTemplateSettingsPane.java @@ -17,9 +17,6 @@ import static com.fine.swing.ui.layout.Layouts.cell; import static com.fine.swing.ui.layout.Layouts.column; import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; -import static com.fine.swing.ui.layout.Layouts.*; -import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; - /** * Created by plough on 2018/1/8. */ From fc4d6f26db77061b316ec592f8aa76808d896cdf Mon Sep 17 00:00:00 2001 From: "Richard.Fang" Date: Mon, 29 Jul 2024 09:21:47 +0800 Subject: [PATCH 187/302] =?UTF-8?q?REPORT-127436=E3=80=90NewUI=E3=80=91?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0?= =?UTF-8?q?-=E6=A8=A1=E6=9D=BF=E7=9B=B8=E5=85=B3/=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E9=85=8D=E7=BD=AE/=E6=95=B0=E6=8D=AE=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/report/WordExportPane.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/design/report/WordExportPane.java b/designer-realize/src/main/java/com/fr/design/report/WordExportPane.java index 26f40b1d05..cfef54ab32 100644 --- a/designer-realize/src/main/java/com/fr/design/report/WordExportPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/WordExportPane.java @@ -25,7 +25,9 @@ import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import static com.fine.swing.ui.layout.Layouts.*; +import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.cell; import static com.fine.swing.ui.layout.Layouts.fix; import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; From 97777571ec6398289feb5e5f936b3420889ed2aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Mon, 29 Jul 2024 09:50:43 +0800 Subject: [PATCH 188/302] =?UTF-8?q?REPORT-113994=20=E3=80=90NewUI=E3=80=91?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0?= =?UTF-8?q?-=E5=9B=BE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fine/theme/utils/FineUIStyle.java | 1 + .../editor/editor/ColumnSelectedEditor.java | 11 ++-- .../com/fr/design/formula/FormulaPane.java | 8 ++- .../fr/design/formula/TinyFormulaPane.java | 17 +++--- .../design/gui/controlpane/JControlPane.java | 7 ++- .../gui/controlpane/UIListControlPane.java | 4 +- .../fr/design/gui/frpane/FineTabbedPane.java | 20 +++++++ .../mainframe/check/CheckFontInfoDialog.java | 2 + .../theme/TemplateThemeGridControlPane.java | 17 +----- .../theme/TemplateThemeGridPagesPane.java | 18 +++--- .../theme/edit/cell/CellStyleEditPane.java | 2 - .../theme/icon/editor/ds_column_index.svg | 3 + .../icon/editor/ds_column_index_disable.svg | 3 + .../fine/theme/icon/editor/ds_column_name.svg | 3 + .../icon/editor/ds_column_name_disable.svg | 3 + .../fine/theme/light/ui/fine_light.icon.json | 4 +- .../light/ui/laf/FineLightLaf.properties | 3 + .../java/com/fr/design/chart/ChartDialog.java | 3 + .../com/fr/design/chart/ChartTypePane.java | 20 ++++--- .../table/MeterPlotTableDataContentPane.java | 34 ++++------- .../style/series/AbstractPlotSeriesPane.java | 19 +++---- .../chart/gui/type/ChartImagePane.java | 14 +++-- .../chart/area/VanChartAreaSeriesPane.java | 14 ++--- .../MeterCustomPlotTableDataContentPane.java | 4 -- .../component/VanChartHyperLinkPane.java | 3 + .../component/VanChartLineTypePane.java | 56 ++++++------------- .../component/VanChartMarkerPane.java | 9 ++- .../component/VanChartTrendLinePane.java | 5 +- .../component/VanChartUIListControlPane.java | 11 ---- .../marker/VanChartCommonMarkerPane.java | 12 +--- .../marker/VanChartImageMarkerPane.java | 29 +++++----- .../VanChartAxisScrollPaneWithTypeSelect.java | 11 ++-- .../axis/VanChartAxisStyleSettingPane.java | 22 +++----- .../style/axis/VanChartBaseAxisPane.java | 26 ++++----- .../style/axis/VanChartValueAxisPane.java | 2 +- .../component/VanChartAxisButtonPane.java | 37 +++--------- .../gauge/VanChartGaugeDetailAxisPane.java | 43 ++++++-------- ...hartGaugeCateOrPercentLabelDetailPane.java | 6 +- .../label/VanChartGaugeLabelDetailPane.java | 4 +- .../label/VanChartPlotLabelDetailPane.java | 11 ++-- .../VanChartAbstractPlotSeriesPane.java | 11 ++-- ...tImageMarkerWithoutWidthAndHeightPane.java | 14 +++-- .../chart/line/VanChartLineSeriesPane.java | 13 ++--- .../data/component/report/AreaPane.java | 9 +-- .../component/report/LongLatAreaPane.java | 9 +-- .../data/component/table/AreaPane.java | 9 +-- .../data/component/table/LineMapAreaPane.java | 4 +- .../data/component/table/LongLatAreaPane.java | 9 +-- .../VanAreaMapPlotReportDataContentPane.java | 18 +++--- .../VanPointMapPlotReportDataContentPane.java | 26 +++------ .../VanAreaMapPlotTableDataContentPane.java | 24 ++------ .../table/VanMapTableDataContentPane.java | 18 +++--- .../VanPointMapPlotTableDataContentPane.java | 27 ++------- .../MultiPiePlotTableDataContentPane.java | 35 ++---------- .../design/cell/editor/RichTextToolBar.java | 2 +- 55 files changed, 306 insertions(+), 443 deletions(-) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/editor/ds_column_index.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/editor/ds_column_index_disable.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/editor/ds_column_name.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/editor/ds_column_name_disable.svg diff --git a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java index 4cf5637d94..47359028b5 100644 --- a/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java +++ b/designer-base/src/main/java/com/fine/theme/utils/FineUIStyle.java @@ -32,6 +32,7 @@ public interface FineUIStyle { String PLAIN_BUTTON = "plainButton"; String TOGGLE_GROUP = "inToggleGroup"; String COMPACT_BUTTON = "compactButton"; + String ROUND_BORDER_PANEL = "roundBorder"; String MENU_TOOL_BAR = "menuToolBar"; String MENU_ITEM_TOOL_BAR = "menuItemToolBar"; diff --git a/designer-base/src/main/java/com/fr/design/editor/editor/ColumnSelectedEditor.java b/designer-base/src/main/java/com/fr/design/editor/editor/ColumnSelectedEditor.java index 5260ce1752..edd531cae9 100644 --- a/designer-base/src/main/java/com/fr/design/editor/editor/ColumnSelectedEditor.java +++ b/designer-base/src/main/java/com/fr/design/editor/editor/ColumnSelectedEditor.java @@ -6,7 +6,6 @@ import com.fr.design.data.datapane.TableDataComboBox; import com.fr.design.data.tabledata.Prepare4DataSourceChange; import com.fr.design.data.tabledata.wrapper.TableDataWrapper; import com.fr.design.gui.icombobox.UIComboBox; -import com.fr.design.layout.FRGUIPaneFactory; import com.fr.general.data.TableDataColumn; import com.fr.stable.StringUtils; @@ -17,6 +16,9 @@ import java.awt.event.ItemListener; import java.util.List; import java.util.regex.Pattern; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.row; + /** * 选择数据列编辑器 * @@ -30,7 +32,7 @@ public class ColumnSelectedEditor extends Editor implements Prep public ColumnSelectedEditor() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DS_Column")); - this.setLayout(FRGUIPaneFactory.createLeftZeroLayout()); + this.setLayout(new BorderLayout()); tableDataComboBox = new TableDataComboBox(DesignTableDataManager.getEditingTableDataSource()); columnNames = new String[0]; tableDataComboBox.addItemListener(new ItemListener() { @@ -52,10 +54,7 @@ public class ColumnSelectedEditor extends Editor implements Prep } }); columnNameComboBox = new UIComboBox(); - tableDataComboBox.setPreferredSize(new Dimension(82, 20)); - this.add(tableDataComboBox); - columnNameComboBox.setPreferredSize(new Dimension(82, 20)); - this.add(columnNameComboBox); + this.add(row(10, cell(tableDataComboBox), cell(columnNameComboBox)).getComponent()); } @Override diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java index 6cfb221ca1..24c87a8c5d 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java @@ -5,6 +5,8 @@ import com.fine.theme.icon.LazyIcon; import com.fine.theme.light.ui.FineRoundBorder; import com.fine.theme.utils.FineUIScale; import com.fine.theme.utils.FineUIStyle; +import com.formdev.flatlaf.ui.FlatButtonBorder; +import com.formdev.flatlaf.ui.FlatRoundBorder; import com.formdev.flatlaf.ui.FlatUIUtils; import com.fr.base.BaseFormula; import com.fr.base.BaseUtils; @@ -320,7 +322,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { // text initFormulaTextArea(); UIScrollPane formulaTextAreaScrollPane = new UIScrollPane(formulaTextArea); - formulaTextAreaScrollPane.setBorder(new FineRoundBorder()); + formulaTextAreaScrollPane.setBorder(new FlatRoundBorder()); // buttonPane JPanel buttonPane = row(8).getComponent(); @@ -1192,7 +1194,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { private JPanel initFunctionNameList() { functionNameList = new JList(new DefaultListModel()); UIScrollPane functionNameScrollPane = new UIScrollPane(functionNameList); - functionNameScrollPane.setBorder(new FineRoundBorder()); + functionNameScrollPane.setBorder(new FlatButtonBorder()); functionNameList.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); initFunctionNameListCellRenderer(); initFunctionNameListSelectionListener(); @@ -1273,7 +1275,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { // variable variablesTree = new JTree(); UIScrollPane variablesTreePane = new UIScrollPane(variablesTree); - variablesTreePane.setBorder(new FineRoundBorder()); + variablesTreePane.setBorder(new FlatRoundBorder()); variablesTree.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); variablesTree.setRootVisible(false); variablesTree.setShowsRootHandles(true); diff --git a/designer-base/src/main/java/com/fr/design/formula/TinyFormulaPane.java b/designer-base/src/main/java/com/fr/design/formula/TinyFormulaPane.java index e4e81f7eb7..087a24fc48 100644 --- a/designer-base/src/main/java/com/fr/design/formula/TinyFormulaPane.java +++ b/designer-base/src/main/java/com/fr/design/formula/TinyFormulaPane.java @@ -1,7 +1,6 @@ package com.fr.design.formula; import com.fine.theme.icon.LazyIcon; -import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.BaseFormula; import com.fr.design.beans.BasicBeanPane; import com.fr.design.dialog.DialogActionAdapter; @@ -11,12 +10,15 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.mainframe.DesignerContext; -import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Cursor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + /** * * @author zhou @@ -70,15 +72,10 @@ public class TinyFormulaPane extends BasicBeanPane implements UIObserver } protected void initLayout() { - JPanel pane = new JPanel(new BorderLayout()); - JPanel pane1 = new JPanel(new BorderLayout()); - pane1.add(formulaTextField, BorderLayout.NORTH); - pane1.setBorder(new ScaledEmptyBorder(0,0,0,5)); - pane.add(pane1,BorderLayout.CENTER); - pane.add(formulaTextFieldButton,BorderLayout.EAST); - this.setLayout(new BorderLayout()); - this.add(pane,BorderLayout.NORTH) ; + this.add(row( + cell(formulaTextField).weight(2.4), flex(0.1), cell(formulaTextFieldButton).weight(0.5) + ).getComponent()) ; } /** diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/JControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/JControlPane.java index 594a21ac5c..591b80a4db 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/JControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/JControlPane.java @@ -1,6 +1,7 @@ package com.fr.design.gui.controlpane; import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.design.border.FineBorderFactory; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.controlpane.shortcutfactory.AbstractShortCutFactory; @@ -13,6 +14,7 @@ import com.fr.stable.ArrayUtils; import com.fr.stable.Filter; import com.fr.stable.Nameable; +import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.JSplitPane; import java.awt.BorderLayout; @@ -148,7 +150,10 @@ abstract class JControlPane extends BasicPane implements UnrepeatedNameHelper, S toolbarDef.addShortCut(sj.getShortCut()); } toolBar = ToolBarDef.createJToolBar(); - toolBar.setBorder(FineBorderFactory.createUnderlineBorder(FlatUIUtils.getUIColor("defaultBorderColor", Color.GRAY))); + toolBar.setBorder(BorderFactory.createCompoundBorder( + FineBorderFactory.createUnderlineBorder(FlatUIUtils.getUIColor("defaultBorderColor", Color.GRAY)), + new ScaledEmptyBorder(3, 0, 3, 0) + )); toolBar.setBorderPainted(true); toolbarDef.updateToolBar(toolBar); } diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java index a9c03a6eeb..8f39d041dd 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java @@ -1,6 +1,6 @@ package com.fr.design.gui.controlpane; -import com.fine.theme.light.ui.FineRoundBorder; +import com.formdev.flatlaf.ui.FlatRoundBorder; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilist.JNameEdList; @@ -76,7 +76,7 @@ public abstract class UIListControlPane extends UIControlPane implements ListCon nameableList.setName(LIST_NAME); UIScrollPane scrollPane = new UIScrollPane(nameableList); leftPane.add(scrollPane, BorderLayout.CENTER); - leftPane.setBorder(new FineRoundBorder()); + leftPane.setBorder(new FlatRoundBorder()); nameableList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); nameableList.addMouseListener(getHelper().getListMouseListener(nameableList, this)); diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/FineTabbedPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/FineTabbedPane.java index 9fd7620c7f..08cd1f5eb2 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/FineTabbedPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/FineTabbedPane.java @@ -167,4 +167,24 @@ public class FineTabbedPane extends Column { public Component getSelectedComponent() { return tabComponents.get(String.valueOf(tabGroup.getSelectedItem())); } + + /** + * 设置选中的Tab组件 + * + * @param i 组件序号 + */ + public void setSelectedIndex(int i) { + tabGroup.setSelectedIndex(i); + cards.show(centerPane, String.valueOf(tabGroup.getSelectedItem())); + } + + /** + * 获取选中的组件序号 + * + * @return 组件序号 + */ + public int getSelectedIndex() { + return tabGroup.getSelectedIndex(); + } + } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java index 8274b65355..a60bb7f18e 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.check; +import com.fine.theme.utils.FineUIStyle; import com.fr.design.dialog.link.MessageWithLink; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; @@ -111,6 +112,7 @@ public class CheckFontInfoDialog extends JDialog implements ActionListener { //底部的按钮面板 UIButton okButton = new UIButton(Toolkit.i18nText("Fine-Design_Report_OK")); + FineUIStyle.setStyle(okButton, FineUIStyle.STYLE_PRIMARY); okButton.addActionListener(this); bottomPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); bottomPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridControlPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridControlPane.java index cdbd6d10f2..f2101b944a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridControlPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridControlPane.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.theme; +import com.fine.theme.icon.LazyIcon; import com.fr.base.theme.FormTheme; import com.fr.base.theme.FormThemeConfig; import com.fr.base.theme.ReportTheme; @@ -14,18 +15,15 @@ import com.fr.design.event.ChangeListener; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.i18n.Toolkit; -import com.fr.design.icon.IconPathConstants; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.theme.dialog.TemplateThemeProfileDialog; import com.fr.design.menu.MenuDef; import com.fr.design.menu.ToolBarDef; -import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; import com.fr.third.javax.annotation.Nullable; import com.fr.transaction.CallBackAdaptor; -import javax.swing.BorderFactory; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSeparator; @@ -35,8 +33,6 @@ import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; -import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; @@ -99,8 +95,6 @@ public class TemplateThemeGridControlPane extends Basic private void initializePane() { setLayout(FRGUIPaneFactory.createBorderLayout()); - setBorder(BorderFactory.createEmptyBorder(5, 10, 0, 10)); - setPreferredSize(new Dimension(CONTENT_WIDTH, CONTENT_HEIGHT)); add(createActionsContainer(), BorderLayout.NORTH); @@ -177,10 +171,8 @@ public class TemplateThemeGridControlPane extends Basic private JPanel createActionsContainer() { JPanel content = FRGUIPaneFactory.createBorderLayout_S_Pane(); - content.setPreferredSize(new Dimension(content.getPreferredSize().width, 20)); UIToolbar toolBar = ToolBarDef.createJToolBar(); - toolBar.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); content.add(toolBar, BorderLayout.CENTER); MenuDef addMenuDef = createAddMenuDef(); @@ -210,17 +202,14 @@ public class TemplateThemeGridControlPane extends Basic content.add(setTheme4NewTemplateButton, BorderLayout.EAST); JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane(); - container.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0)); container.add(content, BorderLayout.CENTER); - container.setPreferredSize(new Dimension(container.getPreferredSize().width, 30)); - return container; } private MenuDef createAddMenuDef() { MenuDef menuDef = new MenuDef(Toolkit.i18nText("Fine-Design_Basic_Action_Add")); - menuDef.setIconPath(IconPathConstants.ADD_POPMENU_ICON_PATH); + menuDef.setIcon(new LazyIcon("add_popup")); menuDef.setRePaint(true); menuDef.addShortCut(new AddThemeAction(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Pane_Create_Light_Theme"), config.getDefaultLightThemeName())); menuDef.addShortCut(new AddThemeAction(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Pane_Create_Dark_Theme"), config.getDefaultDarkThemeName())); @@ -239,7 +228,7 @@ public class TemplateThemeGridControlPane extends Basic setEnabled(initialEnabled); setName(Toolkit.i18nText("Fine-Design_Basic_Remove")); setMnemonic('R'); - setSmallIcon(IOUtils.readIcon(IconPathConstants.TD_REMOVE_ICON_PATH)); + setSmallIcon(new LazyIcon("remove")); } @Override diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPagesPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPagesPane.java index 36e962c6af..704f9c1a35 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPagesPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPagesPane.java @@ -12,7 +12,7 @@ import com.fr.design.dialog.BasicPane; import com.fr.design.event.ChangeEvent; import com.fr.design.event.ChangeListener; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.gui.frpane.UITabbedPane; +import com.fr.design.gui.frpane.FineTabbedPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; @@ -276,27 +276,27 @@ public class TemplateThemeGridPagesPane extends JPanel { } public static class TemplateThemeManagingPane extends TemplateThemeGridPagePane { - private final UITabbedPane tabbedPane; + private final FineTabbedPane tabbedPane; public TemplateThemeManagingPane(@Nullable Window window) { setLayout(FRGUIPaneFactory.createBorderLayout()); - tabbedPane = new UITabbedPane(); - tabbedPane.setTabBorderColor(new Color(0xE0E0E1)); - add(tabbedPane, BorderLayout.CENTER); - TemplateThemeGridControlPane formThemesManagerPane = TemplateThemeGridControlPane.createFormThemesManagerPane(window); TemplateThemeGridControlPane reportThemesManagerPane = TemplateThemeGridControlPane.createReportThemesManagerPane(window); - tabbedPane.addTab(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Dialog_Form_Tab"), formThemesManagerPane); - tabbedPane.addTab(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Dialog_Report_Tab"), reportThemesManagerPane); - + tabbedPane = FineTabbedPane.builder() + .addTab(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Dialog_Form_Tab"), formThemesManagerPane) + .addTab(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Dialog_Report_Tab"), reportThemesManagerPane) + .build(); tabbedPane.setSelectedIndex(0); JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); TemplateThemeConfig config = template.getUsingTemplateThemeConfig(); if (config == reportThemesManagerPane.getConfig()) { tabbedPane.setSelectedIndex(1); } + + add(tabbedPane, BorderLayout.CENTER); + } @Override diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java index 91ab9a57b1..9865321987 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java @@ -21,7 +21,6 @@ import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Dimension; -import java.awt.GridLayout; import java.util.ArrayList; import java.util.List; @@ -42,7 +41,6 @@ public class CellStyleEditPane extends MultiTabPane { public CellStyleEditPane() { super(); - tabPane.setLayout(new GridLayout(1, 3, 0, 0)); } diff --git a/designer-base/src/main/resources/com/fine/theme/icon/editor/ds_column_index.svg b/designer-base/src/main/resources/com/fine/theme/icon/editor/ds_column_index.svg new file mode 100644 index 0000000000..2df8e391ac --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/editor/ds_column_index.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/editor/ds_column_index_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/editor/ds_column_index_disable.svg new file mode 100644 index 0000000000..dd0e39f792 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/editor/ds_column_index_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/editor/ds_column_name.svg b/designer-base/src/main/resources/com/fine/theme/icon/editor/ds_column_name.svg new file mode 100644 index 0000000000..22a4ad36ab --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/editor/ds_column_name.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/editor/ds_column_name_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/editor/ds_column_name_disable.svg new file mode 100644 index 0000000000..0abdef6e3c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/editor/ds_column_name_disable.svg @@ -0,0 +1,3 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json b/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json index 4e3213695b..d8ac2732b5 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json @@ -275,6 +275,8 @@ "tab": "widget/tab.svg", "text_area": "widget/text_area.svg", "text_field": "widget/text_field.svg", - "widget_tree": "widget/tree.svg" + "widget_tree": "widget/tree.svg", + "ds_column_name": "editor/ds_column_name.svg", + "ds_column_index": "editor/ds_column_index.svg" } } diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index d20add6df5..814b64db95 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -1257,6 +1257,9 @@ CellOtherSetPane.height=$Component.defaultHeight [style]Panel.lightGrey=\ background: $Center.OuterShadowColor +[style]Panel.roundBorder=\ + arc: 5 + [style]Panel.menuBar=\ background: $MenuBar.background diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java b/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java index 183f14b768..6af8a112e5 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java @@ -1,5 +1,6 @@ package com.fr.design.chart; +import com.fine.theme.utils.FineUIStyle; import com.fr.base.chart.BaseChartCollection; import com.fr.chart.chartattr.ChartCollection; import com.fr.design.dialog.BasicDialog; @@ -54,6 +55,8 @@ public class ChartDialog extends MiddleChartDialog { ok = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_OK")); cancel = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Cancel")); + FineUIStyle.setStyle(ok, FineUIStyle.STYLE_PRIMARY); + this.applyClosingAction(); this.applyEscapeAction(); this.setBasicDialogSize(BasicDialog.DEFAULT); diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java index c34fcce653..b6879dc102 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java @@ -3,6 +3,10 @@ package com.fr.design.chart; * the Pane of the Chart */ +import com.fine.swing.ui.layout.Column; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.chart.chartdata.CallbackEvent; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.charttypes.ChartTypeManager; @@ -10,6 +14,7 @@ import com.fr.chartx.attr.ChartProvider; import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.chart.info.ChartInfoCollector; import com.fr.design.utils.gui.GUICoreUtils; @@ -17,7 +22,6 @@ import com.fr.log.FineLoggerFactory; import com.fr.stable.ArrayUtils; import com.fr.van.chart.config.DefaultStyleHelper4Van; -import javax.swing.BorderFactory; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JList; @@ -73,9 +77,11 @@ public class ChartTypePane extends ChartCommonWizardPane implements CallbackEven mainTypeList.setSelectedIndex(0); JSplitPane spane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, typeScrollPane, subListPane); - spane.setDividerLocation(120); - spane.setBorder(BorderFactory.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_M_Popup_Chart_Type"))); - this.add(spane); + spane.setDividerLocation(150); + + Column center = (Column) FineUIUtils.wrapComponentWithTitle(spane, Toolkit.i18nText("Fine-Design_Chart_M_Popup_Chart_Type")); + center.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); + this.add(center); iconViewList.setSelectedIndex(0); } @@ -92,11 +98,9 @@ public class ChartTypePane extends ChartCommonWizardPane implements CallbackEven ChartIcon chartIcon = (ChartIcon) value; if (isSelected) { // 深蓝色. - this.setBackground(new Color(57, 107, 181)); - this.setBorder(GUICoreUtils.createTitledBorder(getChartName(chartIcon), Color.WHITE)); - } else { - this.setBorder(GUICoreUtils.createTitledBorder(getChartName(chartIcon))); + this.setBackground(FlatUIUtils.getUIColor("Tree.selectionBackground", new Color(57, 107, 181))); } + this.setBorder(GUICoreUtils.createTitledBorder(getChartName(chartIcon))); } return this; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/MeterPlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/MeterPlotTableDataContentPane.java index 9edb02d9f7..9224674924 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/MeterPlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/MeterPlotTableDataContentPane.java @@ -1,9 +1,13 @@ package com.fr.design.mainframe.chart.gui.data.table; +import com.fine.swing.ui.layout.Column; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; import com.fr.base.Utils; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartattr.MeterPlot; import com.fr.chart.chartdata.MeterTableDefinition; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.formula.DefaultTinyFormulaPane; import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.icombobox.UIComboBox; @@ -12,19 +16,14 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.ChartDataFilterPane; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.extended.chart.StringFormula; import com.fr.extended.chart.UIComboBoxWithNone; import com.fr.general.GeneralUtils; import com.fr.stable.StringUtils; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; -import javax.swing.BorderFactory; -import javax.swing.BoxLayout; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.List; @@ -40,21 +39,16 @@ public class MeterPlotTableDataContentPane extends AbstractTableDataContentPane private static final String METER_VALUE = Toolkit.i18nText("Fine-Design_Chart_Value_Pointer"); private static final String TARGET_VALUE = Toolkit.i18nText("Fine-Design_Chart_Target_Value"); - private static final int COMBOBOX_WIDTH = 115; - private static final int COMBOBOX_HEIGHT = 20; - - private static final int LABEL_WIDTH = 85; - private UIComboBox nameBox; private UIComboBox valueBox; private UIComboBox targetBox; private TinyFormulaPane custom; private ChartDataFilterPane filterPane; - private JPanel boxPane; + private Column boxPane; public MeterPlotTableDataContentPane(ChartDataPane parent) { - this.setLayout(new BorderLayout()); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); nameBox = new UIComboBoxWithNone(); nameBox.setSelectedIndex(nameBox.getItemCount() -1); @@ -63,8 +57,8 @@ public class MeterPlotTableDataContentPane extends AbstractTableDataContentPane custom = new DefaultTinyFormulaPane(); filterPane = new ChartDataFilterPane(new MeterPlot(), parent); - boxPane = new JPanel(); - boxPane.setLayout(new BoxLayout(boxPane, BoxLayout.Y_AXIS)); + boxPane = new Column(); + boxPane.setSpacing(10); JPanel namePane = createPaneWithLabel(Toolkit.i18nText(METER_NAME), getNameComponent()); boxPane.add(namePane); @@ -92,11 +86,7 @@ public class MeterPlotTableDataContentPane extends AbstractTableDataContentPane } }); - JPanel jPanel = TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_Filter"), filterPane); - - filterPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 15)); - boxPane.setBorder(BorderFactory.createEmptyBorder(7, 24, 7, 15)); - jPanel.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 5)); + JPanel jPanel = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_Filter"), filterPane, true); this.add(getJSeparator(), BorderLayout.NORTH); this.add(boxPane, BorderLayout.CENTER); @@ -108,12 +98,8 @@ public class MeterPlotTableDataContentPane extends AbstractTableDataContentPane } private JPanel createPaneWithLabel(String labelName, Component component) { - component.setPreferredSize(new Dimension(COMBOBOX_WIDTH, COMBOBOX_HEIGHT)); UILabel label = new BoldFontTextLabel(labelName); - label.setPreferredSize(new Dimension(LABEL_WIDTH, COMBOBOX_HEIGHT)); - JPanel paneWithLabel = GUICoreUtils.createBorderLayoutPane(new Component[]{component, null, null, label, null}); - paneWithLabel.setBorder(BorderFactory.createEmptyBorder(3, 0, 3, 0)); - return paneWithLabel; + return FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, label, component); } protected void refreshBoxListWithSelectTableData(List list) { diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/AbstractPlotSeriesPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/AbstractPlotSeriesPane.java index cf8f55bb79..0ebc75d75e 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/AbstractPlotSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/AbstractPlotSeriesPane.java @@ -1,17 +1,20 @@ package com.fr.design.mainframe.chart.gui.style.series; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Bar2DPlot; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.style.ChartFillStylePane; -import javax.swing.*; -import java.awt.*; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JSeparator; +import java.awt.BorderLayout; +import java.awt.Component; + /** * 属性表, 图表样式 - 系列 界面, 通过重载继承每个不同的方法, 得到内容的组合. * @author kunsnat E-mail:kunsnat@gmail.com @@ -37,10 +40,6 @@ public abstract class AbstractPlotSeriesPane extends BasicBeanPane{ } protected JPanel getContentPane(boolean custom) { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f}; - double[] rowSize = {p, p, p}; Component[][] components = new Component[3][1]; JPanel panel; @@ -51,7 +50,7 @@ public abstract class AbstractPlotSeriesPane extends BasicBeanPane{ components[1] = new Component[]{new JSeparator()}; } - panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + panel = FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1}); JScrollPane scrollPane = new JScrollPane(); scrollPane.setViewportView(panel); @@ -68,7 +67,7 @@ public abstract class AbstractPlotSeriesPane extends BasicBeanPane{ components[2] = new Component[]{contentPane}; } - panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + panel = FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1}); } return panel; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java index e8ef8714da..e150466ecc 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java @@ -13,9 +13,11 @@ import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; +import static com.fine.theme.utils.FineUIScale.scale; + public class ChartImagePane extends ChartSelectDemoPane { private static final long serialVersionUID = -2785128245790568603L; - private static final int IMAGE_WIDTH = 58; + private static final int IMAGE_WIDTH = 56; private static final int IMAGE_HIGTH = 50; private static final Color ENTER_COLOR = new Color(216, 242, 253); private boolean isDrawRightLine = false; @@ -30,7 +32,7 @@ public class ChartImagePane extends ChartSelectDemoPane { this.setBorder(BorderFactory.createMatteBorder(0, 0, 0, isDrawRightLine ? 1 : 0, UIConstants.SELECT_TAB)); this.setBackground(UIConstants.TOOLBARUI_BACKGROUND); - this.setPreferredSize(new Dimension(IMAGE_WIDTH, IMAGE_HIGTH)); + this.setPreferredSize(getScaledDimension()); } public ChartImagePane(String fullIconPath, String tipName, boolean isDrawRightLine){ @@ -45,7 +47,7 @@ public class ChartImagePane extends ChartSelectDemoPane { super.paint(g); BufferedImage image1 = IOUtils.readImageWithCache(fullIconPath); - g.drawImage(image1, 0, 0, IMAGE_WIDTH, IMAGE_HIGTH, null); + g.drawImage(image1, 0, 0, scale(IMAGE_WIDTH), scale(IMAGE_HIGTH), null); } }; @@ -58,8 +60,12 @@ public class ChartImagePane extends ChartSelectDemoPane { this.setBorder(BorderFactory.createMatteBorder(0, 0, 0, isDrawRightLine ? 1 : 0, UIConstants.SELECT_TAB)); this.setBackground(UIConstants.TOOLBARUI_BACKGROUND); - this.setPreferredSize(new Dimension(IMAGE_WIDTH, IMAGE_HIGTH)); + this.setPreferredSize(getScaledDimension()); + + } + private Dimension getScaledDimension() { + return scale(new Dimension(IMAGE_WIDTH, IMAGE_HIGTH)); } /** diff --git a/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaSeriesPane.java index a006ce54f3..751175b09f 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaSeriesPane.java @@ -1,13 +1,12 @@ package com.fr.van.chart.area; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.van.chart.column.VanChartCustomStackAndAxisConditionPane; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.VanChartBeautyPane; import com.fr.van.chart.designer.component.VanChartLineTypePane; import com.fr.van.chart.designer.component.VanChartLineTypePaneWithoutDashed; @@ -27,11 +26,6 @@ public class VanChartAreaSeriesPane extends VanChartLineSeriesPane { protected JPanel getContentInPlotType() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] row = {p, p, p, p, p, p, p}; - double[] col = {f}; - Component[][] components = new Component[][]{ new Component[]{createLineTypePane()}, new Component[]{createMarkerPane()}, @@ -42,7 +36,7 @@ public class VanChartAreaSeriesPane extends VanChartLineSeriesPane { new Component[]{createTrendLinePane()}, }; - contentPane = TableLayoutHelper.createTableLayoutPane(components, row, col); + contentPane = FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1}); return contentPane; } @@ -61,6 +55,6 @@ public class VanChartAreaSeriesPane extends VanChartLineSeriesPane { protected JPanel createMarkerPane() { markerPane = new VanChartMarkerPane(); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Marker"), markerPane); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Marker"), markerPane, true); } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/component/MeterCustomPlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/custom/component/MeterCustomPlotTableDataContentPane.java index 6b00e9eb20..c23598e952 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/component/MeterCustomPlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/component/MeterCustomPlotTableDataContentPane.java @@ -8,14 +8,11 @@ import com.fr.design.mainframe.chart.gui.data.table.MeterPlotTableDataContentPan import com.fr.plugin.chart.data.VanChartMeterCustomTableDefinition; import java.awt.Component; -import java.awt.Dimension; /** * Created by Fangjie on 2016/5/18. */ public class MeterCustomPlotTableDataContentPane extends MeterPlotTableDataContentPane { - private static final int TEXT_HT = 20; - private static final int TEXT_WD = 80; private UITextField nameField; public MeterCustomPlotTableDataContentPane(ChartDataPane parent) { super(parent); @@ -24,7 +21,6 @@ public class MeterCustomPlotTableDataContentPane extends MeterPlotTableDataConte @Override protected Component getNameComponent() { nameField = new UITextField(); - nameField.setPreferredSize(new Dimension(TEXT_WD, TEXT_HT)); return nameField; } diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartHyperLinkPane.java b/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartHyperLinkPane.java index 5b17494da9..77b581bdd7 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartHyperLinkPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartHyperLinkPane.java @@ -1,5 +1,6 @@ package com.fr.van.chart.custom.component; +import com.fine.theme.utils.FineUIScale; import com.fr.base.BaseFormula; import com.fr.chart.chartattr.Plot; import com.fr.chart.web.ChartHyperPoplink; @@ -43,6 +44,7 @@ import com.fr.stable.Nameable; import com.fr.stable.bridge.StableFactory; import com.fr.van.chart.designer.component.VanChartUIListControlPane; +import java.awt.Dimension; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.lang.reflect.Constructor; @@ -59,6 +61,7 @@ public class VanChartHyperLinkPane extends VanChartUIListControlPane { public VanChartHyperLinkPane() { super(); + setPreferredSize(FineUIScale.scale(new Dimension(224, 420))); } @Override diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartLineTypePane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartLineTypePane.java index b6119aa642..20aada59a8 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartLineTypePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartLineTypePane.java @@ -1,27 +1,28 @@ package com.fr.van.chart.designer.component; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.ispinner.chart.UISpinnerWithPx; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.utils.gui.UIComponentUtils; -import com.fr.design.widget.FRWidgetFactory; import com.fr.general.ComparatorUtils; import com.fr.plugin.chart.base.VanChartAttrLine; import com.fr.plugin.chart.type.LineStyle; import com.fr.plugin.chart.type.LineType; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.JPanel; -import java.util.Arrays; import java.awt.BorderLayout; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.row; + /** * line相关设置 */ @@ -51,22 +52,14 @@ public class VanChartLineTypePane extends BasicPane { Toolkit.i18nText("Fine-Design_Chart_Open"), Toolkit.i18nText("Fine-Design_Chart_Close")}); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - Component[] lineStyleComponent = new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Style_Present")), lineStyle}, nullValueBreakComponent = new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Null_Value_Break")), nullValueBreak}; Component[][] components = createContentComponent(lineStyleComponent, nullValueBreakComponent); - double[] row = new double[components.length]; - Arrays.fill(row, p); - double[] col = {f, e}; - - lineStylePane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); + lineStylePane = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); - this.setLayout(new BorderLayout(0, 6)); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); this.add(typeAndWidthPane, BorderLayout.NORTH); this.add(lineStylePane, BorderLayout.CENTER); } @@ -84,29 +77,16 @@ public class VanChartLineTypePane extends BasicPane { checkLineStyle(); } }); - - Component[][] lineTypeComps = new Component[][]{ - new Component[]{null, null}, - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Line_Style")), lineTypeComboBox} - }; - Component[][] lineWidthComps = new Component[][]{ - new Component[]{ - FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Chart_Line_Width")), - UIComponentUtils.wrapWithBorderLayoutPane(lineWidthSpinner)} - }; - - double p = TableLayout.PREFERRED, f = TableLayout.FILL, e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] col = {f, e}; - - JPanel lineTypePane = TableLayout4VanChartHelper.createGapTableLayoutPane(lineTypeComps, new double[]{p, p}, col); - lineWidthPane = TableLayout4VanChartHelper.createGapTableLayoutPane(lineWidthComps, new double[]{p}, col); - - JPanel contentPane = new JPanel(new BorderLayout(0, 6)); - - contentPane.add(lineTypePane, BorderLayout.CENTER); - contentPane.add(lineWidthPane, BorderLayout.SOUTH); - - return contentPane; + lineWidthPane = row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Chart_Line_Width"))).weight(1.2), cell(lineWidthSpinner).weight(3) + ).getComponent(); + + return column(10, + row( + cell(new UILabel(Toolkit.i18nText("Fine-Design_Chart_Line_Style"))).weight(1.2), + cell(lineTypeComboBox).weight(3) + ), + cell(lineWidthPane)).getComponent(); } protected LineTypeComboBox createLineType() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartMarkerPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartMarkerPane.java index 1f8b55cfbf..d087c7f026 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartMarkerPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartMarkerPane.java @@ -1,6 +1,9 @@ package com.fr.van.chart.designer.component; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButtonGroup; @@ -30,7 +33,7 @@ public class VanChartMarkerPane extends BasicPane { private BasicBeanPane imageMarkerPane; public VanChartMarkerPane() { - this.setLayout(new BorderLayout(0, 4)); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); String[] array = new String[]{Toolkit.i18nText("Fine-Design_Chart_Rule"), Toolkit.i18nText("Fine-Design_Chart_Custom")}; commonORCustom = new UIButtonGroup(array, array); @@ -88,7 +91,9 @@ public class VanChartMarkerPane extends BasicPane { } protected void layoutComponents() { - this.add(TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Point_Style"), commonORCustom), BorderLayout.NORTH); + this.add(FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(Toolkit.i18nText("Fine-Design_Chart_Point_Style")), commonORCustom + ), BorderLayout.NORTH); this.add(centerPane, BorderLayout.CENTER); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTrendLinePane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTrendLinePane.java index dbcdb0e21c..5574d26474 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTrendLinePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTrendLinePane.java @@ -1,5 +1,6 @@ package com.fr.van.chart.designer.component; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.base.AttrColor; import com.fr.chart.base.AttrLineStyle; import com.fr.chart.base.LineStyleInfo; @@ -96,8 +97,8 @@ public class VanChartTrendLinePane extends BasicPane{ new Component[]{label, periodPane} }; - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, new double[]{p,p,p}, col); - trendLineHidePane = TableLayout4VanChartHelper.createGapTableLayoutPane(componentsMayHide, new double[]{p,p,p,p}, col); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2 ,3}); + trendLineHidePane = FineLayoutBuilder.compatibleTableLayout(10, componentsMayHide, new double[]{1.2 ,3}); trendLineStyle.addActionListener(new ActionListener() { @Override diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartUIListControlPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartUIListControlPane.java index a3902abdc2..3e271fc48c 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartUIListControlPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartUIListControlPane.java @@ -1,13 +1,10 @@ package com.fr.van.chart.designer.component; -import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Plot; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; import com.fr.design.gui.controlpane.UIListControlPane; import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.chart.mode.ChartEditContext; import com.fr.design.utils.gui.GUICoreUtils; @@ -21,7 +18,6 @@ import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; -import java.awt.Component; import java.awt.FlowLayout; import java.awt.Point; import java.awt.Window; @@ -98,13 +94,6 @@ public abstract class VanChartUIListControlPane extends UIListControlPane implem this.listenerList.add(ChangeListener.class, l); } - @Override - protected JPanel getLeftTopPane(UIToolbar topToolBar) { - Component[][] components = new Component[][]{ - new Component[]{new UILabel(getAddItemText()), topToolBar}, - }; - return FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1.2, 3}); - } @Override public void saveSettings() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/marker/VanChartCommonMarkerPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/marker/VanChartCommonMarkerPane.java index 0afa4492a9..59760e86dd 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/marker/VanChartCommonMarkerPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/marker/VanChartCommonMarkerPane.java @@ -8,7 +8,6 @@ import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.ispinner.chart.UISpinnerWithPx; import com.fr.design.gui.xcombox.MarkerComboBox; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; import com.fr.plugin.chart.base.VanChartAttrMarker; import com.fr.plugin.chart.marker.type.MarkerType; import com.fr.van.chart.designer.TableLayout4VanChartHelper; @@ -81,8 +80,6 @@ public class VanChartCommonMarkerPane extends BasicBeanPane }; radius = new UISpinnerWithPx(0, 100, 0.5, 0); - double p = TableLayout.PREFERRED; - markerTypePane = FineLayoutBuilder.compatibleTableLayout(10, getMarkerTypeComponent(), new double[]{1.2, 3}); markerConfigPane = FineLayoutBuilder.compatibleTableLayout(10, getMarkerConfigComponent(), new double[]{1.2, 3}); @@ -92,13 +89,8 @@ public class VanChartCommonMarkerPane extends BasicBeanPane checkMarkType(); } }); - - JPanel contentPane = new JPanel(new BorderLayout(0, 6)); - - contentPane.add(markerTypePane, BorderLayout.CENTER); - contentPane.add(markerConfigPane, BorderLayout.SOUTH); - - this.add(contentPane); + this.setLayout(new BorderLayout()); + this.add(FineLayoutBuilder.createVerticalLayout(10, markerTypePane, markerConfigPane)); } protected Component[][] getMarkerTypeComponent() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/marker/VanChartImageMarkerPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/marker/VanChartImageMarkerPane.java index 3d6c85f4ec..45cb7187b2 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/marker/VanChartImageMarkerPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/marker/VanChartImageMarkerPane.java @@ -1,12 +1,11 @@ package com.fr.van.chart.designer.component.marker; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.background.ImageFileBackground; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.ispinner.chart.UISpinnerWithPx; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.backgroundpane.ImageBackgroundQuickPane; import com.fr.plugin.chart.base.VanChartAttrMarker; @@ -14,12 +13,16 @@ import com.fr.plugin.chart.marker.type.MarkerType; import com.fr.stable.Constants; import com.fr.van.chart.designer.TableLayout4VanChartHelper; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + /** * Created by Mitisky on 16/5/19. */ @@ -30,25 +33,18 @@ public class VanChartImageMarkerPane extends BasicBeanPane { public VanChartImageMarkerPane() { imageBackgroundPane = new ImageBackgroundQuickPane(false); - imageBackgroundPane.setPreferredSize(getImageBackgroundPreferredSize(imageBackgroundPane.getPreferredSize())); width = new UISpinnerWithPx(0, Integer.MAX_VALUE, 0.5, 30); height = new UISpinnerWithPx(0, Integer.MAX_VALUE, 0.5, 30); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] row = {p, p, p}; - double[] col = {p, f}; - Component[][] components = new Component[][]{ new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Width")), width}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Height")), height}, }; - JPanel sizePanel = TableLayoutHelper.createTableLayoutPane(components, row, col); + JPanel sizePanel = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); JPanel panel = createContentPane(imageBackgroundPane, sizePanel); - panel.setBorder(BorderFactory.createEmptyBorder(0, 72, 0, 0)); - + this.setLayout(new BorderLayout()); this.add(panel); } @@ -57,10 +53,11 @@ public class VanChartImageMarkerPane extends BasicBeanPane { } protected JPanel createContentPane(ImageBackgroundQuickPane imageBackgroundPane, JPanel sizePanel) { - JPanel panel = new JPanel(new BorderLayout(0, 4)); - panel.add(imageBackgroundPane, BorderLayout.CENTER); - panel.add(sizePanel, BorderLayout.SOUTH); - return panel; + return row( + flex(1.2), column(10, + cell(imageBackgroundPane), cell(sizePanel) + ).weight(3) + ).getComponent(); } /** diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisScrollPaneWithTypeSelect.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisScrollPaneWithTypeSelect.java index 61c3f18173..f9c8e08023 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisScrollPaneWithTypeSelect.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisScrollPaneWithTypeSelect.java @@ -1,10 +1,12 @@ package com.fr.van.chart.designer.style.axis; -import com.fine.theme.utils.FineUIScale; +import com.fine.theme.utils.FineLayoutBuilder; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.chart.base.ColorWithThemeStyle; import com.fr.chart.chartattr.Axis; import com.fr.design.beans.FurtherBasicBeanPane; import com.fr.design.gui.frpane.UIComboBoxPane; +import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.PaneTitleConstants; import com.fr.general.ComparatorUtils; @@ -14,7 +16,6 @@ import com.fr.plugin.chart.attr.axis.VanChartValueAxis; import com.fr.plugin.chart.type.AxisType; import com.fr.van.chart.config.DefaultStyleHelper4Van; import com.fr.van.chart.designer.AbstractVanChartScrollPane; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -58,10 +59,12 @@ public class VanChartAxisScrollPaneWithTypeSelect extends AbstractVanChartScroll } protected void initLayout() { - this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); - JPanel northPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Type"), jcb); + this.setLayout(new BorderLayout()); + JPanel northPane = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(Toolkit.i18nText("Fine-Design_Chart_Type")), jcb); this.add(northPane, BorderLayout.NORTH); this.add(cardPane, BorderLayout.CENTER); + setBorder(new ScaledEmptyBorder(10, 0, 0, 0)); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisStyleSettingPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisStyleSettingPane.java index dde467226c..1dac1dbf9f 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisStyleSettingPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisStyleSettingPane.java @@ -1,5 +1,7 @@ package com.fr.van.chart.designer.style.axis; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; import com.fr.base.BaseFormula; import com.fr.chart.base.TextAttr; import com.fr.design.beans.BasicBeanPane; @@ -8,13 +10,11 @@ import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; import com.fr.design.utils.gui.UIComponentUtils; import com.fr.design.widget.FRWidgetFactory; import com.fr.plugin.chart.attr.axis.VanChartAxisLabelStyle; import com.fr.van.chart.config.DefaultStyleHelper4Van; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.style.axis.component.AxisLabelDisplayComboBox; import javax.swing.JPanel; @@ -41,14 +41,10 @@ public class VanChartAxisStyleSettingPane extends BasicBeanPane(new String[]{Toolkit.i18nText("Fine-Design_Chart_Automatic"), Toolkit.i18nText("Fine-Design_Chart_Fixed")}); labelGapValue = new UITextField(); - labelGapPane = createLabelGapPane(row, column); + labelGapPane = createLabelGapPane(); this.setLayout(new BorderLayout()); - contentPane = new JPanel(new BorderLayout()); + contentPane = new JPanel(new BorderLayout(0, FineUIScale.scale(10))); contentPane.add(labelDisplayPane, BorderLayout.NORTH); contentPane.add(labelTextAttrPane, BorderLayout.CENTER); contentPane.add(labelGapPane, BorderLayout.SOUTH); @@ -146,7 +142,7 @@ public class VanChartAxisStyleSettingPane extends BasicBeanPane { protected JPanel createContentPane(boolean isXAxis) { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double s = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] column = {f, s}; - double[] rowSize = {p, p, p, p, p, p, p, p}; Component[][] components = new Component[][]{ new Component[]{createTitlePane(isXAxis), null}, new Component[]{createLabelPane(), null}, @@ -152,7 +149,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { new Component[]{createValueStylePane(), null}, }; - return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1}); } protected JPanel createTitlePane(boolean isXAxis) { @@ -191,9 +188,9 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } }); - JPanel jPanel = new JPanel(new BorderLayout()); - jPanel.add(showTitlePane, BorderLayout.NORTH); - jPanel.add(titlePane, BorderLayout.CENTER); + JPanel jPanel = column(10, + cell(showTitlePane), cell(titlePane) + ).getComponent(); return new UIExpandablePane(PaneTitleConstants.CHART_STYLE_TITLE_TITLE, jPanel, true); } @@ -218,7 +215,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { new UILabel(Toolkit.i18nText("Fine-Design_Chart_Axis_Label")), showLabel); JPanel labelContentPane = createLabelContentPane(); - JPanel labelPane = new JPanel(new BorderLayout()); + JPanel labelPane = new JPanel(new BorderLayout(0, FineUIScale.scale(10))); labelPane.add(showLabelPane, BorderLayout.NORTH); labelPane.add(labelContentPane, BorderLayout.CENTER); @@ -402,9 +399,8 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { centerPane.add(htmlLabelPane, Toolkit.i18nText("Fine-Design_Chart_Custom")); Component[][] components = new Component[][]{ - new Component[]{null, null}, new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Axis_Label_Format"), SwingConstants.LEFT), valueFormatStyle}, - new Component[]{null, centerPane}, + new Component[]{centerPane, null}, }; JPanel contentPane = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); @@ -416,7 +412,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } }); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Use_Format"), contentPane); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Use_Format"), contentPane); } protected FormatPane createFormatPane() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java index 61371ee2f4..e4cdda9c9b 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java @@ -52,7 +52,7 @@ public class VanChartValueAxisPane extends VanChartBaseAxisPane { new Component[]{createValueStylePane(), null}, }; - return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); + return FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1.2, 3}); } protected boolean showLabelDisplay() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java index adaabb5dfd..c22cf2318a 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java @@ -1,6 +1,8 @@ package com.fr.van.chart.designer.style.axis.component; +import com.fine.swing.ui.layout.Column; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.BaseUtils; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.ibutton.UIButton; @@ -14,15 +16,13 @@ import com.fr.plugin.chart.attr.axis.VanChartAxis; import com.fr.plugin.chart.attr.plot.VanChartAxisPlot; import com.fr.van.chart.designer.style.axis.VanChartAxisPane; -import javax.swing.BoxLayout; import javax.swing.Icon; import javax.swing.JPanel; -import java.util.ArrayList; -import java.util.List; import java.awt.BorderLayout; import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.Graphics; +import java.util.ArrayList; +import java.util.List; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; @@ -49,7 +49,7 @@ public class VanChartAxisButtonPane extends BasicBeanPane { private List indexList_X = new ArrayList(); private List indexList_Y = new ArrayList(); - private JPanel buttonPane; + private Column buttonPane; private VanChartAxisPane parent; @@ -63,7 +63,8 @@ public class VanChartAxisButtonPane extends BasicBeanPane { addButton.setVisible(false); this.add(eastPane, BorderLayout.EAST); - buttonPane = new JPanel(); + buttonPane = new Column(); + buttonPane.setSpacing(10); this.add(buttonPane, BorderLayout.CENTER); itemX = new UIMenuItem(VanChartAttrHelper.X_AXIS_PREFIX); @@ -88,28 +89,8 @@ public class VanChartAxisButtonPane extends BasicBeanPane { return; } buttonPane.removeAll(); - buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.Y_AXIS)); - - JPanel pane = null; - int size_X = indexList_X.size(); - int size_Y = indexList_Y.size(); - for (int i = 0; i < size_X; i++) { - if (i % COL_COUNT == 0) { - pane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); - buttonPane.add(pane); - } - - pane.add(indexList_X.get(i)); - } - for (int i = 0; i < size_Y; i++) { - if ((i + size_X) % COL_COUNT == 0) { - pane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); - buttonPane.add(pane); - } - if (pane != null) { - pane.add(indexList_Y.get(i)); - } - } + buttonPane.add(FineLayoutBuilder.createCommonTableLayout(COL_COUNT, 10, 10, indexList_X)); + buttonPane.add(FineLayoutBuilder.createCommonTableLayout(COL_COUNT, 10, 10, indexList_Y)); if (popupMenu != null) { popupMenu.setVisible(false); diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/gauge/VanChartGaugeDetailAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/gauge/VanChartGaugeDetailAxisPane.java index 7817b75f58..8e4af07c60 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/gauge/VanChartGaugeDetailAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/gauge/VanChartGaugeDetailAxisPane.java @@ -1,11 +1,12 @@ package com.fr.van.chart.designer.style.axis.gauge; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; import com.fr.chart.base.TextAttr; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.PaneTitleConstants; import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPaneWithAuto; @@ -17,12 +18,10 @@ import com.fr.plugin.chart.attr.axis.VanChartGaugeAxis; import com.fr.plugin.chart.gauge.VanChartGaugePlot; import com.fr.plugin.chart.type.FontAutoType; import com.fr.plugin.chart.type.GaugeStyle; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.style.VanChartStylePane; import com.fr.van.chart.designer.style.axis.VanChartValueAxisPane; import com.fr.van.chart.designer.style.axis.component.VanChartMinMaxValuePane; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; @@ -49,20 +48,16 @@ public class VanChartGaugeDetailAxisPane extends VanChartValueAxisPane { if (gaugeStyle == null) { gaugeStyle = GaugeStyle.POINTER; } - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f, p}; - double[] rowSize = {p, p, p, p, p, p, p, p}; - return TableLayoutHelper.createTableLayoutPane(getPanelComponents(p, f, columnSize), rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(0, getPanelComponents(), new double[]{1}); } - private Component[][] getPanelComponents(double p, double f, double[] columnSize) { + private Component[][] getPanelComponents() { switch (gaugeStyle) { case THERMOMETER: return new Component[][]{ - new Component[]{createLabelPane(new double[]{p, p}, columnSize), null}, + new Component[]{createLabelPane(), null}, new Component[]{createValueDefinition(), null}, - new Component[]{createTickColorPane(new double[]{p, p, p}, new double[]{p, f}), null}, + new Component[]{createTickColorPane(), null}, new Component[]{createValueStylePane()}, }; case RING: @@ -75,21 +70,21 @@ public class VanChartGaugeDetailAxisPane extends VanChartValueAxisPane { }; default: return new Component[][]{ - new Component[]{createLabelPane(new double[]{p, p, p}, columnSize), null}, + new Component[]{createLabelPane(), null}, new Component[]{createValueDefinition(), null}, new Component[]{createValueStylePane()}, }; } } - protected JPanel createLabelPane(double[] row, double[] col) { + protected JPanel createLabelPane() { showLabel = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Use_Show"), Toolkit.i18nText("Fine-Design_Chart_Hidden")}); labelTextAttrPane = getChartTextAttrPane(); labelContentPane = new JPanel(new BorderLayout()); labelContentPane.add(labelTextAttrPane); - labelContentPane.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 0)); - JPanel panel = new JPanel(new BorderLayout(0, 6)); - panel.add(TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Axis_Label"), showLabel), BorderLayout.NORTH); + JPanel panel = new JPanel(new BorderLayout(0, FineUIScale.scale(10))); + panel.add(FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(Toolkit.i18nText("Fine-Design_Chart_Axis_Label")), showLabel), BorderLayout.NORTH); panel.add(labelContentPane, BorderLayout.CENTER); showLabel.addActionListener(new ActionListener() { @Override @@ -97,9 +92,7 @@ public class VanChartGaugeDetailAxisPane extends VanChartValueAxisPane { checkLabelPane(); } }); - JPanel jPanel = TableLayout4VanChartHelper.createExpandablePaneWithTitle(PaneTitleConstants.CHART_STYLE_LABEL_TITLE, panel); - panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 15)); - return jPanel; + return new UIExpandablePane(PaneTitleConstants.CHART_STYLE_LABEL_TITLE, panel, true); } protected ChartTextAttrPane getChartTextAttrPane() { @@ -149,20 +142,18 @@ public class VanChartGaugeDetailAxisPane extends VanChartValueAxisPane { minMaxValuePane = new VanChartMinMaxValuePane(); break; } - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Value_Definition"), minMaxValuePane); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Value_Definition"), minMaxValuePane, true); } - private JPanel createTickColorPane(double[] row, double[] col) { + private JPanel createTickColorPane() { mainTickColor = new ColorSelectBox(100); secTickColor = new ColorSelectBox(100); Component[][] components = new Component[][]{ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Main_Graduation_Line")), mainTickColor}, new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Second_Graduation_Line")), secTickColor}, }; - JPanel panel = TableLayoutHelper.createTableLayoutPane(components, row, col); - JPanel jPanel = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_TickColor"), panel); - panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 15)); - return jPanel; + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_TickColor"), panel, true); } private boolean isMulti(GaugeStyle style) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeCateOrPercentLabelDetailPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeCateOrPercentLabelDetailPane.java index d8c3217380..c6edc2eb5d 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeCateOrPercentLabelDetailPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeCateOrPercentLabelDetailPane.java @@ -1,8 +1,9 @@ package com.fr.van.chart.designer.style.label; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Plot; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.plugin.chart.type.GaugeStyle; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.label.LabelContentPaneWithCate; import com.fr.van.chart.designer.component.label.LabelContentPaneWithPercent; import com.fr.van.chart.designer.style.VanChartStylePane; @@ -64,6 +65,7 @@ public class VanChartGaugeCateOrPercentLabelDetailPane extends VanChartGaugeLabe } protected JPanel createTableLayoutPaneWithTitle(String title, Component component) { - return TableLayout4VanChartHelper.createTableLayoutPaneWithSmallTitle(title, component); + JPanel panel = FineLayoutBuilder.asBorderLayoutWrapped(component); + return new UIExpandablePane(title, panel, true); } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeLabelDetailPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeLabelDetailPane.java index 0f9e84729d..a5fd8ca284 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeLabelDetailPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeLabelDetailPane.java @@ -1,5 +1,6 @@ package com.fr.van.chart.designer.style.label; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.base.ChartConstants; import com.fr.chart.chartattr.Plot; import com.fr.chartx.TwoTuple; @@ -7,7 +8,6 @@ import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPaneWithAuto; import com.fr.plugin.chart.base.AttrLabelDetail; @@ -63,7 +63,7 @@ public class VanChartGaugeLabelDetailPane extends VanChartPlotLabelDetailPane { initStyleListener(); - return TableLayoutHelper.createTableLayoutPane(getLabelStyleComponents(plot), row, col); + return FineLayoutBuilder.compatibleTableLayout(10, getLabelStyleComponents(plot),new double[]{1.2, 3}); } protected void initStyleListener() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java index ead3978acd..dfc234f61d 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java @@ -26,7 +26,6 @@ import com.fr.van.chart.designer.component.background.VanChartBackgroundWithOutI import com.fr.van.chart.designer.component.border.VanChartBorderWithShapePane; import com.fr.van.chart.designer.style.VanChartStylePane; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.event.ChangeEvent; @@ -53,7 +52,6 @@ public class VanChartPlotLabelDetailPane extends BasicPane { private VanChartBorderWithShapePane borderPane; private VanChartBackgroundWithOutImagePane backgroundPane; - private JPanel tractionLinePane; private JPanel positionPane; private Integer[] oldPositionValues; @@ -245,12 +243,11 @@ public class VanChartPlotLabelDetailPane extends BasicPane { if (plot.isSupportLeadLine()) { tractionLine = new UIToggleButton(Toolkit.i18nText("Fine-Design_Chart_Show_Guideline")); - tractionLinePane = TableLayout4VanChartHelper.createGapTableLayoutPane("", tractionLine); - tractionLinePane.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0)); - panel.add(tractionLinePane, BorderLayout.SOUTH); + panel.add(tractionLine, BorderLayout.SOUTH); initPositionListener(); } else if (PlotFactory.plotAutoAdjustLabelPosition(plot)) { - panel.add(TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Auto_Adjust"), autoAdjust), BorderLayout.SOUTH); + panel.add(FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(Toolkit.i18nText("Fine-Design_Chart_Auto_Adjust")), autoAdjust), BorderLayout.SOUTH); } return getLabelLayoutPane(panel, Toolkit.i18nText("Fine-Design_Form_Attr_Layout")); @@ -369,7 +366,7 @@ public class VanChartPlotLabelDetailPane extends BasicPane { } private void checkPositionEnabled() { - tractionLinePane.setVisible(position.getSelectedItem() != null && position.getSelectedItem() == Constants.OUTSIDE); + tractionLine.setVisible(position.getSelectedItem() != null && position.getSelectedItem() == Constants.OUTSIDE); } protected void checkPane() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java index 9a2da2285a..7098b685e9 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java @@ -106,7 +106,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP scrollPane.setViewportView(getContentInPlotType()); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); } - return column(10, + return column(0, cell(getColorPane()), cell(getContentInPlotType()) ).getComponent(); } @@ -159,7 +159,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP //线 protected JPanel createLineTypePane() { lineTypePane = getLineTypePane(); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Line"), lineTypePane); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Line"), lineTypePane, true); } protected VanChartLineTypePane getLineTypePane() { @@ -175,7 +175,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP //填充颜色 protected JPanel createAreaFillColorPane() { areaSeriesFillColorPane = new VanChartAreaSeriesFillColorPane(); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Area"), areaSeriesFillColorPane); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Area"), areaSeriesFillColorPane, true); } //边框(默认没有圆角) @@ -271,13 +271,14 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP //不透明度 protected JPanel createAlphaPane() { transparent = new UINumberDragPaneWithPercent(0, 100); - return TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Report_Alpha"), transparent); + return FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(Toolkit.i18nText("Fine-Design_Report_Alpha")), transparent); } //堆积和坐标轴设置(自定义柱形图等用到) protected JPanel createStackedAndAxisPane() { stackAndAxisEditPane = new VanChartStackedAndAxisListControlPane(); - stackAndAxisEditExpandablePane = new UIExpandablePane(stackAndAxisEditPane.getPaneTitle(), stackAndAxisEditPane); + stackAndAxisEditExpandablePane = new UIExpandablePane(stackAndAxisEditPane.getPaneTitle(), stackAndAxisEditPane, true); return stackAndAxisEditExpandablePane; } diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartImageMarkerWithoutWidthAndHeightPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartImageMarkerWithoutWidthAndHeightPane.java index 30b1d4e9b5..af045f93b0 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartImageMarkerWithoutWidthAndHeightPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartImageMarkerWithoutWidthAndHeightPane.java @@ -4,7 +4,11 @@ import com.fr.design.mainframe.backgroundpane.ImageBackgroundQuickPane; import com.fr.van.chart.designer.component.marker.VanChartImageMarkerPane; import javax.swing.JPanel; -import java.awt.BorderLayout; + +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; /** * Created by hufan on 2017/1/13. @@ -13,8 +17,10 @@ public class VanChartImageMarkerWithoutWidthAndHeightPane extends VanChartImageM @Override protected JPanel createContentPane(ImageBackgroundQuickPane imageBackgroundPane, JPanel sizePanel) { - JPanel panel = new JPanel(new BorderLayout()); - panel.add(imageBackgroundPane, BorderLayout.CENTER); - return panel; + return row( + flex(1.2), column(10, + cell(imageBackgroundPane) + ).weight(3) + ).getComponent(); } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/line/VanChartLineSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/line/VanChartLineSeriesPane.java index 5b0999ca3f..4e5cd9c954 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/line/VanChartLineSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/line/VanChartLineSeriesPane.java @@ -1,13 +1,12 @@ package com.fr.van.chart.line; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Plot; import com.fr.chart.chartglyph.Marker; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.plugin.chart.marker.type.MarkerType; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.VanChartBeautyPane; import com.fr.van.chart.designer.component.VanChartMarkerPane; import com.fr.van.chart.designer.component.marker.VanChartCommonMarkerPane; @@ -27,10 +26,6 @@ public class VanChartLineSeriesPane extends VanChartAbstractPlotSeriesPane { } protected JPanel getContentInPlotType() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] row = {p, p, p, p, p, p, p, p}; - double[] col = {f}; Component[][] components = new Component[][]{ new Component[]{createLineTypePane()}, @@ -41,7 +36,7 @@ public class VanChartLineSeriesPane extends VanChartAbstractPlotSeriesPane { new Component[]{createTrendLinePane()}, }; - contentPane = TableLayoutHelper.createTableLayoutPane(components, row, col); + contentPane = FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1}); return contentPane; } @@ -62,6 +57,6 @@ public class VanChartLineSeriesPane extends VanChartAbstractPlotSeriesPane { } }; - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Marker"), markerPane); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Marker"), markerPane, true); } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/report/AreaPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/report/AreaPane.java index d60c169dfc..1c80a87ee4 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/report/AreaPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/report/AreaPane.java @@ -1,11 +1,10 @@ package com.fr.van.chart.map.designer.data.component.report; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.ChartCollection; import com.fr.design.formula.DefaultTinyFormulaPane; import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.ilable.BoldFontTextLabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; import com.fr.van.chart.map.designer.data.component.LongitudeLatitudeAndArea; @@ -27,12 +26,8 @@ public class AreaPane extends AbstractReportDataContentPane { protected JPanel createContentPane() { areaName = new DefaultTinyFormulaPane(); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f, COMPONENT_WIDTH}; - double[] rowSize = {p}; Component[][] components = getComponent(); - return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1.2, 3}); } protected Component[][] getComponent() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/report/LongLatAreaPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/report/LongLatAreaPane.java index 8a69f0af31..f1e1dd54c1 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/report/LongLatAreaPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/report/LongLatAreaPane.java @@ -1,11 +1,10 @@ package com.fr.van.chart.map.designer.data.component.report; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.ChartCollection; import com.fr.design.formula.DefaultTinyFormulaPane; import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.ilable.BoldFontTextLabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.van.chart.map.designer.data.component.LongitudeLatitudeAndArea; import javax.swing.JPanel; @@ -30,12 +29,8 @@ public class LongLatAreaPane extends AreaPane { areaName = new DefaultTinyFormulaPane(); longitude = new DefaultTinyFormulaPane(); latitude = new DefaultTinyFormulaPane(); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f, COMPONENT_WIDTH}; - double[] rowSize = {p, p, p}; Component[][] components = getComponent(); - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 12, 6); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } protected Component[][] getComponent() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/table/AreaPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/table/AreaPane.java index d7934dc294..9355ecfb49 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/table/AreaPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/table/AreaPane.java @@ -1,10 +1,9 @@ package com.fr.van.chart.map.designer.data.component.table; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.ChartCollection; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.BoldFontTextLabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; import com.fr.van.chart.map.designer.data.component.LongitudeLatitudeAndArea; import com.fr.van.chart.map.designer.data.contentpane.table.VanPointMapPlotTableDataContentPane; @@ -42,12 +41,8 @@ public class AreaPane extends AbstractTableDataContentPane { protected JPanel createAreaNamePane() { initAreaNameCom(); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f, COMPONENT_WIDTH}; - double[] rowSize = {p}; Component[][] components = getComponent(); - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 12, 6); + return FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1.2, 3}); } protected Component[][] getComponent() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/table/LineMapAreaPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/table/LineMapAreaPane.java index 200ae1e513..a7d7399bd6 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/table/LineMapAreaPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/table/LineMapAreaPane.java @@ -1,5 +1,6 @@ package com.fr.van.chart.map.designer.data.component.table; +import com.fine.theme.utils.FineUIScale; import com.fr.design.gui.ilable.BoldFontTextLabel; import com.fr.plugin.chart.map.data.VanMapTableDefinitionProvider; import com.fr.van.chart.map.designer.data.component.LongitudeLatitudeAndArea; @@ -15,7 +16,6 @@ import java.util.List; * Created by hufan on 2016/12/21. */ public class LineMapAreaPane extends PointMapAreaPane { - private static final int V_GAP = 10; protected AreaPane endAreaPane; public LineMapAreaPane(VanPointMapPlotTableDataContentPane.LongLatAreaTableComboPane parentPane) { @@ -26,7 +26,7 @@ public class LineMapAreaPane extends PointMapAreaPane { initAreaPane(parentPane); initEndAreaPane(parentPane); - JPanel content = new JPanel(new BorderLayout(0, V_GAP)); + JPanel content = new JPanel(new BorderLayout(0, FineUIScale.scale(10))); content.add(areaPane, BorderLayout.NORTH); content.add(endAreaPane, BorderLayout.CENTER); return content; diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/table/LongLatAreaPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/table/LongLatAreaPane.java index b3e3dbd114..8f55a16054 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/table/LongLatAreaPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/component/table/LongLatAreaPane.java @@ -1,9 +1,8 @@ package com.fr.van.chart.map.designer.data.component.table; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.BoldFontTextLabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.van.chart.map.designer.data.component.LongitudeLatitudeAndArea; import com.fr.van.chart.map.designer.data.contentpane.table.VanPointMapPlotTableDataContentPane; @@ -30,13 +29,9 @@ public class LongLatAreaPane extends AreaPane { initLongitudeCom(); initLatitudeCom(); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f, COMPONENT_WIDTH}; - double[] rowSize = {p, p, p}; Component[][] components = getComponent(); - return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 12, 6); + return FineLayoutBuilder.compatibleTableLayout(10, components,new double[]{1.2, 3}); } protected Component[][] getComponent() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/report/VanAreaMapPlotReportDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/report/VanAreaMapPlotReportDataContentPane.java index 17eb27907d..a16122779b 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/report/VanAreaMapPlotReportDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/report/VanAreaMapPlotReportDataContentPane.java @@ -10,12 +10,14 @@ import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; import com.fr.plugin.chart.map.data.VanMapReportDefinition; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Dimension; import java.util.List; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + /** * Created by Mitisky on 16/5/16. */ @@ -26,7 +28,6 @@ public class VanAreaMapPlotReportDataContentPane extends AbstractReportDataConte initEveryPane(); initAreaName(); JPanel panel = getContent(); - panel.setBorder(BorderFactory.createEmptyBorder(0, 24, 0, 15)); this.add(panel, "0,0,2,0"); } @@ -34,15 +35,12 @@ public class VanAreaMapPlotReportDataContentPane extends AbstractReportDataConte areaName = new DefaultTinyFormulaPane() { @Override protected void initLayout() { - this.setLayout(new BorderLayout(4, 0)); + this.setLayout(new BorderLayout()); UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Area_Name")); - label.setPreferredSize(new Dimension(75, 20)); - this.add(label, BorderLayout.WEST); - - formulaTextField.setPreferredSize(new Dimension(100, 20)); - this.add(formulaTextField, BorderLayout.CENTER); - this.add(formulaTextFieldButton, BorderLayout.EAST); + this.add(row(cell(label).weight(1.2), + cell(formulaTextField).weight(2.4), flex(0.1), cell(formulaTextFieldButton).weight(0.5) + ).getComponent()); } }; } diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/report/VanPointMapPlotReportDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/report/VanPointMapPlotReportDataContentPane.java index 00e4d67182..05141e98f9 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/report/VanPointMapPlotReportDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/report/VanPointMapPlotReportDataContentPane.java @@ -1,23 +1,21 @@ package com.fr.van.chart.map.designer.data.contentpane.report; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.plugin.chart.map.data.VanMapReportDefinition; import com.fr.van.chart.map.designer.data.component.report.AbstractLongLatAreaPane; import com.fr.van.chart.map.designer.data.component.report.PointMapAreaPane; import com.fr.van.chart.map.designer.data.component.report.PointMapLongLatAreaPane; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; import java.awt.CardLayout; -import java.awt.Component; import java.awt.Dimension; /** @@ -33,8 +31,7 @@ public class VanPointMapPlotReportDataContentPane extends VanAreaMapPlotReportDa @Override protected JPanel getContent() { longLatReportFormulaPane = new LongLatReportFormulaPane(); - JPanel content = new JPanel(new BorderLayout(0, 4)); - content.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 0)); + JPanel content = new JPanel(new BorderLayout(0, FineUIScale.scale(10))); content.add(longLatReportFormulaPane, BorderLayout.CENTER); return content; } @@ -55,9 +52,6 @@ public class VanPointMapPlotReportDataContentPane extends VanAreaMapPlotReportDa public class LongLatReportFormulaPane extends BasicBeanPane { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - private UIButtonGroup locationType; private JPanel centerPane; @@ -65,7 +59,7 @@ public class VanPointMapPlotReportDataContentPane extends VanAreaMapPlotReportDa private AbstractLongLatAreaPane longLatAreaPane; public LongLatReportFormulaPane() { - this.setLayout(new BorderLayout(0, 5)); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); centerPane = new JPanel(new CardLayout()) { @Override public Dimension getPreferredSize() { @@ -94,15 +88,9 @@ public class VanPointMapPlotReportDataContentPane extends VanAreaMapPlotReportDa locationType.setSelectedIndex(0); - double[] columnSize = {p, f}; - double[] rowSize = {p}; - - Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Geographic")), locationType}, - }; - - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 12, 6); - + JPanel panel = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Geographic")), locationType + ); this.add(panel, BorderLayout.NORTH); this.add(centerPane, BorderLayout.CENTER); diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanAreaMapPlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanAreaMapPlotTableDataContentPane.java index 284320cebc..2b9d7a9797 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanAreaMapPlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanAreaMapPlotTableDataContentPane.java @@ -1,25 +1,22 @@ package com.fr.van.chart.map.designer.data.contentpane.table; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.chartattr.ChartCollection; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.BoldFontTextLabel; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.plugin.chart.map.VanChartMapPlot; import com.fr.plugin.chart.map.data.MapMatchResult; import com.fr.plugin.chart.map.data.VanMapTableDefinitionProvider; import com.fr.van.chart.map.designer.data.component.SeriesTypeUseComboxPaneWithOutFilter; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.JSeparator; import java.util.List; import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; @@ -32,14 +29,12 @@ public class VanAreaMapPlotTableDataContentPane extends VanMapTableDataContentPa protected SeriesTypeUseComboxPaneWithOutFilter seriesTypeUseComboxPane; public VanAreaMapPlotTableDataContentPane(ChartDataPane parent) { - this.setLayout(new BorderLayout(0, 4)); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); initAreaNameCom(); JPanel areaNamePane = createAreaNamePane(); JSeparator jSeparator = new JSeparator(); - areaNamePane.setBorder(BorderFactory.createEmptyBorder(0, 24, 0, 15)); - jSeparator.setPreferredSize(new Dimension(246, 2)); this.add(areaNamePane, BorderLayout.NORTH); this.add(jSeparator, BorderLayout.CENTER); @@ -63,19 +58,8 @@ public class VanAreaMapPlotTableDataContentPane extends VanMapTableDataContentPa protected JPanel createAreaNamePane() { UILabel label = new BoldFontTextLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Area_Name")); - label.setPreferredSize(new Dimension(80, 20)); - areaNameCom.setPreferredSize(new Dimension(100, 20)); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, f}; - double[] rowSize = {p}; - - Component[][] components = new Component[][]{ - new Component[]{label, createAreaPanel(areaNameCom)}, - }; - - return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, label, createAreaPanel(areaNameCom)); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanMapTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanMapTableDataContentPane.java index 0006f5e22c..1259273588 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanMapTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanMapTableDataContentPane.java @@ -1,6 +1,6 @@ package com.fr.van.chart.map.designer.data.contentpane.table; -import com.fr.base.BaseUtils; +import com.fine.theme.icon.LazyIcon; import com.fr.base.Utils; import com.fr.chartx.TwoTuple; import com.fr.design.chartx.component.MapAreaMatchPane; @@ -17,13 +17,15 @@ import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.tree.DefaultMutableTreeNode; import java.util.Set; -import java.awt.BorderLayout; -import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; + /** * @author Bjorn * @version 10.0 @@ -55,13 +57,11 @@ public abstract class VanMapTableDataContentPane extends AbstractTableDataConten } public JPanel createAreaPanel(UIComboBox areaBox) { - JPanel areaPanel = new JPanel(new BorderLayout(4, 0)); - areaBox.setPreferredSize(new Dimension(70, 20)); - areaPanel.add(areaBox, BorderLayout.CENTER); - UIButton uiButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/config.png")); + UIButton uiButton = new UIButton(new LazyIcon("tool_config")); uiButton.addActionListener(createActionListener(areaBox)); - areaPanel.add(uiButton, BorderLayout.EAST); - return areaPanel; + return row( + cell(areaBox).weight(2.4), flex(0.1), cell(uiButton).weight(0.5) + ).getComponent(); } private ActionListener createActionListener(final UIComboBox areaBox){ diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanPointMapPlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanPointMapPlotTableDataContentPane.java index 39110caf12..2871566eba 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanPointMapPlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanPointMapPlotTableDataContentPane.java @@ -1,12 +1,12 @@ package com.fr.van.chart.map.designer.data.contentpane.table; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.BoldFontTextLabel; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.widget.FRWidgetFactory; import com.fr.plugin.chart.map.data.VanMapTableDefinitionProvider; @@ -15,7 +15,6 @@ import com.fr.van.chart.map.designer.data.component.table.AreaPane; import com.fr.van.chart.map.designer.data.component.table.PointMapAreaPane; import com.fr.van.chart.map.designer.data.component.table.PointMapLongLatAreaPane; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -29,8 +28,6 @@ import java.awt.Dimension; * Created by Mitisky on 16/5/17. */ public class VanPointMapPlotTableDataContentPane extends VanAreaMapPlotTableDataContentPane { - private static final int LEFT_GAP = 19; - private static final int V_GAP = 15; //改控件相当于面积图的区域名控件 private LongLatAreaTableComboPane longLatTableComboPane; @@ -43,10 +40,7 @@ public class VanPointMapPlotTableDataContentPane extends VanAreaMapPlotTableData } protected JPanel createAreaNamePane() { - JPanel panel = new JPanel(new BorderLayout()); - panel.setBorder(BorderFactory.createEmptyBorder(0, LEFT_GAP, V_GAP, 0)); - panel.add(longLatTableComboPane, BorderLayout.CENTER); - return panel; + return FineLayoutBuilder.asBorderLayoutWrapped(longLatTableComboPane); } @Override @@ -91,11 +85,7 @@ public class VanPointMapPlotTableDataContentPane extends VanAreaMapPlotTableData public LongLatAreaTableComboPane() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double labelWidth = 65; - - this.setLayout(new BorderLayout(0, 5)); + this.setLayout(new BorderLayout(0, FineUIScale.scale(10))); centerPane = new JPanel(new CardLayout()) { @Override public Dimension getPreferredSize() { @@ -124,15 +114,10 @@ public class VanPointMapPlotTableDataContentPane extends VanAreaMapPlotTableData centerPane.add(longLatAreaPane, "longLat"); locationType.setSelectedIndex(0); - - double[] columnSize = {labelWidth, f}; - double[] rowSize = {p}; UILabel label = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Chart_Geographic")); - Component[][] components = new Component[][]{ - new Component[]{label, locationType}, - }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 5, 6); + JPanel panel = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + label, locationType); this.add(panel, BorderLayout.NORTH); this.add(centerPane, BorderLayout.CENTER); diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java index ba8d24929d..e1b1fda584 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java @@ -1,5 +1,7 @@ package com.fr.van.chart.multilayer.data; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIScale; import com.fr.chart.base.ChartConstants; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartdata.TopDefinition; @@ -11,7 +13,6 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; @@ -21,9 +22,7 @@ import com.fr.plugin.chart.multilayer.data.MultiPieValueDefinition; import com.fr.stable.ArrayUtils; import com.fr.stable.AssistUtils; import com.fr.stable.StringUtils; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; -import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.JSeparator; import java.awt.BorderLayout; @@ -38,9 +37,6 @@ import java.util.List; * Created by Fangjie on 2016/6/15. */ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPane implements UIObserver { - private static final int HT = 20; - private static final int WD = 100; - private static final int LABEL_WIDTH = 72; private UISpinner levelNumEdit; private UITextField nameField; @@ -74,7 +70,6 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa levelNameList = new ArrayList(); for (int i = 0; i < levelNum; i++){ levelNameList.add(new UIComboBox()); - levelNameList.get(i).setPreferredSize(new Dimension(WD, HT)); levelNameList.get(i).addItem(Toolkit.i18nText("Fine-Design_Chart_Use_None")); } } @@ -86,47 +81,32 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa contentPane = new JPanel(); - contentPane.setLayout(new BorderLayout(0, 4)); + contentPane.setLayout(new BorderLayout(0, FineUIScale.scale(10))); contentPane.add(north, BorderLayout.NORTH); contentPane.add(center, BorderLayout.CENTER); } private JPanel createCenterPane() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize_center = {LABEL_WIDTH, COMPONENT_WIDTH}; - double[] rowSize_center = new double[levelNum + 3]; - initLevelNameList(); - for (int i = 0; i < levelNum + 3; i++){ - rowSize_center[i] = p; - } Component[][] components_center = new Component[levelNum + 3][]; - for (int i = 0; i < levelNum; i++){ components_center[i] = new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Level") + String.valueOf(i+1)), levelNameList.get(i)}; } value = new UIComboBox(); - value.setPreferredSize(new Dimension(WD, HT)); calculateCombox = new CalculateComboBox(); calculateCombox.reset(); - calculateCombox.setPreferredSize(new Dimension(WD, HT)); components_center[levelNum] = new Component[]{getJSeparator(), null}; components_center[levelNum+1] = new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Use_Value")), value}; components_center[levelNum+2] = new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Summary_Method")), calculateCombox}; - initCenterItemListener(); registerListener4Center(); - - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components_center,rowSize_center,columnSize_center); - panel.setBorder(BorderFactory.createEmptyBorder(0,10,0,0)); - return panel; + return FineLayoutBuilder.compatibleTableLayout(10, components_center, new double[]{1.2, 3}); } @@ -158,9 +138,6 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa } private JPanel createNorthPane() { - double p = TableLayout.PREFERRED; - double[] columnSize_north = {LABEL_WIDTH, COMPONENT_WIDTH}; - double[] rowSize_north = {p, p, p}; levelNumEdit = new UISpinner(1, 15, 1, levelNum){ @Override @@ -189,9 +166,7 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Level_Number")), levelNumEdit}, }; - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components_north, rowSize_north, columnSize_north); - panel.setBorder(BorderFactory.createEmptyBorder(0,10,0,0)); - return panel; + return FineLayoutBuilder.compatibleTableLayout(10, components_north, new double[]{1.2, 3}); } private void refreshCenterPane(){ diff --git a/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java b/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java index 9d2b1883ca..675e4eebf3 100644 --- a/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java +++ b/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java @@ -140,7 +140,7 @@ public class RichTextToolBar extends BasicPane { private void addToToolBar() { this.setLayout(new BorderLayout()); this.add(row(10, - cell(fontNameComboBox).weight(0.3),cell(fontSizeComboBox).weight(0.1), cell(toolbar).weight(0.6) + cell(fontNameComboBox).weight(0.3),cell(fontSizeComboBox).weight(0.15), cell(toolbar).weight(0.6) ).getComponent()); } From 649c55cc320f5446fa1a2b2641946b093dfc5668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Mon, 29 Jul 2024 13:37:02 +0800 Subject: [PATCH 189/302] =?UTF-8?q?REPORT-113994=20=E3=80=90NewUI=E3=80=91?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E6=A0=B7=E5=BC=8F=E7=BF=BB=E6=96=B0?= =?UTF-8?q?-=E5=90=AF=E5=8A=A8=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/com/fr/design/images/splash.png | Bin 305454 -> 258794 bytes .../com/fr/design/images/splash@2x.png | Bin 972195 -> 926155 bytes .../com/fr/design/images/splash@2x_en.png | Bin 972195 -> 926155 bytes .../com/fr/design/images/splash@2x_zh.png | Bin 969193 -> 925059 bytes .../com/fr/design/images/splash@2x_zh_TW.png | Bin 577377 -> 925293 bytes .../com/fr/design/images/splash_en.png | Bin 305454 -> 258794 bytes .../com/fr/design/images/splash_zh.png | Bin 304176 -> 258517 bytes .../com/fr/design/images/splash_zh_TW.png | Bin 199581 -> 258195 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/designer-realize/src/main/resources/com/fr/design/images/splash.png b/designer-realize/src/main/resources/com/fr/design/images/splash.png index 9e3cac4197ee90809faff5da3a7f45dd30a9167e..d6b5123e906196b3d56030bb768e76d6f51af0c6 100644 GIT binary patch literal 258794 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

te?P%lh2_!d)mn5E?R#fuHAGMcJJAXlgCe* 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

*{%GPVRH+6`;SLOUl!5XYDR&{VrqB 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 XLpw354$)b?00000NkvXXu0mjfT`g$d literal 305454 zcmV)RK(oJzP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR93fS>~a1ONa40RR92XaE2J0G^^SPXGWw07*naRCodGeFvOY#nt}vmhB5$ z*kx%;U3v!*MFlG=YK+E`FGlQLqp_E$s4K>9$$%2$7{_=gFdEFuCP&kUin ze}SIEGmUv*^UZ(lGX!Q$1488Y*_R_$T!6qQ?*c6m#Ew1zfj3@2?1F27T{{q1wg_l! z01CExFa>x|_zp0Ct;~NcUMk3(|4>WmvA+eyqER4m6i~PnNbUmE6K`utF3WdOzPLxA zdaz*sNnie#Whj679Yr%n*m?0w79b!7DXsn*8eINJlf5Gpf|%YG*52^V-=?hZG=9Xf zKn5#6F^Nn|0pb&Y?qh+J)K;9nsr-O&7qvcZMmIxzT)k)8_^{tWID(a5%pwn-eFPZ4 zuf1dT2d?l)1OYNoPN~$wgCD->TF*1TS8%Hn(_@4saIP0uCDAcJ`7HncNBqxTcmyw< z`3p*abT@nl*nVT_8LY^9GOZ5+`RjoMGSEtE1WHx0o{nee-uT5Ru;Rm*n}5Sb)PgU6 zd&}R%-}S=GB(O%5sEbAjNR$IxF29|xA@t16L~%(q>KmGonVy2W`bG+x5CWPSBS=n; zLuFMxl9S@mt#by}Z7Q<-#;m>IyJo}~_n+|hEdSf$U-;j3xc!xTv9YLyf6bV8+pma% z(}SUK2rcQ9J~A-9V>?tCEqrfojxsEY2z53(-(u5~zrn1E9CYiJh0h*&4lQ*RCgH|JN>E_! zLd1q0gl;|3P*&A~=3oMX(|?C(MG5gBZ2{_WI??w{_;o+*D728a5OsbqJ`w1-4_d0q z5v?k1LyyaEBGlTZePSsQOlifas2@UnQbsyvzp>mZBQYt2Rhzbi&;YDTBdiC8c{Of?aQ1lDn^U3&y7$iznK zJkR;~e|7gg%$v3c{$h+VPigm}FA%00A+wY}J{&<@QUr-{0pxFG3yZ`MO3OwfTUk@5 zAqW($YR$iw1k&qE9G|X`wi5XL$A{wMjYz9A64U$K>rhi$ivfAbY_fj@;@Y8OUN@w5 z>WpAc7sRNnc1z$l;}^$Xc+h^szmYy4MqEk~Dyw6tD379{u^GL4QLi>f5FvBbtf{YD zc^-d);<)QRJdrkq?sS)Q+CMMe5g#G4!pBKc2t!9_p?FsrK3|d#v`fRdUz~-65b+`_ zLLECH)_n*fqffI&(rdslR=PT*0CM~0F+~tZ-FGL@r4LSi{Z1qwe7wcy4(N%56iO%K zgY0;eKI-ZB=DH^Kp;6SU7K3)Gj^v9oQDmKE&qI(9~&pa4~6JB*Q{ z<9~j44LVIY)H=SN`;S1;+8XO@(noTT-DMC;7S0l(>}`_}yEO%n$6PQcdf9RF@#gJ5%w*kt(wq25<o)di86E%!E4ZXh^cL`I;|xpt)oRk}~?Dp5x@$&I$w%)1K0#PmeX^=-KU_XvIqmO{D9-Th+|HJMh+2_z4_=K^hr;~Voem}cy#^QI@WqlDgK$)9*%i89&F4z z{Oq%_=66S9)1$}O5KQq&$w4F@aUO#G4kDSm=^uOCPuNszvEzk%(Z8`Pn{*?pDqTkv zU=wzd%Jj?=2=}?xB#@jEubkA`yYoo$Y$ov!#VfOVboY?YA?zey@I!H7s+ShTCnurv zndhVE^RLiYTZQ=C5lC-YgyQsl(K34$dJXA@{DrH@H7fJ^bsTPlG5N)Zsm(Y!p^|T) z#LfBLFHyQ;o)y#f=doo=anXp8twHg}ylg|2D47|RMl#%9I1>wm^KNhwC>j~e8784g zOylUIi>X&+90#n-$#*h1rrz154cG*dabA9>t<|-1^ zg1IZ3kW?QKpv$igC>E<~P2Xj|>#?hh3~m$emlu~9k0wqFeSi1MuizZJ*$CS8+T)0X z^Kj_op_uv15`=fYg;>HcT=eoCsAUHrsclJ#vB{EoEdeC(DTUwEgzboW7_1D5bA0oh~KtcT%;Uu;M{wZV=Sp_p8I?&ej4_O zK5LPxP^RWMkby?KYra8G@**1_W;FY8xj-ty{jTxe9WMgGR0R8+V_|LcTXQ6{fB)Pk ztb_|tu;6Z%EAiW{9{lvp9N8N(-tyPhhaSSNCmy82ZbT%$zY4}&&M1Oqn~~XPJkI>% z9r$>TR7?PW`Q>yiN1|6_C7Ri!N~w~f$)9;XjOovwdMaW$T}`SYHLI!SDAjAW zTV+Y=;>J%#WGs7UzW48bh&?5FCV}F#v9nc5+B1L}Z{w4=^wt-xCM@1U`O_+~VvO@^ z_`|w)a2Ry*q!Ikp3JslVTh-;kZ<}8dc;cUK!A%cei#``$g5qtv41OS-iVGjVl+2q# zX^G;DMYwoO0GI8@c0xvuJNpQX=^n&aZ_UT2o4B-=m~PCI zuxxz)b!2CkI_V@+W4ksZf7M!wPZ0ax`(sWI!zj7&RXj8OBs@Lir?_jy6*&0lOw+Z6q9*fmdcRp%yUwpL%`=9je9`Mx!)r^n7Xd>Qv>?0iZ z;58`PR>#hw4n@;HLb%G!C`R3K1)E$1`wmFwY#@Re+d?=pFNW#>^)&11_Hl`-GVElH zXef01yBfyCFlkgAUY=QpNPs$)DmAXKz&e(yt(z%rQX9aJt{8*2e>>m&|NHijEPpK- zC3u&gwbFPH;^J#y$uwZ}Bt$=b-SoWjwnRCru@=K*as6-GqZgKNnTypEC<|jpBIFR$ z^u_vUB9O%Fe2+CUj1culorp*UpXn~hYyN>CrCC6kL@9mvdY4N~PQ;L_&qv`_GLK9Q zE_e+MwT%dr&BKV_y^KXS-i+Z>Zlx5)Fm`Yj-hN^Yk`L^GvALYqafF~Hr>T?LgF=Yy z#Bnkx0&A!EXLXI2ZQoD#{wGR)kiW~7QTfLr8d-m7#dc;j`&zlt}V_)Ql~*&TyEzWXjLL6nPiZ+ zVl%z0S0noSjPKGT3mKirba9sDCS-=O^aFB${$V#=!b;+z!Q%Ni_u6Ce(6nMoUKGRo zq+!l0Yq0N+`cWEUsA;A|l7qiJB?CK2Y%QDZul}g@Jg#(6BAX*@QA;_nCes3J)A3Z@ zcRzKAt3XZz&!xm^`79_l5{E{LcXo0N<+G=eell<0eGpx+kn%&AwW|?K>WbV$CS%*{ zmy&@4?jVk0lrIwocaNX%E57&8Tx|YoJB~VYJi3k@O&!&O_g-0y{-^AZxtHB%OpNUM z1cRr(Y>eD^?_)UhuFJ8mfUSd!8`7ga=B%v7zP*!C(Zpd1=eFA6y#JhzSVP9CPOg1~ zb6=|B*jJx%))2$grw=k%SqTB0c|JP}N^pEUC6FCVa~)?sT&0ODnq~usj+bABqWh+@ zEY=7|B+;fSGB}8|ZUNMmCZeT*EhTQiuO)IUfyIf3Dph{H=w0r6jPEdVATGH1cq_W5 zvI_S-%&pPJ5={8{Xw16%Rpjk+1U7&C2Xs4T6q5Rmwx*oDW(f-WjNkwoIB-xB3QGc* zzp@G=dnKd1uGzM9&N;F@hV@IqDlVW%1w~1No;{KRc;pWSnD<#FB`QYdQSZ%rlS^X9 zBKGAcrsw)xb2+v=^)Q-?x#LJCL~6HELOG%!TMm5mRun$-8p>-UC|$jlJH6S5PZ5up zLO+gK7N8N1#yVmq-FF-x>(K}2JasYkRtJ=plCUoEc<703X#V^I9C_o9aPPQO%xLO_ z^&fqJXyr#-CEg!9-hBgUV@9DSlk0#)>Er{t;N8zlP|R`TxB>04cpB%-P08q%m54dZ z>+r_Ra-4NoIx^Wz)7fk@_?&#%I&9fek5q08L}tH?K#w74;XXHtHrv`@Q}J?CE!l(^ zXF@Hdi&+ZiQpxQx0{7+!q2ho?W=%v&P;4K zPc#RR)V()q<5CdZvUy+HK z2k(yo0~0ZCE_c1=%|RNMn8I;8kvd^A%8DBiSGEylH5}-x)|h_6`TJt-FCH@dqBU#r zlh>X=DVe+|)#DT(J&axiYN<1Aj@rmKDa$aMUcGL){j^5qF-C z>DNDIOw_!;rF0$lslsTNS&!PX6rITW@=4UDd=o^#dl@& zy*L%wk+YOFQ*6gzv3|LT3U^cV+W&MQV=E0Y{E0YMAQ3kBIkhp zQBYB5n@-6rS2L0F4?aYE&pxPH{3)6WI5y?LJO6{1k-vb=mo8GYgk83qd5ydOCTx0h z0ht#?k6xWnMOelM!ctcuMh6ozIf&*8QT&j5O#&V34A!1MVkC3@-SHi`!7ZY>f02@s zfErHTodl|~g4l0-FD#h1jm_EVUNvili>W7^JQy8&WTSj*5gH;vy!G}b;^fu3VDeq* zva^%8-I0K*rZm%Un--Ah0mH4M>Cseyje+(Wd9asGz=9X&kZ_J&8Iao}f^7mxx?1u- z;Eb~?7i@zVee*?FJVlEpqE_X(GQ&x!$jIu@qS~nGMk2 z8K2HEoiWctfG}#wJV~Hnrgfmb3f~vZ+lr2vT&8je@af8nuPMa9QQeTtX5OK1XS_Xw z>u`yk_P|GY>0hthRKzvMBP-B=FP2s!o!gr=ue@Xo+{gjE2H%;Hddy!}#|}4&b00q4 zXx)|{;>_x4ZUd}B?%`J=Q1zwhzQt2Cdm`kNTns*V0y+#k06`ihMY%m%TFQwwD=j58 znNpX|zcj+)dO*U^`#l|Kq=+0kjcg=&4sWLe|3-W&XCkaclR8NgnWWw+iKZU)TsD%# z5I2i=&DSlYS`VhO7=PMzlkn-X5_IJf{^0(}c=6>OsF?LGf>m5C33Wqo^mqqf=~eg4 zbM5t`QCHi7;M)>0B!I_8n})C;y9?_&lHX zH=oW#&OwKxF24}ki-30DLR=XlEJ^5zlZRo)l7;A$my5*gbUgkDm#aGEVf^(+VB5#5 z5M93>(Jwih7&w;Zb_IxTUC5yaO*WFUF!K5{u$^PUKs@!c=;UAdrs7t5BX#u%)Ji9Q zJN=<>r%6*Bf5j{jZ}P_{-<6%uuZ`CRcwC%Gnq{)|UVdW~B}5R&AW4fMNhT|;n77ZE zToe>ir+COqnkrVWM?!8_v```r7}g$}KjYlAl4HZtwFu_2Gm3ialN>^vdj4q4TV94x zVh*-%ufw$W3emFQeGc|IVCy>z&@$iv#Miuqj6SEJ;fwj)KdGnU?|`wtJ{{XbTmFP$4~ajmPU33BGGuSTRU(b( z18l0Yr4#Y4InwVjC#78?YPG7&IBT|ExS!53mB^8?Vp^-;nk37lUI`_YqA_PQVxP@J zT*-TgC1xWw=rl{JJQ|Y?J~|KOrJMt=`UHjbR3GzS22#gz--Jv~jz_fLIJ069moiJI zp?cAK2zLIlHOIE}#WU@3XH7t1WfX-KEm-sFdx%d=rA}-hvl@}mt^=C6J?cC0C!83E z2p5BmKMBJhW|(;DXtB_??_z`(&#e#=LERA~%R}fV@xfV$mUsi5pI1V}bLlhdVOYY4d zVMt*Rp}UbYWKALz=HjiXL5iPYt$)hybVO8KQl3`HGSG%dm`qNLmsy#bvX@8Hh-rjn ze`2^n(@y}2iAt|`^LjtdufX90Gf=Xk5Vg}E#Tr^2pzs}pYiA?Y=LAH%9Ei9bMG*7k z+S1p4_yC*7cAT(ZD@@IY^%v`!i&&R#3>S|46P;dux9Q}CwTTZTj(F50P)O;&&tc{D z36cb=*>DIiaD=aBEa{=2z?>d);Z8CcPHD>QOdGwT>el$yI3b_{_$Mh916!q47%Sc+ z+`(r6aZw)qxp?Q7$CYnwh^-@G1vlN5gi&qrw~P#n>(>Waneo`NohvWfxp2X>qOZf4 zfhb+P#xiy2kc_f24#Wk=i|;d{Cn`95DqXjoJvjGXxWr@e2_qgOYlNU{#x9d(vjoh~ zSX(|N{vwQg3{wY)sgfFoDcphKHQS39aHC}j#X&x+< zV@zZi-^Fy-GPvQh@^i%+&V~=)ve?`2+Er_VWEl+k@tyYV&xL`td(uahVEKfjmr}ft zlRwlU4cb8r)^b+TCf@DJDUlK2NrUCmyZbYydIX9{En*rW21<+&Vf-^@dGGX_q>4zv z^P0Hc-JjwWEV2})X8`?&cC@4>@y5IWXEJUdR`CXlzb-xZaaS!S^Ef;a9K+X3!}pR> z4n_FX=2F}ET}wB3X;l&I7+W}8p?L^xK!^x8nG|TScGI80)%jRvmceO_=VlxgjU&{< z%pTTBI7|h~7~vyq=?z&&xcS+fwc(<7*PM69i5tX4KrG(zOT;P-<5UhApFkbi$kmdy zD`dFCw2Zg&AB0=WrlYj>-||ssty#)2xv$5+efvaik2bgzgfGHGS48G%v~XZ!cI7C) z$};?wjBjdbd(mH4UXO4&2i0xMW18I-s-lOE;9O=yR8Zts>3kXwqbL}?ixU}Pg#OjHR9SE+*J{%B&xDPKvs+kXjf-H1S)x42*_ zna+S(CgzeKv}omU#w**8w`3fe1SCxXN?M51GMaptC2N>dOm>oNl9u1)6($aTEXvBz zJUGOOgNQNM#MTZQwxa6t8Y(Q!#GW1xj0?731^zc){4wQ1etJUYxGf%8Gu8{;f8)QI zKa^j!OHU&0DRwEtZV8j$B-Wn)jTb+B{`lQnYk;SK_K?7~8Gfko)=CUf{p{I-83n?fHnEb(uRQ()L}zgVoSn-=N!l7ssvPi z!g=raR6Yk3RwblggzB9SS^@-~)zY>VYrnxKe#;T3H(KXWFz1+C?_Vvm{nX%-_XBmU8hq zh$JoRkg1wz=k@G}&zI(7=%6k(miltl4i5=-Mtrj|7~kCBSfooT<^DR}>d}^d_KZLN z;d}A&g*W4hKf1$)3*VcK;#u6&5EPBILR_!&4jbArR|XZ%-$sUJiX@gum7`*rILKLq ztyJ$-etbJI8yIlO&9rC;VDpo|ZiO%A?TvpR*!>a}?VMraUTv}@NV{W2b*ulM86VVA z8JD)B<1e9Pm1FXWL$RT-84K=x9H?`lzYbOJcv@2|mmD~q z#Z>gWPQ|_dtKx(H3NRUwanjXj{NN!Z4jzeh`Q_OB)<^6lI4h{-9M;Fb#mznfYZf7{ zd?`j{rJx|cl<~B{0y{vqDy6mbW@Z1^^yMCM6moKSex#I^Uo_4Pa;72!(x%QM5y>6H z^S_HMzt11VvKGib%@^fN;ykfaVHWnUiI>#f|L#;g_Fg6W_Dsgc9<)o@wvDSn0q&o$ z!%(#se?9&!-@{SVnVW;*m%-R=;Yl zsR3h|EvT3xQY{DxJ|v@7L-aGu{1*1ljhE#4<-fkP1w}NFtS_&?nrHvSUA{PEcFjUU z_wESi=8=hi8~=SzJ)V2!G#&BNir#OaPs}Q-h=OMhQBmfflcTu@!>R0n61}zyREwOQD z(fsxg4pGwL<175*cxS>vH(!g%hw)5Z*MZh;E&T0WjsZ&WHT3Cxa1%F|bmTwC1&3}q zA*|h~1Lj;2(w2e8FUwBd913QPo8kvrS1-6iM73n-=-p$og?+d2CT-g3QYE&5-|k13 zA-jGB>e%$MdUWMM!aB5slMv+rnnddUrs@{deDV>uDYtXqIEr>O0cobao)JcTkAL_s zbU)|-Gj&_AlIFgwlSZB+$rw2fbwxXo7^2-EuP+ddZRsnVH-l;RqyB5+k&6J&$2IbN zasX8{}dhHP$ar)u-_|G%UGC{P(xS%S1*0a}O)Q>rWlBlyNw7q7p z99#50f(@?M_vxnu9x%n1w7;HOsX?^;lT^yNTH7;D>Hc=SYTF>#vn_1Bv#FM6qX#dz zDB4nv^&fMYKD7Z!l%7&bLrWFMovXe;;;>`T%qMnj)AHLavrAv)gGNXET$ z!G5IV+g<9(ucE$&Cz~jV9?>|e*A7hk)5pw6mBI-Ew1_ITLKBbR{y#%-@%!vdWUa89 zKa3TVc1w=$R~vUM{qEv}+}`{q_!BNa9{q2+4#WDSaE3#Zw9edKR0LI8zVB`~2Zy z!|R>U8Dw@A{^6LI2AztMP6+c)T<5zE+R^8RLG*KOx>nx)IpapV9LuiR`yh~Tad36Ez*E<7JQdF<-Q zpB#k3LV+RHoPst~>yV*4Z0Mhv6H~vMI?;+$y5T3EhE4T{p)QilPL=qxEIHws8LYs8 z!{hP(iX=46`XloC4aLUwD-6Ezfi$_BKOE{JfegIS7$~9zq)W#pZ29!J+^xTfOeo=L zr6&;1y9zBEIF+Fb_q{>Ip=JGV%pc0TjNN^EvCQ(zey)WF6nz)&dm~e;VqCmx+nu#- z%UBu{^vXcm(WjZo?@(Ibr*{hBjbFV=Olb_X?PUZh396grjN5jH@fFWCcl0KC(vR` z<2)UMXzn%A&~M(zJHrY#pi{>_D6OK6jx0l4E8VqPiI3RN{|X3TN0F6GS8gM zyz(w|@1FRE$kbNXCO^rt;85S|yl5)jHt|}kkY2G`^U79yU48|2KK6(a9?ovY8@Ij* zZ2JqsWt(WPHwI_C^g2?zjWY9H(V$C!&gvgVQGOW;>SHKj58c4syLwvBYbR;;Lb`C@s~98QMH4o2E^Q#_r}Of9`E|NU zF2G|}a_v)nz30JKI{sOOd6g!Ahc2D?2%_%Ar!nJ_2M{h^i*U+lT>Z+gaLBb6GfxaB z{`z>ldgUi*NQfeB`(`|`B7*d;nfU48unlo4Ly0I2C75m#1Jw`cNSK~FXsF(~jva?2 zFRo<0{jpsjIWL2Z4I%lK7cup@Nyr^T3kNdMt=3Q#A2it*Db&l0IUQ7M;;-*Dm+s4w$du=n za`3@oemp{z72-j|_NYwCFe%i@rbAE5WxSd@b!G7;1WPv&Uy@GSnRuFU)a6&>^vg!z znNLnZYHm8te~>nbJZKnY8tF~_lM5!$`qrmgL5wpA^!0$6k`nCq6OVcF2}rb@41It; z*5ta|369NV-5utStbdSjYSFUx4m7X(H8YUmmX7aq0iHE(3qQgY4wWG@5rrTBhhL$x zv}FE>pE~KBEYO7>aXD!^4JC9D7|bf5mT# zKTjkEb*PX%sjdNuc>_pCT#Cgz86=P(nZ_Q2;z#80Pw%*5O*6iK+Rd$2!rF zyt1SUJyUhAlE|qVAKm!wt`n@$98_*s!sv0Kr1X zz$nk-J@~@mEH8#++5~RlWjeRrvdKtRWraR}4blBhLUiGK#^iRFU5D!DxV=$UVMt1_ zeEuZHZ4m?SFqRn=ZGKuA)+Vg&>vt7D>8yj%`_Qo{Sh)!@Y@PPbIy5hT3`vC5VGFy-a}Vu^$3H4GeKw?fJIr}$8KQ&ouy3D4RC36oHN4-Q-O+}2>&Upux)`QB z%|+2F=GmH$d!9VdgQ&95;%~D4dwJJsgo$kNsR5s^M4QV-D#6I=FA`QrVb8J zxt~#9-h{_)eFHiB3_!Qxy|L!Gr%*#_i`H*L-nF+9JsK5NmfYNUoj!|gHHt2$pMrwtcv7E?Y$@a^f%JWNy!8xhd*c@veAHyx3F>Iw4jvb&p#%>6 zjmM!q*u|o$+l=>o^_+Oxn)n}#A9DSL=o~DH_F5EuHXYr2B=Zd2vH0bn zL|pclV&v`Lfk$6m2NtbZgg!StY7)8giKlSNL)T*Z7e(s)k=HR5Uw&1H{(U+aLrQo6 zQA3yiy|pJcacG*$!91Qh3l%&AyV%j@Q6``79Hap*LQFFK>ImbY6^$50UEa zth5l?cjn-{G=XY9!W)uunAb5RSVc>+_(69WPb7FIfNhxNz1rhDi|^K*v%eq)oOC$q zsqA$#WHDD+>SxVCuY<;+@4;Ph+$f$=W2v{@w;2_iHWD%3YkERYcSa$zCWNwy|I$oU|lob};0T11ZdAtVI#%WBeAy%a4AcVH8W?G^a zKWHj(6}pr!6EVH}A=Zvteg9BAZI8{AjYybbxrRslmv+E@yu&4ex=&`=%|spI7a-@f zsdmt?WdoP2Qgcuy(>B#E`{c-?yOB5PapceZBYyt+O}yi@5np{#iDBJR@zF9)jEUs& z>}cM6<#UwBvbnF(5fv59)?76&*15T=MRTb8czTMdLk$}ciR(pz8CO6Y61XkPYd?oy z`9D}X^?9c79rc5{V^eW_die0P<~_!-@2XSqi}Rm4Y-mR#v?InPa1m(Afl`>vjT&8| z6WKWf(O@2RSQ$nhbG&0T({WgiS~jzF8>(6JE}xweAcS_6A7jFeH*gr#fZ~D%lomFi znKw^P*rzvUF5FCMil7q*?b2~Nm9ByI(DY)=cz2aC>-c-l!JAh-VFm%s>!0Hdp<~eP zz*Dhf+D)834JVqyRn9TXwLl+t8r#Ra&3ZEMw@&1|w8YJv9>(O|u?Fk^9G}&J`BiI_ zGy>AV*+&1y2p4Vzkg=_j$@IscI1oAAG7;fjHRVMWcyg`!hM1KtNGjfeA%`7=xr^4BzU;!Qkhjm7ZPIi4183qd*Z%a)H2jowl~^Uo}*voak^$l!R(c{e6Tg}9<3OsvO(Ta!(q9Q;~x`hX6K0F zyM=jie@}cS%_=%{Agu&Vi4&Z(H0l#Ek^fYVy(`|zvk(hA?%eSR@u)#dOFdF}#Jo%Q z41}t0XkH7MJVSh6|ol9DrYFT;}=)3G|pa6{R0?DZXGX0uv{j1O^Lv#+V`%%IJZ}2F^k_wF&U<)v>?190l_? zqhJm@4bF1|`io0LA{TIZ^#b)J+r4@nk3X`I&@D;w%ZWcEf&cj8tl}9V!ujVU&|<$m zK84e`b~@SZ(uyI1FNUS@*q4eDED`N_48GEJ@0-IQBEc;47u4ALUGA`hv3f@(K7QgI zU;)=0DIsyoIV))5vY4k=RGEh#)foXwdv@N_H;KxH&%i2IRzDxS6_5`U8-6~g5pUzf!v@a`&(w^Z03x=()UF6> z1WBI7D?hoIGkzrY*(V9pKPp50+|LlLt}+{!V0$tzf%++tYjG(#n0U?zY}(R-O5Q}& zF}nwfcnwO?QcB#`0$##>DA%8oFyi2Jtp5FLt@!H}-)IT;Aey_>56@rdb+86Lyw*Y$E1 zt~kPyGYOQAVOk%qRS>;a!+Z`-t;RbKEZ|BrrHOOg(5~0G0>U#OshtqW9?IU4`iSd& z`P;as%QXG^_r*G%_$-<;6X9-SoV2c<$u-?_d^x)Ujl+(>0r#J0I1D)FP%>|VE4wXy zz58%=I}KGF4Rk!*#f#Q$U#wzt3 zJK|;Up7aQi_(TcPNlOQp6=LB`qr&-4%RL4u5MTRW&s9I#CVe1d31O7RY7c6Ux&JnXJXLA-dO$SG6XZ&b`m)tPR>Gj z^IF2=+^y9)`eYhXy1j&P1lOlG4;qG0Tg>uEdVG1grQVx<2g2poyB|*mKH@P@G9pRz z`KiQhoH1O?VmM274CA4|j!pI%LtamFZP3_X16B&4pJv*k%+ zkOyBFk*VA^=hLec;V5`ws(!nsqhd#4q^q`_VhLJ7;QyM)ek<90G9&gO$A-x6;YK?&^QSg*ss4>r>hxEWFv$xUj z7?zL{M~eW{#;(Gc?(hj6F@26R6jDA(y*WPPS1(}gNYm5pg+EI&mq3P9Rda=br6lmi z5NlCfG-#M`2oh(_bhIj^@(Vu_KX^<}RB-51&KXl}zONS@f5^bcj6eFZT9$0;z4h1m zRqNJW8iUkxQZm%!xcVqUbYFs`l0Zn57@}~6IlnbMah*xqaRyRDogMD)z%FkzR zpG<7qTxoDs32|h6`*tDh;sI*{bm87p{$P1AFKpcW?f45aampUm2isD+A#wIBD@z>G zEKL8*YV~XA4`!tCs?a!I4_}K=Eju(Xr*I7^-$J28uCa7?EaPW2iM{ zGD(a|AY-&IyPJtlCpzXkNwub@{Nj~>NCJI^Gu$Lrh=9}bCCa@fCm1T!5K$KTjShot0SxrvE6!NP zI_F|b3Y#;pEzyBPqsLF~c|3kt9=*q}UCv)QrB`B?;@j}Iq_m*WJqL)^T5itKh!Tfm z97x-fp-mCB7-C1^h}j|pVT%?mIJWQrHZNp!bb7@yj;07_F_n*mh|{|m!cb2iwDl{C zOXKiR+<)``^ZD17>;KODcNV@9B8ed%u5CHtGCgiWC~_HR((FGymBVng$p7a5p803m zf=!?G^tk8*KdF0i9JA%Jn-M$o zSS~|z2Cq?Zr``xW_^Z}Ra0yv0f|tTesVAMtw4H&+?{>xft@4$sYY$+@R=yBd!m%$O z2p-+v#NSJ0<^O>5+cb`I%2wy|zYYF@P9r@n$UuHDG>}BIj(D!|RdS1v?rZDMi}@ka z&-SQF)Sq6}JmpA+RW8Fdn>hOl3ytw;)s`FXx4*KN-?cFJ!*p7yc=dS%UVesGh;s*x zR`Wa^gV;U?Iv6~l&0QON4@`T5azsW`cw-c7@PMFSevDV$p;uokKX&pNK;J=@$KmGi zVF3U0uN8N_e>48d+m@bxd4BQvYw&L!a<}Dwzwy98@}&QvJU)6DR0lk&#U&#S{(Fw& zRj7Fwa^YltlxqZ#J)D=1^f12cLGRx|zcqrk%VjUkr!QrWsg7Z zsMHM6_NaE#+J=0iQ#=yAQC?k*p@;E}j$a^lj$h&!+!dQwv#RDF)OiVxK8Lacxr zjr?c4_M-n0{&g5UnAN-^1X8XrzQWE`r{Z-TF(J>gH*k%g(_G% z+Z4EXJ_0=0Z!L8^cOT?v80Hf5;}R2xBZ*r{FTe8zM(Kw9ZDlkX&961(4PWcJHHyhzs zQLgv6zGwN`G?fj7@n096@|?ZZ08hxMO2S>bU@b2-jq!R&ed#6%Md)|(M11)dUZE?p zA~pQkv;O{3`Um{%0+t;>PQg}o`R#0>Pv%)`AHL0% z^W)^#yZ==Bz0)YncYDYA`TVES?VZNY`*m@CKL7c3Y5wK;*}cl#zwd=NVD*Y}+;Aq> z%y@rk8NVh|&OL!LnoroXCWNU-cfcLL^BOMgr>P)h<|eEC@?Di?d?ZV) z+Wa-B`t&WYwB3)k}?;sP{EigEv1j1&J3x%)26na=B$Kl#1YMCho~ISi#xQZeArtBWXPnOy zXx;1{jIWlKqEF%`tk(dZd`e8Bp_c@ZT`@NZIFU#&toms{X927c@iU+v_i<0}ppq zMEGs%L@b@fZ;ep^^`XoyJ7{)EyfmzpX+Rv`C6LV{CZV~IhrAl95G-Cv3|NSdPaFAh zTS+S067b>h@JN(j8STF(iiWKV_p-T&Hi_E2{zv4e9EI4Wnvt7vMtqTQ(UI2vm)yvS zX&A$M#A9c93x*6yV;8$G+Lbh;dg*7Z7+xt(rU$8UQZsp@HP65|lyb7b?7>|e=jl{O zTPFXV{M)eHnVv?P8?5VBMH7T=%(gUe>#Qw2i(#bdRZfqussDu3Bq}i3!LiY>)$H6A z;nmGie&eSGIoaG+FfAV)RiX zcsMVDd2`la?OLbhYWUqWJKjk_*!P^DqBztZscG#fZ8RX_Ngi-1C7xfViPW=OZ5f27 zwEnyf?*&&`d-1>5ph4KYdL?>uCc0(a23B%261i;EP~$eIRaaR(yJ6S`=bNBN6E)MA z@$)->jTU|rwg> z)j#)rlX&4rS-ICOw-G||PIvLgbOoT;*s8agkGSXzq2wnJ>h(*~Kn{DYM(=(%V4~-u zj5+c@nl(8p{}VE+U1tDCe-xHk$ zRrfWU3iv5XF31yJTDL6hJFYLPc#yK1)))bHT`N}c#=BMTqAA3qx0ypIeD87$NiBHb zNl2nSW8Th<)>*&=?^)7 zm`g?xU4203Gw0jrzx)rk>qGBfUd3Bk>e#)yv0eT$uF=(3 zQ)^O(By~VG*Nz+cbtGNekU;_5F?+U~v{dlS;=qZ()_i`6sMN-ZwxG{@gM^1Phd$UX zcj-fyp)j5|U74`yyto_eOYlO80e(H5r_m@Ry1~Hj1~utvsHb33NJC+o^i=UXg@n1| z&%YNzr}I=wuyQ*Zck)9+ zY26U`{3E1H`k4t1doDE0e#2(3o%W$w{Gv@Z5#gO&?AACbA)L6R1f2ZHZ9H4087IeF ztYlS#u77kwr~|z*%)NdBOH%#$Lnrg%k)=y9<>%+{+qbuw(23?I9{Sa})Hohw)t5(g zI#J`=x(}bS`pfK;iPD{AJe89{?N~uT;*(kd8!3;p2bnM0LaF90iZPCXL%hi+?U?fz zrpCaN*lcjZNe#g0UqsEW%VAo|UDqz@H(A=ve+u9=N=v5)DU_^vul965qELxkod06_ z+dN*xe@=dV=g3`X!*R}W|AVy7S!m&hn5yUV*Z_}whIt@Hi|j*>I{;g1_*rcl4rcP> zbxpxcerU4}+MP%lGKi&<8nOcLJdF#n&EG_VvZqK&Erl*%L!8yZ5?Gf*LI-K+f&&+i) zfo|eBQLqzuNV-mU!w|kIKl;TR)L511n%5OOHtb+n3_s!kQ$Vc0R^MBXKX30+>jxfl zB0hcR&rBY|eiNr)!N*grh|u6exyR4rw+4y0b6rsP zn(@2sLdw9r=M3PeabtPjx(NAew%fQ=ldMGE9@67BdMo?eIYbI)A+4z_fr{v*!d+q>PZY!_PuRsR9Cz={>S|O zQXcEe!RITf(I^1X%?r?F&_O8AU(I{UG7-1*HAMQHh=!H35U8M{N`lt&wqnE@8vhpj@KnV_vcDf@I$#O z%fF0?i0Qv|l^wGvQ{-2PWS;mXY+c50#(u?k&bWCDN8e^`q!t$++w&l9#jahhMBYV5 z-A$OfXO3Mp5s&fSCB1)>{P3=}8wgh=o6K4vequo-I}llak1IeR^EmM4Em)QZobhb< zoy9e9FrPYvW?3;#-(wA^S@|Gu{foyvPfW*+_s$?9b>$%?TK!D!t#dlt{}{0 zYAt3ZE^W(~d?=?b;*4<~8QJit<wm*FJfOiNoIHi1u5a{!4p{KopHbOyJR0YJKuwm6q{|Dz$ zCwQY^uxuv5i5d!Ad_Vri;f&|+FuGKBti86hxR}98=A||0lMz5cvASJq28L-Op$SXt z4AD-6F+pJsTPBm-F>731_(U6A9ygzcE&xseaCEql@35@Fk(5s1{@PnS_PBiqf>4 z-_lJfX}N_8k#Kf9SBCt;Il#;ORHh}gWJ>H+jzVn~7OP^#KWs3bd~psgzI7UtMDgUE zlW@){6D(YJ-zmR;sh|b&=bk4%zzz4#al|l1jQ2l9Ha_S_+cVVXQev5A0w_UfTfR^s z+fnrS&HRuOZ3!6=&bxpD{;&zS{BeD+B{dwp3tHR!0>w)6gBfZ0cPHUVAl@z7Si=UP ztbRg|{_M%8qlF(?N=fC_y}NV?7Z+XU&S&k!(06nW)-T?v0uWsPIFCqlX758y$9n;V z{}s<%hVpQ>&1~QP;|}a|cvoKdCBdV1OI1NU!b;)Rl8FS(#(j*FK(;e2=mgBhfHrZ` zExL?noM}7?YkUI7Z@ghr6O~{*?+fHj91<|Wv>7qOleh?8&P&J~9OfmVTB1qdO+yX5 zg~%7cxB|||iMM!Q-LFj;C>nfn)d!K@qlL8b&u5k|^i2z2=5?afh{|mMn2=2F&^a3= zJBux!c<%UbQDTuVfWP9qE7%g)yQO9ZS9v4}SDZN<_ulwZ0~YRkB?0g<#tpwWf7fw0 zpr}NnE}f!eo~SgH6S8}r`~Wxp_ERg&!BYzm6HBQ9-S|W|UIr+D)`IpbUl_!qY5)&e zS@HcZBNKU*K(vx!u2F>YE@gfm&F4Rj|1=zN&VOl3kKRc!qgt6_Wh#eo6E9r)Zawp` zJ%7E0hl0D%e9Tq6KkIX9z)A#5Hc_~AM}nURIODn7j7}d$t41QYSFifSwC^#$KNJV$ z#$nEO3beXFYVXN|!?^C=B^6_QaB)|1)ILwOg^$_p^#~(CaRXeJA0Du z_&J)GCN}kL;t<764;_zN@7s!`jXSB~c@rqtHe>u=y%RvGQ4(nUWMd+X$h;TCOu88Q zbRCC{I~JHv-&)nsqAmXe;eI!ZU#-rA)#~@-bRA&xx_hnAVlJvS^4h%IE*&hLu29vD zc;<*pG$P^f1@J>BfNDl^EK9p6F@6{zvhgts3gyw-+61VT77MrJN^ipE;F++6GFX`^ z!wIDmU|!k63~lkZnXD142oI!a)jOZ9X%$9y+_N{KmRGITR5s)DN8aW)4K`Rhi~O4W zM_+Upa`r#ag!%o~t8f5sm(O5#YJ+;Ff8~mgE$i`*AI|;IQeL#lnIqkM%h}-g@BIx? ztfqpHP)NAcEoX6ocS7$FF23+xj6LfpyYkSwYd@YJTCAcumkE=ERT__f8Uv%V*h5Oy&vEO*p`s1tD)&RalBgL$ACp3Pzv>}4rW-`b1qG%%phMU!%cDv_^ z_i^KWpAZ>+y@RtOt|xJXLs%7vZhYEuh1jJA3BiHAcU(A=_DF29?SvLKL3`s>fVFS0 zG@&GU$j(W`)TcS7KfzNz9x3G_z1{WMwySUqHXJOGALlBd3C(Nov~c}=GJg$@I-9MU z-H3q3qNRwecim!ZBJbs-i=V< z8C^8fghy^W3g`cH{2p23`rp8k6T~w^`rGhV64BE!w*!i|X&cIN;mAj>L2s_)f4Q;- z#f43%r&fyNm}<+ma$dafCKpoKQoXdw-*du=$UL|^1;kaX1WQiOG5kWbglW#}v;@h^ zLQN=)Bl-#}el3QdiclA%F`R^pAAiP_LwN6s@FFTZtk#*CWtG&#@aQLQOsKT#jwQ!O z?i0cjcg{e^3F8UF*Pc$c4(nBocmJ}S^+1UH6Rw&HDPe9#6OOy>I6QLM`(lDgn2qCK zKbB>)aE9sG#6M9Zd@en6mGM+?M87Sx>z)5%J9tYaPoW3(IbTHM9OEdP4VkD9S=b>cZf`u7|vW0z}r-`c@>~{1L!$&v6^5SyG zVe6aMsAzuK-Z52|GOBeabN@B4_%ob$`ziR{v=X90L9zYYAPyWDhuRj76G_Ym&vN~5 zOmB|8LdfByMiYk`>ITKx&H)R$cuWjEx};m>({2^TOygJ9)Yl{6Zl7sD-8`q^T3kap zYJw7YYFUOg?%2w%ew*VPg&`ro0-5`D#?I~1f)XNN{KRfJ>5PF!vuM){Rm(qm|Ksxo z_;hw9<%m8pmM(1TdyHpTkoU+o?|UMz!3ZF!WHstGZgj~AJ3=8(y7VSg-+uuoINdE= z1{*3fqWfh9uY94w)O+sn4`J)<^;&X6u@_TSfH1{&+>1O zKasZy)Yoe3%+Ywjv7?M0QJB;r!#>l5tj-pnyH78?dfgRhsqT%OkrPq0ggYGk7p-1} z;lFuASxoc!&+U&qgla zGQNhpBpk+>Fqvkh0N#Ik2dfFbVl%s0DKs8>+;eERjF4J<1l;xCU&K9H>zR7RT9M5i*Lnj7C7Ja}R zER}qdaHXGm8V^NvMd?G=ARNiGnpdOLaKE{9CT|Y!!!cqz<70Bi9;oMMUQoFR<6n9Y zv(KMm;S|7M6EA5!IaeX}^j{5CdVIh4Y@4U;yJJtA^#2C=uXyo#)D-PPyBuCq%k?*z z9?4jVTc8SMj$2)-}8d$64R>tucA1{g`hs!E2zE^-wO&k{ebRYB{KuxN63QlJVoZ1?T z!ugl2RnKlW*`SSj(W+@Ad0m;`P^em!o#cdK>z zmY;&xE=7$%bW&5zdXayItx-rM^34!6YKPusY*?>~tA-Fvdj;YuYLHTr^yyy2H--Vjp^` znEMIBJ$q9-j>DYGCe!q3Kc=HrV7D4;sX>%upWe4TPr=cch-+c0eF7?a;wfCn&w9-J zsu(-9Sj>2_T+hBaJblK3mb^O)=rzo`wSm3TEKD~jRns6sY4xE(O;Vn{tGD6BApHCa zYG!FPY9;BJ_7XTxcx&dogGL$+q;efkI3#TOjBAM8P9!kbT!4LUz8IU{cn#H?OVG$K zT1Ze7ugOiM@DrZz?oEMnTZvgi4o1!Pg@_9jB6Hl2vGqOTD`%P9Yg|q)4QO~DIENUL z3oEN=i%S+i=x)(Lr(ZXbFt7K+V(rb3kzeorQ;|Q!{IM=w9kFUuLXs6PyyJOAmb%!q zF1+=9=)qmN51k*$&I*a(yxyM)Az)v^Z};CO_v?w!RSiUUw#itp$fp%EH?( z6mUPZ*)9jJ<>yI)v?ewtQsdc-lI8Rsk%fvSZ=iBxJo-$$2pivhjAba) zE<=_uSJ2K+TXYgw30e|&NMv#)e^YH8Y8K5#%Kk@M1L&3=k98kX%c&7~LYLLQ2L}KA zXiPunY{cb^Y84X2w-nDMF8uOIm<#>VlHCXL3nHsImRsty+<7;7^>0jO8u!$%bK<@N zY0$xiXj>yRzmqn*?A=eIa52)sa2|`Z0K)JS@~KxjMft)1%KX93olL`73lkz_mKsTi zj3l1J<$#G{)^xm2J5EHMOCrJ zgqi^{j*%_-Z*gnB58wH@9r`o+j^Vd`R#T`ekTT#P6wFwFy#C#=e(er}rA8;1`Z3z= zT?;^-nzC>L7cl)N@2w!NB(`3buRP8%g=3|89SFTDTu#;2Rs+i4*8P+6XJ?u47&c^p zbs!XoQA2b1xrSo%8=*u^MhN1s#wq5=fL=Y*uz3rYC+NgL#~a3rIbN8tl|d5@>BVrq zFj2RDohj%+vz1f4^3I;M&6Te-#wR}gcmJtydk4Dp;<_fk-O>MeekhMtE)u$W3gWT* zWa9bvcG5nN1|X$dklMF5$4wCgDMXk#4f|hpDdsHMXu_sykcNw6PnaP=p?t|N1v0#M zJf`!`W_80VQp2j0^kf|St5fl(lc?pmtRzf*Ef_2185UWF^Vp|&*1pFORBc(oZMo%6 z%bj~2Q#-yem%X?0%l!OI25;^y+)-+VwC*#y>~RvfWhb(^IpK_2iKGzXetC?Bw?SG6 z1>%R?>##Nk2`d)hG0I>w$gtH@WgF&gJm&Wz{P*u8zwY3dGa*uUO0>x=36)v+l7A$R zs1pezQlvOdB%$gzf;S2*+sU*vA*ZGgA=Yx4U)YPmMup{93*DXn^4pF?6K#`{XmVdt zSYo>ssc9LsPHsdAzjpo3UzRy|%p`n#O>2`7@kGD~*H}vpsaolqC&LP*4`Rfmo|yY# zF(*PHOg^p)uDNS9ath}mF}f2~2b{*So#U?rOhDr1e2AeJTtJN+!h)sT>au#Jw)=d6 zjd86+raR;Q(|BuW6W*Kh04nQqgoW|P_G{O@!etU#>hMcJf+?YkG;N_3Py@mp__@u6 zUou>f=zN}uD8!KTz_pfd5pCjj`^D@%vVUj!!4Fj%me%l8f%;D&@%-Joq+!R-8rG#+xf33x zmjI^F!lkB;XKh8LQOX%wMlxzRpf&^r$IF+Mo`hYz^1~Mz>pGd}tUHduf-lN2w09am zSwahFexId(Z+^Cpb1A)}vsoL`ev7fKhL_ZnhjkLJg8xaewyh{Lc#`;+?BV7#>JzATBN$R5@n0mV9REpPHSg$G2Sp5ty+SlGwv}>r!arX#{^RW zUo0}M=DL4UBw?VliDdsXE{4RdfJ7EIs*x8>gb zV-!&l=s4V537u&WhlI4D%PT~r zA(dZQg^Ul+J(E(k5X~8?Q1vvH($HsV2b?gDe2rmb|MuAY`6A@Ude9WA1)USa6h^4pdBcWr@*Tl5kJAV=E**!Sm4_MU{)F3F6VYeVx!CyrQ)~nrpEeXCbjT#y z7ItanKb97fCz@-y$8Qw1kqgVjpKr-;apJ!v`)m0LBn*APYbSzc{BH#)zX>6;3xJ$4(Vh|l zhBCk_-{P$v+XQ@L{&-r-a%|=*-qTO8K3&>lYj;0?)56M%5vSIE5Fyokz7OLr(9`cQOX0^njvSW z)uE{@5$j9p5uE-Yk|+EU)$=~&F-vwW8emEj@V!IUa+Ih4h`4fGMgs@v^ESLkSu%M1 zxdYf`$D@>A$r?t@T2tL*C)E!8f9#zHfL}$m|IcsxZnmXwdha2HKmvps3|$1lO0zu$ zL=*%m7ElmTv7j_XRH_0ZAW|fRk^}-Iq>$cwPj<6CTYvx0_sqS&{Uszk(D$C=-%0j& z@64QY=FFLM&-59tD1(Aq*41lj?a3#$vPXkqmbYK94DS1AJ@PCv)M|N&IvY5m#x_k| zh-Dx^l%hL!zhIJc%qHTWjIcweYgj=~+FZ=aBRDSJ| zS^4^Mi5EKiFaM66S)8#$wLowOEdK~Uq03ghutXKt_8yW+aU3NZpdvVV0BgfZf8PgR z=cl;7#Y!hFmD02+pIZ!tF*oUo;Y7k`-7y z*3vc6Uh-ZtiYA52rfrm6=Zt@+!1 zR*043Y94FXIg=iCcgFHqSs{7&Pn%`%GK+%8Oz307j~q$W-{g0u)b3%QFT3w*SOB~6 zx#`GNpNBqDNuEEJ+)LIO8Xb`Q^s##y?^6Cz`tfG3IDHgQcdfKB=9J_WK@X1O2=K79 zNTs?LjPOEOtZWV~OQq`46)S?_A&cZhl?lDc?>XU0^!DwzE00F3g9IfEaePy5(E_|H z54gc%w&Ba-3>#i%OP6eOnrZ%m~}gXzwv=@aFjpM2u}QxLTq`(A9TvP@3y@D2m1iH*678HOxx4USoQi-Ryts^ z?OFI1yWUvTfJN;*yo>Fa&#XZsi+2Z(42qq@U^vR2*4T*$&zvV3 z|L|1apEnI%h4n?$ZpM~ge<9Zr~Mw13o#vf zmRR}5O2GC`KWv4S;u0>{wR7y;ET+k_{Qv&=ycx;)?nHLmJfU$*(-(B<~ z5W&ZmuT$qdU*xHM79m>nuz;~x;CTQ8%PZ%_OSnWM@Bv5u?(n>M+Z0^=Q+l3OdU_6@ zu&X|iVYkm?t0#&${;*=3Ic2By&fa9pUs;Xr!bin(^iruxsm7DsPM1`VGlw<-*KK8Q z*epRikDkPS-o=&Dzu@bWxh6(ad0exKW!ueS)^&fIPT`;wo>>g^paBfXhceSlQAIWF zJ!pE)fXP|6&Xd{eXFq9rd=wt1zZXurCx&agEGfi#Rj0&B*cBs2f}#smh>?2-jKYCS z6+B*75_C=$N#j2L6?w*4(nD{xUKe*zz@b-43VIhEw~l(jMM~?{59y1R5|XgGbT6`P z>J5uK=sHj0-TeVhzpcQA!J7~!zJ%}DNx>_VTxZih&$jzbr-Ic7la?nj=Xg^J4zod{;t0}fNdPSq?pvZ8Lhpo9C1KXrkFza>i zBq_L z97P7eHhdqmBEu?dwV@(DXJ%Gr~lT%~&BfSi76cl!$i%SuZ;#Y*R2ko@7R^n64BJeWpXx70Ff z7&3`s6sIhS>-MF29DSj=TRfgmC*8OHK|{RKi0B1Cr=nL^aN&yy|F{$-dQsjSQgrcqI02j@mA#yf49=4muGql+ck=fS z+XvPI{QJe1u);t$g{1wwepVrZ^$rFdN6&JQYv3pFxWDqx>d4MUP;(jVuWSmk%iKYG zRyj@OXK(y0kMTr822zAw0*EQb+{-TsMNWj%@TKcQ@v2nBFoS_cU?}uLgZM*Qp>U*& zDkR0IJ))5fIl*hiu&yd~%jp?W0%=MBoZk(`)2)i4QAUT?haim=JQ^b9cT7)9`5=x+ z{c~Ny2QmkNceZ7VcM8pM!?Jiqc}Rc@8DQ7Lx%^8%2m=D>PfYG z2`l9C-`aX9V?Mx)$2xwX8=-qLS)AL}Lao$NUc~@C-xDBAvN^mgdT_xXNwwGVtz&FFcgW(e-pV;R*$2T_2*rC{5>1 z@2;f)x)KHWfRFNcGJ&4hZ?iaovf5HX`IJzAci})*&Y_fsrx`wk6#w9gp7Ioa6dwvx z;q3|-pyn<}clccnK>#6)_w42LRK=t-3ZeKZ2)(D90V+OxM7iuNs$-c}Og~_9PGAMrlXLkTSOndPR{S0X#c>|YPgG#? z=3u=V{P;NLc~$)jc0c%8%+Scnd3+kae+ZggN@~7W`Q)Tl?ibm6_Dr%>nefK~0q$=1 zG?c!}llHRbk6I}y^R}P#0R@&gEjnPz(1)PlHL0^==)vn`h?Lt0KauGE8JZbwgyV$c zXFwDyq3~i@#m6oVlRw6bp8@7S`2UgL{`E&k)gc>229!cEg1P<$C6s~%rHlP~hWF4e5>A^xm~h9^kGucis}b4 zNYEej^5fuEgd{WOil{8@>)I5}Yif^n1fc{A_#gbgTYeI!PykaQ$dpX}dT{*tx!=&GFl9p&$Bz_>b<7~KWU<2CqG z3Wry)Qq$Olk2k>m2mc?CA0KwQ{KAkCvQGct{|)8uH>StRq#3G|7^G;*e5{o5Q$mOh zCC`+uLgYXA|G4~OF(dk@K8ln&j=-Cd*Ts^WuVtgq2VMRQ)TB9b)247JR1}r`JSUhU zk$w|;vJy9}^N+E%{`A+@z&R>@r*Jiwr#yNu=cjbyG=XRq!2zM<#8B^xzRB6IoA}#q z2{zgUF-O!6kiL+UU%1Q?_xuz<5sJQmh-QRM)c*N*oD}T8HhwBEQBH#&p2c=vsaZ)s zjUfkDNq$R*vebS_1or;(F9r5tG*S2`$ggc6I%Fa3H_EimZqVm=KqqPNx0|I(e|{i9 zk&)y@*O<+HjloHVqeqW7dzwE5o~zQzi00*+JTD@uFkj;R2`@7l|53^%4ps#8B+sNVUZ<%`*T1UrSH+l5-&gR;fa~ASaQ@jCKFjI^!#5eIR?dLQaED{ zCv0j&zoyFR2O{ae@4~#ETei^but{vjootD>Ubp0MmZ1wrycDoju8un=oGsFH z{@x@1%A}m0|73h^GS`l^aFXb|@IU$_XW1F%-Zy7nN*D^q#!Mb(^ZqhDWGRoW0Q@6s z{Ozaw{)O_NF8@TL*O$bzyO4p<@la>PbJKwnna=oB3=*CwVBZm}(8X>2**)F{)cbz% z$+*JhoTk6E!A4$7UU-#d-1Q@eiRpOy?-5^gV!ZhIuYy1DqVL$MJ8uw!;iF08RqG?e zaTV|6Kgo%sE;&tVH#S6~O4_;qb(}qL>tCHpD5M}?2Uzh+N)G>M{@t+fp&aquo2_#F z23vGbIF3%~q-5-ghMzbre!iFVQ{#XlDNPK>JZ06={7NF@cefK3Lha|@R*=K{%K`C& zh+^0jzHt3Z4vLv@<=bES?+ss=>HN0w|IfqkG3gXL=JTi81HWDhcW@{M-35hl9(|F4 zWTC|k@y9Pe`H{85`MJ$n;2{q+zyrUcDMOqpfXt>H)|%gyB~>CG@Dr?@(GI;JkAEQl z5IFMtzhsAAjTMyjuuda#EVFo`ZJYVBIN7WG@cmu#4|BmFyD~sDm~V*1U9BK1PY@uU zQM)CC*dBVoO8mrQM|jB9Up~p6x$hDiI-r}chV9>{v;BdtCy%yofAti*=a%zLu>E^?R*r!P>ASe$QBS3R zVE*GcaQ~0-^D}Ghg}-ia{>0-~@4v;)zw^hIUBEsMLM7vvf8|1MFZoN!_)BmWVX6%% zrHsRA10Hkv*_P9p&KXs(V1=)P$VEGgg}lmhkj>whe<^tuJN$AuOtZ%+-?lD?PqJZ` zUQe3c_TvBVm470m_eCV3f{iLj`Q%kblzJiC3(q=70hV#!uTtT?e{_|tzxKy|{it9I zxVEWQ`#V4>=IF0#ZDbZcw6ggkbx^mH<#%xZF1CF2b}KF6qLWGu>##qBB}H{wY9FQF zj@!3upwW{fYj>5iCzq{?g)GOf;)Wi#6fh}{W10u#9{`GAFWCPJd|kErkvo54k3F!` zjy*Wf4j2`nHYa=ar)Y_u7R zdU|*qmYn_vUz{t5SpHdzWHfVBTr8{ilm8>Xe=Br634X%qTje_{e0i7_3a|a`&0(a& zCF~%3>(75D|3vSLoqS*}PAEL%bmO>GCW%fD6LjnknBn)|3145hmaZ$Gu^g1kee>u? zkWnzF-u4sDj9J6Z_PO@m>(5LnUj@o1C6qF5p10U4UwGJswLkf_p7|Az%ba?PwH$j{ zfO7@hJ5}K(p1%cN80JdQL8SNW>lLHgBBmYl9X~~IZ%Up->PK-$-uUxK0Rv<>fxpEn zw`}7;^BiBTuCT2S{xF3XzwAp}{(a?#1^hB%b;D0|43Y-vp>ez*qW831rNaI{#@CLr zu(Fut{AZkQODcLtIYa9<5%(=tO(MIWGr)<)5P=x>(cF(@cMl^oP|j(n@@) z((uI9uX~8|D1Av$WSDLvI3PwM`wzav<3)=oibssI#H-BoY?^N+N1bjvt1|4#H@Gi7 zV;NU{angXKmaD5JkU1@o1IwRbC+M{@=$!HRFL+0}#%ipO&PNUOr~H^b7}|kIrvuB^ z%2|Ql7E>X@kan=?kjpSy9SS!tKi@nBOen?!m!B6q>1h{4UM|P$vaK{60~e~}lAgU? zA$M;pX9awwwfpd8RQJu+@Z2w*Px0?tEu0WJbvY3h66R>&pm7eY_XrLMy|-DuNHaY= zMix>Ux@Z3XCw$*vz-@DP~y~)AeuiW86=yOttgcc6CRv9C19nqM!2 zGyxt+{)svU;5BG33`k@@b`AIb_CT-tx<9|Dlhs#;sZW=`(!s^2XSpX%ho>un5{Fne z?ds+|wB6++?j7X^DTVdy&Rum_xr)l5cshwy$}MHod%MzNSHwz=Wb++|$6sPCRq!-B zG%-?&5~Z(v$YG!LCT>DV%%>vT-XrK3E?ol!7>DnL^8vNQ?z3=8*v1GR$KA{7>UkVyBI!RvFT}iyUUn7a-+uKRD?_K^GkKcjvspBC$CPNC_ zx$?=Mk(I-~qR=EA{1R;1hBkwr~4J!@xGiWmQ>|B$0Ocf&{6LaRp9DrU|DEyU^`W}uTLt1rP3)8ZJ|F*_Uz@6{Qx7|+&_)btXM1QT)$zCf{`=TT z#^ILiD9b`oOM7*<1Pdzidi25)GMB5r{~`Im_0sDqIXmR|!@T?w9NiWQ@BNiuE7r^N z3%1{_EM=mK)m5>3>N%ais@1x5;wml|y(;$VSa6Xa9O;cap0WIbUlDEk;}%ds zu^gn%n%50s3f0>_4ihSf80X&|Uj?z39OC>Vr~J-c(W6Y8H-EK_?!#?BjoJ3*T@U#1 z1SgVn*Z}P#u3XTmsyZAjzjJ3cls9laa)&U(k&<sbU^QVy#k!KL zlKYT5a#DWz-US%*uTXeOm7m&I|8*^fMEshg~l|E``+_T2>{D#7zq-t=+)_@;U;g;tsB5u4!e;>Zhzm~TdQy6j?YI#h4cxVh#T2yF zGMTk#1uof*1sEIVrD!^BQj`jG=-L%!ZKA+AplH|#+r48ueHfIPc3v!N!JmH14c7gb z(~2qkt$T*rU%l8%O5^w+ybmTld}sR*)y(VyO%Hm^Z`EWNAU2AS|L)v47-7wM1hiu05J zLU}!c2Tx}+s4t;y=vJ-FlzSU6OmyK;_Up%F~y?Xck zmgqag#$9=>TW1w?w*fu4(}cysA_{Hc%gLWfo6r5Ey}$C8QmIY1tz5@@B&~ZVW~^v- z)^Xfh9aZwCtsGWKysTdQbPLE_v`&vz8p@VSEqV_E4(VqFc}hdYfP;Y)5D0R&mp=dk ztHOzJc=@2?XEJrxg0*R(0UitOK>05`;&eOy)NrX5#Y4S%RfnWqpWavlFezth zUoOC|w=Ts6RCZ-iLfuGIG_sEA2yEDw99{XxkQ@4Wq%~O|vTPR~*+n{xdqwHJk-A_?*xC(8%K3 zf27j3$>*ME&p&{L#$~WLxRp!C;||q<%CCjyf~MTm{?#|RdLx|=l&!ch!*=Y#IwxA0 z^XH75j#*aCEYA*(G?pUjtnA<-J&AmgqNMbPallZec)TlA&`f72m2D|l5P`oD8A3?t z1CF0TRq0n7 zO0B)UiOUZgc3V%BuYOy-b>y_udh2S{Eeyx3TtFR3bvj}!m;7~N1^6RT&r>%XX%-}u zMc|1!kq*T+>3dhHdBq>SaTG!anrn1IO4!QO7{=9FYQhm}8jq7T8t{e7y}F$8`=5Ea z9sHqjHfQP_tRKg8q?UOpF&UJQW}N?dw|tLdV)AX!=f4`PoYHCGnz5bCd{6}=2CO^_ z;wzioxGKHa0*YR62i70iUso-`>PvH{hx9G_@;o#yoEQKfj$Rd?Y00doTQ- zf8{4EZ_o(4_pvQD>Es@E->0we!fZm>I`!>tEe(4tlhWT=P{LgsD3H!{$>(mjow|l~ zhb^z`V2w4^R+P;ZUa!3ps;A7=%xql9tjS}@veh~r+{eo2vmh5Sx)t$5ob-{Ko&D<{ zxDx5w)IGGpRQOUv_0;_X;;Dh>CYqQ*2^5YsB6FTco;}a`8e@Gm_SWO~cv;JOL4ujI z&Q@0u-HNFaRWZ6yg4t=I2eR~zA6n7C;nwM>Q%IL;7ps`$O0zvYWf^O*ep#8VR#KE< zJ9p^|VJOGRNcnJS`V)Wj(w{_T|F2W?DwE2!00kYn$e)TQ*xv<|2A7Ke7smI4F{NzE z>-*sUpu-2**_U773kZIB?*=>fi$iS3);e3eq29(F+}@T9FxNtE{Q(LEHeJuqurazQ(?nt*tKuWj z{4LE!t7AY}@6~U=Y7HyrF+_s3gqF%bzo>*kZT8$mPU*|aBvGa;hKyQt-7NKO`-va6 ztj@hiJMh%l!sS2E=*5+?>yV3vXl(W~P9=l8@nZeRq>Zf8|I_79FZhV-gXIg_E9a^Z{CT-w)c{X%P8JkRpF53@x3?q)lfaag+mWuo~* zBfow-Q*Gr>TSmKZNw)aB@{#MT?` zqcTw0(Z1WtR)+HVmf8Dg+k<7&DQnG~QrZBntfQ1St79+A;=uHVRrB5Y9&*AsTeo

`-0Ddulyg)V&zRdB|pWzYq; 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�jP%Xs}yz>%jz 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�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

4ZtB7k$9cu(Vu);t~h_$xL8<^d7fPU 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%0AiZ^<|lwgk+~) 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%0DIt}>k$wf!1BE; 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

lc)DB@04pC1coLDYlIz0$%xXcC-GNC>UyF} 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 (Q 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

weqj z(+9hbe{XD0+&zDwM?u6J_9`qByPryDE=T9H_;Vc3PkDln^rygCxy+?ZahLP?P zgN7dN>TjB(RyX}_NA?{r)ACNZVF9r(zd6G9*QP2)o`30G$9s71sjhQtCjB0oBTN-F zGhJKVO;N`g)o+MV5dm3~)KIz2K;~zzPw^E719v86OhDsK51xj54)g=Xw$~wzG2x(G zqIh46i&}MzyKiV_``Xr(ZE4-d>IDn@ zEuc^SRB$75NHI34$(%9}BGGMs&hWqO#@%2vhv~`#z>y2APcMVkF7k#9%jI2`(e*0J zf&t4X2Cwa@^i>5?@5d>X5aR_pITS39Vs%2?J_mujLpoBQN+)~0D4ZsYFozq7^Jn7y zOb>8n)ri)6Fj0pU%#SjGrx+^&eLQ`ZqxODCMwU!OPP z27@&i?&n@LaWW24e<>@h@1x#Y=zm6aBB{=9fbuFo_rvmKRYfbhXaN=nNYkt$lQrR= z%=6M9)=e7?+-WFDdQx%l(4sf#r9^(slHQ&k-MPb6E~HS$fr z#o|*NF(g%!JP_?R9|H$gRRUk3crnT@#fKp;6P~;9023P~hxKN|8$b_#0Pp_9&*Su& zvv}!y-^Me){Vy!)@RbU3b1uGpfv4gu?XcG$?GQmc2C^6 zF=>2~>I43;F#vx>kubMDq;wBCBBk{vCBU+w7Z)Wm@Wk~hK8vsA??mQA69~C$&?c*s z`bjA#Jy081+pMd>ziO94zZ!Zp4KRuwUuG6-p$2GjFHY|xFQKKe@;%XQwpE$1bUu8V zQ*(PM`F(0nrG!iD%j{mWR%N~N?w}d>QIy~IRNps6dHQ)XZFx28lz5aHWww29ud}XG zik+}uYia+yiS{otXIAV-)x_hbnToV>)*SyL7Yv%?#PhnH@+a=ZNbB0=ECQ()jJ187 zC2DlMQFWmxA)EcG3PKB4w32m3;(e0N>>e#(h%l4BfQolSIh|StOb`_@>ozVWG|P** zYLH95&tfBJ>C==ozBm)>5})doMjNkEbHw?Zro0*Rp0zm0s)UkUl(&QsC)&V(>QCxG zvHX;eY0x>+p30JtkKLGeTm5Dyp7AR zJ%=}5c^)SYAHcic`#vllI*py-GM@a<&*8Cm|0H&{*YJ%m{045k_IU;{wlFup=-h;> zsGz5IL_Uqmg=uMyn#)Z=3{g;HpA`GuM#;p2B50iz+U}K9SNG%C^!e{~dQSGZ)uBDO z!iFkv3yA=H+TZuH(z<$uSJ7Afd&lnwmQNrC4b$bjQ+ustp9KLK8jBj#Xz6reg1rPq&IDYfohI>B(Jn`d9kNbcZ8T5PkOTew~ za@#q*jSuLoQ0##!woweCZQbSt>P9&ANgU%kfp`C|5LTG-TG0%5$ z7oNhEiwpn^!$BVwQw;I7yfqy%_gMh~-PjFQb#A<<0B@NHp(G3PX@#Dl$cDaA5k`MQrW5McNu>%OH-sR^D@OdrXYZOUU>@~=kCmMVsUv1)A7J9 z>b*D&Rz5cFszXJsi{IED7>p54V|wC)m>zjAgMz$)eT_GRF8(^^_P&nJ3Tw2BykWqb z8+|QrR7Fz^ycVsM)P_e=u6 zTsK&%SSDAPrZFjP2JmOKoKX#xWl}O{U!?_P-aZ-FrnQWgVOFHlzkwfAMQSUjZF#l- zyKU?<<7yQ$cPu@JQAzli38fMww{``a79bHvd(me_h+TKi|VNbVt(cI z5OeH&rzBWQWz|T)btk>Bc))uO|&55y~XiFE! z@N5N=S_Obn8De%f%<9g4uUUNNKMh*))^FccIr(VJzb#Ak#|n96Fx0*;k(*K!Angx9K$JMhE00C#)y=q)TWUdeymg}|c| z#~X4GZH8)d{3278Kj$L?d~@Sn46a>d z8Mg)+uO9jI`~TH_A;G2s)CCbu>E71b`xiV#s@2mhkqsJ)mef=wd`?fTK^sESzu_jaXxO zy!8Ta-dy7sws@c2$LuoM|n*WjzZoE?YCCy zv8j=6V14pRy=gtGP|k;4&?8&9%wpZR7kMK(%-hz2#F3((syt z=ikZhEp#TV_w+(5QYB(vrTz(Y5wO%`w~&}Q)HxfZLC*<&S13V<-X(-WMW=Kx%0%ru zlZtIq12WH*sGkdOh1hwj9ubH%nGIO1w+=Uy>0P0(6W6GGwQd&a$8#iaw$2@Woaf#? z2CLuazPKLWPGz;wH1evF8Fi?4BtW2d;8D-Ro*p3ClrV{&f5+x_lM??ce!(?(+w|{?_08CH$pd_!%5L zu!8>>F5T8km*2!?{{7r{U&Pkt7QXmpUhFC9lk=(`-7VKli3c87+sJ>AJ zYN4meSt<|*R#x!KfAbgdi_DupyqecV=KKHW|NGbQyMOQ}>Tc9HvWZt7rA3PG(@%fu zV@%_}jPqwt<3F_P;*~cWzwLP6MvkrWf}i5U6(GsiH(gdY;b=( z_xy{veCdk&{LXh?!sgai0T9}&O%avn`+YBT1Xvf~1zy~G0Fai>!1RxJ_g@PV*{jC@ z;HQ2uoMihAIFpFS7yvx+1d{8o&CSNI3-5Jqo+Nc(`6i~n1Iwl-k-jl$xz?Q zo~X^c_uc*ydW*}>3XmA#vhg7eja;lN7eIcYkMr+%A4b(d+`KYG#eGHH0Q$Km_)~t- z0{)S7kt{l>=o4FGQd&TGAM88F;uXnQco~zNVnh0F2cUr*PX9y z%s{Iu@v$s5th?na8&d`X$5g%zcYGJkORK>S1dxhOy*sd#`Tg-W23OxewYiGv&Nim&15^{1*S&LGpQ8*+ zFi^DqI*T}a%K7t{c6KpwCxr86nL9l=SPr`Uy_^>CFKNB1A?{Y4%W!0n2aHm%2zg_D zo1z3j)T3E84TejY%%6ujd>_lCgRDlcgH~T;Q1fL@!2k;lT|71$iosMtE>i8?ab-{j zox>L&K)pCO1Wz3!bFLrcp3mx-j>3ubMn8v%#zEdq*u?g@4Mr2>wlJ-cF{pZ0>J}&_ zmR;_*xOW<5wP!7`DxPcm$Iv@)mgV{}XW={CS>;Ws+q}s$_9s5;6AwbUnM{a-hSW2? zMnmk62(FnVmvc~0vP#x?DN$ZvS^+8(qM+|k5JI`=QnZEw@>FF^6NN%qYSd$OeSvJC z`FSSLJES*SXcZZg0FI>0pt%2f2k%Ayz{T}J#Zz_|(cv}?L4UeC)(eZTe{_menVv*>YmR4W&UlTUfC+iXchvXl6>{^zlnR!{fD)H8bX=c6O7$40mjwm&LfkLpV(y5#osH~s*ZjkX4HA?o1S* z+Jb<*@N$8KC-#sK8y|2Qax_ZdCuu zCC=8C;^Lm=cC?LmlkbRo1%GzzAqKokfA72AhJW@y{$u=EyT0?C7xDQoeGR|+d!NG> zzW816T#COt--8#POJouu5Emt-DyqSt4{8#H6c~?5VWnu>U);(skBc>w8lV_H`(_DR-)L0Emw7=l(hY z_;cSY99ydJlaDRqo#*B;*GYAbELW-lm8!W(T~=O=xxBdF^2%GgO#9Eaax)!={E5I{ zzcF?v0uQD#_WY^GPaW;z{inKE>{g8~qT)+i8-z@ztOS~>l^((Bh@SYnLf#nR9i_@; z8>+S`uk6(LU#?8?>W*+B!rr6(f!1ydK6&R3}`8;}4&k z3E&!4$&wHroEvlJ4aak+4?F>LcGr&THHeydh)#VtYN_bngT{7c0Ly z@JuKxfPV>!vgJ&LoW4C!b#jL;$W$Y70Am6qKqi4-Mlobu8yP78NEq$|bk`e{?qn!mDNQnA z7^tV_p+dZbajFNZGOAK*D0#~z3#Q6R#)SD1w6C0@a(?ldg}98!+msDJQu(BRV|^RI zZTMZ0!jMhepb|Z->MgR`^{D$CuD#4a{56<@o<(=4ddYJW$sIS*93R!tbR#(gBzB+X zLH=I*gY?EM?3Pd7hx?xXFb*6!iK`c1!^P*mfYGhj(CJN?pXQ^*p9#Qpz&G7ir-!*~ zNc7G4Pa(`i76@;Z@;Qs(gmg%z(Sn`w2|{?KR>gI*@{(F1@9F4JCa)h+W9KeYs1WlJ zSF<#he7Bg0%Ikd&p!6=*rRr43K83;3trVXRF~<@Y`62js=j)zxXK>FwXK?wlx0sDv139KZW#?RxU@N8F#aY_t|bU;Ogd@DKmd|LB0yrZt-u;N>v#SI*B+jNCQ`%J;QE zG-#j-*$#pd%tnu&W;xLmT2=|h8Wy=LLcC|1@%Y10HghF2aU+ zyvg4u6LfYq{He;2Sc($2PZEavB=d*_%$G$;ua*}XtRF&piNru zzzQiG3&qp?#KOQ)tsfTFpXU3o+lLKFf6%5q8TSbbo>pHaF4Bau$ zApM8W_VLK!t~(^;;`Y=Vlkxce=B)`{-k9P;r+c_?xZ}XmM)7L7CHPL+b}Fi>_Ay%< zOf%k>Jjkn7DGyby{IC{Lk1SXC+Yb@Gyjr`1LT-<}E3j>b1^+CN<$*sbGx60F-h!%D zAdXlGBDA%JW_vBQf}YVNSFpu7?{iC!V? zC#h@sQe1nHY7MCzeIv*;+eu}EO|tLwNln4d6z7SoM0>wBF$Q1wKW`R*%p24Axhp?- zL?uQs24&MJQ=P=Uoie@FA53Age9}8U(|Wv%z3b1Sw|vIM2AnRR#_-nn7--)^yL1!5 zrrHx|;(_c`UIHUi!GxUV(vGQ(`^jUhyL1E(Joq$Lj-A8S`fa@YmCs^#^$nJlV=OH8 zy^%@?MdHRkyse+z{4)`COIDbQ^<%rGUz03C7TQ_5LN;~0%2G$2j}%X629ELji84BL zQOeZZ$vfjMMZB~LkeekGla~=nL%ZW>qh`hOLLW52zm$)L2;wvOR%~ZUOs58;o7t1c z53e8mD*Nrv1C1?+^p}6(XWXB)2K=>O|1JEhU;oWKkpkQ9iY8IvFQs(2qGp{y7p?TS zrSrmp()}oD^{0Cn{*{G@LAkh1fPMacV*-qgHPHWNSZLI5D9cHU76)u##1jJVyz(O1 zS_IaeBP^MBc!IYsW)r`|XGG!A`G|rb0#K^H288&U4Wz-k7AV?1>{}vCksgVH~R-vU}rDXhRsqQq+uC+L_ zmN*{J7>x%Q3lb^Bi#fj<8L-t6uVIe~-bu+YJ0) zdWOHR!n(K7!3SW@zZ*FFcF=GK=9|9{T>lO*xXw!ME@E``Km!{bzO%E9YB=zV0B3pU ztuxY6CIrb>0H8oqMnE_C&M*-e4DX>*Ae~lK3DNpb=9$b6N(fVjJUfVHHm)xIeQ_yE z2ZV^rao6S0KYR>xCm+C#OIsfN4|w$C9DeGFW!!hPp9~IE z9kU@YO8-@^(;G%O<~2OKatQ zQ@q-*YDh)5snmGVvnOn#6U28zcEvWFym6#mi?CpVvSD|NKE9b?RfJ z_9wANkj)(L(Nl#sAkEos9!N~$bCecmqN!2LTCGIW7@rGQ`h1{U?F9kT|WeeV-<%;TMh|RAFY10}FDnH8Ss?h(F z?JJlLZlizbAuOJKABL+h^FHKN$of|iEw7I1Q6f`KmRT2BUr|Kog7Qm=)#aJ%=v;!S24zeo&x_g!0!l$~%R5nDiYpu3 zQoN;aWuK`su_Ibu|KYX&rG*U5WYhAUKVM}2;QQa@{(kvy{u2JiFaMn^mY@tODnXHQ zWXBiG?B|iM(}W+(i0=UTPGOon+r>=Fy$nE9@pBoFL?JfSl8gGOXovQrCpXrbrk)6c)f+oBt0n3R<7S9_Is|A&9-Vkgop=~vE+l+wvG?$`d_Y0B}u1yR(YrpCIaTD6~V zTJW#i>A3VG-q9Y9$1X7W)VeIxHjZWwf1a*i`pZA#{(hB#!2ezWfoZp1UwQxJqBbe3 zk*Nhgioi@2<*Yj~n8eX7m)Tx1>-kfA?NyE3iMR(IV1@CM_h9S)dznEt2G~ZtIvaM= z`*sm#7f)5Pv5D1=GFK~K`^>pie2FGNlrpqmU0goiRJs0r5A1DR^6tsqgTT?pV4nCG zz&qi%{C$|$zQ|(tvO6fowcQ!kS%A;Skm`(w=0zKeGsuJNzmoZ^*j9y{wm2#*Za}(4C?jG6MWj(PuJ-)y-)6S(_bqPLx9=-eDfw_YxvHj-vK@7T> zF>g${Fc=+Y5olaIz1oMfpgPdhmf%A#6PcgeZW~(hoLo24{K)QLUWirNSu}&$S+GVme$!AA9aRFQIe#)a%<+7t+i^ zK5ku_ViGq~9CU$)0ER$$zvLKevG@`mFgn+KP3^G}=~99KU0EFpBuTTjfgTm%o2pW7 zBxjUf6u_}~>az4l*dz;W)$6w0u20vd46?$6T<1TtVf-a%$CLzK@u(k>uwE)V2NsaC|EmMq)C1mm< z&MQX7p?|L%o9#O_vWflzQll^8+!&ZyIsNczxrADG0{`9$K=^0%dgAd%@YT=%8~oa@|7LUz79r8NO7O1jc>@G& z=99f|(wNKAW_eNLd2)wRuDLFoe8OoPHA{`c%E+Yv!OpT(wI`>q?}{|`{8xhmtOQFrN>@sY5*dz8@3$r=jpN_ zU<3mHF^~JJ*Mc${EuBl@@#sVahW8^``S$Vsx(@uaOMvloh|y@k z;NJws1@7)*Tz4_)E#k<@d-3P-`b7o-Kls6S;lKX}{{+AKudGG3mUX2bA+l?Rj-kbf z3zDvbPy1z9400vFQLtk03Yia;k1qcmyyZ{&ee8a0zHk$Go(Z~Hm?9zp95~bLkN_9m+F$jv0)4K7&K#S?uc{vQQ!P>?hGzduD; z0>HV!i-Vr;+4AMDX}pVr-%@WBTb@nerIXQ%rLX>&y+kXVzO)OrR@HbsSY z1p_M0TezpmDQu**9~9|k zy#G`Wk1(**AIc7&eRQS5y^G#0`1hP! zu;;6a+cz!{Jp0ZBxy{%#wAZ;0Lv%beD@QH;Q|g~3{R-6d2SL_3>?@$iMD>Xpqr>hkEXbC)P-H7RD!9_3+Za&jY&8bJA$zS!Y#6CmzAV ziF?sIazECuy#ZYN7K5Fy!`KZVo{y++!|-$xZCpuV)4hVaXF*Z#z2E_h08?g%F!^*ZMG+D4rvREx)5oWE*rg_&)L$@(?)u+4fCQWOR) zi)#a-3?xv%Gerxkln!a&7|+W&vr#^fQpfr-wB@>5I3+h;Bv~H5%W1t-2o1^vs^SA> zAr{91(ln8UNeh?>X=aOqNwH9@lSzFed|21W!@vPLyc1%RDFR;w8PO1BCRwFTcW+>C zxQ70r2eEMSofvOk!g%W<=QS-GpMz(L{(3o`MN|pp*!p(6eatN`quZauaAynaJ69Ql z+;P0z?RFudKoSI+4ox!^m0}peq1t7`g!Bn34k@J%f`T!2HTdi5Y#LZ$(b3us9bI6$QlA*Gp9`a#t*eW&bR-XSTcLi9JTXgOq%7}6x7 z=*DM+`r-AKFWp7u^+T$r%en=B@cr+`Kln%gB)J6_J33k*&%C0QoM{M0HPy7-FULzE zEOId$?}>$O+@+9uM}gC{)RTLyc}6A8w3OXag>bXQz&p~y9eQB4St;A~hlKQwuryob z-&;Hf?XY6)fxsx3sG!OZ+4Kjz;%t-@A}FOSTpoxr`15!P5NNFdt!uEm_G5MU(?U&% z?BU$+oEu)(E7&&Hm~#Uqr+nBre-;3&r(=x9tk_OQnDBR}YBL}*Ha#pIJ&T|C)KB84 zfAS~r=k>C#!T+~^{44m71p@!!KXIoD>rL8R2;>4GDK+|;Nt#pCnkj7W+BC}2EYo=0 zN)K~O+c^01=W*lTUIboS1qKUn3rJ_R5b}arNvZfkQoQ;os-8Ksq&%`Tr1CaN!Wstg zh73%;`8?>x3otv^;Z(!rbHKTGF!=Xg7sC(V`y6ojtDKgBOY9+Yc@Ayv47Sl5?7+ta z^_G1WII9C~Bi!e5Y;r01Y$ zxhH)S`lVFrL%(J+BPz+UnZbg}6o5xqa)f!hlHY2{LNG{s``&ud8uK~e&(5#>tk+2( z;Nz#}@H0;xNbbIhwIZF%i;8Ckjm44V;jWeg5~)a6t~F*RF6tE7V8*LueM)!V#yW=L zP--es?iLNV z?y-gkM_u{Nf?5t}GH{!AzFl?L$e<+CLh(}#?u3fT0U<7aB9snn($Gl!kjp@^ytB`O z-68S`kD|+=!=D1U(4RNxnJo;iKZBdMU&Xb84li-ZJKWvLsitO}s{S$~sP`uhf96 zRUbl)^^Cz=glcRM<>jcy-pWn^M(Sb0%)}rhq|t2-vdX6~>RHwyG_53pk(FL1wJ!`$Hu=qwz^X#FMLh+B`cSX)j4h+{+3q0w*f@7aUCy1hPX)_Jyf zx4F21kB!@@oGuXgH4~tTcgdvwki$)4$*z#f9V!xuP6Z=H`UY+k{;Bo4J5YyYy$)5c z)Xs>583ng1ncwwwW^p6i-;|pc8tDn?6PcUJbzhK5da}?wk-9WThe>r%G%(B1%X_b33-um->Sr@^7{15)F`?Nq{o1D&+7;SiHd>e% zEhLn%gcGDL-cr5E!k>Y_?qQhzK^H@7I~iucIx!|m$o{Um_lK9hr29po6LmsQ zszfE1{`tNB&;Rv*fuH=;kKjN5ul_q1D-g)x(lmF4d5*jbUbo|S&E51ioxm*xc#+ZT z_t5KE;BSi2Xvf9+vnLPM*2U7EVaLGV@{yBx-`n1WzxXph%R88hc=e6f@xiCg;?MJC zU4ktL_!ocvzic@qq|`=&zMwOR$&;ev#i{5ghzphcCAb0OpHEPad7*r94_KdL5N#0- z(2C$;t%?^JNXUgOpoFtmXhjKk=@oh+i--&%P;%FOSRUH}HW-k+@-5)@%bdk7r|0?| zc?@{qJ;0eq81#DyxcDrv`62^>ya2|uF>w(C(7hcSlXVjGM>*u9LUKa`Qk*|=lY^m?Ql4^Ig36NR9vb>J%^TcwN$-7F@dxS`*>}Q&==AU`jG1z$hJ7 zs?ZoBG0RFVKs=Z0vQfj}5Co3X(EKNE+^bZ}wc->k>*KR{#YTbW3 z)-~2z09vazJLslPZdi*XZ+lyLV`bwVg;V(^P@)b81{nB|2+4xV*QrVtSw`AQktPDD z3gS|!)|x=y^lFmCL?!`sRWGimfa6V07i%pk3Bs z7z{BL1A#UUKqpvgySmi*zC=J#d?&YD45KIryJvjyljm=4ylckQdr8gTyj)0k|($w1)CeooYLY7hj8 z42n@z58HXa>UdpbxVPi23hlVwj%7lNz@NxglV_yg)er2V%PL;un+%9-qh>__^T%MuL*AIQaZGpz z2R=Bv&z|m{fq!_VPBTdHL1L%mJ)G@+(hrIJTQ;dg%TkCCfviow-g&)%X@CFR72 z&of@xg-FmkDKC`r@;jwdx1t;mmofgg46se@N~@FPpQ%&%8Tf~$7Oj-&@PE?EDg2pm zIy6jjD={^)7ixRR$4%hPZvZ#H4-7Wlg3c^6SbVQ_`TZcU!}q@NTm1anzvoxuQJVhf~XzgzXP@*qZZ^9>e{;tp2C+)Hu)2=0pz+C4Q3_S`pN#(>yHJOb8zpCCMG5EfT3i zKm6ZPzrsfzTEb60bpQt!I*A2^rGyQe(?CA?8#UcZmmr^lv)}5y_#3&(uD@rQ=xIr1 ztkdeMWpz;MMp>1%mmBFs9YIs~v2MZk5RgZlTkr^%oLeyCDg4jZZ;tWu#snWY)yIY4 z7MzuZg668svhKRjBpdSdQCvtrP#!C=Exoias%qhxxCQ?oA0m8VwZ^}BbAp>A&vI^I zYDJClU~}vqqilzRK4wBA3<`S7I?kke+rQGH5i{y8@0Q|I#Cl`DI@@4|1OJ@3w64Jm zE38*8fGmRB_42@NBv{ZOp788-V0YHJ@y@S)@vkT;;Gz+WxnRKy4?=jS+M1(cO-JZqv%)4&!`pVB`56EZz4Q4&V0x zhDQ$bKG7>MH(zEw`xd9Q7Jn1p26tL;2#paeo0M}PsWo$~tRFi|lm|qO*Jo-IX(p11_K*Y{P6_MV~jfI=xzTtGG5Q08l_@p)=)jh)Nkl z1zpQa4>}F>P%{%x4};8dE=xus-Xf`||0{cc0&Qt>l?S3<{O8_J+*ng-fKVn8tk^00XL@YejvbV zEWnZwAS8t5p;W3#HCN8_bmx1|Ie&CS>>+l<|DUWBx>sJSyQ1pm`G@#p+_7WF7klq0 znPb+@vgMY!r!13fD9LwV+LKMlf*-oF7*gJJZ+WV-R$^W?e}&eaw1b!DrbvLUXZ;jr zV@+MN4x8{h0{Yf3KZnusY0Ta50Jh)qmIMOELqmW(ZWP=1x$c@jS2&p%PuN|H@Fizl zs~EY=nf5?ctE@}s%eB3LyM>G=joG4JFF8(&=2vHPNdGn_TcKOc%kwJD3yoAI<^1g- zAgP%QzUGRFS6efePREDOeFiP7QzTYx!hO|f-eA4bp^!md7q}wu>jdw7&x1_R4zGq+ z!?!AY-+SJT4}Rbf{>+d56)Y~qgDWhmz`p?KO~P(<0{-Hmf-d1hVf_=WWsUkgVqN?Vs0-E+#%3{F8ten^V9gh{q=u@5B%D1 zn>U8B6iml;1XAT#c4bhkjJ+8vydaaqLR{2Jm`iCy&E&*2OMwWbK;*hb>K#%pmjfay z^J2=|k79a3z}>h^+J2{>02YqX`)y&<JH003hvvH_(GW8rJ#~|9{DJOH6zj7>wF9o_#opFFz;Wh*>mytdWC1 z@3_p#op>&%jt?{kENk_*DxK&XanaIY87ldf`9@LK6G#! z{>+ei{12qdS*p4LPO?ip} z<|xyG9zg4>idXe>Q_`{RQ`ak=7W^mn5AbjR1Aptx1fRGV{nhdskd-@HpwK8`ya2x9 zxrG)BziZ_=N^YHE^mQ;YYfw-}zBhd&30gZdu~YNrAco}WA%g$&yRfmeM&`efPYlRM zDD*H8Is|DL_{SuI@SdC>@YY2D-53}E9fzR@T5yCHav^EMiN`7H63Rw4@e`t# z*2@NLDeuch5GCWd)k|Q~>A-3*JJ(|9FJk@0&tmoReb|5B+cEq4hp>9;DJ&g(3|Kr$ zn?i0qX+MV@N&*5Mb5vnW$V|g20%#7)LMiY&0WQ*kBL>>ydL`Ki)TvF7@v;5pfd3uD zwjH~ZWyB}|e}mB#%nVw?*@Z|LK- zD=+1?x8}U{1WbHCK5GrnvX*95doeGh%~>r1n8_$ur~snrb9IAa514^v*k0#HtDUDK zK$8-Po!WNjbpCR=alO$*^*nA(r66nQJbF4qrk-K6@qN}1@y;q$O7|P0F*A~@2VPFv zWaY|2)C0Eqy!Yj+;nlE(A!-5sZy)%%1OkdCU>PjYRs>uyp!}|Ls_xV@c-$4)*$E70 zu9GopOpMZfJy-d181lqXRHuwy&5LIthq^P9J)2Ta7SOJ)VluNg2nlDpa1664gg>Cegv<|MSr!Xmbd($k zyyS$j`4_(Zc$OnxE4 z{E)t}@m!8i?J^)?KUP8fBBuPs$D)Ur7i%Nfc_l4I_`Mb0%SakGn_@Be2h#pa=52#8 z28RLoYoZ2j_#18yp!^Q3t!&WA+|l%xu|-)BsZ)AIg)9llMwjVxZ*&q|o>8e=>vLHl9xJ^xr~>JocTJb9gD9qkm+6aZcvF zL9&?HHXnf8wHI;zeRVmlgCffn68d-TJnMBBX8aYx9z3?{N0AZ&YP3w@@VBeuy!$-`!)kL zIxl)!@Aw2?>7R1kI#g&^zV0wFsgHcqRNvN214X)41CTbq?6)@EavV_GiIybTRJ!I| zm9`c$sIJx_=b>P?{EEgMa#@&uauu@$mqW>Xa})LTfn&bHb%*q_`MxpMY_R1Ki%!RF zX!<3z$7taw#w+JAyZ7F7NXW*O7sCB{dhJlmn*#9piuq@rD1<5FBA4Cvi|5m6nGF+H<)jNdED~Mu-KBJ4%DfPh9oLFl?YWXDe*u&P8(&rgex=zx~(#s{s5j;TL}C1Ibs|AV{y1@p=IFA}HO`0U%*o58Nj3gcX-MCpy2J^W4?g#Lf{?dPeLq`tb_dfM$eDrreg`+RNjM4IPiaRshhV47H zV}9;c0I)Co_doTw@WfNk;E5-mg{9OCw6V0ClX@TaLQ}@OS$|fgOfL+?Rec z0E1!Id?UQ~8!Xf|xxSG$0~kFF8!K@^<_oi30p$2T0fPgs;{evQH<<=E@=l&J_?C)I z@pH=$jeu-GKj|MU&nZ%38x7nx$nGZU_mIt_Tn{(kdqnVW2i)wg00zz`%^q-3JgZ^2 zay3uMJMqtDv};_YRbaYO%4FwOCuLXO%fO<|%9petzL;nVr-exRo)k4%i-@!U666~B zMd*(2xo;PKIDmh9=ZB_!Ofg;meU?Me32w@DQU3bb6p^PlL6di{)Zz1Wu~u~DJzk+~ zT2*h}_sS*an<*2ZMA;Dl)^{DAOFjZWeR@Mr3m#28zH)wq7Z)dZ+s!k$ch5jif-mZ? z6+;0~ie{Z%?|6GJ-&W6i_aSV3VMj|(TXVXRwjSQo;2#Ds`S;FG@WIm)oLkRkz}eiG zQ>Z$~S&bQ~lgo0hd}kAk! zou$)#2W&Q6X(>2MBV0cLT(!F97eZIMfmRI+Q7*S&UrM}tOp7Umq4UhY<$KrDUp8*h zeugpXp%Z1#=bERv!`21GWTP5uW^8!~edSckIm;V86e^47{`0+)8c-gLBE?~t)RaBsinruDr}?X{E=-N!M=OCGzlOp5LCoH8U-&(M(WU1?_pBRApgQZiQF)&GY`cprIx4-jkc<%Tq{Nm629KQP4SHmu6pz(2=Ocmz?c(`->cErOG zn&#DB=nK&t_}~5FKgAEFgF#M0X;=hn{wMQ05sE5qlkR!JX9V0L6kuT$C%wutkGBli zvT*cVvyf=xsu_!?g;p~6y%ZK`$G-$Dokm(w&IcZN==H#n0RHXR0lf4SaP;$V%f|yP zMy)PM*whlcrtLe2HI(kH4f(2C`wxX2IeEFuAHvi>PekOU}y4 zl#X`gMeEN&{0QbbOdNATWKv^}Q?-w2u;RU=Z|lVluXgBl8-d4J42FB*!Xl!XY4|)5 z(bg!N-??nV0@mcQS_?`GroT{k=al)eFaL!1@TjY3B_7 z+V}3q{fD*}n(p|a)ds%AnC-o2X_qcgLiDhb5}z>&W^A!CP3!O zdW+vXxq+`=Y4DC)W^v=TrnH1IqMZ&EnCV$qmeku+By0Mh!$t~CP9vKsPc-kO3^q@B zzhmg|gSQOv;I0Aw`)32dxmHq&v&7?VTY2S)vM%&(=8@BA!kI>>o2klpN~rh+$CU%i zQ~FWkFPXcprIUb@`dQ?K>68i9hW4V7)iSO^Cc9$Z8~NWjyoiShk02bFh z(4B9@&38SF)tm3c!ii_YzR}YG1UwV+37bdpppb?SdvbFypjHA=3@6K!6q&$Pb zlT4+PYu(VcGkY<+_XuVK_}9$t2=e?A)~_7LaB>OTnlYEt5;Y3?PR$!{+Dfa<*%587 zT@SOfzt!oy`VD~<<)C*a9W9J62c^<>HKBI~n0f68R7TH+lBAuJqkN@WVp3{>FB>N- zSWus+mKyVe%zLWMDS+2~tfAWBh$9fO8g|-=oIAgQ(qg$I|5^T1aiSlgQ zFl!ibzUa_0>YIwyk4d@e)#SCg8cEScGNc} z;S-<5@BG21aQXCEv>WR|+G#K|oW-sH{LRe_$-E|NX}#*}a%#BkwnO;mKl2X*2>4gf z<&!7`Rl4;h4^tt_zaobwfsF+p8_{=iHMdsM?s*UU+LkLWHNyfmERb*}p6>fBupSTj zm;-LS8@T^nz=3;#%NKx0KSJid8yAqw*PP9U1n=PnY5m1O-fJ2H0KH?a75054C;lct z&^~ub8-!#oJ{?#xivIOd%kuMCC$Gd|IQonKmh-=J?f-&Es)>)BJtj$Of6>Lb)8p{nd?bATr6$0_}sD8 z1pcjt&5tjgTEo3JuH(D!+JQs6hnh}jcmN%7t6tmH?>lW`qp|GLkx@+iD%ql*@iLkP zKNtYa+jk8E2)Kc#uMp54Y3;;vi{E%@9k0D{h&P14xk1@cT6SM$X3ODoJGi(28sMM5ID%;QIHqmK8m%%k3FmfI+tbU!q~4*pPx0Io zvN3&WpWFUJPu;Yym<2^X5&7S6b_N>*Iw3squK~F%XvMCS$E^597OgwNFq~>G#+7#R z3z)76G$22LQR9zwro+c0N52E-Sep>K!5;61k_Yn%=gq3YAbC`bMmsIa8kt8i=*R^Y za3Oh)kk02g+qcCH$ul_f_-|o&;5E4A?zdszP2Y(_hz1SG7V)^pRXx1)b+i;=^ z;m#18liC`TTk;bP@Jyq2pcv|?8G{{U0`$rE30Oo)^u=ZM%mD@V;B0wKn(*8gJ*#im zlXlI3U~w2pp7n4Ar1COn6p2DL<6OzbL=&(WUlcKe(R}KBk$%L1+iX58ZLieF?dvNZ zrka7yl|0l7uH-BHQ~Ha(L7imdtR^8}tN+48DcNY7-bN~l~un0Z~jIyTvLh#skv8B%(} z+qhvrU=p1rCZ8wC(SY+~CpP9nJj}7c=V~KvAVdDY=auiV*8G5*clckg9!Y&=zx8K>`?gCFfBat z_BY|L{P>UI=YHXrVI^o0Of|4TSP;AjQ?Z>J^6sPyaU-D9X^*I+IQ}ivYc$a^PI2w4 zXx{uy=ycy`!W&I}Pkt>B)CGDKPxrm`b-)8}4{-tz_}rI)6Jg_N^<=mYbd>Bv+al>^ zGRDlxYI3|ziwOqwQVetGM>N@GAW#qcNDDeoz#mED^e*`$l*2q4edY=iVb&D1LS?F| zLtbeaKY!Bb-n1S2v#R}w71#Wo6CYR;4_b%Lz|9}V%uV+uXY_vg5~31{PXN8s{J|}d zl^9(Ao^p+-SUI$oUpWCUHhER?J5!{&ksW%l4BqI%*A51!o}lf*75t#E#n-YrpuK}&tJH-fw$kb9dExqx*vA=z|&Ze2!;Jfi~Tu|r>q`7(BJJb2 zyxEDTsdg*Zc|=p)a<#;iG?&(1RUswsRn6L)^@u$`LQ1I9}y zFj_nwx@^+PO~E(@UrTjZXPBh4o-g>7DI&zw-18IXa{9#cJ){v*%_RYD!|XROYsZ#A zq-j8h;y8DohXG^OzSHl+T-KOaSTscB-3>!tv+17xTItJ@y45?ebA>=t%_?3><6xQ^ zdB{m6oXdnXE%H$hqrCsF`gi`ukK^zEZ{-D zAl&O(=x2srBv~adW4VS4r;p1@^5bh~vh%JdBRjF!ch_V9CRb%_IZvBf*&@t&(#dVn zx$hi`jVUZxG6t z+gUvHhBxBR|M?$Des@0knJ?hCKK5~(JRSs>aRhssK*s~@-Z78u!`R+YbAL=S0Glbg zR{_9R3_tm|e*z!*=qGUO_^I**^R5*1^g`q3N1Jw%7A-36=$Jr~kn?kAa_5P3#hBWg=c{?0rg6}jhGyIY>Zp{@@FsNC%$VxZrnA~)$ppW>v`1~vaVUpb#b0N zOtdK^BWV_!&dIAIeB_yBJac{>Bkn>kW#ErT6NisJyNs`#UdQ*{y8{p3GMB)Tj$C1e zv3*^wk@`NN^7-;PFl8$A)7wJYY-Q~6m2(^TT09VBLf~Jdn@G*C**nDBZkbIcwXp5e zS08g-toe+H2HV!Ij4$k~VoT-P(N}38w}rH&+{C*4=9vjTe0H2kU1UOuR-9}JrF#^8 zQW>6U0f|FdEh#Fij<~X1rXzf(`SLgw?Y(rD+FIWP3~NB3Tw=$L_<*bUV#=^7=*4^5 z6vPTQDvrXT77-sXa6Ek$j}U0A~M%OA(nXTOGfUjJQq_>J$yiCgZ#@uxn8 z^|N11ZYZM3v`Yu4Y$G#jZ#2;+Vbf|n4l+xeALcRGbt~p?3_wlPybeI$%HkP}t{%rs z00Gl^E0#%VCt2oE1?$wY4y>)_HG<5u-n>UmD2A|vp_eq-;Q?9}U^-60?^-iB3t7VF zI69S8jK(A*&m4N9xW2-{uq;n=&ZwE#>eoe_crS!Du;%gS4;r z1zRi_j?xxy7Q+bu?hLtPb8YJ{(INN0`X=N$*Yj=R21Ogr*#^zc$aNYPU7(;%VAk=t z?I^6plh4AU!nfnh*SUn{IH=L)l6YLzIo#_`lJMIy4DZ%;~v!>i#N3|$Si z9;z}7^wo9e^@kt-FMkXl`Pe7$na_QhpHyvY8L^u(Jf=-Jok&$&o0uzNO-(Md_)5Tn z;d?eAPR+7IbTaq((e(sZG)Y$;K>5D-FqLueDjT@Ya8<`Xx2QI%l@3q}0RFlN^8fVV zAO1i7CVt@0{Y9KRcaDrRg7CLA9$?SSNASJx{4V^7Kly!l{@4lp>wot1c>1~LFsPCGc#kQG25cZ>~?}!#9QS&Eh{=I7cd%Yq01N=LG>nHHv{Ehz(r4Y?RteeIW zjW8(uNM#VS=&&1{K!-0{F6AqZrov>!_48fS8Ciw9dIJ93Q$YL+JKcyLrgq;6-1+A4 z_qs5Mmw~T+61W%^WNW99w4WO}_)Qi&;s1>d%&e~PAs-Gfe*My~6VtZ17-YYGU;r;3 zEaJ)MQ}XKsr@$VXIf&L^T3)iS>O?b807N~LSOB#al`U}r5_7 zf9`Gj@WwmlF~dNUeEU8q17ipEN`^2CrfJo`B_ z3#5h@ZLtqdULE6qd2|sE-Mo(X-aC(5_YSo^osoaE4eKeZuAd3MTB|5&p<8yFT>Us| z`aK`Y`I$2txVp}MulVog?GEocIERDtgUny9(I*P zCipi;$9Q6~O(w3n&obZiu-8?2J&ez>JdS{pjwEt+%a+Gj?j*e8nna5Q(SOR20GZFV zOmA$sJ6cIDv*h^OctS1tDjcK*J~hg~3}Et&CVtfv^k?Gp%p=6Kk?QZsbke0GM$)(O zpqQ{F5s$bF?HV==Jv&u!NB|+361xNnQb~yK#(O#dD9=}7AvcPfK8|y6#D&|`m@W6I z%ZyGo7Qh;W;bQw-6Ci^Nc<%H60T=JQfFpN3gj?VF=WzV_yK(fH&tbfHGyr{z;nU@G zvid;A>|{cFQ1PIpU5A3)a}VZkxHDjcb6C7`7R%?3VrG01+XgLpkAN%poVgCt-*$>s zZNF>rG0T(fTEwJTFa|qaw>^waHijfQNk<9R1ZNnbEste@iWVEfr&d5YSaTeGQ_z18 zlUA(6RLV|CwvB~mnb`@L=d8RUo1ISL6HnG=Na?re)#qgn7M@T*DMwRK^^;oDK* z4Xrp|@p-yJX3#=JhIk;2(K8M-$NJ&4P^H^VFh?j++zJhrZ(j|s7=HR^em((!N0x6 z*>a)ianIy9EjT;A`-gDB9&+i6r^W-rtKk~q@u!}{hd=hoiU4@Vh(Ux7?w7JfU*!X@ z6b>J{1%L5Je;7aeKm99gOd4FB4Ds+oZ^jS)=|6>AZo3^H{M|pqAAR1vgZ@8P5x%@m+IwSaUr)&rP#0XX$|0RNr=RxZ%Xxf_979s(Zz zUL=)?7X#>b?9qS|o(qV>0@8{rId^I_&qzBnE6V`@9I@Q&$j_h4r}~mv9fN@4^G~#1 zd^QCpiHpB$#OEKI{fc}jz+VInrD6&KB0r0NO;fg+>uW1OGzBwC)FqH4xrc^v=3*c^{nF*DeMq&#l4L%cZZ zaY_lWi^tr}z5^DO23o%JOe6Quqop35b{$~tABh}2wIc&Cgn!b4A_4<1oL$GyeB>y0*9tBVn?7;hu6uL(9*><`!$+Q8!s!4~Mhn47s*{(a zci>@7tUT4VB`v5?Sgt&JdL7SQ+`zl<+JSf7u^l^R8dzl-ky-Kr%9QOIb+R}!s%cS@ zxmNR>TbbZ9p=?JNCwajg{@EUA?>lap#cOYjE*(&?it7>et~b>xjh8$fDgcn&b^# z(}fHlDqktvkjDWkedHz4$Cw*!=z&BD;7c^#q)KbQ`fS1{CuXL9Ws=ZMBjF)V3oC2q z){MP%@Bs_(N$W4p`w>Tr5MJB>TmzW~&zdn6LD-qV1LBrZv@{rSc}AXq$z)0#HxS)G z>lpccxkG zsj_k``BF^>rlgIX?E(0^1-lR2hnx1_gKax@;L6o2IDhKdz>iOdu`mkoLtZzyJOS#H z-Z|8Jvv_f)jeDqE;&xEwK89d^ErYD*9-upLgh_bcP2VoO;PYCku1DWm$(I*u(&|im z!PM6>6qBvpw4%dO48cWOYg=`JVYO7XA0!vs*2)(vElZc5C9Qu+PsfVO)pymDZ^nf6 z4QT6@fpk|^kn0>}=JktDW4wF{I}W@7yYKj}KyF{ecVO zAnVOII+lA(Zd+=)g3E0zDOBUFUbIVtTzBYT<6*5hrjd_f7@uybcS6K zWXkzQjb-bmy{?E#Ez)#75J<&fBJlUbQ_tqlzo9~Y!(Uui_~^$zfuH}yU+Dt6Ro;2- z^96m%GY7MO5z@Ks)KJ4DT3*V{`^L+c;-k1&r>1=TUNsP-@~eX9_#WEu<^#xNQ3vUPs=oDL@pa+2Os-q}g4BBxxYlU= z=EKkZ;s@}N-~9ysIH8(1=@}~d1>KUHCN>XxLd|zk?or9V^6Y9F`_CBxgcFxSnao_B z!4|dgu@k59-~QD9SZE|CDysckIJ`TB)p93z3`Fk9J zzX|dtOwMhvv4-Kw3fGcP?v)dI*+iGLTH<^wz+cwdgMx)Ig=i)#=D{-r5JJp)!8`Zl zG+(p_scz=l>?`Z(!P5Sgtu#O>kk{IQcFtjKzqF8z+Oj)B8$F1@t*;LN-vHwm9*4X7 zTzDUr)=e~~i{NBz=dhp-fXrk(#2{Rc$Fs;jf{-+RlJCG_?n7raAyULEH3yxrN1%u`26$BcqRaD?|t1KeAk1! zuzSa#;GMPn-b=Ku6h*v=+P8jnQ|7IcS2yt6PcGr9GwWdq;?p02fBYv^0n|*MNXI2G zViHZAS<^8pdHz-a5g!e8`~Lgq@$i8;)qvFDV4Kr-%h$KmaOf}llt(H4N?1=NbKmo$ z0Fcp|BtDPi{NTPJ9yv6J`JwBI&zm@%`s%m$eHOKp^K~Mbz6-b?K6QSaz`yh1W?c1E z(O(7Y=Xt@K#k>*jXwT6R0OtE8IMHY+#9vnxlmFp^ymQ@LCAqjPH&9x+_KD@h1GkI_}sVp==R8z-;K@KjHYWfVgc%-qXhcz%L zNM_a1G?;*!rf~}Rt;aRI8)*K~tz_f_3FKp+gE3F>6POMpVS7(G$jK|0Z@9m_9^f(z zyl^-^h3CHV8#sOQYjD?Hufyx!`~x_9`<=KDHli+{K8eZtDuz4vV&BcTW8c9e*tzRQ zT)uc2r;a^~mCG+wxm+R$RSRKn{&C4KK&FOP>-&2haKC&Y&xbJa$2x)WZ>^JhR{>V*ve$7y4P`&Ct zbQQHvOXL~}Uw7fY@$iw4ebSiAVhRx0ZE5wzcXNLqkD@>fwz9EP81aMkmo>aL7iN$kG*t((ElTXOBIqSV1ndvBSq%mi9~U)9SB zM8%`3Y|KRa5}+ivk#(0)#_S3H8ZX^97CBFO zbt2weN(b0)BX50U8uvf?!|%tp zBJAF^3xD$cKZu?C4&%W$z6sA9KZ_6j{vYAkOD|!vI!-724hP$?XO^}8nsG8mjG$jK zNsNw+dDqP;$hLJ#vO?YwqB=zH`Kldp9)i3@U z_Uzh;_r3RB_{snKU&fID(r$H#2ZB8E9dBYSK(0aWG$wP2fK$$l?}}U6MFA&ik}>y| zhxx8>q^rSIxP_zeC&NZjSSY2_eWOga_jce&0RHX_0QTA<+~XgIKl9b_{vx7@aMIMU zj5W%dfp+5QzRf6|K?%>MVgmM&zrT1d+ICXn;pdD;J^Rn{7Ex$?)*OiUZ4VE!W2epa z$a9=@69Yufh%FwyGHkJ)L>_PUAUt+2Nc|tvY4afhQ7fnoyk=o_g5UVkWjuCl89(sG z8}QoOwueQ1qa@xdKG{y-vIxlvhwzd&KL>Igt$X-eT%X{R&n@GVFDzqey-lEB1pngN zH)$_<0s_6%nHPe(>FY@2F}6cItRQx2)Epdy3Lm{P!vFlGt9bpvIsD1{cH-c!VcCXU zhI&a+tm{z?T^nawyMQzoUkv$w?({k?uM;xFt%?IX8ocZ9HXPnL=vokVn^((PKYOKc zEjhyWQ*RvelF3?!*$aykeBi_gUtes~0TrV0*D}aV!^33&5Sd0aO=m!B1-e9L^V%Tl zPudZUYp2WCMJHuR#PL72UFBL>i8J!3l`Cb;#P=gU5j`Dlky;^azKz4P^=KA60BN=j z3WxkuE?a|JUf)+a{RCVH^iZBFylWMOHY#xwUGL=nmJ_s#-`D1)x`bN3r? z*lC%(mIWm~&^vLqSUU44#zB_aedH0WoO>F}=btFXzn6YbjF0N>4ft%TSv<>a1p~~L zjW4FXnOBHHgXBTLyoEPQ(kWfrdF?yXdGe()6nbub0NV08yO8phEw<6~K-^l32ZhW< zZNRW$Fv({4J+x*>p=7+0ChX$Ol>}|dUjl=+QnsR~o^{8m>lwRS5o%zSNSDkO$R-}_D3;Du9=yQXNXJQy`mGDKYl2Ap1(%fa?D&jS0z+6Fo%!+&L4!o zPb3YY|Lp@mmwvZ06k32X_*C$LmTxNkDwA_LV*h|EukAxu(Sixr>`k6KyI&ZJ?a-3r zV*7H!(Be4QRgX+CnG<9`6LpSuU#QM_>!=c1s%)rIO~8GOP41kbWuGT5JJxIYuq0SY@_gR~k0Zz!|NhB8``7r% zzxH2!OMt+C^mqO$KK!MV_|lUv;G<#upE`CtU_FyGMGwN_d+$tx85cL;*c>rxAtVhz zJ^;cndJoI=J+>rtNJtjp{8D#7xy|i!+0eXKJe=w#;^SPf5ead+3&|s z{>`li0^^CmpZ?63p_6YKd{rBI0WxK~mOw1=7DeBY#sqbR$Wmr!mU*q-T4W{#T3(aT z7@vi{UcUmIdxn6$c!)<7M7P}p9C{eI|82mIn*+iS=8lt(!Y{r|K9|yhtSr9^G!qZ_ z7_P2m0EJJ~6^%VTm?MFK?B`ET_Z96CJ{*Jqy?iK00tP`EfqAE2%!%b&jw|(xZf24u zp`EW9(-w_3mC~8F+_2U5&p>m$pU^@*qAxSM(cJz9%-;THterRweD!0%^2t!lQ35Ta zR*avp34Jn&1C=LaJ>D23aB#f78eXr2?wt=vz$npero?67og;4_SlGYysf0Nb#OCiOU zeWNKyVLBI!@wi5h;9nD$E8%7seW!AIUpTRjub&^`d+y$Wciz4|`7o=il4Xgi9#uSF zJ?MLXVQqrXom$7yg|V4=0!R{u!*?8-!^1buU}jLPf;!@Joi2duo@@Op+}js*8}vn% zvRv8l_^neTeDeGlYe`F!T)IW=zxX>zU@ZZG5m1^iK+uYu;gL^qR#yp{GikSZ*YOSL zT(z0xjF41LE^yVi07`ICzHzp{v-U8r!4oe|+V$&eY0L{})`K#~Ytf!I#M_qmT;fF0 zZ)lt!n72C~-(Jif(|ArgiKOW#gM#^T)>b0=_B!8sGj|H#801PegQCK1I>?jqiHvC^ z74tOK#`*e`POc8FNUj(pqH@sMSKVohVXi8qxqV3jM%SLN4XR=)h+2@r>}uK5F{ zKcBQhllTMkVCor%-}d-a4KZ+y?kd06GP1iH|{*0yh5p6SmFV=G>HbR>(;wa4+WSorpL z{6Nysi+@`gqPC&cZtRfuwEkBi0Voiop6@#VqRR;u%(>_HS|Kxw{A8*on3oU?m?efI!&eg|;iR^ZYJ;IZEczt09bxr(H}QGhjc9sSwOtgXO}vqS1OnY)@( zenCF{=slbKiXT8!r~M`nZ;;ML!R#_j;lM?Qu%1mk z{3EngG>>bVjr7TA95q)CVP$=T0aMaGc0-q)=$j36J0A;uxOAXE#kk}DZ8`t-5KRA| zuA0Lc@mCaA2)HhNrX_4Ny7-Ac4?*z2Bqi1I0?Oe_FD&EP)2sOI2Y2IL5A4Fu?Q9lo z=N#KDKu6@Nr|)`pK6zyWzxB0+WbV5W5V{eAed7sfJB_6~LBM5#UpO5#A7j4b*z7m< zX)IF*^fJD5at-f)U>*N{4@(Yz5|{xUvvd)Q@V22-GXUXZG9){ zXKf?-p5$XQMq)d7@_!dKW(OM^0rwxJ1C;3Ctx?)wNaH__=?Dytql3@@0!Gd32#9&| z&PN*2v?1e|$OPc<;{L$r7Dz?2hYZ+_B$-Qj9&)^aq?^yeYaG}#)^Yne2B;z*9uxSd zb)|tZ_R>1UQ%9)*2i!*ld=ktzfk?7x`-Kl&ice*;fgpr1!^F===kWaFCj)&1AaO7k z?$^RtT*XX4!H2U$?sb=~7!m+#bR7!>DuX-pm^XxV4D}3PWjuCnL3gkfKp0RkF1c3F zMh3sPLaBKML!>7EV$gX$Q67cXsHOKJJ@m{CHV>FMeaxaG7npiTo-zPb4UeyZ4j*^s zrYwf9>TRl4)X5sKLN(=_meE`|sBcaAMofVzT@$am%phD|E$Ze1kEzkp=^$eLA#S+y zyOU+j(%Hw0c2(YB=NuVpFy-X>>)g~p$C%}Exlj17)lmQerR9Wfq3=TB$(wc*83NAC zi4_e|t@X;70K;^FK6Ay%W$BGoL=0PnaXT#vgJKr!Cy>)rtiwVP7?eOzld(r1VY^;I z2XKGN)O;cfh5qm0rhIJg`9l2{{FX< z6f>C2fPkVi(LWz(kfy0R&v&Ec*QOlKM79jNOwN?AlL$~x+@-IBKE_vl4$GfBGAL~u zY}%&6Hy=p&@+xbgQ%tFQ3oESEV=7NFDEl9nKDhci_gehI*Drj}J;!l5m_*h7S~65$D6A4sTWT`SA3U>!Pd>MVMPu$O zhkZy_QeyRk6mf;Z@#pE z*BzWqX2G{av*1ix(`P%6LR_)evCJ<=bKg^IxVqlvt_|Vl9RoaacpGlrHBgO8ea{*6 z8PB*W<>=#>zHWQ;-DH_Hs_i_)Px-~B0Wx< z1Q9Ioa`@IHf`UBoXG!xp#-$VGo4kk@mI!n0%qEi0?-eLz`QCyog@&Qj)8{oerQKvL zbDg)?-z$h8h}(w<@=c;!k)#eq&ww@pCbOv*jX zZNpgJITcv)7~t~p1E+0e7)UKopyHpr0i{Gy>`X|r0u+ytC=#aY7rp`4ivag&Abc`~y`}DZs7s zUd>^0J=Lv~p=(vqC_eK=H^G#JJ~QLqG$ZW2vtC3!oIB9L(fl7`&myB0Y4U_4Tvi``w52_udv3xsWb1uF@x)>y4KegVki~y{T8; z1*-Q~GRWgio!pj<{nlqe46g9nfXrQMu8eAs_q>*B14UC+{Fom)6vW-v$3=q0iz-zi zwq{C!eb4t5U)ki~%z{<~buE$i#iA-jQM&i~{JM&#Rdh)k@Vnpt7xDYQ{qMF+6Y%X1 z--BQHjW1(v;IS{7!i)pB)2?Eiz`qDWM9sg6nuRJh;*D-u1q5z2Po{Qf9wQ3_ZU4q- zZ%A2c-zmvc5sDKXw8KnKr8+jay10xV`jP({ANtjQv1K4&^aJSs`7a~$&s+!3<5~ql z0KQ&aIEQl4kXuRRAVB$2k)C5ctf=*O@!5cSelegV$KfVp_-!`=2VMi*|8_F>Jr+Q} z%Gx-Ae@XL)i`tkzRo8|to8MX?-;U5c?YR#Blm&<^fV?Fg zjRZ6I+Vs4R$w^BK_Et_*h#$13O=E%MshbnNAF`|zfq`)U!nrm4+{ZWYraN}vy|3Sk zLpRL886FH<7L>Dt9no=~{K~Nv{KqF2aQezPnTC!8_+!v-+=9(VL0Ue=+#i3X-)6W}-}v~(y))Buc!x+I^6o;3o~w=KSSVhzt;*uZz)xdZPA_1iJqbY?@? zdQM@k=T|29LID1fxvyajb0Oci9-PC&H_fJe`$QaNm&^kDc2Y-#)p4Pn{cKqsqR>0WNs%5vh+>(%KaTI z=7+3^6MJQl+A5v^Pg>a2MpT{w@&;W1?n34paT6pwkJ_snf!{?xf^qw19Ixfn`;^Nd zX<<_vcp0RWziZfcqHNT*C3CZLEqopaw$GeRj~k~*I(rqjVd;`0&ey*eJMAT$H^vRqwNcn zY0JIU2=o>6A41t^UysJ~fOWOyq1h8;d1d%Zop1Wi zmF2Im0c>qMS9PuEy0`wy_y3qBlkXx3c;wbY`0@Yp$FLP4nE?j?Q0F9eTmP4nuXF&QwRf zWr8M0o8W(INU0e*Qrk&xpJZROtDI!f=RpLvW!E)om9 zEM=s(F4LOl2mA&F%~ixMZ>}sX<1haB-^C|B`oE-;gEu?G!$9u1?H0Uv{6u$vYKR5m z#fvZfR?$0GRlqE0fxPI|U708|1$k)_&3#`2PJJ~X3D1Q4^#H>jKOFGaZE3M@_fUlykg=jj_cuABaq6}8jz66 zIMjLxKqzLv$uO*ybi|}r+K+)jX_rRYhv$eCU)qY}xr&nYC|qIkrZE%35EkEqusFZ( zjhMUZ%@{8%;?fsB9v1Br+OCNt=~-X&Ba=%N$YbI+HVy*ZrF}pH{S#|7e?QB zJrp|tso~r8jZ3&;_d%?zULoMq^C3iV1hR4MA=PMv+wlD5YPS%UF3?@)#edq844rAN zV#rvw&72~R!PFZrH&>n?oziDYE}%MX1ZM}NB|40NS>Qj>Ja!ll4GDAH=bm4})2CMP z-4E@-JMZ6x`R#)u|C$deTL=$MT;9Nk9=(DmPp@G#A^fp*5& zHopUdeFw3$w2Za!B54CgFfj5Vuts1i>rC8{2-op+@dy@%_tAvdrBj9saMtY+&zniU zc;z5IPwl#$Tp386a|f%OBZ;Iq1J(lfX8t7}$mb;U+)Z@c@}^SU3>pca&ytDwXWFr+em>J# zZY9@cD$bet8L;gjCc<>pVmvW^A^r2YL>g!Sbn+OoaI2$oJ|BN zzQ;n4!RB@y!v6c-i_?#P0M2OF+4Y96%H?I(PrEtOk>zbDK0hmcV4uWzVIGJp(G z5RQef>aV;P3x;{}c~BcwaiWW3$7be9w2{ zAN=Eg+QD(A_CKIZ*h_3-ggy1k6KtNM>d-ell*wKrva9nbUP^|UXk-G)!^NRo{g_+zZQ>3g^xYOr zw&bn8jPB6$jRx5bb?B9wz7>ruy{ePBD+n*|a%Wl*_9h~8YZei*ky3Ai)steJHcp&8 zga6B4`MdayU;Y=^>~P1y8*pTP4wtW74tcEv>}MtJyC=cQ8O^`O>>}FP+3qgpIS*SC zMA*>j)v1+0mUc>N%H-m*Y-@ydZ~UF;Ab_s~yd=$}lZgNG00MsKSN|t$Mfkz@yc0k3 zKYt(rH(K~&4wQ*AQ4F1@Ec#a zghyXq#`k~QUOaT`jszC^9=;QAmqR=K{!fB{%OJ;*neVbl=8;9mvy`H)0X$IXHK7(U?<$uddy-A^`m|y|ioi zI~vV>kFMd_g$Zl<8BmogeK32D!zxnjcc9UUG*NC+K1 z#CbMp3o~paq(n=fhtdm94y1s9lPD~4?L_QNp9>f0$feRYeL$ZD7^UsCG{`bY&5XhK zt{$x}7u3V#fim4UH1u>*B4;1sV~R9_|hkE_ziyn zyAQtwS5JI4@bHHDm~ETfUbz{3X6UBD>>(nK>)vWTs|K!U&Kn=H@t=n0Z!d?C8Sqc4 z<#c=lg%twlG(<_p#aQ#zu<4^ixT=4-6Von8+T{rQZo{x3o{RuN_kBipbAfv_e!4V> zE`hq9(iuXu2xGa`@}E5D*mKk4==g@AQeeZfQa?>-&6Tjo({a(;kH{3rN86HPZdCHfB$2|MyHcaQ3eF zF88MECS{|Q*QUWNvyrlj_OCE&hq4~|!@9!NGc8Sj$beh#?1`-kd-fl}_M0BY+SOA* z{<|EQ`$iIm2D<2_{4)!-_t2-c`;lUv(y!11@ODN=A85Wa zRU7&fauR{o*E*V+PyEs69>u3W`zRjyj&H+ehj+j24fvT~`~b5>&wRvZa3lV;PNXc* zB5Taotoi0(B73O+r}(&SkrP`2u09W({3>wq1@ciBfwX=10uOyJaNu^}%rW>EzZBxV z9M+9z!&e&>FO0Ww(b{6TvX~D0P@jIvU)Zmo_3ziPxo_pu&wJ7Mi_eDXm)1xw`T7&! zj~0#tG6QxqP=A1_@=fO10uz#Qcr(p-v-AMr%Zu z1CnXuS(%e~0A6T=g~j7IaO1;ap1zve&*`GKg;-6?9N09udb+TY5hFYZFte^F+Sl;_ zIV`jo(?;2#V7-M2sF~CLoY#PSEdeg+dXmk4 zV;8rQZ%l_ZFswhhR1XGAoPvKYW4_+_Kuqy6KZz7Eu;u+^H5`*`uj+9xQ;)3%;lo6*aFrTx~O5#Iy1ef8)wl@TSon5nSN4(S?G?%s2pl zr%xxKt927PFev)^o2+BJ9(cyCo!D{v1GswpC{`|>XOJu+{#@)3_RhxKRr*j)WObm5x#(STL15Z3<14pvl~r zfl6(DSMDA1e6Q!cD{Y{hGkA>ax zmDv_?>;k}=0LzCHv#SBupJx4VS~FOtt)IAhAGZuTr~r!}DA3i)ny<}f+?jDh`i<)6 z^0xr&slS=a+3`>J&U_=9_0TVj)~HQJW?w0PQ4jiyG&xyc3?SgAaLfJg#nOf6Fj+eX zCkL2$Z}_!n2YQq)ZlsDn&q-1U=S+=!L2}aXJ{L#DriSI|mPeLri~|TS=>r`+h6^j{ z$G#crH(&(=e#;1E>OH5d)>r-OOop=9%I3QXnFRTrNv6T+%P~7lHGrR&Zp`I$_M%e@ zJNWENSNxQ5Tpq}|HMSuv7bH5%X4XWIMPgqG4YnVRc(T5tT@3N65x=C7VOCA>-psT3pk zzbl?ytN(5FZB*SeDVoRkHkTpSUV*hp+jqa!INt68Rhf7*UhDKd>WdBsm_~mEv)!Vw zeEFp${BOVIeylEC#M;7XjK>RM;k1!_r!?%aSr_FNtu?;SNHbENBlo}I11kG;D`Eag-_mF{V(wAHN}Ns61@fR#IP7ECW1 zv?A*N@6Y~gJo3x`5}O?kAD9o|-*Q@9(19Om8O&w(+%FP*r-?hmW6Qcggf$qUrhJ== z;F%1|L0q^3VP578ofiI4Pzj<;bN}r>{#ktDBfo^r4&V9K*DHhbvO<;L7+Nl8LkCH? zxX@c)q^bzcpVS{*p1hr*tJFYY@wa>$IQLZo|26^;=;q*VxF7zGFsB>|0Q2e<;0qrj z&A`c(l$TF}GMoA)z^+a0HdtT9aBYRb5eD_(O2Dr;+`|BM5#V#IL8#`yj9?}3PY(LX zegO$r60_j!8&H9!^h`Q!0Pzb;EKY#90m_Mq5iXsOnv#E|6M83U;WNAU2Hf=Uw_~vH zHe5M*63buu7}_gW$P_QJf(fU?V@UFpgF@0GIlhYv@pWw5GsM3AH()p%VBD^8H#O9U z>|2fyj3~d3Fq$l4Y2^%VzTrlkzr38xs%ZgD%ieb4=r9r1m}_)FioAw*C|yh`ukX(5 zz8=$NUbm0++Cf2dKn?Iz)r{v6s$az5JVZ-lKj=1nn=1ML3%$r2NdC|-{09(xZc()@&3F!{v$-yJl*vp$|tPRNelF{8jK2XVM^}?6)ryRwh z;va8bCH_3&#x;K-DGO%yC}O&!z+!H^>P)X>C75k#$jbH%g}Uu zRhzUPT6V{6BK@PuwG3R^!ChrnpxQ-UEVcXMBd7DG@A5|9!$?KOF!jwo<&o%h>D*IT zJM?Y1>8|g@sV6@e)^Rj03N1h`qsod-35fYmMKTpVSkWNSw3kgnQ&g#$w{^{}-?r4= zGEThrMc;V4d&uRrrvO*fL$etd-Bc$JnOrG{dRi)IJ`QsB59q>ooYiFVgKv(>#nCctr zly7X3zWS}NYZ3yg@2fep_^u`sEMN4q$G(8WtFnu!v$`Ej-EOVOVx5;Rm_XoQ={Kc(ScZRKBmr zYfn>HpB+L^xsA<~BKc{$TtHuBxVeFaqu#+F8xe-NNm->XQZ(`l=nFY43u~y#&oA5j z?lYhNO85)l|64Z~{J-_!o^;ypAOH;H^RLa*7SEG1BTvI*w~)L|KGsyr5@;XIxS~h` z{EOx#DpJh+fu1VQsm!-xc>L+-@#)V!ibvkIxmtjGckjdDL^%#Lx+xG(pUk`t00RCn} z8ZUnhIQDs9?NnG~E`UzAh=piOc>-t=0I_K9i=?3@@&W^PPPF?3^rP<;3=}h6@$r|M zSO7hG=3AE*YY80^-%emq&@lk0+J+AaDR|lVFd8~39|rA4Et?ut650q9K?_&&SN0{Hg6MJ^e1(0Yx z;ENjptaDHyp6wWY6XA^}^;Mfr$sFU#%5mIz({3!SH&|KmP!qP6K&Ey;z_nA6+OsB~ zFAnucWl8IhOyg>nr;S&IzGs!Jr%`=wZfa*^0_-xsPb{Y)jh<*i8~x;^Loyly$4CRP zNhZOKEI1m{28`Dmp?`kmGZ*p27nX74ra64!MLOMA_=12#1oC;+{L4Te<(=Mh71~yY zPu6XiWTt>(vFx0>uu)@2rlVMXF>e-)s%Q!v&9zg!hQP_FiIx;=V#<#DF(i6+X@XyW zVi9-ko54~5hoZkg*N7IO!-1UxyzBPuxOMjsS#1KAHEI_r>E~i=mt}ci`V87f7M-s5 z{qKr<;o0Hu6DnmWFygTeZ^tsF`%7u5{|U^cUhIm!2m47oU-r+A-ONCf|yjp#}t{H+GQa{O50 z6_M}zxY;vaO$Rd}`d3Z-AkaeK8%8I3GQofZUY3GC}a=ui$;OXcdOleF?UoRoA^i8B9zvWG=&$^_!&T{ zul36NGM*vtp($idCfYS1S|DB!vC}~q9LWry-9L;%xd-8T=%~+HqZKA#1r&VooiQV{ zB6Xw#o20WXO(2`Ly3*7bMg6_DQ!x;-z*Syr5=Lkgbyk%T3}M-|bK>uIzVnIC6f%%7 z262Vbw}y5m-J)TT`@PrF(WF%~gDHWAqN#(;tdiSwpxU}iebAQmaIVXXyf4LWrD6Lp zUs^w@zIbc-f>AQ*G>H;6EC4J0(Tdz1^9tkj+>3vNJKpr?asK!bjIX{#d!1%N^}?KB z+pg8QNUBqjp?>3((Yf4y5E5hV){rbBpX&ON%iyGKy~#q7Ye_cAt_3KOVbO-JEE;mV zR&a|NF94lJt!rpPbdc)AKj2(qsE+-+xK3Io=e|aBog$XS_7(fEvu-beZE~>1sh`(z zdP1$fS=3glDDQMZRYflH%&2zn*snpnI-N{)eD4iqUk5kY)R61Kw}+MEgr+gQAsk`*;ahRbTOPs2++Mu+*+_W?8G1ib6wSLn|%48^_@+vL+a3*Czy@vHsleE0sF)AgLd;>>S*aA2?4Y!Fqs2WB59<7PhvUX{TN>O`g^4 z*P}Q$MPvuz=fy&SC?)}G-fVn8(5o=SudIQ(uuxuo&JFAn-Td}|2QLsmY6ox zN{pXHRMv~Q?epxGOUm zW^H6CFTEVt#agJ_DDju5%;Gl!PY!%HY9qVRh&FJdW^nkMM9uwn4!7QR8?Id0g^OoS zg=izyjE??&V;b-Q44j0Gpqbmk*oh$ETzD7P#cP56M%M$R$?W)mi_}m}(wpU~NQJ2t z^wd0@8kUAxtR<&JWVfX;w1qekawGcbAv zXr@#7#>A;)&(2t{7;Y&;`CK?}%YkZu_r*1|t@RLI=plexF`r0zt8&)7L<=wJ$OfJ7 zZy!35ofW|Jy)$z#Omlcstqe_z_9}YY2fTZqpE*PO9+Iz>oz2%wgF0=ewjP@3|aC5Uxf+>Gubg1ad1xe}Ins&yY6Y82KbU(};bc zAb3lv)xZFA0SkAc`gYoad9#8YO?~%f+!puX!C?k&QBqeYYlv5>TPNzQW{fN2Yq|#D za#i8<)(*;^O30jKkm$`1u4hm=bR=5g2p+vCd;yr+-4UBMKl9Z<^O8Wg{^-X(vFRrQ zM-4#B^XsOpyH4ZPOh)3nOcp91p`Zr-&EQY{{#yCl@9De#$rFY-3!l)80C>Z^@}j>Q z1zbP-=9=NUB5huX3*%v2Y`1F|U3>}~3#T!^{~qkW{Xr~VK9A)KN5g{SN-~`oBnz{~ zfYH((%)srWX;|Gg$A4#Bqx-PtJ?UBYonjTo_1X+*5wLQhd|AjXWvzK!!%8(W0DJ`u z%5(s9+D?XwnZPu@hz>cM+$QnaN5Z)O$A9l{Vl%_uT|1K5pz~xxLxre$EegS+uc^1R z`C+=g%1`L0CYk)m3iElK=U~P@^9J2;akRKs%?=JvJoy~1E-Y>OiNJRpz6Ani$&Q3q zPb^^(wtN-XeF&J{8y1M?!bjqb5NXDyiblWF5nmRS0kiU{3M% z4EhNZp+%*f_$%6c1X_CjO`3jku!k4JP}2JIday^6|1^E6y9~ZY$815HLf;}Y0GU`4 zI@FRw{aw3o>vz5fbBB)L#225(`jejxi}XcuR5xImGFg?h+(+4To*jB|=5bNHhS|C0 zurad}+jneBn%RC7!MY)}OxtobXhEA!w2X_`gpLug7c~UZK>(p%YvTo+yz~NYz2!a} zJ-LK&8%^W#sm9SlE@{<;vbq5^K*FvXpM`8*^W?>@nJt~q=F>oCb*S3YvWH4cQ;|TY z3exa%EZmT>D{INMyu6c^>33xrQ^Gh5i7%Ynz=w{m;o^FmO?=~N%-kRG zG-J}6b?UP*J}3W-z5xC_(`U4 zMY%>U+pk=^%iFf(jRjUzrjxoS$P5>beF=BI@kcPb`*!%n=aF`S48Z7M>g)~3XyQ=+ z+EzB>s&7t*Z3eGxpA}|2jU1mfeVxtIlS~nxwMu7B>pRSCL|oEZ;iiYg8)OLf^}4eZ zZg&?g2w08_5)P8@grp5P0}}MckR3dae!4Gb**ccZNtnDLd?n<9lD0PZp5oO-HILFK z1;fb2b#*f3*sGet<>#oLSK};aVjgwct4c=WR!oJ7(%Wa79(+*{p5wu@P1&|p_uF@U zz?zbBFKKz*F{C`{`Xe9vgG~nj;~^kgBvXX+>&p7{@#R9h(S*M4FZ$e-Y_x|=>!$4` zr@lbRXWCAT-|pNP9$ctzD~mzSsr;E9T;GFND(N>9WHFAkT56(WBSgI zY@x->+6o4v5rZm?XGe%+kzJWnYKxaJR(uw?% zisBTENB|z#w09!@1EYL9P8wxv?PZ*}^lShD@4?A4%UB;biT_J_)QwF74x=heGaxy) zF_zHD|DGqU8o z4>;lXsdpO!JsUQ06Gc#-X7rbUqpT4q=Ax;kO_`)GMC*u^^dK#z@|@)|Vs+-Ippq|{ z@3SV0U3hu^-e<-l*rNPF?;Q^B8US`ciNE4|@0rJuy+d--0mG8CQ_PQH-zvwMZ+h3t zxISLaqG=J|_k3*j$8a>7GrzcsXRnNt#ulB#95wz#0}yJ4O=iFOaF5o^?i1-xxC-PY znh-FsTtXP;ZRpjTUuR_PqSZKEnd1fEQ~A800u&7^8_L-<*ekn8hH0Uq5%_aqGhi6^ z6Rs{|@ZxjnAUE%$YXAb|+Nk-ru|b-DQTsS*_e~}QWJMpXJU_?r)rL5Ou*N-n@5 z?8dn>C)2t&ZW1Rg@_0Hht|XISKe-e@z_95QfIx=;0#3Fe9t5Ul!Hy3D;{!YtBKNs| z0_Ky(Hc$c-JZHDIZQJBm5b{3pe`Ju{$s7z$oBW?8>jXz9#ZyWI5>gs%GKoe*&;iCyyQySLVasDD1}Lg zoQZ;rJLwefUHMxuYm;wd7#`4N2zD(#4P4WA#l+Fg!=|NUM_P!uoM?U8!RvamqFe3{ z&w#ytTUXVyOzq1A3i+Jk74D#l5*RM$x^HdByw~=><@+V$v|XG^!0X|t>A!UDX>6=s z#mz^)9ml`+JZ78h-o=8{nGQ|=Izxrt8`8)d;t9&*`8K6v=B=V3bzNL4ItZ=Tq-pta zF$uu<0AxPus@AkvT=A>w*Mvm6+?cM)Bh>_|%^Y(xtGPqU#gH8c*E@{s0$;P#n-elA z^5BcSFYFY}M$?d`leoCHfL;4;!_5b8$I9NDaOM0<*jTv`WWhBI<3cM6O{wD?cr~6= zcB&}SZDX5x-%I5ORpS|Aa=veLlnL4ig+Jq>Wi@-K#{&Ec}on(PMpTWuh~2RkP4|Dk!-nP^_EMTGlC=N5)f*`x~ zg-JLUMlI%a&M^!?i8t3y>*H)+)VxV^qD6-@plG=I@bCW7rUQU?96kucumBahqOckk zeo>RJjfZu-8UDhH!20>HkP86c*{=jt@+dI7C)}?AD`&!jae@3E&xVEFjduh0e^&qw z9|*wUIpD=V04_X5=DzJpYFS^)Ng)ivqI0;mstY8UuVkaZvq`TL;LQop7vDFm@y9$# z4+0rzD+{>iNIfmQnn{3{Y6QZV2dD2DKumq=m=2MzO_7sHA}=tkmtV$umyl@ z_k;HZ@bArG;k@q+%p2@F_=PGmU!>=G{H3RD zCTnpV?u~$yxDT_ubXWsx`^D3LNk(ApKlTfl6eER~MmlJD6i<+~4}50bY6|RiG*$1R z3m>obWRojzs)Ukv10qu(Uvqm9U`h3Bcpi1~>+>%g$LnwU)^XhMw|&OpJ@?Mz+YW8Z z=Dx6H;qnRDS8|w*@6AOYmzMgwDt;$VKjmXvAda`V(c(WIUB@4uUQgz}3FuQFe?A@J zF!622)Hi~ItrP!$GRjCBFav))hl2X2HDIc8bW<*Cs#(qro(@>|wjE?ckFLo-qXB3< z(;D&^u$3>DF`nIo`n0DL73?Aknza8ygAC&EURi~E_UR;-MZbUT#2nHQ06-@uz~eFb ze{ER<(6cdXqNM=%w=Ve$jfZ^f+%u2aZFk{(^bNSWoCwN!ndu{Ncsa1NrBI%*nKXM_ zIw%Bwd*D5@hzE#7Akc1dIMvEC1mvk7vKA$`4XhtF@x2G;jXo1n{6;i|WJ4sjTidEk zCo`{SFput9{*D`3XkKKphA@D5U{2KhOMU|5W>(x(YQVCJ*ZvgcfW&(np&=^~Ws0B! zN$4pHf=YLN<0?Ni^_KQ1KCoQWqbp0W;;YU7KRQ}>cix^I$fws7tl+;I5ycw}HcMh3LmciO?bhh165#YeA7RpHT7)@D^{&$-de77s>hI5q$ zoasY&9|ocYku_2g=&uCXD(^xG|9Kn0+VY8q9s9qdcr0{At-z+?@h{(U-#82YLHkMPTiuC{4dRVx1spNaU(tr4$z(MwzJZ-L z?!aIW-o=wU*?iU6&89@lt{83v%6ZU1c63d$DKApn1dk~1SQ%ZyvBjrwsmO^%#~Sb6ZP~i9`~w#YD*i3J#|G2tG7oSyl*REBC zoNTCBU_WQCx!aVubt2bb`4PbT{F!z9=F6*L6S7T^dD8f6qj@Ho0~6@y3txX$%a0Cd z5ffmq98t0+Z9gi#l|l1H6bW|TXzWRAlvT)^J;FDfrVW;Z#9c`i4`m7K&9_#hq2E?n zMZNEo|yV|2qRn zBF`tnZ@g&-x@ap*#1}=^eg8B+w778MD>!)1cVgH6`>=lck1%Wo+N%1Q%wx{3*UF6{i7o&zbFQ*{nj*eifZB($biGvfPY**SKjItdATQ^oT(QZXHt(F;b2YmbU)!?&i( zso#5)yAnO5r>~u%?^jIu8o?F4t^Sm@A`}3I$x|xR3}!GJC!Mh9Kljo_?6~1}+;s3k z?7i^-&Yt`_Ru@iT)GnnHU#|N0UQ%siy)-o=M(>gDRFd_Hoqj!1|f&a}9RvS|$|B{vrds8FPl4WO2 zn9UA}WIzt^#SE*_=TQEbOHUd+Npj%s@H*xxMuSR-V$I;({sxTYe$@3~c=7mC&tubr z%xU7^C>4lJpyDEGvILxX6qvsexc3oY_f6qG0D6~B(YvTAHoFbja}YT2AaKhAz(z># z#ixKXUkJe8G1B-;ex723Okf6OYTd#5Dzgt zx!AhQ*g5n zJlmDB2xpUA8H4P|D|UZlL@rwA@&FfeKpE$TM1*F&@DGT#1y~N@HnJMp6Xw~pQYx4o zQ55+iq{R=l4*`Qd9XKEdl_ZcaJc|c-3>@@&#>IPjKXmkNz*W6t?+m{GHM?-1g5$Z9fJ6cwQl2 zf0Tt>gXzKZ%DXjrl4X4E@Dg~g7Qy4%aXt_o_0mQ z&;c{FffEV!z-<^C)dPUNn3i0Kmzyz!%Sl&7*_xbGIX%792GVqkljz zAYf}I-U--yUhWms=G0bvnmQU?mpj8lRTHbtz@XSfWUadvYCVx6j46YL*6RtFOy<4< z1hy8B!{e2Qq+_*JkBtB;Ic7 zC``vW100#bQv^eUX#!~~Mk;BUs6yiw{BzaZSTkl}sP#80v%7-Mq1F%v*N{EIwLwT1K>Z;Hy?RtCv9=Z6jm>NPX% zSt16rwlrGv&OFm=pN@N9y?PR(uraVF0Dvb>emcw*-W1>EwD~i=FEg%dP)rIQ{c}Uk zLu66FDG!uB2OL}6dPCpR2BI~{jx<8~DGlLTnL={;E#(VCNNRuDc)YUmvSkN@#GC#o zfWxXC3KD7Aq(l7!3e&1SfGJ(oaLzQCCA;YjyP3gPc>~p!L>bjYQ`5-0Vv<~69u-gN zM5&^e&*~O2?Uf}mC==1nbp7euO#14(nW5zGT>@Zc;EVV*q151CnNAJ#!8VBrTLA>< zTx3E;F0fJRCa^EN@iW6S{Hl{jJ(t-@bZYnahDbBA^Vlt45wj{t&CiQnU0g>nA8+;e z&(qvB-b5iUaNc1MmR2u6i=$VM;l_gx;I_M8hozi^8sYKlG9z` z4XxCI1xpY7NGMAH?p##S1Sse6EcEcb+@yY3!Dfe~0jL)E7QB+01es(dEa1NW`=QA1 z1a5r|u>W58rLcJ0SRwRa`wn2+z5w=x1>=bT{GAN|;nK@t(HItX$Y4vbNQH07q5kXu2jBfh?0fjzaOv0rp8sF}Ab_X~RQEKv zlZ_tKT@0+|A1_8d`{mR8!lHa;1veeof#Hq--$lP$si{S+j!vVbYb_Lf7G(43wW)ns z+buczCk;S4A%nrW2;{ZGQ+z7N>4jt1F}n-59zKY3XV${TPHbN~9hz8C{AK_G0cl=r zc@gLuruE44TUW>VX1MCYQ%~=5LlOfWGmb6^Cd%#PZRIpaqg#Cr!U5gMq^a zY?3J89}*B4pY5D&@cxH(;VnmYV0LKrX3A!Drd{i)Z`xGo>hIA_w~l{JR?ZQa9j5DO z?)#CK*YJsxYgn70IL(*LeZ~A&p3~tT@tGN2Dc_c9rDd{DWfXqzgy!U#D=-MxSu^Bo zZ)RCL$Cb9zzDSdZ!Snpa&#eq%c&TpW#pDS2L=(LTj7j6qjZK@KJ_&dH#enyb*{_cW zenjw3_>L#-Ul)PDc=CGOm`MkK(8i5x*%+E>zTtdjMoi1{Nt@zrG%a@Q4I3VFcj3(O z)8Y9#&Ect?TIMN{a6>+$mqVTx;Aam9UKxFZ?@BDt`FIEv`v#2QpB~16JnwpL)zokk z0#n#etYiJVjzt6n91_2K1Q<9KzJ$lOd|LJ_#f@!~vK(mINiIlk7)EJOGS^QUed}zB zJRA9eCvH4&&S-QILFvXv`eA>9aB61mR80$74`x^@pA?%AOkPB1&eR(w4MR{iC>{I! zeXZSRr^Y%7Zx}K2dRUt7(-idA!x>yo(^c<;!5c<@UB-&aixI zRU~C>bcEMMv|4`Nmdn(q@ClzYF0wboU)I8x@$&`)a=YoJ*QyqWnnd?Zqa|Fq@Dgsm z`EHzW+Y_J2cuhT;a?|JH)cscl$xG{CGpSnFjCGSlUIg2Y zuNrg9gYCFXc$q5thF(V3g^5cGJ9O1y^YmE~UT<}4%B-KMlr`<%Jnv&{H7GcZvusAN z`PbJnit7Ab_jAj`iZ)4+cry2yM|b7}espyU0KkG}*?GtH$8$aR-c;1`?97PG&WA?L z^wbyX-J1;glMK0Rx=O`MMVM!rjnB?9v3*cf6C3II7XVVT1} zoaa+*(*l!t5ov_jZ;WQ3{6gY-$iW>%fZR9Y4^Y0BlNgl2=QwT@7S3}G4!rpR-12R& z!=1@NXW&*-7%j2WV|;r zhcl18R7>ZVR;~3UU&rYIwQp73ETlt|SyPgNm{=cWT|46ehnfgK;9xzzT zELY|moiVv@yvWKtpJt$r>BrEKrL~UPp{=zAEv!bk)c}Q8sl?kxkH0)cyTmqp0{t4^ zOGx~H!Dt`-s=oYu5aKTq@CO3_+6ikLM|0K5gh8&*D(eLPx#&uO-3f>ZeZ!mFiaoh3 zCXlpS#(Iqi09-9(?P@6V{WfDt)so4Rjp;`M0Ozn)2shf=8=xw7ATKle!=Z8@~rqu zP1i2>xvt3*2uK>`W9E#c2~Fvacw=ZLWgE??8$O7r<+0~FZ)B)k&c!KZ+op;sqRTd+po zSz{M%XFy5swGmLrd)0SpHf*1JpEkUT&%KPEvRpEBGAiJmH9rQk2DpkgrF^b>S9X-I z9vH$-OqYScD6|e5QpbkR1XI?S%3^7)^S0;3mWB>h0zHkKpE`5z^fzl>Wq8Ieczwlp zlsGyIjcyUjVj6}aY1qhp&8N)F)M+}8`R0S0axD+4A{PV3@OQna(yFKbf95N3(un`@Tw8t;|e3NL_RIwlsKDrT9L>4z!< z|BcdDi85|ou${mUiYX|uF4;vLgat@kWCTHd^&HL}y@aJbhj7bn4`A1W@4$r}+1-dT7GK`0yyTvTeP0@7|5g498ENg&j@BH~{yrk)3SGW#>@F zm23)bcA)gFC;$}Npd3qRU42I@9eE>kICYw?0A_mEnmI1Zyq0^BTv76=O%H=10a3~1 zRLoyv#soz9_&eB0hkdw<=io0r5ehp;-^FjDDR49+iy9t&Jvy9XpomOrX?mre9F8}z zE&BR{S2Nz!VhwBJFipWH)JM2=toGfqCglanr&?fWKLK z-Wssa3Yo2$9g4}-2qEAycuphQAPy(k^}s>g`t5JRV16FYe)btGKX(yWy zj{W^PHb_iBU(5GCJyRC|OhkjZb=(*=|7ON%;Xd>YYx}i&@+}3g-z19jwCEIIJ6!{6 z4y>}!I+-OC01ISrLi&<4cs!c~H%*JH>*p~uyMR6W_ha?44;UxAxk;LTqVeXrxoCkd zehIDOWIlZ-GXd}N=CCkBX^uPv*)iwsqudrYm=hqg%$|i0YDSlNs4z_MICo;+%LS1- zjGYW!B^NJoJs`f_TFz8t*pzh(#+^9<_Dv{@e_}08ef$;v{XnL@@qWf-&A(*s%iv$s zw!i&`S^V(pcjKP@bLqJ@X4OPO=~k93=0j`_@3nm-ecFvg8OJ6#zA(nWe{LDiTpnT6 zX3#H!dI|h%>9kb>`pUm_{to9i@p+lt3Xf%A(5psOxp~}KfWRAE!{s@Z`_>gLCqF`` zW{t!2E#}A0n=e^7_BJIZuEZuHyI?ZpdzSRW4oNhbi06OfnOl7`IEq2!K;RLVjCw_{G8W-^|)h}TAMjKi=Ivj6ab zuvc_GOcU$OPdo#3P9-hp{R7W&j%gtIUe)=Rc#~+DDetrc!uJeV;VaCygryf+%b8IcS~joyf*t&J zy`r+E|_8Ih>g3nfMpS!51f24Vek6g~5+dThk8r|h*%wF^WsW>NIzW5^U8qT8GeF*Kj zqaaEzR~<6%d6>dm;F;f-V~0!WY65`Hz2XZuhEiG7RaJGgSs}SAz2r1w?nC9zT4+=q zP04B6c~E75RQ)XE3A>|0SbU0_M*1EYhMuM*5(wkscR+`PkU;3m8Q0Kdfj)D$NY(qR zxmCeXWqs?XePKHaMMS6X^OGVeo@nV+o_H-|(1dI`3IcFN`levrU>NJQh-k}$Wx{na zDt@W)QN`D^+|=azl8OHMwjyXg71H6S#jD@DF8$g_dBV*KWc{TqWgAx~37PRW`{1AMAkO_(zsi$4Kl6Z?b`W;p zwuIypwQ&LRLd~lNlywhKu-c5Mnu=tap*05gjq&^Byd6RGuhtoVTxM{cA)4{hv1%Y+ zM>AxRAm*mx2hYi=v+Ha_7t6)kYGS6E$~?#&rUw0V$j5Lzf-Dua?#}e9BTc`E8AVS^ z4SyZ|gtkg6^ie(pgm{abCN5xK&c`92c?#-;1pW=Vto+=YepPt-RL-Z_ioq~0<{@-94^?Sv{Ux`O>!PoA= zJMNyxTvQ2krU|Q{O=U!rYeYA7L+@p{8FMY^SNxmKcP&NGSh+;ZCi3gj0XRbH|-W7NrW9`W8* zrYecc{iQ&?XWDnDcnp`v_oUSWHhBY_`Z7~~=5kwbxut(S&u@_imoB~(hW-ln>^_K< zvn2mCvN>Y%s}@HUJpd($Ynr5-CW~_B6R)M~nS**?CLo(ENvxpzf?u*P+o55=I(mr3 zcJmh|>`M|Cj$ja1*INNY-{|mtUo=&YpR;DhPmDMD224BF-s{RKGoYj`8Z`{;z`a?H{OhM(Yh8fppAvLv4dmc_JOU)NEQ>=*8 z%yVWguF|au;d)B2d7+%TyMxG8BF+!OXmUOpg1JN=Q(`oUXp zAk9tLze|@e$_ZXU0iXa7(tPF|D>>19H+lfSI_T^_@2 zEt&nM=q;T-DdX9*Zz@iM7B6g8#wP-1KU!JF8gShsJ&so|hGK^D4(F&u2G}B=;i+6L z10W5Vj3+@nfO;Fz-`uthY@gkWjVrsbu@UH;HM_}9khN+ij>;RK4Y(GH)i}C?Eb2=hY#y55NKcMnLfGcg^EZy>1Wo%@3!uOH=H=>CNLCoALa$ z?tP!+P(F|aTGZ(K(&=@4==l|#U!Bk)AEAv#K5O=+lYY%T0e)VAzXYRu7@vRY!A;Ai zv?DT@bLBIStcB~U**149V6+D{hPUwnySmAXUS~=}cg|<`5|Ligu#f{ilE$AWAAgK$ zrg5{eisr;oVBs>7#$Ozl{7Y^I7%bC6J)};Qw%=Gw2Y^J)VoV4qOu#tv#i$XO?e)1) z*kLAtqzxI|iUxC>Hz%aMJ+sYW-%U5*;@NX~+HfUdh&CP_#IYLcc{G&ea@emql7K+p z?h0|D2IEYs54A6APA6^SiIyiG_~e<8oRb4Z*lyahi7;6fYcU<_2YFoU{KVjyGwnsyF?Dwq2sDBB6gv#HWGnhEPbZ$| zrm9`Fzr5z{?F{J3)d5hpxwG2NT<$h(0FHtTuw&;gEU}rq9N$)~DbQCzn7Omu?6sd5 zDzG0ZU6O1ErFRtZo&5r$1Y$`^x@+jA2{T_U$hc~n+;mO`6P#TP=%mm?pZyI{mfiXC zofNpt+>>t@b&@hjK%f^DW58&5umjMpyU#i#!eyUyN*Tkn1&UjNqj;l$DBaq-mC zVGVkP%z_6)J}p@Mg`rr46^y(tm#+tn?=7(_UVC(WRLJ7f>J`FiK*gbDd=6J9_ibgZE)G!xLYB0d+s<1Z_;8> zopRNKJ~+Qt06Xn}p&M=(gP3$Si+f}btKlX-Agu|x#GvbZCK9xPnEgpCQC9edHpi{&Gi{UW>2PXrvVgz|*7 z!sJW<0q+j%_m)tHeQAyCqVK@yACNb!(gsl)M=b*b<|JWb-b;gjz!brUizHqrYi!YP zbWrHni!U^=D+>0X*zgJSu4TS08q%}Lg~o*4PQ>zT#KW5qPY5QTfid>5A+V8q8l=(a zxIG(g!nU9pk>|XXU4<$YoDkYG&tRs!4uFP|$rYnH=Ucu%ppwL z*_nacXZpx84`(L;EvnUkEG7ebX^NG#*%a$BSt;Ko00=tvogMeQ5seJ#YhgG~0;oi0 zLY^P0wsTrt+b3EYO3PGVv$4#VyU|H^nm+8~%U(aA>vV#Anpa0*?G@(jZMy>(nZdSn zrZva6{cq+yNii47735LWMH#=;wW1@9UY1zePBeQ(VJuB;O$m~VX17YQW`ff;LP>6% zNg@VENH4#WxdC(#2;Goyj;fBX9yfh0kE;FjdqWthfmpDP%p+<9V#0m`y5HJVroY?l zU_0JEb|r%-+Q1j&n7_=-!6CPWZBAcjD|yN1uIIhCWy190D+8$pRbBp?C-(I1rUh4B z+kB^Vvai1LeetK!rt5jnVJl34kDoY|Z*)N9{?B5RfWRdnT*l8u_I*`x)8ptf4`e62 zz#nTM`TXmo|Cq_vaeH#~BLVc^v&kmFPdxQ}(GA|1 zOi`I#H8Xfq1q1lkJ7Aj~7#L{HBWiP6FgU@zoRpS@5-x9v!@Fw6E1=l)=arY)#(_FF zK62aU^WS*F^XzB?lQ5>%=C+Y+=B58d=;IR=z1c~&q}0mtI@fe=w1T;fwOkurj6eaK zB&1b2NxX|P)C}h@#BXNZeNwNyl_MEbi1`b6eS z_X4cayW#feS8oJ0-AnO#mXvXyzE z0I1{A>jn&UshCdF1K+ZF9M^{q`tVo{3-`gcHEi3y2kq6JSYB)}m>mLQ4krs~$0mHD z?Glr1d@*mcq9%1;Yx%r4KqAwPhsq2(&(=b>v>hy)bf#U)xi`<(Ufa(z6?zL=I27QG zHw$tlGtd3cWsM;zzchIb;27X@An3x$48$6L2{eaSAAn-|yK7s6AAaKv_^$hRVQ$7c zSmdgeQvnRsbXcm5T79C=uJw&x`zh)5L{8?uFD&B|M^~{vA&_qrPx*yC>~IdQ;M38Vb&yVLC(T8#b8-UlNbQg4k_wi1aT_-}nwDK^ z!~-!luzSxgT)eahJMZQB-N0JhZm#9cnkE2&>raOCE|7n~*&9P!>;{rqF#A$vcL>y< z;zA*Awg{hPZNS-^?Z<8nYpuy-6y}b( zjL%t6SBup*JD6W(@aU;;Jt0(`gUpW!j$>ZM^Iouu&_u%0CckQJ^c?YOt&69)hWGst*=J08TyiDYBK~o zZ>XR+rGuw+4PeqhmuLEEiA{-MdH%J!>{}JCT?S{aT=7)f!l3|0VrY_vUl4aD%Q$oF z%R!z!fx~yb0rx)q7F@k@H;zC5C|0kY!Z;p85O$r1AwKz1X^?l}kOebW5pZwGtKPAf zB4iYd-17dOk2Wz>Qzf$SmKTS_r)080p70I(ivk$QZCzn2rux zVed^orloGX^%iV)NC!KG%yuNl><(+Qb2O$bX23v`7eK6N5H2u>VLQh5wN(rXe?c@! zDrT>=%+KM-K{`m#6MBT<&FKJHI5tD0#&l{PY(PH`vIjd+snAT5NN;Rt(Pa|mzv({IPc1>g%G_%fDXx|-bk5opH?QGzUxR_tvJ{)rZ) zM}{l-nP>ufBM1aq+cD?Z^q0TW#V1|s#snYE(duqF=b<0~^Oj`B>oFRwVrBJm*!5oy z*^C3Y67pF%4Y&V3__-Yrr}`OSh(ii zbo*?IOyBt|`g+5lwQN*3&u!T>*+eOu`qH95@et0Z0htWa0U(X~1dLyQ=e;}eBX8N4 z&3!F%F>I=H?~7*X4W=njwd&N*>L#n_HakU6;_1Gp*YKfdmvMf1q8fh5%^mx&v?u(I zJ#EP3LqEK7C^7k!DsvbRz|#~Oh=n3}Y?!oETy*NbTnylM@49diW24Ytid zz#(TgSgdS9?J?13nP^tS-=rbvm=A~XI%ePgaZ`%S zgWCk$yRg2W1fJQ5Mk3Rjn2J;KKCf@sr>bNd?;G8ObV{=sS71JAiPM=mh8jbEy{%I| zrK}+7oQ~O{<=K4xP9ml{Cwbz%Cx@5#fyv}Nw8Tm~(X$390blNPzv zb@+hm0p9fBE?4C({bj~LY2s~ithzB>I?dEP^eoeud)+i6ImvTgO(XMi4}genJ@Rwg zf#$un7I0=lu;115gqAHnX>!h{ALuZ$vLvF&GekECm)F&l7S(8M%KXjm)u(7)k8lyC zunrZFPz{(KI?n}iMSF^QL1ES#JKmfYOezTF?t8aWu94}c1k=gdF6a{SD<`*SaaUI!nt8-$H zyzNcc?C|7M&q7LDx|eA1T{jyt1+c=A->X`{u{c=2nOuxtO_xb>bl z;SJyMy*PdBd7OIj39PSP3{?NB$)u%BuGyds^uZs9GTsX@TJ@zwtu++ejL$m*w&}*Y7wVs&a!L{oxvdZ*ErtKLZ>(cB{1GPS%$zJdkbqJ-``GJF zt%VhN;0nz|BktyoHI3Mg19MPs1gHj3pMOz)^3g;!-bcsmVhZe#We3YEUHRu2 ztV=7jsP#8YZdjU~z`gH%6YhA+Yw_HdPvXVjc?wvP!`h-eHbVB>9Mhf9y~&m|_Bege zqS7b7fEM_Z<)?s#A@6}Wx`!^{lm9RV`sAP^0sn*!+v1($g<_jD6qi;Ou)eaGw1*&z z-moBDT?+j7@=F*Wcnvc0=F_$0N3Ll+`_E&Ufmizt*Mo-47;QuECfm+qX4^c5S9fD= zDSSVeNkCvq*HPXnr?yqIo}@X`5TUr*Eu;5(ny)l5xhHf5ALWM6-7OP!LSg7$r3RC} z4*9IKi46GV^lW^W*=iZ&qhg@@EH7wVf=>g^?MlTJb3m`lZfCNvTo0FM)j_ zR@DB>KK@wikLh}nPGI$PE)l0mrobSrt3;DdO~P~&flH92z=Y@ca^uF8b0&S2X@oR$ zbM3uybdO>)8aY2-2tl5^)s=l3e_8_jlD6L%YW|xWEIhn$4({qjB=cU!T7PN7K|n5+ z5q#GC(=m)Zk2xmPap3=J7tRxZ8Bef!b7w1Ul;oVq)rUH7lE|MoCTa2A@V`C ze(4n8jY$nzhM9Y+o;8v#&^TKoJwFtgMzwT zIkud}mdzh@#-PgyN1yBNUaRtivof-l%;I_eQqpgswd;MZ|r1{e~UKs zQX|u5t?4(Pw@qo7(mQQEZ|2i*JruHa!e^ZFU9FNgC8_FXUG}+5L);1cKz*n<`>ikg zw0M{6-ysn1QTv}N)<$VZCsOJVdRm{aeDoB*n;$aB;>&Uuc}ry1Elx*D0Qx@7%*oZc znYgYj2D)i<%i;5PMKfih=oHPwa}`h8lHjJ?*JZBStkc9OtK6GURR<&Hq<_BeJ@3Y5 zhpP*V-Tp4h0Pg>C!1&$<&o!;blh%dDEVTt?Z09gdzZycBIk_HY-d_x2DjvP_D5v#G zY1IAFJD=LhpTraAUc!OfAI4qx ze;W=Tc>piJ_!LgO@I|a|EFj>8L0}r7yOT35aKED#KnjKotCgm26%fpo+S-=pK1H4o zb&=2Sgq9800!onpFrp(p^97k0aR6#I9Kvmf4{kc}|C!G}20Q5Gs-+5bn3T6=lhPI% zK5om%y`1a0of(j`JHgpaJ84d~6|K`RgMZv9DwDE6N3PuL&c25w==l1Px4s^m9Ug!B zc_@ky@|qcsv3qF|YqPUhpP41CzfxGqb7A}<)G3+}Zwr6U8x4IHq7$6t@(I4Gal(WS}rEe#y;N2K;1EpB9O&%wIltmzOm1xK6&n!r$83GFF$PZ>@FBgW89*TUJ&V zF*x@u=JwqIKRd5|o7QIRyHWuwX-j78`9QaDJ@5(ykpHa~qrno~4QrU2-;MEw9hi(} zl4f_*fP)jh*RZ>rHsg=ZXZbnBGj-M`cFN_2W|c0g$zA1i50kF%0qz(SWX&uc5?Y>e zHu2V6%9q#bA5djbUmWfMRh~7x&50#Y5{P)b5Ebv7ZSWT!xe4F*+CA7d0BAs$zgwF7 z>d3V`$rP*izGT6@VQLgJoJe-6(ycCIX&2X9eE9igeB!0$WbRAg9}O!x@I%4BmVZMd zMG#PYTQXFmqpFprZ3)m$pcKxer(I_ zRuTd?kX(C`8OgU_{A&sPOW0LT4+~e&Tsjw6P26k=z`C0IiqAe{-fKWeU-y&UKnoF; zj=zj{;|h}2a+E0}#3zHnIk1;kVrzWXFAh?d*K zm7dW-A?wL!;y?$^BvqbI2L`!oXy6KVLYRxsJk490%D>8{oS{i=O0RrP=G!6@*!Yqc zGd7h?@~>SRHO>G!Tt<>}JYg413(808#f>FaJ4c)AJP+nLPI;zhfZ8M^f{Qaeq$kqUURhcEvPN46-tIG#|E}Kw3H;Aq|s9#&l+$Bj##v2O^HDmNM(NMYZO3?VnZ{=Fd7U%yDl?k=;j2b9*OpfGS^m~*AGk6-+cwO1g}3t* z!)_!{lxiR%Bxfk3r)2TLe5y5o?1}ifc33+W}6W0vl5<%3QT_sFV z+l`s|(k^N?F|oz%Bff7w^iM0wZgL%fsy}T7kXeR)mODn0bUiufjr|46{HA^Ar^E+J zV8Xnw$8h%Vf~{)e{xGc$@~o#Ub`tP?@v5%0Z4iHt+cC5}* zrT>JQM#^vVaJF$WV4cUV@>`pe@G774voMeAne6J&*R*9`Q-Z(ty`S=No(Ha(`lbaH z&aNG+_p(f5%6sR?jA1Yvz`d}yJl??Bm%f5ar(eY3yC23K_rDGYZ@U{$Kl=O0Z(uVd z(+O_|YROZsQMTflWj0-gp-=K`@+}(rmUfv2U8Y+7^=3-rN!nM9;CqNnQ_}HI@&C?W z{|Rh%_{i^m+T?0?KfP((JifH#A}l(PW)tWT8Sl3agl+T`K<;bjI^+>^mvW>#oyNHy ztj$EGeU9gHmrQ;D^5fMfY{-tL<1*~owG;2y3IOma1^`8%1_^&rn{V632F8Oy_!|Zc ztVw^VF7c3tP^Ou%Jvu2S~L9BW!eJ*m2XMm3zJDQ3h0E()ekOojJD2?7c(;aqZ@vw0`q4jum!3X{qaXb; z#^*LjGq7QEyOvJag!r3Eh2ZlZi<~_&b=j>R%X<9OaZfOxkJtk(o z+}^Am2+vNi1^8nI5%U^{1^wE}RZKRPLi90m1eeR|D6QqoXD~eaMKt%kOZ(5)ywaB( zMix{`)vQ@XWplcYO#ZiKuV8pM01V4}uyJV)lSwoSj(SB}^B{klYl_c{v)lkWagW+`;6Z|Efa5;3HRU*lZBv@ zrfoBSrzTb=Zs?}FSOlv1H_|g}BU*rN2XzDpZQbdoX40pgc6f_kj^ zCzL^LCUu{1xd)j?r(|Z5#x-qP3_z#1CrJitaU;zoL+W%$$P8=x(q>{y^BA%gA$dh; zGRVv1)Cf_tmZnvBu=MThGzhPo+w{2^sJWD*{iYRfG9F znwZGCW6^cef%&}Z%{=hU#90d&ra)5?uAbEl!}7bn_?G`k|Mwz=n;WL`v+Jm9Pt}UF z>Ll!kb<*Fl1>j!{Pd@cbe?f%rF+G(_d{Gy!w3wVLCLL>1my>j6r=e_4Fr5h=;func zh?%Ld8){Z4yvi3}_l2^zstuA?40V6keZQHZmJgh}cDcU6)bj)Yawy#lgP=1A3xxH{ zc=@SM;mnDz0rk8pnTW`RX&~;W+Uq zoQV%W;q#KN5wwz~UXp)e9TXHC@ShDLV~D_Qeg07!P~%6^ek%Gc%&0PS68oMw6>7yr2u29vN4V3wBu#0(v_3XV$b}33=Tic zWogW!tCGkJ7%ubxEt50gAe%dfzm0G;nBPcRM!32Q>q`+dZjwe|GVP6^N<*f9trKVd zOpoy}jE2UOKmqC&!g(!%%58~FE6F5>Iw*R!9$7TN6Am!`fJ{7cm1y@Gvmw1fEk6TT{Dsd>82 z^QpIF?y^8!uC=`K7GF08*VO)7fW+LdNy$z7q!gS~qlkgN0a^Jg2&mabw*yx$k)OZh z6mXnOMD`IqROl^%bGz!sNJn6=WG(yD4*EXeg9%KB7+eYT_3+a&YuEpnn0p?V1yix< znuOU8oSvu-Q`F)H^)OZ*V1ZIQp7L~7TYvD}0Bf&czN@ql325@lGtHZF&H~_zc@^+e z8qtEcG`BhU3jCvA4*~47fBtv&{sTbL<2nyTzxul;Y~DrAAOV6PK>`e51PJCFWJOD& zOxcpGWIy{_!SPv^eV^a8WywjhtS8D6Wyz*QQ=}wjf?z}$P`GKh>_0GlVzboYN= zg_G*Z?;#ge~_X$u#hWfuJlz#XLIa~hA#3QFrD}JgB zrgbQkXcEp3E8IV%t+mFD8TQcail|UBa@)^NaCXG+E!>DF=)>Z#8q; zGwJKL?c4Cn|KMk_5h+CgYGj@&Sg5kIW;+Kgx5?3+trR&$Y0pWue@}BqNl(V0Ud!BfN7jHCL?E1v6I6xnqtYhjv530-SNr??f!N*uTL3dU3 zgRZgU9M}A;myz*@xs;OO_U+s8mw)np9P4z=*KT25CK2-;hUiG4Mt+eq`tszH;hXO; z>1-pBqo3%Nz`Sd-l7)J_2M)|n$Zt~7Qhq{EzyWEw^px#6BtSrepZijzd8IAWzL$5fEBRa0 zR+9%# zo5jl{oDQm}Hl=}E5GSyQ39jkQp?BOeHgDU7mHo3>*QWt;KJ}d=?$UTV1A=M5-ZFjI zC(yyI?B(W+vC0;V#0Ew(UkHFh)l1C(992a}uo505V8GLJMULDAbkHQcsPaYR>PWi% zWR?Kg1BpuX;oQ;)SKcv)Gmo3Wna9tdb~-wh6IyhV$T!xpms+wiKyy`3=GBjWmkBlR+x zpMbjvm@Y3y)$%y7={XSvI6Z=^o8n_jG0#PmZ5f1q1#l||Hl>_L?5~#Z7M#CeS+$b43>oGV>)X69E3sWIcC!~`xivF{s)9mC(XqC~ z+?f$ka$d$wE!*=>cT|yrOjdoqa=OUa1YZ3(o(sZH@@z1rkjY{)VIs$V59>%*F;@zI z7yIP+A&4?nkWToxezh=JqkJvbOy7~qkZJ7vf0LoEdgKD6?Uhyn%fG8WT-T`Hr0S+c zy<2H!bD$3r!kDO=Q^s}R$xgL2HsFSwh`lx#Vdn{_VLJBD^4wn4dDP{lNk+vdKfpf1 zGr{ZVPJNAbzCVlxx^JOn=$ptPNQk%lJ*n8O<| zxy@c&yhGuMtBrMqbZ+}(I=k%Okd#XfIUYMHc%zc5nREW^o`1|WR1kF)8t8RNx>v#E z9QD50SbN@##)NuR(qegp3AZOVIXsDnzWuar_F=+r!n*v{eT};Bb;|SE{LD}OXpROt z)+rqTa`^DPIbmTkZx?oiN&2&?|@zUv#uoZ;<@D=|2BnUrcZ62|L0sSS9N ziPry3bd+b^<)>8UQ%>Q@J*ERHPpML~P+73?L6zA*r<|jM)tia~!clZSR}N$U!}nwB z*6mIKvst4~4V?jit3zc5*q|A>=lj@1DdtE9H-FTn44=;ePSlKCLik)@zKlJ~r$(oHG4 zr{w{S-wmd_S+niiBTJe6v!(sM#MI_XUvUvGeEzXN0OabtAEW7C|4GitQ}|Aw@%G$g zCSy-R8{YKYqORS$+nSyN>nfR`6~mT=wqE*6yfjTXLk`3c=_oA3hmDYd(4!PVGD^T7VGzN;;mW}{ z=3V3$B=Rx+$tiza&uTBD1_C^`?HcC4`B`kc=w0X^f2Ka6DqMa9$VQFu@~!pL`%wEJ z0E0yEEluyo)M=YAJ+}>Ohx-@}VvqNF<=nfR->CFAjqLr512bKjlwNTC-bdg%o1O6Pezy)wJtBNBx(1S=K`A%s+4yDF?it3fTl#TYI_W83YzYPAdo=x|J`y~>%Wj<=rXV+? zuS{T7Bj7-{_Z?lij>1dzWD2R+2PTjLfB7?%z5a5&;z&)KF^ZJSX6{$!s& z-7WyI=y+1YMU~uj_`bCcT6p+dSa|e41xrMpYd+~g&sLVaqwZQ;n!~}t8n*4&g{hg% z@#<6t7|J$yq&ih2#4~!|s6S{vi1a})b?7QkCJ6xBpN*=z=4d*N@+Qa<-q1vlZ?p$A ze;AlP7=gfZ;=L`A853ZhP77Wrz+Wgf1q?XC0jxnmz!H5&a;-GQ5zDx*oDCxfjg(2I z)PMOe^c@OK1!T4s9}EMXhYV^5&>1{=6nXD1RO4?W=3eM zDpGZia;nL4fX|Izlz!@H6Ebr6!}-_?sF_MTIaFCgI5$)e)`fT=5utiib!k;8`O5Ed zDSjG1_yd5X0^I?Z3ANc3zOK50LS-W=tYgwizmCRUk63%8-k3NZ9dBviJdF;-b(H?s z@mOe3>F!V_T!w2yoOtRvITCPnZl9WJSJdR>pAlMx4#QbRt7L7b2^rS9*7%UzV+Kge zA!H(_eI~N&6=839x&`>6+$185B|1jGQ)wQsg-OT_vBFaZEZ=P}8;3r76f}g2K<*OY zeuqwBlurxpmGIyVNnOG8rNaQyYPw+(UDQ;;G*4hd1BCATopMYebO-~0s$L4HrYrPT z=N=}ss!QamtjRR^&J)!+yW%SLl6G{ORjkbZ{E207r1$?;>d_tXnrzcAY*@^+TNk{ii)yE12=?Pd-iR z!F8^C1&@tNv~D|`?V9*jAQ%0dJMbtVj<;IO9HEzHPKQ`tTEOg%;}Ej*=lWq%|9XLt zd?(dW^}#y5=RK+oq_DK5qA?qGyK{tIW}~>?ect6qgcKsTvVG z`;Dy<2s~4nu_4qNLki^L(J44@G&&i4_gEB`BwXeiI7)G%)r0HA<>>45=C=A;|I@r$ybO*#5A`#zvP zf7bTSIxavNk)u}1X}|G--ZIYko|oZ_OE1LLfBZG9-f}Q6F-~jrbl*H#3o4+RMC5os zAtxEEi~it^`YXtSDW^+dRu|KLXT7qQX4>jT+g$3IPYjmjQ-TSz{*y`h%4hSFE5UVF za9yULn+*n3A9d^qNd~H?j2gyr9bZRvpLnX}Mk8|P22O$Nq)`}YZ_(J$y@%HD`(Jnr zmq-45=Sz0sEf?*?mYH6+U|;&=6prwKR}e0)&p6NQeY3-Ytp-Bvy61iRJroJPo)5U3;@a=fQ6n>z7Nku!lhGehYbA5a#R-;Jcf3n z!Y9O*uGgWdElZC-j6?Tc&yzK}Sl#HPb~vRTs*@AgcN-0saroc>Tej}PrYNhFBCeD6 zZi~#9Q@yFk;wWTbP!EFQ2}(HtL?V(rZlJ&^T)7CfPJw{7+y=)B<*>|Ugta>(uD2K1 z`a*=wX8_C7u{r60js>Js+lw9Sp&ZarqU*|GC_=K<`6(jfJQv)2+Q!De3CHAUYwG97*I=aEPVf?FIBOJ->R9)|QW~_s$ z>RwL*K3ALeAHrN5^;6>(x|G6{FqY~a?=Zd7bZ6d^z;bp0DEF?l~J@jS4B1KjzZqTj5Vvn zNfX*cj)|}yLUoK%ht0=}tJ)pLL_-vl&3uffO0Zdy&OGx}eDqI$7aNuS*M~ojN&EH@ z8ImtfRs{l6O$#ERI#F*Oh2y)+x__e7z*WeZnCb>P8bAx|%rcCAPrafu5PD97|OzPiq-S6d5 zH>_*)>)$~uwt-3Wcjb5)Ue{}qXThRO7-tn1A;4EIeE#|PAMgJU8xr}K(y#sIA8C1I zpc_oy15}suDA$<`ey+8_2RVJf+;Gg3*`q=&`Atp%*;v3Y>);j!I2Tp?0~pu=116}$ z|K!U5M}O~qIP3INuo3CXuiebN>|;T>9$txQ3S+<10J#Leg|cc^BV>eDWgpLcB}l-7 zi=u=J2ou@jcS(W4GRR6poQBFyczM8DHrOj~>xR}ckd-~20ONP3U-CFC@tRB?Bp4zN zUWf6szlKxZ_(Htk9k0L_e)nrwyEOu6qn~kLaG>GY!y&Wm&+-ZIoKvg{YBs}MdsuK1j^w_?Q#SzQ#6rufcQZgp~rnrvJYa3 zJX8fjWOU30tzqGtpTubHQEYnN>+@uciUhYk@CNqzm-r<-2=psyRdq&hr!w?M+4?%!GQpk#iu;xR*7cgE;i+s9pjL>#1 zo9WASEd<+?buCY2&x}SY55oVWmbwV( zEaK0i{ba8{=n20q>raUUq}Gi(0%{w_BRHMZc5GklJ`9+K>1^%{B}}S;a9H=AF|B51 z4oed>+K0%*xQTrxfM1gd0E;k5bzE7Be+x*E=%^{tegg1|-cW@(p%auMRVQ`E1Z-;- zci)Et-@GmhUAe@SF=Nbxh3PbwH`ROjxwQ4v8Ws=l&65+Gw;mtcGR4?lTbAylQF^DP zzd4qUEPL@&SS<|QD=x@j^imX{8zQ5Icx0Ac>?pqc%^mh%w?+ag1z zdkZ<5TO$>7d3g(7+-0IqIc!8*PTR(I`7xyLlt?k6vIp?*I!9CaU1`NabJkRO#fxzGsDv6`95 zMzB>IjwiiLjUjUZP9{<4t8;~wG)}Y=f$L`Ug=#8P`x^#R1=a^kXOJaYFpFw-n!mFb|B_4#Pq9gV6!z!8!Ws*W~wch()Fm-l4+kIoE` z1RST&vdN3^zm?}&06zvDi~SIm51olW%|kL(T9CdkgNERo;BrqQVcfH11C4RE?9d&x zaKb6nFo94Tl?an45+-nUCp5Oc$x47+zR)E>RAm#K0_(PxOmg)*Fxk_g`nzvNr%l?2 zaDbI`0Dz4H1DrvFC}G!PvbtH7M47wffI-uZj^Ts7m;O8BjMFmscjg9x0S`a28{fSB zZglr2tCq`&KB1ZeOfG1g>|}<+D~@0_f>pDdxDD!nRJY7s+_`-le*P!ki+{91k-jPYyWjewd;ka_UE}(N_Y1Ra zAPVTy%5S%ySaJUgAeaY)+^h|o;%Z4T6Y5wS&*{a!GqU;)j84||68l(e0V*UD2ANEodU<5KpOLK96yTqH)_PZ#7dv8~$4oKMSofR{PP z{}wmzM}Kw}TMq8P%0g`0u*uDk(+h({=&ik zJZSY`j&h=}MD|e??Kf&UeyWuSKiS()zPC;)%2KY@X^Of&ArI8Ne^=SkPJ<}aew_L- z1dX-~vSonuWlEwaQ2+uR^9F7}N-ak|r#?);SBe0X13p^Qw@n1lu(Fs}ZMD3&sGUA< z`lPU@(+}i)6QWvmXfirUA0EE@Cd}Xe&6urhkuZP>rO_uhyWzLJ@X7;Pepwp3ys$6x z@s=$oLcuST)6ko?2it$K#@FBjHNa zAYyJ;BT@~vdK?L!o-ed13R1R67%6S?;VUiMFpdb!Iz}h+TG(DBypLe| z<_{VJI)O9B#KhMEJ0;^jkkLASXFsi0{Z80KF5Dz`1+)Y$)sol8A#|=0z=@>DCtIfIi<9w8T|Dm~D_LxSGQySRt28RkiHb7;niP zL7$}<`R+cU2zC7qCV*D!T=sRYzyB2_KltYh*l4s0uM)3Jbw^%2+>@W@{j@5&J zdhZwRcxS`3_=z+V14C8=|BmFbVe}5}Uzid?S9znVgQ#iWOoE@k@$E1LlhTYb zVlRVUceXk}4|egg1g4g zDF3CUziZfW&JMi#2QI-~SKf>LSM4bwNojK~VgL|AkTe)eOUL@oCzZjvkC2hJj$koM z^2aCI2KP=TpqGDP9zux#jG!Oe#uOcrXqO^y(qGDAknY9rln(nCEGh+4YI;+c+ICVN zhz;XR|ENu;eoC7dkZd`cvXvnt6Hce-Q(oy{m00HDUd(;SG){Dctov+B)NpD}Tl+X> z(w$(69VZXm!L=XWpc`V{%@dZdEY+;QG@qx)l-FNW+S{lFXC2cDH<-RipLvjzz}jAk zj7 zR<)dlQ6`qwT09m3zdaFf+(bufnmH(!g@ zgL_ey^rFar&Zlv0EN@Z82%?+#aHW=iSJA?41n2i=Jw3Z+XH>(z3~Wh+vP8mXaJQ{_ zN`$Zi^4K;8r#wV|a8K(q6hu0FtA(+V>q)#PY}!bI29F{fjI`eMB7{vlfaUbg0Of>r zjv2~8a@umCENjmCI%k(8jrZfDo=R)c90lAfWBqahdzz^zUB!EsrpUjH+m+?PnJY7k z6;7XO`dPQ91@pbo%ZG#{8JQM)#nE9JK%sgW!kEh6$}_rb8BlHw#v5Mc1$l66+)_`_ z2kDd!_*O;DNdX#JY2|BbLWPZ(esw%9pT6*}j>^wSs2$)jf-;#~DRuWI!AY>In+M%X zJMuFg{Hw4Gr3llL+vT>r7%MuMELY=l?@w~3CEtckM_2X>ughda$*563EVvehs*cb= zt8}=}sM(A&p7$yoe0&dv3y+~cGYgxUa?Mnh==8t;9lFnUja{8cBd5zts;!NQ9U%a8 zs$^qDBU~a^-$<;)6u{3T3?59i?9D^*Re(6E(q`XwCq-7tvCcxxTtOn_s+JgW#_Ly? zS!ccBDFH=~JhGeVF`-jC;GbQ`I+Eb8Ne2j>s8$$i#5>RF;KdsUkBm>ODbS@EO}jQC(*b zUDl6T|C4`FlZ)I0o&;dhtwTq+YG!cHYHzqY``b^Y;7&E@Xg6xwguepDOn{M>+A*mb z>nc@<)mMMN=rPiMs@d2X=;$u!`KdDDQGlW}$8u2Ef=3H7o5 zuj?SjK4?M5KD{#nbC&K8YT)=rVg61!M^Z64iZlj8ovAX1me^i!8|H2b)>xL2(@2V7Q0|%N~=V zMb&-f339fvu|ZrpnY%cmC6Sh?+A7hNLbc3JB0S3_-a9czyEQr5W6+uxR-DSF42tt$ zG!5Q(z$TBuO%BL{1izaPW25fHe@*lkn4;)y;?U#Qmj`yZYo)PFPBUT6S<*1Zi z(LFg@&2)nm#fNv~HjiMy9!LAhX~60ekv&6FSBnJ7F(9M1910QtMzL-Q_$v`LWf@so z8j7_zDYCj$IfqSjKGGKj^dpAxiWM%BJ}3raAP_ zSi#JpofsU5cLvDIf;0FP#P4f#08T>l#w1jAdGHp~{7S!M)GFw{yXOIK)RG5Ch2QKS|S{<=inNiIJ|~y?w-$} z-&7nG?b_1Ei4hpwvAK`!n|s(9KU0=d{U!&6j2PrxSRG+4B6EwYE%q%8ad2sf!^3rF|b^4Z!X zKmo1En8>LI;~mFf0TyZGE~oEl!gTJgTd;8do$>p?LgwWZ5)YiH&NVww>88}KW)?e7 zJ`Gd722bq0KkA#s@;%40%ql`fP=P4w#Gw)D zfxpYc_WTZxAIfBLmYC6Fz`=OqgqKIvwhLGs#xj=`K*@cWPZVBLekpq;4wX0bz^0@d z8y;0nW>g^qkma>M;aBc_%3 zO>B|9Un1i~23a(sIS61UWUOPQJd>#wQ$CaY1KF=aO`D0ICocFQURb zrIYm~1Np4~RmTTk2zBywE95$&;7yrgG%9xu#J>v&Rwa3boW7DnMnb6Vg3_JkD-sc%;%Sq7Ahq|XZ=Xe8}eAeQqWbdI`bZFvD(PQDn&oq8_ry6&?Hzqhss@6@WY zrlarAN&VVo1D}Yhx>n3*jO3mlFS0_i0X>MOUw4pnzIIpT4~!WQXAAu6zy#&w)L7`$ zwpLQEy(&mYrjN?1dyu-|Kl79C&7T{c zuKDT>5jfrhkH7n*(N)3BSOvVg=OobtiL3I%g#KSI`3J)!siFz_Q}q}<=>j^*>96h+ z-Te|LzUY{995g?6>A%1KH}HRVnqOMMr>?#Ozxa!vj^jRFYN?JJKeR5X*&)JFbgrlQ zU)9VC3c&iY4cve8uPXiBfB5To@DW@3+cm7tD|e23EoZ$@md_Y47}UvYWr;41eX5-b z{ZaV|Eq{>#Vv6JnZkCf<2x)igzO#1Du$IKhrFQ-7-}?T%?03hut=Opa!H;}4_lt9# z;U|%(z5~Fw#|8n#4`m%40&J?KPTJj^iP`A#uWag{Z#(}q2f?s&JQd2INg$~FeCS!2 zke&PhA8Amn%_IKg6B^6CepvyBHJtb6i!dE!@3!B%3RsTdUw@RN0wwZKTSvSPQ*PME zc-cq(wX&Zd9Iw0Qh-bJn}V-x3-dS2h2ypPH)+c^G+7W(}j`_G5NO zl#~6Nv2u8rmsy5>qqQ|&;Qf>YRLPeeL;9i-#(a0JZtK2#C*0ZHa>xPTjf=L|@j2>8 z>_TG`vJJCWjxLr+$hPR444AXOTcYMld-LHKX}M`Hl*zLAnE<~845#hRQl9DF+8|&l z0(-k7Fc^YG0R}e#(Cr-MUiEW$nIduQ6BV7@2DuLR>6iBwJblFU&}U%Fe?6Cx@E(fX z6Z_^x2czyIPgK!qSq%t3)H<$!B&dP~Y-<`)6O~ijor*TyU;GZrlNmXfR)D|Mf8vAZ z;$zRHy*U$zlp_AZ$mHKeq!KzQm~Mn?a`gbl?=L?35Dwq=^(de7%qSyMt~pZ|DV^Ka zK=&ur5Tq1U8mA04@4~64KL@j0x8v}_A*`(|gwYD;ImF8RKJAU(E0|KWH)&~q%6SmWOiO?pK3pul-q*exI;L>JF2vD`awjl#h~O7O8bJz^ zTg0p`+5|1Nn>E}7luQ)pbE2fR#{8W(d9Fb|C>ZI-illV!kj2qjS9>WrMbEQdadt)W z$rGhwvB^fLwsM8-9P@QjQf>4ZR>LgLx%eH}|HN(_eB_(hJj2_Akge{pKJO4!eyYFa z34rl_>0A%a|I_GEWnLOncPjT(UsRXH@lGGE*;d{BzXo@kWJK|?P569yS|6o5;3kqv zXN|439&4*HaqyHAw3rOVrt0Yl@-{*Egc-azJzdiaFL*9K@~7{|%U|;z%+Jl|Yn3q} z$MlY;QmTN#+A^p!o+vw&!-gq_Z$D|{rcOfCazzpvjMN#VD1N#3%g85D3PjnIx4Hm zTc7l!4hYr4_zO~kpY|afu{Ktxr}BiVB}}Tff6nMaliT_9jG$Vo;fQn({87CJqi-)d!$+gPJ*bRDGQ}{befA=5%IzD;DweW7a?#q*Y$o@S# z>(;X9*?I}xwgRU zu(r4GBXob!(!R3aC`a|>hVcMS3KZmrx=VUlTjaHH3=9T|@X_!f`y&DW_;;{t!vr8C z;G35N=hz{M08FUL+A{C^S0V|TI0)Z);;C@}+2#e*dC6MLdQ$?@mJi{;@*Ji&Z^Lsh zdM%dr@57@H-WtKg`BG-nI=%?daJ1}{kIHi4v>Z5vIpwAfv9#w7tn7Obo6mb0W}o*u zls&biFT6#Te5L;<2y+lh2N#i-u8c~sQ@ps`pF?x8?hsr>fY;>_tJqAZIhOt7JV~H0h>*e_k_=T(lrINZ$iuExp7Maqk(H< zS>VX!b5lq_JP=3i6|hH_^15ZeDisX)U!4wJn z>K`}KD|r&t18(NC@(!s^(UYXPPI3-L;0}|BO~$6P$TS?(mDx>gMmek|9S+g{>A=80K@WZygm%eZpHGzxB8mhNbm&4+>kL9YjpvvH+=)1*lR{r262aLT2TaNFbG zK@e{?q097PUo(o(qN>tx1Z?brbw5d>mp}mIdF^B z2nwbeOb4ekg8-{VHwTHVgan(K!z*AZLdmpkY>~}ROIt(mHUo|unZ|Bk z(H7HWpZcM^E_Fd zw*Xzi>e3>1J?HH>?u_T+o-h9ywlpg-pP52?j(n~_6BS0+41d8lukPNOFhWCjzvyQ; z3?sNG)4HT8|Eh=p8Q1mgaR-?eiYN{&j%-5zbUYZGjQI8hXa|ZiA#wuMp#|VVY)K4) z=fzM(I8-%7-DpokaT0Ppg5~v0N-0|Ah0lL3uKC&x%qtEo>i{PeK-T&6{Y)LkuE0O{ z+cG%zH2>+J{L%dPbV?uk@W*rXA3XiWtwN<7WoEmku~)p~*X=WO)a-=h6^9xnz7e|R zx;i`SQUi2^W6cls_5m=1=1GSxCBg=9<^O)^b+36DzJ9|^9TxJ|#68?q0OI@rl{4UH z>C_$2ECYA{vG3=nOG@D1|NO}33N;hC$jb-oXOVAq=F{M`9djz71JkxGqplR`nU|)e z!7hU@EslK(-CyjH1aD7Z&Z2;W<+=d?x)jGbMalh2(JyIP_IrQeZFtw4FO2};#shyT zrRcwh9(`OvRqxxH9F$gQz*7ijOPc_yoGtN)p>40UIF;pu#s4l2)ku6DmM_!TJd9vF z&SUND7^kSBG+fHG%l%=e+wo5IDDi>4%E>ol)6}NAEm0g8#oVS_yy)E*;j!HZv3U1< zzLu7^hB)XV2iTN$CO(un#Mb&%qW$t?9NnUNqU8uA()WyJa!qL3i3)^!FGrXT3q9hs zybz6}Lh_>t_*+|Y?>5-9>tuwfJ|C)+@-J{p@pa3fb1edak3DibcJ4e8FMh?F@ZkM- zVgD1~irK6Hx~f8eP;RfB8mt4OkWU^?QBCb=9*cK;87q(6fh`xk9aE>BC(KcSUef#3 z1Y78Q>fWca_Yn(Gu;tTfx2&Zt2hp3I!IneYvATc6%g+lCh(-XlP-HlRY9%Ts>6J!K zMCO4<<$riMy8Qyjh;i4q3?Q`bWL}Br zV{B3n_|SWNo$~iqBm2m>zHnS{k<*UOF7U~03>b6(DX-byrNmLgrBd>~28k-z$9)l8 zbh#U|X}`DJlVnSL8^-G844TXbJ&wi-5%}ZiS>h;GT}~JZv5Zqt@tb3-iVN8=`X|t? z4RH9jo3U`uEiwNAYW)FdL3&6>&^|7o+)<-GrZ?@xsb`*#ohO`vLxV15AOV((1 zc|mWi!{#l=gI1R?pCSQKmKBdy7cf}cikaCo>A;bNEXS>vdFe+I0I2|T0%7^_7)R^4 z7kT>ywMP8Di!vj<6Zn(g(Kg4wl|7&XcOdMFc6eW$M4?sdbF#v-oDkP5+kpXtz(Zz= zGT{*%z#8-rmzF`h#`+;6@};fRmLqW{HQA|C6m(EUTZ}I^sH% zNuMC&U+$|C*++GInfK*FXFkJGt)_QqY}u>cFWms1k?1h7Q<9#kMLvT~YQXiByjSYw zm#3qni^=%7V_)>pYIOsOEQs$TZ7V7-z)$K{gz{|>T|lVq7P>(fRMi<|Ws&<?sveyDj)yp`-tn1CQJKcHDCyy zHx?(GK?9=-#rjTE!oK2g0s!gY0Nc0q*BMC}m|tk5$?4>b9NG#B$o9fKpO za^wJ=Vd2On^2TZcYsu}pr@xzgIyAR{_x;?j;L7W61-oXt?_ElY7X&BMmHp?rSmxt= z!sUdCF&U&9sB!G|Zvy20@!$WOmDT||zAb8pFSvg_e~|lq<{2mF<-KX2zq8KRxIO;X zOaJz_{+R0ot*75Qqs`t|t8@7^--mUg978opE6>V@pLXrsEzbv_cDg6{UBt_3yf^Fy z3hW)bJiKvdH#oQ`4&vo#age;_jO}>-t6qSQ{PtC7mkaop%WFrLcYa4ge_H1Zr!NBj zWeP%oZyGxdSfcr)dM;8>fI?m#T)h{_p2=TZ23F*xJMczoanRZhlycLXw_s-TtooZa zTqqsYQ(DBqB~~$i@L|l)@5fnZKObkDc`oj~`x{u8e=NSgQb4q}c;@7n`DB6YWqOvu zNm?d1$S0Z(5AVj|t3Qa%XTAWNUi3DEE!))>GkQ(%Ts?zv7^zLl1oO#+hM`2mQHokP zae%2UThQM>gSEvHUDWgw2$qJ*Oy6J!g{0D3Igz{Jl2VhJx;{!jj{d9s@0Q$i9cj zM_9l~umQ3YEd%~-icBUtN;IDUg8~-v1VXSSzGb;@$x}}K&G)$!0Sn2q10yi13qrXj zC$xJ5Qu@b5^9#z?h)yYGG@Z!|e_|}D+M1-jxi4AQq|X%8tDxV=#iI2n?O#!rgeSnS zDF9tSqQCMgwBdr`R3f@wuwEBl2~b`vRrWuC#RtBHL*MvX1m5OZPp~}7OFC7SzW1O9 ze*{ObQ3RiwO*r|C=ipiAKOg%J?876w?~kG}fQ*O*Y)y^tC19^9`#^5lc`6o`4n~za z&-#9Z<(2uo3^?~$Q}{MzvzGOFtJU!$?@Wi|vQj?-`NcOc9kj?WEBy=6bt)Y)yzT%N8CG98Pov}IDMk$zzr%6pJDDA9gA zxzmbHZw&NgyGCMvS?%y?9OYCfL7uvvnlc&g zJB0P2T!ZO4I5P~E?~*@h*Vw+vmS14M&Xyy48$e@y3vbH<17C8_)s?tyhQm0S3Q*cr z-=%JD|G=XExsf4M7>wN4Y+V+ljcoNjTW%b*s?IDJ?a=j?O0=li6uS;*GwS!rYf7$z zhAZpisZLEOk+`D-+OHDMdG&j+ZR-ra^|h;`+Dbe-l>ujoP8OQNbCZ5GNv%`Wz)Eb5 z8U5o_=b?R!+9>#Z(D`2RPoZ7EW&@f22|*pwP+1wz38m}97;m|Huu{x9+w6EcBtmNOS>08yJlj{Y*)f5vcT(NvRlCRz z{vZBX>k~C3>q&C=x=+C=+R5ojLo-|t@7z`Is|5+`mO@^U5mbddWeGgW;}!3%!>CeK znf-jGaAkMytz5L<;ta^s-nq$Fx`fg`cg6&$jVqj9{%*q8Z{CN$@w2~#y?gIRIyJBD z$_KnIHCpm^+&OwA-%OFK`sz!1JJ2=v;b8(wVBu>EHpg>HcZkq5+6p1 zqWzb%BVt*79^i{FStPdtG;zIi2@(ZQT2@h0=!$*`r=sgCaS<%YqB zb{R_#-GG%n_h9o2-hfT#zcM~5Cntw--(6h+v%NOP8<%xb-f7Fh6{%adETXq*4Ks(g zVzfUFoCgE6d0BA7{3LyqVJOo_asnaG2$`l484)@<52JO~M+QvXzi!p30#+hkXuXf` z0tbBCS{p0qI4-!cLIzbzc`c7nvh5$0<-!e%LTE~aP>BQ-5U{)_V4!rTY#*dzR5~hu zwodBHnFXZd6^jZa)UbDXMxwh#D)RMI{}F@b-R_s)9H^$zlN=#g0dg|fR<}_IO@?~~ zD3GDgwygO=sLS9Q$m)|2T)$J%WqG-8`W*3Zk<)z0YlCJgMPe4)XQURX9QI|m_QDoaqD8O6Ep!}tB7=pK=4rkzsN_`#U zvgqk|?POlbrFu>QF6lsF1kxT=ozNYuOT8TMQT4Z(54)iPBtKnbWH8}#@DEcZRQ0hc zbTI*$q|_&XU}KL~8zk~*QO_Q{QA$$a)f1tX`G5(js+nEQ%hg9^tA_+uvz^a%9jst+ zX$9L(e<@z_ve)3oYp%e`;m0sLJDquRl;2~%^-9U(9lp!t5gM<@#1z~oxwcJsUu=?; zS!M0t@p_eczF)sZn5bpV#v3azClI-f0LFB7Ej0X|U2}%VU-O7^s8D8Woh~yA6WRz9 zThvnQJVQsxtA5_Q0yWH_;Gb0ByJ_8&_WgU9m;R0mx99n;RO1N0 z*H2wv>c~&Z!zOE1WH@38vINO4`8JI||KyT?w#&&!=QEAkAHp|yZ0U!$NUeV*B?RlMpOHjpXPz145rw*fsX{> zfp^oPZ^)uW`ffUUdg#%|I?;bA89luNMwJ)D*ZIxb0oKcv|AXo+v6BXF*dVU% zJ}Fj%D3l*0x1b=QIm}$@n2Hsrpt0qGdOeg8N*qvaJ#Gf)Uid70>C^Y1UE;x8ilWm< zEHVd!H*U8^v{nUM;HaMlnWVOt(|WDt?pd)vGVqa*EqA zeu}!z0Bt_maJtk%)4C6q!9UR2MO&`PR126VGx!Rj|QY=`wMW zQAMSU@uT#p=;K!Tm-_M7afi|0HiJ$3w_^3suq^jYt!#RnUwW8nCMPm$Jesf=4|<&q zP+z^Zs)R97sd=)Fpb5;fHhFJWs(>99cFW)&3Mk%i^pfb-5o6Lh%k-K6jcF-xivHuV zMgjyz40MU!6!1^#0k{95?!zq0)0{6v8UYz9ZcfjQgg$9`ato!UEaR2u$Z2xUs>(~p zOS+Gq{AS-P81I<BE-f#mJ?!7INU>P~8FDu9qS5z$} zmnDaANas_2Cq3S8w&47WF2?E4Ivcm$bt6_+BZ!_3r3h2Xha-*_4di=1N)(li8Is1^ zy7>ew9(W|Sf3?&*%KqA5Ddshk8C7k8^aa6<1l*X4>7d|($_-h2;9v>4%wU@7m4Iqr z*!(HWhNVo242;(nABz2YVVpqNhIV1C=ps2hB`vtk%roRN1>`S#ux7o|7TGHYe>B{m zL&&6*g3!4Gk(bnxEFDhoC_s>+1IuZ{eTQPVr4|`P?FE5yik%RUU01~Lp=3EWP_|4E zIS}2CaeJW3FUyMch{LFux;}aRTppH_tS7q?t{=5L)B+NM^K*%d&iIBzWZ**!}s5Ut+Q#*&K_j@##S{n>GI=Tl7=Ir z2LGz6R23L+BXvF}-G?+OOnw)W%7yg<@gX1;5=X*mnX7_6OQ<6C`5J`@>jA4WL<5PD z0?c^$dXiIo@Bo4+hgv8r`H(iaHj))t)v0^^nUI2sgrk{KO6lF@Q=rR7^%K+)IS&f1 zr;@&#ETvO_f8#&$!5=i~iLNU4^!E4H)0X2YbUyV5b<2ebN;QoE6(U+!JC)BOZ>Fg< z;$q_SM{5fmB03UPbm;BaSR@>lOq7qar z$@iGIrHwf+0Po9&dT`+Crkjh4cPUFQ)%gjopir*0u;m@0EDYxzER~H-8xmbC2XG zpmH*$_nHD99MZ6i_qi`p-zHFXgu$VQaQKSf#mqSuW6Mk44$N*r71`GjXAd+5-pg)W z*SY$%O|(jbVhE60(lk~p{uHc z`C0X{Mbf?bNTUC!eol3c>nL>%+%<~^ET83c-vWL$0{rF2Df3wq2hND#AN43l{=rn1 z(nnX|lK&)_&*^opQ_Dc@p~NqX_dI}u*MAl5YKmGOL8EZ<$+YPOUUDjWl~1na5Jpxx zsefm1${EkXMK5_d_8!=W>u$Lk5dw&S-BghWa{68R2Q2GUv`g8q52c4w5srUF))Z=Ku_TI zq*Krj-V5w{321pb)_Ilpj!f?knWjQpp$8w@)V5qMPcTSypBxH8DElt7#a?CE%DSkR z^9Ur*j%4S)+@7@z_LV)41DDq0Q-ON|Ecs0_A%0ic1TXO9RbU1qwyBN2;e9I`BL|@w z_Z4+iw4Ye>qaN)m588Egwjak-pbPU`S|$vO(DScbE1A5$fU5qbvBF1M6uIh1-zth2 zG!GHNqEGBSvZ}(doHhrpD@gX7MbX_7gFw&xyTM z(@Ssp@95AM-FzKA0y-~ZTtNzRKo0>4F2i743MHnsRs4dIN9Yu#ol{@;`9u1J8H|kS zB%~ZpP`uNs^${fqMeGg43Y9>P)1X`9r+4z;AK-bCCh=IUFhCWr#Q^kiSYU>=QK7e7Rzmjuj3M<+^u702B<)9NhxX^Ba`V$q>_ zIe0KXi7IPcDxU`}65$}aHv@HD-AZss3161dB_gE73okwkkL*5x(V+p~&pY5FFJGm8 zamuwlZT-n~Dbal#b)%FJ;LwfwIkK;~=EB42TG>FpcJlr69pF#;NH59K;j-+uX?mEQ zo-I)=usr2o9T){iEh0A)UTB;Sl1QLr(=OodJHCwLPdyi}y6ipi`^|Xt!JFfF_Yg{y zi}Y{m2RR^R#Bw@S@@z_kOIik<4i{PZ*0mTudONmU{BBG~Fc6Mkj4z<7xLPHn*Zlw> zR0EY9tcenZGm2%d?N~&!WePI~wxB)OVwjFEZ6q2n@3Ix!Y#LB`ooE;pHjzmf)XEg2sN^J=qAY63@l$nIoR#+f7HCA4ucJu1;Wf%jAl ze4kW|f}X46_rJ;qrTCGvu}Eb-^B?n%Y}JtK$72_LPNLE{J0^{Cc;1^ZO*o7!8bc!` zN2UF;cbo1>$1-kv%a&*M#=qCmizJ{ANfQRu5_a9Oa#i( zKAUNjnNRnvC#p*R80YOOQPti0s;E*jmRQ?6kAq*k5vz|!kSZVY(JzG0vNf`{=Dq2N zJJW-JC|e)24Yut#2`_x{%dqqKow)J#Td*2Ifth}vaba5=uj5#kdr?mo(QkbpuxVxo z<`?&a!;LT;tY%qkxDE*v>9xeW69!{~V3O1+Qn}sR0*D>Z2@C`Fz)u$7D;SmK9rf!P z&Y2Gkiga09cm&Of7a^p*3s;6F-()(Oa3QR{Cot~Pi^pAR9TsFwmCcF+sm!?t|m=X(`X-(hY zubFNR&V*z9y=88swq13kDpQmwQm{sEOjky#{| zBV&rr%6O)NRBAWKKBINee**o8|D)Xxjn(S6D+)M-KAu5!WHf+th3vI8NDn?%&F1C2zmP!50Xm z$LDK=yszHO)BuN{xEnX${1u#a?uB^!JAMLNwww}+E+-S0=rL|f;0~0fyqJ!cX5;V8 z@oy$#7Sj=*hy&P_gE)NEhj8fAzk~Mh6SeA9a`M0p9W|`s|eC>HBaH zucg1W2#^lS??D7gN5k@*yfYk@zY*t|uBAW9`L$(VzfqyBe9t1;60c;Z@?F}^M+Rs1 z9+C1L*`}a6LzGF_GCf+RFA4ZUHj~6*X0rWewOl@37eG~>Q@lRp2*3O{jNb=Q5{6Cw z4DolywG(Gd_t5Ov3fd6?<=JTIrb3Q>qrx^toB}#7W~e??KT*vW8nFbYQDUDQxaJ-_ z{^`pj`1dXMFuz|mNkxe)OHfh#3p4TE^qB_sJh&gG<-R-coEKb%H@)+Rup9xYFI{&f z2CGY$otoxxW+hIAoCHwEiKbwqsFoVtZ7$4gM(Fj0@R4R|`F)A3mId}b)$`V`rM+&1 zMu3gB_`dhwsLsPk=zW4j6IuGqd&B|^@G>|G2NFhFh2b)q)qUu1iU1%@gZO0M5>Gv4 z`a$J3*@}Lqv*@DYyYwItfjMe00)`Y!j}*BME>KA7+2k_HK{~~nPA3pQG>YY>rS`Io zLFq64E_s)o0-0_GiZa2><})B#+Ss@}%=UX0)xMEFlW~c(f!kh97}T9pCw{Cxl*5f- zywcZby-tSSS)d8Usjg<)boDU#mUXX5wVWMw_3+p2doZxi?MZBrrU3YU0Vti(5`C!7 zO|WQb2yJ0>@e#e=-{E?uNsAUG0yXUsyt=%Ag=mjo_S)~msb`;!uYT=ISUdPQX8S!} zmMl^5C9e??bP6)0dDc$koF9i)*Q7Cca>>1?SZ2W3B*54^)%OWbBgqnA=sl{XAwT7( zoA@c7(+E`|WC464T7e%Q=Sz9gHofHU`sr&Lj8T;y0d=T);7R~pd8P@p3Hr{{J5g8a zLoop!;;TPvb!G~iI{B7-jNw&N`M0az-%U06=VvV@QHh-B<=;;En>w}oXP$8ye)$)E zI)DCEClzZP+w@SR(?9<||2^jB7ABM;#vnLdL-q*O%C@T8GmtHh1c0hx^Nxa#EKyqL z8~muVM)0xU<(X%)=%01Q>G+-h@Ne<1x4jv^_)q>d_U^j^$DQ78bvVO}#;M zDQC-K%3#1sS7(aJRX?p5E>xuV&jL^*I6-fJH;p=B4q^xF3W)O{z_?InlWMP*4gPo(T&1X zl^;|pe*8(>v2*7ZtnHph*)X3npk)VqWN+L&3G<9yd4vkEBSA9Ubq3-Tx+c3%7)@xC zIRBn-@~-l$TfrVKN#YbF2yk7dOBbM+b<7 z2gXkKbOXR#?R24$-y{d0R)AE{Wxc{@L9grhBLLm~j6`2+*$luKCrgwIN2bX0>0JTn znp#JUX>dWHJg^H_w$dlq{g%17wb-C~+P>6`sE$k`GJR1dtQy%u4}8W7G`c1&aoxHJ zl>YKTx`jVgjtN-b98rB=zK8l#T#>@h0Sou8;qbLLVzm4~ys?4|Hl-72tEMsFh7xU` zBW@)Mu;r}@+6E_`ayH)d_IF{=fql6A>dParG{Vl=8LgW{g=ybZRWrUVfsg`t_q0Jt zTlV^!qS(yDXI6^H#lPWjn3omj!!5{>$jMP9Oyty_vfhNKPVO690vt>ZWXds@$KQj2 zG98X}YW-#!3|OOLHMYO?R9loIHdPW*l3kv#}bVNary&S<#b{vNX{W=k5HJ0P_odekCs&vjL?n@!0vE4m|iD1)iwVo87d1*S0vr9kBn= z#ZsE+0$vg*O4Q;V%E2Dst8y@h9nngFI|QVT1mr)O5FH3|o`#DEB>$VEX~v@e$VG%9 zgIKfEQzfz_j99j~em2snk_TjoBMuu`T9`AX0;=$U(0E&U6Lmp4-;Gfgn2#!{#J+o!Bvg>CUgcwZ180WV#%?#?uVH>v4sxW zTYF!DH-1)SOp5Yi766ArL1ig8S_h2TQgS0~T_zaJp89AOwB}2PKppn%4&sE!B@YE* z1z;rSBf0VmkwR5(B_8LimYpN966jKZzu=;?O4%u57+WK+q`m%9#2=%BcIZgUMTSa5 z$5N=OfGPkOrp{LP5)NMVXq=$9E)^j>lz} zycIi7*@n-4=@Su98e#j)bdhtEDA@E)*>AvIn2oQ!ATT))lxEVo>2D zvBQD4PDthSC~r2Ax7p}36J=;I1YuE);xfP0?6LAz-U?D0;pD>ctJwb{wv(sT?J7CH z+jMOy&-H0=x>527Mt!r@LKl}&zTav&!51S~iT5kWcuSOvsInqQri*=@JkN_#tfJ&a zlT)py^u5&Ajg?X8A1WQFI08xCpnF~iZ_5A$t8IKot}0>|2{Oaudntj?O|-MawFRuM zMETo%GA?<`U&ryMor%wV?$0qgv_CKT51u}v6XoEfTwdY7CRDU!!g-*XDz zRxgvuh0j5Gi>abE((CiUIxCD7+y@+Z294Saj`xE&rsz%?S#C1cs7Bo6E8t(7kaRB{ z7^8N03)LPc%pg@1Ae^HrkEu8ABm*)~UB5n0pTx==UZK$uo*oAYCtVu{63Kmr&b9BR z4}JI(_?7?j-^W4cT>c#<$b=vC2h^TWFd=|B9xAUHBzwAnf08bF74L%-YTm7YJ-#N! zqcUg#sG|#>L44^|+)>0|bfS+;2-Q8OV=H3|Gs;I-_0PC;_8F(+zy0Pv$G`cHe}Uiq z&^&gY_)e@G{wk}#ErGb@^H>7pFdDmAB@yfz8PIlA$g8;ek(%w1EKB4^8z?NC@+aD(3$jjfSraoUBJLr4u2{19WCz1{1^WaD|bI1+g|h6(QMnr zbPLKg!C2H8L3hamP0mr4Jr>K@q0n)-X@I3o3z*t6joJOP7%Z$}Gz$5&-N1*;SlP0- z9H9njT`|EA;oPv<`Qp`HhEi`C@P>}P?>v{go8aC2svcT4N5dH);^Z_%A1MezW&>TM zj=W2Jof`+T##r&*9%^&RE#oQ?T6VIwTo(!9$`$m9Z&UqmcM!;>_;DR7kJ2Owd`C_% zu4vzu-;Dx*1^iRMJ7qD|XDpOH2GPqXMPl@`Qn%aivzxXA1?h9Uk+wQsx*L?FD zY~R$wY%`6rEmo<&uelpuI$D~#5lIkZ-eXy!c7VZP1*^khyp@2(sZ#eGSv|0cDE?2J zDUI3**5jgYG7ANn3i45F#%u*xE6ep|DQuYl@yjp^_?LgnzKHq#2IzwF2`pSorz#I~ zlwOe2PjhqAGT%YgjrpK6naIdXcENQlad{dA77Az^xDNTy6tXtt`sb5^)9s$Nsu;wU z0s97n_)Jg0K8Xlx%RZ-t#x_>+y%%hw&(d=Q176*~(l-^vk#&NLjx0T=(fGvq*M0(= z6%G|M3DBe98(b1lD1`1pyQ+`6*T)|%r5hQ@@+Oy;f>1F1Sk)bO+i zkrvQO$|XJw#MuI&Q~J$^gg{lUMep0#8B9y2A@OO`vR^UlvmUKQ5PlI$%gfku!Z~>9 zn|=_RHf_aKpZ_?TLwhmXYt$x6&Lo|bBjSs%GNLV!#e0$S*AR3i59-f}I?tuhd3KUI z3=S0cyrKZF!p*2BGlSX&z2@@oyKXW-tiv@VIT-h29C>q%8Ef6-Bu=N_(ALzPV=NkP zi22RNk_H}G%DA z@WBpWd)@C%wq5NeZ)SqO`ivlPSoe2LN7E%ioHuetgeJ|`Jp)rm9hjd(>pu_ka=pFs zLyOSO{JTlhKmCR8#o6cFieLVBd$4uKYq50rbC?bLdB(ap<7To#hl*YcSH_t?2`=VPa-VYo|1ZQUX zyVy+MC-S=DDC%glzT*06Wu4%O6)20S+|0Q?;=OI3M;WG|a&Y}SvGnQbyw}<4%0Med z8Z}tUb_VB^7`)$Ju)J(wCHFZp5RzAUCWC)DGLM)4sy8onlmkLWWuT~=qq(}<2!Nyi zxal6oejT@nkx--q3I@B@Fx)!A)V@fg z{Sky2j0%stWx*js<$Ndrd9LyjBg`GFuY44Y<5vTdB|lf;U{%gP3Dvk2u4MVyifU{f zJ*f0mTbinDQwGDN2Wm*hi9bnB;7bgV&3gGFeGgclMpcF<90A&5s2y1ScLA!aTfPe}3OPE$4#)hrc zsXBy)`&XN{uD{^Mf|1_yceI%M+C3P}-4`z$LRoT}z`wNLX!;wOB2D}HsT}cg-wa5l z`ftXrlh4Mbm%SeI!+CuEsxL%vZV6jAP3H-jv~Ot!^5L~UM7rvS(eCnLOwYfx)4c_Wua$_WlH45E7UIp525zj#l~`7cz9`4xd$VGOis?<-d{-ViycMh?oM!1eUbl>RD53^d`UC#61OF7G z{-j3Ny6l%*CbNEKl)H2bu858*baB!(IuE^Gy-^A3GbuSb1pnJ}2_4~G{*)|~q@nX% zH;<#T!_zi>=JGG$SN_$%*TX()N*LT-5B2N*kZ0^Q>X-vy9VGT?mVApRnJ_aM#h#eK z4r4hzgCyUxQ3jhYkjP(Ek%Ik zOX&6H@{D;yJ)MY6WXv%&>Uah30l=F$@MUj&i}Ul$)xF*HPyfHajsN$qUL*wMsNq4_rXw?Q2W^GXUE&Dp@Ap){An1RAfH5rHm85+x> zAe}$5>;8a_lH?Qua6}A2BmE@mZ_MfCI`MkC{`3sac-C3icW@cYE6Z^VPH=G4aRPlz92C1!44d!u&%8ykVw&irsUT+X50w2KTUwRxbJpUs6 z@O%FOzWk++;lcZF&W8Z>xxAr7<8WKc(xtL|E`t|oklRK8GpwQ=E@Sb=PhjP~8?pVe zAHmdV=eoL#c?j_P2`m2R&1f@8SCsy1Q$$b1dDc#gytaJ`(@#uev^a`D;Gpac$UvZ+ zwp%hDabHTbAHjEzuT$<*U7Bd!SDp`5bE>f}xsSTJu8hvR?w!i(YBBB(x1_pQ=T`Xi z;M}63ptby_vHIyiQH7g9jlhGy4P>3Y@u2nj5&-A7G1CHh^d&4F`Zc6zxM+Rno^5u|gaBv_Sw@W}mrk~sw-U?d3bRa{k z$CZ%VH&5|_rc6?R$N$dyahXO}A4njYLa`8d{`9===ro#<0ZpHKcH5s@=U|e zQAh7{Z-}jsT**U>g_x+=nRp%>q7K0c2y;k{>Gy5_4l;5Yu`@8-{LnoONZ zj3_)l`F2HFqGuSXCz~^)E$M9fr1^;OOytXTJODGwG%nU1=BqV$vi(Hv!6_K()+<%)xY1()EmZP?xYA{J<}}Z31=RCg(BGgzi(nh{TyL56HP1>SRNT zaP#1tnYMw)P2z;NJTRzwy#nvL*SU;p08|Dc2_WmIJ@Xu}FQ_u;LVz8f!p@tg69PybIWEk7K`r*X*K^dj98pwZ*K7Ma0vhI}nWFXqF7 zhB;Dcbm$Qr{P=&wrt>brmP@_|&8BUb?0k!^Xlj642A`d%Kvn;lzXX(xRoJ?Q(WW7$ z56xg^-zKastrSqK*W^hI8`L+seu;jh5tLjD$0rg2HU{!_1V{K?en|aP#)MREOf2s? z(Q$3YxNhvoD|HH&sNr({2{D;Dvvj}p5tI^9%f3{s@F(p-^2MYd?{Y^ z%1d$Y{rBR}KlQ(`bu(edmQ5(I+7RVnffm*2rJ;2|15=o~)s{#y%Anr-;yx^`EWq?> zQ)o#=mUe7A0S8y39Hm1`B52Ukpe#L?LcMO$@vOunt|B3JxFO4I0CE`y& zKUl<{K+mO|1`0%%N^l)oZ4P5!c{WHCwk}6*UqB<`FURpml2E)?Mvv&ef3beZf|PEoo|9M zAm8A&;M5I!pbQwn$#x~{0b-#oOW`uPFLcm60^}+3egrp!Cg?=H#C)7%JEQGQQKEwg z{4FdkVQS}Txa18#h%?W-5I5cM72I?CH?Sr0S%0d}eE~P5w)};X4!go&s_dRTpfYGqp_C1Pr&-mQ~eHgJ|{i*^h}=wo zfkm3Z;__A4F?A@@waJ@ir>DBK_4+se%YHsP;Z*DTXL27Lo?pljf4}pAkK`r4o*KbL z#^m8+2xEgf<$s-kG#lra@X-V(T%1R_+PJ}noJU|W8&rWGda^0XkhXO)CIBH&oJQ{ z`y;l0-}s-xp+U-S8C3GmN$H%Qv_tCJi*EW%gT;k8+;+z;=uP!-?pe>n*=L-F`yady z`wu;4%bN*#x!&R7Dz?l+dddjY4`w>{h`^hj2gnJQO_3=J3|%YqZwK*j zh~>Ml#L9!;z_wTa0A??^q^gT&nXDI@FhN1rZKzBnanYefktUv8J#H0)Ej`Tcn?ZY+ zFkBtv2(Ttc682H{0ShIv2?7?6d837PK4PXThwj?CrppaDL$@{VUZ;sw(m*8lUBMFYYy$q8vgKYmNVf!iHLjWH^o<)s1fntTZIahO zqk#Ea8yvd!E@0tK) zr!gEJ!tvXBjIR$l(mv#TJuni4z6c7~WIM~Ct+hGI_h^KL#W^f5ABeYxreE9gSQ80# z-g(c#$)}!(+wZ&&{is_;gPzVCq{DPZRDj@NB@bo~?9=h2q4dI1?4QYXi2!W$xq>za z7u6+t%I~Qbw4=04IY27DJKJv~d|9Fd70hZ&-h^^E2PEH2TVAToI$4%v689hF<=kL? z1T-?gg*yMV3KYj`?a`WPFMWsOSGas2b7rP$S_Y_s z0iQWKIt2K=4RdPjnF17&=}ILGSdN1dOKf~g{@5I*4Yymop}PKEjU#mB_Y(*l<$h&l z9!qP4b1!%eE`IIzVP$QID?alPEIe@^cJ%wP+KtntA{9;DFEDImVfk=$TUO)sI4LoT z6C?c-Vo7_@r`AQu(OBI~X5EGE?{2$-F@)tx_48DF{55Rol`~a&_c30(T%t^Zl(r~i zh;0MLI>O~a-P}sG4K;VfQB4MAGQF!pCuQ-SF^8L(JcNqmCY~}wGdVi&>6{*Uk)^(OD z=j0ig#(B!qwk!Vu)%+gccxLeB!;kDKU%E`xy;$Ar8l?L1;7rSU5L58)9OIP0_4oY9 z&sN<>^2CNKQ;+$7$#GZ8$R>qI3GGxa^Xb;lc~f$7^2oGHi7Er$2Kc zZoKO;eDbRoMv$c!0g5Xz-9Ln>Fo=#tpJN=-l7vy7qi;BRqgpwF;ASf)Xo?N!ga4gV z0{(vI4?l|E{)3O^gFe7qkbPFRck1jiKgj-IVZ!92C5yk1`{ZP0Ouw_ul-coaDt=(O zS8cq{-y3&LEOha6C_AgQIWD~HcdIHD6vl8%YRO01@w?7vD@#8b4Ce=ErlxWH37fI+ zu@%cp99Ug5*`hL3t;-wT@3xOqpw>m}I6yGdl+@o)+0H);P^kO=jkO8z4zVCQvw3f? zlHs*?D%4{hWzC~ZWpsuF-n{7;!aw^Y5>fp*=F)a;XXim3W#kY0UbdE$FZP{BN3bwP zk#{RAaD^yzbbNP=M4V3plUY8wyWFcPS_t_qV9N{@)k)Y0>d~2P~7QT(( z`|<+jmkvf8el6#dc)qkX9Wd0xnWvqK=RWIMcyRY_+RAkd+9i)EGhuc{wnY<_=rIt@z;ZZfO?(zfjI9{jJ!*lUjliirbP#HJ%dv! zGRZ`I$cO0qFf4i!0{*$J8vyOY!p;p8VDo4^Jnw{Zsxw)XScZrQx>dtSsS?;)6}w?k z+(PLNxLT1rjMc%{H>Fl}5V^?&TTrdMnq}DAj*j#=vX5hRVeAd*r%*is&X%S z8IFcnTb|F$%F_f_0a~|2UYm|{d?R;Wljkd^qbH>RHCW#EiOyCU=)-k{Y5j}oUNKNt zGne0ePdw%qzx-Dwr1M>l3MA>PDqkTQSzDBkK;z&!U?SHMESmJidoJR@SNXYU6lHE} za2?9)WaDX^(%};iJ^W}f@(AX{p))H`y(Q1__lkY34?@=wL6=F_=k=#!di&enpa7sG z3(^f^wD90yWmN0|&O?5fi2HoqL(ho=g>`(set!^K=oED8w_X{+rb9*(A+!@-gYN$z5OnH z>T_Sp`Y)ZT{ZD@3=WyApUzWdbRQkPNy%f)W%kN@k>jiO0vKhn0E3v70EH4>Mz(Jov zS$fv6!%WQC+^1!k7V+{WRJvX1@C---{QcJ|;*bBFdr=N?F#jWidR_0?J1^oCaXw{$ zVosM^*{4ZXC>3Xl{YrPOA(12VXKVoDqlfA$nWIV^9f-0$lgiD{%N=oV@9!{r;vAT0X&46KuCaPEFUiEa_v3=f4fju1kpvk`$9#7T(Qa+g-`B^~0pw^v zJuNs0QpB;WnQzL0FQjzha>(mwbOr*I5mK2Bb+79e8PDiD6H@gqVf{2IA06lfmyxR{ z{NT+!tM3No5o?USZxOtqGNySz#(NN|ckbAt*tt6TP@*jTm?!V=$5CMo1pMRYbC7A& z0TJLGGVqs|{N_FWm|YqpO_)g84hcp5RQ+mccsSs|Rclzj^A=#`o_J-cJm?P#$}cD2 zPc8ExLA12a-5}CZZwt$6&0~ice^ZR*~ek4@jlW%vOa6Df8ybI$qbNKqLw_rKS z#Z+&K@%(`4nay#6VLrEUluohr^a>s7s*biln~sueycC*G{q@(XXUKrS@@Mj0_6BU6 zZilZ`>BwFLHY13Np{tKZhQrDU93@`)oaJ<2nam=!Q!qW`kz%KlP}ymIt}XnV0bDrs zAd!f&?;na>@vRSW)FFtOA&n0^qt=ekgJm1Q+J z+h!^vjPXXH1x>62wC)nUs!^5m#_QR^jfHDp)`^17QLps zNQzxd-@T%66CAD6vqAy$&8XP;G~qNFV6d`;m1u{~eBLFv@D=aE%*+hFe$5ql{E@pb z75Q>gzo!*8yaVutT}$HqlheT;3rmMJQW2E)?@Xs+N8dec#&lR=9Rk$4JB-l+j;3D6 zYaP%XVYx_Ax#q!3)%U0X-b!9fLh`eHr2rc$W;}o5F!y#5CwZ>JgJN!RVd!w=iRGc<0U?TZdX++}yInn>(CR+nGXb7O%go3(_m7r9y7wl&8< z=t)jXQOiwr+KNcIBLR(n=a+sZM+N?~U;KHz_lN!(HX`lZz8N3*)mP#B{@$m6lP&{A zpke92SK?gaqu3Ny_^Eyd97a4NDF9Ka>qr5u(vDEs1bQ0lh6MV3@FSnaC$G2~SAOl5 z+~8InTEK76pMSc4B-&3_$BB!jNfoX!m<$F=7T#HO^oDIL9)j_kdL-hvIGGZsO3&?} z36q;7yc*Q{mN+ufI;FszQ38y;>}e*#2)5UdHEiVcP;m+84lLr}d>k~NbyB>1CvvnI z2f)=jgiOhhyQY6F#-jX~LGzGJ_5}nF2&=)L)Z3NeBM$R*D@zACc}BkM#S^BcB3*iE z$QeOD9`uE_fFAue&*1OgeJ}PtaX&76!7K6X=Uj+y+<0vSKM#VB49&V^WpODE^n2K{ zX%l9qrW}^T4zboFSdWvexZub|9IlK{xCq2fWLI$%M@i*(5AyQ zQj}G%+($6lC~k~(=%hc*AQ5U3B+)p0V}rxjJ`lfrBNn(1dYZ4wzDFAy))}qQIaz z5GNDzK7Y$Nw6HG&42k!9@qww3_U~--veW4ZEWGHVi?Dsy4%~F>tyq{}jB-$(NeD*S zmn=e={RjXyn_}G;@}7F7ENF6GmrCbwTp}Ji06TjA1bWy1Fu<}!}Vc>ld1vK-@QlcAM&CgjA1$d#n zTiC1cY{UAit@5TZB~$I+EX2-Y+-5l%4bnj$hcUbJOuXW<@56JVO~2=!yK(2u*F>|p z4>M`WZ_{VGaxQ*S#`h5%LK6R3h%&!ASmT4_5={p2Tk_NU@!Hn--2RS-)#2eP^R7%| zoN?Smo76TQC^{+_A9mg_2Je>|BOEyCe_uV7ne-#5F*#pi1u*cx#eV<&CNw zUy_yF1wTZcn|m@&7>xu}MFrRr1$#$IsoU7;<71c-`1hed`*@YRs08nBS>3u`W-Do3k1^xWC zWbrAaC+7Oty!|XZ{NN*a?2&shSc(QAI?+v>`OSkNLdBs0HAEmX=X;g9g8;yk>r+jd zjZ^7Wp6(~>&Jf0Lf5-amJ51y&;eOlJNd|~vDre#8kP_JU&?ArI);sRSt+#&*pZxsQ`FBd< z^O{o>%xyrZ$RKc&u#SKL;z&&5AtceoT2uy8YwVm$^K4|eudRC z{ofLgt;!2!pi~ApnFj*6J`%X5wSq*@6g|@!Sc~V3hU;%m=+geZIP};Yp7q>Q@Dak;yxBY$44X;OBclOs`Nq|l-nJ8$UGf^t$BDdazJ6^!&9e+TDW7^f7oGp!^bEE~ zAaE)Tf~6iU4~zoqOhPq?O8?64RXkKF8ouRVirx@gMnl|l=k2)j&inA{S6qfyy!_4h z%x6D@hwlGItmmi%IZ2$5p6Dzzk)dwC0D}3n;33+@eK`E7-^TQrFT(aWzYo0~C$Nr# z3pkssD@?Cf9I2l&JdkHo6-Jv{tezFYjYAD)_s>R`5WHXWC4d`Xzy>yGO>O&Y(fx?`P0_4^jF8(dkY47`mepMmqI$1JHvbi2y1 z?8zH7;zJPFj+dqAjevhJBKPC$!7$=zOHY$1I&&x|LFHF ztpuHwpGgKevyDMh#uAk`r{r5%!^$PB+<{Ts}7yLu#^4FR?)L7K+Tx2l+lRb2&H zn*DPMSZLk|jhHB<9Pm5_DNTb@?xZEy)Kq$?Ec=cVPQw+fuB=2B--;Js_Fg>qqDyi3 z-~oL3GattM-UlNvAEjU_PNwl`;i}VUoa7}yz|k_+X?b-C3#%)T;7RSvHrcTT!>}p3 zN$J3!k?VW=w@v{Q6LlUDBk25o|Cs4;xf&+eE@w-S`fUcwqf;+)$q@ z=(s(v2Zjw06$JD;T0TP2mGx;dxwr?F~5+@K~jv{;BukH~!Q6$LbY2HRyh?le?qJ+kh);h4J_^ zJ&n`a{-p`e(uQ#+@+pq@-2Qc}EIfg9Qe$trpHFwpJtaa!lk3#g6J!i9&M@B*_~(s2 z|E5q^EsXP4S6@`w(zjQo?zq#->n~1UDKAQ=F=@ zurQ6!`o&pcph7i&jV2wllup+DxBvN%@zj#JEaL)D+nt9VeO%vpX!m1LS1(2YaM9U! zzDwFm=D@+uD)fh4)iC=yWbypu#6wrmuNU?y++t^2884!i7)+F1TNd_4y5-&Z!90&MczVfp;?X)xTz3+ZEZoTzJJn-QC7>(@EfzjF; z4h`4h;C&XGXE#T@t;w=S-2bUQExQ^aSEH=vXnEOmkb(F{fC`KLdELx-P;1KS7`^vWR{#wHb-ha3mfOQ1_X+n~e^YY*Ry{eN^9 zHoyE`*z)qX$5*DEz7}2Apq`wnKkdm0@*^O2Q`)(@lQ7sEd2xRqQ}dLg0dvEZfwhCcfh!JR<<4&ctM|l<3w*cF&yP6IJ}RA&uX7YzJ`iLEX^H$f z=O2%^zwJfXbMP?!*XKTqmDrG-n|4H-nZ{4UytiMrjiO_CKS}}pvb=H;MFfNT5jk2i z9kR1JhlTkkFpLug2|UWn+o?nck7D1Se)92n=}TXXhj%}L&tLiZs1v3z!%Oc?Wfm)qJ(}RJ4E~nSlBX=um5wPq zp%aG{;8b{qr~ro3JGLU7K~$plTxX{rvKbyV#s^)Y%0HU|-qEnWr@-V$DPguQxV-&> z-_lQcaX3%vkQ03Ih}uwq(Cj73IGLl)J+N0Ix63E=xu7{oUwRqNy(MbQMdSK$cnz>s zRvz9{k^U81t$|Hm3#zFN4zn%wC8@7;g_|8wt-&C=g13Z9AqvP>?b8=rSE^nJHg71; zLcqcRi=Gr6Wpz{#RQJ84N?-dG4?<&WY|FMXehyZ1H11lQ3^?ZfP;swPnMi{S)&~cD7ahg}QJ3 zY}Ul&dCBW?ci;I!G?rgLt^c`?b!;Sk(8J2`B&@Z^DMkBL(c&l>vZlzc8Yb@bs($4{ zkchqD$_CddIFgv3JxMU6VPp(20kG4#8Y0vvJRx}Jia{|YOTdOFeMiF!YL2!e9goumvOg4?)fsiRrX1r59pNROS9`61y1?8t3s>IRrPFF zxP*;=?+^aum;!)1wr|Tzfv@@M4M(U;{oO~a1*}iAFd>g;W?DyZI8o{!T`?Ej1PPIiqeFKR%vZx{ z0};XyChBbUp94pgdVhoLUcmsUlJ`b4A>E5p@Xnl#4{Dewd={5d+SDk3C60R<{A7Bd zENv|?aH*WJKA)Uh(Ng$5OA4yJYhrr*&POr#=8JINOV7hM?oXiXbp0MxE+Oi}IHbaU z4=+Ns960AyB7I~aV#^i{6f8x$lY+^~sr*(ztPnIsFC==W12;y@6Xg6O9&VH&Gy6S> zKC``YP{!kX9>f>+@54nGo{uxmdN#g!>rL2y;4vfdq7+~w>&H1$8Mh8ox zG~9GV1q{1-v>a*B^z-$!$6$JLQ!~UuoJ9JIPyQvIci#DU@B97%uDkwPeDmfjFj_u{ zrazq{dJ3(0f;bI=E1zeX<*JOVk4f^> zl70T{FX)&mPf13WS)CqWH67|w0?6YZcU~Z!gv|bFaMcN@XxQb0E)`{5)~*6`UptJs zYwiZkNANG5?#nYO#RpFR4jH6sR9_SwoGQS3){W9Wdehi-{5HJljTd3tNn7!$Yi`7& zd*{(_X0Sc2xJU<1#h)4=7rfT9}BCvqi#K7ZHfKYm|lnoAxE{&@qYbs*L=QErdl4lETO zF7uH^hAXDvS884`p6Kdv0Uv8QE%)`Bw^!bA=6)PH{hAk2b5&%buyqtsf0dlJW7#Ww zA3Ak|%AZW6*#u*$OW{*D0jv5{su^lPj%p&wJ+W1xqFb$Sl*FOZ5d4Noq_o}e0-3mE z9n*wLL0Y~RJuI}60ETK2fL6ZLxz&c0&$jZt34ZQ9INeb8Hx~O}-fuYyx>34IAC5}Y zcmn2E7BLtRPB{HVc+o4~fa6X)1rI)SFYdklhG?JXFw>+xp8J_c8xnbu6(81U^J6SY zT}E-T@6gh`s$|s}V2jtv#Kd&0bF$+t;IWuaKiA3ioDin2ggqv8CXtjd(Lz_Ih~HUj zcVRh#f8=%=&3>fydFT{tz#2D#nBo1Y+=0P0aspAwua{GQmmE=Qfk#!rBSq_JASh91 zAiWNUqRwxlA_0B2z69Tw@@JrXSUAf91%6sb)XgL!U?3`_brcFM@Wx8lz3Gi$3?+Sf<(Hx265V@*m~F%t#`TjA3+! zawF2X{Rl^RDjX%3?la^%lV?2L8>IK4!V;>Sg1%$go}X}Dzn>_SJSNpt9c)6U9M=MZ zcc#?Q?K;-MHBX&$!2G_@m38w@n9XmR7ZnJkB|bLbLSv zV|etzIUE;3u>S0n+mD#csm;KfkK*Wh1%#?U#|ClIqfR>qXe?9KG`!>AvMK8uh7rYcxX|T?bjd{Q` zTEpDJJm%(?ur^3wo&lU`IbUcSUE&&qw&WS24ES0BI#eA;Ft^vn0n8Haz2|29vtl2VRj6y2DjY?7}yQ~r9>IqGI~_%R&(U%!UA zPrM)P;$bsF9bM7&8O26*{cHc0_DCW%FNtoqwOBhlexBIF)TZfjJ?+tzS+dFgtp4%D zMyLP@XBVwuet zJR3N|B}Mx+k^jnHqsxAij+%-j9!?K2-(SXZjwl^P`w=;?A?-6G?mBIpbZ?9T2xUzk(eR6yMfME8y31-YH_fpTGhz;FnIz29Keb&UsHnSKkEsrKp(DCb`}l^L;3S ze{te1zMr@=d33|!2-E!r&pr1Xyzz~%!-4rj_|%uL#r(obq-~GEzt(x3EpJ1>hdeR8 z^7b9^b82cf|87S^SfsFv@Kx?^^iL%-$SL6>^F5Yl_k8FV`UMC6NuH@LO=k(PI;A3X zl2?3qriU%ZABTng15}bGdUs4noegN}-O&nvG)kr1*N*KZ;>)sgJf|}Owk<@4yMy#+ zSqj`WZC0+?XXUvNTwS2L+1v!7h3JWnznH#JFwqPp(phN{ocO5tT3_V%f<$3zWy^os zr=gZb@qbw-=+-uXZX2SJbBf|?gCLXKU9r|)3sw|)VszSVc7fqf@0SOgcqn<5x{#w~ zsj0yI$de&jZ*5bttxZ}kzqS}B$l^r#mXq+ZH~a`Leb-M$9X5-rzw$ZUcEcC)B-wN? zMe6d>cZ>Ni``Q3)+`9Af@ z88Vv*?&w=WZPWs~<6reHI&8AmZpHlITr7`HLs=mb)LtSO_o0%I0C9$h0XDKO65C@) zdJx$lJt^2K=G#}*-?%PRt#caSC`krw?t;4>Sjb58HAVzNcyeWYJE_uvG~qrv;zR2^ z=$_XvdBg6qS4PuJLH2K$#5eW(R9){HGRlFAe@1ETI zohCU9+9)-YO-WK1>lo64`KYV(9L&}VmX${Y^*gwMsIR$!UU2TK%u?N=6QQz z?=+lk*~6&x=2h2ThyUx}|2B?wy6n}jz^-k(FhzaL_6C?ub5TbzbE&c#Y%t z0}P#Iysp*V{79aocDx)ZOPy_Qb7qp_koWW980I79+rgIZ7<*Aw6$-LX6y-t0+~Ixr z^0i;dy!Vc`{&k$N>ui*PHup#@Z*64>hYlUY!pd@{UCy6;oS|!_4rualpKFr#DH|{k zanv%UZP+M+3N1#1{kZa)&*Dp0U5CH+o}b3M-}UpDnL57gKjeW~Ju|K`FfeV1l>vb1 z@|XO^nD5G6S7G1p|068l{6!d}uz>Vtq0eLV@aH1__N{nhH6Pkh4z*#~ zl_i}nN~hpXkzdmRHgy`q>pJRhXY0!ndCQr`xZdheCXb;{)Ki9`dfb<5v^4!n zGI_20{|46*c|5psVA{8;Fv0xZpgJLV@H3Q%_;P@klqYQsj@2w%l`DELNIr6U=E@NroAm*2cc-Dn)#Jhg@@8hgimDaU8(%C`6O2!g{HehpvOGj;gpJYFycw3mPB8?*)4=)C??p^;y+~ai2tW zD-rfinK{f}UdH5rYI8`PPartD$&ySfH~%E_ZsfW2TXy+N(JLw5V@e}P%HC3?GHw|y z9Ox%Ptsr1qK&&vrW7mHJd-tv2^w(S*aieM1pjH^oDyHy5ekx~CUOqycsGF6jV3_IVUbk<`LWY{&ig-Ga-n z_!wUP(wE{*uX`)DY&{OPcU>%NIEaIjL)gFnU<46HV4*Da5xxM+2Gw?<{M+Qm(|&^` znx!mBOv__ad#3vX960mujt-i0y6p`CbP9@(GRUaD}Fy{o4@gh^5MGnY%wRg|RQL?ihcs8)P)z zXiQG)&sZV@q@t1S0n!&MmdBcJvc-; zTt~n^NgSyo`<{;qsCNAEoA3ia@_PLE-*_WFd(Dmbz^87&q1DaU)tka>SV7u{D{@si zEGO4-SbnEdv8m+72YWU#$kY^eo_i|x?uh{I zQ1&9^Nu|t>LHjaKLY1&|7}K`KBwlAovFTa^R8e(A9MKFN!=aMVX!9DIjLI4>pz`@k zKy)*qZJeK~F54T{szq)b8#>}0%np;AI`%d`1nqh17Tw9CIxGVd9#()ppgYrERtFR- zsdc4NZxSN-cFDbtg7i~&;#ajkPl(^e-L8*@ymY_qw4>pAmMvRYCPHb8?Lpo_U0)Hz@hcGukhn;6#g!lZ-e~ybU`9XZ^&O7nxkNr37d*}wtMtPr(K1!4J z3&&VK7+5zQcQC8>6mlO0;^}X?ujSe`xVDO3+^Ni>BlC zp<@7{lk-KHrt78v)2+ZbyHfYzQ1eu#TOZ4#Q!zg{FCX$D{4#MuK9p^1OIdzqNgYm- zW$Tj+U#P%T)*+!Y1W<8O^QA98UL0OH>b>*pEPd2K_%KP?2R zd~7H!^sOH?UBJ&d-pHGLvjbV}5f+?nBAZx}N$k0~IsBV{|6g#d(`#P!a>$-MDWY#C z4w$y|Tg(pb#nfYe20Z@hybOm@+720b^4bngmEL*E&oUgyJPT*qe;&HK|SW- z=5{B9QBlF7(zFVprj)hMxy@~>mGB!Jl<`uV2fyroV=VHI7@+GOtRZzsc_#pEaUY(z z>Skc)N!WhTi}E0~49eU-#1;4lt)rZt3m!&j5=K!nV6Z&U!Vl>5Mrv-4Fx79+@2%j=*M1uJ-hUTfd+8f+(F-q$ zSlUdbE&k+aAqd6imW}i-L-8?(M z-4EP|Kl{ulaq1Z_!r%U>e~L5Dx-fQWiUwRkIV>R+BvFw)KHVXKep5VQ%wS+z8XWz` z!4nT){~!Ge%zgF`%jupl7dbFJNXa33v_pSukX;e^$jvN3Q(9^|*iKkEGxpD}X-v;d zWgch~t=c3D3|8&pDe6?+1NdDKb7G<=dyQ#O;o-I_Ac#+( zx`pjd3rq$ALua{fqsx8EvhyYbA=8nxgUGY{+rwB1%Np_5^8SsW!)eLJy-xkS@P6v)V43LxWy~4zpPPI-knj*ktUAoUV$m!^02i8W% zwG`f$sDBe#RPV&UHrH=!bhu`be1XE5ziQbox6I;iFBtI{H~!V z9GN=nRD0~YvCgDij%}jOpVp}gv!HeBF6lGJI0{e>1F7j;QaIYnbhLYBoPA!0<6z@h z1DXH3r1$^92O%cE+vh~o`Hk_xbFI6^nf(|h<9{=kUIu-%Qr)JYj!H{jUOT$cxgg`r zL=}tZ)gbrOLU(i#RUb!8UbMz9{naEjJX8TgB>LVtP1zoV01pyYd60eA7KI5K($Pws zu1|dCiY#}>GF|rSmq-1v1IeLp#f?ZC7^l6$dxtQ)^hGp}e-L5i&Zuaf7YESq!Wv$L z)pk2p6Znwd8kI8u2?!g-=0w%xlCU40zJji1^};y0Y(S7+Ajpm>@ES7HU= zOPK^l(vzf%6SwNOuu)j&Ik`rY->=-CNqr%qj?zfNHlRq5* z22_WHh&&rXJPED;XmN zaP?K6$Mp0p-u|YyY0%Rsm- zkId2#b-`?Zgw@44T>aInaqUfa;qCAEF}&lQ?~A(Qlma4*)*y##WUwVytKrWSBRUiB zrGr9bNpOm^8erw7&tdQH{1R60_?pq0i6-A=GKBnn*EwEa>M}7M2o&B(c*UqsSUV|T z^~^YU+BSn;M62>rwY0YZM=zELz!DYMbe07xojT?#bWP@@G~s&n+GJC(zOkF+2#=LX z%4^kqnRpWYr6XsU_rP|lj9Cl)^U)p&^aKBK6kw|JbOefNYJh`u2y^X19HtI1q*0zI zY9&gSBZ|C;O>7=HyXpJ4quW;Ztl_c$b{F>j@t_umli4kOwDjgIuSUrsW2Oo}hd=Gk~<=l>bB=(VDk?e%J4MA!d z^c7NaF#JYlGpoN4^nehWpvua1QXhp__uFt`J~K8qm@N0EiJ@(fNi+o z)!&OZe$UTi+s;#Q)t5hw8^8K#3=Tbtnds#9Qv@w!|JdR$cj;lhZUGlU&sOCI(N-VE z!G(Ph{Bwuel8VGIF%P=gYqhc%vV zSV<-ZQ>5SA;5k?toC4CQV1uZYr?g+Jult%+neq~z$$9hGI#j2=5bSV0ewVc4U0&Qa z@yE%@ac~{39BSF2W+}kg9w!7e_6WIW?ZzYv-pT(Mr{ECriUz3EgYU=js&!wI%jh)G zy^})FvqIJ*-bdA7iPa{2>;^jOtNU!1p#DmjTn)gf#wR<@dP*tOWslXV0-(c$R@Co) z=+8cp5AXQ4_U>CJrTo7Chks_>a=+bVGgO@1NHUf8_P4%11CU2dlSJU#6bsc2%FOuo z(*$0B_>nydY)+P)PXAW#*UE>E#0bYQnRNM?<_>|SUJysi)e$28LFKjntV`oJxD;|T z(Bm~zwNh0lJZZWpzCsgJ>v(Y+lf1D(hxH^fny+Lh$t$4%c3caETHXlQgM{KF)I3FX z55@;l)b0QL&`0rie)@0XSf+Qs?G5-JAO6c~=C{xDl%rmY&GZn~_I?b**^5BCUIUzT z83qfdU~Tb^=(y~TgQJza1T-%P{&s}=NvBDc!+#%V5Q1BZ!_K#7Dw-gq7IDH3tMtG4 z1>Ap_r0KMXi@Z&EYEgnJWYVUipN@$#7GYIx7ulI_LXY_@Fcn>tMWDLN?4-g1s+4Z_5mNkLeylA~!x8Ko#ew=aZ@mVO9=8)Oeer9s ze9rl}_PT4avbvNbBs0Z_BP>Kcu`;`cZJW1Zs^5p`k`$?x*Wh%H;`8MyAMk)Y2i