From 2c6bfcc0f76c86b5663f8d9078408e787d35a638 Mon Sep 17 00:00:00 2001 From: Starryi Date: Wed, 20 Oct 2021 18:58:09 +0800 Subject: [PATCH 01/35] =?UTF-8?q?REPORT-61108=20=E3=80=90=E8=A7=86?= =?UTF-8?q?=E8=A7=89=E9=AA=8C=E6=94=B6=E3=80=91--=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 调整共享组件面板的样式 【改动思路】 同上 --- .../com/fr/design/gui/imenu/UIPopupMenu.java | 14 +++-- .../actions/DownloadSuitableThemeAction.java | 2 +- .../share/ui/actions/Jump2DetailAction.java | 13 ++--- .../share/ui/actions/LoadingMenuItem.java | 28 +++++----- .../ui/actions/SharedComponentMenuItem.java | 49 ++++++++++++++++++ ...UI.java => SharedComponentMenuItemUI.java} | 8 +-- .../actions/SharedComponentPopupAction.java | 31 +++++++++++ .../ui/actions/SharedComponentPopupMenu.java | 32 ++++++++++++ .../ui/block/AbstractOnlineWidgetBlock.java | 8 +-- .../share/ui/block/LocalWidgetBlock.java | 32 +++--------- .../com/fr/design/form/images/loading.gif | Bin 3430 -> 50146 bytes 11 files changed, 151 insertions(+), 66 deletions(-) create mode 100644 designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentMenuItem.java rename designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/{SharedComponentActionMenuItemUI.java => SharedComponentMenuItemUI.java} (94%) create mode 100644 designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentPopupAction.java create mode 100644 designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentPopupMenu.java 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 cdad63bff2..3aeaa186be 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 @@ -8,8 +8,10 @@ import javax.swing.*; import com.fr.design.constants.UIConstants; public class UIPopupMenu extends JPopupMenu{ - private static final float REC = 8f; + private static final float DEFAULT_REC = 8f; private boolean onlyText = false; + private float rec = DEFAULT_REC; + public static UIPopupMenu EMPTY = new UIPopupMenu(); public UIPopupMenu() { super(); @@ -19,8 +21,7 @@ public class UIPopupMenu extends JPopupMenu{ @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; - Shape shape = null; - shape = new RoundRectangle2D.Double(0, 0, getWidth(), getHeight(), REC, REC); + 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); @@ -29,10 +30,9 @@ public class UIPopupMenu extends JPopupMenu{ @Override protected void paintBorder(Graphics g) { Graphics2D g2d = (Graphics2D) g; - int rec = (int) REC; g2d.setColor(UIConstants.UIPOPUPMENU_LINE_COLOR); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2d.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, rec, rec); + g2d.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, (int) rec, (int) rec); } @Override @@ -46,4 +46,8 @@ public class UIPopupMenu extends JPopupMenu{ public void setOnlyText(boolean onlyText) { this.onlyText = onlyText; } + + public void setRadius(float radius) { + this.rec = radius; + } } \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/DownloadSuitableThemeAction.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/DownloadSuitableThemeAction.java index f8f4cc1a78..75e3e448bd 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/DownloadSuitableThemeAction.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/DownloadSuitableThemeAction.java @@ -38,7 +38,7 @@ import java.util.concurrent.ExecutionException; * @version 1.0 * Created by Starryi on 2021/9/28 */ -public class DownloadSuitableThemeAction extends UpdateAction { +public class DownloadSuitableThemeAction extends SharedComponentPopupAction { private final String themePath; private final UIPopupMenu popupMenu; private boolean downloading = false; diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/Jump2DetailAction.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/Jump2DetailAction.java index 698ec7545d..0616180b75 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/Jump2DetailAction.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/Jump2DetailAction.java @@ -8,6 +8,8 @@ import com.fr.design.mainframe.share.ui.constants.ColorConstants; import com.fr.stable.StringUtils; import javax.swing.Action; +import javax.swing.BorderFactory; +import javax.swing.SwingConstants; import java.awt.Color; import java.awt.Desktop; import java.awt.event.ActionEvent; @@ -20,7 +22,7 @@ import java.net.URISyntaxException; * @version 1.0 * Created by Starryi on 2021/9/28 */ -public class Jump2DetailAction extends UpdateAction { +public class Jump2DetailAction extends SharedComponentPopupAction { private static final String ONLINE_WIDGET_DETAIL_FORMATTED_URL = "https://market.fanruan.com/reuse/%s"; private final String id; @@ -30,15 +32,6 @@ public class Jump2DetailAction extends UpdateAction { this.setName(Toolkit.i18nText("Fine-Design_Share_Jump_To_Detail")); } - @Override - public UIMenuItem createMenuItem() { - UIMenuItem menuItem = super.createMenuItem(); - menuItem.setOpaque(true); - menuItem.setBackground(ColorConstants.BACKGROUND); - menuItem.setUI(new SharedComponentActionMenuItemUI()); - return menuItem; - } - @Override public void actionPerformed(ActionEvent e) { if (StringUtils.isNotEmpty(id)) { diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/LoadingMenuItem.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/LoadingMenuItem.java index 883a306446..9b949ce67a 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/LoadingMenuItem.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/LoadingMenuItem.java @@ -1,41 +1,35 @@ package com.fr.design.mainframe.share.ui.actions; -import com.fr.design.gui.imenu.UIMenuItem; -import com.fr.design.mainframe.share.ui.constants.ColorConstants; import com.fr.general.IOUtils; import javax.swing.Action; -import javax.swing.BorderFactory; -import javax.swing.Icon; +import java.awt.Dimension; import java.awt.Graphics; +import java.awt.image.BufferedImage; /** * @author Starryi * @version 1.0 * Created by Starryi on 2021/10/19 */ -public class LoadingMenuItem extends UIMenuItem { +public class LoadingMenuItem extends SharedComponentMenuItem { private boolean loading = false; - private final Icon profileIcon = IOUtils.readIcon("/com/fr/design/form/images/loading.gif"); + private final BufferedImage loadingImage = IOUtils.readImageWithCache("/com/fr/design/form/images/loading.gif"); + public static final int LOADING_ICON_PAINT_SIZE = 12; public LoadingMenuItem(Action action) { super(action); - setOpaque(true); - setBackground(ColorConstants.BACKGROUND); - setUI(new SharedComponentActionMenuItemUI()); } public void startLoading() { loading = true; - setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20)); revalidate(); repaint(); } public void stopLoading() { loading = false; - setBorder(BorderFactory.createEmptyBorder()); revalidate(); repaint(); } @@ -45,10 +39,16 @@ public class LoadingMenuItem extends UIMenuItem { } @Override - protected void paintBorder(Graphics g) { - super.paintBorder(g); + public Dimension getPreferredSize() { + Dimension dimension = super.getPreferredSize(); + return new Dimension(dimension.width + 12, dimension.height); + } + + @Override + public void paint(Graphics g) { + super.paint(g); if (loading) { - profileIcon.paintIcon(this, g, getWidth() - 20, 0); + g.drawImage(loadingImage, getWidth() - 16, 6, LOADING_ICON_PAINT_SIZE, LOADING_ICON_PAINT_SIZE, null); } } } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentMenuItem.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentMenuItem.java new file mode 100644 index 0000000000..7f8678a8a8 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentMenuItem.java @@ -0,0 +1,49 @@ +package com.fr.design.mainframe.share.ui.actions; + +import com.fr.design.gui.imenu.UIMenuItem; +import com.fr.design.mainframe.share.ui.constants.ColorConstants; + +import javax.swing.Action; +import javax.swing.BorderFactory; +import javax.swing.SwingConstants; +import java.awt.Dimension; +import java.awt.Insets; + +/** + * @author Starryi + * @version 1.0 + * Created by Starryi on 2021/10/20 + */ +public class SharedComponentMenuItem extends UIMenuItem { + public SharedComponentMenuItem(Action action) { + super(action); + setBackground(ColorConstants.BACKGROUND); + setUI(new SharedComponentMenuItemUI()); + setHorizontalAlignment(SwingConstants.LEFT); + setVerticalAlignment(SwingConstants.CENTER); + setBorder(BorderFactory.createEmptyBorder()); + setIcon(null); + setIconTextGap(4); + } + + @Override + public Dimension getPreferredSize() { + Dimension dimension = super.getPreferredSize(); + return new Dimension(dimension.width, dimension.height + 8); + } + + @Override + public Dimension getMinimumSize() { + return new Dimension(0, 0); + } + + @Override + public Insets getInsets() { + return new Insets(0, 0, 0, 0); + } + + @Override + public String getText() { + return super.getText().trim(); + } +} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentActionMenuItemUI.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentMenuItemUI.java similarity index 94% rename from designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentActionMenuItemUI.java rename to designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentMenuItemUI.java index a400ccf37b..98b1bab8cd 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentActionMenuItemUI.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentMenuItemUI.java @@ -22,7 +22,7 @@ import java.awt.Graphics2D; * @version 1.0 * Created by Starryi on 2021/10/18 */ -public class SharedComponentActionMenuItemUI extends UIMenuItemUI { +public class SharedComponentMenuItemUI extends UIMenuItemUI { @Override protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) { @@ -35,14 +35,14 @@ public class SharedComponentActionMenuItemUI extends UIMenuItemUI { g.fillRect(0, 0, menuWidth, menuHeight); if (menuItem.isOpaque()) { if (model.isArmed() || (menuItem instanceof JMenu && model.isSelected())) { - GUIPaintUtils.fillPaint((Graphics2D) g, 0, 0, menuWidth, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, 7); + GUIPaintUtils.fillPaint((Graphics2D) g, 0, 0, menuWidth, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, 0); } else { - GUIPaintUtils.fillPaint((Graphics2D) g, 0, 0, menuWidth, menuHeight, true, Constants.NULL, menuItem.getBackground(), 7); + GUIPaintUtils.fillPaint((Graphics2D) g, 0, 0, menuWidth, menuHeight, true, Constants.NULL, menuItem.getBackground(), 0); } g.setColor(oldColor); } else if (model.isArmed() || (menuItem instanceof JMenu && model.isSelected())) { - GUIPaintUtils.fillPaint((Graphics2D) g, 0, 0, menuWidth, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, 7); + GUIPaintUtils.fillPaint((Graphics2D) g, 0, 0, menuWidth, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, 0); g.setColor(oldColor); } } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentPopupAction.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentPopupAction.java new file mode 100644 index 0000000000..1cb72e4aa7 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentPopupAction.java @@ -0,0 +1,31 @@ +package com.fr.design.mainframe.share.ui.actions; + +import com.fr.design.actions.UpdateAction; +import com.fr.design.gui.imenu.UIMenuItem; + +/** + * @author Starryi + * @version 1.0 + * Created by Starryi on 2021/10/20 + */ +public abstract class SharedComponentPopupAction extends UpdateAction { + @Override + public UIMenuItem createMenuItem() { + Object object = this.getValue(SharedComponentMenuItem.class.getName()); + if (object == null) { + SharedComponentMenuItem menuItem = newSharedComponentMenuItem(); + // 设置名字用作单元测 + menuItem.setName(getName()); + setPressedIcon4Button(menuItem); + setDisabledIcon4Button(menuItem); + object = menuItem; + + this.putValue(SharedComponentMenuItem.class.getName(), object); + } + return (SharedComponentMenuItem) object; + } + + protected SharedComponentMenuItem newSharedComponentMenuItem() { + return new SharedComponentMenuItem(this); + } +} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentPopupMenu.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentPopupMenu.java new file mode 100644 index 0000000000..1f8145858d --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/SharedComponentPopupMenu.java @@ -0,0 +1,32 @@ +package com.fr.design.mainframe.share.ui.actions; + +import com.fr.design.gui.imenu.UIPopupMenu; + +import javax.swing.BorderFactory; +import java.awt.Dimension; +import java.awt.Insets; + +/** + * @author Starryi + * @version 1.0 + * Created by Starryi on 2021/10/20 + */ +public class SharedComponentPopupMenu extends UIPopupMenu { + public SharedComponentPopupMenu() { + setBorder(BorderFactory.createEmptyBorder()); + setRadius(2); + } + + @Override + public Insets getInsets() { + return new Insets(2, 2, 2, 2); + } + + @Override + public Dimension getMinimumSize() { + Dimension dimension = super.getMinimumSize(); + dimension.width = 0; + dimension.height = 0; + return dimension; + } +} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/AbstractOnlineWidgetBlock.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/AbstractOnlineWidgetBlock.java index 3be4f96b9a..8f3a914710 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/AbstractOnlineWidgetBlock.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/AbstractOnlineWidgetBlock.java @@ -1,10 +1,9 @@ package com.fr.design.mainframe.share.ui.block; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.mainframe.share.ui.actions.DownloadSuitableThemeAction; import com.fr.design.mainframe.share.ui.actions.Jump2DetailAction; -import com.fr.design.mainframe.share.ui.constants.ColorConstants; +import com.fr.design.mainframe.share.ui.actions.SharedComponentPopupMenu; import com.fr.design.mainframe.share.ui.online.OnlineResourceManager; import com.fr.design.mainframe.share.ui.online.OnlineWidgetSelectPane; import com.fr.design.mainframe.share.ui.online.ResourceLoader; @@ -114,10 +113,7 @@ public abstract class AbstractOnlineWidgetBlock extends PreviewWidgetBlock @Override public JPopupMenu createRightClickPopupMenu() { - UIPopupMenu popupMenu = new UIPopupMenu(); + UIPopupMenu popupMenu = new SharedComponentPopupMenu(); popupMenu.setOnlyText(true); popupMenu.setOpaque(true); popupMenu.setBackground(ColorConstants.BACKGROUND); @@ -286,21 +284,12 @@ public class LocalWidgetBlock extends PreviewWidgetBlock return popupMenu; } - private class MoveGroupAction extends UpdateAction { + private class MoveGroupAction extends SharedComponentPopupAction { public MoveGroupAction() { this.putValue(Action.SMALL_ICON, null); this.setName(Toolkit.i18nText("Fine-Design_Share_Group_Move")); } - @Override - public UIMenuItem createMenuItem() { - UIMenuItem menuItem = super.createMenuItem(); - menuItem.setOpaque(true); - menuItem.setBackground(ColorConstants.BACKGROUND); - menuItem.setUI(new SharedComponentActionMenuItemUI()); - return menuItem; - } - @Override public void actionPerformed(ActionEvent e) { new GroupMoveDialog(DesignerContext.getDesignerFrame()) { @@ -321,21 +310,12 @@ public class LocalWidgetBlock extends PreviewWidgetBlock } } - private class RemoveAction extends UpdateAction { + private class RemoveAction extends SharedComponentPopupAction { public RemoveAction() { this.putValue(Action.SMALL_ICON, null); this.setName(Toolkit.i18nText("Fine-Design_Share_Remove")); } - @Override - public UIMenuItem createMenuItem() { - UIMenuItem menuItem = super.createMenuItem(); - menuItem.setOpaque(true); - menuItem.setBackground(ColorConstants.BACKGROUND); - menuItem.setUI(new SharedComponentActionMenuItemUI()); - return menuItem; - } - @Override public void actionPerformed(ActionEvent e) { int rv = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), diff --git a/designer-form/src/main/resources/com/fr/design/form/images/loading.gif b/designer-form/src/main/resources/com/fr/design/form/images/loading.gif index a3c061b0f190ad1bd5199898f5e61fb55e7966e1..1cc7a4808309c634da58922dc92988f1cb601e15 100644 GIT binary patch literal 50146 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

U+ikOYaL5Nwpmj}|v{eoib4mmP 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 O#EQp4#~Kg-So(k2Hye2X delta 2584 zcmbW2X;hO}8ppH23kJy>))^5(P{A2M6L_;eLAVJ@@zg{^z-0 zAEZ8CrB|n=2t^u@1d^WXNga3Z4G)h^O}l#g9OL5;`}>`zPMsQ`n7VoEc3b<+W5@sp(o;1SE1_rNRzj5vQjhWf`>6y8QQ?nD3QxlWZcE`Zj_~g)okpbtB zqu<%xZ5UlUdGdBLPyT>*?;~E+ov08iY-Rrd5`+It9SFT*0UwC@| zewWqO*QIxt*!tSq+7})#IUEDFUi-cKolfV2u5Rnio3~n9+q-+LmoHzr(bC%4)jc~q zf9uwr+qdu7?E@VhckkZ4fByV=tF5=Ov8l7O+vyy#x%=jDwzuDGX=$ymuWxK>vOD@G zr)KWn>pbs|j~88YD;H*6j~*>NoqzOXZvJum3M!Xemq*L1 zgJ^%y@7ugtoKaR(P*kcZPWn*$afz<9JS|BY@ma~f4S7X*;ykWMw}-=nV&jFJ_*f`j zqm2~__l*=d5h{T>_hgql49E?*ZPs}b&jVj&GAiq*vPb+Pe+{P_I1 zIPRV}fgmD$fB80DzBupyq-p=BhnlSSAd&Q>7?OMa5?c~5S3wwX0*Adm3^5tZ1jYzs z1xEX#IQYlfLs>%K4RG+6kQl;EI71kdzCs#M0MS4kfegXA3|_XJNI^h^mq;N015nc*b%-)aAetDkc75|~_zz)Bfr zG-4P#*&iTukucM2*qreRtnd$Ic&5iB??P~sa(y8hmL^>b>@6)Ia15^Y->%|AN#xQG zAv2vSMx_9Z<5`sVDL4;$@12|y3T(mIAT0?bz=YH(i-AHxO@x4shWtRxbV#$~cY{p* z8&;5Pp=!yaYUOHZ`_g2V_An_zSXQ|++@WMie=JM*>{89x5n6I#lE|PXS;9rXTmK?H zx0XdFK|Z#!3WgPdgGeoBqlQ8^zgebz|HThZN~M89ejDoSZ)TawVgjo)STI4hm>r;x zCZI?U_d8)#v<43N4Bz4_XEQ5>{6J}eu(@WotK zA%j5@y_$NKr8-DT*{bhvzWh>djhFI;Ug2fu$Bk6D)Qepf?zNH*F2A_UZt`YHsp92q zYu{ntmC)&uwwE;ED-U@^YzsLPv?vol33w;i>ut0%zj|e5m^O*rTHSAyMuJ2M2|I2n z5;1`|Iq;4&N|c7^ag%i0J|uUCdIQK^S4`lCu3l8Aej+~s~af*Vm2nMLYb@`$*H{O1`Ju}8JX$T`;5Gj zj1IqdXi2pWtR2jnAVh9w|liVjagRH^{*2uV1 zO)Ij@%W{{Zk3kL@_Ur%As8GlHP-rLVw70?j5@G|6ZQn`Y##)@83c?wA1XQ*PGgk7p zY{l}mcxW^WK7mtsY;piYx>Fdb41~l8u{~9vhk|6NxWT+0BSF2(EfEbmFCCc zw(QHzuzZTqVr*nBB{YP{e0lceV){`U-DjGS6IFQ$hD z`~ST9M6M@I^a1fIHEro2!z7)1dy2<@@rnzBOcFZo_KIVP=@epTD0av~V_=kIF`qcfbIsw19FU*Xa?ZhEkx@?%%72Ad z@BVUJzbZxfCJ=Nhbx#vs5=yYd_;E{FHb&5RsN^F|m}rD^V~YuZk|IGtk=lT<*-bJG zAyA%3LST3Thm58w8cYb##Q-#GJ#{L!xt1Ft;}S_bw5lO9E0K>d2?iIcHDC2Z@Z7WB1+q!_H^-h*S+VY>R)bB-9>DRu2~)ycYxDJRG*tCy3# zPA!q8xxV|{x^}=ANPkrh`elq?2RC(qt~I*!)757F>!tmb<}le_&zQLHqCk@5-&soh AasU7T From 6ce71d3b1269c0c5c6034ea8695364a041dc154b Mon Sep 17 00:00:00 2001 From: kuangshuai Date: Thu, 21 Oct 2021 10:33:49 +0800 Subject: [PATCH 02/35] =?UTF-8?q?REPORT-61299=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E7=B1=BB=E5=BC=95=E5=AF=BC=E9=AB=98=E4=BA=AE?= =?UTF-8?q?window=E4=B8=8A=E6=9C=89=E4=B8=80=E5=9C=88=E9=BB=91=E7=BA=BF?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/guide/scene/AbstractGuideScene.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java index 95c7c24a4a..7ae93ab06b 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java @@ -178,9 +178,7 @@ public abstract class AbstractGuideScene extends JPanel implements GuideScene { return DEFAULT_HIGHLIGHT_INSETS; } }; - - label.setBorder(BorderFactory.createMatteBorder(DEFAULT_HIGHLIGHT_INSETS.top, DEFAULT_HIGHLIGHT_INSETS.left, DEFAULT_HIGHLIGHT_INSETS.bottom, DEFAULT_HIGHLIGHT_INSETS.right, Color.WHITE)); - + label.setBackground(Color.WHITE); label.setOpaque(true); label.setBounds(new Rectangle( rectangle.x - DEFAULT_HIGHLIGHT_INSETS.left, From 2ec87c3e7339279794ef837e3b171e4fb60b5251 Mon Sep 17 00:00:00 2001 From: hades Date: Thu, 21 Oct 2021 15:30:26 +0800 Subject: [PATCH 03/35] =?UTF-8?q?REPORT-61356=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=90=AF=E5=8A=A8=E5=8A=A0=E8=BD=BD=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E5=90=8E=EF=BC=8C=E5=81=9C=E7=95=99=E7=9A=84=E7=A9=BA=E7=99=BD?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=8F=98=E9=95=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/NorthRegionContainerPane.java | 79 ++++++++++++++----- 1 file changed, 61 insertions(+), 18 deletions(-) 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 f15b3517f0..99ef60ba49 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 @@ -17,6 +17,8 @@ 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.plugin.observer.PluginEventType; +import com.fr.plugin.observer.PluginListenerRegistration; import com.fr.stable.os.support.OSBasedAction; import com.fr.stable.os.support.OSSupportCenter; @@ -38,6 +40,17 @@ public class NorthRegionContainerPane extends JPanel { private JMenuBar menuBar; + private PluginFilter pluginFilter = new PluginFilter() { + + @Override + public boolean accept(PluginContext context) { + + return context.contain(PluginModule.ExtraDesign); + } + }; + + private volatile boolean existDesignExtraPlugin; + public static NorthRegionContainerPane getInstance() { if (THIS == null) { synchronized (NorthRegionContainerPane.class) { @@ -66,34 +79,64 @@ public class NorthRegionContainerPane extends JPanel { //hugh: private修改为protected方便oem的时候修改右上的组件构成 //顶部日志+登陆按钮 final JPanel northEastPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + initPluginListener(northEastPane, ad); + refreshNorthEastPane(northEastPane, ad); + return northEastPane; + } + + private void initPluginListener(JPanel northEastPane, ToolBarMenuDock ad) { //优先级为-1,保证最后全面刷新一次 - GeneralContext.listenPluginRunningChanged(new PluginEventListener(-1) { + PluginEventListener pluginOnRunOrStopListener = new PluginEventListener(-1) { @Override public void on(PluginEvent event) { - - refreshNorthEastPane(northEastPane, ad); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - if (DesignerContext.getDesignerFrame() == null) { - return; - } - DesignerContext.getDesignerFrame().refresh(); - DesignerContext.getDesignerFrame().repaint(); - } - }); + refreshAll(northEastPane, ad); } - }, new PluginFilter() { + }; + // 在设计器启动时仅在最后一个插件启用时候进行刷新一次 如果插件启用过程中存在实现了设计器接口的插件 + PluginEventListener afterAllPluginsActiveListener = new PluginEventListener() { + @Override + public void on(PluginEvent event) { + //优先级为-1,保证最后全面刷新一次 + GeneralContext.listenPluginRunningChanged(pluginOnRunOrStopListener, pluginFilter); + // 在设计器启动时仅在最后一个插件启用时候进行刷新一次 如果插件启用过程中存在实现了设计器接口的插件 + boolean needRefresh = DesignerContext.getDesignerFrame() != null && DesignerContext.getDesignerFrame().isVisible() && existDesignExtraPlugin; + if (needRefresh) { + refreshAll(northEastPane, ad); + } + } + }; + PluginEventListener beforeAllPluginStopListener = new PluginEventListener() { + @Override + public void on(PluginEvent event) { + PluginListenerRegistration.getInstance().stopListen(pluginOnRunOrStopListener); + } + }; + PluginEventListener pluginEventListener = new PluginEventListener() { @Override - public boolean accept(PluginContext context) { + public void on(PluginEvent event) { + existDesignExtraPlugin = true; + } + }; + GeneralContext.listenPluginRunningChanged(pluginEventListener, pluginFilter); + PluginListenerRegistration.getInstance().listen(PluginEventType.AfterAllActive, afterAllPluginsActiveListener); + PluginListenerRegistration.getInstance().listen(PluginEventType.BeforeAllStop, beforeAllPluginStopListener); - return context.contain(PluginModule.ExtraDesign); + } + + private void refreshAll(JPanel northEastPane, ToolBarMenuDock ad) { + refreshNorthEastPane(northEastPane, ad); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + if (DesignerContext.getDesignerFrame() == null) { + return; + } + DesignerContext.getDesignerFrame().refresh(); + DesignerContext.getDesignerFrame().repaint(); } }); - refreshNorthEastPane(northEastPane, ad); - return northEastPane; } private void refreshNorthEastPane(final JPanel northEastPane, final ToolBarMenuDock ad) { From 5ee8ca1b57cccee64eb1b7c303df16a72d3e8cc9 Mon Sep 17 00:00:00 2001 From: hades Date: Thu, 21 Oct 2021 16:33:58 +0800 Subject: [PATCH 04/35] =?UTF-8?q?REPORT-61356=20=20fix=20=E7=BB=9F?= =?UTF-8?q?=E4=B8=80api=E4=BD=BF=E7=94=A8=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/mainframe/NorthRegionContainerPane.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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 99ef60ba49..6802024eac 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 @@ -18,7 +18,6 @@ import com.fr.plugin.manage.PluginFilter; import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; import com.fr.plugin.observer.PluginEventType; -import com.fr.plugin.observer.PluginListenerRegistration; import com.fr.stable.os.support.OSBasedAction; import com.fr.stable.os.support.OSSupportCenter; @@ -110,7 +109,7 @@ public class NorthRegionContainerPane extends JPanel { PluginEventListener beforeAllPluginStopListener = new PluginEventListener() { @Override public void on(PluginEvent event) { - PluginListenerRegistration.getInstance().stopListen(pluginOnRunOrStopListener); + GeneralContext.stopListenPlugin(pluginOnRunOrStopListener); } }; PluginEventListener pluginEventListener = new PluginEventListener() { @@ -120,8 +119,8 @@ public class NorthRegionContainerPane extends JPanel { } }; GeneralContext.listenPluginRunningChanged(pluginEventListener, pluginFilter); - PluginListenerRegistration.getInstance().listen(PluginEventType.AfterAllActive, afterAllPluginsActiveListener); - PluginListenerRegistration.getInstance().listen(PluginEventType.BeforeAllStop, beforeAllPluginStopListener); + GeneralContext.listenPlugin(PluginEventType.AfterAllActive, afterAllPluginsActiveListener); + GeneralContext.listenPlugin(PluginEventType.BeforeAllStop, beforeAllPluginStopListener); } From c4c414ec5f5ec0b067746c973a5089c2e922f43d Mon Sep 17 00:00:00 2001 From: zack Date: Thu, 21 Oct 2021 17:06:42 +0800 Subject: [PATCH 05/35] =?UTF-8?q?REPORT-60993=20=E5=AF=BC=E5=87=BA-?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E4=BA=8B=E4=BB=B6-=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E6=B2=A1=E6=9C=89=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javascript/ExportJavaScriptPane.java | 129 +++++++++--------- 1 file changed, 66 insertions(+), 63 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java b/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java index 48c18eb699..416dd26c87 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java @@ -72,7 +72,6 @@ public class ExportJavaScriptPane extends AbstractHyperLinkPane parameterList = parameterViewPane.update(); + if (!parameterList.isEmpty()) { + Parameter[] parameters = new Parameter[parameterList.size()]; + parameterList.toArray(parameters); + js.setParameters(parameters); + } + } + } + } + public void populateSingleJavaScript(SingleJavaScript js){ + exportTypeComboBox.setSelectedItem(js.getExportType()); + fileNameRadioGroup.selectIndexButton(js.isDefaultFileName() ? 0 : 1); + if (!js.isDefaultFileName()) { + fileNameFormulaEditor.setEnabled(true); + fileNameFormulaEditor.setVisible(true); + fileNameFormulaEditor.setValue(BaseFormula.createFormulaBuilder().build(js.getFileName())); + } + if (js.isExtendParameters()) { + extendParametersCheckBox.setSelected(true); + } else { + extendParametersCheckBox.setSelected(false); + if (this.parameterViewPane != null) { + List parameterList = this.parameterViewPane.update(); + parameterList.clear(); + ParameterProvider[] parameters = js.getParameters(); + this.parameterViewPane.populate(parameters); + } + } + } + private JPanel initExportTypePane() { + UILabel typeLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Export_JS_Type") + ":"); + exportTypeComboBox = getComboBoxWithModel(new String[]{ExportJavaScript.EXPORT_PDF, ExportJavaScript.EXPORT_EXCEL_PAGE, ExportJavaScript.EXPORT_EXCEL_SIMPLE, ExportJavaScript.EXPORT_EXCEL_SHEET, ExportJavaScript.EXPORT_WORD, ExportJavaScript.EXPORT_IMAGE} + , EXPORT_TYPES_MAP); + Component[][] components = new Component[][]{{typeLabel, exportTypeComboBox}}; + + JPanel exportTypePane = TableLayoutHelper.createTableLayoutPane(components, new double[]{p}, new double[]{p, p}); + exportTypePane.setBorder(BorderFactory.createEmptyBorder(5, 2, 5, 2)); + return exportTypePane; + } @Override protected String title4PopupWindow() { @@ -221,6 +270,12 @@ public class ExportJavaScriptPane extends AbstractHyperLinkPane javaScripts = editorPane.update(); + for (SingleJavaScript js : javaScripts) { + exportJavaScript.addOtherTemplateJS(js); + } + } @Override protected String title4PopupWindow() { @@ -729,17 +784,6 @@ public class ExportJavaScriptPane extends AbstractHyperLinkPane parameterList = this.parameterViewPane.update(); - parameterList.clear(); - ParameterProvider[] parameters = js.getParameters(); - this.parameterViewPane.populate(parameters); - } - } - } else { - OtherTemplatePane pane = (OtherTemplatePane) this.templatePanel.getComponent(1); - pane.editorPane.populate(ob.getJsList().toArray(new SingleJavaScript[ob.getJsList().size()])); - } + currentTemplatePane.populateSingleJavaScript(ob.getCurrentTemplateJavaScript()); + + OtherTemplatePane pane = (OtherTemplatePane) this.templatePanel.getComponent(1); + pane.editorPane.populate(ob.getJsListForOtherTemplates().toArray(new SingleJavaScript[ob.getJsListForOtherTemplates().size()])); } @Override @@ -817,33 +841,12 @@ public class ExportJavaScriptPane extends AbstractHyperLinkPane parameterList = parameterViewPane.update(); - if (!parameterList.isEmpty()) { - Parameter[] parameters = new Parameter[parameterList.size()]; - parameterList.toArray(parameters); - js.setParameters(parameters); - } - } - } - exportJavaScript.addJS(js); - } else { - List javaScripts = otherTemplatePane.editorPane.update(); - for (SingleJavaScript js : javaScripts) { - exportJavaScript.addJS(js); - } - } + SingleJavaScript js = new SingleJavaScript(); + js.setCurrentTemplate(selected); + currentTemplatePane.updateSingleJavaScript(js); + exportJavaScript.addCurrentTemplateJS(js); + + otherTemplatePane.updateExportJavaScript(exportJavaScript); } private String getFileName() { From 0da2ff82ece613db81055ba8b70d71e203f611d0 Mon Sep 17 00:00:00 2001 From: kuangshuai Date: Thu, 21 Oct 2021 17:42:08 +0800 Subject: [PATCH 06/35] =?UTF-8?q?REPORT-61213=20mac=E5=85=A8=E5=B1=8F?= =?UTF-8?q?=E4=B8=8B=E9=83=A8=E5=88=86=E9=AB=98=E4=BA=AE=E5=85=83=E7=B4=A0?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E6=9C=89=E5=81=8F=E5=B7=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/mainframe/guide/base/GuideView.java | 7 ++++++- .../design/mainframe/guide/scene/AbstractGuideScene.java | 5 +++-- .../guide/creator/layout/ChangeLayoutComponentGuide.java | 4 +++- 3 files changed, 12 insertions(+), 4 deletions(-) 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 f8b93e34c3..6a9a60615f 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 @@ -85,7 +85,12 @@ public class GuideView extends JDialog { updateGuideViewLocation(); this.setVisible(true); if (scene != null) { - scene.start(); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + scene.start(); + } + }); } else { GuideManager.getInstance().getCurrentGuide().complete(); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java index 7ae93ab06b..5ead71c621 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java @@ -396,8 +396,9 @@ public abstract class AbstractGuideScene extends JPanel implements GuideScene { } public void clear() { - targetList = new ArrayList<>(); - highlightList = new ArrayList<>(); + targetList.clear(); + highlightList.clear(); + pointsList.clear(); this.nextButton = null; if (this.getComponentCount() > 0) { this.removeAll(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/guide/creator/layout/ChangeLayoutComponentGuide.java b/designer-realize/src/main/java/com/fr/design/mainframe/guide/creator/layout/ChangeLayoutComponentGuide.java index 2058bf958b..ae7fb81387 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/guide/creator/layout/ChangeLayoutComponentGuide.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/guide/creator/layout/ChangeLayoutComponentGuide.java @@ -87,9 +87,11 @@ public class ChangeLayoutComponentGuide { @Override public boolean prepared() { switchButton.getComponentPopupMenu().setVisible(true); + Rectangle popupBounds = GuideCreateUtils.getRelativeBounds(switchButton.getComponentPopupMenu(), switchButton,0, -switchButton.getComponentPopupMenu().getHeight()); + switchButton.getComponentPopupMenu().show(scene.getContainer(), popupBounds.x, popupBounds.y); scene.addCustomTarget( GuideCreateUtils.createModalTarget(switchButton.getComponentPopupMenu()), - GuideCreateUtils.getRelativeBounds(switchButton.getComponentPopupMenu(), switchButton,0, -switchButton.getComponentPopupMenu().getHeight()) + popupBounds ); scene.addClickTarget(switchButton.getComponentPopupMenu().getComponent(1), ClickScene.ClickType.LEFT, true); scene.addBubbleTip(Toolkit.i18nText("Fine-Design_Guide_Scene_F001002_Tip_Select_Fix_layout"), null, GuideTip.Direction.RIGHT, 0.5f, 0.8f); From 7dedcbc2aa43bdc16312f23c3baa972b2076cfc9 Mon Sep 17 00:00:00 2001 From: pengda Date: Thu, 21 Oct 2021 19:07:23 +0800 Subject: [PATCH 07/35] =?UTF-8?q?REPORT-61012=20&=20REPORT-61285=20?= =?UTF-8?q?=E6=8E=A7=E4=BB=B6=E8=81=94=E5=8A=A8=E9=97=AE=E9=A2=98=E5=8F=8A?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/gui/itableeditorpane/UITableEditorPane.java | 8 ++++++++ .../com/fr/design/javascript/ExportJavaScriptPane.java | 7 ++++--- 2 files changed, 12 insertions(+), 3 deletions(-) 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 d6973f6bb4..07756a56b7 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 @@ -153,4 +153,12 @@ public class UITableEditorPane extends BasicPane { tableModel.stopCellEditing(); } + + /** + * 设置表头是否可以改变大小 + */ + public void setHeaderResizing(boolean resizingAllowed){ + editTable.getTableHeader().setResizingAllowed(resizingAllowed); + } + } diff --git a/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java b/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java index 416dd26c87..9b323a88e6 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java @@ -263,6 +263,7 @@ public class ExportJavaScriptPane extends AbstractHyperLinkPane(new ExportJSTableModel()); + editorPane.setHeaderResizing(false); this.add(editorPane, BorderLayout.CENTER); } @@ -488,7 +489,7 @@ public class ExportJavaScriptPane extends AbstractHyperLinkPane Date: Fri, 22 Oct 2021 09:36:13 +0800 Subject: [PATCH 08/35] =?UTF-8?q?REPORT-61302=20=E3=80=90FR11=E3=80=91?= =?UTF-8?q?=E3=80=90=E7=BB=84=E4=BB=B6=E8=83=8C=E6=99=AF=E5=88=86=E7=A6=BB?= =?UTF-8?q?=E3=80=91&=E3=80=90=E5=9B=BA=E5=AE=9A=E5=B8=83=E5=B1=80-?= =?UTF-8?q?=E5=8E=9F=E5=B8=83=E5=B1=80=E6=8E=A8=E8=8D=904.1=E3=80=91?= =?UTF-8?q?=E5=86=B3=E7=AD=96=E6=8A=A5=E8=A1=A8-=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E8=83=8C=E6=99=AF=E5=88=86=E7=A6=BB=E5=81=9A=E8=BF=87=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E7=BB=84=E4=BB=B6=E7=A7=BB=E5=85=A5tab=E5=9D=97?= =?UTF-8?q?=EF=BC=8C=E7=BB=84=E4=BB=B6=E6=82=AC=E5=81=9C=E5=9C=A8tab?= =?UTF-8?q?=E4=B8=8A=E8=B6=85=E8=BF=871s=E5=B0=B1=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E4=B8=BA=E7=A7=BB=E5=85=A5tab=E5=86=85=E9=83=A8=EF=BC=8C?= =?UTF-8?q?=E7=8E=B0=E5=9C=A8=E5=92=8C10.0=E7=9A=84=E6=95=88=E6=9E=9C?= =?UTF-8?q?=E4=B8=8D=E4=B8=80=E6=A0=B7=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/mainframe/FormCreatorDropTarget.java | 3 ++- .../com/fr/design/mainframe/TabDragInner.java | 17 ++++++----------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java b/designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java index af4d2ae2de..82befa2731 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java @@ -96,11 +96,13 @@ public class FormCreatorDropTarget extends DropTarget { boolean formSubmit2Adapt = !addingModel.getXCreator().canEnterIntoAdaptPane() && container.acceptType(XWFitLayout.class); if (model != null && !chartEnter2Para && !formSubmit2Adapt) { + tabDragInner.tryDragIn(); success = model.add2Container(designer, container, x, y); } cancelPromptWidgetForbidEnter(); } if (success) { + tabDragInner.reset(); // 如果添加成功,则触发相应事件 XCreator xCreator = container.acceptType(XWParameterLayout.class) ? designer.getParaComponent() : designer.getRootComponent(); //SetSelection时要确保选中的是最顶层的布局 @@ -143,7 +145,6 @@ public class FormCreatorDropTarget extends DropTarget { designer.getSelectionModel().setSelectedCreators( FormSelectionUtils.rebuildSelection(xCreator, new Widget[]{widget})); designer.getEditListenerTable().fireCreatorModified(addingModel.getXCreator(), DesignerEvent.CREATOR_ADDED); - tabDragInner.tryDragIn(); } else { Toolkit.getDefaultToolkit().beep(); // 拖入失败 取消选中 diff --git a/designer-form/src/main/java/com/fr/design/mainframe/TabDragInner.java b/designer-form/src/main/java/com/fr/design/mainframe/TabDragInner.java index fb6608c43a..9b524f28e6 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/TabDragInner.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/TabDragInner.java @@ -1,7 +1,5 @@ package com.fr.design.mainframe; -import com.fr.design.designer.beans.AdapterBus; -import com.fr.design.designer.beans.ComponentAdapter; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.designer.creator.XLayoutContainer; @@ -64,16 +62,13 @@ public class TabDragInner { */ public void tryDragIn() { if (belowXLayoutContainer != null && belowXLayoutContainer.isDragInAble()) { - EditingMouseListener editingMouseListener = new EditingMouseListener(designer); - editingMouseListener.refreshTopXCreator(); belowXLayoutContainer.setEditable(true); - if (editingMouseListener.stopEditing() && belowXLayoutContainer != designer.getRootComponent()) { - ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, belowXLayoutContainer); - if (adapter != null) { - editingMouseListener.startEditing(belowXLayoutContainer, adapter.getDesignerEditor(), adapter); - belowXLayoutContainer.setDragInAble(false); - } - } + } + } + + public void reset() { + if (belowXLayoutContainer != null) { + belowXLayoutContainer.setDragInAble(false); } } From 5622c886cc7f1e324cd14d7079cbc9485cc08fc9 Mon Sep 17 00:00:00 2001 From: Lanlan Date: Fri, 22 Oct 2021 10:10:06 +0800 Subject: [PATCH 09/35] =?UTF-8?q?REPORT-61361=20=E6=96=B0=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E7=AE=A1=E7=90=8611.0=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-base/src/main/java/com/fr/design/upm/UpmUtils.java | 2 +- designer-base/src/test/java/com/fr/design/upm/UpmUtilsTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmUtils.java b/designer-base/src/main/java/com/fr/design/upm/UpmUtils.java index e97a5826a1..3d8252b759 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmUtils.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmUtils.java @@ -37,7 +37,7 @@ public class UpmUtils { } private static String fetchLatestVersion() { - String version = CloudCenter.getInstance().acquireUrlByKind("upm.script.version"); + String version = CloudCenter.getInstance().acquireUrlByKind("upm.script.version.v11"); if (StringUtils.isBlank(version)) { version = "1.0"; } diff --git a/designer-base/src/test/java/com/fr/design/upm/UpmUtilsTest.java b/designer-base/src/test/java/com/fr/design/upm/UpmUtilsTest.java index 31119d049c..5d96a6f0b3 100644 --- a/designer-base/src/test/java/com/fr/design/upm/UpmUtilsTest.java +++ b/designer-base/src/test/java/com/fr/design/upm/UpmUtilsTest.java @@ -34,7 +34,7 @@ public class UpmUtilsTest { EasyMock.expect(ServerPreferenceConfig.getInstance()).andReturn(serverPreferenceConfig).anyTimes(); CloudCenter cloudCenter = EasyMock.mock(CloudCenter.class); - EasyMock.expect(cloudCenter.acquireUrlByKind("upm.script.version")).andReturn("2.0").anyTimes(); + EasyMock.expect(cloudCenter.acquireUrlByKind("upm.script.version.v11")).andReturn("2.0").anyTimes(); PowerMock.mockStatic(CloudCenter.class); EasyMock.expect(CloudCenter.getInstance()).andReturn(cloudCenter).anyTimes(); From bc5e51c8f552b0f6d9b73bc537a090a7ed1e4528 Mon Sep 17 00:00:00 2001 From: Starryi Date: Thu, 21 Oct 2021 16:00:53 +0800 Subject: [PATCH 10/35] =?UTF-8?q?REPORT-61338=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E4=B8=BB=E9=A2=98-=E4=B8=BB=E9=A2=98=E9=85=8D?= =?UTF-8?q?=E8=89=B2=E4=BF=AE=E6=94=B9=E4=BF=9D=E5=AD=98=E5=90=8E=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E5=BC=82=E5=B8=B8=E7=A9=BA=E7=99=BD=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 AlphaFine也会创建一个主题管列界面的面板,用于提 取可以搜索的问题,但是这个面板是不对外展示的,不 应该启用对主题配置数据的监听以及线程池异步加载。 应用启动时,AlphaFine在另一个线程通过反射调用 默认构造函数创建面板,注册了对主题配置数据的监听 器,导致遍历监听器列表时出现并发访问异常,同时 违反了按需加载的主题列表设计意图 【改动思路】 仅在主题管理窗口可见后,再添加监听器和异步加载数据 --- .../theme/TemplateThemeGridControlPane.java | 42 ++++++------- .../theme/TemplateThemeGridPagesPane.java | 48 ++++----------- .../theme/TemplateThemeGridPane.java | 60 ++++++++++++------- .../dialog/TemplateThemeGridPagesDialog.java | 8 +-- 4 files changed, 72 insertions(+), 86 deletions(-) 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 f721923e94..36f4fc1462 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 @@ -43,6 +43,8 @@ import java.awt.Stroke; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import static com.fr.design.i18n.Toolkit.i18nText; @@ -63,27 +65,31 @@ public class TemplateThemeGridControlPane extends Basic private final AsyncThemeFetcher asyncThemeFetcher; - public static TemplateThemeGridControlPane createFormThemesManagerPane() { + private final Window window; + + public static TemplateThemeGridControlPane createFormThemesManagerPane(Window window) { FormThemeConfig config = FormThemeConfig.getInstance(); FormThemeProfilePane editPane = new FormThemeProfilePane(config); - return new TemplateThemeGridControlPane<>(config, editPane); + return new TemplateThemeGridControlPane<>(window, config, editPane); } - public static TemplateThemeGridControlPane createReportThemesManagerPane() { + public static TemplateThemeGridControlPane createReportThemesManagerPane(Window window) { ReportThemeConfig config = ReportThemeConfig.getInstance(); ReportThemeProfilePane editPane = new ReportThemeProfilePane(config); - return new TemplateThemeGridControlPane<>(config, editPane); + return new TemplateThemeGridControlPane<>(window, config, editPane); } - public TemplateThemeGridControlPane(TemplateThemeConfig config, TemplateThemeProfilePane profilePane) { + public TemplateThemeGridControlPane(Window window, TemplateThemeConfig config, TemplateThemeProfilePane profilePane) { + this.window = window; this.config = config; this.profilePane = profilePane; - this.themeListPane = new TemplateThemeGridPane<>(true, config, profilePane); + this.themeListPane = new TemplateThemeGridPane<>(window, true, config, profilePane); this.removeAction = new RemoveThemeAction(false); this.setTheme4NewTemplateButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Pane_Default_Setting")); this.asyncThemeFetcher = new AsyncThemeFetcher<>(1, config); initializePane(); + registerWindowListener(); } public TemplateThemeConfig getConfig() { @@ -117,6 +123,16 @@ public class TemplateThemeGridControlPane extends Basic repaint(); } + private void registerWindowListener() { + window.addWindowListener(new WindowAdapter() { + @Override + public void windowClosed(WindowEvent e) { + super.windowClosed(e); + asyncThemeFetcher.shutdown(); + } + }); + } + private void resetEnableRemoveAction(T selectedTheme, RemoveThemeAction removeAction) { if (selectedTheme == null) { removeAction.setEnabled(false); @@ -254,7 +270,6 @@ public class TemplateThemeGridControlPane extends Basic setName(name); setMnemonic('R'); this.prototypeThemeName = prototypeThemeName; - asyncThemeFetcher.submit(prototypeThemeName, null); } @Override @@ -308,17 +323,4 @@ public class TemplateThemeGridControlPane extends Basic g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); } } - - public void startListenThemeConfig() { - themeListPane.startListenThemeConfig(); - } - - public void stopListenThemeConfig() { - themeListPane.stopListenThemeConfig(); - } - - public void stopAsyncFetchTheme() { - asyncThemeFetcher.shutdown(); - themeListPane.stopAsyncFetchTheme(); - } } \ No newline at end of file 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 40838dbd83..330a2d0536 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 @@ -38,6 +38,7 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.Stroke; +import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; @@ -61,11 +62,11 @@ public class TemplateThemeGridPagesPane extends JPanel { private PageChangeListener pageChangeListener; private TemplateThemeGridPagePane currentTemplateThemeGridPagePane; - public TemplateThemeGridPagesPane() { - initializePane(); + public TemplateThemeGridPagesPane(Window window) { + initializePane(window); } - private void initializePane() { + private void initializePane(Window window) { setLayout(new BorderLayout()); setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10)); @@ -82,9 +83,9 @@ public class TemplateThemeGridPagesPane extends JPanel { add(contentPane, BorderLayout.CENTER); - themeUsingPane = new TemplateThemeUsingPane(); + themeUsingPane = new TemplateThemeUsingPane(window); contentPane.add(themeUsingPane, themeUsingPane.getTitle()); - themeManagingPane = new TemplateThemeManagingPane(); + themeManagingPane = new TemplateThemeManagingPane(window); contentPane.add(themeManagingPane, themeManagingPane.getTitle()); showThemeUsingPane(); @@ -189,11 +190,6 @@ public class TemplateThemeGridPagesPane extends JPanel { return button; } - public void exit() { - themeUsingPane.exit(); - themeManagingPane.exit(); - } - public void setPageChangeListener(PageChangeListener changeListener) { this.pageChangeListener = changeListener; } @@ -232,15 +228,13 @@ public class TemplateThemeGridPagesPane extends JPanel { public abstract static class TemplateThemeGridPagePane extends BasicPane { public abstract TemplateThemeConfig getConfig(); - - public void exit() { } } public static class TemplateThemeUsingPane extends TemplateThemeGridPagePane { private final JTemplate template; public final TemplateThemeGridPane themeListPane; - public TemplateThemeUsingPane() { + public TemplateThemeUsingPane(Window window) { super(); setLayout(new BorderLayout()); setBorder(new CompoundBorder( @@ -249,9 +243,7 @@ public class TemplateThemeGridPagesPane extends JPanel { template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); TemplateThemeConfig config = template.getUsingTemplateThemeConfig(); - themeListPane = new TemplateThemeGridPane<>(false, config, null); - - themeListPane.startListenThemeConfig(); + themeListPane = new TemplateThemeGridPane<>(window, false, config, null); themeListPane.setSelectedChangeListener(new ChangeListener() { @Override @@ -272,12 +264,6 @@ public class TemplateThemeGridPagesPane extends JPanel { return template.getUsingTemplateThemeConfig(); } - @Override - public void exit() { - themeListPane.stopListenThemeConfig(); - themeListPane.stopAsyncFetchTheme(); - } - @Override protected String title4PopupWindow() { return Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Using_Dialog_Title"); @@ -286,20 +272,16 @@ public class TemplateThemeGridPagesPane extends JPanel { public static class TemplateThemeManagingPane extends TemplateThemeGridPagePane { private final UITabbedPane tabbedPane; - private final TemplateThemeGridControlPane formThemesManagerPane; - private final TemplateThemeGridControlPane reportThemesManagerPane; - public TemplateThemeManagingPane() { + public TemplateThemeManagingPane(Window window) { setLayout(FRGUIPaneFactory.createBorderLayout()); tabbedPane = new UITabbedPane(); tabbedPane.setTabBorderColor(new Color(0xE0E0E1)); add(tabbedPane, BorderLayout.CENTER); - formThemesManagerPane = TemplateThemeGridControlPane.createFormThemesManagerPane(); - formThemesManagerPane.startListenThemeConfig(); - reportThemesManagerPane = TemplateThemeGridControlPane.createReportThemesManagerPane(); - reportThemesManagerPane.startListenThemeConfig(); + 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); @@ -321,14 +303,6 @@ public class TemplateThemeGridPagesPane extends JPanel { } } - @Override - public void exit() { - formThemesManagerPane.stopListenThemeConfig(); - formThemesManagerPane.stopAsyncFetchTheme(); - reportThemesManagerPane.stopListenThemeConfig(); - reportThemesManagerPane.stopAsyncFetchTheme(); - } - @Override protected String title4PopupWindow() { return Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Dialog_Title"); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPane.java index 2af4950f53..5d5ea7052c 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPane.java @@ -8,8 +8,6 @@ import com.fr.design.event.ChangeEvent; import com.fr.design.event.ChangeListener; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.widget.FRWidgetFactory; -import com.fr.design.widget.WidgetBoundsPaneFactory; import com.fr.stable.StringUtils; import javax.swing.BorderFactory; @@ -18,8 +16,11 @@ import javax.swing.ScrollPaneConstants; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; +import java.awt.Window; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -53,13 +54,17 @@ public class TemplateThemeGridPane extends BasicPane { private ChangeListener changeListener; - public TemplateThemeGridPane(boolean displayTheme4NewTemplateMarker, TemplateThemeConfig config, TemplateThemeProfilePane profilePane) { + private final Window window; + + public TemplateThemeGridPane(Window window, boolean displayTheme4NewTemplateMarker, TemplateThemeConfig config, TemplateThemeProfilePane profilePane) { + this.window = window; this.displayTheme4NewTemplateMarker = displayTheme4NewTemplateMarker; this.config = config; this.profilePane = profilePane; this.contentListPane = new JPanel(); this.asyncThemeFetcher = new AsyncThemeFetcher<>(ASYNC_FETCH_THEME_THREAD_COUNT, config); initializePane(); + registerWindowListener(); } private void initializePane() { @@ -84,6 +89,24 @@ public class TemplateThemeGridPane extends BasicPane { } + private void registerWindowListener() { + window.addWindowListener(new WindowAdapter() { + @Override + public void windowOpened(WindowEvent e) { + super.windowOpened(e); + startListenThemeConfig(); + asyncFetchThemes(); + } + + @Override + public void windowClosed(WindowEvent e) { + super.windowClosed(e); + stopListenThemeConfig(); + asyncThemeFetcher.shutdown(); + } + }); + } + public void fillContentListPane() { contentListPane.removeAll(); List names = config.getThemeNames(); @@ -97,6 +120,7 @@ public class TemplateThemeGridPane extends BasicPane { } } } + private TemplateThemeBlock createCachedTemplateThemeBlock(String name) { TemplateThemeBlock block = blockCache.get(name); if (block == null) { @@ -115,19 +139,6 @@ public class TemplateThemeGridPane extends BasicPane { setSelectedBlock(block); } }); - asyncThemeFetcher.submit(name, new AsyncThemeFetcher.AsyncThemeFetchCallbackAdapter() { - @Override - public void beforeCachedFetch() { - super.beforeCachedFetch(); - block.setTheme(null); - } - - @Override - public void afterCachedFetch(T theme) { - super.afterCachedFetch(theme); - block.setTheme(theme); - } - }); return block; } @@ -154,6 +165,15 @@ public class TemplateThemeGridPane extends BasicPane { asyncThemeFetcher.submit(themeName, new AsyncThemeListItemFetchCallback(themeName)); } + private void asyncFetchThemes() { + List names = config.getThemeNames(); + for (String name: names) { + if (config.contains(name)) { + asyncThemeFetcher.submit(name, new AsyncThemeListItemFetchCallback(name)); + } + } + } + @Override protected String title4PopupWindow() { return null; @@ -163,7 +183,7 @@ public class TemplateThemeGridPane extends BasicPane { return selectedBlock != null ? selectedBlock.getTheme() : null; } - public void startListenThemeConfig() { + private void startListenThemeConfig() { if (themeConfigChangeListener == null) { themeConfigChangeListener = new TemplateThemeConfig.ThemeConfigChangeListener() { @Override @@ -219,17 +239,13 @@ public class TemplateThemeGridPane extends BasicPane { } } - public void stopListenThemeConfig() { + private void stopListenThemeConfig() { if (themeConfigChangeListener != null) { config.removeThemeConfigChangeListener(themeConfigChangeListener); themeConfigChangeListener = null; } } - public void stopAsyncFetchTheme() { - asyncThemeFetcher.shutdown(); - } - private class AsyncThemeListItemFetchCallback extends AsyncThemeFetcher.AsyncThemeFetchCallbackAdapter { private final String themeName; public AsyncThemeListItemFetchCallback(String themeName) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeGridPagesDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeGridPagesDialog.java index 917f078d52..da0649d804 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeGridPagesDialog.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeGridPagesDialog.java @@ -28,7 +28,7 @@ public class TemplateThemeGridPagesDialog extends TemplateThemeDialog implements @Override protected JPanel createContentPane() { - overallPane = new TemplateThemeGridPagesPane(); + overallPane = new TemplateThemeGridPagesPane(this); overallPane.setPageChangeListener(this); return overallPane; } @@ -43,12 +43,6 @@ public class TemplateThemeGridPagesDialog extends TemplateThemeDialog implements return overallPane.createRightButtons(); } - @Override - public void exit() { - overallPane.exit(); - super.exit(); - } - @Override public void onPageChangeListener() { setupActionButtons(); From 022ae69f07bb6f0280f167c77279a61dcb210145 Mon Sep 17 00:00:00 2001 From: Starryi Date: Thu, 21 Oct 2021 18:08:25 +0800 Subject: [PATCH 11/35] =?UTF-8?q?CHART-21593=20=E3=80=90=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E3=80=91=E7=94=9F=E6=88=90=E8=B7=9F=E9=9A=8F?= =?UTF-8?q?=E4=B8=BB=E9=A2=98=E7=9A=84=E7=BB=84=E4=BB=B6=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E6=8B=96=E5=88=B0=E5=85=B6=E4=BB=96=E4=B8=BB=E9=A2=98=E7=9A=84?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E4=B8=AD=EF=BC=8C=E5=9B=BE=E8=A1=A8=E8=BF=98?= =?UTF-8?q?=E6=98=AF=E8=B7=9F=E9=9A=8F=E4=B8=BB=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 处理新添加组件中的图表主题样式 【改动思路】 同上 --- .../com/fr/design/designer/creator/XCreatorUtils.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java b/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java index 4087231522..30f9ab3074 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java @@ -3,6 +3,7 @@ */ package com.fr.design.designer.creator; +import com.fr.base.chart.BaseChartCollection; import com.fr.base.theme.FineColorFlushUtils; import com.fr.base.theme.FineColorGather; import com.fr.base.theme.FineColorManager; @@ -86,6 +87,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.Icon; import java.awt.Container; import java.awt.Dimension; +import java.util.List; /** * XCreator的相关处理 @@ -384,7 +386,12 @@ public class XCreatorUtils { public static void setupTemplateTheme(XCreator container, final boolean forceFollowingTheme, final FormTheme currentTemplateUsingTheme, TemplateThemeCompatible compatible) { FineColorGather colorGather = new FineColorManager.FineColorReplaceByTheme(currentTemplateUsingTheme, compatible); - Form.traversalWidget(container.toData(), new WidgetGather() { + Widget root = container.toData(); + List chartCollections = root.getChartCollections(); + for (BaseChartCollection chartCollection: chartCollections) { + chartCollection.onTemplateUsingThemeChange(currentTemplateUsingTheme, compatible); + } + Form.traversalWidget(root, new WidgetGather() { @Override public void dealWith(Widget widget) { TemplateThemeAware themedWidget = (TemplateThemeAware) widget; From 851978c77062f462db22ec1f3150c9d02a06ea4f Mon Sep 17 00:00:00 2001 From: Starryi Date: Thu, 21 Oct 2021 18:10:35 +0800 Subject: [PATCH 12/35] =?UTF-8?q?REPORT-61373=20=E3=80=90=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E8=8E=B7=E5=8F=96=E3=80=9111.0=E7=9A=84=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E4=B8=8B=E8=BD=BD=E4=B8=8D=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 被测试组件仅存在于测试服务器,而下载组件使用的 是正式服务器地址。所以下载失败 【改动思路】 下载组件的地址修改为可根据配置文件自动切换的地址 --- .../com/fr/design/mainframe/share/util/DownloadUtils.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/util/DownloadUtils.java b/designer-form/src/main/java/com/fr/design/mainframe/share/util/DownloadUtils.java index c5b90c7856..83ca9a6a34 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/util/DownloadUtils.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/util/DownloadUtils.java @@ -39,12 +39,14 @@ import java.security.KeyFactory; import java.security.interfaces.RSAPublicKey; import java.security.spec.X509EncodedKeySpec; +import static com.fr.form.share.constants.ShareComponentConstants.REU_INFO_PATH; + /** * created by Harrison on 2020/05/27 **/ public class DownloadUtils { - private static final String REUSES_URL = CloudCenter.getInstance().acquireUrlByKind("af.reuseInfo") + "file/download"; - private static final String PACKAGE_REUSES_URL = CloudCenter.getInstance().acquireUrlByKind("af.reuseInfo") + "package/download/"; + private static final String REUSES_URL = StableUtils.pathJoin(ShareComponentConstants.REU_INFO_PATH, "file/download"); + private static final String PACKAGE_REUSES_URL = StableUtils.pathJoin(ShareComponentConstants.REU_INFO_PATH, "package/download/"); private static final String CERTIFICATE_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtsz62CPSWXZE/IYZRiAuTSZkw\n" + "1WOwer8+JFktK0uKLAUuQoBr+UjAMFtRA8W7JgKMDwZy/2liEAiXEOSPU/hrdV8D\n" + "tT541LnGi1X/hXiRwuttPWYN3L2GYm/d5blU+FBNwghBIrdAxXTzYBc6P4KL/oYX\n" + From c84f900dc67dcab74841a97c599e08cd12b70d55 Mon Sep 17 00:00:00 2001 From: Starryi Date: Wed, 20 Oct 2021 18:58:09 +0800 Subject: [PATCH 13/35] =?UTF-8?q?CHART-21560=20=E3=80=90FR11=E3=80=91?= =?UTF-8?q?=E5=9B=BE=E8=A1=A8tab=E5=88=87=E6=8D=A2=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E7=BC=96=E8=BE=91=E5=A4=B1=E6=95=88=EF=BC=8C?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E8=A7=A6=E5=8F=91=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 点击UITabGroup的标签页按钮时,不应该触发fireStateChange, 因为没有配置修改 【改动思路】 同上 --- .../src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java | 2 +- .../src/main/java/com/fr/design/gui/ibutton/UITabGroup.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 cbebaf9d8f..2dc3ab6292 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 @@ -314,7 +314,7 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver, UIOb * @param newSelectedIndex */ public void setSelectedIndex(int newSelectedIndex) { - setSelectedIndex(newSelectedIndex, true); + setSelectedIndex(newSelectedIndex, false); } private void fireStateChanged() { 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 1d74d2e1d3..d772591047 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 @@ -64,7 +64,7 @@ public class UITabGroup extends UIButtonGroup { @Override protected void setSelectedIndex(int newSelectedIndex, boolean fireChanged) { - super.setSelectedIndex(newSelectedIndex, fireChanged); + super.setSelectedIndex(newSelectedIndex, false); tabChanged(newSelectedIndex); } } \ No newline at end of file From 9c6e4040ef9550db9c75c3f7fe26646b51692168 Mon Sep 17 00:00:00 2001 From: Starryi Date: Fri, 22 Oct 2021 10:56:41 +0800 Subject: [PATCH 14/35] =?UTF-8?q?CHART-21579=20=E6=A8=A1=E7=89=88=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E7=BC=96=E8=BE=91=E9=A1=B5=E9=9D=A2-=E5=9B=BE?= =?UTF-8?q?=E8=A1=A8-=E7=B3=BB=E5=88=97-=E6=B8=90=E5=8F=98=E8=89=B2?= =?UTF-8?q?=E7=9A=84=E8=89=B2=E5=80=BC=E8=81=94=E5=8A=A8=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 交互变更:只有选择了选色控件中的主题色部分才会被重置 联动,若用户选择了自定义配色则不会被重置. 【改动思路】 同上 --- .../fr/design/mainframe/theme/TemplateThemeEditorPane.java | 3 --- .../fr/design/mainframe/theme/edit/ChartStyleEditPane.java | 5 ----- .../mainframe/theme/edit/chart/ChartSeriesStylePane.java | 6 ------ 3 files changed, 14 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeEditorPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeEditorPane.java index e924080ef6..0b26f6f8e7 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeEditorPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeEditorPane.java @@ -17,7 +17,6 @@ import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.theme.edit.CellStyleListEditPane; import com.fr.design.mainframe.theme.edit.ChartStyleEditPane; -import com.fr.design.mainframe.theme.edit.ui.ColorListExtendedPane; import com.fr.design.mainframe.theme.edit.ui.ColorListPane; import com.fr.design.mainframe.theme.edit.ui.LabelUtils; import com.fr.design.mainframe.theme.ui.AutoCheckTextField; @@ -163,8 +162,6 @@ public abstract class TemplateThemeEditorPane extends J FineColorFlushUtils.replaceCacheObject(theme, replaceByColorScheme); FineColorManager.traverse(theme, replaceByColorScheme); populateBean4CustomEditors(theme); - //图表渐变色 - chartStyleSettingPane.populateGradientBar(colors); this.repaint(); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ChartStyleEditPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ChartStyleEditPane.java index 3830f02f15..4d75622aed 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ChartStyleEditPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ChartStyleEditPane.java @@ -13,7 +13,6 @@ import com.fr.design.mainframe.theme.edit.chart.ChartTitleAndBackgroundStylePane import javax.swing.BorderFactory; import java.util.ArrayList; import java.util.List; -import java.awt.Color; /** * @author Bjorn @@ -88,10 +87,6 @@ public class ChartStyleEditPane extends MultiTabPane { return chartStyle; } - public void populateGradientBar(List colors) { - chartSeriesStylePane.populateGradientBar(colors); - } - @Override public boolean accept(Object ob) { return false; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartSeriesStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartSeriesStylePane.java index fbb8f64895..098dc468d7 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartSeriesStylePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartSeriesStylePane.java @@ -74,12 +74,6 @@ public class ChartSeriesStylePane extends AbstractChartStylePane { checkTypeButton(); } - - public void populateGradientBar(List colors) { - gradientBar.updateColor(colors.get(0), colors.get(1)); - this.repaint(); - } - public void update(ThemedChartStyle chartStyle) { chartStyle.getThemedChartSeriesColor().setCombineColor(colorTypeButton.getSelectedIndex() == 0); chartStyle.getThemedChartSeriesColor().setBeginColor(gradientBar.getSelectColorPointBtnP1().getColorInner()); From ff933895d9c8a05ebfc3ab694bd371fe4ed68644 Mon Sep 17 00:00:00 2001 From: Lanlan Date: Fri, 22 Oct 2021 11:49:44 +0800 Subject: [PATCH 15/35] =?UTF-8?q?REPORT-60366=20fr11-linux=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8-=E6=8F=92=E4=BB=B6=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E5=9C=A8=E7=BA=BF=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/extra/PluginUtils.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginUtils.java b/designer-base/src/main/java/com/fr/design/extra/PluginUtils.java index ed7253bad2..5a5b58f776 100644 --- a/designer-base/src/main/java/com/fr/design/extra/PluginUtils.java +++ b/designer-base/src/main/java/com/fr/design/extra/PluginUtils.java @@ -80,10 +80,12 @@ public class PluginUtils { public static String transPluginsToString(List plugins) throws Exception { JSONArray jsonArray = new JSONArray(); for (PluginContext plugin : plugins) { - JSONObject jo = new JSONObject(); - jo.put("id", plugin.getID()); - jo.put("version", plugin.getVersion()); - jsonArray.put(jo); + if (VersionIntervalType.isSupported(plugin.supportCurrentFRVersion())) { + JSONObject jo = new JSONObject(); + jo.put("id", plugin.getID()); + jo.put("version", plugin.getVersion()); + jsonArray.put(jo); + } } return jsonArray.toString(); } From 6d1ffd15fa7bab6fa3828fd548799cdf4a06280c Mon Sep 17 00:00:00 2001 From: kuangshuai Date: Fri, 22 Oct 2021 11:51:10 +0800 Subject: [PATCH 16/35] =?UTF-8?q?REPORT-61207=20=E5=BC=95=E5=AF=BC?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=AD=97=E4=BD=93=E6=98=BE=E7=A4=BA=E4=B8=8D?= =?UTF-8?q?=E5=AF=B9=E4=B8=94=E8=A2=AB=E6=88=AA=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guide/ui/GuideCompleteDialog.java | 21 ++++---------- .../guide/ui/GuideLoadingGlassPane.java | 2 +- .../guide/ui/bubble/BubbleWithClose.java | 25 ++++------------- .../mainframe/guide/utils/GuideUIUtils.java | 28 +++++++++++++++++++ 4 files changed, 40 insertions(+), 36 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/guide/utils/GuideUIUtils.java diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideCompleteDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideCompleteDialog.java index b90c5718c6..1d5b907e3b 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideCompleteDialog.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideCompleteDialog.java @@ -7,6 +7,7 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.guide.utils.GuideUIUtils; import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.general.IOUtils; @@ -14,9 +15,7 @@ import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JDialog; import javax.swing.JPanel; -import javax.swing.JTextPane; import javax.swing.SwingConstants; -import javax.swing.text.MutableAttributeSet; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; @@ -37,9 +36,9 @@ public class GuideCompleteDialog extends JDialog { private static final int ICON_HEIGHT = 182; private static final Color FONT_COLOR = new Color(51, 51, 52); private static final Color BUTTON_BG_COLOR = new Color(65, 155,249); - private static final Font TITLE_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 22); - private static final Font CONTENT_FONT = new Font(Font.SANS_SERIF, Font.PLAIN, 18); - private static final Font BUTTON_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 14); + private static final Font TITLE_FONT = new Font("Default", Font.BOLD, 22); + private static final Font CONTENT_FONT = new Font("Default", Font.PLAIN, 18); + private static final Font BUTTON_FONT = new Font("Default", Font.BOLD, 14); private static GuideCompleteDialog dialog; public static GuideCompleteDialog getInstance() { @@ -78,12 +77,11 @@ public class GuideCompleteDialog extends JDialog { title.setForeground(FONT_COLOR); textArea = new UITextPane(); - changeLineSpacing(textArea, 0.15f,false); + textArea.setFont(CONTENT_FONT); + GuideUIUtils.setTextPaneLineHeight(textArea, 26); textArea.setEnabled(false); textArea.setOpaque(false); - textArea.setFont(CONTENT_FONT); textArea.setPreferredSize(new Dimension(236, 52)); - textArea.setBorder(null); textArea.setDisabledTextColor(FONT_COLOR); StyledDocument doc = textArea.getStyledDocument(); SimpleAttributeSet center = new SimpleAttributeSet(); @@ -141,11 +139,4 @@ public class GuideCompleteDialog extends JDialog { } } }; - - private void changeLineSpacing(JTextPane pane, float factor, boolean replace) { - pane.selectAll(); - MutableAttributeSet set = new SimpleAttributeSet(pane.getParagraphAttributes()); - StyleConstants.setLineSpacing(set, factor); - pane.setParagraphAttributes(set, replace); - } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideLoadingGlassPane.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideLoadingGlassPane.java index 47a10d0be8..44590540da 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideLoadingGlassPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideLoadingGlassPane.java @@ -40,7 +40,7 @@ public class GuideLoadingGlassPane extends JPanel { imageContainer.add(GuideLoadingPane.getInstance()); UILabel hintLabel = new UILabel(Toolkit.i18nText("Fine-Design_Guide_Loading_Wait")); - hintLabel.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 14)); + hintLabel.setFont(new Font("Default", Font.PLAIN, 14)); hintLabel.setHorizontalAlignment(SwingConstants.CENTER); hintLabel.setForeground(Color.WHITE); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/bubble/BubbleWithClose.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/bubble/BubbleWithClose.java index 62e0ed65d0..6851c09cd5 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/bubble/BubbleWithClose.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/bubble/BubbleWithClose.java @@ -4,12 +4,12 @@ package com.fr.design.mainframe.guide.ui.bubble; import com.fr.base.GraphHelper; import com.fr.design.gui.frpane.UITextPane; import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.mainframe.guide.utils.GuideUIUtils; import com.fr.general.IOUtils; import com.fr.stable.StringUtils; import javax.swing.Icon; import javax.swing.JTextPane; -import javax.swing.text.MutableAttributeSet; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; @@ -32,8 +32,8 @@ import java.text.AttributedCharacterIterator; import java.text.AttributedString; public class BubbleWithClose extends Bubble { - private static final Font TITLE_FONT = new Font(Font.SANS_SERIF, Font.PLAIN, 14); - private static final Font CONTENT_FONT = new Font(Font.SANS_SERIF, Font.PLAIN, 12); + private static final Font TITLE_FONT = new Font("Default", Font.PLAIN, 14); + private static final Font CONTENT_FONT = new Font("Default", Font.PLAIN, 12); private static final int TITLE_LINE_HEIGHT = 22; private static final int CONTENT_LINE_HEIGHT = 18; @@ -157,33 +157,18 @@ public class BubbleWithClose extends Bubble { } private UITextPane createTextArea(String str, Font font, int lineHeight, Color foreground) { - int lineSpace = lineHeight - font.getSize(); - UITextPane textArea= new UITextPane(){ - @Override - public Insets getInsets() { - return new Insets(lineSpace / 2 - 1, 0, lineSpace / 2, 0); - } - }; + UITextPane textArea= new UITextPane(); textArea.setFont(font); - changeLineSpacing(textArea, lineHeight, true); + GuideUIUtils.setTextPaneLineHeight(textArea, lineHeight); textArea.setEditable(false); textArea.setForeground(foreground); textArea.setDisabledTextColor(foreground); - textArea.setBorder(null); textArea.setOpaque(false); textArea.setText(str); highlightText(textArea); return textArea; } - private void changeLineSpacing(JTextPane pane, int lineHeight, boolean replace) { - pane.selectAll(); - MutableAttributeSet set = new SimpleAttributeSet(pane.getParagraphAttributes()); - FontMetrics fontMetrics = GraphHelper.getFontMetrics(pane.getFont()); - StyleConstants.setLineSpacing(set, (float)(lineHeight - fontMetrics.getHeight()) / fontMetrics.getHeight()); - pane.setParagraphAttributes(set, replace); - } - private void highlightText(JTextPane textArea) { SimpleAttributeSet sas = new SimpleAttributeSet(); StyleConstants.setForeground(sas, HIGHLIGHT_COLOR); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/utils/GuideUIUtils.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/utils/GuideUIUtils.java new file mode 100644 index 0000000000..bd6ee33102 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/utils/GuideUIUtils.java @@ -0,0 +1,28 @@ +package com.fr.design.mainframe.guide.utils; + +import com.fr.base.GraphHelper; + +import javax.swing.BorderFactory; +import javax.swing.JTextPane; +import javax.swing.text.MutableAttributeSet; +import javax.swing.text.SimpleAttributeSet; +import javax.swing.text.StyleConstants; +import java.awt.FontMetrics; +import java.awt.Insets; + +public class GuideUIUtils { + public static void setTextPaneLineHeight(JTextPane pane, int lineHeight) { + pane.selectAll(); + pane.setMargin(new Insets(0,0,0,0)); + MutableAttributeSet set = new SimpleAttributeSet(pane.getParagraphAttributes()); + FontMetrics fontMetrics = GraphHelper.getFontMetrics(pane.getFont()); + int delta = (lineHeight - fontMetrics.getHeight()) / 2 * 2 ; + if (delta > 0) { + StyleConstants.setLineSpacing(set, delta/ 2.0f / fontMetrics.getHeight()); + pane.setParagraphAttributes(set, false); + int dis = fontMetrics.getDescent() - fontMetrics.getLeading(); + int marginTop = dis > 0 ? ((delta - dis) / 2 + dis) : ((delta - dis) / 2); + pane.setBorder(BorderFactory.createEmptyBorder(marginTop, 0,0,0)); + } + } +} From eb31aef59573a73a670000332b17fd66ad24766a Mon Sep 17 00:00:00 2001 From: kuangshuai Date: Fri, 22 Oct 2021 13:53:11 +0800 Subject: [PATCH 17/35] =?UTF-8?q?REPORT-60896=20=E5=BC=95=E5=AF=BC?= =?UTF-8?q?=E8=92=99=E5=B1=82=E6=9C=89=E6=AE=8B=E7=95=99=E9=98=B4=E5=BD=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/guide/base/Guide.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/base/Guide.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/base/Guide.java index 9469f931a1..fc35b742d4 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/guide/base/Guide.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/base/Guide.java @@ -135,15 +135,20 @@ public class Guide { public void start() { guideView.hideLoading(); - if (scene != null) { - guideView.setScene(scene); - guideView.showGuide(); - if (lifecycle != null) { - lifecycle.onStart(); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + if (scene != null) { + guideView.setScene(scene); + guideView.showGuide(); + if (lifecycle != null) { + lifecycle.onStart(); + } + } else { + complete(); + } } - } else { - complete(); - } + }); } public void complete() { From fae9afc11f79744c6d93da1632109117a28e82b7 Mon Sep 17 00:00:00 2001 From: Starryi Date: Fri, 22 Oct 2021 14:03:45 +0800 Subject: [PATCH 18/35] =?UTF-8?q?REPORT-61413=20=E3=80=90=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E5=88=87=E6=8D=A2=E3=80=91cpt=E9=A2=84=E8=A7=88?= =?UTF-8?q?=E5=9B=BE=E9=87=8C=E7=9A=84=E5=B7=A6=E4=B8=8A=E8=A7=92=E6=96=9C?= =?UTF-8?q?=E7=BA=BF=E5=8D=95=E5=85=83=E6=A0=BC=E5=BA=94=E8=AF=A5=E5=92=8C?= =?UTF-8?q?=E5=B0=8F=E6=A0=87=E9=A2=98=E6=A0=BC=E5=BC=8F=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 表头单元格适用于小标题样式 【改动思路】 同上 --- .../mainframe/theme/preview/ecpreview/ECReportPreviewPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/ECReportPreviewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/ECReportPreviewPane.java index 63d75449dc..885f480b7e 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/ECReportPreviewPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/ECReportPreviewPane.java @@ -68,7 +68,7 @@ public class ECReportPreviewPane extends UINoOpaquePanel implements ThemePreview Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Profile_Pane_EC_Data"), Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Profile_Pane_Row_Name")}, new Point2D[]{new Point(159, 71), new Point(225, 49)}); cornerCell.setPreferredSize(new Dimension(225, 71)); - headerCellList.add(cornerCell); + titleCellList.add(cornerCell); northPane.add(cornerCell, BorderLayout.WEST); JPanel centerPane = FRGUIPaneFactory.createBorderLayout_NO_Opaque_Pane(); northPane.add(centerPane, BorderLayout.CENTER); From 900de178295f427720a062a31f66a9d011121e0f Mon Sep 17 00:00:00 2001 From: Starryi Date: Fri, 22 Oct 2021 14:31:29 +0800 Subject: [PATCH 19/35] =?UTF-8?q?REPORT-61415=20=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E8=89=B2=E9=A2=9C=E8=89=B2=E9=80=89=E6=8B=A9=E6=A1=86=E9=BB=91?= =?UTF-8?q?=E8=89=B2=E5=88=97=E4=B8=8D=E7=AC=A6=E5=90=88=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 修改黑色列标准色色值 【改动思路】 同上 --- .../main/java/com/fr/design/style/color/NewColorSelectPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectPane.java b/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectPane.java index 180055b3e0..22be3f4dcf 100644 --- a/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectPane.java +++ b/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectPane.java @@ -169,7 +169,7 @@ public class NewColorSelectPane extends BasicPane implements ColorSelectable { Color.decode("#CCCCCC"), // 2列灰度色 - Color.decode("#333333"), + Color.decode("#000000"), Color.decode("#FFFFFF"), }; From adadb5169054967dcfb91c8141bac6cfb483de98 Mon Sep 17 00:00:00 2001 From: kuangshuai Date: Fri, 22 Oct 2021 15:23:54 +0800 Subject: [PATCH 20/35] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E5=BC=95=E5=AF=BC=E4=BB=BB=E5=8A=A1=E7=9A=84=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../creator/layout/UseLayoutAndComponentGuide.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/guide/creator/layout/UseLayoutAndComponentGuide.java b/designer-realize/src/main/java/com/fr/design/mainframe/guide/creator/layout/UseLayoutAndComponentGuide.java index 05f0d20be0..78e75d8f20 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/guide/creator/layout/UseLayoutAndComponentGuide.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/guide/creator/layout/UseLayoutAndComponentGuide.java @@ -47,9 +47,9 @@ import java.util.TimerTask; public class UseLayoutAndComponentGuide { private static final String[] PRE_INSTALL_COMPONENTS = { - "大屏标题-酷炫蓝.25fcd194-d4db-406f-8a08-210f3c262870.reu", - "散点闪烁地图-酷炫蓝.5e17c2eb-5b18-4b6c-854a-5ffff7f6337a.reu", - "排名明细表.b4dab4f2-7b1a-4540-a2d4-65c3e080334e.reu" + "新功能引导-标题.309634e8-2946-43a7-aea5-1d3fb68c8823.reu", + "新功能引导-左侧组件.76797e8e-1e56-480a-b07c-3acb05b604ca.reu", + "新功能引导-右侧组件.35fbbb73-da84-479d-b387-1da7b05b23e8.reu" }; private static final String RESOURCE_PATH = "/com/fr/report/guide/component"; private static UIHeadMenu fileHeadMenu; @@ -62,9 +62,9 @@ public class UseLayoutAndComponentGuide { .nextScene(createScene3()) .nextScene(createScene4()) .nextScene(createScene5()) - .nextScene(createScene6("box0","25fcd194-d4db-406f-8a08-210f3c262870")) - .nextScene(createScene6("box1","5e17c2eb-5b18-4b6c-854a-5ffff7f6337a")) - .nextScene(createScene6("box2","b4dab4f2-7b1a-4540-a2d4-65c3e080334e")) + .nextScene(createScene6("box0","309634e8-2946-43a7-aea5-1d3fb68c8823")) + .nextScene(createScene6("box1","76797e8e-1e56-480a-b07c-3acb05b604ca")) + .nextScene(createScene6("box2","35fbbb73-da84-479d-b387-1da7b05b23e8")) .nextScene(GuideSceneHelper.createFormDesignerBodyDisplayScene()) .nextScene(GuideSceneHelper.createPreviewClickScene()); From e10d823db90dea0b3ce84b7b1aa6001834c99bf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=E7=A3=8A?= <294531121@qq.com> Date: Fri, 22 Oct 2021 16:41:17 +0800 Subject: [PATCH 21/35] =?UTF-8?q?REPORT-61301=20=E5=B8=83=E5=B1=80?= =?UTF-8?q?=E6=8E=A8=E8=8D=90-mac=E8=AE=BE=E8=AE=A1=E5=99=A8=E5=85=A8?= =?UTF-8?q?=E5=B1=8F=E6=97=B6=EF=BC=8C=E5=9B=BA=E5=AE=9A=E5=B8=83=E5=B1=80?= =?UTF-8?q?/=E9=9D=9E=E5=9B=BA=E5=AE=9A=E5=B8=83=E5=B1=80=E7=9A=84?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E9=A3=98=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/mainframe/FormArea.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java b/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java index e08c1c652d..b3e35873f3 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java @@ -1,6 +1,5 @@ package com.fr.design.mainframe; -import com.fr.common.inputevent.InputEventBaseOnOS; import com.fr.design.actions.UpdateAction; import com.fr.design.constants.UIConstants; import com.fr.design.designer.beans.events.DesignerEvent; @@ -11,23 +10,22 @@ import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.fit.DesignerUIModeConfig; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButtonUI; -import com.fr.design.gui.imenu.UIPopupMenu; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.mainframe.share.ui.base.PopupMenuItem; -import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.design.utils.gui.GUIPaintUtils; -import com.fr.form.fit.NewFormMarkAttr; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.imenu.UIPopupMenu; 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.mainframe.share.ui.base.PopupMenuItem; import com.fr.design.scrollruler.BaseRuler; import com.fr.design.scrollruler.HorizontalRuler; import com.fr.design.scrollruler.RulerLayout; import com.fr.design.scrollruler.ScrollRulerComponent; import com.fr.design.scrollruler.VerticalRuler; import com.fr.design.utils.ComponentUtils; +import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.design.utils.gui.LayoutUtils; +import com.fr.form.fit.NewFormMarkAttr; import com.fr.form.main.mobile.FormMobileAttr; import com.fr.form.ui.container.WBodyLayoutType; import com.fr.form.ui.container.WBorderLayout; @@ -35,7 +33,6 @@ import com.fr.form.ui.container.WFitLayout; import com.fr.general.IOUtils; import com.fr.stable.AssistUtils; - import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; @@ -65,7 +62,6 @@ import java.awt.event.FocusEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; -import java.awt.event.MouseWheelListener; import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; @@ -214,7 +210,7 @@ public class FormArea extends JComponent implements ScrollRulerComponent { button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - GUICoreUtils.showPopupMenu(popupMenu, fixLayoutSwitchButton, 0, -59); + popupMenu.show(fixLayoutSwitchButton, 0, -59); } }); button.setVisible(!isAbsoluteBodyLayout()); From 29fa11b255a33dcb93591614a45b5848458168d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=E7=A3=8A?= <294531121@qq.com> Date: Fri, 22 Oct 2021 22:20:18 +0800 Subject: [PATCH 22/35] =?UTF-8?q?REPORT-61301=20=E5=B8=83=E5=B1=80?= =?UTF-8?q?=E6=8E=A8=E8=8D=90-mac=E8=AE=BE=E8=AE=A1=E5=99=A8=E5=85=A8?= =?UTF-8?q?=E5=B1=8F=E6=97=B6=EF=BC=8C=E5=9B=BA=E5=AE=9A=E5=B8=83=E5=B1=80?= =?UTF-8?q?/=E9=9D=9E=E5=9B=BA=E5=AE=9A=E5=B8=83=E5=B1=80=E7=9A=84?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E9=A3=98=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/mainframe/FormArea.java | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java b/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java index e08c1c652d..be001e8810 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java @@ -1,6 +1,5 @@ package com.fr.design.mainframe; -import com.fr.common.inputevent.InputEventBaseOnOS; import com.fr.design.actions.UpdateAction; import com.fr.design.constants.UIConstants; import com.fr.design.designer.beans.events.DesignerEvent; @@ -11,23 +10,22 @@ import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.fit.DesignerUIModeConfig; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButtonUI; -import com.fr.design.gui.imenu.UIPopupMenu; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.mainframe.share.ui.base.PopupMenuItem; -import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.design.utils.gui.GUIPaintUtils; -import com.fr.form.fit.NewFormMarkAttr; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.imenu.UIPopupMenu; 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.mainframe.share.ui.base.PopupMenuItem; import com.fr.design.scrollruler.BaseRuler; import com.fr.design.scrollruler.HorizontalRuler; import com.fr.design.scrollruler.RulerLayout; import com.fr.design.scrollruler.ScrollRulerComponent; import com.fr.design.scrollruler.VerticalRuler; import com.fr.design.utils.ComponentUtils; +import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.design.utils.gui.LayoutUtils; +import com.fr.form.fit.NewFormMarkAttr; import com.fr.form.main.mobile.FormMobileAttr; import com.fr.form.ui.container.WBodyLayoutType; import com.fr.form.ui.container.WBorderLayout; @@ -35,7 +33,6 @@ import com.fr.form.ui.container.WFitLayout; import com.fr.general.IOUtils; import com.fr.stable.AssistUtils; - import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; @@ -65,7 +62,6 @@ import java.awt.event.FocusEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; -import java.awt.event.MouseWheelListener; import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; @@ -214,7 +210,7 @@ public class FormArea extends JComponent implements ScrollRulerComponent { button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - GUICoreUtils.showPopupMenu(popupMenu, fixLayoutSwitchButton, 0, -59); + popupMenu.show(fixLayoutSwitchButton, 0, -59); } }); button.setVisible(!isAbsoluteBodyLayout()); @@ -1022,4 +1018,4 @@ public class FormArea extends JComponent implements ScrollRulerComponent { -} +} \ No newline at end of file From 5f66ff0fec214c6773c5b5c17c6511630669c5d1 Mon Sep 17 00:00:00 2001 From: kuangshuai Date: Fri, 22 Oct 2021 23:31:47 +0800 Subject: [PATCH 23/35] =?UTF-8?q?REPORT-60896=20=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=BF=98=E5=8E=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/guide/base/Guide.java | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/base/Guide.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/base/Guide.java index fc35b742d4..9469f931a1 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/guide/base/Guide.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/base/Guide.java @@ -135,20 +135,15 @@ public class Guide { public void start() { guideView.hideLoading(); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - if (scene != null) { - guideView.setScene(scene); - guideView.showGuide(); - if (lifecycle != null) { - lifecycle.onStart(); - } - } else { - complete(); - } + if (scene != null) { + guideView.setScene(scene); + guideView.showGuide(); + if (lifecycle != null) { + lifecycle.onStart(); } - }); + } else { + complete(); + } } public void complete() { From 00b387bc29f3f98609881c7a972b8741e15e7795 Mon Sep 17 00:00:00 2001 From: zack Date: Mon, 25 Oct 2021 00:28:22 +0800 Subject: [PATCH 24/35] =?UTF-8?q?REPORT-61437=20=E5=AF=BC=E5=87=BA-?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E4=BA=8B=E4=BB=B6-=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=91=BD=E5=90=8D-=E6=8F=90=E7=A4=BA=E6=96=87?= =?UTF-8?q?=E5=AD=97=E4=BC=9A=E6=B6=88=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/javascript/ExportJavaScriptPane.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java b/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java index 9b323a88e6..e43857e21e 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java @@ -110,6 +110,7 @@ public class ExportJavaScriptPane extends AbstractHyperLinkPane" + Toolkit.i18nText("Fine-Design_Basic_Export_JS_Title_Tip_Front") + "\\/:*?\"<>|" + Toolkit.i18nText("Fine-Design_Basic_Export_JS_Title_Tip_Back") + ""); + fileNameTipLabel = new UILabel("" + Toolkit.i18nText("Fine-Design_Basic_Export_JS_Title_Tip_Front") + "\\/:*?\"<>|" + Toolkit.i18nText("Fine-Design_Basic_Export_JS_Title_Tip_Back") + ""); fileNameTipLabel.setVisible(false); fileNameRadioGroup.addActionListener(new ActionListener() { @Override @@ -221,6 +222,7 @@ public class ExportJavaScriptPane extends AbstractHyperLinkPane Date: Mon, 25 Oct 2021 09:38:09 +0800 Subject: [PATCH 25/35] =?UTF-8?q?REPORT-61299=20=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E7=B1=BB=E9=9D=A2=E6=9D=BF=E9=AB=98=E4=BA=AE=E5=8C=BA=E5=9F=9F?= =?UTF-8?q?=E4=B8=8D=E5=8A=A0=E7=99=BD=E8=BE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guide/scene/AbstractGuideScene.java | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java index 5ead71c621..5f22d620e5 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java @@ -75,13 +75,16 @@ public abstract class AbstractGuideScene extends JPanel implements GuideScene { if (component instanceof JComponent) { JComponent jComponent = (JComponent) component; image = ScreenImage.createImage(jComponent); + highlightList.add(getTargetComponentWithImage(image, rectangle, true)); } else if (component instanceof Window) { image = ScreenImage.createImage(component); + highlightList.add(getTargetComponentWithImage(image, rectangle, false)); } else { image = captureImage(component); + highlightList.add(getTargetComponentWithImage(image, rectangle,true)); } targetList.add(component); - highlightList.add(getTargetComponentWithImage(image, rectangle)); + return true; } catch (AWTException e) { e.printStackTrace(); @@ -99,7 +102,7 @@ public abstract class AbstractGuideScene extends JPanel implements GuideScene { try { targetList.add(null); BufferedImage image = captureImage(rectangle); - highlightList.add(getTargetComponentWithImage(image, rectangle)); + highlightList.add(getTargetComponentWithImage(image, rectangle, true)); return true; } catch (AWTException e) { e.printStackTrace(); @@ -133,7 +136,7 @@ public abstract class AbstractGuideScene extends JPanel implements GuideScene { image = ScreenImage.createImage(component).getSubimage(origin.x, origin.y, origin.width, origin.height); } targetList.add(component); - highlightList.add(getTargetComponentWithImage(image, rectangle)); + highlightList.add(getTargetComponentWithImage(image, rectangle, true)); return true; } catch (AWTException e) { e.printStackTrace(); @@ -170,22 +173,29 @@ public abstract class AbstractGuideScene extends JPanel implements GuideScene { return highlightList; } - private UILabel getTargetComponentWithImage(BufferedImage image, Rectangle rectangle) { + private UILabel getTargetComponentWithImage(BufferedImage image, Rectangle rectangle, boolean showBorder) { ImageIcon ic = new ImageIcon(image); - UILabel label = new UILabel(ic){ - @Override - public Insets getInsets() { - return DEFAULT_HIGHLIGHT_INSETS; - } - }; - label.setBackground(Color.WHITE); - label.setOpaque(true); - label.setBounds(new Rectangle( - rectangle.x - DEFAULT_HIGHLIGHT_INSETS.left, - rectangle.y - DEFAULT_HIGHLIGHT_INSETS.top, - rectangle.width + DEFAULT_HIGHLIGHT_INSETS.left + DEFAULT_HIGHLIGHT_INSETS.right, - rectangle.height + DEFAULT_HIGHLIGHT_INSETS.top + DEFAULT_HIGHLIGHT_INSETS.bottom - )); + UILabel label; + if (showBorder) { + label = new UILabel(ic){ + @Override + public Insets getInsets() { + return DEFAULT_HIGHLIGHT_INSETS; + } + }; + label.setBackground(Color.WHITE); + label.setOpaque(true); + label.setBounds(new Rectangle( + rectangle.x - DEFAULT_HIGHLIGHT_INSETS.left, + rectangle.y - DEFAULT_HIGHLIGHT_INSETS.top, + rectangle.width + DEFAULT_HIGHLIGHT_INSETS.left + DEFAULT_HIGHLIGHT_INSETS.right, + rectangle.height + DEFAULT_HIGHLIGHT_INSETS.top + DEFAULT_HIGHLIGHT_INSETS.bottom + )); + } else { + label = new UILabel(ic); + label.setBounds(rectangle); + } + return label; } From e6557295c6d35e678f53922cc98277b541c69d90 Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Mon, 25 Oct 2021 09:50:50 +0800 Subject: [PATCH 26/35] =?UTF-8?q?REPORT-59682=20=E5=9F=8B=E7=82=B9?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/report/fit/menupane/ReportFitAttrAction.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 c1dd3afd6e..ba37ea18b7 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 @@ -70,11 +70,15 @@ public class ReportFitAttrAction extends JTemplateAction { UIDialog dialog = attrPane.showWindowWithCustomSize(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { @Override public void doOk() { - wbTpl.setReportFitAttr(attrPane.updateBean()); - jwb.fireTargetModified(); + fireEditingOk(jwb, wbTpl, attrPane.updateBean(), fitAttr); } }, DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.fit.templatePane.dialog")); dialog.setVisible(true); } + private void fireEditingOk(final JTemplate jwb, final FitProvider wbTpl, ReportFitAttr newReportFitAttr, ReportFitAttr oldReportFitAttr) { + wbTpl.setReportFitAttr(newReportFitAttr); + jwb.fireTargetModified(); + } + } From 31ca57f271c9537c7d075ce8a2a84ee2adc57835 Mon Sep 17 00:00:00 2001 From: Starryi Date: Mon, 25 Oct 2021 10:47:55 +0800 Subject: [PATCH 27/35] =?UTF-8?q?REPORT-61366=20FR11=E5=86=B3=E7=AD=96?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E7=9A=84=E6=8A=A5=E8=A1=A8=E5=9D=97=E5=AF=B9?= =?UTF-8?q?=E5=BA=94=E7=9A=84=E5=8D=95=E5=85=83=E6=A0=BC=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 公式/数据列单元格适配格式设置 【改动思路】 同上 --- .../fr/design/gui/style/TextFormatPane.java | 8 ++- .../cellquick/CellDSColumnEditor.java | 29 ++++++--- .../cellquick/CellFormulaQuickEditor.java | 65 ++++++++++++++++++- .../cellquick/CellStringQuickEditor.java | 3 +- 4 files changed, 90 insertions(+), 15 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 ae0a947992..8c96c4c862 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 @@ -43,6 +43,7 @@ import java.awt.event.ItemListener; import java.math.RoundingMode; import java.text.Format; import java.text.SimpleDateFormat; +import java.util.Arrays; /** * @author Starryi @@ -151,16 +152,17 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName protected JPanel createContentPane (Component[][] components) { double f = TableLayout.FILL; double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p, p}; + double[] rowSize = new double[components.length]; + Arrays.fill(rowSize, p); double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; + int[][] rowCount = new int[components.length][2]; + Arrays.fill(rowCount, new int[] {1, 1}); return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_LARGE, LayoutConstants.VGAP_MEDIUM); } protected Component[][] getComponent (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[]{centerPane, null}, new Component[]{optionPane, null}, 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 276f3ba743..0ede5114ff 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 @@ -42,6 +42,7 @@ import com.fr.report.cell.cellattr.core.group.DSColumn; import com.fr.report.cell.cellattr.core.group.FilterTypeEnum; import com.fr.report.cell.cellattr.core.group.SelectCount; import com.fr.stable.StringUtils; +import com.fr.third.jodd.util.ArraysUtil; import javax.swing.BorderFactory; import javax.swing.Icon; @@ -60,6 +61,7 @@ import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.ArrayList; +import java.util.Arrays; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.BOTTOM; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.EVEN; @@ -472,6 +474,7 @@ public class CellDSColumnEditor extends CellQuickEditor { if (cellElement != null) { sortPane.update(cellElement); valuePane.update(cellElement); + formatAttrPane.update(cellElement); filterPane.update(cellElement); //更新单元格扩展属性 updateExtendConfig(); @@ -486,6 +489,7 @@ public class CellDSColumnEditor extends CellQuickEditor { disableListener(); sortPane.populate(cellElement); valuePane.populate(cellElement); + formatAttrPane.populate(cellElement); filterPane.populate(cellElement); CellExpandAttr cellExpandAttr = cellElement.getCellExpandAttr(); if (cellExpandAttr == null) { @@ -614,15 +618,19 @@ public class CellDSColumnEditor extends CellQuickEditor { enableListener(); - double[] rowSize = {P, P, P, P, P, P}; - double[] columnSize = {F}; Component[][] components = new Component[][]{ {sortPane}, {filterPane}, {valuePane}, + {formatAttrPane}, {extendableDirectionPane}, {multiNumPane} }; + + double[] rowSize = new double[components.length]; + Arrays.fill(rowSize, P); + double[] columnSize = {F}; + return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP); } @@ -1233,15 +1241,20 @@ public class CellDSColumnEditor extends CellQuickEditor { } public class FormatAttrPane extends AbstractAttrNoScrollPane { - private final TextFormatPane formatPane; + private TextFormatPane formatPane; - public FormatAttrPane() { + @Override + protected JPanel createContentPane() { this.formatPane = new TextFormatPane(); + return this.formatPane; } @Override - protected JPanel createContentPane() { - return formatPane; + public Dimension getPreferredSize() { + if (formatPane == null) { + return super.getPreferredSize(); + } + return formatPane.getPreferredSize(); } protected void initContentPane() { @@ -1253,13 +1266,13 @@ public class CellDSColumnEditor extends CellQuickEditor { } public void populate(CellElement cellElement) { - if (cellElement != null) { + if (cellElement != null && formatPane != null) { formatPane.populateBean(cellElement.getStyle()); } } public void update(CellElement cellElement) { - if (cellElement != null) { + if (cellElement != null && formatPane != null) { cellElement.setStyle(formatPane.update(cellElement.getStyle())); } } 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 5695f1ba2e..30a5f0f558 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 @@ -8,8 +8,11 @@ import com.fr.design.actions.insert.cell.FormulaCellAction; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.formula.FormulaFactory; import com.fr.design.formula.UIFormula; +import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; +import com.fr.design.gui.frpane.AttributeChangeListener; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.gui.style.TextFormatPane; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; @@ -35,6 +38,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import java.util.Arrays; /** * 公式快速编辑面板,同文本数字编辑拆分 @@ -46,6 +50,7 @@ import java.awt.event.KeyEvent; public class CellFormulaQuickEditor extends CellQuickEditor { //文本域 private UITextField formulaTextField; + private TextFormatPane formatPane; //编辑状态 private boolean isEditing = false; @@ -136,10 +141,59 @@ public class CellFormulaQuickEditor extends CellQuickEditor { pane.add(formulaButton, BorderLayout.EAST); content.add(pane, BorderLayout.NORTH); + + Component[][] componentLines = new Component[][] { + new Component[]{EMPTY_LABEL, content}, + new Component[]{createFormatPane(), null}, + }; + 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}}, - new double[]{TableLayout.PREFERRED}, - new double[]{TableLayout.PREFERRED, TableLayout.FILL}, HGAP, VGAP); + new Component[]{EMPTY_LABEL, content}, + new Component[]{createFormatPane(), null}, + }, + rowSize, columnSize, HGAP, VGAP); + } + + private JPanel createFormatPane() { + formatPane = new TextFormatPane(); + AbstractAttrNoScrollPane container = new AbstractAttrNoScrollPane() { + @Override + protected JPanel createContentPane() { + return formatPane; + } + + protected void initContentPane() { + leftContentPane = createContentPane(); + if (leftContentPane != null) { + leftContentPane.setBorder(BorderFactory.createEmptyBorder()); + this.add(leftContentPane, BorderLayout.CENTER); + } + } + }; + + container.addAttributeChangeListener(new AttributeChangeListener() { + @Override + public void attributeChange() { + isEditing = true; + + CellSelection cs1 = (CellSelection) tc.getSelection(); + cellElement = tc.getEditingElementCase().getTemplateCellElement(cs1.getColumn(), cs1.getRow()); + + if (cellElement == null) { + CellSelection cs = (CellSelection) tc.getSelection(); + cellElement = DefaultThemedTemplateCellElementCase.createInstance(cs.getColumn(), cs.getRow()); + tc.getEditingElementCase().addCellElement(cellElement, false); + } + + cellElement.setStyle(formatPane.update(cellElement.getStyle())); + + fireTargetModified(); + isEditing = false; + } + }); + return container; } @Override @@ -202,6 +256,11 @@ public class CellFormulaQuickEditor extends CellQuickEditor { } showText(str); formulaTextField.setEditable(tc.isSelectedOneCell()); + + if (cellElement != null) { + Style style = cellElement.getStyle(); + formatPane.populateBean(style); + } } /** 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 76e0926e00..1b2c9ae4db 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,6 +3,7 @@ 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.frpane.AbstractAttrNoScrollPane; import com.fr.design.gui.frpane.AttributeChangeListener; import com.fr.design.gui.itextarea.UITextArea; @@ -65,7 +66,7 @@ public class CellStringQuickEditor extends CellQuickEditor { */ @Override public JComponent createCenterBody() { - JPanel content = new JPanel(new BorderLayout()); + JPanel content = new JPanel(new BorderLayout(0, IntervalConstants.INTERVAL_L1)); stringTextArea = new UITextArea(); stringTextArea.addKeyListener(new KeyAdapter() { From 205e0eb733076c9d9ab0665a8aaefc60d1cb8dfa Mon Sep 17 00:00:00 2001 From: Starryi Date: Mon, 25 Oct 2021 11:12:11 +0800 Subject: [PATCH 28/35] =?UTF-8?q?REPORT-61338=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E4=B8=BB=E9=A2=98-=E4=B8=BB=E9=A2=98=E9=85=8D?= =?UTF-8?q?=E8=89=B2=E4=BF=AE=E6=94=B9=E4=BF=9D=E5=AD=98=E5=90=8E=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E5=BC=82=E5=B8=B8=E7=A9=BA=E7=99=BD=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 AlphaFine需要一个不带参数的默认构造函数,用于构建面板 【改动思路】 同上 --- .../theme/TemplateThemeGridControlPane.java | 23 +++++++------ .../theme/TemplateThemeGridPagesPane.java | 13 +++++--- .../theme/TemplateThemeGridPane.java | 33 ++++++++++--------- 3 files changed, 40 insertions(+), 29 deletions(-) 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 36f4fc1462..cdbd6d10f2 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 @@ -22,6 +22,7 @@ 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; @@ -67,19 +68,19 @@ public class TemplateThemeGridControlPane extends Basic private final Window window; - public static TemplateThemeGridControlPane createFormThemesManagerPane(Window window) { + public static TemplateThemeGridControlPane createFormThemesManagerPane(@Nullable Window window) { FormThemeConfig config = FormThemeConfig.getInstance(); FormThemeProfilePane editPane = new FormThemeProfilePane(config); return new TemplateThemeGridControlPane<>(window, config, editPane); } - public static TemplateThemeGridControlPane createReportThemesManagerPane(Window window) { + public static TemplateThemeGridControlPane createReportThemesManagerPane(@Nullable Window window) { ReportThemeConfig config = ReportThemeConfig.getInstance(); ReportThemeProfilePane editPane = new ReportThemeProfilePane(config); return new TemplateThemeGridControlPane<>(window, config, editPane); } - public TemplateThemeGridControlPane(Window window, TemplateThemeConfig config, TemplateThemeProfilePane profilePane) { + public TemplateThemeGridControlPane(@Nullable Window window, TemplateThemeConfig config, TemplateThemeProfilePane profilePane) { this.window = window; this.config = config; this.profilePane = profilePane; @@ -124,13 +125,15 @@ public class TemplateThemeGridControlPane extends Basic } private void registerWindowListener() { - window.addWindowListener(new WindowAdapter() { - @Override - public void windowClosed(WindowEvent e) { - super.windowClosed(e); - asyncThemeFetcher.shutdown(); - } - }); + if (window != null) { + window.addWindowListener(new WindowAdapter() { + @Override + public void windowClosed(WindowEvent e) { + super.windowClosed(e); + asyncThemeFetcher.shutdown(); + } + }); + } } private void resetEnableRemoveAction(T selectedTheme, RemoveThemeAction removeAction) { 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 330a2d0536..bfef5179a8 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 @@ -22,6 +22,7 @@ import com.fr.design.mainframe.theme.provider.ThemeManageActionProvider; import com.fr.design.mainframe.theme.ui.BreadcrumbBar; import com.fr.stable.ArrayUtils; import com.fr.stable.unit.FU; +import com.fr.third.javax.annotation.Nullable; import com.fr.workspace.WorkContext; import javax.swing.BorderFactory; @@ -62,11 +63,15 @@ public class TemplateThemeGridPagesPane extends JPanel { private PageChangeListener pageChangeListener; private TemplateThemeGridPagePane currentTemplateThemeGridPagePane; - public TemplateThemeGridPagesPane(Window window) { + public TemplateThemeGridPagesPane() { + initializePane(null); + } + + public TemplateThemeGridPagesPane(@Nullable Window window) { initializePane(window); } - private void initializePane(Window window) { + private void initializePane(@Nullable Window window) { setLayout(new BorderLayout()); setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10)); @@ -234,7 +239,7 @@ public class TemplateThemeGridPagesPane extends JPanel { private final JTemplate template; public final TemplateThemeGridPane themeListPane; - public TemplateThemeUsingPane(Window window) { + public TemplateThemeUsingPane(@Nullable Window window) { super(); setLayout(new BorderLayout()); setBorder(new CompoundBorder( @@ -273,7 +278,7 @@ public class TemplateThemeGridPagesPane extends JPanel { public static class TemplateThemeManagingPane extends TemplateThemeGridPagePane { private final UITabbedPane tabbedPane; - public TemplateThemeManagingPane(Window window) { + public TemplateThemeManagingPane(@Nullable Window window) { setLayout(FRGUIPaneFactory.createBorderLayout()); tabbedPane = new UITabbedPane(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPane.java index 5d5ea7052c..bce8590519 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPane.java @@ -9,6 +9,7 @@ import com.fr.design.event.ChangeListener; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.stable.StringUtils; +import com.fr.third.javax.annotation.Nullable; import javax.swing.BorderFactory; import javax.swing.JPanel; @@ -56,7 +57,7 @@ public class TemplateThemeGridPane extends BasicPane { private final Window window; - public TemplateThemeGridPane(Window window, boolean displayTheme4NewTemplateMarker, TemplateThemeConfig config, TemplateThemeProfilePane profilePane) { + public TemplateThemeGridPane(@Nullable Window window, boolean displayTheme4NewTemplateMarker, TemplateThemeConfig config, TemplateThemeProfilePane profilePane) { this.window = window; this.displayTheme4NewTemplateMarker = displayTheme4NewTemplateMarker; this.config = config; @@ -90,21 +91,23 @@ public class TemplateThemeGridPane extends BasicPane { } private void registerWindowListener() { - window.addWindowListener(new WindowAdapter() { - @Override - public void windowOpened(WindowEvent e) { - super.windowOpened(e); - startListenThemeConfig(); - asyncFetchThemes(); - } + if (window != null) { + window.addWindowListener(new WindowAdapter() { + @Override + public void windowOpened(WindowEvent e) { + super.windowOpened(e); + startListenThemeConfig(); + asyncFetchThemes(); + } - @Override - public void windowClosed(WindowEvent e) { - super.windowClosed(e); - stopListenThemeConfig(); - asyncThemeFetcher.shutdown(); - } - }); + @Override + public void windowClosed(WindowEvent e) { + super.windowClosed(e); + stopListenThemeConfig(); + asyncThemeFetcher.shutdown(); + } + }); + } } public void fillContentListPane() { From 626fd1add99dc6765c091f90a9ea99d6d698cedd Mon Sep 17 00:00:00 2001 From: kuangshuai Date: Mon, 25 Oct 2021 11:31:20 +0800 Subject: [PATCH 29/35] =?UTF-8?q?REPORT-61299=20popupMenu=E7=9A=84?= =?UTF-8?q?=E5=AD=90=E7=BB=84=E4=BB=B6=E9=AB=98=E4=BA=AE=E4=B8=8D=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/guide/scene/AbstractGuideScene.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java index 5f22d620e5..cdb1765ffb 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java @@ -13,6 +13,7 @@ import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JPanel; +import javax.swing.JPopupMenu; import javax.swing.SwingUtilities; import java.awt.AWTException; import java.awt.AlphaComposite; @@ -75,7 +76,7 @@ public abstract class AbstractGuideScene extends JPanel implements GuideScene { if (component instanceof JComponent) { JComponent jComponent = (JComponent) component; image = ScreenImage.createImage(jComponent); - highlightList.add(getTargetComponentWithImage(image, rectangle, true)); + highlightList.add(getTargetComponentWithImage(image, rectangle, !(component.getParent() instanceof JPopupMenu))); } else if (component instanceof Window) { image = ScreenImage.createImage(component); highlightList.add(getTargetComponentWithImage(image, rectangle, false)); From 7ace9cb7ebff3d6f527f5d29fbdbcb63f20744d0 Mon Sep 17 00:00:00 2001 From: kuangshuai Date: Mon, 25 Oct 2021 11:49:18 +0800 Subject: [PATCH 30/35] =?UTF-8?q?REPORT-60896=20mac=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E8=92=99=E5=B1=82=E7=BB=93=E6=9D=9F=E5=90=8E=E6=9C=89=E9=81=97?= =?UTF-8?q?=E7=95=99=E9=80=8F=E6=98=8E=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/guide/base/Guide.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/base/Guide.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/base/Guide.java index 9469f931a1..c8d3e6801d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/guide/base/Guide.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/base/Guide.java @@ -10,6 +10,8 @@ import com.fr.stable.StringUtils; import javax.swing.JFrame; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; +import java.awt.event.HierarchyEvent; +import java.awt.event.HierarchyListener; public class Guide { private String id; @@ -101,7 +103,7 @@ public class Guide { } GuideManager.getInstance().setCurrentGuide(this); guideView.showLoading(); - + guideView.addHierarchyListener(loadingHierarchyListener); new SwingWorker() { @Override protected Boolean doInBackground() { @@ -135,6 +137,9 @@ public class Guide { public void start() { guideView.hideLoading(); + } + + private void startScene() { if (scene != null) { guideView.setScene(scene); guideView.showGuide(); @@ -161,6 +166,7 @@ public class Guide { if (lifecycle != null) { lifecycle.onTerminate(); } + guideView.removeHierarchyListener(loadingHierarchyListener); end(); } @@ -186,4 +192,12 @@ public class Guide { public void removeGuideLifecycle() { this.lifecycle = null; } + + private HierarchyListener loadingHierarchyListener = new HierarchyListener() { + @Override + public void hierarchyChanged(HierarchyEvent e) { + guideView.removeHierarchyListener(loadingHierarchyListener); + startScene(); + } + }; } From 520b9130d12e8035cbbd8d9074f5e0f1fba49487 Mon Sep 17 00:00:00 2001 From: Starryi Date: Mon, 25 Oct 2021 15:09:13 +0800 Subject: [PATCH 31/35] =?UTF-8?q?CHART-21579=20=E6=A8=A1=E7=89=88=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E7=BC=96=E8=BE=91=E9=A1=B5=E9=9D=A2-=E5=9B=BE?= =?UTF-8?q?=E8=A1=A8-=E7=B3=BB=E5=88=97-=E6=B8=90=E5=8F=98=E8=89=B2?= =?UTF-8?q?=E7=9A=84=E8=89=B2=E5=80=BC=E8=81=94=E5=8A=A8=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 1. 图表渐变色选择组合时,渐变色应该被设置为主题色阵列中 第一列第一行和第二列第一行对应的主题色,然后切换到 自定义色时,渐变色需要与之前的主题色保持一致 2. 渐变条的实现也有问题,应该把被选中 SelectColorPointBtn对应的颜色传递给 NewColorSelectPane,这样颜色选择框才能在主题色阵列和 使用过的颜色列表中标记对应的颜色。不过直接修改GradientBar实现 风险有点大,可能会影响其他使用场景,所以只针对固定不可拖拽的渐变条 进行修复. 【改动思路】 同上 --- .../mainframe/theme/edit/chart/ChartSeriesStylePane.java | 5 +++-- .../design/style/background/gradient/FixedGradientBar.java | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartSeriesStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartSeriesStylePane.java index 098dc468d7..f9ca4edf32 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartSeriesStylePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartSeriesStylePane.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.theme.edit.chart; +import com.fr.base.FineColor; import com.fr.base.theme.settings.ThemedChartStyle; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; @@ -7,12 +8,12 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.theme.dialog.TemplateThemeProfileDialog; import com.fr.design.style.background.gradient.FixedGradientBar; -import java.util.List; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.List; /** * @author Bjorn @@ -66,7 +67,7 @@ public class ChartSeriesStylePane extends AbstractChartStylePane { if (chartStyle.getThemedChartSeriesColor().isCombineColor()) { List editingColorScheme = TemplateThemeProfileDialog.getEditingColorScheme(); colorTypeButton.setSelectedIndex(0); - gradientBar.updateColor(editingColorScheme.get(0), editingColorScheme.get(1)); + gradientBar.updateColor(new FineColor(0, 0, editingColorScheme.get(0)), new FineColor(1, 0, editingColorScheme.get(1))); } else { colorTypeButton.setSelectedIndex(1); gradientBar.updateColor(chartStyle.getThemedChartSeriesColor().getBeginColor(), chartStyle.getThemedChartSeriesColor().getEndColor()); diff --git a/designer-base/src/main/java/com/fr/design/style/background/gradient/FixedGradientBar.java b/designer-base/src/main/java/com/fr/design/style/background/gradient/FixedGradientBar.java index 8c502114bf..06a217f230 100644 --- a/designer-base/src/main/java/com/fr/design/style/background/gradient/FixedGradientBar.java +++ b/designer-base/src/main/java/com/fr/design/style/background/gradient/FixedGradientBar.java @@ -14,6 +14,12 @@ public class FixedGradientBar extends GradientBar { super(minvalue, maxvalue); } + @Override + protected void clickButton(int select) { + setColor(getList().get(select).getColorInner()); + super.clickButton(select); + } + @Override protected void addMouseDragListener() { //不添加拖拽事件 From 29814f2081f57569503963b7d67563cb8cf4d40c Mon Sep 17 00:00:00 2001 From: Starryi Date: Mon, 25 Oct 2021 15:23:13 +0800 Subject: [PATCH 32/35] =?UTF-8?q?REPORT-61338=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E4=B8=BB=E9=A2=98-=E4=B8=BB=E9=A2=98=E9=85=8D?= =?UTF-8?q?=E8=89=B2=E4=BF=AE=E6=94=B9=E4=BF=9D=E5=AD=98=E5=90=8E=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E5=BC=82=E5=B8=B8=E7=A9=BA=E7=99=BD=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 确保在EDT展示Toast 【改动思路】 同上 --- .../design/mainframe/theme/TemplateThemeProfilePane.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeProfilePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeProfilePane.java index bc787bb18b..9e88dfba1a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeProfilePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeProfilePane.java @@ -220,7 +220,12 @@ public abstract class TemplateThemeProfilePane extends saveButton.setEnabled(false); saveAsButton.setEnabled(true); actionListener.onSaved(config.cachedFetch(getName())); - DesignerToastMsgUtil.toastPrompt(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Profile_Pane_Save_Successfully")); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + DesignerToastMsgUtil.toastPrompt(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Profile_Pane_Save_Successfully")); + } + }); } }); } From 7ed323a4ef65481c5ad0ce694a36df77b04c949d Mon Sep 17 00:00:00 2001 From: kuangshuai Date: Mon, 25 Oct 2021 15:53:03 +0800 Subject: [PATCH 33/35] =?UTF-8?q?REPORT-61510=20=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E5=9F=8B=E7=82=B9=E7=89=88=E6=9C=AC=E7=94=B1jartime=E6=9B=B4?= =?UTF-8?q?=E6=8D=A2=E6=88=90jar=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/share/collect/ComponentCollector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/share/collect/ComponentCollector.java b/designer-base/src/main/java/com/fr/design/mainframe/share/collect/ComponentCollector.java index 3ea805deb0..c31e07f643 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/share/collect/ComponentCollector.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/share/collect/ComponentCollector.java @@ -525,7 +525,7 @@ public class ComponentCollector implements XMLable { jo.put("userId", MarketConfig.getInstance().getBBSAttr().getBbsUid()); jo.put("uuid", uuid); jo.put("cmpBoardClickDaily", cmpBoardClickDaily()); - jo.put("pluginVersion", GeneralUtils.readBuildNO()); + jo.put("pluginVersion", GeneralUtils.getVersion()); jo.put("localCmpNumber", localCmpNumber); jo.put("remoteCmpNumber", remoteCmpNumber); jo.put("uploadCmpNumber", uploadCmpNumber); From 2c5364119057db9aad70d9c2a39e1c4623742d09 Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Mon, 25 Oct 2021 15:55:50 +0800 Subject: [PATCH 34/35] =?UTF-8?q?REPORT-58538=20=E9=80=82=E9=85=8D?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E6=94=AF=E6=8C=81=E6=9C=8D=E5=8A=A1=E5=99=A8?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/data/datapane/TableDataTreePane.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 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 6a9c2d1edb..b69be8c8d5 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 @@ -53,6 +53,7 @@ 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.StringUtils; import com.fr.stable.core.PropertyChangeAdapter; import com.fr.workspace.WorkContext; import org.jetbrains.annotations.NotNull; @@ -74,6 +75,7 @@ import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; @@ -180,16 +182,20 @@ public class TableDataTreePane extends BasicTableDataTreePane { } private void initServerDatasetAuthTipJPanel() { - String[] lineTips = Toolkit.i18nText("Fine-Design_Server_Dataset_Auth_Tip").split("\n"); + String datasetAuthTip = Toolkit.i18nText("Fine-Design_Server_Dataset_Auth_Tip"); + List lineTips = new ArrayList(Arrays.asList(datasetAuthTip.split("\n"))); + if (datasetAuthTip.endsWith("\n")) { + lineTips.add(StringUtils.EMPTY); + } serverDatasetAuthTipJPanel = new JPanel(); - serverDatasetAuthTipJPanel.setLayout(new GridLayout(lineTips.length, 1)); - for (int i = 0; i < lineTips.length; i++) { - String lineTip = lineTips[i]; + serverDatasetAuthTipJPanel.setLayout(new GridLayout(lineTips.size(), 1)); + for (int i = 0; i < lineTips.size(); i++) { + String lineTip = lineTips.get(i); List jLabels = new ArrayList<>(); JLabel lineJLabel = new JLabel(lineTip); lineJLabel.setForeground(Color.lightGray); jLabels.add(lineJLabel); - if (i == (lineTips.length - 1)) { + if (i == (lineTips.size() - 1)) { JLabel jLabel = new JLabel(Toolkit.i18nText("Fine-Design_Basic_Alphafine_No_Remind")); jLabel.setForeground(Color.blue); jLabel.addMouseListener(new MouseAdapter() { From 895fbc41b44cfe1e649cd88f55fd1dceae268020 Mon Sep 17 00:00:00 2001 From: zack Date: Mon, 25 Oct 2021 16:10:30 +0800 Subject: [PATCH 35/35] =?UTF-8?q?REPORT-61505=20=E5=AF=BC=E5=87=BA-?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E4=BA=8B=E4=BB=B6-=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/javascript/ExportJavaScriptPane.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java b/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java index e43857e21e..3561dc097f 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java @@ -696,7 +696,9 @@ public class ExportJavaScriptPane extends AbstractHyperLinkPane