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 new file mode 100644 index 0000000000..5004268b41 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineInputUI.java @@ -0,0 +1,80 @@ +package com.fine.theme.light.ui; + +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; +import javax.swing.plaf.ComponentUI; + +/** + * Input输入框 UI类 + * + * @author Leo.Qin + * @since 11.0 + * Created on 2023/12/11 + */ +public class FineInputUI extends FlatPanelUI { + + public FineInputUI(boolean shared) { + super(shared); + } + + /** + * 创建UI + */ + public static ComponentUI createUI(JComponent c) { + return new FineInputUI(false); + } + + @Override + public void installUI(JComponent c) { + super.installUI(c); + c.setBackground(UIManager.getColor("Input.background")); + c.setBorder(UIManager.getBorder("Input.border")); + } + + @Override + protected void installDefaults(JPanel p) { + super.installDefaults(p); + arc = UIManager.getInt("Input.arc"); + } + + /** + * 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"); + } + } +} 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 36b6f8872a..b3f789733d 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,10 +35,12 @@ 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("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), // 数据集相关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("preview", "com/fine/theme/icon/dataset/preview.svg", true), 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), @@ -155,6 +157,8 @@ public class FineLightIconSet extends AbstractIconSet { // 北区菜单栏 new SvgIconSource("notification", "com/fine/theme/icon/notification/notification.svg"), + new SvgIconSource("notification_dot.svg", "com/fine/theme/icon/notification/notification_dot.svg"), + // 三角 new SvgIconSource("triangle_down", "com/fine/theme/icon/triangle/triangle_down.svg"), @@ -166,7 +170,11 @@ public class FineLightIconSet extends AbstractIconSet { // 滚动条 new SvgIconSource("zoomIn", "com/fine/theme/icon/zoom/zoomIn.svg", true), - new SvgIconSource("zoomOut", "com/fine/theme/icon/zoom/zoomOut.svg", true) + new SvgIconSource("zoomOut", "com/fine/theme/icon/zoom/zoomOut.svg", true), + + new SvgIconSource("dot", "com/fine/theme/icon/dot.svg"), + new SvgIconSource("expand_popup", "com/fine/theme/icon/popup/expand_popup.svg"), + new SvgIconSource("collapse_popup", "com/fine/theme/icon/popup/collapse_popup.svg") ); } } 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 280f3ca746..3569e96d54 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 @@ -27,8 +27,6 @@ public class FineRoundBorder extends FlatRoundBorder { 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) { diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/FineTooltipUI.java b/designer-base/src/main/java/com/fine/theme/light/ui/FineTooltipUI.java new file mode 100644 index 0000000000..ae02f09849 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/light/ui/FineTooltipUI.java @@ -0,0 +1,97 @@ +package com.fine.theme.light.ui; + +import com.formdev.flatlaf.ui.FlatToolTipUI; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.fr.base.BaseUtils; +import com.fr.stable.Constants; + +import javax.swing.JComponent; +import javax.swing.JToolTip; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.plaf.ComponentUI; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; +import java.util.List; + +/** + * ToolTip UI类 + * + * @author Leo.Qin + * @since 11.0 + * Created on 2023/12/8 + */ +public class FineTooltipUI extends FlatToolTipUI { + private int maxWidth; + private int arc; + private List lines; + + /** + * 创建UI + */ + public static ComponentUI createUI(JComponent c) { + return FlatUIUtils.createSharedUI(FineTooltipUI.class, FineTooltipUI::new); + } + + @Override + public void paint(Graphics g, JComponent c) { + + g.setColor(c.getBackground()); + g.fillRoundRect(0, 0, c.getWidth(), c.getHeight(), arc, arc); + + String text = ((JToolTip) c).getTipText(); + if (text == null || text.isEmpty()) { + return; + } + + Insets insets = c.getInsets(); + Graphics2D g2d = (Graphics2D) g; + FontMetrics fm = g2d.getFontMetrics(); + + int x = insets.left; + int y = insets.top + fm.getAscent(); + + g2d.setColor(c.getForeground()); + + for (String line : lines) { + g2d.drawString(line, x, y); + y += fm.getHeight(); + } + + } + + + @Override + protected void installDefaults(JComponent c) { + super.installDefaults(c); + c.setOpaque(false); + arc = UIManager.getInt("ToolTip.arc"); + maxWidth = UIManager.getInt("ToolTip.maxWidth"); + } + + + @Override + public Dimension getPreferredSize(JComponent c) { + String text = ((JToolTip) c).getTipText(); + if (text == null || text.isEmpty()) { + return new Dimension(); + } + + Insets insets = c.getInsets(); + int fontWidth = this.maxWidth - insets.left - insets.right; + lines = BaseUtils.getLineTextList(text, null, null, fontWidth, Constants.FR_PAINT_RESOLUTION); + + FontMetrics fm = c.getFontMetrics(c.getFont()); + + int width = 0; + int height = fm.getHeight() * Math.max(lines.size(), 1); + for (String line : lines) { + width = Math.max(width, SwingUtilities.computeStringWidth(fm, line)); + } + + return new Dimension(insets.left + width + insets.right, insets.top + height + insets.bottom); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000000..7176d1433d --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/FineSearchPane.java @@ -0,0 +1,125 @@ +package com.fr.design.data.datapane.management.search.pane; + +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineInputUI; +import com.fr.design.event.HoverAware; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.UIManager; +import javax.swing.event.DocumentListener; +import java.awt.BorderLayout; +import java.awt.Insets; +import java.awt.event.ActionListener; +import java.awt.event.KeyListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +/** + * 搜索面板 + * + * @author Leo.Qin + * @since 11.0 + * Created on 2023/12/13 + */ +public class FineSearchPane extends JPanel implements HoverAware { + + private static final Insets LABEL_INSETS = UIManager.getInsets("SearchPanel.labelBorderInsets"); + private static final Insets BUTTON_INSETS = UIManager.getInsets("SearchPanel.buttonBorderInsets"); + + private UITextField searchTextField; + private UIButton clearButton; + + private boolean hover; + + public FineSearchPane() { + this.setLayout(new BorderLayout()); + this.setUI(new FineInputUI(false)); + + initComponents(); + } + + private void initComponents() { + // 左侧搜索图标 + UILabel searchLabel = new UILabel(new LazyIcon("search")); + searchLabel.setBorder(BorderFactory.createEmptyBorder(LABEL_INSETS.top, LABEL_INSETS.left, LABEL_INSETS.bottom, LABEL_INSETS.right)); + + // 中间输入框 + searchTextField = new UITextField(); + searchTextField.setBorder(null); + searchTextField.setOpaque(false); + searchTextField.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + hover = true; + repaint(); + } + + @Override + public void mouseExited(MouseEvent e) { + hover = false; + repaint(); + } + }); + + // 右侧返回图标 + clearButton = new UIButton(new LazyIcon("clear")); + clearButton.setUI(new FineInputUI.FineInputButtonUI(false)); + clearButton.setBorder(BorderFactory.createEmptyBorder(BUTTON_INSETS.top, BUTTON_INSETS.left, BUTTON_INSETS.bottom, BUTTON_INSETS.right)); + + this.add(searchLabel, BorderLayout.WEST); + this.add(searchTextField, BorderLayout.CENTER); + this.add(clearButton, BorderLayout.EAST); + } + + @Override + public boolean isHovered() { + return hover; + } + + /** + * 添加KeyListener + * + * @param listener the key listener. + */ + public void addKeyListener(KeyListener listener) { + searchTextField.addKeyListener(listener); + } + + public void setPlaceholder(String placeHolder) { + searchTextField.setPlaceholder(placeHolder); + } + + public void setClearToolTipText(String text) { + clearButton.setToolTipText(text); + } + + /** + * 添加DocumentListener + * + * @param listener + */ + public void addDocumentListener(DocumentListener listener) { + searchTextField.getDocument().addDocumentListener(listener); + } + + /** + * 按钮添加监听器 + * + * @param listener + */ + public void addClearActionListener(ActionListener listener) { + clearButton.addActionListener(listener); + } + + public String getText() { + return searchTextField.getText(); + } + + public void setText(String text) { + searchTextField.setText(text); + } +} 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 d1c030742e..2241fb3913 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,12 +1,8 @@ package com.fr.design.data.datapane.management.search.pane; -import com.fine.theme.icon.LazyIcon; 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.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; @@ -17,19 +13,15 @@ import com.fr.stable.StringUtils; import javax.swing.BorderFactory; 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.CardLayout; -import java.awt.Color; import java.awt.Dimension; 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; /** * @author Yvan @@ -40,6 +32,8 @@ public class TreeSearchToolbarPane extends JPanel implements TreeSearchStatusCha public static final String SEARCH_PANE = "searchPane"; + private static final Insets INSETS = UIManager.getInsets("TreeSearchToolbarPane.borderInsets"); + /** * 工具栏 */ @@ -53,13 +47,7 @@ public class TreeSearchToolbarPane extends JPanel implements TreeSearchStatusCha /** * 搜索面板 */ - private JPanel searchPane; - - /** - * 搜索输入框 - */ - private UITextField searchTextField; - + private FineSearchPane searchPane; /** * 内容面板 */ @@ -74,7 +62,7 @@ public class TreeSearchToolbarPane extends JPanel implements TreeSearchStatusCha @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { - TableDataTreeSearchManager.getInstance().startSearch(searchTextField.getText()); + TableDataTreeSearchManager.getInstance().startSearch(searchPane.getText()); } } }; @@ -93,47 +81,17 @@ public class TreeSearchToolbarPane extends JPanel implements TreeSearchStatusCha private void initContentPane() { cardLayout = new CardLayout(); contentPane = new JPanel(cardLayout); + contentPane.setBorder(BorderFactory.createEmptyBorder(INSETS.top, INSETS.left, INSETS.bottom, INSETS.right)); contentPane.add(searchPane, SEARCH_PANE); contentPane.add(toolbarPane, TOOLBAR_PANE); cardLayout.show(contentPane, TOOLBAR_PANE); } 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 - } - }); + searchPane = new FineSearchPane(); // 中间输入框 - searchTextField = new UITextField(){ - @Override - public Insets getInsets() { - return new Insets(2, 4, 0, 4); - } - }; - searchTextField.setBorderPainted(false); - searchTextField.setPlaceholder(Toolkit.i18nText("Fine-Design_Tree_Search_Press_Enter_For_Search")); - searchTextField.addFocusListener(new FocusListener() { - @Override - public void focusGained(FocusEvent e) { - searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.NORMAL_BLUE)); - searchPane.repaint(); - } - - @Override - public void focusLost(FocusEvent e) { - searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.TOOLBAR_BORDER_COLOR)); - searchPane.repaint(); - } - }); - this.searchTextField.getDocument().addDocumentListener(new DocumentListener() { + searchPane.setPlaceholder(Toolkit.i18nText("Fine-Design_Tree_Search_Press_Enter_For_Search")); + searchPane.addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { } @@ -147,25 +105,15 @@ public class TreeSearchToolbarPane extends JPanel implements TreeSearchStatusCha public void changedUpdate(DocumentEvent e) { } }); - this.searchTextField.addKeyListener(enterPressed); - // 右侧返回图标 - 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() { - @Override - public void mouseClicked(MouseEvent e) { - TableDataTreeSearchManager.getInstance().outOfSearchMode(); - } - }); - - searchPane.add(searchLabel, BorderLayout.WEST); - searchPane.add(searchTextField, BorderLayout.CENTER); - searchPane.add(returnLabel, BorderLayout.EAST); + searchPane.addKeyListener(enterPressed); + searchPane.setClearToolTipText(Toolkit.i18nText("Fine-Design_Tree_Search_Return")); + searchPane.addClearActionListener(e -> TableDataTreeSearchManager.getInstance().outOfSearchMode()); } + + private void dealWithTextChange() { - if (StringUtils.isEmpty(searchTextField.getText()) && TableDataTreeSearchManager.getInstance().isInSearchMode()) { + if (StringUtils.isEmpty(searchPane.getText()) && TableDataTreeSearchManager.getInstance().isInSearchMode()) { // 如果是搜索模式下,看作是用户删除输入框文字,仅复原TableDataTreePane TableDataTreeSearchManager.getInstance().restoreTreePane(); TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()).refreshDockingView(); @@ -186,7 +134,7 @@ public class TreeSearchToolbarPane extends JPanel implements TreeSearchStatusCha } public void setPlaceHolder(String placeHolder) { - this.searchTextField.setPlaceholder(placeHolder); + searchPane.setPlaceholder(placeHolder); } /** @@ -198,7 +146,7 @@ public class TreeSearchToolbarPane extends JPanel implements TreeSearchStatusCha 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/gui/ispinner/UISpinner.java b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java index a19db05060..a6b0a37df3 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,48 +1,52 @@ package com.fr.design.gui.ispinner; -import com.fr.design.constants.UIConstants; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineInputUI; 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.gui.ibutton.UIButton; -import com.fr.design.gui.ibutton.UIButtonUI; import com.fr.design.gui.itextfield.UINumberField; -import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.stable.CommonUtils; -import com.fr.stable.Constants; import com.fr.stable.StringUtils; -import javax.swing.ButtonModel; +import javax.swing.BorderFactory; import javax.swing.Icon; -import javax.swing.JComponent; import javax.swing.JPanel; +import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import javax.swing.plaf.ButtonUI; import java.awt.BorderLayout; -import java.awt.Color; import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; import java.awt.GridLayout; +import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; -public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver { +/** + * Spinner类 + * + * @author anonymous + * @Created on 2023/12/12 + * @since 11.0 + */ +public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver, HoverAware { protected double value; - private static final int SIZE = 20; - private static final int LEN = 13; - private static final int WIDTH = 13; - private static final int HEIGHT = 10; + private static final int BUTTON_WIDTH = UIManager.getInt("InputButton.width"); + private static final int BUTTON_HEIGHT = UIManager.getInt("InputButton.height"); + private static final int HEIGHT = UIManager.getInt("Input.height"); private static final int DEFAULT_NUMBERFIELD_COLUMNS = 2; private UINumberField textField; private UIButton preButton; @@ -60,6 +64,8 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver private int numberFieldColumns; private boolean textFieldFocus = false; + private boolean hover; + public UISpinner() { } @@ -85,6 +91,7 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver this.dierta = dierta; initComponents(); iniListener(); + setUI(FineInputUI.createUI(this)); } private void iniListener() { @@ -99,6 +106,21 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver } }); } + + textField.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + hover = true; + repaint(); + } + + @Override + public void mouseExited(MouseEvent e) { + hover = false; + repaint(); + } + }); + } /** @@ -210,7 +232,7 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver @Override public Dimension getPreferredSize() { Dimension dim = super.getPreferredSize(); - dim.height = SIZE; + dim.height = HEIGHT; return dim; } @@ -243,33 +265,9 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver } } - private class ButtionUI extends UIButtonUI { - private boolean isNormalPaint = true; - - @Override - protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) { - if (isPressed(b) && b.isPressedPainted()) { - isNormalPaint = false; - Color pressColor = UIConstants.COMBOBOX_BTN_PRESS; - GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), pressColor); - } else if (isRollOver(b)) { - isNormalPaint = false; - Color hoverColor = UIConstants.COMBOBOX_BTN_ROLLOVER; - GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), hoverColor); - } else if (b.isNormalPainted()) { - isNormalPaint = true; - GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted()); - } - } - - @Override - protected void paintModelIcon(ButtonModel model, Icon icon, Graphics g, JComponent c) { - if (isNormalPaint) { - g.setColor(UIConstants.COMBOBOX_BTN_NORMAL); - g.fillRect(0, 0, c.getWidth(), c.getHeight()); - } - super.paintModelIcon(model, icon, g, c); - } + @Override + public boolean isHovered() { + return hover; } private void initComponents() { @@ -277,41 +275,30 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver textField.setMaxValue(maxValue); textField.setMinValue(minValue); setValue(value); - preButton = new UIButton(UIConstants.ARROW_UP_ICON) { - public boolean shouldResponseChangeListener() { - return false; - } - - @Override - public ButtonUI getUI() { - return new ButtionUI(); - } - }; - preButton.setRoundBorder(true, Constants.LEFT); - nextButton = new UIButton(UIConstants.ARROW_DOWN_ICON) { - public boolean shouldResponseChangeListener() { - return false; - } - - @Override - public ButtonUI getUI() { - return new ButtionUI(); - } - }; - nextButton.setRoundBorder(true, Constants.LEFT); + preButton = createArrowButton(new LazyIcon("up_arrow_12")); + nextButton = createArrowButton(new LazyIcon("down_arrow_12")); setLayout(new BorderLayout()); add(textField, BorderLayout.CENTER); JPanel arrowPane = new JPanel(); - arrowPane.setPreferredSize(new Dimension(LEN, SIZE)); arrowPane.setLayout(new GridLayout(2, 1)); - preButton.setBounds(0, 1, WIDTH, HEIGHT); - nextButton.setBounds(0, HEIGHT, WIDTH, HEIGHT); arrowPane.add(preButton); arrowPane.add(nextButton); + arrowPane.setOpaque(false); + arrowPane.setPreferredSize(new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT)); add(arrowPane, BorderLayout.EAST); componentInitListeners(); } + private UIButton createArrowButton(Icon icon) { + UIButton arrowButton = new UIButton(icon) { + public boolean shouldResponseChangeListener() { + return false; + } + }; + arrowButton.setUI(new FineInputUI.FineInputButtonUI(false)); + return arrowButton; + } + /** * 设置最大值 * @param maxValue 最大值 @@ -377,11 +364,15 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver protected UINumberField initNumberField() { int columns = this.numberFieldColumns == 0 ? DEFAULT_NUMBERFIELD_COLUMNS : this.numberFieldColumns; - return new UINumberField(columns) { + UINumberField numberField = new UINumberField(columns) { public boolean shouldResponseChangeListener() { return false; } }; + Insets insets = UIManager.getInsets("InputTextField.borderInsets"); + numberField.setBorder(BorderFactory.createEmptyBorder(insets.top, insets.left, insets.bottom, insets.right)); + numberField.setOpaque(false); + return numberField; } private DocumentListener docListener = new DocumentListener() { 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 91534d95e7..05c478088d 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 @@ -48,7 +48,6 @@ public class UITextArea extends JTextArea implements UIObserver, HoverAware { private void initComponents() { setLineWrap(true); setWrapStyleWord(true); - setMinimumSize(new Dimension(getMinimumSize().width, HEIGHT)); initListener(); } @@ -121,4 +120,13 @@ public class UITextArea extends JTextArea implements UIObserver, HoverAware { public boolean isHovered() { return hover; } + + @Override + public Dimension getPreferredSize() { + Dimension size = super.getPreferredSize(); + if (size.height < HEIGHT) { + return new Dimension(size.width, HEIGHT); + } + return size; + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/itextfield/UINumberField.java b/designer-base/src/main/java/com/fr/design/gui/itextfield/UINumberField.java index 0d1287d8c0..115d471261 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itextfield/UINumberField.java +++ b/designer-base/src/main/java/com/fr/design/gui/itextfield/UINumberField.java @@ -4,10 +4,10 @@ import com.fr.base.Utils; import com.fr.general.ComparatorUtils; import com.fr.stable.CoreConstants; import com.fr.stable.StringUtils; + import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; -import java.awt.Dimension; import java.awt.Toolkit; /** @@ -151,11 +151,6 @@ public class UINumberField extends UITextField { this.isContentChanged = isContentChanged; } - @Override - public Dimension getPreferredSize() { - return new Dimension(super.getPreferredSize().width, 20); - } - class NumberDocument extends PlainDocument { public boolean checkString(int offset, String s, String str) { 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 fa0d9c860a..f04d0a0322 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 @@ -40,7 +40,7 @@ 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"); + private final int HEIGHT = UIManager.getInt("Input.height"); //有些情况下setText的时候不希望触发attributeChange,添加一个属性标识 private boolean isSetting = false; @@ -77,10 +77,28 @@ public class UITextField extends JTextField implements UIObserver, GlobalNameObs */ public void init() { InputEventBaseOnOS.addBasicEditInputMap(this); - setPreferredSize(new Dimension(getPreferredSize().width, HEIGHT)); + initCommonListeners(); initListener(); } + private void initCommonListeners() { + if (shouldResponseChangeListener()) { + this.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + hover = true; + repaint(); + } + + @Override + public void mouseExited(MouseEvent e) { + hover = false; + repaint(); + } + }); + } + } + protected void initListener() { if (shouldResponseChangeListener()) { getDocument().addDocumentListener(new DocumentListener() { @@ -99,20 +117,6 @@ 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(); - } - }); } } @@ -236,4 +240,9 @@ public class UITextField extends JTextField implements UIObserver, GlobalNameObs public boolean isHovered() { return hover; } + + @Override + public Dimension getPreferredSize() { + return new Dimension(super.getPreferredSize().width, HEIGHT); + } } 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 4c736050e1..e8b038a5ef 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 @@ -12,6 +12,7 @@ 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; @@ -20,8 +21,6 @@ import com.fr.design.mainframe.share.collect.ComponentCollector; import com.fr.design.notification.SnapChat; import com.fr.design.notification.SnapChatFactory; 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.log.FineLoggerFactory; import com.fr.plugin.context.PluginContext; @@ -53,7 +52,6 @@ import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GraphicsEnvironment; -import java.awt.Image; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; @@ -83,7 +81,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { private static final int TAB_BUTTON_WIDTH = 40; 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 = 40; + private static final int POPUP_TOOLPANE_HEIGHT = UIManager.getInt("PopupToolPane.height"); private static final int ARROW_RANGE_START = CONTENT_WIDTH - 30; // 弹出对话框高度 private static final int POPUP_MIN_HEIGHT = 145; @@ -1172,6 +1170,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { // 弹出属性面板的工具条 private class PopupToolPane extends JPanel { + private final UIButton popupButton; private String title; private PropertyItem propertyItem; private String buttonType; @@ -1189,29 +1188,13 @@ public class EastRegionContainerPane extends UIEastResizableContainer { private static final String UP_BUTTON = "UpButton"; private static final String DOWN_BUTTON = "DownButton"; - private MouseListener mouseListener = new MouseAdapter() { - @Override - public void mouseExited(MouseEvent e) { - setCursor(Cursor.getDefaultCursor()); - if (mouseDownCompCoords == null) { -// contentPane.setBackground(originColor); - } - repaint(); - } + private final Insets INSETS = UIManager.getInsets("PopupToolPane.borderInsets"); - @Override - public void mouseClicked(MouseEvent e) { - if (e.getX() >= ARROW_RANGE_START) { - onPop(); - } - } + private MouseListener mouseListener = new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { mouseDownCompCoords = null; - if (!getBounds().contains(e.getPoint())) { -// contentPane.setBackground(originColor); - } } @Override @@ -1229,7 +1212,6 @@ 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); } else { setCursor(Cursor.getDefaultCursor()); } @@ -1273,36 +1255,46 @@ public class EastRegionContainerPane extends UIEastResizableContainer { this.propertyItem = propertyItem; this.title = propertyItem.getTitle(); originColor = UIConstants.UI_TOOLBAR_COLOR; + this.buttonType = buttonType; this.setForeground(UIManager.getColor("DarkenedFontColor")); contentPane = new JPanel(); contentPane.setLayout(new BorderLayout()); UILabel label = new UILabel(title); - contentPane.add(label, BorderLayout.WEST); - contentPane.setBorder(new EmptyBorder(5, 10, 5, 0)); + contentPane.add(label, BorderLayout.CENTER); + popupButton = createPopupButton(buttonType); + + contentPane.add(popupButton, BorderLayout.EAST); + contentPane.setBorder(new EmptyBorder(INSETS.top, INSETS.left, INSETS.bottom, INSETS.right)); setLayout(new BorderLayout()); add(contentPane, BorderLayout.CENTER); - setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIManager.getColor("East.border"))); - initToolButton(buttonType); - } - - public void setParentDialog(JDialog parentDialog) { - this.parentDialog = parentDialog; - isMovable = true; } - private void initToolButton(final String buttonType) { - this.buttonType = buttonType; - if (StringUtils.isEmpty(buttonType) || buttonType.equals(NO_BUTTON)) { - return; - } - // validate - if (!buttonType.equals(UP_BUTTON) && !buttonType.equals(DOWN_BUTTON)) { - throw new IllegalArgumentException("unknown button type: " + buttonType); + private UIButton createPopupButton(String type) { + UIButton popupButton = new UIButton(); + if (StringUtils.equals(type, UP_BUTTON)) { + popupButton = new UIButton(new LazyIcon("collapse_popup")); + } 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); + popupButton.addActionListener(e -> { + this.buttonType = type; + onPop(); + }); addMouseMotionListener(mouseMotionListener); addMouseListener(mouseListener); + return popupButton; + } + + public void setParentDialog(JDialog parentDialog) { + this.parentDialog = parentDialog; + isMovable = true; } // 触发弹入、弹出 @@ -1318,23 +1310,6 @@ public class EastRegionContainerPane extends UIEastResizableContainer { public Dimension getPreferredSize() { return new Dimension(super.getPreferredSize().width, POPUP_TOOLPANE_HEIGHT); } - - @Override - public void paint(Graphics g) { - super.paint(g); - Image button; - g.setColor(new Color(69, 135, 255)); - g.setFont(DesignUtils.getDefaultGUIFont().applySize(14)); - if (buttonType.equals(NO_BUTTON)) { - return; - } - if (buttonType.equals(DOWN_BUTTON)) { - button = UIConstants.POP_BUTTON_DOWN; - } else { - button = UIConstants.POP_BUTTON_UP; - } - SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, button, (ARROW_RANGE_START + 8), 4, null)); - } } private class PopupDialog extends JDialog { 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 e6ddd8138c..d721714fa4 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,39 +1,42 @@ package com.fr.design.mainframe.widget.accessibles; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineInputUI; +import com.fr.design.Exception.ValidationException; +import com.fr.design.designer.properties.Decoder; +import com.fr.design.designer.properties.Encoder; +import com.fr.design.dialog.BasicPane; +import com.fr.design.dialog.FineJOptionPane; +import com.fr.design.event.HoverAware; +import com.fr.design.event.UIObserverListener; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.widget.editors.ITextComponent; +import com.fr.design.mainframe.widget.editors.TextField; + +import javax.swing.BorderFactory; +import javax.swing.JComponent; +import javax.swing.JOptionPane; +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.Graphics2D; import java.awt.Insets; 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 javax.swing.*; - -import com.fr.design.constants.UIConstants; -import com.fr.design.dialog.FineJOptionPane; -import com.fr.design.event.UIObserverListener; -import com.fr.design.gui.ibutton.UIButton; - -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.plaf.ButtonUI; -import com.fr.base.BaseUtils; -import com.fr.design.Exception.ValidationException; -import com.fr.design.gui.ibutton.UIButtonUI; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.mainframe.widget.editors.ITextComponent; -import com.fr.design.mainframe.widget.editors.TextField; -import com.fr.design.dialog.BasicPane; -import com.fr.design.designer.properties.Decoder; -import com.fr.design.designer.properties.Encoder; -import com.fr.design.utils.gui.GUIPaintUtils; /** + * 编辑器 + * @author anonymous + * @created on 2023/12/13 * @since 6.5.3 */ -public class BaseAccessibleEditor extends BasicPane implements AccessibleEditor { +public class BaseAccessibleEditor extends BasicPane implements AccessibleEditor, HoverAware { private ArrayList listeners; private boolean showButton; @@ -41,6 +44,10 @@ public class BaseAccessibleEditor extends BasicPane implements AccessibleEditor private Decoder decoder; private UIButton btPopup; protected ITextComponent txtValue; + private boolean hover; + private static final int HEIGHT = UIManager.getInt("Input.height"); + private static final int BUTTON_WIDTH = UIManager.getInt("InputButton.width"); + private static final int BUTTON_HEIGHT = UIManager.getInt("InputButton.height"); public BaseAccessibleEditor(Encoder enc, Decoder dec, boolean showBtn) { listeners = new ArrayList(); @@ -48,10 +55,30 @@ public class BaseAccessibleEditor extends BasicPane implements AccessibleEditor this.encoder = enc; this.decoder = dec; initComponents(); + initListener(); txtValue.setEditable(dec != null); - ((JComponent) txtValue).setOpaque(true); - ((JComponent) txtValue).setBorder(BorderFactory.createLineBorder(Color.lightGray)); - ((JComponent) txtValue).setBackground(Color.WHITE); + ((JComponent) txtValue).setOpaque(false); + Insets insets = UIManager.getInsets("InputTextField.borderInsets"); + ((JComponent) txtValue).setBorder(BorderFactory.createEmptyBorder(insets.top, insets.left, insets.bottom, insets.right)); + + this.setUI(FineInputUI.createUI(this)); + setPreferredSize(new Dimension(getPreferredSize().width, HEIGHT)); + } + + private void initListener() { + ((TextField) txtValue).addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + hover = true; + repaint(); + } + + @Override + public void mouseExited(MouseEvent e) { + hover = false; + repaint(); + } + }); } @Override @@ -77,7 +104,6 @@ public class BaseAccessibleEditor extends BasicPane implements AccessibleEditor } private void initComponents() { - setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 1)); txtValue = createTextField(); setLayout(FRGUIPaneFactory.createBorderLayout()); @@ -88,33 +114,13 @@ public class BaseAccessibleEditor extends BasicPane implements AccessibleEditor txtValueActionPerformed(evt); } }); + add((JComponent) txtValue, BorderLayout.CENTER); - setOpaque(false); if (showButton) { - btPopup = new UIButton(){ - @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); - } - } - }; - } - }; + btPopup = new UIButton(); initPopupButton(); + btPopup.setUI(new FineInputUI.FineInputButtonUI(false)); btPopup.addActionListener(new ActionListener() { @Override @@ -137,19 +143,15 @@ public class BaseAccessibleEditor extends BasicPane implements AccessibleEditor protected void initPopupButton() { if (!isComboButton()) { - btPopup.setIcon(new ImageIcon(UIConstants.ACCESSIBLE_EDITOR_DOT)); - btPopup.setPreferredSize(new Dimension(20, 20)); + btPopup.setIcon(new LazyIcon("dot")); } else { btPopup.setRolloverEnabled(true); btPopup.setFocusPainted(false); - btPopup.setPreferredSize(new Dimension(15, 19)); btPopup.setBorderPainted(false); btPopup.setContentAreaFilled(false); - btPopup.setMargin(new Insets(0, 0, 0, 0)); - btPopup.setIcon(BaseUtils.readIcon("/com/fr/design/images/form/designer/drop_up.png")); - btPopup.setPressedIcon(BaseUtils.readIcon("/com/fr/design/images/form/designer/drop_down.png")); - btPopup.setRolloverIcon(BaseUtils.readIcon("/com/fr/design/images/form/designer/drop_over.png")); + btPopup.setIcon(new LazyIcon("down_arrow")); } + btPopup.setPreferredSize(new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT)); } // 有的编辑器是使用下拉框来直接选择的,这时候就把按钮显示成下拉框 @@ -227,4 +229,8 @@ public class BaseAccessibleEditor extends BasicPane implements AccessibleEditor } + @Override + public boolean isHovered() { + return hover; + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/editors/DataBindingEditor.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/editors/DataBindingEditor.java index bad481e7af..6838bc3023 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/widget/editors/DataBindingEditor.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/editors/DataBindingEditor.java @@ -1,5 +1,16 @@ package com.fr.design.mainframe.widget.editors; +import com.fr.data.TableDataSource; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.data.datapane.TableDataComboBox; +import com.fr.design.editor.editor.Editor; +import com.fr.design.gui.icombobox.LazyComboBox; +import com.fr.design.gui.icombobox.UIComboBoxRenderer; +import com.fr.form.data.DataBinding; + +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.UIManager; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; @@ -8,16 +19,6 @@ import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.List; -import javax.swing.*; - -import com.fr.design.data.DesignTableDataManager; -import com.fr.data.TableDataSource; -import com.fr.design.data.datapane.TableDataComboBox; -import com.fr.design.gui.icombobox.UIComboBoxRenderer; -import com.fr.design.gui.icombobox.LazyComboBox; -import com.fr.design.editor.editor.Editor; -import com.fr.form.data.DataBinding; - /** * DataBindingEditor @@ -26,8 +27,9 @@ import com.fr.form.data.DataBinding; * @since 2012-3-29下午5:26:28 */ public class DataBindingEditor extends Editor { - private final static int HORI_GAP = 1; - private final static int VER_GAP = 7; + private final static int HORI_GAP = UIManager.getInt("DataBindingEditor.hgap"); + private final static int VER_GAP = UIManager.getInt("DataBindingEditor.vgap"); + protected TableDataComboBox tableDataComboBox; protected LazyComboBox columnNameComboBox; 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 daf2b4d3fe..7856b9b991 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.fr.base.svg.IconUtils; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.i18n.Toolkit; @@ -41,7 +40,7 @@ public class NotificationCenterPane extends BasicPane { public void refreshButton() { if (NotificationCenter.getInstance().getNotificationsCount() > 0) { - notificationCenterButton.setIcon(IconUtils.readIcon("/com/fr/design/standard/notification/notification_dot.svg")); + notificationCenterButton.setIcon(new LazyIcon("notification_dot")); } else { notificationCenterButton.setIcon(new LazyIcon("notification")); } diff --git a/designer-base/src/main/resources/com/fine/theme/icon/dot.svg b/designer-base/src/main/resources/com/fine/theme/icon/dot.svg new file mode 100644 index 0000000000..c918d9a7eb --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/dot.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/notification/notification_dot.svg b/designer-base/src/main/resources/com/fine/theme/icon/notification/notification_dot.svg new file mode 100755 index 0000000000..33d3241e61 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/notification/notification_dot.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/popup/collapse_popup.svg b/designer-base/src/main/resources/com/fine/theme/icon/popup/collapse_popup.svg new file mode 100644 index 0000000000..71d013dd4c --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/popup/collapse_popup.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/popup/expand_popup.svg b/designer-base/src/main/resources/com/fine/theme/icon/popup/expand_popup.svg new file mode 100755 index 0000000000..91bd6153c1 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/popup/expand_popup.svg @@ -0,0 +1,5 @@ + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/up_arrow.svg b/designer-base/src/main/resources/com/fine/theme/icon/up_arrow.svg new file mode 100755 index 0000000000..1922f057fa --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/up_arrow.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 b6552575b5..9cc0802a1c 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 @@ -83,13 +83,14 @@ 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 +ToolTipUI=com.fine.theme.light.ui.FineTooltipUI TreeUI = com.fine.theme.light.ui.UIFlatTreeUI ViewportUI = com.formdev.flatlaf.ui.FlatViewportUI #---- variables ---- Component.defaultHeight=24 +Component.defaultVGap=10 # general background and foreground (text color) @background = #F6F8FA @@ -162,13 +163,18 @@ defaultHighlightBorderColor = #2576EF defaultBorderFocusShadow = #2576ef19 defaultBorderFocusWidth = 0 brand.normal=#2576EF +color.brand4=#84B1F6 background.normal=#FFFFFF text.white=#ffffff text.placeholder=fade(@foreground, 40%) text.highlight=fade(@foreground, 90%) fill.hover=#E6E9EF +fill.click=#DADEE7 fill.normal=#FFFFFF +fill.disabled=#F2F4F8 border.divider=#DADEE7 +tooltip.normal=#3F506A +tooltip.disabled=#A3ADBD #---- Button ---- @@ -362,7 +368,9 @@ DesktopIcon.closeIcon = com.formdev.flatlaf.icons.FlatInternalFrameCloseIcon EditorPane.border = com.formdev.flatlaf.ui.FlatMarginBorder EditorPane.margin = @componentMargin EditorPane.background = @componentBackground - +DataBindingEditor.vgap=$Component.defaultVGap +DataBindingEditor.hgap=1 +DataBindingEditor.height=$Component.defaultHeight #---- FileChooser ---- @@ -390,6 +398,7 @@ FileView.fullRowSelection = true FormattedTextField.border = com.formdev.flatlaf.ui.FlatTextBorder FormattedTextField.margin = @componentMargin FormattedTextField.background = @componentBackground +FormattedTextField.selectionBackground=$color.brand4 FormattedTextField.placeholderForeground = @disabledForeground FormattedTextField.iconTextGap = 4 @@ -582,7 +591,8 @@ Popup.dropShadowPainted = true Popup.dropShadowInsets = -4,-4,4,4 Popup.dropShadowColor = #000 Popup.dropShadowOpacity = 0.15 - +PopupToolPane.height=34 +PopupToolPane.borderInsets=0, 10, 0, 10 #---- PopupMenu ---- @@ -708,7 +718,10 @@ 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) - +#---- SearchPanel ---- +SearchPanel.labelBorderInsets=3, 6, 3, 4 +SearchPanel.buttonBorderInsets=4, 4, 4, 4 +TreeSearchToolbarPane.borderInsets=0, 8, 0, 8 #---- Separator ---- @@ -751,7 +764,20 @@ Spinner.padding = @componentMargin 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.width=$Component.defaultHeight +InputButton.height=$Component.defaultHeight +InputTextField.borderInsets=0, 6, 0, 6 +Input.border=com.fine.theme.light.ui.FineRoundBorder +Input.background=$fill.normal +Input.height=$Component.defaultHeight +Input.arc=$Component.arc +#---- FormulaPane ---- +FormulaPane.buttonWidth=$Component.defaultHeight +FormulaPane.buttonHeight=$Component.defaultHeight #---- SplitPane ---- @@ -910,6 +936,7 @@ TextComponent.arc=$Component.arc TextField.border=com.fine.theme.light.ui.FineRoundBorder TextField.margin = @componentMargin TextField.background=$background.normal +TextField.selectionBackground=$color.brand4 TextField.placeholderForeground = @disabledForeground TextField.iconTextGap = 4 TextField.height=$Component.defaultHeight @@ -1049,8 +1076,13 @@ ToolTipManager.enableToolTipMode = activeApplication #---- ToolTip ---- ToolTip.borderCornerRadius = $Popup.borderCornerRadius -ToolTip.border = 4,6,4,6,shade(@background,40%) -ToolTip.background = lighten(@background,3%) +ToolTip.background=$tooltip.normal +ToolTip.foreground=$text.white +ToolTip.border=3,10,3,10 +ToolTip.backgroundInactive=$tooltip.disabled +ToolTip.foregroundInactive=$text.white +ToolTip.arc=$Component.arc +ToolTip.maxWidth=392 #---- Tree ---- @@ -1134,7 +1166,8 @@ Center.ZoneBorderColor = #E6E9EF Center.GridColumnRowColor = #F8F9FC Center.SpaceColor = #FFF Center.border = 0, 10, 10, 10 - +#---- CellOtherSetPane ---- +CellOtherSetPane.height=$Component.defaultHeight #---- Styles ------------------------------------------------------------------ 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 a794a7bd69..177238519a 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 @@ -176,7 +176,7 @@ public class RootDesignDefinePane extends AbstractDataModify { 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(IntervalConstants.INTERVAL_L1, 0, IntervalConstants.INTERVAL_L1, 0)); + panel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); CRPropertyDescriptor[] extraTableEditor = new CRPropertyDescriptor[0]; extraTableEditor = root.getExtraTableEditor(); extraPropertyGroupPane = new PropertyGroupPane(extraTableEditor, root); diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/FormWidgetValuePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/FormWidgetValuePane.java index 7a69292ce5..919565b7fd 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/FormWidgetValuePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/FormWidgetValuePane.java @@ -16,8 +16,11 @@ import com.fr.form.ui.WidgetValue; import com.fr.form.ui.concept.data.ValueInitializer; import com.fr.general.ComparatorUtils; -import javax.swing.*; -import java.awt.*; +import javax.swing.JPanel; +import javax.swing.UIManager; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Dimension; /** * Created by ibm on 2017/7/27. @@ -28,6 +31,9 @@ public class FormWidgetValuePane extends JPanel { private JPanel customPane; private CardLayout cardLayout; + private final static int VER_GAP = UIManager.getInt("DataBindingEditor.vgap"); + private final static int HEIGHT = UIManager.getInt("DataBindingEditor.height"); + public FormWidgetValuePane(Object o, boolean onlyServer) { DataControl widget = (DataControl) o; @@ -53,9 +59,9 @@ public class FormWidgetValuePane extends JPanel { widgetValueHead.setSelectedIndex(index); } if (ComparatorUtils.equals(editor[index].getName(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Field"))) { - customPane.setPreferredSize(new Dimension(100, 47)); + customPane.setPreferredSize(new Dimension(100, HEIGHT * 2 + VER_GAP)); } else { - customPane.setPreferredSize(new Dimension(100, 20)); + customPane.setPreferredSize(new Dimension(100, HEIGHT)); } cardLayout.show(customPane, editor[index].getName()); } 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 6f01d9e192..cbdfd8f72d 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 @@ -44,6 +44,7 @@ import javax.swing.BorderFactory; 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; @@ -66,6 +67,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 HEIGHT = UIManager.getInt("CellOtherSetPane.height"); private static final int BUTTON_GROUP_WIDTH = 140; private static final double f = TableLayout.FILL; private static final double p = TableLayout.PREFERRED; @@ -263,7 +265,7 @@ public class CellOtherSetPane extends AbstractCellAttrPane { @Override public void stateChanged(ChangeEvent e) { if (insertRowPolicyButtonGroup.getSelectedIndex() == 1) { - insertRowPane.setPreferredSize(new Dimension(100, 20)); + insertRowPane.setPreferredSize(new Dimension(100, HEIGHT)); insertRowLayout.show(insertRowPane, "content"); } else { insertRowLayout.show(insertRowPane, "none"); @@ -331,7 +333,7 @@ public class CellOtherSetPane extends AbstractCellAttrPane { @Override public void stateChanged(ChangeEvent e) { if (tooltipButtonGroup.getSelectedIndex() == 0) { - tooltipPane.setPreferredSize(new Dimension(154, 20)); + tooltipPane.setPreferredSize(new Dimension(154, HEIGHT)); tooltipLayout.show(tooltipPane, "content"); } else { tooltipLayout.show(tooltipPane, "none"); @@ -367,7 +369,7 @@ public class CellOtherSetPane extends AbstractCellAttrPane { @Override public void itemStateChanged(ItemEvent e) { if (showPartComboBox.getSelectedIndex() == 0) { - showPartPane.setPreferredSize(new Dimension(70, 20)); + showPartPane.setPreferredSize(new Dimension(70, HEIGHT)); showPartLayout.show(showPartPane, "content"); } else { showPartLayout.show(showPartPane, "none"); @@ -392,7 +394,7 @@ public class CellOtherSetPane extends AbstractCellAttrPane { textOverflowComPane.setVisible(e.getStateChange() == ItemEvent.SELECTED); if (e.getStateChange() == ItemEvent.SELECTED) { if (showPartComboBox.getSelectedIndex() == 0) { - showPartPane.setPreferredSize(new Dimension(70, 20)); + showPartPane.setPreferredSize(new Dimension(70, HEIGHT)); showPartLayout.show(showPartPane, "content"); } else { showPartLayout.show(showPartPane, "none"); @@ -505,7 +507,7 @@ public class CellOtherSetPane extends AbstractCellAttrPane { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { if (showContent.getSelectedIndex() == 3) { - fileNamePane.setPreferredSize(new Dimension(100, 20)); + fileNamePane.setPreferredSize(new Dimension(100, HEIGHT)); fileNameLayout.show(fileNamePane, "content"); } else { fileNameLayout.show(fileNamePane, "none"); @@ -630,7 +632,7 @@ public class CellOtherSetPane extends AbstractCellAttrPane { tooltipButtonGroup.setSelectedIndex(1); } if (tooltipButtonGroup.getSelectedIndex() == 0) { - tooltipPane.setPreferredSize(new Dimension(100, 20)); + tooltipPane.setPreferredSize(new Dimension(100, HEIGHT)); tooltipLayout.show(tooltipPane, "content"); } else { tooltipLayout.show(tooltipPane, "none"); @@ -683,7 +685,7 @@ public class CellOtherSetPane extends AbstractCellAttrPane { this.valueEditor.populate(StringUtils.EMPTY); } if (insertRowPolicyButtonGroup.getSelectedIndex() == 1) { - insertRowPane.setPreferredSize(new Dimension(100, 20)); + insertRowPane.setPreferredSize(new Dimension(100, HEIGHT)); insertRowLayout.show(insertRowPane, "content"); } else { insertRowLayout.show(insertRowPane, "none"); 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 297b0feb9e..bb318f925d 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,5 +1,6 @@ package com.fr.quickeditor.cellquick; +import com.fine.theme.icon.LazyIcon; import com.fr.base.BaseFormula; import com.fr.base.Style; import com.fr.base.TextFormat; @@ -14,7 +15,6 @@ 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.general.IOUtils; import com.fr.grid.selection.CellSelection; import com.fr.quickeditor.CellQuickEditor; import com.fr.report.ReportHelper; @@ -25,6 +25,7 @@ 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; @@ -59,6 +60,9 @@ public class CellFormulaQuickEditor extends CellQuickEditor { //正在编辑的单元格 private TemplateCellElement editingCellElement; + private static final int BUTTON_WIDTH = UIManager.getInt("FormulaPane.buttonWidth"); + private static final int BUTTON_HEIGHT = UIManager.getInt("FormulaPane.buttonHeight"); + private DocumentListener documentListener = new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { @@ -100,9 +104,9 @@ public class CellFormulaQuickEditor extends CellQuickEditor { 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")); + UIButton formulaButton = new UIButton(new LazyIcon("formula")); formulaButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula") + "..."); - formulaButton.setPreferredSize(new Dimension(20, formulaTextField.getPreferredSize().height)); + formulaButton.setPreferredSize(new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT)); formulaButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { final UIFormula formulaPane = FormulaFactory.createFormulaPaneWhenReserveFormula();