From 87e10003489d0097a2c1ba1af609a4dc0c80984e Mon Sep 17 00:00:00 2001 From: hades Date: Mon, 27 Dec 2021 12:01:51 +0800 Subject: [PATCH 01/49] =?UTF-8?q?REPORT-64609=20=E7=A3=81=E7=9B=98?= =?UTF-8?q?=E7=A9=BA=E9=97=B4=E6=BB=A1=E6=97=B6=20=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E9=80=A0=E6=88=90=E6=A8=A1=E6=9D=BF=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/common/exception/ThrowableHandler.java | 12 ++++ .../com/fr/design/mainframe/JTemplate.java | 3 +- .../worker/save/SaveFailureHandler.java | 70 +++++++++++++++++++ .../com/fr/design/worker/save/SaveWorker.java | 7 +- 4 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/common/exception/ThrowableHandler.java create mode 100644 designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java diff --git a/designer-base/src/main/java/com/fr/common/exception/ThrowableHandler.java b/designer-base/src/main/java/com/fr/common/exception/ThrowableHandler.java new file mode 100644 index 000000000..225d90e79 --- /dev/null +++ b/designer-base/src/main/java/com/fr/common/exception/ThrowableHandler.java @@ -0,0 +1,12 @@ +package com.fr.common.exception; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/12/27 + */ +public interface ThrowableHandler { + + boolean process(Throwable e); + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index f1f72b48c..3e6ec0819 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -50,6 +50,7 @@ import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.DesignUtils; import com.fr.design.worker.save.CallbackSaveWorker; import com.fr.design.worker.save.EmptyCallBackSaveWorker; +import com.fr.design.worker.save.SaveFailureHandler; import com.fr.design.write.submit.DBManipulationInWidgetEventPane; import com.fr.design.write.submit.DBManipulationPane; import com.fr.event.EventDispatcher; @@ -882,7 +883,7 @@ public abstract class JTemplate> export(); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); - JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), e.getMessage(), "Save Error", JOptionPane.ERROR_MESSAGE); + SaveFailureHandler.getInstance().process(e); return false; } this.editingFILE = editingFILE; diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java new file mode 100644 index 000000000..31c622ab3 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java @@ -0,0 +1,70 @@ +package com.fr.design.worker.save; + +import com.fr.common.exception.ThrowableHandler; +import com.fr.design.dialog.FineJOptionPane; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.DesignerContext; +import com.fr.general.IOUtils; +import com.fr.workspace.exception.DiskSpaceFullException; +import java.awt.Frame; +import javax.swing.JOptionPane; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/12/7 + */ +public class SaveFailureHandler implements ThrowableHandler { + + private static final SaveFailureHandler INSTANCE = new SaveFailureHandler(); + + public static SaveFailureHandler getInstance() { + return INSTANCE; + } + + @Override + public boolean process(Throwable e) { + for (Handler handler : Handler.values()) { + if (handler.process(e)) { + break; + } + } + return true; + } + + public enum Handler implements ThrowableHandler { + + FullDisk { + @Override + public boolean process(Throwable e) { + if (e.getCause() instanceof DiskSpaceFullException + || e instanceof DiskSpaceFullException + || e.getCause().getCause() instanceof DiskSpaceFullException) { + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine_Design_Template_Save_Failed_By_Full_Disk"), + Toolkit.i18nText("Fine-Design_Basic_Alert"), + JOptionPane.WARNING_MESSAGE, + IOUtils.readIcon("/com/fr/design/images/warnings/warning32.png")); + return true; + } + return false; + } + }, + + Other { + @Override + public boolean process(Throwable e) { + boolean minimized = (DesignerContext.getDesignerFrame().getExtendedState() & Frame.ICONIFIED ) != 0; + FineJOptionPane.showMessageDialog( + minimized ? null : DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design-Basic_Save_Failure"), + Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), + JOptionPane.ERROR_MESSAGE); + return true; + } + }; + + + + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java index f47a4f88e..c7a962c25 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java @@ -55,12 +55,7 @@ public class SaveWorker extends SwingWorker { } catch (Exception e) { processResult(); FineLoggerFactory.getLogger().error(e.getMessage(), e); - boolean minimized = (DesignerContext.getDesignerFrame().getExtendedState() & Frame.ICONIFIED ) != 0; - FineJOptionPane.showMessageDialog( - minimized ? null : DesignerContext.getDesignerFrame(), - Toolkit.i18nText("Fine-Design-Basic_Save_Failure"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), - JOptionPane.ERROR_MESSAGE); + SaveFailureHandler.getInstance().process(e); return; } processResult(); From ea134f0535f75fc8360ae118a13d57ba9cb6f16e Mon Sep 17 00:00:00 2001 From: Starryi Date: Tue, 28 Dec 2021 09:58:56 +0800 Subject: [PATCH 02/49] =?UTF-8?q?REPORT-64811=20=E4=BF=9D=E6=8C=81?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E5=95=86=E5=9F=8E=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?reu=E6=96=87=E4=BB=B6=E5=90=8D=E4=B8=AD=E7=9A=84=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 更新在线组件时也要保持下载下来的reu文件与商城中的reu文件名一致 【改动思路】 同上 --- .../design/mainframe/share/ui/block/LocalWidgetUpdater.java | 5 +++-- .../design/mainframe/share/ui/local/LocalWidgetRepoPane.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/LocalWidgetUpdater.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/LocalWidgetUpdater.java index 68a3123f7..b7d9e7f50 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/LocalWidgetUpdater.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/LocalWidgetUpdater.java @@ -13,6 +13,7 @@ import com.fr.form.share.DefaultSharableWidget; import com.fr.form.share.Group; import com.fr.form.share.GroupManege; import com.fr.form.share.SharableWidgetProvider; +import com.fr.form.share.bean.OnlineShareWidget; import com.fr.form.share.group.DefaultShareGroupManager; import com.fr.log.FineLoggerFactory; import com.fr.stable.StableUtils; @@ -54,7 +55,7 @@ public class LocalWidgetUpdater implements Process { return 0 <= processValue && processValue <= 1; } - public void updateWidget(String remoteLatestWidgetId, UpdateListener updateListener) { + public void updateWidget(OnlineShareWidget remoteLatestWidget, UpdateListener updateListener) { if (OnlineWidgetRepoPane.getInstance().isShowPackagePanel()) { ComponentCollector.getInstance().collectDownloadPktNum(); } @@ -77,7 +78,7 @@ public class LocalWidgetUpdater implements Process { } String filePath; try { - filePath = DownloadUtils.download(remoteLatestWidgetId, widget.getName() + "." + widget.getId(), LocalWidgetUpdater.this); + filePath = DownloadUtils.download(remoteLatestWidget.getId(), remoteLatestWidget.getFileLoca(), LocalWidgetUpdater.this); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); return false; diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/local/LocalWidgetRepoPane.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/local/LocalWidgetRepoPane.java index 169b4b5e7..f344d59b0 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/local/LocalWidgetRepoPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/local/LocalWidgetRepoPane.java @@ -438,7 +438,7 @@ public class LocalWidgetRepoPane extends BasicPane { LocalWidgetRepoUpdater updater = LocalWidgetRepoUpdater.getInstance(); for (LocalWidgetBlock block: blockList) { OnlineShareWidget remoteLatestWidget = updater.findLatestRemoteWidget(block.getWidget()); - block.getUpdater().updateWidget(remoteLatestWidget.getId(), new LocalWidgetUpdater.UpdateListener() { + block.getUpdater().updateWidget(remoteLatestWidget, new LocalWidgetUpdater.UpdateListener() { @Override public void onUpdated(boolean success, String group, String id) { updateGuard -= 1; From 564f527587fab9d896bf1e4a8066fe47919d4937 Mon Sep 17 00:00:00 2001 From: Starryi Date: Tue, 28 Dec 2021 10:43:00 +0800 Subject: [PATCH 03/49] =?UTF-8?q?REPORT-64738=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=9C=A8=E7=BA=BF=E7=BB=84=E4=BB=B6=E5=BA=93=E4=B8=AD?= =?UTF-8?q?=E5=8F=AF=E8=A7=81=E7=BB=84=E4=BB=B6=E5=BA=94=E5=8E=BB=E9=87=8D?= =?UTF-8?q?=E4=B8=94=E4=BB=85=E6=98=BE=E7=A4=BA=E5=85=BC=E5=AE=B9=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=9A=84=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 1. 获取组件包中子组件json数据接口添加当前设计器版本参数 2. 下载组件包的接口添加当前设计器版本参数 【改动思路】 同上 --- .../mainframe/share/util/DownloadUtils.java | 43 +++++++++++++------ .../mainframe/share/util/OnlineShopUtils.java | 5 ++- 2 files changed, 33 insertions(+), 15 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 020c03bff..a814dfa0a 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 @@ -37,6 +37,9 @@ import java.nio.charset.StandardCharsets; import java.security.KeyFactory; import java.security.interfaces.RSAPublicKey; import java.security.spec.X509EncodedKeySpec; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; /** * created by Harrison on 2020/05/27 @@ -68,9 +71,9 @@ public class DownloadUtils { @NotNull public static String download(String id, String fileName, com.fr.design.extra.Process process) throws Exception { - CloseableHttpResponse fileRes = getHttpResponse(getReusesUrl(), id); + CloseableHttpResponse fileRes = postDownloadHttpResponse(getReusesUrl(), id); if (fileRes.getStatusLine().getStatusCode() == HttpStatus.SC_MOVED_TEMPORARILY) { - fileRes = getHttpResponse(fileRes.getHeaders("Location")[0].getValue()); + fileRes = getDownloadHttpResponse(fileRes.getHeaders("Location")[0].getValue()); } if (fileRes.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { String realPath = StableUtils.pathJoin(ProductConstants.getEnvHome(), ShareComponentConstants.PLUGIN_CACHE, ShareComponentConstants.DOWNLOAD_SHARE); @@ -106,9 +109,11 @@ public class DownloadUtils { public static String downloadPackage(String id, String fileName, CancelCheck cancelCheck) throws Exception { - CloseableHttpResponse fileRes = getHttpResponse(getPackageReusesUrl(), id); + Map params = new HashMap<>(); + params.put("designerVersion", ProductConstants.RELEASE_VERSION); + CloseableHttpResponse fileRes = postDownloadHttpResponse(getPackageReusesUrl(), id, params); if (fileRes.getStatusLine().getStatusCode() == HttpStatus.SC_MOVED_TEMPORARILY) { - fileRes = getHttpResponse(fileRes.getHeaders("Location")[0].getValue()); + fileRes = getDownloadHttpResponse(fileRes.getHeaders("Location")[0].getValue()); } String realPath = StableUtils.pathJoin(ProductConstants.getEnvHome(), ShareComponentConstants.PLUGIN_CACHE, ShareComponentConstants.DOWNLOAD_PACKAGE_SHARE); String filePath; @@ -145,9 +150,9 @@ public class DownloadUtils { public static FormTheme downloadThemeFile(String themePath) { try { - CloseableHttpResponse fileRes = getHttpResponse(themePath); + CloseableHttpResponse fileRes = getDownloadHttpResponse(themePath); if (fileRes.getStatusLine().getStatusCode() == HttpStatus.SC_MOVED_TEMPORARILY) { - fileRes = getHttpResponse(fileRes.getHeaders("Location")[0].getValue()); + fileRes = getDownloadHttpResponse(fileRes.getHeaders("Location")[0].getValue()); } if (fileRes.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { HttpEntity entity = fileRes.getEntity(); @@ -177,21 +182,33 @@ public class DownloadUtils { return null; } - private static CloseableHttpResponse getHttpResponse(String url, String id) throws Exception { + private static CloseableHttpResponse postDownloadHttpResponse(String url, String id) throws Exception { + return postDownloadHttpResponse(url, id, new HashMap<>()); + } + + private static CloseableHttpResponse postDownloadHttpResponse(String url, String id, Map params) throws Exception { //先登录一下。不然可能失败 CloseableHttpClient client = createClient(); FineLoggerFactory.getLogger().info("login fr-market"); FineLoggerFactory.getLogger().info("start download widget {}", id); - HttpUriRequest file = RequestBuilder.post() + RequestBuilder builder = RequestBuilder.post() .setHeader("User-Agent", "Mozilla/5.0") - .setUri(url).addParameter("id", encrypt(id)).addParameter("userId", - String.valueOf(DesignerEnvManager.getEnvManager().getDesignerLoginUid())) - .build(); - return client.execute(file); + .setUri(url) + .addParameter("id", encrypt(id)) + .addParameter("userId", String.valueOf(DesignerEnvManager.getEnvManager().getDesignerLoginUid())); + + if (params != null) { + Set keys = params.keySet(); + for (String key: keys) { + builder.addParameter(key, params.get(key)); + } + } + + return client.execute(builder.build()); } - private static CloseableHttpResponse getHttpResponse(String url) throws Exception { + private static CloseableHttpResponse getDownloadHttpResponse(String url) throws Exception { //先登录一下。不然可能失败 CloseableHttpClient client = createClient(); HttpUriRequest file = RequestBuilder.get() diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/util/OnlineShopUtils.java b/designer-form/src/main/java/com/fr/design/mainframe/share/util/OnlineShopUtils.java index c42f06946..7341d7cbb 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/util/OnlineShopUtils.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/util/OnlineShopUtils.java @@ -14,6 +14,7 @@ import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; +import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; @@ -251,7 +252,7 @@ public class OnlineShopUtils { } public static OnlineShareWidget[] getPackageWidgets(OnlineShareWidget widgetPackage) { - String plistUrl = getPackageChildrenPath() + widgetPackage.getId(); + String plistUrl = getPackageChildrenPath() + widgetPackage.getId() + "?designerVersion="+ ProductConstants.RELEASE_VERSION; OnlineShareWidget[] widgets = getOnlineShareWidgets(plistUrl); for (OnlineShareWidget widget : widgets) { widget.setParentPackage(widgetPackage); @@ -287,7 +288,7 @@ public class OnlineShopUtils { onlineShareWidgets.add(widget); } } - return onlineShareWidgets.toArray(new OnlineShareWidget[onlineShareWidgets.size()]); + return onlineShareWidgets.toArray(new OnlineShareWidget[0]); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } From ed43a05a674c99165e460fee8b52178ffcd660b6 Mon Sep 17 00:00:00 2001 From: Starryi Date: Tue, 28 Dec 2021 11:54:03 +0800 Subject: [PATCH 04/49] =?UTF-8?q?REPORT-65049=20=E3=80=90=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E8=BE=B9=E6=A1=86=E3=80=91=E6=82=AC=E6=B5=AE=E5=85=83?= =?UTF-8?q?=E7=B4=A0=E7=9A=84=E8=B7=9F=E9=9A=8F=E4=B8=BB=E9=A2=98=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=A0=BC=E6=A0=B7=E5=BC=8F=E6=98=BE=E7=A4=BA=EF=BC=8C?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E4=B8=A4=E7=A7=8D=E6=A0=B7=E5=BC=8F=E9=87=8D?= =?UTF-8?q?=E5=8F=A0=E7=9A=84=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 1. 单独使用CellStylePreviewPane单元格样式预览面板时,需要CellStylePreviewPane在样式切换 时清理画布并重绘 2. 在CellRectangleStylePreviewPane使用CellStylePreviewPane时,也需要清理画布并重绘, 但此时的清理是CellRectangleStylePreviewPane完成。CellStylePreviewPane不清理画布,否则会 导致表示透明的马赛克图片不显示. 【改动思路】 CellStylePreviewPane增加一个是否自动清理画布的控制变量 --- .../com/fr/design/cell/CellRectangleStylePreviewPane.java | 2 +- .../java/com/fr/design/cell/CellStylePreviewPane.java | 8 +++++++- .../main/java/com/fr/design/report/ReportStylePane.java | 3 ++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/cell/CellRectangleStylePreviewPane.java b/designer-base/src/main/java/com/fr/design/cell/CellRectangleStylePreviewPane.java index 015fecee9..d278d130f 100644 --- a/designer-base/src/main/java/com/fr/design/cell/CellRectangleStylePreviewPane.java +++ b/designer-base/src/main/java/com/fr/design/cell/CellRectangleStylePreviewPane.java @@ -46,7 +46,7 @@ public class CellRectangleStylePreviewPane extends JPanel { for (int r = 0; r < ROW_COUNT; r++) { for (int c = 0; c < COLUMN_COUNT; c++) { - CellStylePreviewPane pane = new CellStylePreviewPane(); + CellStylePreviewPane pane = new CellStylePreviewPane(false); TemplateCellElement cellElement = DefaultThemedTemplateCellElementCase.createInstance(c, r); int flags = CellBorderSourceFlag.INVALID_BORDER_SOURCE; if (supportInnerBorder) { diff --git a/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java b/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java index b7e43c38c..66a873d4d 100644 --- a/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java +++ b/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java @@ -33,7 +33,10 @@ public class CellStylePreviewPane extends JPanel { private String paintText = "Report"; private Style style = Style.DEFAULT_STYLE; - public CellStylePreviewPane() { + private final boolean autoClearCanvas; + + public CellStylePreviewPane(boolean autoClearCanvas) { + this.autoClearCanvas = autoClearCanvas; setPreferredSize(new Dimension(0, 0)); } @@ -55,6 +58,9 @@ public class CellStylePreviewPane extends JPanel { @Override public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) g; + if (autoClearCanvas) { + g2d.clearRect(0, 0, getWidth(), getHeight()); + } g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); diff --git a/designer-realize/src/main/java/com/fr/design/report/ReportStylePane.java b/designer-realize/src/main/java/com/fr/design/report/ReportStylePane.java index 250861dbe..a5295ad7e 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ReportStylePane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ReportStylePane.java @@ -53,6 +53,7 @@ import java.awt.CardLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; +import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; @@ -78,7 +79,7 @@ public class ReportStylePane extends BasicPane { setLayout(FRGUIPaneFactory.createBorderLayout()); setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10)); - previewArea = new CellStylePreviewPane(); + previewArea = new CellStylePreviewPane(true); followingThemeButtonGroup = new UIButtonGroup<>(FOLLOWING_THEME_STRING_ARRAYS); followingThemeButtonGroup.setAutoFireStateChanged(false); customStylePane = new CustomFloatStyleSettingPane(); From a77c1731701cf19768e61571ea2c07b344673c53 Mon Sep 17 00:00:00 2001 From: Starryi Date: Tue, 28 Dec 2021 14:16:57 +0800 Subject: [PATCH 05/49] =?UTF-8?q?REPORT-65059=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E7=BB=99=E5=A4=9A=E4=B8=AA=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=A0=BC=E8=AE=BE=E7=BD=AE=E8=BE=B9=E6=A1=86=EF=BC=8C=E9=A2=84?= =?UTF-8?q?=E8=A7=88=E6=97=B6=E5=8F=AA=E6=9C=89=E4=B8=80=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 问题原因设置单元格边框时,如果某个位置没有单元格会自动创建一个有默认主题单元格样式的单元格, 那么之后网页查看时,默认样式单元格会生效,导致设置的有边框样式被覆盖 【改动思路】 报表工具栏上对单元格做的操作,都会将单元格样式变为自定义样式,因此需要在样式设置结束后,将样式 变为自定义样式 --- .../com/fr/design/actions/cell/BorderAction.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/BorderAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/BorderAction.java index 844e4f70b..8752d54de 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/BorderAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/BorderAction.java @@ -110,13 +110,17 @@ public class BorderAction extends ElementCaseAction implements ChangeListener { public boolean update(ElementCasePane elementCasePane) { - resetSelectedElementsStyleToCustom(elementCasePane); - + boolean success; if (oldCellBorderStyle.isNoneBorderStyle()) { //无边框格式 - return BorderUtils.updateCellBorderStyle(elementCasePane, oldCellBorderStyle); + success = BorderUtils.updateCellBorderStyle(elementCasePane, oldCellBorderStyle); + } else { + success = BorderUtils.update(elementCasePane, oldCellBorderStyle); + } + if (success) { + resetSelectedElementsStyleToCustom(elementCasePane); } - return BorderUtils.update(elementCasePane, oldCellBorderStyle); + return success; } @Override From 20160eae69d617c4f0717903ef6b86eb6d910df3 Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 28 Dec 2021 14:42:06 +0800 Subject: [PATCH 06/49] =?UTF-8?q?REPORT-65050=20=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E9=94=81=E5=AE=9A=E4=BC=98=E5=8C=96-fvs?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E8=A2=AB=E8=B6=85=E7=AE=A1=E5=9C=A8=E6=9F=90?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E4=B8=8A=E5=BC=BA=E5=88=B6=E8=A7=A3=E9=94=81?= =?UTF-8?q?=E5=90=8E=EF=BC=8C=E7=BC=96=E8=BE=91=E8=80=85=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E6=97=B6=E4=B8=8D=E4=BC=9A=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E5=8F=A6=E5=AD=98=E4=B8=BA=E5=BC=B9=E7=AA=97=EF=BC=8C=E8=80=8C?= =?UTF-8?q?=E6=98=AF=E4=BF=9D=E5=AD=98=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/mainframe/JTemplate.java | 7 ++++++- .../design/worker/save/SaveFailureHandler.java | 17 +++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index 26a2f64bc..499898bbf 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -967,6 +967,7 @@ public abstract class JTemplate> return false; } try { + checkBeforeSave(); export(); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); @@ -985,7 +986,7 @@ public abstract class JTemplate> return isNewCreateTpl; } - protected boolean export() throws Exception { + protected void checkBeforeSave() throws Exception { // 保存前校验下未解锁 if (WorkContext.getCurrent().get(LockInfoOperator.class).isTplUnLocked(getEditingFILE().getPath())) { throw new UnLockedException(); @@ -994,6 +995,9 @@ public abstract class JTemplate> if (getEditingFILE().exists() && !WorkContext.getCurrent().get(LockInfoOperator.class).isConsistentLock(getEditingFILE().getPath())) { throw new InconsistentLockException(); } + } + + protected boolean export() throws Exception { return this.getTarget().export(TemplateResourceManager.getResource().saveTemplate(getEditingFILE())); } @@ -1634,6 +1638,7 @@ public abstract class JTemplate> if (editingFILE == null || editingFILE instanceof MemFILE) { return false; } + checkBeforeSave(); export(); this.editingFILE = editingFILE; return true; diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java index 4cf2af431..5d7beb36a 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java @@ -6,6 +6,7 @@ import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; +import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.TemplateUtils; import com.fr.file.FileNodeFILE; import com.fr.file.filetree.FileNode; @@ -31,11 +32,19 @@ public class SaveFailureHandler implements ThrowableHandler { @Override public boolean process(Throwable e) { - for (Handler handler : Handler.values()) { - if (handler.process(e)) { - break; + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + for (Handler handler : Handler.values()) { + try { + if (handler.process(e)) { + break; + } + } catch (Exception ignored) { + } + } } - } + }); return true; } From 4a1df52f26c14ebc25a6d355024978b73f4950de Mon Sep 17 00:00:00 2001 From: Starryi Date: Tue, 28 Dec 2021 15:14:55 +0800 Subject: [PATCH 07/49] =?UTF-8?q?REPORT-64738=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=9C=A8=E7=BA=BF=E7=BB=84=E4=BB=B6=E5=BA=93=E4=B8=AD?= =?UTF-8?q?=E5=8F=AF=E8=A7=81=E7=BB=84=E4=BB=B6=E5=BA=94=E5=8E=BB=E9=87=8D?= =?UTF-8?q?=E4=B8=94=E4=BB=85=E6=98=BE=E7=A4=BA=E5=85=BC=E5=AE=B9=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=9A=84=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 1. 获取组件包中子组件json数据接口添加当前设计器版本参数 2. 下载组件包的接口添加当前设计器版本参数 【改动思路】 同上 --- .../mainframe/share/util/DownloadUtils.java | 39 +++++++++++++------ 1 file changed, 28 insertions(+), 11 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 18cb93838..b6375b1d6 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 @@ -30,6 +30,9 @@ import java.nio.charset.StandardCharsets; import java.security.KeyFactory; import java.security.interfaces.RSAPublicKey; import java.security.spec.X509EncodedKeySpec; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; /** * created by Harrison on 2020/05/27 @@ -55,9 +58,9 @@ public class DownloadUtils { @NotNull public static String download(String id, String fileName, com.fr.design.extra.Process process) throws Exception { - CloseableHttpResponse fileRes = getHttpResponse(REUSES_URL, id); + CloseableHttpResponse fileRes = postDownloadHttpResponse(REUSES_URL, id); if (fileRes.getStatusLine().getStatusCode() == HttpStatus.SC_MOVED_TEMPORARILY) { - fileRes = getHttpResponse(fileRes.getHeaders("Location")[0].getValue()); + fileRes = getDownloadHttpResponse(fileRes.getHeaders("Location")[0].getValue()); } if (fileRes.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { String realPath = StableUtils.pathJoin(ProductConstants.getEnvHome(), ShareComponentConstants.PLUGIN_CACHE, ShareComponentConstants.DOWNLOAD_SHARE); @@ -93,9 +96,11 @@ public class DownloadUtils { public static String downloadPackage(String id, String fileName, CancelCheck cancelCheck) throws Exception { - CloseableHttpResponse fileRes = getHttpResponse(PACKAGE_REUSES_URL, id); + Map params = new HashMap<>(); + params.put("designerVersion", ProductConstants.RELEASE_VERSION); + CloseableHttpResponse fileRes = postDownloadHttpResponse(PACKAGE_REUSES_URL, id, params); if (fileRes.getStatusLine().getStatusCode() == HttpStatus.SC_MOVED_TEMPORARILY) { - fileRes = getHttpResponse(fileRes.getHeaders("Location")[0].getValue()); + fileRes = getDownloadHttpResponse(fileRes.getHeaders("Location")[0].getValue()); } String realPath = StableUtils.pathJoin(ProductConstants.getEnvHome(), ShareComponentConstants.PLUGIN_CACHE, ShareComponentConstants.DOWNLOAD_PACKAGE_SHARE); String filePath; @@ -130,21 +135,33 @@ public class DownloadUtils { } } - private static CloseableHttpResponse getHttpResponse(String url, String id) throws Exception { + private static CloseableHttpResponse postDownloadHttpResponse(String url, String id) throws Exception { + return postDownloadHttpResponse(url, id, new HashMap<>()); + } + + private static CloseableHttpResponse postDownloadHttpResponse(String url, String id, Map params) throws Exception { //先登录一下。不然可能失败 CloseableHttpClient client = createClient(); FineLoggerFactory.getLogger().info("login fr-market"); FineLoggerFactory.getLogger().info("start download widget {}", id); - HttpUriRequest file = RequestBuilder.post() + RequestBuilder builder = RequestBuilder.post() .setHeader("User-Agent", "Mozilla/5.0") - .setUri(url).addParameter("id", encrypt(id)).addParameter("userId", - String.valueOf(DesignerEnvManager.getEnvManager().getDesignerLoginUid())) - .build(); - return client.execute(file); + .setUri(url) + .addParameter("id", encrypt(id)) + .addParameter("userId", String.valueOf(DesignerEnvManager.getEnvManager().getDesignerLoginUid())); + + if (params != null) { + Set keys = params.keySet(); + for (String key: keys) { + builder.addParameter(key, params.get(key)); + } + } + + return client.execute(builder.build()); } - private static CloseableHttpResponse getHttpResponse(String url) throws Exception { + private static CloseableHttpResponse getDownloadHttpResponse(String url) throws Exception { //先登录一下。不然可能失败 CloseableHttpClient client = createClient(); HttpUriRequest file = RequestBuilder.get() From 3712ef8a1ab87d36749a2475f1b41d827d9a95e3 Mon Sep 17 00:00:00 2001 From: Starryi Date: Tue, 28 Dec 2021 15:21:50 +0800 Subject: [PATCH 08/49] =?UTF-8?q?REPORT-65060=20=E3=80=90=E8=A7=86?= =?UTF-8?q?=E8=A7=89=E9=AA=8C=E6=94=B6=E3=80=91=E6=A8=A1=E6=9D=BF=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 替换下表示透明的马赛克图片,之前给的图片里格子太大了 【改动思路】 同上 --- .../cell/CellRectangleStylePreviewPane.java | 2 +- .../fr/design/cell/CellStylePreviewPane.java | 53 ++++++++++++++++-- .../design/images/transparent_background.png | Bin 37392 -> 26250 bytes .../com/fr/design/report/ReportStylePane.java | 2 +- 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/cell/CellRectangleStylePreviewPane.java b/designer-base/src/main/java/com/fr/design/cell/CellRectangleStylePreviewPane.java index d278d130f..09373189e 100644 --- a/designer-base/src/main/java/com/fr/design/cell/CellRectangleStylePreviewPane.java +++ b/designer-base/src/main/java/com/fr/design/cell/CellRectangleStylePreviewPane.java @@ -46,7 +46,7 @@ public class CellRectangleStylePreviewPane extends JPanel { for (int r = 0; r < ROW_COUNT; r++) { for (int c = 0; c < COLUMN_COUNT; c++) { - CellStylePreviewPane pane = new CellStylePreviewPane(false); + CellStylePreviewPane pane = new CellStylePreviewPane(false, false); TemplateCellElement cellElement = DefaultThemedTemplateCellElementCase.createInstance(c, r); int flags = CellBorderSourceFlag.INVALID_BORDER_SOURCE; if (supportInnerBorder) { diff --git a/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java b/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java index 66a873d4d..dc888b1c1 100644 --- a/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java +++ b/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java @@ -30,13 +30,20 @@ import java.util.List; public class CellStylePreviewPane extends JPanel { public static final int MINIMUM_HEIGHT = 40; + private static final BufferedImage transparentBackgroundImage = IOUtils.readImage("/com/fr/design/images/transparent_background.png"); + private final float transparentBackgroundWidth; + private final float transparentBackgroundHeight; private String paintText = "Report"; private Style style = Style.DEFAULT_STYLE; private final boolean autoClearCanvas; + private final boolean paintingMosaic; - public CellStylePreviewPane(boolean autoClearCanvas) { + public CellStylePreviewPane(boolean autoClearCanvas, boolean paintingMosaic) { this.autoClearCanvas = autoClearCanvas; + this.paintingMosaic = paintingMosaic; + transparentBackgroundWidth = transparentBackgroundImage.getWidth(null); + transparentBackgroundHeight = transparentBackgroundImage.getHeight(null); setPreferredSize(new Dimension(0, 0)); } @@ -64,12 +71,52 @@ public class CellStylePreviewPane extends JPanel { g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + if (paintingMosaic) { + paintTransparentBackground(g2d, style); + } + paintCellStyle(g2d, style); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); } + private void paintTransparentBackground(Graphics2D g2d, Style style) { + float alpha = computeTransparentBackgroundAlpha(style); + + float scaleWidth = 1.0F * getWidth() / transparentBackgroundWidth; + float scaleHeight = 1.0F * getHeight() / transparentBackgroundHeight; + float maxScale = Math.max(scaleWidth, scaleHeight); + + if (maxScale <= 1) { + scaleWidth = scaleHeight = 1; + } else { + scaleHeight = scaleWidth = maxScale; + } + + Composite oldComposite = g2d.getComposite(); + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); + g2d.drawImage(transparentBackgroundImage, 0, 0, (int) (transparentBackgroundWidth * scaleWidth), (int) (transparentBackgroundHeight * scaleHeight), null); + g2d.setComposite(oldComposite); + } + + private float computeTextColorBrightness(Style style) { + Color fontColor = style.getFRFont().getForeground(); + return fontColor.getRed() * 0.299F + fontColor.getGreen() * 0.587F + fontColor.getBlue() * 0.114F; + } + + private float computeTransparentBackgroundAlpha(Style style) { + float textBrightness = computeTextColorBrightness(style); + + float alpha = 1.0F; + if (textBrightness < 50) { + alpha = 0.2F; + } else if (textBrightness < 160){ + alpha = 0.5F; + } + return alpha; + } + private void paintCellStyle(Graphics2D g2d, Style style) { int resolution = ScreenResolution.getScreenResolution(); @@ -86,9 +133,7 @@ public class CellStylePreviewPane extends JPanel { Style.paintContent(g2d, paintText, style, width, height, resolution); - Style.paintBorder(g2d, style, - width - GraphHelper.getLineStyleSize(style.getBorderRight()) / 2F, - height - GraphHelper.getLineStyleSize(style.getBorderBottom()) / 2F); + Style.paintBorder(g2d, style, width, height); } @Override diff --git a/designer-base/src/main/resources/com/fr/design/images/transparent_background.png b/designer-base/src/main/resources/com/fr/design/images/transparent_background.png index 61557d0a808f9bdcd63713b5ba0db246c026e9fa..3db1fd14f20910bafaa80d16cdd8d86c8f106c55 100644 GIT binary patch literal 26250 zcmbrmX*64Z`1Y$+v^BL=rN*{eIvA@6QR$?rH565fpi*KUio_69RaFhCYR#l*&GSrR zCNU=FA!b1kL1Lcb@%x|W&2!E=>%2H`_TI1d+G~IJy6^kCzSn1mzShy;JTGvbiHV6* z^TjiLCZ^L5Pp;L@vYs3p5^}ztoX$WWYd>aUDn_y&zGq=#dc>sp?C~3~Q-jIAu|k#k z)U7fp&<6=}uJuGI9Xiy}v9}p&-OjyteQB2MLZ0@8K?8aHkE{Rkv+sU%XC688?jd+3 z1$VpwI^LMkyK}rhTrX1VyR+Kc57iZ|Js?e_PQc4ULd0a3S=wy z#$4*9Jg44q5Tve16Ga-$ua= zfpk7KtbAu_W(+)l@yr|g*TOi-ce1t|11xLa4wI>OEHmBU5;AkOX@t|=+a)@EAJ{m5 zIJL7p$el5<_HG{X8QWDZInCIrwS&6fXD7<>c{)eK^G@XmLq1_mh?r8j)`BYp;6mP; z`}O7~LMHZ;y;#K2KBbU%d-3G`_-~SsAUr0$cz9K#f0fUHv$KWCXfSeXZf9z3X!T&t zVzkC@W zMtWY{Rr-1=Hy8s^{T8Js>cm8dNQctMSS^rK^nw38G>^EB=Rm)uO2RiA1G2ay4xCx%AQz zzo{Y6wacMaG`)K`FYF^o{Q2s`dd5D?ey7EC>X+w5A$N(5NZPzYckzvvE&MyxwwjCN z=W)!@vIUy@E~3AE{HOm2AmG!k_o-f}n^Eawt@U~;iA3z{Ph8`2vY|6sLP?q2-)Dr5 zFAVRk)Igfoc0?s3|9Pql1dn-`VwtB7u+ICbjQBYx8Y8{+dRi3hwKRUKW_Fzj@hrfu zlgjJeFOI*};u&0RQK~Vd>IeP4zoK)TS3Fx)K$BA}pEI`g%haUbDM*zESvmGA;ZQBP zuulX0i|o(KO;=?2d?!5-yByGcGPyf0_4od8>&qf`n_YC3g7jgmSa~UTuo&NzO4=Nc z_I%mqBQ&=n6shX0P;6eaefg*NUgN^ntOW$H@ywH^CV-Y>U9F;NiOrueOXf-T=vfn3 zdw~m`@;5=entHf4r%t#=UgtB0wYCsEHxAtM0)ZZHxtEcXmZZ|Af7 zmggaGkW~9ec;oq0{O7`9z))+59iKaJYm+~&R2@jqUVwH34|9onu~q75DNvyuTp0wa zhACE3g@*=~R?KH86D-s=o*_{wLv%leQdTPWG*J>fd4w(lKJcD%NS;I%x7SLPmGa$y zG|5(ag3sXg_jFdrTJ$&YZWaDHFxL`R)pkDPw}J6cjCxD*#djjyZeHwF;`d#E#Z2?| zr)D~1DPp%cHirCPID)7Fr?Zeu(=$$bstug`7oYhFCThw}Sy{Ii8Idp(;3=Im&7jHq zw{Blyk==irXL#@=3Xl}Ut<_44A<3*qL`^GY@yXPAh|aV(jjhz}UdsqMXrwOx2?Upw zIv@`BDK6q5{wpm?8KK;desH#>vW5 z3g?Pr=DiHjm8#N0GBv4Rg)9;FyaUry&AHlxPb;EGbSJ5s4n`KwVo-tBa10z%zR4nf-KFnxS9oFq%fH0+Re}-LfqRV2dD#6rzU!R&q~$> zsV)asx@RWxjgS2Npz?V#Kbnn|y@b;7dkJ#sdkx74Y|q`BREimnEIfFqg!lNPH{si( zSKbp|fvyr8pK7jxN$WQ?hI%=t9us05>0%>As-|XY4de}T-{cy(|3>o>NMN^vGsn2cK#JfISz-( zI~m-W@2v3H-;m$H$0TF2v0X~6NQlK_#oWqhW(nHmU+AMp)CW$#D(rFWTvFNdf$Ya6 zYQ<(esQMpU(T=0YXa^U1g7RQLgxULQ~(5c9O`sNU>_MJ(4fh8y-SmW$r0+>q7h3vB+*l^fjbFMR9l91p8P}S z*8Q_$$AJYo6WP@^k>%dQKg)k-W|Ymme@O5hj6rt)?uhmNBj-q#c#dje52bx$1xD7b|ig-{&C_gS#dBaeBEF!2D<>FFkCqmgg?AGZ4mz&9h`V`fab*-^HF45}4Z z45Hxt>P4hB>;smZf;0wFFOj<>0R9Jg#9#>upv;V^t=h>;N*91K;T&`0ycRbR z+MB`ll~~P0KMoDBQ`*D3I&((a4G{+ZmPgcd0qwt4wgcB}wI|gOxy3q(t}VgVw1Q9v zWxyjF4na|OLD6Jsz=VI13@BZ#2+F_qC@*O3N@T?YUp{G}t3)YtVZIbmv$TjKi$1&4 znfa-NtMqkl8F++4O4ZUgTOyt30ak*z8$isLb2 zEqLW~b0262U%{E5+}C?uI)Pd=QAH{y+OnC!bZJHymnC{Tu62 zpK#ST)^QANYF@V=ST5*&%X!wgqua$kGP$6`SAH04MjPf8O339X2OF3!$f~@aE`y)% z<{E$0o_yJE%$r?>*aru~{`9h`RoY5Km(CXn4Z<8f?_A34QLjmmMKJ}26`qEw6eGBQgKejj}^D!HnGEm zhm?0i;C48GtVl;DQ4h&EJaUB8%>pQF?^6AxN#Qq%#=h7w?qNto<)RVjPIA8!)QIaROZQ-$ZbAM7Iw5qyl>q zi{CMnMiJbRZdt@ZjF@i2pt31h5uvd5S|DjH{j_Yy$wcXVBoK07+a+@DDg)VH(5|a! zPQjthNtHh}SUuH3z@`NzV1I1oq(E1s?7m+>*hHU<0tkF&+N1V5BopnBvyHsP9d_sa(lQY|HC_3J(>dTsw6WnP-YY06{2lJj*40mk=z@qxnYW5KL%ZWEH0Or z@auw5ViXd2hJK^n`Sd(m>4nEsSyx+P5MbO%mSX-F!PsN8%cu!sEmcFoh`O`MT&w`o zFL!nyKN<9z`KY$d6_3PxvLqR|&a;*Zam-rw3o~a1NBC>G;v(WqsgCYf)aK&?3#T-n z9k|qwes$^P@*Pw<(Ulb1gzPSB#_WrltGUYEE|_H4+7vM?D{aC(;C*%7gZvDa%%SP<-v%KI|GpL-rYq$QogrFfYaeq;NV4Jz z%Oupsh}|1kUlxc3=h^-t20}>IgJ-l_2M_4=CTceU9vG?@$Aw^LtT{v+WdWj_DP47;Sm`j%S+HFh&E6k|p*gu(s?}dU}8;9-K zQ1xD-dzvX8#Nt%_BQXxT0a;NI0e&zR&n!e4UjTo}ncz`G#&|}_HDp{_89ba5f4xzF zJv|S-oM?uSc;GOO8E5kt*KAl1!5~Ls$x;zPx{e( zgX0cN$XVNL-}o7gzu{c{MsholnZewQGBeqH+M#Ez1LriNnTv zy+cfkfHn*Cw^Y~iZx>dz-L2QZvk>wquATGnBJHFfg=#mQxAL1mCG9EiHf#~Wr1bhP zMM>N|ZcIklSrd`OfC<}%--zV~s{v_y(^`?;Wz&D{4y{h(=StFNH_fj7iMh}K9{eyL zdhdyWsZYwTG9wKP-RVNkwUg!qd0q3bUgWIv_^X}!aVkN%Q&q422&0uE)YRg}VRq`f zE@{9``26rsZb?P_gE+wcO*ds7ts$j`oQXSEh57OM)?~^hRopnt;K!TOFp#&1}}}8v)qMW-FLGsEeO5j)fOVNOz}9ZI7IJ zpm;jjY4g=3&x3v^j8N3=y&%Hcw0`;OClTq9Pqy{x?;k!ru@mNUl+2uxB3fU5?`22C z3bBi*VU5`p#_yLukOk`sz2pEUmW&@C_RmjnjyYsWxklV8P@zhDq+A#r@YhJ#^64AC zYn23#t_T8uD_?@uE|)Y9-??{*CtG;t5dAb~`xrcYHJXl2GVEtHzV7-!_McjN70bu9 zuu|26XTw8iBIVRDAGy_V;c5SCOaUoc<0oCMIEAh~n=7$9Y~4Cpzky5vA59)ySC}#7 z%k`BcCWl-rj(Dsb&`WyN;uSGp|2$7;V>#65U%zw8ueo-kccTYG_uifKx|KwnsZ;2T z*K}94_}7+~m(!7FfBy+~ag8+&ywUt#>F!<0g4P`LuuILQUv4N|s-p6+|L*VkJhib6 zul3+=#>9Du*tFha{~hvVUc*X>FgM!NAp1gd+2ts)wYOTh+L^_)IL&}MWPFl-qNBL$PA0u~A^Y~l`PvgYw zkm5t#1n;CfmJ+TgyR>umRi&5_M+J8nF($f0qtZIE`e-R{(@{q~ee|Un_~=YHPor6x zjWDU$9wqVYx>iz!fS~<|&LQb|W9ry1k5f@IPU0~6A7UY_(_^-}(q;DPgXU}Egj&Nl zt}9Y!Et<}#PM59caSCb1V@F@$rf&B&xj#y|iaR*nh?~5`F#mNW1x`N{u@JIm(6pkU zQ#tBtGS89&H)~n;Ie5(-t$XuKqRz8m3^ow*7N9aBS)CQ6B1*NCTC3W^((EbBGv0ni5EKy z6}fO5WOwQt$mSCbt7})JP6X6qG%@uY0?{Xf`weqVK&>^5#`VgTL+ZQP51uqi&biJG zVSFnb&!5qV^qPF{84e=+8eNaC3w(+MmdguSFk%vS?;{;18$-0M7F68~fhRTBwk8yb z2wKwu4mZqN)|(CDHwtWxHnW-bLZ=$<&lS@;D4-i(`?!G+ul;1Tcnk`04{aX{C{Gk1V4gyT zSC{U~_*Ya52RtP_;CHVW#1FM%c8qt`SP#bi$=)lhDtVb<7rf1(=*-`$P1k*4!; z&OX)Dm~_)^_fxCZNtfG!Aefejnv=zKV`;0DGnAKC=wDQA#_4sO%n3z0w?ucLau-Gw zB0nv6v)$)YM!>AXGfFpG9{;??eq)34$Fh(U;@<;QLtBz(h~$s&Vn58<7TG}lhC+3; zJ9*=Ur@3bCMt;#(bN;D7>x-P7KG@Io>%X69$Ez`Q@1&hS&L&=DtGF%n1Pz%6+ zPn<0|qXKJ!3Tt=`C>6Z($PvdwAu)BINT%QKaY@eu`&aWP&R%A-n7I5sz&=(z9CVEs zAqAkf3jIywLx{yl#!HOQKf?&yAP0J!YSdvDLt%(p@#-+YRdE&|;*@kA+?&m4-j|j( zhu(8us-B+CgFFv!p=|U-1n)l|xtJzPjciDk4<4}En4A}W(lGJ{O-|Ag&gAHH00 zbaex%t*G#!l0>S6+$XbMqYIMV#JQx;%d}nA$itjVtx78Wp1u|ZHk&Z~aGml8kX2ac zB((77_GHMTs<}7s{p-r4_*i^$wf~%Nt}p$m?f<|M!vOcTBxuG;*}e{g{Ol2^UUem| z#kjER$aGXk22VA%gfN>NDsZHa@a8|?bO&@fYFG9PFoH$cB5QR|XP=T3 zGpuH%=>QS-+cc}vK-g5@PcW<(GU%MHoS!A&o^0mv-RnWlpPVBhbhD~NnF%3iY1ccK z`e<}i-Ez=*hM!Mi4WE^5v8!?)C&bBS1WM$-x#a(+aNyq8jq)9za!Z#7xA3C*SFn!# zV$zvYJ(GPBZkuFGHz_TU)RERVpS=HEP+BdgR&{t4TC9&^D2r&n z%v+yWQ`hxzrDRP`G=Uv~ieFND4e9P?Tph^^Y{4WMcun*c==?g4wfRPLX5ynU_9O&% zHElD8BNUx2d@eLX{LWyR^G|eW?DhH}{Ux_QX2@4Flv6vo`EQqv=KycUvjc1xYHnX) zMt-ZGp_rQe+$5kg(i8XEop*R=(!uj8?OiG_5HV-hzus_nxcDl@tjLIHz5z5#xr{Og zzQ;^|`ID);G1t`1m6xFWv1r)(W5DO=#JZ_i)RwdhU1?v0HUV0rBz$b{n%umg>}h!( z;_B7p9wyZXv_Bk3yi>PDq03`!wtoci5IvNPfI2G z8bNB8EqI7n_-{%V8W(VUFjZNxo7-8;_J!;&iBXjqV2P`Ym>jXF*amq{^TZ{N@EoMc zALuK^_ozAqA&dWlj=a8h@MYRHa#=8VFA{I_M?yb2?hZD|1ELfD*R<@+CAQ7mzO$X*#VL&NOlqlTT{MI4KM7MR-hS!fvyK4*@yaCx}p}> z96>$XEWQYD8;1H;50_Jq@rFEo6_++)K<+p0UCl%_y!*gk!IN@|N8`#S)S_2+TixjF zZ^&cmVhKrhz=OBcX_9ieJzJ#TWk<{_YL*yCVJ+(^r0x%1F|Qkw>-)DM)lHS8;EkJFdqOL`- z-EW>2d=QJ6fQFgxCz}Kjj`Z?9JNE-}ny_*nCCvdEa4|^+_CZ=UHVa75-9D3G*NJup zpXf_`j|9c)&~Saa^tBe+$=Q^_SajcxfvrS+ua3wEZmj-yvv%HY;DX{*h4$`ct6QM> zG08jT&UR$qYz~Do%7WsK$oBfRkHo!w2Q}GJywi{__Aag|hNIrdc5){EJsRq13Y%B1jS5%RYefhoQ8A^lRl1X<|qQ*USww zMYr0WcI`ynj}AaNImKm5&UG(h?#sQqIry?{8+nkQH~&0^qYxxPd@ z;P-bWP%VxGJWE$#qM*?3lRK0DyjVVl ztLW!?cz^1~Pk)Hlh-%rZ0wKYDACB;#)~tWnj<9WzKU7~RYYu2{1rZBKdFu4XV(<$e zHb+<}A2wuE{>rq24RoBeM!V=T$j>48#1P%`My=|>+PAH9d&+cC&>}k@#$@+zV$7yC zMTJ_F=`N^RT~MdTW;5(O9LM6(k4L;!+o`qP8L+bcbI*B$P-QPvAh!{cBoM4?-^ijE z=Kc1$oL^zU?8X~<8S8J0Dl7xJG9I4+uDd{SzlxaYqPI9+xaTDmTUKgeDgSkaeK;d| zNzh$#?T+K_YnY z8*8t$l(uC{sT-^;OWgTBXGmSdfe7&Sz?^e?jfp%eHkKx4y^-EtT|=8Ukm1K|rKBxu zMeN_EwzuEo&J@RFAWz+wyEOI@nl1#KvMG)G**}^j5$mLhnS_Q(UF|G>(GV7FGCfv) ze_$5SE6vLm@uvA!EZbLkJJ*5Lm(zSnp1ziOIyPoGG@LCTUI7#qV0-5}hmt*~H}v!` z`z_Dno22>y3X2Q#+q&7rrZr#x*5J7ndUn;79(+BQSIj-Tbu8^oKQXh^RL-a{xYPaU ztJg9Lj=n@W_qt0*mtySU&~T=+eNeT4AaVBh4%ps~`gY`OgTlGAgg$m^4j405%2f5q z;7eeIeaRM0nrY`sd39xELdMk9w`Qf~%N&CP7DY226GHMT5hQF*tu5I+Y2A<;9sv&# z8?UYVxW%AS9H~2U!vzG*yqzIu4#(p(Hr^h~#U7ns>E01b=2uH$er<#CE;}zB zGa64)0-J%sf>>+Iv4iWsl^}XeVL^WKxw_5(`{x9gkLT7U zku0;BB9wqfvtjy%JKKC>K&ycVkBxsv{!2mieP|Bel1`<#?TDFIR zWvT>88rM9yu4dya63yKurMBL4Gb7CNBbThnYSoKu*9a6jm=P)XqikZ!xD1%uZQKmQ zUGj{4_2Z%g{e#R7XLsI>KW-^h?=BW+d+4;ZW~q{ybXoCRYLyNr{cOeTc*VtPiy-cU zy(g1n^C6YmMGxAtaSp=`HJ`a#d~Bh&5%+|fh69=VqBOzudA)?W2gZkFj^_!urGXJy zDC}yYqqbUsX+#7(ff?~!B>|rh?TcMB1Nt;hC{~8EU^1;aeuzDnwSz9n1IBT^J+sdR z6DCS>i&a*?BBeFxSA^6Yy`dx0Ykir)F6#@AAqoByKal>}U^l5d=i8Tm?k#6eYdYzP2Rz#%SV$}ZX;;p$hQ9jK!*o)-fghF>` z(zQlo@59*oLu)}!2C-7jfn~Ru8x&s4v>7hQ4dDGuCKOs6%SQk7Km0cpJ5@L5aV6!> zQ2k~{siGp?e&*`3;8>CZVoO|cd`aBk?x^byi7@TOiF-6+;a1_|#GtpUH6yuot2`pt`57}o+-tl3 zN0=%~T*91akv0TvoNkNul16#&w7EL?)5CWZ1ncINWr>ZMd)~@xE1jYNW%bVs=C#n{ z9}VQYN!@hG-sZmf0;(8HVf~meokNU5sZ<&Ohki@WX=Dl~ z0wB)N$rHz!Zm_-fpK|A+^5^NbxnrNaQi1}hyZ2QW@?xYxqoz$*(-ZUH@Rq$=ms=j3 zX0&jk<;NR?v20=vux|8QVDr*Aj5=vNIhqnCId=<@fU?z?oKMjzLfGAN_!QIWK896O zTC_QS3+&XLdV{(KoJ<*ul4z*Jl&Vzaz~;coW8t|0me{vF7y@k1yUR%uEAX0pV#PW< z>Y`2`WO>p)!@}>m*-y&hdUVK=fYsK+^p>~{>qbgQ1V3DjKaJQJa?JCg^OVCn9NbbJ3 z2y&;ep-9n4ZTU2x8W8VjB(&9%3ZoS_XNy}_jT#Bbu=29W1YEkN#`37}o2b_Q<2 zzCvQl^N1M^qw=S95d@(e;`{X3b#&yrFnR4r7f6Jzzh_mB@Zm@vtT>z4_%AH)zz}Ur*E zvQzGsps}m^<%+uw8=IQRUvYh_wtRO=#K9KMGQ8}dmOJ4r)TcBUsj}Mu&92iU_`Jpi z%DqXPocj6?d*Nu`(65{wtP+_quGBP1fj2S#dyOm z+N52cbM*sxnTZQn^y}H;x;5J7;i5bo1WdQd&ictzLK zel^S6TurJHCe8(uui!eex5%Ki1L>@?l6c`%ig3)r0YedTpV{lXd! z{@1Z;26-wIHZtmp=Osp1f(2XMR_mfFZTcBI4wE{6)!3_gNENVXnVaX-%rkCOTsD~6 zBjsy}BpRoW<^pQoP#4E$WZPrEzaN-vfN8bH3p7d)KV<`SqXLVuONq1e@gsJPWFRHG zBaJvC8t@l}qe31Bw9YFl?wSAWBAEgnv@65D%EO-khp!}}!N~p} z^&czc+ce^sRGi=mX7i1g` zycB}7#Czq5gatn57z9-=xm6i3SK^`oUS~(EsaXiv(pF>~k;=bAaC$O*-0w+B!w*Yr z%SLXM&Q2#FxO)mn>C$CrATm>$W0T)#@QXXaJnUp@uP;`osXaoBXNA&87X`qj0F?W? z?j9~tOu*-~_JemB{JaA1{adX?kuyAYe2m0qd`Q^L2V#>t2(EnN`L)yuTjmce;{(G8 zsCGO5FG7&~Vaxtr2aD(}a>Q5}Wo`pYgAiM@qj0>j+u4Kz*q365BqBr*5i>Wf;uy(~ zHRd0o+~ZPJ#kW?KG#Kj%4I__f$bjj7ee+tMdBSNoanwJ*oeB8UxKB?`LbOx5nP-_) z0i2&0#gF+ynocR!4RY2T29JySduiVl=y8t0?!^0{hfY#n3pRCjds`GGf5^3)=9i0< z3!Q&`2)ZmdPyfbCZr1q2h0mUIK?V%xV{Sfzi8l?Aayloy@46d~tr zyMq|J-ELFVgFn2#m<_A&{uP1A5l(EXmz;|1Ug)*(FOHbW6Wta?I6li0^ceNPJ=e6b z?ULqUnD!ehrOl|w?Jo4D3cs+b{U^Mi2JQwj><@B{962(Dx5YrDyZ$BFzl%M;9Wfy- zDB=c+fr|evI0G*ig+i756CCPt93#%cS=?xWqIm04(EPth7LfAb9&{mx@p#s$gki|}l8uap1W|)MhYlFI; z(3T1R%}UCnmY_{z4{pcl@CO%y%IL}wm2&T!m6m;y_Q+G;uNJ3}Y(tHkD!&rKFNOf2 zAb@&wYr&$*ry&uu?e$T2PM5YVWeXE~t@bVfiVzYRW}!L4)iy!$M+cVjil zF?43JuG&3Sc=%)(V1_=z?ISrgP@(ts3lMBvJ9owa#uIbQvaU&QrCn^~|ILRsToLm7 zDN~+qF(_Rf8ss4$#`l_()#@g{mZqS5DNHxgoxFQdl^1uCZ)sjXZqsgc;}So9A5`P) z3}pQ@#_2pyuaiej|Fywcqt>P9(myE1l2yPm;30P%PS;mk9PdZc2!{|~g2bKA9LzlJ za%i333v4~!eLmxuh=6ditCZcLv@kUVH)IP-bhIiTH^kp`mjvVktlZUl@jgm`SK9KO zl}&}kNps{LysEo&d6?+0aIpfF@#y9l+PfBpU3Iw3zPc8}PWsGMn3QrXe?x{iey-~M zXj#Wkf3-J2ub)o|lo~LENswf@UjxGJ-nE!jq~^_BRx0b<%K_kLKGvm9u=&paFkaEy zZ54C6QOXC*Hp4?h?>nPdn|HsbyAW#$K4ch`lYK55=GLxMsoQ)ou9GOh=C&_*5Acu0 zm62}FSpaZw|1`8p#?ME;cj*_X>MDue*AtvS8KSJtw&?PZf2C>$Ynde_;Sz*{qI1{f zDPv+6lDhtC_O#tFqr(cx_A<`gh9%x94@Q=FrtKfB&jhRsR|ra%lBmyl#o=msH`(G; zT}IZs#$09^x=PHtOhB4Ip&+=^@VyJ~4IFmdq4!G!Z9+}X!~6&?4Z(5SVP{GI`6 zKV#EQLxAaBQeWcpJop}2G5u+$y7jL0HCLsV`+n^U_peC&)%>!gI`wDf4c3i|hdlpg zX_nVcw2Dw1K5fRY_5ynqmSL{sIx1I|9_#nv z;k~VIvJ4rQq-R5y?Q8$Jh&;r)TrrynWd9cEJe&9KsCVPN9QSwhDR(u#3;mU!zFeao zzI8A4y1m_u3b=cJ-#e};^P4JaTgb6oY5maV7cqHHaZmO~lATuM_vQ~c^42ypm40|7 z`{Va)@0zMoGp%nZ%dnpaZ{c!^?%-df60Rv|<$BP4YW|h&-0zgKbiS$qXXrZzak6HI zl)!kO^RqaFghygU0cp7p^D@FEjx#qby7b`VPk%k{=(Q49^M>h%nOxLJ{G*pmEWfU+yz=4n zLi;QqlZ&41W7j3d#&?NEPMg`1?it@}2{?S^1SI-eWWmOTxlMH>&*<3OrL6kf7er7G zM%9)*UtbcCE3i+Rp+^b$g@kL$Bjw(K6$&X;m$U>w26Bx{ix|(Zs{tl1ACjsIH{SV% zG`TSNiTme0)oa8T68CXq<;mEpR0b`^-3W7R>w5NG@8$VfvqD~-hvvR{_`&seX?6i1 zm+~;&KLa$+RFOq_Zo(I2F3jt#Tf9VAfQYv296=}yvykOiqP9mTB9m{53mh4s8x$Tn zyav9|hy0P@?*@_`0#>|-Y1ae)2TX`>3JZwv0AQ@X)+hTiTBGbUV?S)=iwSrdqD8*L zw%d~ByiOM+l?bNLLv=8B7TQtFDEnPzO34>yBygZ@09SCW@gx`=6woW%oVGHMcwGBo5 zyPzr17*{kj5=t}`yPCP(`Sl(m{S8&?QvZh|aR}?oP8!XSsv;D91V6~IPZmaO z&^AhF3EKINJ$0|p1IFbLjEC5b;(d#&mD(-xdfiBJ#0ioh8IyPGKO%uEMbZ$sd=IbX z#gTwY76(sy0-Wz7DETKU-ynK`3lWPt9GnJ8P7ZJhRlh4g@SB?$z`NR-ZE#Ut z1g4#pd%`0imJ97;9Uf)2dr~FWq`RExT-uS(mQEa7L-bpcTqSbEm|0Ce0x7Xuma2(p zUyy@3{11-crUE_Tpuo5b)HVr=zt>Cp>{i^jKf}5NKR)WrKSadA5+y$ieT!{c>P8S_fVI z_6#Hzek@JB4=*w!ODg(tx>84wyo|v96WWJD23ETS<$03UPxd9wt+ZvnSbox(`NH_q$AN2ksJy0i!2^35|CO)x=og`##5Mg5JDkXa4#Ni2+5dV}g1`4o3-SFwm{PqMG z$-FnNkHJ+TDkk zx`Eib1>s_>#5vl%GBMo~=SZ^~?d%LE)*`A4!dg0Nn}*dB3$stcfypqi|8mVYSU5OS zxT-3C^fv!$ykA=0!UP%~@J0O5i%SP6xqQGd9&~-zuIz+kj2oLft3qSXk5sqCJ-jv4 zT8yc52M((*JP1Cy)#1A^v;PB4pk=BhAr3965!Kqk5kY>RqjYb!tdtdNyW-p9&c zu&<34o+-+PvDU{wN(%Omq%l4f1(dl|>7B}G?oDzDy8bam0x6OVd6VSUiTacVus2p71w9)aZ(u`#&PfRA8@sA@YU_mYfPm8^cHDb{LMpXU!u zI#r?tiEkWj(9LJHH@_F?${j~TZt>iOI}7o=-qkm$oLWDXNxe?wjVAR~c{P$+c8B;X z?=ZCd&I`3UHtQZJm75f`$mV%x#;GOQgenUfMH;T2iGUG*&=1uBwCAAp5 zUfpIc?=RCM<_OCG%KpZ%NgsCZw|vw_FrEzQmRN&y3ToRO7T&yU$6oWK|8s`BsT8lX z_($-DZ)obfE*C2|(nwxwJ6UMhf(rF(p=VvBe(@pi;Z}iY@MWr&^44s+tu9cbDOnMe z^|*Ec!wC_5VtU_ZL9K0N_pHr!a;M?jaZ1%vA8WC``6nUaid|&JyjH83z))D2tj!|P zZCB6Yf!~U8R+RQDhm~a=zTI4t>|Q~#!jNDOn*wjJM95HSMp@z$iG6@_z^J=rL5gP$ z+!G4X>(_wPEH^)OwI`cztX#)F7cIBDN-00C_Y;%XDRc{;UQUgNI8By+aI!A%F$d+5 zy$gx-;%fap>1=PSO-;-Xei?}s8(aXi5JNZQ!FhRB)!C$3SUS$_g51E7hgQr?NiSHolXIqbKL*xxJd&GrC*Zs@!LvzwXK*ekL-hKG zBjvs3#l=!9`rS=B(`m9_iKmeEr=m^;V(~<-jEF|VU&41!=}DdBD!00(y!yqHFXPAK z>m*GH%)OwPy}62+a@84xy}~z=028m!(T6gT{{RIc9R-VHj16#CoH!Z)naM-ui=JsS(RmL*M5QslK~=9)kZbCgX-OYodyMy0;zo1$NZ>_=!j z-V-J8dIp>^-tGffz{RU-OSzRs>voJK}Gg#+z1n|$)ntd8r_$O4<{5VB0Lxz zo*ZI;&7Oy1u7~dlxPVgao|EmU6eOjN%~d4VNd)~0hz+E@RvV1;aje2t$lAt$dkgx{ z)a81U31R2j&PN9pA7fS?&lXnIduj_UfEt{LzcI|;u(hz7Q}-2pollGb4zC?t6ny>v z14~G8@x~)g;{b2|izc!eksXuA)(0_9?Of}S=NoRvmdT@0vC6)p5l4a~YkkBon6`fj zZ9jg#BxZoibe#FyF}o?>{{|Bfuly!o^>IzTsndd$KFLc!p*}i8c1mEdHE)01LzX&4 zkTztBa<1V#tu$reaAje|kZSL5W!;ZoDM9IX`q87vsf!KwpjA!sY8| zsRC*}ZVt|Dt8jE?k+g`&Dsj~RnrZ2%Y%)NtYa>sZ_~Q3>%kv%F<`B2H~iQ`wqf*!)~bMwKNFL< z!hin)XyksDO>3G*Z0oR(wzHpAj5IWJmhEi3#-%tR=V~&th&uxx|5iPSSA@Sr8wQ zq~AU`F~^E&CHAK?X6^m^D(ypbM+~VARAMXJr8huVmlZz2 zSHS;j@65lU{{O$9gvwSa>!7Tat;y0b45d;Dc`N&tDZ*gJGPa>4RKxJ5EYmPWcnhP6 zu^VKWghBSP8;osiV_&a%U*}xc57$rE58v+(-*Y~H!0Wuud7bk-&&P7V-Cp<~QbRhQ z<(;f&DhE7LP&3lINrK}ZWQ+c3h861KO~^V2MnCKe-glm)wBt@+rhTj!@#u$nH;*p# zQ*iQlNU<5f%H$R}^sL_6iI@25pdS-D%*u^a&4-je_7f0NYiN_G+>%~^cd>i0gNRz2 zS3h-)#g605tXz)GE<)QprLY427WCsAcc7U#x2gB0TBj9jQ_7ojze#RDgp&hH6bXb2 zjdi@$+G=e#nwO0G?z9BL^^eX=YdzrqUID?MyR`2O;}9}#E^G(gZtW6w>+v{+>*aG6 zx8h@nIrpKXZKjRdbd1CyoZ_}#b33|K=2=FM~N1!>dMA@qmzP zIs^&+^2Fs=Y6=ILrM(MXS-Yh|cj6|gku^E#Uy{!(W!+~;f606Ke<=l6-2Dt)Q?fZn zKlW_bxM8|h;qNfd8D-Y(gH6`;VBeEM6d;`IG9=D|5^&kx81j7p)a^Vuo76ZB0@{on z%SYxugWo%f1A86I7dQTtae5?AVO#`KMYc%l%B|W`MlBgs!#_h>bM9+t7@g|f=t@1e zgbGH`%Nr}s-~%%SJGCtH@wf(}>aw$$Jyx%lNj&uec0y-pHbriJGj}LRTgH5i2R~My z?J>fkXaAj}E8M6dBs$i!z2%8dISnL%{&+r1WLs5RSog4>WF^an6H9D8z{R~u+cJ6C zLq<-h%Id0#-{Ky;_E5e4rCW?s<|fR*uQo-BVTCfy!8hE&15wtWy!-Q2!Km~fGQhuS zXQ{Q|uO3HZ0qMXiwXHUqUau}3H{!IIPl~m>xJ3rF(jWMH)#TSm!NU-a_Rk?2{7nlw zkYKqh%R&oR#^lH$uU|S?E*^l7W(RwhYoz}YA_ovF*>Y%Fu%xrJG_~!2pjWKW2=R4RyX)FP_I~U~#PQn$~ftC`h{RQv2yP)uGkz zRhl1910Ncn)n4;%@*kGKsLn5ZpWj)^lDHt5QkHrwrunX`eGSqx12i_j^c@zH9bS#txq#}~rSGwURQ4}}8p=WUsv$-xJwki-S@)m8)n6%u|?ncLEs*uYD-6k7NS z2qB=pyg!q%tC(8v!0cP-r6RbzS-Hi=qxWm@fr01=GuvZj9fK?SJE(_mza z<$7u7q5SP;Qit%=2OTqyHL!(^y}f32ptEgvJo|uB`J2JF&i`z5&nJF~W;W^{>K`49 zQE1LdZ-UpJv$$M!w>C{sZ(T(jrz* zB)BzaRLkDpOh&D`jQnb4-}_^9w4LTrP|mMnpI#ZfNG8=_cl3Bz^!u=XK?TE-0i$}B z!L*@J2CI?=jgap{Ic5;gczTEgykM_dS=nfyCFB243K{<|rNFXxG%gzP>s~_7Nd#q3 zGRIVyZ>Oy!V(2@p3gkCn$QN1Q8FaEK7`}d=*?9s2nM@!(v#B)V*i2N| z7iZz-O9;s%indH@ov9i+YiU;zEIL>Vi>iTttO~6N^A;y zXbgTIxx7%cY0?VIc>)M4dclL?%Jwh<3}nJjGBHsxAqvc8r0lPAvjeB_0e}hfv2xe0 zJS+$wXR~`8<8y@oD*v$ju&N9x`v`yvu(*7f=O9en%6WdHbo`fyUxK&eN}TnNXBp0| zyfnR`qkEtH^VQq zrDHoPXL5eHnS1!XG1FhUEvBG8C=$*X+);S3cU|TXn$+jE2}tnC=xK^oQ{9b<^P=xu17&djFn_=+A+eLFcO>hd z`~jtXDfH32Uk5(CRIPt4?4E0{%gya2Gz-Ic?;0gnc2qyDZVb!1=@Dx=7ucKXM%1T; z^RC3OLwb`3MSaUOJr)}p=%-G?r$u?Y-^7){E}BW#6<4&~*nf|NU7N-W_fxgvo3;RH z$mV|c6l_odft?44e;j@#CpTX0OsVugDD5xzfhA})YJ*S7O=x?^uPSLY(k$H!D!&}Q zdkQBMS8Yc!e7Sky;F*(u)Fbx2b1wAfk5`7!UICX3i+tobyH04X>cQx&S+FoV8Z*4} zum)ONRi)8sfH*}xoaH(t37WALhByA6ah2xvarSoVr9#Rtruo`{`v)N7&hjK#YNh$P zqaB%2Trna2pvmK4{5UWu9IJ{(Y6*W64}k3XD@OJ^a)54mlj+WTU~0hhV#I z)wjI5FcmMPu{v+i@WIB7QNk$Q?7s;0*ZAiRv_v@5b=3ki~1-(cV)hJ^= zuQ8DxFsSq?ji}y@_TE+GuOpHQJYv*h(>!9Pe^ZY0Fha%9j#XhWFtbyZr6MzTBRZzt zuxjcz@krqhs;)ot7{DJc$%E$x;o9giUhkrdEyYkbT6q(ga-Tj7iH{Ka% z;8}W*$wKkSr-uJ{q@@1lVV7}4$R&NFLpo2`#A_>FynlBh*_}Pv-()9W75mxjUfm*% zDPH`_o0it`n?V*~X4n?+`8RnTidn@qXu2LISY)ld6Z@C@Q$?q2DDx_@$3Ajgs~#=D zZXL+Am6*W~>;9j_IkyJ}#A`qMws#KlxF%cYG42HSdKb5TAF7T0sO@srYe5DJquKQL zaD|?yAk6;Oyz2E0nFqw#WTf)Da1~7_A~$(q%?V)>v=a3&C}vtOihqnPX`|KK^?%qu zZ%(^SjScL}MiyLw9(*lq(xk1vHlojx(EE>>AS0m_+xal?j&K_nv#z^rHyO!t{F|Li zI@o6HsA@mbyrduGcZ7 z-4g5rlraPow(!;Y#G3k{@~(dmMwEwY3!e%iKH^1HSw`Ce6lvL$pa1qKpIWPfEAV4z z4yX2C7kdlF_O`?tYaWU+e^$)6tqQ8hznQpOcxn0JtG^1#s>#pxQ$lLSz3P5jp)9t; zI*Q5@a1M|Q{l{rL{Tv;>^8BNq3=i8qf27jPJP9657&~Kj!1A_o(c^eOIOi^j_U2D@ z)~>)(Hg-;YStA>(6poyh;3!wP`Pd@livtNA7%F^B1pfY7r=>|LWRz=sG*fG<&%Apb z-0CW$bI(L&_;3Bu|U{7qHA6=AeCEWPjmGDF+Yez!47 zi;G}7t$#i)&L>HG=c`c!98rSy5dJ$t1D_WmJEm4C&AwmY6?sOfzI`DNH@qzdg*DiI#Hg zTD^MJ>Hf6&ftzX_19$z{{JqI^C8ABRum4pq#{mTcQMIWoF;!sdvZd9%I>Z! z>P(n?!}9K%(XCNhecvSe^KMGjTjGYaWVSq4p6WaO3a#2-DLs|Ut-TS%6t}ioiLe%A z@_j)>debJ0p(5S4rI9b6dBDoyjQ%vMeiS$+?RGfkqSlN zCQS@P6BG3zZAZ4rkSJ_Bu_$?CP80IC;2PE;xWXf34{mR0Yx*XLGv?B(`E z3{m7&27=C!duwH%ootkL{p(MB?fTx@(1uzO>ml(l+bV-Z{M(AR{dA2wxLTm49oPDjE{$FUWlZW81c zv%y-wCv1?g1p58%r4BJ(m4B%|dh1GRv2Er4GaojON%E(yru?&WjY1r4a!PY5DMs*! zh)c&73~DahGWl}-hDf2%V7E}!9|({ai3pi|5JG>-9_q+dixb4h+ zn&%1%^)|{lHnv8c{}-7E4DePb97c%Q-DE+ArWwF8qNt}q`Vb+#kONp2xt!J4#1^s= z8uNlF07Gzk@p!oiEB+jmn!;5it>rSj0GfYi$ee`6SeVqoi;F;xd{+e=59JI{r(Zdq)lXf&;!!mC)rs^jPP{>k;1Pq8 zz-vDyHQa5Q2$U=qcEbY3n#J+^^KiCff@s5Zu^>eni`Z=C#~Su%(gsDpAqUH7U&)jI zR7JB(JiiCi`PehEN211u&*$JTDEOXVVy9gxT=Bm3_xYTQos(Ao_+rf_MS^xMO~wht z(sEbj@d8xO6S7`k=hA6HZ$HYiY6SGvhix=miRkz%EGuK{V%` zFyMma`55Wp(5r;z39NOhj$2axT5nL2F=9CGDyHd`pejJUsvi@sWL5n=)6uv$bwNoS zKXHAuq~7tb?}6@&APudf>spS2UsYQe`yq%TKd4kN+`ssAY(chTQDLB?`&Qf@bySdh zW%9YOc6z`TXl}%@*RE*kW;pNF=q-fy^5qfg%^SAg?7d*zx9C;-G*sSHgW&Z2lS$82 zHfXj&)yHqtnmT7&sVi#TemwAL)7ZETW?y3FIRJUp48AA(^X3!Gg7Pzh^-_?ZgxwF*XBp?Ch%n} zoyhIzTnZ7!ASw<$I-$F^-7Fe>eMGH)zC0i@AZ<3hZdyBY7p{+OolRP;7_Q} zzMuK4?=QmDBDT-X&;t9M7P-ZR4wB5e)YhwLSX3A2djFw}} zy3M+zgcdO$;c&0OS7;#U1GcphwNBk)d*`Go94V8HZMpW#!qU+-ePgA6qBGCn>P%&V zgErQ#P~$arfpZ_0=k;|Hk6>ml4kcjqvA4c@%Mcd>@hUe}$8Tz=fR}^v0$dl!hlEVY z#r?)vbw^Dg!v=OxDEGbe%&d)UNYqzq zy{8X{$@;YC94z-&r{4<`hJT@WF%_KdokLYWyaT(ELuOIz(sZ?mcZ;nM{&}>nvWBOL zY8M**sfl2wzE{_LZC1izfyj{IgvNE>Xqv9r6T#>N_E~(qLu$}JyvM{0QC=UuZ}o$% z)ySn$%HS^&{TBJ$mfj!$8zlOzr!0%fAVzG%~Yh`H$oh`iA77l0!2 z`bWYxe+vDSfYjR+Ndd4GgqpWy{iKSUCz29+6AVwIlrJOY1mf#)tJZqLoN=PxUV3-a z;kn%2@v?}OGe7)>%y$<5EJy-LL%=2c(3`rW+=b>l=|yIXPXP;VP4${PQlA|tMh-6m z1EtIyL}!77Z>Ja;HNxx|SU40t8TM+s++2uGk=3YlML-xouwNu0K}RR*LrX~%I(*6ZcC5jzsxIzdr_1w-cBt4y;AK3I+xEK+)<<5* z1FA%sdw&Zfj!r2-Tgb*MsWL6_Tg;Qteh`VGwXNJzA20v_#uBf6@3#U31>w+$=MltA z5JCEgE`3y&n_V5U@f*)I`4D2v_Hr*rU*m|H-CM53o1Q%u1Q$Pc0F6`?h~k8y@+JIt zcq{bxSFn#YK94BJEvxS#3)!O6_I6bF+Csn2ezU>7>dVf4jw6>_xUXmxtp1D|JDn=$ zy#5IRh%V}q`hZXNwkjX#_+S~P#lZ!c%`f=5u?^C_pCICQOZX{XdYvEBJg`p)xC3nq+p zSt6L7myddBLzev1o>jZ=BGF)@zo@@G@Yedq?2kE2Tq3zM)j?suEQjcQyCJ}3r9I0K zoX{9z3|_xeg$>;A-Lxti5H$ra8ihAM*?(rC1YJ0@$01eQXOaV>avF_BA!9GG!8&uw zjCnhF+mXEk=n??Xc5*@(==*#r9y|i7paZULI8OTuEkc&N7n535y*CkKrImZ|v5;~4 zh8dhV8^y*PWYqGqC2>?HHn6eM(`{_UYwYqta|ufs5f{q*W#%i-5`fGoeG)D{qg46D zDYmHsX#sWOROSYUKbMfmM-HsFx69S17RSCE`D`5iBclSonRMp>iyYq!SiRtve9=LO zj9brRJud*Lvy*#$3J0A$*ssV#`6Oy!W_mjlA8t=FbaD`xFsyRo-|HbKB%(eGd}2pG z+4?zxhdoI)o;+KWYa1vzA*vROTZ5e zTUas&aQV{qui^z&60&gWg3R%S+idwbqy8DYn`^I#yKGq(=odO_QE>3E3O9sCGKVpH zM0GJ~B5o!<>~fUI_x%p*a%5ne&E!SKH{=3Nb0RjL-Q~T#wANiBvE`+~o-fPlhdF3S zU0ZZp3k-o9@N)c#cth9aRyzl8iW23!%7s(S=&9!rxr6BOe3~#!;5;k%2im3gJwpAD z0pFkB42{v|H~eG&EFfm^FO^&yLoiwLE~m!CA?kMlOSpsa^CrSonG45kL*Z92Y%|oG z_xGKM?_AdCCq#&^1N52Yt8v7OmV!~z4f+qCox)6^%l&@HM`!KLP@|Cc&|(@tjze-m zUkebXK$xvslLQUt!syNcNrH8C2-}M4wDu3lipTBP`x$Z%Cj3d&l!Cw?_gH&_xGZ5x zdo{Xm>Yg%0o0?8HT6qkx0B-X&9Le6eK+#U!kKv!MtYC^B^S)93v2~A%dYy!oObPp0 z_N&T(040tubuO*wZ%gSjHPb*_aneAHyV5~w`Ps!7L158^6b6s*5nUpx*lR6LQ+c*C zr$C7Fq{#7HB<`{ZW1rJ4v5h!hGWoWB=Qem@WL#OZU3u(uZL@D8-Vn@ctLRY;e{>yF zJ`Xn&uxoZZyO%qCoy>-lcXBJvJR2ZQ*}EM3gaswhqn~$QHQwEM#2mjbpjWhjjN^dC zM$Ro90_gducS9w`(H6s6)s#yAbh1fk$k3vpB)80@dohgNeVY*(eRd`nvDFK za=phbGr@nHbIo4mch#{`gTMjr@-|GF#FNzFo$rYN=e6pm4eCC%QJm_nzCh0dIVPNM zl;luk@W!NYq$9oMmv^eFDv8 z%m<-c<&RVj$KHKam`r#-qXDf!n;m$*xO)K_6^PKK+;0s|rE*>eWp}j96|U+8MYFAi zg9?~Ih*{2bS|A!8I@-m;A|YQ7>EFTa8;W6n!Q})<@semus+s{_I3K zA&N{QJ9aC=2Tn(qylhT^q)!AXNq~7(TcXZCWRr9e+BuV=iMDmKcBP|^&MT}i>76Zd zU3q)6KA9CW7WAXeiFe&YT|;|R%T!m(gHOdNvYVn*w!Nn9;Q~76NgDEiRcwB+k;`tn zz)y8C5GwiQ%bOw^ZafFq{oN^A=T!f+rW-^4O%b&s1Js(HmUX{bRt-L)`a-A9qzYS+ z4SypNlK=9801s_v^Vx#Q1I*QV040@u;PZ(J-ovaB{Up_yoMyr<<4S@# zFDKnxK$#KkOWF(hCfCIBOS{a9I7R3k!NLceiAL!*=b0$)8_=$4x0Jwb;=D7>#=HM` z^h@&L0Pa`((N)!o9{qo%+LV5Fc?b}n5L3WUC=D}Wr{#J2Im)i_JJn!~K?~X$iN+br$s<37t$rj=@lkE3B0ryZC z^JY!;_Z*sfbxl>9%o&w$>{z)SUZG{zX_2)D8B(KIsP9}Ys!DaRI&O$K{1{YJKJ_~s z&;eh)H-4{Eeb}{I3JgOQnj(-BPH@u1-GVtMT0!}K#>wdu#dLPlF>-CzvP9P7ApFxJ zMcT4E@z7n;XXBewanVjLm;U(_`(Aw*`;(o^NA+A$1xny+=LC@JrLw8-4WZMVlA)J- zJf`9&{}2@PhI;}*&y8_?^7y`0$vfw#7hHa&p6_3aBbwV!v%;bK7p!(BX)gRcBWB@s zxmY>8Z`UCe7F*l85H`ni7cq6aIhp%hNVyiZH6ClAOLWf#XDgB0sU>rXD!0VPy|05zNKcR#c4I?u7L0 z<(~94F}b0u0^#`L&WAq_s-6xD(hiOq;A_z$6QOXa)YzwNH^7wBW-R$*{6Za|ZVDVC zwc3?D4Jh+qyo~K#e4*Xf5n0qt?f268<{)+96n+nJUF~sF-N$Nm$MW+c*mY1`JlPN-BWOhr*bDv@ngNz;iW$#F^%(o)%h*>Z>+vP1{TR4U40j!_#U zhvm5Be3~)LVY8DB+wk4%{rP?W`hMQ8%kQ5(cX{sld|sZ1$MgQU-LLoCeQ}rVp{nb5 ztyfS`P(5dN=8A&C>QMQ2%vxpn=k~syF!^G&->FNd6cmc^8)P@uC@7p%ICtjMRg@yT z(*5C>RZG z!?Wl@;lrL~sxI!)1Dx)cymWpr0!w%HfWh2rOHmjMd)GZU9QYN*+tBu7#6F9|iBP&1 z9h;e*oxS<03qI4-RDM`&iKVu?$KLVu^z?#t0KH1e5{Ky7QFE&CLf6r^^S@I<_Hmab zJ(1a%#}`&`OSvzQvGoMX4#1ML$!qy9!pv4Q@-BMbeIJ*xGCz#t#_U?WQL@aISSNY5@N)5buL%pI-@;bi;O+t+`PQFZq@czHEp zvb@IOl%;NG9bMhPj`tU}pEkee$F4#@xD&km!T^q_uv;WdR}d&CRSsi^p_z=-M9>OQejG{KDh)N zGn0}(KV~+sdjC0NX*ukN!=cw3-YRcdY4n*5RQg=L3bnF~AI}&vaK@9FRd%kT>s*wY z0!;KqWvuACldo4YwKMk?VU+mYNi0f|9#Y-=0~cNrV*9r8x;yvs*m7t{h;7#=49ak3 zaLChj{%O|1a+YTe8f!vR3Ja@ctsi~tStdVj<#qP{f9~RgVb}bo@JmbjG&f-qXpj0f zbzDut0!LWTJAd41>o=pL#Oi-WhCY{J`WILx6_+=KOQ*gLQtn;nt~!bH%A4?P#FI!< zEL#RqRmEf4xtMMSd8#*~_+qghB@o&UJH_)AX7l33)<^$72E=6e?Yhu*M)6r2_p=Db!l9h!D~t1?VVXC8B}-8 z&XKQpiHVzFJ{c-EHKHZV&(9BS0+|XxL}ptnPwqA&wuduqYg?FZeBGF2s_SBcNP2kO4dB1 zjC3x$DdTmHvTbS94xWX_CI*P3KiOroFnVy!t}(#LZipqTj8C z;YN}sEm6DHUqDTPI6*g@@*$>2qvD3}%vZ(}v_*=Aa?W_hgyK@egGugF$js&1EFJ7~ zD}eCqOxecD&1#Y|#9XKKG_=_4S(o*AYp`E~g+OJ8?7ob#>YX7s@}AZ=W4zIfXKpyw z{TMYB!iLxD5hpDkd@?H-tgz8mDkz&-z@C0nxAVZA`iUbcBJI5CL%Jcx&4-( zg24EJO**D_hlyv+4sXKx?{}~~cM`b8>ksi9@9fecB2=Wfo2daKXl57#)12ysi&sM< zb892r&n zK2o?cPgw~seA3X?`CiZpUcQ#7b6g*I?r`;Re*l;xQ>9P&FD9i|VNvyJFb>e7P)QnN z7``s7kO<%D#gEx5arZ7oD=7jHf0D-Fj~CP7)6N15vg{do^ajMzuKq*IFnbTwATZGz zRSTEoj=_(*)F2b@zhEv@)Ro1|3$83Tyvdj_3Bbq?QxoM2m1tHvnI#Mt~TxFWP{ z0#0ZOZGsI`kQbUs$)s0Q4ARk<`v%qm6Wqj6*k~sQ?NoL4=`Aj(k6yP`@uDQlGpJrA zLXu6|axb*9=^BWB-SjT~pxW&PgR0KlPEd_nmmVYlU0%vfa_>hb-l0cqP^;+79V7K$ z=blCT>F_it+hUKPp&r*ww0(IF)r`5==pMQwq{q{d%s0*Q)&jd-L3`E1Jo9Z(f2DCfSQC+bk@j(xo z8vZ2YBsFW0KpiL1tEFhPOVvOUCdPq1Z`o_*(F~k0!bW91a6zjSj3&E`?Ze*Cy)Drj zf)V`CPWZ@kk{*E?h^?{1^!w2;AaG+x)cT5L+1M(u|z)v_c8=}&S+#`_DmK^!j zp8@Ltv`iyuLDwCyFF39nNG;)>ju)r_(Q1}|QqF&={&{>U^|9uGl>a>v{wF+EZB&9{ zq(=>cdeMU{=gc3!h!$snj;NOMtHLh{lzP9c^o$(%@bQ(OTY>Jf{`Cm{{;eQHf57l6 zJQ&jqfeU2t1FbN`AWxHWwOH6#j;Y-Mf3e{1f_<4K&KEFtFNP=}#(L9KvJrouWO&s_ zLD)(vU$Ivv2Bvg5J+B`@Us4W0Af^h5-i)-7H@N+1?cpc znkyF`0T9c?ut17M)cn@p-aKndjsSUS?Xc#N4>mc8~S2;pampWpb{-!A9H zZHHt|=RDwWjyr?nqR&VmGkZ1%pnsKjaILrmcF)8c&4p8Re&C)m3(a1tY@hlYN}k4o zR^?7_3|2MLf;VQy;r$N%Wm&4%_k-2r$jAr@7!W1Fbaz8Q+`HabQ2_xtUf09v;Ptpy z*INseaD0c`naCJFG+W$PN2)NSoLyTmdfBUwxXTtD8!m#48$KP2ozUTrE!PoGok7O} z5XS6h>gXA00K4IOGm!TU?H5ywJ&RVMTXNSc&=gg~MtjOYd*E4QJulg=Gpg`X`c4Nf zjU)&>BWtai(3$7B$%oLUVQhG@!FG+h4>2q>YbFe>nT?)b3R~RvYc0M)EPe@l_yC7~ zf5cn%Y<7TQJ0CO}pRv#!{sN(onim`0$|L1vzD4F4VQ>O)gRJe~_en#Y#;Ypt{^a4E{*iDU~ZGu{6d}N-VE#h33^~Fu-gH3D}3*A3%;8iRtQt~ z30HIwCW%V0!zPp}J3u5=sAgati2fxR7%t}*ZYp1K1A&Vvn{q~KG*KYx3*>tZ2YpfH zA*L`e8e}2Hz6}?9REHn><+EHu0QC`XYCtPtn`3v;6IzLH!^_BeNi8a^Jh! zK)G-^Dnxh%2EjqW7K$EKf7}O&S9pvP7YDjgOG?&t52H`G|gsydstk@{ItHd zcwis;tkn^CsdD|KYKKYC?d(c?U8asSxZm63!t#END)HSJ zgk}8vdecH1sUs2CwCB0`A0o9Rx9X#Eds&o5zDBQYYQXzXS{2E8BPfz$Bva&3DhX73 z9QA0&WC?#74Z2k)tW_8~MDhOQe}bTCOA9W-qmQUE%K|9OH_FSD|7ya~kt$rapUi1)h_^1VQPApPTs2!41N z9}RB-Dp#vD*-iTm#Oi=IxnyXMcfA+UxNi^Y9kGU&+Hz=GvpE6ZA~m)q`JI1@^dhWU z{9w;bA*WqRLSz)gQZ(|)R*frFEf zR}(}!5%d0Ul>gbX(K8%^A5T-!@cm1v=w8m_%-a6YI4rrs|2zvBkB-yEcKtupfol;>}Uv zAm3YHc(gS=G84E87?qWxmnT&jNGYy<=IL_bHm%<$H%|*>_TpI!DX3Z?te5aW|pvQ>tN=l`98S- zxa1@MtmqdrXDP)fAb9DP@LMf(aYsnv9NPXy_%jJDpPR{@5X-JFbz|UN=|Iz8EQ5!@ z_zr5ZAb2tvqKkk?EnSZ9WwKCxS)U&b&)4nhhOeeI^lfA(4h5ey2=e#hzEusp_O8@# z;QZO3M_~gu=n}KPpr>v`nwLv}IA~`6>F2bhi8#XMDA(kT`bv!_k39c>7u7wt7*8#% z*k=~gO{7fA<4GSW+Y$yR;M7TIpJ=g9k+{PvQQ8N{+8I5hH@GM9^;Y6adQW8Y@T$le z9V5+|kSRFiAWuvkebRW1w3UGEouRyV64C$RiZY&ZiS=ZasIGDqvy~_=vB#*aRw?nC z@3zerH#I%qq1!j$$3I+2P_einSf%}GUJtLuUocU+&lqOL*QQ)cG#XNSd+6Exp-t{F zA$Zs&q5m2B4PEBpd-}$Tyz=s%(cLoJ!*1$cx;-C9ME!dVNz46$ggD>jWc;alM{^9Y z!2j~uBrD}@d75(%mv=l}7qjvHq>9>$koe-20QcL3i0s7+^yK{!C$a)!YSo&oOz-F_ z+N}|Pz-RWVgqL2JFPxP4z9%A|scAUqKF%zfF>vdN4j(I@=`jJpmp(FFA*ipv-Y722 zEahQ?lET7Q+j*@gNcV|C$g3tnZ`12uTDbMkj;-2Fpg)aFT40t8T!b zgH2O8ZH^niUFIw8ob>p8zE*bX#<%#(X(|L6V&8>kiFwdn3+^Pp8 z*^WNH;Co5Aea|2af4bwau(0n&16R5&yeTiN@?C?Fe|Xc|vBd&vMnk(BA>||4Y00gR zx>7Gt>zBD0i+bq0GL?8ZZI=zd4Y_N#f|VM{)t6aB1uNny5BW=^K83?^o=j2e=x#~AExXne8$v9Dg!aZh0)P&U|C*WF z@f*~xu_>kNe;<|q3{{M|vUr7$#~lmm;*)0Chjn`G4^X5@OqN`;{DnpQIg*OU<7?L& zyW*%F2qPbL@tT0J-muWnU0)xG7L*9HZ_MZ;Hx@&)IyzFGp>n&v1>&&S*;~=bM~?=} zGT&|88Da9exnOF1{I(vw@m$f&K-(+T`EstQvCAtYEnPUfP%&m&4Bg>{_Rw52Ux}t-ys_25tWne8 zKV%zSFwG}SuQ5!O_ngt58Tzt}oCQJkXC4tpKr7G7awp;zV=3{qtu?~7?rmLJdk9&~&W@R&gS=B3v12>tD3y+3XCEQ~p z1W^?)EasqFbSKt`4o|d4tO(B5*_bqP3Cj@DXI$6Ps?q)RDQm5IILf_uDRd;$>5JyZ371qP z*b6=DArXGG45*i*uS8rCi~Ta3-XW#coLVFk3_`!4+xq`kI`Tg`fwmHqeWvRWg+!XU ziegr`y_~)134wl@U%LB3-bf9F$Bh2MwY_ z$s+(WjJC9~wAEn9a$P%9RZkHB#{@2apBR$AJ5+_42*KIK<>e~UnCgp$C=1guGtghy zc>efMK#&2%&cjI`-pJ&mY&Uy-6eR^0seq=PL+O2?+RsRS24(jDNqxJ4pGK3Z`N8$W z)($apNuONlpEthF(hfz%@&aZILd(cXnz$^o5|MyhQ}hbS7^16j2X?794HqjbHktOnlCMIX&Wtj_Q1iEVsA~el=BH7#5ai(39Sy(GAqcDz4TgJLZqCgVVD> zH!A%IUA#Abn*rjo2^}&2tON6`SNX(HZLJN|xlR{UjC}yh0>tSqlP3+H#LfWudmIWi zwe^RMuQZdQYKu)gTnL(I>@SA~$2eSXHYXL$ba&?l1h2u%cq|=sRn)Len3H=mP`1Ve ztxWXQHP~Mr0TE=16hQ)$V)e>yk?=18f@fQ=hS~9ExlQ3=Ki*jv^%0Qu%==5nPJ_7Y zhw2NxPxRGzXXWpqPZ_zElAb~;HCw5wR^Au)2d_WFL!@}>*2hG;*xc34* zMN9Z=pN#gPkshpCX_y_zy3tydFTA(<`XPN>K=8Qr1;Sz7IN-P&{e#1DH!py;tu7+P zElc`@-w-bQWgigy_l4!2ny?Df`Jf4v6#w`)C&)et^Os{xTO z>_+OOR`YM`Zej)N(FURa&zBERn^_4rkv^i&gdI~8#mngpg8cXBU;MP3s#wFL>Qsne zE+SBu2^E6AQ7OsCAT?cx>A3Xo(AyG!plHm|7_u0$>$O4~qSLBd($&9Hx8gkEX=vG6 zh+cgfq8;)pVS38qRlP!pW=Zux2qBU4roa(+b%V6jtJ!J=rW9LK3v2Qr|3E6(?s(Nz zbz^40stu!-=^YEM)@n6%QX;NwBi+CmkL1s5tRX@j`wwh!FukCyt+ECg9pCz(bGY*> z@ePad#ufrspy{JOavagoe$j@ej=1TXbyWE3XfIwhvhOKV;<0+^SMa3f?;O}w-D;Hi zgunIUY!Th8;(g|EspY2p^`}nMmDG({Ydz9+#`6xhbZZFieDbq<;{cRoMfhGjOglT& zVr}v8)8V}P(wHvy*E}c1kD*F9-a~f3KKH{DVb5b#L}|T6)~#7Q(LJ8iq!9c!)L5fuy10GqB+BY}s@BLS z7uce%%=4Xvs4OIC;zdP3j zkA1hS#pcV*4oXsE?@(^~-|-LhsC0Rb>74jh$&a)iOfm9 zX{(|8l`6CP#`N{uWI{)nX0>E6pZCvx}lH;aa& zqq~@gf0a~BBaaz~x`I)4Ho}4~6WxZEoy?$gig28)<=pRW^5ke-S2o$xyd<7oYJ^@${XOr$4@O{)8Y~+ zZ>h`UVQPbj&3({tt)@(at*x77$zfR4aIq)((c~}Q$X%(a>{yOx{Gtgzp zZ6|qp!CKwuX&$mn6u02QxRb;dhHkYvF_wwV(O}`{P)viDij|46EPk-eC% zT`o2?1+DKz*I@V^IFnQDn-uBa5giW9li|0{UWZ()wJ^`UPpT!PsE*|e<6ez?9XbZx zLivRy#i#7tl*HtWuYyn!Hii%KikwyXIUy5OPnN?L6`>9Fz?hT?(RgWx{O8<_<^r^iHsRr=2#vY*n)d4_%i7$JSS2*(k z8+@wg+z$^El7vd7+DB5=j!pn{b&woCmS2kHRg>)rvx2FquPMAy;6r89KLy!L0s-+N z_>mHCaq&kW4vn7DH+ZmMzg3cvv5l03PssQJ+OiNg+{;?t#aLWK_smb`Xm9t?F2jRd z^RFpMe*=$C#~B3!cKU9sa~2l#m~Qv*dQ~yYeGRskZ=$RY9CT2s1MnE-xcMb3p`4$U+MIM0?yPREH3(ra!5<)7a5YiTRv@n?K`<*S8#A6a8@-5QODO~-53jFQ zmlCpuK8I~*d7|%~ap3n03kFy4>>t~;^~EEiHZ{Z7#%Gh^m9d4pE^PWa2At7 z!#@1 ztScc4FCOVQp9b1v5}=D6ivzr|OZ$JZ%Kyh&sx|!>Im3&C>~+AizwOd>42O$u=`~pu z`ZOeMzg_R+_grT%oe*oi>VnsGHY&BazLlQvgPqgBtL>JCvW~X~X=H{JSbAe(9O;Vn2E9lgUxK zHT>f-uTrK8Dpe|e(8U^>NV&|uE1ZxkSv2%VgO>OVxxLLEt4iaPSnO`vfTAK!=f=c( z+SRA0BOSyO7Qbq(?Xg|#1ljmAE%@=@<<~&nnuysrgDu*lr@>cxG-Mw$EDps&Z&&*0 z@DM+G%SCGRPw1<4RgO{4~!mT9aG1h8NMUE;gWtb!sm- zwy557AU)8i9mdtgFe)l!*Sw^IGY;Mi{<`}E&}Ez33_rLk6TRU%^87sF2C zJq>Jy@d9KK+5CF7`-Ul0yZ&T`@#|-3zu+~x+MgunD$m=WwIzRW@JQ~=tt0FL7`*uf zGV{JKFB*@#Y5$q&p|#Qu5Rf%O0~Gmd5?im}_iq@_5`Dear*Z?I{iD(xA7@1Su(U4X zX4>fGhI^k_8AEV>I$~_(hU;3(5r=U7ES7B-9%Z8*cA9=MS8eoV9e4l<+B^dzAyRys)7A6&buZwr0ja%aA4Kmg0h8VmCb6Rq^MKJ-h7fn_>b3& z?=`!x)_$Y)H4H36uhCT4`&IojEzw`K7X560+au!TFl(G#|Hc-t7-PI+uXWIvaOKwW z+}%;x2Iw3=FF7JhtC$8A6YbD5*PaKWJ>sU-Ykj8FowZDg9Gn?6wDXg+ar8A2!x6%E z@{$q|`xLHde^oL4dp6Wf(P0;~=^IgAar8%qwT@f^NuXPnWiBD)(_yJCS!j3c)@`8t z;qPqFx|4EGL)Ohscn<=vd@t|mgz<)u5U<~s!SuM%r1-I-qz&ZnPG2hV4mjI^)Xrrm zD_nP3!)x@WXMip!^9m&hBEgR(DF&h~c0qD>&)Ri>aA9a-#G%6qX^%jG z*@ps_Jrmtl=nsy01)|;<_d4Dtee<@%xV%v+M|`R+O}xzbU|uk(x3iURJexoNRjvY} z{#^xN2IB~xn`^hfy2s(HU&*k1XIOoaA@+YiI&=kkM=AO{C)6Qv&q;<*XRijhcv@)( z!$o86+1A^)f+nZW>Ck-ek5r2Tq3(Y_f90mW7GxzF4yi2Q?dh&gR49I2!k%|bLEs>-~>Y1D?eZ1@!)VQTwzA?=l+ zT6$Q0{vR+ceh0kAxcy~4<%m*#l*s z5Br)mz>amr*8ja4W7<%?3|U#EeQEtbA`P^aiGJn?!-TRbF#I@?NCbkLnpB3jga@LC zF+D4oQ#HfGMq!tS3yAB_@b81oJbn$U@4osV?Iuf7){8`=`$SgOCfF4PvkEfK5No2@d^t`=Lv@8JGWpSK{C0fhZf;v!n-y4p zNlwbZuQAqz=o-gu6Xw`%fxWPf8IU_L13-IBthBdJ)F!szMvpWBfkjCFnRBVsJZLz5 z8*tECFQ(!-HT9(hs;0`4t41p5)vVvPGRtiajjimZ5)ajA@-LGLeaa3A<=n2teR)C) z_s7T6s$699OAnt#uB~$Fc4(%o<;q2SV5pivO?n-YMYh3% z@>aa(gFLw)u6+gkb%?sQKB@}azjUn!IA?O#y3iyl>Wrz}%23BmNDzR6QI?hT2p1aZ zg~RLDx0mwdB2;a6o4gEfW7nNM9X>EyGKl2kE&u3(;IWn|y>g@p5l6)0@~EqX*A8J0 zz1B@dinZ%ySEX-z97u4;RY6k74iAwg0g%}w9BqE+%DqmzuKULaYc_luRFV+l)dQqQ zYp9HF8QJVIx)DC6wN$MK&w-Ar%)82FI7V-!V(rylsmMTg99L!?sJ>sJ|C#1WbuB;+ zj8!4ohpol6a_+A^hp8NJruVS`-7oJ{GONM^=7XMTh>NffhL4Lwk%H6hodVo1-obCq4dbum0k-s zIUXdGZ`dtd4|=;(7qeghnB3Do5JFEjsQagoARJ8qn@&GeSZtES4KKvi!Pukd&Gb3p zA##^sHi9;Aie6NuidaXS#Zredwdkx`#K_gV5vDZc7|8cH%IeNy0x zj%yFRUS1&Kyx{?t5-hwPed~*b)cLe(DJ#9#0enLtPH&)0#ex~h2F@Vnn&oQ8b!rv; z_GuvB?DSB5@mb*40zZSBycCI-pzQARD%-2Ryy@VXxl5M2P) zRBP?*ckUi-ifbDGNKWe}D>-noy!K&DT*hyyi@yODJ($l@A{^-v1MiT<1i3LQHj!P6 z{WMSx@xa$a$juM|o}&u*Ip{%qRdrGT8tFZ+18Hx3ynm-AiRa!)Ms0n!`&7h#OkdsP zT1dAK+Zog?dTKFOQ)698`$)CAR?EDkCwn5#-Gk@8 zU7cO)ppV(3&VG3e5pe)sG2AOY$O+)`~Uq1>AC|@s7k?sZCE0+M&GiN1U zjNQ^#BirU@&U=I^KIKT=o+i>a%AvyjHMOC$dV#>HtF?L#pek%+@TBR& zThmTG9h!Yxbrzl0SzySmu61DF0*ytiiMD*~Kx)bu&&VjHTI<9fLG1bJvd-R|n{;7S zC(li&1`MDbcsCZepa&j-6yqzlIN6`3vX>4pbzg+OWXP>P*37f0(p*Y=sLH)mBx6r_c)4`bQgWhJA5?pBL)vfH z{pZf)^Ymayiw5}2zYSs7yND^sAbo7B)~sE}v*qou4=BBwq-{XoZ>;gED3>LaBZufN zfglJK-5EEWYwpSA-(b_gTG&E1IOofWRN(vtdu6jiyp4xHil~2IQ4Q`DaZy>H5l6Jn& zNer)%@yVsjjtiiwc1!y3rpSuFLyK7-_bW*Qht6^^eV1CTQCf0vDxyY zBD@vrZE%I3N2oX_WbYNDEhB>!8)!&8EJ0JLEj4-Z6w3FbLk{=1dU?9Ex9+l&bDhlq zsG$F{5ou4v=tb$Ot;GHKy^w{3?c7ZsbG{nStM*S87yZnDxLX|mxb*W`o3y1O6cU`D zQSL~+@#JFf{|{E#?=V+bLygh>>j9?+BbUy$-SYcZ)brXgy?Fq7;@a>|I{!B*$!KwB zn*Z<@U31*kr2?kZsz-g|E6+yMq6Akx)_77CeEe%gMtZ7Szd}GO>6(R`$nCDoDZ8s` zJz(})r*+}Z4TwvZZwY9-40hpuVrMZ!WttCPC-|Fw&lxJybAQ9b6*YIyr+1^urp;3* z5347VabHHegX0nh`E|Z!NiiE{{Hhw&f+J({Iq^J1Te|DQO3JYqLgqwUn@YgyW9Ac| z37_6u+huWbk#m@ydndJYiOZ+FORzJTyDVD60O&4>l=-D^Lcy(_#X->Hvszq2+#Rk> z!~t#_HvbF8byR*UzctLp;a7Y3?#*&z=o$r}dnu*3BQDbX3=lSFBU$LzePaAM-FBth z_|n{^o0*bIjuwV`v>FS&rhM;^6=6yPpIrG2l~Xf3;P|8<9<{eU@MSMk>XjWvE#oQM&kR2{+RG$S3=p0Q7g^YmWNFc zg4|1;J^Dgra+OEu&CK$F@Lp=}Mg_Ru@}Bp9Vd-T9Yh8fXf6!8{L@fD8A4U6DZ*u5# z=VZAbGo6@FL4_TO;3ZW=<}Rafm5&eS#zI?3zMvWdn#{Jev?u-^epvH79-yflU{{Oa z*m_9$F_Kiqo_Hfm>~MR8!jW}=<-=77C6}2sv&MJtsJT~j+@-l6eBIXpe*>F>DyeS0 zQ2IHyB;fT+lct>gHPFoBRUP(VMD_OIkKqMZ3Dp^Rr{|s4f`S+eaR={{Pj2{T0BvAN zn7wCODLHXKvuJ~>8-jq`-L6^ZHbk>fvk@?vqp62n_a|D%hOwNLR$e0FD% zW@C~DDm8>B`uQg0p%d>>tm;y2RPC%_U><(;Qd3tzSJ&|1;KlDwjodaE4CZ8hKvS;C zabd`w#`d-kBC8W8rV30}b?7To z`TsbKO&N~e!D;`~d;)kZw@fU28`r_qWR70mPv|0-py)#`g4q_q?9GRCFc^Z|4+5oP z;sk0Wdj|(I^pzJ#ny(+;ulZGLf>AnAPPF9=n@)G78=t2aMPR*W*3Q(G!}sCU)te=! zaWC@><~q=d%jNL&9tXi#!$kc|XueIzZMkUvDAEWkgl}Qz7n^gpHy6`~hF*coeYOe1aRjPj1;<*l{XE#CWWAz{iD5e@V#8ltV`BW2lE0>;eWId`7!QPfi(8EjV6- zToKxhtwU>!BpZxfBfqj4x^_k&kLe3?T97^ z+W4|$q3{H^?d}o?0?D5FRA<8OtoR!zN?AM$egRU%v$pjo*KMXh-N2DoqS@$J>GOUS zy7`PBkGz&%AV?ywQOB^M#e@`j3r`(nBJI1=y;f3vLVhM9^E2iA=s8SThM;8FulXTB zbkJQmJ5t2}QBtMl4ck1}zwD=zTaY{n=&X-n+KSw`5hmB|we1oMkwy9V!|MKSqb@n1 zwQl+br5DljUH{nfd4(XFPpBG`gC~YY_C^3)V4GG<_+mQbe(%qMzF03j z)gE2+hu^~31(4L~2{c#S`5!@wu^QUuAp6I1h)SZs#K+auVlamR*hrf+#7lG1q&h*I zeKAZ`9TE`yCZUJb$h)*&Ed2N_AoD~gQx&Z&Uyo{YxJ@u;_MNNg`uUEhM?q<(2CoJvmUyW3%`bVo%zC!=%%IzZp zi~>R4RR-whp{jE06$f_#u$?@{hZyR)ce}h=ts87+*Q*n5HufxP zGN1h;GUaWjULfK_EZA<^c@)}e(vV;OVJB_lI(`fuA7(D)8P(a;+=`A}!pwdhskxv^ zQ=`w?&bziKshk6Ekv=tgf%w$FZDdLq5KaC0(A%IxbRr^n3NJ_PoFdQ9D%kf#%hZv5 zzp`}5ZXWH!+W?5OD5<#mcZK}GdcS-?G$wDc;9}`DGN_%|GGY7QlP_3$!~|@pKP~!_hhbIii;5NepAOCU$~jNbUPV786(2;K&AgETbh zd{kCD3PV_4QQ5Y!eCEb!vRkM*we|6D=Dfgp{IhQbDiQpXeqbYKazl%IQS#l;BH zS5|Je-tCKt=o9X3QkfPR4jezb^vCaeIAkv4XI`sDf3`$znuol6!lblcw~bTHFt(H5xGj_&#qrgPG@YCFi@DRTEJKyGNrKxrMTQbxCWL z_dnR+6&OtH4_eRY${g-LJ16>L&c9!(TGf?5G<5^^_`1JZD5ucs@OyB9jr%G~>?dRn z`9rEf=<(+%m;OaZ?Ni1s#{mWou!r-`hFyb2pG8=AsUj{@o@(X$R`nsX_%&)XM>Daru1y$;) zRIYsUZsV=iq>*Kr;B8|t`N{&L?!w>&E6dBAn*&($!N0RJHnw2#1*`9?{&IYVd{U9W zeQCpH4b+f~z{*$$U~xguMEyk<35%4b1Gzqg&PmKV_GG#>e$5^Xwph{k*Aw5RgQ}R= z`a45Qx1f+f^fV<*n6hrcdCM&-VpGpy?nIJ`_vhi+9+E>7{w&Vu5ys=Fc+DJHS)}Xt ze76gmNqYIIM>cv9Dm+8O#Fs$-`$(kdD?w$P9j1?Ds$VLnZbZdXBF=uZ=$uF04t!Sp zUAXtFxcuoH)w=4YBI%9_jPv)11iQE1i|?(@dB|UQsmwN_-2S^FX~clUjQDKv_`qzN z2YD$fl4@@uR=i#twW35~^yCi0q%TW-K~B+d`hvGEKd9j$DF$8Mqw+m!m4)DSDEk*& z_6fqlL|o!a_{oLh8K_$m71sH@th8um3i<+1<3;-td(X=#K)|DEz0x+j>cXadczNO1cmL8}(8gftm~}I1j>z10iT4QHjmaIE3N80b zI%-dFI{&R)=T^1WdPdDoZpPi<9sCT#lKZ_<3*2I?BS2_u=e$_t57_tEXC zySaa$kx_G@ugq)Lyn3=OY*AELrSoZTjh@5Cq}vTWK;9qSk8}I7shkq6s6oF#l$Dxf zP!qYW=T2ps#hsItxlTin}SS~$^3q;L9iqvVNxbBI_p0!4DGikW|s|pcUU~EiaZGXNCFegHNw?4H)>22Of zyDBI{vu>yMr;Qqt4JLfXV*K)E0O$D3fiD;TYvbpL)q4+@J+f*VEA5$UoP!%oz}EI(gpIl;+vm+8SgKo=ux$2-)ns z+#f%G7Qgc6&&_q34-O55yht&ZaZKSGs}+&Eg5c`!va@d*m|D)WFR^C=PnhvJ1LbO? zW1kjuMurBr(zhpQIt43}jsT}A;YPuhR&<%UWBCND`C$=W=Mh`4txm+_-T!+`a8dXs zwkKEW*FA>H#G?2)I5Nx~<}|0r&L5#t4tE%O-`g`~mc{qXC}42S8j z7Dac3L75g`zSz>k%R!T2tN8!-zW}VQO+acVv4)#eMn9sVRhwK!WlCp|=K#+Q7Hqv6 zH3b{x{W#@b#Gl`WahYD+KRu$9(3c6euG}}}V=BupdU)Gdo~}D!Ue!L8S`#{$O*BL9 zpRn&}n$>5y@i;@?I#OUO?{Y>{t(wv|3)H}Jc{Z;4&nMd{d{%>(!(nWWHRS$&-7T8M zL*&NFveAv%w!N$2Ni}+Kc>?wd)Zo?XBqvTB#;C6Fu9R%_)D%JaQ6|l6GiC3S)9JA1 zlSSC#f=w>7C1W}>tnu-Eo0Qf87SAqMT5zis%gc!yY3qJ8=iYQN=JHZRj~9vat`iWN zlak-?`h^P~Xlp&dr10!3xd-_U^gGM5@jZ9AS?HIF>=ly0rh@%CI2h*#YcdA}_0|>V zM4L_+V~;qDM6veI`o%{PCUk@)<;1zWZ9o!yc=)9>C>1$oT9F(+HdHbK0K8&Zj7ICq zeKDK80_8xwndwGP)*Pn1X7w#pd3IlzEm?qSSHK>-kl-oE-k!|IMlHP8TYH7>oQLs) zXIuA4klVHUhVvRH`WsyA3K{Y-$aF0jLuo5N+f@)JXJfO@#4svue; zV=}boEwTkS8(0^`uki!#X)D#^CrH_0!lY$+r?sEKY$2Z9U@~^aT9;|Cd;=l`EKlOk z(0WKD0r~ei;KWX0B+9E&Xx+S!_fYdC*{4#EE0G==*gsxXD~ZcUjM7(QfFZAGewf*` zbR?q)8$jQTSCWE2vaLzZ|5CiPQ?AlhTGj!ZH}^&O7{uv7rjtAM^gQTK|6^T)!bAV~ zXtO_B|B~D2U$Q%oT60e=4p`bN^UhLYs7VH>F!5&twn}K_&MQ=-_;AY2JwUN?AI|aY+(lRE22y@)n9AemJW@F6tdVjyy?f3nCuj}{ueE+-txo$WAINa=JUWdo?@q9e)FCBNA zr6V-wY0^N(YRS;x&7B{7hlM%&3nTpxU~npNSQ-80__skp%^P@k3C}8BqzkKOj@;mw zI#WQgxHZi^-&bE|1~tzL<{Hz7ZGa4sc?L;?1j;$A46QyJV|@h|61q`As^FGK^xRqZ zmrfEp#3K93j32q}_&uFfJ97+7kDD)xKcrJqwMdBu?!52CQ^Y3V&VzZ}@YG>vgKR0K zX#O$85;SkcB`InN`@&}0i?9zZEO*h{(d2MJh;L9l`c945C3zGQShDE?6j$Y2$KS65 z;klz>Oe}E|9S9?Vn5O5Kk3(1AbSD`jwdLCL-`0hx%vz{TVH%$zi4DIu?WG8O? z>+CbHL9K6P(_xrNlft_zw=y#v;%1&Nz0_2AQzt+u zX6@g;J0CO!em{ROuuo4vIP^h=3Yks#eQX4iEi+1`(G;zBx&Q==9Vd&VkrS!%AeVzHiB8bi06)NgU6R|t2xxBPL0&2p074(!2zPJfQ z8j0m+BHxd^L&ldis7HG~ABh=I*Be3_wzWpDo-^7W`tv%f?~Jk4PepnaE|Y0Dy;>-F z>}k=tLAL`ub^UNi_?~B8NxCs^Gz5=Mle_2#qw`}C3o?b>%SWZtiJtGkmTYA>-6P*z2`&p#}(5h z4aYg%6^v0?zXpyYjCGKF(d$E*t4L96H@LPAc`wP;D{x?6xmx+5Igd)0zTDM~)n5iL znB#5`4j1TkkUu{6gFP);xvy{4X(L%49G5(=xt;AKJP>~5dd&Q`qE9NnQq!8~KF`mc z3_Ntfn!k)o>oeYHbAcJqAC?&EWL+WvF%`yCtm)1EO~3D?iz+z4mWd+xk?f^N9*~qGr;xOosy; zBB766RD|uiKH?;>vuooLi}qb5t$C)crQk{(}8_Y!Lzq9TIvRVac z0wm=QKM?w!FfyG#(#v}!D?5dWqHEB*_W3()ECUj4=Fr4;^N8tn4tJr^D_?>vw=x{4 zX`|KZB}uFGUfs~|d*Lml!_o5{3&+~h8P*pbXbX)bA9~wlmzOZA-B%vD5KbBdCbwLG zt>nA4Q@8kyWz@_)O^-6$EF3X)OtYxG1>bcHj@hABAz8egvngWb33V&;i z4^K@^VKO83u-3u9*LEy6H$Q~TK<=docv z>KM00{Z&I6P)%EOhAqAP;`ns}6_0K+mlLkM&fk-%Th^dGf!ID_Y_sQ?Wq+#AJ7@aj#rb*@Dg1wR)Su!=8kDva^@w(-Y8^ z_OQfKK!XO${zF`G_~~!l0_Hp?igQiko58GF|I0(2I(drPe-!Cju?hQuUlt#3hrH7l zl7S7U=7a+_NJDCr`F}!P5ZuS+z|h5ur2@Ywx5eLraGs;Pbhhe{g6n?>aDF*LXEcKU zGbug&3DF#qjI*(TvGPw-ZMm=X%In|by0bUNnt1*r<=C8{(=Fg$^njXdgn14;8IrCE z6wZL|k>jMMXm_uSX6%yyVAZdJcVfJsyg#o7EdbC693KEdLlVo!v^b7ymcO=edYdQ? z3yPnLeTK&p#;=)gJ2-^^0`2+mdz8M{A`UR7u*aV)KLv3dIg{Ha=z#4nd@-pFdhP(s zZu{E_yW2S_LDKE~nZ{`9Saggfe&)Ad%fi|bY&fDX_JQN;xk2$1O$H!*KwJKI&dQKx zZc~nKr~f2oaRo42{N^=$KI^`}8tm(}d|1Zd-{>Tu`m44%hCn2?^%aWP-~q~XQEzs3 z_S}(yh*~z8OrCpZ>?kdp-`r-^U52DT`xrm-c$mR>Hrv;rU||1crq~gIY^))pq<<;U|Hw+se;`-r0)aq*H9vncWO};h?3{L=Lb~w2n^y9`WfedF z-5_Z`NaMkSF~L()Tj3+=bj%TEv=0u~dA8c+g^0)dW#p`jtxb%n(~<6++yX?EIMp2! zJ-3^cO0*psD@!1J_h0J0S@+?djA6!*->Q?mZVP#jR^aeX*}>)pZ;3~2Wl_9(PJv%Ki!L7;WGfk!di5Ig(D8K?nAkOnhCWRYW< zi*L0{ghe!PT@l1j@|Xp@pis#HbNff3@IVWAMzT0-PdBP{sfyDE3QTd5hW>uraG+G+ z-&c}v49!WzeQETL0*aVG!}#GL;8@P31RHmd*XJW&X!JFA+Y#QB0qYRysI@8TZk>8A zy79L}ke74w|7Ncog7ZR!FT{(SIP-!JdlifzG%$i0PLrwUNJQ_@KvS_YXk0ogoj>D> z4WV`hsZ;(`$!oWPR>q;1!8<9E5v(=9E_vZAtMT9|!)W3J$CM@$1qAjfP0$%@09rF+ zTCMP=>KHfdg!rC$1b{4BdKm>A!e3s72fem{6mSR2<{cDAQ=2BY;hn~?cjguFql#;9 zMgXlMy(seHr2#7;1!#mGze)c9;4Fwx(kH>f)j#>kIeEG0?AxZMTUcP=Fc?N)jq*rB9Lp@X8i~iV^oNj3b(z z$0k9ZN!k!rfxYuDCK=MIYcEwkuhQSWvRG7EZv+vqkDa_bukef&@ue!!btNNXrwu_p z0M-t*d_3o(s3jl@$C{z^!j7rc*CyROr^i4hA6Q+X9zd(pC7$&@_g~QlfxJvCFn=8U zH|G^Fe_#e5J~YV2u>LB=wV(B?wOiGkeXf2S8823U=F5UJ=0r%B{=tMTo1Uup0Mbz1ybX$96w{+YM|65!eX^!nR$Ofvb-cStp=T1D z;eqJ`DRlAMtXLZumuO~D18UVWt(!16G?jfJT<(jPj=Jj0Tjx6Y<1cRcntpvetNL;wPtb@N>X|%mjBkn;ugt2J{8+d+mlHz z@5CQ%M^qw~&U}^q9p%vwFULxGN3ds`>+jO7B{ZeJWzc`J* zK8)FV3a|G_y6^(0P#M!9o8&Rbn1WE z3q^dYR%Tg536+lbD|Q39t1m)CCGhtC1WD98tXEaCN3t>W7(I=*x?qI(w4tD%p;;3po7IRPa&?j4T5g?HiE8q}YdH==%6T;rX_<64 zTIA1<9!_>mcPjhK+(%Co3W}yZQL9JEc1_XqC#JQh1j)6_dxS)LCXCrWyHv28yTtfz zjCSfyARe;PZf$8wwU7q(tv6*{-n(T|rDG&%0Dbh`O6$zM)@}OiJ-rY^CSv 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 followingThemeButtonGroup.setAutoFireStateChanged(false); customStylePane = new CustomFloatStyleSettingPane(); From ba0d7751751b22a01d7b78fe5ef855eb153e037c Mon Sep 17 00:00:00 2001 From: Starryi Date: Tue, 28 Dec 2021 16:07:38 +0800 Subject: [PATCH 09/49] =?UTF-8?q?REPORT-65072=20=E3=80=90=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E8=BE=B9=E6=A1=86=E3=80=91=E5=8D=95=E5=85=83=E6=A0=BC?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E7=9A=84=E9=A2=84=E8=A7=88=E5=B0=8F=E5=9B=BE?= =?UTF-8?q?=E4=B8=AD=EF=BC=8C=E5=86=85=E9=83=A8=E8=BE=B9=E6=A1=86=E7=BA=BF?= =?UTF-8?q?=E7=9C=8B=E7=9D=80=E6=AF=94=E8=BE=83=E7=B2=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 外边框因为画布被裁剪的原因看起来较细导致 【改动思路】 关闭默认的裁剪行为 --- .../src/main/java/com/fr/design/cell/CellStylePreviewPane.java | 1 + .../theme/preview/ecpreview/cell/AbstractPreviewCell.java | 1 + 2 files changed, 2 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java b/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java index dc888b1c1..f90c78d87 100644 --- a/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java +++ b/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java @@ -133,6 +133,7 @@ public class CellStylePreviewPane extends JPanel { Style.paintContent(g2d, paintText, style, width, height, resolution); + g2d.setClip(null); Style.paintBorder(g2d, style, width, height); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/cell/AbstractPreviewCell.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/cell/AbstractPreviewCell.java index fdd4dd3ca..cfecccd61 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/cell/AbstractPreviewCell.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/cell/AbstractPreviewCell.java @@ -40,6 +40,7 @@ public abstract class AbstractPreviewCell extends JComponent { if (style.getBorderBottom() == Constants.LINE_SLIM || style.getBorderTop() == Constants.LINE_SLIM) { height -= BORDER_INSET; } + g2d.setClip(null); Style.paintBorder(g2d, style, width, height); } From 84b7e492dd7e441bf1e2721fa79941c672b390d3 Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Tue, 28 Dec 2021 19:02:52 +0800 Subject: [PATCH 10/49] =?UTF-8?q?REPORT-62611=20=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1websocket=E6=96=AD=E5=BC=80=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E4=BC=98=E5=8C=96-toast=E5=BC=B9=E7=AA=97=E5=9C=A8=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E7=95=8C=E9=9D=A2=E5=B1=85=E5=B7=A6=E5=90=8E?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/toast/ToastMsgDialog.java | 13 +++++++++---- .../design/mainframe/socketio/DesignerSocketIO.java | 10 ++++------ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toast/ToastMsgDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/toast/ToastMsgDialog.java index b4c6dc1b5..83cd84e9c 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toast/ToastMsgDialog.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toast/ToastMsgDialog.java @@ -3,6 +3,7 @@ package com.fr.design.mainframe.toast; import com.fr.concurrent.NamedThreadFactory; import com.fr.design.dialog.UIDialog; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.DesignerFrame; import com.fr.module.ModuleContext; import javax.swing.JPanel; @@ -51,12 +52,16 @@ public class ToastMsgDialog extends UIDialog { hide_height = dimension.height; setSize(new Dimension(dimension.width, 0)); contentPane.setSize(dimension); - setLocationRelativeTo(DesignerContext.getDesignerFrame().getContentFrame()); - int positionY = DesignerContext.getDesignerFrame().getContentFrame().getLocationOnScreen().y + 10; - setLocation((DesignerContext.getDesignerFrame().getWidth() - dimension.width) / 2, positionY); + setRelativeLocation(dimension); addMouseEvent(contentPane); } + private void setRelativeLocation(Dimension dimension) { + DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); + int positionX = designerFrame.getLocationOnScreen().x + (designerFrame.getWidth() - dimension.width) / 2; + int positionY = designerFrame.getContentFrame().getLocationOnScreen().y + 10; + this.setLocation(positionX, positionY); + } private Dimension calculatePreferSize() { Dimension contentDimension = contentPane.getPreferredSize(); @@ -106,7 +111,7 @@ public class ToastMsgDialog extends UIDialog { Dimension dimension = ToastMsgDialog.this.getSize(); ToastMsgDialog.this.setSize(new Dimension(dimension.width, dimension.height - 5)); } - }, 0,50, TimeUnit.MILLISECONDS); + }, 0, 50, TimeUnit.MILLISECONDS); } }, 5000, TimeUnit.MILLISECONDS); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java index 092c7b30f..e5f44d4e4 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java @@ -206,11 +206,8 @@ public class DesignerSocketIO { UIUtil.invokeLaterIfNeeded(new Runnable() { @Override public void run() { - if (dialog == null) { + if (dialog == null || !dialog.isShow()) { dialog = DesignerToastMsgUtil.createPromptDialog(createDialogContent()); - } - - if (!dialog.isShow()) { dialog.setVisible(true); } } @@ -284,7 +281,7 @@ public class DesignerSocketIO { private static void printLog(Object[] objects, PrintEventLog printEventLog, String prefix) { for (Object object : objects) { if (object instanceof Throwable) { - Throwable throwable = (Throwable) object; + Throwable throwable = (Throwable) object; printEventLog.printThrowable(throwable); } else { printEventLog.print(prefix, object); @@ -294,7 +291,8 @@ public class DesignerSocketIO { interface PrintEventLog { void printThrowable(Throwable throwable); - void print(String s, Object ...object); + + void print(String s, Object... object); } enum PrintEventLogImpl implements PrintEventLog { From a59d4194b5b23864437f1367ff633b9e9ac27b11 Mon Sep 17 00:00:00 2001 From: "Fly.Li" Date: Wed, 29 Dec 2021 09:36:01 +0800 Subject: [PATCH 11/49] =?UTF-8?q?REPORT-65090=EF=BC=9A=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=9F=8B=E7=82=B9=E6=A0=BC=E5=BC=8F=E9=94=99=E8=AF=AFbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/actions/report/ReportEngineAttrAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/report/ReportEngineAttrAction.java b/designer-realize/src/main/java/com/fr/design/actions/report/ReportEngineAttrAction.java index d80622b56..8e958f536 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/report/ReportEngineAttrAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/report/ReportEngineAttrAction.java @@ -78,7 +78,7 @@ public class ReportEngineAttrAction extends ReportComponentAction Date: Tue, 28 Dec 2021 17:21:15 +0800 Subject: [PATCH 12/49] =?UTF-8?q?REPORT-65087=20=E5=85=B1=E4=BA=AB?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E5=85=BC=E5=AE=B9=E6=80=A7=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/data/tabledata/tabledatapane/DBTableDataPane.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java index 173da2fbf..1746330f1 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java @@ -715,8 +715,8 @@ public class DBTableDataPane extends AbstractTableDataPane { if (useGlobal(getTableData(), strategyConfig)) { //使用全局配置 strategyConfig = StrategyConfigHelper.createStrategyConfig(true); - } else if (getTableData().isShare()) { - //使用共享数据集兼容配置 + } else if (strategyConfig == null && getTableData().isShare()) { + //没有配置时,使用共享数据集兼容配置 strategyConfig = StrategyConfigHelper.createStrategyConfig(true, false, true); } } From 9da19ba5f9ed592db4cbeb4ca877503e168ebd14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=E7=A3=8A?= <294531121@qq.com> Date: Wed, 29 Dec 2021 16:10:04 +0800 Subject: [PATCH 13/49] =?UTF-8?q?CHART-22503=20=E6=A0=87=E9=A2=98=E3=80=81?= =?UTF-8?q?=E5=9B=BE=E4=BE=8B=E3=80=81=E8=BD=B4=E6=A0=87=E9=A2=98=E3=80=81?= =?UTF-8?q?=E8=BD=B4=E6=A0=87=E7=AD=BE=E3=80=81=E6=95=B0=E6=8D=AE=E8=A1=A8?= =?UTF-8?q?=E7=AD=89=E5=AD=97=E7=AC=A6=E9=A2=9C=E8=89=B2=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?-=E5=A4=9A=E4=BD=99=E5=A2=9E=E5=8A=A0=E4=BA=86=E8=87=AA?= =?UTF-8?q?=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/mainframe/theme/edit/chart/ChartFontPane.java | 7 +++++-- .../mainframe/theme/edit/chart/ChartLabelStylePane.java | 7 +++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartFontPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartFontPane.java index 84a615f61..2b19b232e 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartFontPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartFontPane.java @@ -7,7 +7,6 @@ import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.event.UIObserverListener; import com.fr.design.gui.ibutton.UIColorButton; -import com.fr.design.gui.ibutton.UIColorButtonWithAuto; import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; @@ -57,7 +56,11 @@ public class ChartFontPane extends BasicPane { fontSizeComboBox = new UIComboBox(FONT_SIZES); bold = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold.png")); italic = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic.png")); - fontColor = new UIColorButtonWithAuto(); + fontColor = getColorButton(); + } + + protected UIColorButton getColorButton() { + return new UIColorButton(); } protected void initComponents() { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartLabelStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartLabelStylePane.java index 8eb736444..c94dd6ef2 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartLabelStylePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartLabelStylePane.java @@ -2,6 +2,8 @@ package com.fr.design.mainframe.theme.edit.chart; import com.fr.base.theme.settings.ThemedChartStyle; import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.design.gui.ibutton.UIColorButton; +import com.fr.design.gui.ibutton.UIColorButtonWithAuto; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; @@ -25,6 +27,11 @@ public class ChartLabelStylePane extends AbstractChartStylePane { autoButton = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_Auto"), Toolkit.i18nText("Fine-Design_Chart_Custom")}); chartFontPane = new ChartFontPane() { + @Override + protected UIColorButton getColorButton() { + return new UIColorButtonWithAuto(); + } + public String getUILabelText() { return Toolkit.i18nText("Fine-Design_Chart_Label_Character"); } From b74c40c8b5192222ba47073f56386cf5d25e4b73 Mon Sep 17 00:00:00 2001 From: Tommy Date: Wed, 29 Dec 2021 16:25:05 +0800 Subject: [PATCH 14/49] =?UTF-8?q?REPORT-64920=20=E5=A4=8D=E5=88=B6?= =?UTF-8?q?=E7=B2=98=E8=B4=B4=E6=8E=A5=E5=8F=A3=E6=8A=A5=E9=94=99=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/clipboard/ClipboardFilter.java | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/base/clipboard/ClipboardFilter.java b/designer-base/src/main/java/com/fr/design/base/clipboard/ClipboardFilter.java index 140a46579..22fff0d17 100644 --- a/designer-base/src/main/java/com/fr/design/base/clipboard/ClipboardFilter.java +++ b/designer-base/src/main/java/com/fr/design/base/clipboard/ClipboardFilter.java @@ -27,11 +27,7 @@ public abstract class ClipboardFilter { } public static T cut(T selection) { - - ExtraDesignClassManager manager = PluginModule.getAgent(PluginModule.ExtraDesign); - Set providers = manager.getArray(ClipboardHandlerProvider.XML_TAG); - providers.addAll(clipboardHandlerProviders); - for (ClipboardHandlerProvider provider : providers) { + for (ClipboardHandlerProvider provider : getClipboardHandlerProviders()) { if (provider.support(selection)) { selection = ((ClipboardHandlerProvider) provider).cut(selection); } @@ -40,10 +36,7 @@ public abstract class ClipboardFilter { } public static T copy(T selection) { - ExtraDesignClassManager manager = PluginModule.getAgent(PluginModule.ExtraDesign); - Set providers = manager.getArray(ClipboardHandlerProvider.XML_TAG); - providers.addAll(clipboardHandlerProviders); - for (ClipboardHandlerProvider provider : providers) { + for (ClipboardHandlerProvider provider : getClipboardHandlerProviders()) { if (provider.support(selection)) { selection = ((ClipboardHandlerProvider) provider).copy(selection); } @@ -52,15 +45,27 @@ public abstract class ClipboardFilter { } public static T paste(T selection) { - ExtraDesignClassManager manager = PluginModule.getAgent(PluginModule.ExtraDesign); - Set providers = manager.getArray(ClipboardHandlerProvider.XML_TAG); - providers.addAll(clipboardHandlerProviders); - - for (ClipboardHandlerProvider provider : providers) { + for (ClipboardHandlerProvider provider : getClipboardHandlerProviders()) { if (provider.support(selection)) { selection = ((ClipboardHandlerProvider) provider).paste(selection); } } return selection; } + + private static Set getClipboardHandlerProviders() { + Set providers = new HashSet<>(); + + for (ClipboardHandlerProvider clipboardHandlerProvider : clipboardHandlerProviders) { + providers.add(clipboardHandlerProvider); + } + + ExtraDesignClassManager manager = PluginModule.getAgent(PluginModule.ExtraDesign); + Set pluginProviders = manager.getArray(ClipboardHandlerProvider.XML_TAG); + for (ClipboardHandlerProvider clipboardHandlerProvider : pluginProviders) { + providers.add(clipboardHandlerProvider); + } + + return providers; + } } From adbc055b2946ad418c7ee237149f2f91af0fbd2b Mon Sep 17 00:00:00 2001 From: Starryi Date: Wed, 29 Dec 2021 17:33:56 +0800 Subject: [PATCH 15/49] =?UTF-8?q?REPORT-65125=20=E3=80=90=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E4=B8=BB=E9=A2=98=E3=80=91=E5=8F=8C=E5=87=BB=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=88=97=E8=AE=BE=E7=BD=AE=E6=A0=BC=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E4=BF=9D=E5=AD=98=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 格式面板必须注册GlobalNameListener才能正常updateBean,所以需要使用 AbstractAttrNoScrollPane包装格式面板 【改动思路】 同上 --- .../design/dscolumn/DSColumnAdvancedPane.java | 58 +++++++++++++++++-- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnAdvancedPane.java b/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnAdvancedPane.java index 31e81eb9a..b943778bf 100644 --- a/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnAdvancedPane.java +++ b/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnAdvancedPane.java @@ -3,7 +3,6 @@ package com.fr.design.dscolumn; import com.fr.base.BaseFormula; import com.fr.data.util.SortOrder; import com.fr.design.border.UITitledBorder; -import com.fr.design.constants.LayoutConstants; import com.fr.design.data.DesignTableDataManager; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; @@ -11,10 +10,10 @@ import com.fr.design.formula.CustomVariableResolver; import com.fr.design.formula.FormulaFactory; import com.fr.design.formula.SortFormulaPane; import com.fr.design.formula.UIFormula; +import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icombobox.UIComboBox; -import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UITextField; @@ -29,11 +28,19 @@ import com.fr.report.cell.cellattr.CellExpandAttr; import com.fr.report.cell.cellattr.core.group.DSColumn; import com.fr.report.cell.cellattr.core.group.SelectCount; -import javax.swing.*; -import java.awt.*; +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.Arrays; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.BOTTOM; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.SPECIFY; @@ -541,7 +548,7 @@ public class DSColumnAdvancedPane extends BasicPane { } } - public static class FormatAttrPane extends TextFormatPane { + public static class ReLayoutTextFormatPane extends TextFormatPane { protected void initLayout() { JComponent[][] components = new JComponent[][] { {typeComboBox, textField, roundingBox} }; @@ -571,6 +578,45 @@ public class DSColumnAdvancedPane extends BasicPane { } } + + public static class FormatAttrPane extends AbstractAttrNoScrollPane { + private TextFormatPane formatPane; + + @Override + protected JPanel createContentPane() { + this.formatPane = new ReLayoutTextFormatPane(); + return this.formatPane; + } + + @Override + public Dimension getPreferredSize() { + if (formatPane == null) { + return super.getPreferredSize(); + } + return formatPane.getPreferredSize(); + } + + protected void initContentPane() { + leftContentPane = createContentPane(); + if (leftContentPane != null) { + leftContentPane.setBorder(BorderFactory.createEmptyBorder()); + this.add(leftContentPane, BorderLayout.CENTER); + } + } + + public void populate(CellElement cellElement) { + if (cellElement != null && formatPane != null) { + formatPane.populateBean(cellElement.getStyle()); + } + } + + public void update(CellElement cellElement) { + if (cellElement != null && formatPane != null) { + cellElement.setStyle(formatPane.update(cellElement.getStyle())); + } + } + } + private void checkButtonEnabled() { if (useMultiplyNumCheckBox.isSelected()) { multiNumSpinner.setEnabled(true); From 3da3518baaa72d4ba0a64144e2884dab5de3bf63 Mon Sep 17 00:00:00 2001 From: kerry Date: Wed, 29 Dec 2021 17:45:11 +0800 Subject: [PATCH 16/49] =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-form/src/main/java/com/fr/design/fit/NewJForm.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-form/src/main/java/com/fr/design/fit/NewJForm.java b/designer-form/src/main/java/com/fr/design/fit/NewJForm.java index 9df0806de..0a12a7425 100644 --- a/designer-form/src/main/java/com/fr/design/fit/NewJForm.java +++ b/designer-form/src/main/java/com/fr/design/fit/NewJForm.java @@ -51,9 +51,9 @@ public class NewJForm extends JForm { public NewJForm(Form form) { super(form); - init(); //新建的模板都要加上新表单标志attr form.addAttrMark(NewFormMarkAttr.createNewFormAttr()); + init(); } public NewJForm(Form form, FILE file, Parameter[] parameters) { From e1beb6c99d37059e39feef82776141255958cb70 Mon Sep 17 00:00:00 2001 From: Starryi Date: Wed, 29 Dec 2021 17:57:34 +0800 Subject: [PATCH 17/49] =?UTF-8?q?REPORT-65124=20=E3=80=90=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E4=B8=BB=E9=A2=98=E3=80=91=E5=8D=95=E5=85=83=E6=A0=BC?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E7=BC=96=E8=BE=91=E7=9A=84=E6=95=88=E6=9E=9C?= =?UTF-8?q?=E6=9C=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 虽然ListCellRenderer中去除了icon,但是JNamedList实现还使用了icon的宽度来绘制内容,导致 渲染出来的编辑框有问题 【改动思路】 重新实现一个图表宽度为0的JNamedList --- .../theme/edit/CellStyleListEditPane.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/CellStyleListEditPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/CellStyleListEditPane.java index 0b5c7b61e..3f198f230 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/CellStyleListEditPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/CellStyleListEditPane.java @@ -30,9 +30,11 @@ import com.fr.stable.Nameable; import com.fr.stable.StringUtils; import javax.swing.BorderFactory; +import javax.swing.DefaultListModel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.ListModel; import javax.swing.SwingUtilities; import java.awt.BorderLayout; import java.awt.Component; @@ -101,7 +103,7 @@ public class CellStyleListEditPane extends JListControlPane { @Override protected JNameEdList createJNameList() { - JNameEdList nameEdList = super.createJNameList(); + JNameEdList nameEdList = new NoIconNamedList(new DefaultListModel()); nameEdList.setCellEditor(new UnEditableListCellEditor(new UITextField())); nameEdList.setCellRenderer(new NoIconNameableListCellRenderer()); return nameEdList; @@ -294,6 +296,17 @@ public class CellStyleListEditPane extends JListControlPane { return component; } } + private class NoIconNamedList extends JNameEdList { + + public NoIconNamedList(ListModel dataModel) { + super(dataModel); + } + + @Override + public int getIconWidth() { + return 0; + } + } private class UnEditableListCellEditor extends DefaultListCellEditor { public UnEditableListCellEditor(UITextField textField) { From 4ca15c285c85a244e96f8c2b99aad350e20af6c0 Mon Sep 17 00:00:00 2001 From: "fly.li" Date: Thu, 30 Dec 2021 10:32:05 +0800 Subject: [PATCH 18/49] =?UTF-8?q?REPORT-65090:=E5=B0=86builder=E7=9A=84?= =?UTF-8?q?=E5=BD=A2=E5=BC=8F=E6=8D=A2=E6=88=90=E6=99=AE=E9=80=9A=E7=9A=84?= =?UTF-8?q?=E5=88=9B=E5=BB=BAfocusPoint=E7=9A=84=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/actions/report/ReportEngineAttrAction.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/report/ReportEngineAttrAction.java b/designer-realize/src/main/java/com/fr/design/actions/report/ReportEngineAttrAction.java index 8e958f536..8bac8dac7 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/report/ReportEngineAttrAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/report/ReportEngineAttrAction.java @@ -74,12 +74,8 @@ public class ReportEngineAttrAction extends ReportComponentAction Date: Thu, 30 Dec 2021 11:25:15 +0800 Subject: [PATCH 19/49] =?UTF-8?q?REPORT-65170=E3=80=90=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E8=BE=B9=E6=A1=86=E3=80=91=E6=82=AC=E6=B5=AE=E5=85=83=E7=B4=A0?= =?UTF-8?q?=E7=9A=84=E9=A2=84=E8=A7=88=E5=9B=BE=EF=BC=8C=E5=8F=B3=E4=B8=8B?= =?UTF-8?q?=E7=9A=84=E8=BE=B9=E6=A1=86=E7=BA=BF=E7=9C=8B=E4=B8=8D=E5=88=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 换个方式实现主题单元格内边框样式的预览效果,之前使用setClip(null)的 问题较大,会将边框绘制到父组件的其他区域 【改动思路】 根据预览时Cell的位置计算边框的位置,使得边框可以在Cell区域内完整展示 出来,而不至于被裁剪 --- .../cell/CellRectangleStylePreviewPane.java | 8 +++- .../fr/design/cell/CellStylePreviewPane.java | 39 +++++++++++++++++-- .../com/fr/design/report/ReportStylePane.java | 2 +- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/cell/CellRectangleStylePreviewPane.java b/designer-base/src/main/java/com/fr/design/cell/CellRectangleStylePreviewPane.java index 09373189e..c0b6a0bc8 100644 --- a/designer-base/src/main/java/com/fr/design/cell/CellRectangleStylePreviewPane.java +++ b/designer-base/src/main/java/com/fr/design/cell/CellRectangleStylePreviewPane.java @@ -15,6 +15,7 @@ import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; +import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.image.BufferedImage; @@ -46,7 +47,7 @@ public class CellRectangleStylePreviewPane extends JPanel { for (int r = 0; r < ROW_COUNT; r++) { for (int c = 0; c < COLUMN_COUNT; c++) { - CellStylePreviewPane pane = new CellStylePreviewPane(false, false); + CellStylePreviewPane pane = new CellStylePreviewPane(c, r, COLUMN_COUNT, ROW_COUNT, false, false); TemplateCellElement cellElement = DefaultThemedTemplateCellElementCase.createInstance(c, r); int flags = CellBorderSourceFlag.INVALID_BORDER_SOURCE; if (supportInnerBorder) { @@ -136,6 +137,11 @@ public class CellRectangleStylePreviewPane extends JPanel { super.paint(g); } + @Override + public Rectangle getBounds() { + return super.getBounds(); + } + private void paintTransparentBackground(Graphics2D g2d, Style style) { float alpha = computeTransparentBackgroundAlpha(style); diff --git a/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java b/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java index f90c78d87..899c04cb1 100644 --- a/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java +++ b/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java @@ -18,7 +18,9 @@ import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.Rectangle; import java.awt.RenderingHints; +import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.util.List; @@ -36,10 +38,19 @@ public class CellStylePreviewPane extends JPanel { private String paintText = "Report"; private Style style = Style.DEFAULT_STYLE; + private final int column; + private final int row; + private final int columnSpan; + private final int rowSpan; + private final boolean autoClearCanvas; private final boolean paintingMosaic; - public CellStylePreviewPane(boolean autoClearCanvas, boolean paintingMosaic) { + public CellStylePreviewPane(int column, int row, int columnSpan, int rowSpan, boolean autoClearCanvas, boolean paintingMosaic) { + this.column = column; + this.row = row; + this.columnSpan = columnSpan; + this.rowSpan = rowSpan; this.autoClearCanvas = autoClearCanvas; this.paintingMosaic = paintingMosaic; transparentBackgroundWidth = transparentBackgroundImage.getWidth(null); @@ -133,8 +144,30 @@ public class CellStylePreviewPane extends JPanel { Style.paintContent(g2d, paintText, style, width, height, resolution); - g2d.setClip(null); - Style.paintBorder(g2d, style, width, height); + paintCellBorder(g2d, style); + } + + protected void paintCellBorder(Graphics2D g2d, Style style) { + float adjustLeft = 0; + float adjustTop = 0; + float adjustRight = 0; + float adjustBottom = 0; + if (column == 0) { + adjustLeft = GraphHelper.getLineStyleSize(style.getBorderLeft()) / 2.0F; + } + if (row == 0) { + adjustTop = GraphHelper.getLineStyleSize(style.getBorderTop()) / 2.0F; + } + if (column == columnSpan - 1) { + adjustRight = -GraphHelper.getLineStyleSize(style.getBorderRight()) / 2.0F; + } + if (row == rowSpan - 1) { + adjustBottom = -GraphHelper.getLineStyleSize(style.getBorderBottom()) / 2.0F; + } + + g2d.translate(adjustLeft, adjustTop); + Style.paintBorder(g2d, style, getWidth() - adjustLeft + adjustRight, getHeight() - adjustTop + adjustBottom); + g2d.translate(-adjustLeft, -adjustTop); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/report/ReportStylePane.java b/designer-realize/src/main/java/com/fr/design/report/ReportStylePane.java index 24d8a7f4c..4777d0172 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ReportStylePane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ReportStylePane.java @@ -79,7 +79,7 @@ public class ReportStylePane extends BasicPane { setLayout(FRGUIPaneFactory.createBorderLayout()); setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10)); - previewArea = new CellStylePreviewPane(true, true); + previewArea = new CellStylePreviewPane(0, 0, 1,1, true, true); followingThemeButtonGroup = new UIButtonGroup<>(FOLLOWING_THEME_STRING_ARRAYS); followingThemeButtonGroup.setAutoFireStateChanged(false); customStylePane = new CustomFloatStyleSettingPane(); From 7b0715e3b17ef624da37650c236c3244168e0cc1 Mon Sep 17 00:00:00 2001 From: Hoky <303455184@qq.com> Date: Thu, 30 Dec 2021 13:52:20 +0800 Subject: [PATCH 20/49] =?UTF-8?q?REPORT-65192=20=E5=85=AC=E5=BC=8F?= =?UTF-8?q?=E5=90=88=E6=B3=95=E6=80=A7=E6=A3=80=E6=B5=8B=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=BD=8D=E7=BD=AE=E8=BF=94=E5=9B=9E=E4=B8=8D?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=201.=E5=A4=84=E7=90=86=E4=B8=80=E4=B8=8B?= =?UTF-8?q?=E6=9E=81=E5=B0=91=E5=87=BA=E7=8E=B0=E7=9A=84=E6=83=85=E5=86=B5?= =?UTF-8?q?=EF=BC=8C=E9=BB=98=E8=AE=A4=E8=BF=94=E5=9B=9E0=E7=9A=84?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E5=90=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../formula/exception/function/FormulaCheckWrongFunction.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/formula/exception/function/FormulaCheckWrongFunction.java b/designer-base/src/main/java/com/fr/design/formula/exception/function/FormulaCheckWrongFunction.java index ce2b7cb52..5328ca56e 100644 --- a/designer-base/src/main/java/com/fr/design/formula/exception/function/FormulaCheckWrongFunction.java +++ b/designer-base/src/main/java/com/fr/design/formula/exception/function/FormulaCheckWrongFunction.java @@ -73,6 +73,8 @@ public class FormulaCheckWrongFunction implements Function Date: Thu, 30 Dec 2021 15:38:52 +0800 Subject: [PATCH 21/49] =?UTF-8?q?KERNEL-9928=20=E9=87=8D=E6=9E=84=E6=B0=B4?= =?UTF-8?q?=E5=8D=B0=E5=8A=A0=E8=BD=BD=201.=E9=80=82=E9=85=8D=E4=B8=80?= =?UTF-8?q?=E4=B8=8B=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/report/WatermarkSettingPane.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java b/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java index 0cc211c5f..d4e9a902b 100644 --- a/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java +++ b/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java @@ -42,13 +42,13 @@ public class WatermarkSettingPane extends AbstractTemplateServerSettingPane { } public void populate(WatermarkAttr watermark) { - if (!watermark.isValid()) { + if (watermark.getWaterMarkProvider().equals("TEMPLATE")) { + chooseComboBox.setSelectedIndex(SINGLE_SET); + watermarkPane.populate(watermark); + } else { chooseComboBox.setSelectedIndex(SERVER_SET); populateServerSettings(); - return; } - chooseComboBox.setSelectedIndex(SINGLE_SET); - watermarkPane.populate(watermark); } From d1fe8799fccaeb5b6ae801b55903ff6421d20cb8 Mon Sep 17 00:00:00 2001 From: Hoky <303455184@qq.com> Date: Thu, 30 Dec 2021 15:53:10 +0800 Subject: [PATCH 22/49] =?UTF-8?q?KERNEL-9928=20=E9=87=8D=E6=9E=84=E6=B0=B4?= =?UTF-8?q?=E5=8D=B0=E5=8A=A0=E8=BD=BD=201.=E6=94=B9=E6=88=90=E5=B8=B8?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/report/WatermarkSettingPane.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java b/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java index d4e9a902b..e79bfcf6b 100644 --- a/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java +++ b/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java @@ -1,5 +1,6 @@ package com.fr.design.report; +import com.fr.base.iofile.attr.WaterMarkProvideConstant; import com.fr.base.iofile.attr.WatermarkAttr; import com.fr.design.dialog.AbstractTemplateServerSettingPane; import com.fr.report.core.ReportUtils; @@ -42,7 +43,7 @@ public class WatermarkSettingPane extends AbstractTemplateServerSettingPane { } public void populate(WatermarkAttr watermark) { - if (watermark.getWaterMarkProvider().equals("TEMPLATE")) { + if (watermark.getWaterMarkProvider().equals(WaterMarkProvideConstant.TEMPLATE)) { chooseComboBox.setSelectedIndex(SINGLE_SET); watermarkPane.populate(watermark); } else { From 5cdbe2ac25a8274ef19062c92f6e012196ee27a9 Mon Sep 17 00:00:00 2001 From: hades Date: Thu, 30 Dec 2021 16:01:52 +0800 Subject: [PATCH 23/49] =?UTF-8?q?REPORT-64009=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=86=85=E5=AF=B9macOS12=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/DesignerEnvManager.java | 13 + .../design/actions/file/PreferencePane.java | 15 +- .../gui/ifilechooser/ExtensionFilter.java | 25 ++ .../gui/ifilechooser/FileChooserArgs.java | 109 +++++++ .../gui/ifilechooser/FileChooserFactory.java | 44 +++ .../gui/ifilechooser/FileChooserProvider.java | 13 + .../ifilechooser/JavaFxNativeFileChooser.java | 23 +- .../gui/ifilechooser/SwingFileChooser.java | 130 +++++++++ .../ifilechooser/SwingImageFileChooser.java | 276 ++++++++++++++++++ .../com/fr/design/os/impl/PMDialogAction.java | 5 +- .../com/fr/design/os/impl/SupportOSImpl.java | 44 +++ .../background/image/ImageFileChooser.java | 39 +-- .../java/com/fr/design/upm/UpmBridge.java | 18 +- .../main/java/com/fr/env/RemoteEnvPane.java | 6 +- .../series/PlotSeries/MapCustomPane.java | 13 +- .../share/action/InstallComponentAction.java | 28 +- 16 files changed, 733 insertions(+), 68 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/gui/ifilechooser/ExtensionFilter.java create mode 100644 designer-base/src/main/java/com/fr/design/gui/ifilechooser/FileChooserArgs.java create mode 100644 designer-base/src/main/java/com/fr/design/gui/ifilechooser/FileChooserFactory.java create mode 100644 designer-base/src/main/java/com/fr/design/gui/ifilechooser/SwingFileChooser.java create mode 100644 designer-base/src/main/java/com/fr/design/gui/ifilechooser/SwingImageFileChooser.java diff --git a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java index b8d63ca7a..85b4e4e78 100644 --- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java +++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java @@ -22,6 +22,7 @@ import com.fr.design.login.DesignerLoginType; import com.fr.design.login.config.DesignerLoginConfigManager; import com.fr.design.mainframe.vcs.VcsConfigManager; import com.fr.design.notification.SnapChatConfig; +import com.fr.design.os.impl.SupportOSImpl; import com.fr.design.port.DesignerPortContext; import com.fr.design.style.color.ColorSelectConfigManager; import com.fr.design.update.push.DesignerPushUpdateConfigManager; @@ -202,6 +203,8 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { private boolean showTemplateMissingPlugin = true; + private boolean useOptimizedUPM4Adapter; + /** * DesignerEnvManager. */ @@ -639,6 +642,14 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { this.showTemplateMissingPlugin = showTemplateMissingPlugin; } + public boolean isUseOptimizedUPM4Adapter() { + return useOptimizedUPM4Adapter; + } + + public void setUseOptimizedUPM4Adapter(boolean useOptimizedUPM4Adapter) { + this.useOptimizedUPM4Adapter = useOptimizedUPM4Adapter; + } + /** * 知否自动备份 * @@ -1829,6 +1840,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { } this.setEmbedServerLazyStartup(reader.getAttrAsBoolean("embedServerLazyStartup", false)); this.setShowTemplateMissingPlugin(reader.getAttrAsBoolean("showTemplateMissingPlugin", true)); + this.setUseOptimizedUPM4Adapter(reader.getAttrAsBoolean("useOptimizedUPM4Adapter", SupportOSImpl.MACOS_12_VERSION_ADAPTER.support())); } private void readReportPaneAttributions(XMLableReader reader) { @@ -2101,6 +2113,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { if (!this.isShowTemplateMissingPlugin()) { writer.attr("showTemplateMissingPlugin", this.isShowTemplateMissingPlugin()); } + writer.attr("useOptimizedUPM4Adapter", this.isUseOptimizedUPM4Adapter()); writer.end(); } diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java index 24e359d6f..e3dd02e95 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java @@ -15,9 +15,10 @@ import com.fr.design.gui.ibutton.UIColorButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icombobox.UIDictionaryComboBox; +import com.fr.design.gui.ifilechooser.FileChooserArgs; +import com.fr.design.gui.ifilechooser.FileChooserFactory; import com.fr.design.gui.ifilechooser.FileChooserProvider; import com.fr.design.gui.ifilechooser.FileSelectionMode; -import com.fr.design.gui.ifilechooser.JavaFxNativeFileChooser; import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.iprogressbar.UIProgressBarUI; @@ -28,7 +29,6 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.layout.VerticalFlowLayout; -import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.vcs.VcsConfigManager; import com.fr.design.mainframe.vcs.common.VcsHelper; import com.fr.design.os.impl.SupportOSImpl; @@ -50,8 +50,6 @@ import com.fr.transaction.Worker; import com.fr.workspace.WorkContext; import com.fr.workspace.server.vcs.VcsOperator; import com.fr.workspace.server.vcs.git.config.GcConfig; -import com.sun.javafx.tk.FileChooserType; -import javafx.stage.FileChooser; import javax.swing.BorderFactory; import javax.swing.BoxLayout; @@ -500,9 +498,8 @@ public class PreferencePane extends BasicPane { @Override public void actionPerformed(ActionEvent evt) { FileChooserProvider fileChooserProvider = - new JavaFxNativeFileChooser.Builder(). - fileSelectionMode(FileSelectionMode.DIR). - build(); + FileChooserFactory.createFileChooser(FileChooserArgs.newBuilder(). + setFileSelectionMode(FileSelectionMode.DIR).build()); int saveValue = fileChooserProvider.showDialog(chooseDirBtn); if (saveValue == JFileChooser.APPROVE_OPTION) { File selectedFile = fileChooserProvider.getSelectedFile(); @@ -715,7 +712,8 @@ public class PreferencePane extends BasicPane { this.portEditor.setValue(new Integer(designerEnvManager.getEmbedServerPort())); if (useOptimizedUPMCheckbox != null) { - useOptimizedUPMCheckbox.setSelected(ServerPreferenceConfig.getInstance().isUseOptimizedUPM()); + useOptimizedUPMCheckbox.setSelected(ServerPreferenceConfig.getInstance().isUseOptimizedUPM() + || DesignerEnvManager.getEnvManager().isUseOptimizedUPM4Adapter()); } useUniverseDBMCheckbox.setSelected(ServerPreferenceConfig.getInstance().isUseUniverseDBM()); @@ -790,6 +788,7 @@ public class PreferencePane extends BasicPane { designerEnvManager.setJoinProductImprove(this.joinProductImproveCheckBox.isSelected()); designerEnvManager.setEmbedServerLazyStartup(this.embedServerLazyStartupCheckBox.isSelected()); designerEnvManager.setImageCompress(this.imageCompressPanelCheckBox.isSelected()); + designerEnvManager.setUseOptimizedUPM4Adapter(this.useOptimizedUPMCheckbox.isSelected()); VcsConfigManager vcsConfigManager = designerEnvManager.getVcsConfigManager(); vcsConfigManager.setSaveInterval(this.saveIntervalEditor.getValue()); vcsConfigManager.setVcsEnable(this.vcsEnableCheckBox.isSelected()); diff --git a/designer-base/src/main/java/com/fr/design/gui/ifilechooser/ExtensionFilter.java b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/ExtensionFilter.java new file mode 100644 index 000000000..9ec582f69 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/ExtensionFilter.java @@ -0,0 +1,25 @@ +package com.fr.design.gui.ifilechooser; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/12/29 + */ +public class ExtensionFilter { + + private final String des; + private final String[] extensions; + + public ExtensionFilter(String des, String... extensions) { + this.des = des; + this.extensions = extensions; + } + + public String getDes() { + return des; + } + + public String[] getExtensions() { + return extensions; + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/ifilechooser/FileChooserArgs.java b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/FileChooserArgs.java new file mode 100644 index 000000000..b011e5b35 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/FileChooserArgs.java @@ -0,0 +1,109 @@ +package com.fr.design.gui.ifilechooser; + +/** + * 文件选择器可设置的参数集合 + * + * @author hades + * @version 10.0 + * Created by hades on 2021/12/21 + */ +public class FileChooserArgs { + + private final FileSelectionMode fileSelectionMode; + private final String filterDes; + private final String[] extensions; + private final String selectedPath; + private final ExtensionFilter[] filters; + private final String tipText; + private final boolean multiSelectionEnabled; + + public static Builder newBuilder() { + return new Builder(); + } + + private FileChooserArgs(Builder builder) { + this.fileSelectionMode = builder.fileSelectionMode; + this.filterDes = builder.filterDes; + this.extensions = builder.extensions; + this.selectedPath = builder.selectedPath; + this.filters = builder.filters; + this.tipText = builder.tipText; + this.multiSelectionEnabled = builder.multiSelectionEnabled; + } + + public FileSelectionMode getFileSelectionMode() { + return fileSelectionMode; + } + + public String getFilterDes() { + return filterDes; + } + + public String[] getExtensions() { + return extensions; + } + + public String getSelectedPath() { + return selectedPath; + } + + public ExtensionFilter[] getFilters() { + return filters; + } + + public String getTipText() { + return tipText; + } + + public boolean isMultiSelectionEnabled() { + return multiSelectionEnabled; + } + + public static class Builder { + + private FileSelectionMode fileSelectionMode; + private String filterDes; + private String[] extensions; + private String selectedPath; + private ExtensionFilter[] filters = new ExtensionFilter[0]; + private String tipText; + private boolean multiSelectionEnabled; + + public Builder setFileSelectionMode(FileSelectionMode fileSelectionMode) { + this.fileSelectionMode = fileSelectionMode; + return this; + } + + public Builder setFilter(String filterDes, String... extensions) { + this.filterDes = filterDes; + this.extensions = extensions; + return this; + } + + public Builder setSelectedPath(String selectedPath) { + this.selectedPath = selectedPath; + return this; + } + + public Builder setFilters(ExtensionFilter[] filters) { + this.filters = filters; + return this; + } + + public Builder setTipText(String tipText) { + this.tipText = tipText; + return this; + } + + public Builder setMultiSelectionEnabled(boolean multiSelectionEnabled) { + this.multiSelectionEnabled = multiSelectionEnabled; + return this; + } + + public FileChooserArgs build() { + return new FileChooserArgs(this); + } + } + + +} diff --git a/designer-base/src/main/java/com/fr/design/gui/ifilechooser/FileChooserFactory.java b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/FileChooserFactory.java new file mode 100644 index 000000000..36a53c8dc --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/FileChooserFactory.java @@ -0,0 +1,44 @@ +package com.fr.design.gui.ifilechooser; + +import com.fr.design.i18n.Toolkit; +import com.fr.design.os.impl.SupportOSImpl; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/12/21 + */ +public class FileChooserFactory { + + public static FileChooserProvider createFileChooser(FileChooserArgs fileChooserArgs) { + if (SupportOSImpl.OLD_STYLE_CHOOSER.support()) { + return new SwingFileChooser.Builder(). + setFileSelectionMode(fileChooserArgs.getFileSelectionMode()). + setFileFilter(fileChooserArgs.getFilterDes(), fileChooserArgs.getExtensions()). + setSelectedFile(fileChooserArgs.getSelectedPath()). + setMultiSelectionEnabled(fileChooserArgs.isMultiSelectionEnabled()). + setTipText(fileChooserArgs.getTipText()). + setFileFilter(fileChooserArgs.getFilters()).build(); + } else { + return new JavaFxNativeFileChooser.Builder(). + fileSelectionMode(fileChooserArgs.getFileSelectionMode()). + filter(fileChooserArgs.getFilterDes(), fileChooserArgs.getExtensions()). + currentDirectory(fileChooserArgs.getSelectedPath()). + title(fileChooserArgs.getTipText()). + filters(fileChooserArgs.getFilters()).build(); + } + } + + public static FileChooserProvider createImageFileChooser() { + if (SupportOSImpl.OLD_STYLE_CHOOSER.support()) { + return new SwingImageFileChooser(); + } else { + return new JavaFxNativeFileChooser.Builder(). + fileSelectionMode(FileSelectionMode.FILE). + title(Toolkit.i18nText("Fine-Design_Basic_Open")). + filter(Toolkit.i18nText("Fine-Design_Basic_Image_Image_Files"), "*.jpg", "*.gif", "*.png", "*.bmp"). + build(); + } + } + +} diff --git a/designer-base/src/main/java/com/fr/design/gui/ifilechooser/FileChooserProvider.java b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/FileChooserProvider.java index aa95fe27b..a5d7e9730 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ifilechooser/FileChooserProvider.java +++ b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/FileChooserProvider.java @@ -9,4 +9,17 @@ public interface FileChooserProvider { File getSelectedFile(); int showDialog(Component parent); + + + default int showOpenDialog(Component parent, String approveButtonText) { + return -1; + } + + default void setMultiSelectionEnabled(boolean multiple) { + + } + + default void setCurrentDirectory(File file) { + + } } diff --git a/designer-base/src/main/java/com/fr/design/gui/ifilechooser/JavaFxNativeFileChooser.java b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/JavaFxNativeFileChooser.java index fc4b8e368..4d3688324 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ifilechooser/JavaFxNativeFileChooser.java +++ b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/JavaFxNativeFileChooser.java @@ -4,6 +4,8 @@ package com.fr.design.gui.ifilechooser; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.log.FineLoggerFactory; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StringUtils; import com.sun.javafx.application.PlatformImpl; import javafx.application.Platform; import javafx.scene.Scene; @@ -173,10 +175,20 @@ public class JavaFxNativeFileChooser implements FileChooserProvider { this.fileSelectionMode = fileSelectionMode; } + @Override public void setCurrentDirectory(File currentDirectory) { this.currentDirectory = currentDirectory; } + @Override + public void setMultiSelectionEnabled(boolean multiple) { + this.setSelectionMode(multiple ? FileSelectionMode.MULTIPLE_FILE : FileSelectionMode.FILE); + } + + @Override + public int showOpenDialog(Component parent, String approveButtonText) { + return this.showDialog(parent); + } public static class Builder { private FileSelectionMode fileSelectionMode = FileSelectionMode.FILE; @@ -190,7 +202,9 @@ public class JavaFxNativeFileChooser implements FileChooserProvider { } public Builder title(String title) { - this.title = title; + if (StringUtils.isNotEmpty(title)) { + this.title = title; + } return this; } @@ -199,6 +213,13 @@ public class JavaFxNativeFileChooser implements FileChooserProvider { return this; } + public Builder filters(ExtensionFilter[] filters) { + for (ExtensionFilter filter : filters) { + this.filters = ArrayUtils.add(this.filters, new FileChooser.ExtensionFilter(filter.getDes(), filter.getExtensions())); + } + return this; + } + public Builder filter(String des, String... extensions) { if (extensions != null) { this.filters = new FileChooser.ExtensionFilter[]{new FileChooser.ExtensionFilter(des, extensions)}; diff --git a/designer-base/src/main/java/com/fr/design/gui/ifilechooser/SwingFileChooser.java b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/SwingFileChooser.java new file mode 100644 index 000000000..942c3430c --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/SwingFileChooser.java @@ -0,0 +1,130 @@ +package com.fr.design.gui.ifilechooser; + +import com.fr.common.annotations.Negative; +import com.fr.design.upm.UpmUtils; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StringUtils; +import java.awt.Component; +import java.io.File; +import javax.swing.JFileChooser; +import javax.swing.filechooser.FileFilter; +import javax.swing.filechooser.FileNameExtensionFilter; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/12/21 + */ +@Negative(until = "2022-6-1") +class SwingFileChooser implements FileChooserProvider { + + private final JFileChooser fileChooser; + private final Builder builder; + + private SwingFileChooser(Builder builder) { + fileChooser = new JFileChooser(); + fileChooser.setFileSelectionMode(builder.fileSelectionMode); + fileChooser.setFileFilter(builder.fileFilter); + fileChooser.setSelectedFile(builder.selectedFile); + fileChooser.setMultiSelectionEnabled(builder.multiSelectionEnabled); + this.builder = builder; + } + + @Override + public File[] getSelectedFiles() { + return fileChooser.getSelectedFiles(); + } + + @Override + public File getSelectedFile() { + return fileChooser.getSelectedFile(); + } + + @Override + public int showDialog(Component parent) { + if (StringUtils.isEmpty(builder.tipText)) { + return fileChooser.showOpenDialog(parent); + } else { + return fileChooser.showDialog(parent, builder.tipText); + } + } + + @Override + public int showOpenDialog(Component parent, String approveButtonText) { + return fileChooser.showDialog(parent, approveButtonText); + } + + @Override + public void setCurrentDirectory(File file) { + fileChooser.setCurrentDirectory(file); + } + + @Override + public void setMultiSelectionEnabled(boolean multiple) { + fileChooser.setMultiSelectionEnabled(multiple); + } + + /** + * 和一般builder不同的是 setXXX还做参数转换逻辑 + */ + public static class Builder { + + private int fileSelectionMode = JFileChooser.FILES_ONLY; + private FileFilter fileFilter; + private File selectedFile; + private boolean multiSelectionEnabled; + private String tipText; + + public Builder setFileSelectionMode(FileSelectionMode fileSelectionMode) { + if (FileSelectionMode.DIR.equals(fileSelectionMode)) { + this.fileSelectionMode = JFileChooser.DIRECTORIES_ONLY; + } else if (FileSelectionMode.FILE.equals(fileSelectionMode)) { + this.fileSelectionMode = JFileChooser.FILES_ONLY; + } else if (FileSelectionMode.MULTIPLE_FILE.equals(fileSelectionMode)) { + this.fileSelectionMode = JFileChooser.FILES_AND_DIRECTORIES; + } + return this; + } + + public Builder setFileFilter(String des, String... extension) { + if (StringUtils.isNotEmpty(des) && ArrayUtils.isNotEmpty(extension)) { + this.fileFilter = new FileNameExtensionFilter(des, UpmUtils.findMatchedExtension(extension)); + } + return this; + } + + public Builder setFileFilter(ExtensionFilter[] extensionFilters) { + StringBuilder desBuilder = new StringBuilder(); + String[] extensions = new String[0]; + for (ExtensionFilter extensionFilter : extensionFilters) { + desBuilder.append(extensionFilter.getDes()).append(" "); + extensions = ArrayUtils.addAll(extensions, UpmUtils.findMatchedExtension(extensionFilter.getExtensions())); + } + if (ArrayUtils.isNotEmpty(extensionFilters)) { + this.fileFilter = new FileNameExtensionFilter(desBuilder.toString().trim(), extensions); + } + return this; + } + + public Builder setSelectedFile(String selectedPath) { + if (StringUtils.isNotEmpty(selectedPath)) { + this.selectedFile = new File(selectedPath); + } + return this; + } + + public Builder setMultiSelectionEnabled(boolean multiSelectionEnabled) { + this.multiSelectionEnabled = multiSelectionEnabled; + return this; + } + + public Builder setTipText(String tipText) { + this.tipText = tipText; + return this; + } + + public SwingFileChooser build() { + return new SwingFileChooser(this); + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/ifilechooser/SwingImageFileChooser.java b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/SwingImageFileChooser.java new file mode 100644 index 000000000..3c0c6c1af --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/SwingImageFileChooser.java @@ -0,0 +1,276 @@ +package com.fr.design.gui.ifilechooser; + +import com.fr.base.BaseUtils; +import com.fr.common.annotations.Negative; +import com.fr.design.DesignerEnvManager; +import com.fr.design.style.ChooseFileView; +import com.fr.design.style.background.image.ExpandFileChooser; +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.util.Enumeration; +import java.util.Hashtable; +import javax.swing.filechooser.FileFilter; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/12/30 + */ +@Negative(until = "2022-6-1") +class SwingImageFileChooser extends ExpandFileChooser implements FileChooserProvider { + + public SwingImageFileChooser() { + super(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Image_Compress"),com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Open")); + ExampleFileFilter bothFilter = new ExampleFileFilter( + new String[]{"jpg", "gif", "png", "bmp"}, + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Image_Image_Files")); + bothFilter.setExtensionListInDescription(true); + this.addChoosableFileFilter(bothFilter); + this.setAcceptAllFileFilterUsed(false); + + // Create Custom FileView + ChooseFileView fileView = new ChooseFileView(); + fileView.putIcon("jpg", BaseUtils.readIcon("/com/fr/base/images/dialog/file/jpgFile.gif")); + fileView.putIcon("gif", BaseUtils.readIcon("/com/fr/base/images/dialog/file/gifFile.gif")); + fileView.putIcon("png", BaseUtils.readIcon("/com/fr/base/images/dialog/file/pngFile.png")); + fileView.putIcon("bmp", BaseUtils.readIcon("/com/fr/base/images/dialog/file/bmpFile.gif")); + + this.setFileView(fileView); + } + + @Override + public int showDialog(Component parent, String approveButtonText) { + return super.showDialog(parent, approveButtonText); + } + + @Override + public ActionListener checkAction() { + return new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + DesignerEnvManager.getEnvManager().setImageCompress(isCheckSelected()); + DesignerEnvManager.getEnvManager().saveXMLFile(); + } + }; + + } + + @Override + public int showDialog(Component parent) { + return showOpenDialog(parent); + } + + /** + * A convenience implementation of FileFilter that filters out + * all files except for those type extensions that it knows about. + *

D:\finereport\develop\code\test\TestCase\WEB-INF\reportlets\TestCase\01903.cpt + *

+ * Extensions are of the type ".foo", which is typically found on + * Windows and Unix boxes, but not on Macinthosh. Case is ignored. + *

+ * Example - create a new filter that filerts out all files + * but gif and jpg image files: + *

+ * JFileChooser chooser = new JFileChooser(); + * ExampleFileFilter filter = new ExampleFileFilter( + * new String{"gif", "jpg"}, "JPEG & GIF Images") + * chooser.addChoosableFileFilter(filter); + * chooser.showOpenDialog(this); + * + * @author Jeff Dinkins + * @version 1.12 12/03/01 + */ + class ExampleFileFilter extends FileFilter { + private Hashtable filters = null; + private String description = null; + private String fullDescription = null; + private boolean useExtensionsInDescription = true; + + /** + * Creates a file filter. If no filters are added, then all + * files are accepted. + * + * @see #addExtension + */ + public ExampleFileFilter() { + this.filters = new Hashtable(); + } + + /** + * Creates a file filter that accepts files with the given extension. + * Example: new ExampleFileFilter("jpg"); + * + * @see #addExtension + */ + public ExampleFileFilter(String extension) { + this(extension, null); + } + + /** + * Creates a file filter that accepts the given file type. + * Example: new ExampleFileFilter("jpg", "JPEG Image Images"); + *

+ * Note that the "." before the extension is not needed. If + * provided, it will be ignored. + * + * @see #addExtension + */ + public ExampleFileFilter(String extension, String description) { + this(); + if (extension != null) addExtension(extension); + if (description != null) setDescription(description); + } + + /** + * Creates a file filter from the given string array. + * Example: new ExampleFileFilter(String {"gif", "jpg"}); + *

+ * Note that the "." before the extension is not needed adn + * will be ignored. + * + * @see #addExtension + */ + public ExampleFileFilter(String[] filters) { + this(filters, null); + } + + /** + * Creates a file filter from the given string array and description. + * Example: new ExampleFileFilter(String {"gif", "jpg"}, "Gif and JPG Images"); + *

+ * Note that the "." before the extension is not needed and will be ignored. + * + * @see #addExtension + */ + public ExampleFileFilter(String[] filters, String description) { + this(); + for (int i = 0; i < filters.length; i++) { + // add filters one by one + addExtension(filters[i]); + } + if (description != null) setDescription(description); + } + + /** + * Return true if this file should be shown in the directory pane, + * false if it shouldn't. + *

+ * Files that begin with "." are ignored. + * + * @see #getExtension + */ + @Override + public boolean accept(File f) { + if (f != null) { + if (f.isDirectory()) { + return true; + } + String extension = getExtension(f); + if (extension != null && filters.get(getExtension(f)) != null) { + return true; + } + } + return false; + } + + /** + * Return the extension portion of the file's name . + * + * @see #getExtension + * @see FileFilter#accept + */ + public String getExtension(File f) { + if (f != null) { + String filename = f.getName(); + int i = filename.lastIndexOf('.'); + if (i > 0 && i < filename.length() - 1) { + return filename.substring(i + 1).toLowerCase(); + } + } + return null; + } + + /** + * Adds a filetype "dot" extension to filter against. + *

+ * For example: the following code will create a filter that filters + * out all files except those that end in ".jpg" and ".tif": + *

+ * ExampleFileFilter filter = new ExampleFileFilter(); + * filter.addExtension("jpg"); + * filter.addExtension("tif"); + *

+ * Note that the "." before the extension is not needed and will be ignored. + */ + public void addExtension(String extension) { + if (filters == null) { + filters = new Hashtable(5); + } + filters.put(extension.toLowerCase(), this); + fullDescription = null; + } + + + /** + * Returns the human readable description of this filter. For + * example: "JPEG and GIF Image Files (*.jpg, *.gif)" + * + * @see FileFilter#getDescription + */ + @Override + public String getDescription() { + if (fullDescription == null) { + if (description == null || isExtensionListInDescription()) { + fullDescription = description == null ? "(" : description + " ("; + // build the description from the extension list + Enumeration extensions = filters.keys(); + if (extensions != null) { + fullDescription += "." + extensions.nextElement(); + while (extensions.hasMoreElements()) { + fullDescription += ", ." + extensions.nextElement(); + } + } + fullDescription += ")"; + } else { + fullDescription = description; + } + } + return fullDescription; + } + + /** + * Sets the human readable description of this filter. For + * example: filter.setDescription("Gif and JPG Images"); + */ + public void setDescription(String description) { + this.description = description; + fullDescription = null; + } + + /** + * Determines whether the extension list (.jpg, .gif, etc) should + * show up in the human readable description. + *

+ * Only relevent if a description was provided in the constructor + * or using setDescription(); + */ + public void setExtensionListInDescription(boolean b) { + useExtensionsInDescription = b; + fullDescription = null; + } + + /** + * Returns whether the extension list (.jpg, .gif, etc) should + * show up in the human readable description. + *

+ * Only relevent if a description was provided in the constructor + * or using setDescription(); + */ + public boolean isExtensionListInDescription() { + return useExtensionsInDescription; + } + } + +} diff --git a/designer-base/src/main/java/com/fr/design/os/impl/PMDialogAction.java b/designer-base/src/main/java/com/fr/design/os/impl/PMDialogAction.java index 990e73ee9..16944da06 100644 --- a/designer-base/src/main/java/com/fr/design/os/impl/PMDialogAction.java +++ b/designer-base/src/main/java/com/fr/design/os/impl/PMDialogAction.java @@ -1,6 +1,7 @@ package com.fr.design.os.impl; import com.fr.config.ServerPreferenceConfig; +import com.fr.design.DesignerEnvManager; import com.fr.design.extra.WebViewDlgHelper; import com.fr.design.jdk.JdkVersion; import com.fr.design.upm.UpmFinder; @@ -23,7 +24,9 @@ public class PMDialogAction implements OSBasedAction { DesignUtils.visitEnvServerByParameters( PLUGIN_MANAGER_ROUTE,null,null); return; } - if (ServerPreferenceConfig.getInstance().isUseOptimizedUPM() || SupportOSImpl.MACOS_NEW_PLUGIN_MANAGEMENT.support()) { + if (ServerPreferenceConfig.getInstance().isUseOptimizedUPM() + || SupportOSImpl.MACOS_NEW_PLUGIN_MANAGEMENT.support() + || DesignerEnvManager.getEnvManager().isUseOptimizedUPM4Adapter()) { UpmFinder.showUPMDialog(); } else { WebViewDlgHelper.createPluginDialog(); diff --git a/designer-base/src/main/java/com/fr/design/os/impl/SupportOSImpl.java b/designer-base/src/main/java/com/fr/design/os/impl/SupportOSImpl.java index 949d77045..3ec67200d 100644 --- a/designer-base/src/main/java/com/fr/design/os/impl/SupportOSImpl.java +++ b/designer-base/src/main/java/com/fr/design/os/impl/SupportOSImpl.java @@ -7,13 +7,18 @@ import com.fr.general.GeneralContext; import com.fr.json.JSON; import com.fr.json.JSONFactory; import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; import com.fr.stable.os.Arch; import com.fr.stable.os.OperatingSystem; import com.fr.stable.os.support.SupportOS; import com.fr.workspace.WorkContext; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; import java.util.Locale; +import java.util.Scanner; /** * @author pengda @@ -142,6 +147,45 @@ public enum SupportOSImpl implements SupportOS { } }, + OLD_STYLE_CHOOSER { + + @Override + public boolean support() { + return (OperatingSystem.isLinux() && Arch.getArch() == Arch.ARM) || MACOS_12_VERSION_ADAPTER.support(); + } + }, + + MACOS_12_VERSION_ADAPTER { + @Override + public boolean support() { + return (OperatingSystem.isMacos() && getMacOsVersionNumber() >= macosMontereyVersionNum); + } + + private final int macosMontereyVersionNum = 12; + + /** + * System.getProperty("os.version") 在最新macos版本存在bug + * https://bugs.openjdk.java.net/browse/JDK-8253702 + * + * @return + */ + private int getMacOsVersionNumber() { + String result; + List command = new ArrayList<>(); + command.add("/usr/bin/sw_vers"); + command.add("-productVersion"); + try (InputStream inputStream = new ProcessBuilder(command).start().getInputStream(); + Scanner s = new Scanner(inputStream).useDelimiter("\\A")) { + result = s.hasNext() ? s.next() : StringUtils.EMPTY; + String[] versionSlice = result.split("\\."); + return Integer.parseInt(versionSlice[0]); + } catch (Exception e) { + FineLoggerFactory.getLogger().warn(e.getMessage(), e); + return 0; + } + } + }, + DESIGNER_LOGIN { @Override public boolean support() { diff --git a/designer-base/src/main/java/com/fr/design/style/background/image/ImageFileChooser.java b/designer-base/src/main/java/com/fr/design/style/background/image/ImageFileChooser.java index 9c5b1af4d..739dc81d5 100644 --- a/designer-base/src/main/java/com/fr/design/style/background/image/ImageFileChooser.java +++ b/designer-base/src/main/java/com/fr/design/style/background/image/ImageFileChooser.java @@ -4,62 +4,47 @@ package com.fr.design.style.background.image; import com.fr.design.DesignerEnvManager; -import com.fr.design.gui.ifilechooser.FileSelectionMode; -import com.fr.design.gui.ifilechooser.JavaFxNativeFileChooser; -import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.ifilechooser.FileChooserFactory; +import com.fr.design.gui.ifilechooser.FileChooserProvider; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.mainframe.share.collect.ComponentCollector; import com.fr.design.mainframe.toast.DesignerToastMsgUtil; -import javafx.stage.FileChooser; -import javax.swing.*; -import java.awt.*; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; + +import java.awt.Component; import java.io.File; +import javax.swing.SwingUtilities; /** * This class used to choose image files. */ public class ImageFileChooser { - - JavaFxNativeFileChooser javaFxNativeFileChooser; + private final FileChooserProvider fileChooserProvider; public ImageFileChooser() { - javaFxNativeFileChooser = - new JavaFxNativeFileChooser.Builder(). - fileSelectionMode(FileSelectionMode.FILE). - title(Toolkit.i18nText("Fine-Design_Basic_Open")). - filter(Toolkit.i18nText("Fine-Design_Basic_Image_Image_Files"), "*.jpg", "*.gif", "*.png", "*.bmp"). - build(); + fileChooserProvider = FileChooserFactory.createImageFileChooser(); } public int showOpenDialog(Component parent, String approveButtonText) { - return showOpenDialog(parent); + return fileChooserProvider.showOpenDialog(parent, approveButtonText); } public int showOpenDialog(Component parent) { showImageCompressMoveTip(); - return javaFxNativeFileChooser.showDialog(parent); + return fileChooserProvider.showDialog(parent); } public void setCurrentDirectory(File file) { - javaFxNativeFileChooser.setCurrentDirectory(file); + fileChooserProvider.setCurrentDirectory(file); } public void setMultiSelectionEnabled(boolean multiple) { - if (multiple) { - javaFxNativeFileChooser.setSelectionMode(FileSelectionMode.MULTIPLE_FILE); - } else { - javaFxNativeFileChooser.setSelectionMode(FileSelectionMode.FILE); - } + fileChooserProvider.setMultiSelectionEnabled(multiple); } public File getSelectedFile() { - return javaFxNativeFileChooser.getSelectedFile(); + return fileChooserProvider.getSelectedFile(); } public boolean isCheckSelected() { diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java b/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java index fee07ac46..01369116d 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java @@ -14,9 +14,10 @@ import com.fr.design.extra.exe.GetPluginPrefixExecutor; import com.fr.design.extra.exe.PluginLoginExecutor; import com.fr.design.extra.exe.ReadUpdateOnlineExecutor; import com.fr.design.extra.exe.SearchOnlineExecutor; +import com.fr.design.gui.ifilechooser.FileChooserArgs; +import com.fr.design.gui.ifilechooser.FileChooserFactory; import com.fr.design.gui.ifilechooser.FileChooserProvider; import com.fr.design.gui.ifilechooser.FileSelectionMode; -import com.fr.design.gui.ifilechooser.JavaFxNativeFileChooser; import com.fr.design.i18n.Toolkit; import com.fr.design.locale.impl.BbsRegisterMark; import com.fr.design.locale.impl.BbsResetMark; @@ -39,11 +40,12 @@ import com.teamdev.jxbrowser.chromium.Browser; import com.teamdev.jxbrowser.chromium.JSArray; import com.teamdev.jxbrowser.chromium.JSFunction; import com.teamdev.jxbrowser.chromium.JSObject; -import javafx.stage.FileChooser; -import javax.swing.*; +import java.awt.Desktop; +import javax.swing.JFileChooser; +import javax.swing.SwingUtilities; +import javax.swing.SwingWorker; import javax.swing.filechooser.FileNameExtensionFilter; -import java.awt.*; import java.io.File; import java.net.URI; import java.util.ArrayList; @@ -312,10 +314,10 @@ public class UpmBridge { RunnableFuture future = new FutureTask<>(new Callable() { @Override public String call() { - FileChooserProvider fileChooserProvider = new JavaFxNativeFileChooser.Builder(). - fileSelectionMode(FileSelectionMode.FILE). - filter(des, filter). - build(); + FileChooserProvider fileChooserProvider = FileChooserFactory.createFileChooser( + FileChooserArgs.newBuilder(). + setFileSelectionMode(FileSelectionMode.FILE). + setFilter(des, filter).build()); int result = fileChooserProvider.showDialog(UpmFinder.getDialog()); if (result == JFileChooser.APPROVE_OPTION) { return fileChooserProvider.getSelectedFile().getAbsolutePath(); diff --git a/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java b/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java index 56f90e804..31bdaa979 100644 --- a/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java +++ b/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java @@ -9,9 +9,10 @@ import com.fr.design.fun.DesignerEnvProcessor; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ifilechooser.FileChooserArgs; +import com.fr.design.gui.ifilechooser.FileChooserFactory; import com.fr.design.gui.ifilechooser.FileChooserProvider; import com.fr.design.gui.ifilechooser.FileSelectionMode; -import com.fr.design.gui.ifilechooser.JavaFxNativeFileChooser; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ipasswordfield.UIPassWordField; import com.fr.design.gui.ipasswordfield.UIPasswordFieldWithFixedLength; @@ -564,7 +565,8 @@ public class RemoteEnvPane extends BasicBeanPane { fileChooserButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { - FileChooserProvider fileChooserProvider = new JavaFxNativeFileChooser.Builder().fileSelectionMode(FileSelectionMode.FILE).build(); + FileChooserProvider fileChooserProvider = FileChooserFactory.createFileChooser(FileChooserArgs.newBuilder(). + setFileSelectionMode(FileSelectionMode.FILE).build()); int saveValue = fileChooserProvider.showDialog(SwingUtilities.getWindowAncestor(RemoteEnvPane.this)); if (saveValue == JFileChooser.APPROVE_OPTION) { File selectedFile = fileChooserProvider.getSelectedFile(); diff --git a/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/MapCustomPane.java b/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/MapCustomPane.java index 133e2fef7..a5351c74b 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/MapCustomPane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/MapCustomPane.java @@ -9,8 +9,9 @@ import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.tabledata.wrapper.TableDataWrapper; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.FilterComboBox; +import com.fr.design.gui.ifilechooser.FileChooserArgs; +import com.fr.design.gui.ifilechooser.FileChooserFactory; import com.fr.design.gui.ifilechooser.FileChooserProvider; -import com.fr.design.gui.ifilechooser.JavaFxNativeFileChooser; import com.fr.design.gui.ilable.BoldFontTextLabel; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.DesignerContext; @@ -19,8 +20,6 @@ import com.fr.general.ComparatorUtils; import com.fr.general.GeneralUtils; import com.fr.general.data.DataModel; import com.fr.log.FineLoggerFactory; -import com.fr.stable.StringUtils; -import org.apache.batik.swing.svg.SVGFileFilter; import javax.swing.JFileChooser; import javax.swing.JPanel; @@ -110,10 +109,12 @@ public class MapCustomPane extends BasicBeanPane implements AbstrctMapAt private ActionListener selectPictureActionListener = new ActionListener() { + @Override public void actionPerformed(ActionEvent evt) { - FileChooserProvider fileChooserProvider = new JavaFxNativeFileChooser.Builder(). - filter(".svg, .svgz", "*.svg", "*.svgz"). - currentDirectory(lastSelectPath).build(); + FileChooserProvider fileChooserProvider = FileChooserFactory.createFileChooser( + FileChooserArgs.newBuilder(). + setFilter(".svg, .svgz", "*.svg", "*.svgz"). + setSelectedPath(lastSelectPath).build()); int returnVal = fileChooserProvider.showDialog(DesignerContext.getDesignerFrame()); if (returnVal != JFileChooser.CANCEL_OPTION) { File selectedFile = fileChooserProvider.getSelectedFile(); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/action/InstallComponentAction.java b/designer-form/src/main/java/com/fr/design/mainframe/share/action/InstallComponentAction.java index a845759f7..e777e2b41 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/action/InstallComponentAction.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/action/InstallComponentAction.java @@ -4,10 +4,11 @@ import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.dialog.FineJOptionPane; +import com.fr.design.gui.ifilechooser.ExtensionFilter; +import com.fr.design.gui.ifilechooser.FileChooserArgs; +import com.fr.design.gui.ifilechooser.FileChooserFactory; import com.fr.design.gui.ifilechooser.FileChooserProvider; import com.fr.design.gui.ifilechooser.FileSelectionMode; -import com.fr.design.gui.ifilechooser.JavaFxNativeFileChooser; -import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.share.ui.base.FailureMessagePane; @@ -15,17 +16,13 @@ import com.fr.design.mainframe.share.ui.local.LocalWidgetRepoPane; import com.fr.design.mainframe.share.util.InstallUtils; import com.fr.design.mainframe.share.util.ShareComponentUtils; import com.fr.design.mainframe.share.util.ShareUIUtils; -import com.fr.design.os.impl.SupportOSImpl; import com.fr.form.share.record.ShareWidgetInfoManager; import com.fr.form.share.utils.ReuxUtils; import com.fr.log.FineLoggerFactory; -import com.sun.javafx.tk.FileChooserType; -import javafx.stage.FileChooser; import javax.swing.Action; import javax.swing.JFileChooser; import javax.swing.SwingWorker; -import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.event.ActionEvent; import java.io.File; import java.util.ArrayList; @@ -46,15 +43,16 @@ public class InstallComponentAction extends UpdateAction { @Override public void actionPerformed(ActionEvent e) { - FileChooserProvider fileChooserProvider = - new JavaFxNativeFileChooser.Builder(). - fileSelectionMode(FileSelectionMode.MULTIPLE_FILE). - title(Toolkit.i18nText("Fine-Design_Basic_Select")). - filters(new FileChooser.ExtensionFilter[]{ - new FileChooser.ExtensionFilter("reu", "*.reu"), - new FileChooser.ExtensionFilter("reus", "*.reus"), - new FileChooser.ExtensionFilter("zip", "*.zip")}). - build(); + FileChooserProvider fileChooserProvider = FileChooserFactory.createFileChooser( + FileChooserArgs.newBuilder(). + setFileSelectionMode(FileSelectionMode.MULTIPLE_FILE). + setMultiSelectionEnabled(true). + setTipText(Toolkit.i18nText("Fine-Design_Basic_Select")). + setFilters(new ExtensionFilter[] { + new ExtensionFilter("reu", "*.reu"), + new ExtensionFilter("reus", "*.reus"), + new ExtensionFilter("zip", "*.zip"), + }).build()); int returnValue = fileChooserProvider.showDialog(null); installComponent(returnValue, fileChooserProvider.getSelectedFiles()); } From d062899bf7f024f870cf37eff66b5479d96cfb04 Mon Sep 17 00:00:00 2001 From: Hoky <303455184@qq.com> Date: Thu, 30 Dec 2021 17:00:08 +0800 Subject: [PATCH 24/49] =?UTF-8?q?REPORT-65192=20=E5=85=AC=E5=BC=8F?= =?UTF-8?q?=E5=90=88=E6=B3=95=E6=80=A7=E6=A3=80=E6=B5=8B=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=BD=8D=E7=BD=AE=E8=BF=94=E5=9B=9E=E4=B8=8D?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=201.=E5=A6=82=E6=9E=9C=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BD=8D=E7=BD=AE=EF=BC=8C=E5=88=99=E6=A8=A1?= =?UTF-8?q?=E7=B3=8A=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/formula/FormulaPane.java | 10 +++++++--- .../exception/function/FormulaCheckWrongFunction.java | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java index 74bf3fe76..904cdf00b 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java @@ -867,8 +867,12 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { if (checkResult.isValid()) { showMessageDialog(checkResult.getTips(), checkResult.isValid()); } else { - String position = Toolkit.i18nText("Fine-Design_Basic_Formula_The") + (checkResult.getFormulaCoordinates().getColumns()) - + Toolkit.i18nText("Fine-Design_Basic_Formula_Error_Position") + " "; + int columns = checkResult.getFormulaCoordinates().getColumns(); + String position = StringUtils.EMPTY; + if (columns >= 0) { + position = Toolkit.i18nText("Fine-Design_Basic_Formula_The") + columns + + Toolkit.i18nText("Fine-Design_Basic_Formula_Error_Position") + " "; + } int confirmDialog = FineJOptionPane.showConfirmDialog( FormulaPane.this, position + messageTips, @@ -879,7 +883,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { new String[]{Toolkit.i18nText("Fine-Design_Basic_Formula_Check_Result"), Toolkit.i18nText("Fine-Design_Basic_Formula_Continue")}, Toolkit.i18nText("Fine-Design_Basic_Formula_Check_Result")); if (confirmDialog == 0) { - formulaTextArea.setCaretPosition(checkResult.getFormulaCoordinates().getColumns()); + formulaTextArea.setCaretPosition(Math.max(columns, 0)); formulaTextArea.requestFocus(); return false; } diff --git a/designer-base/src/main/java/com/fr/design/formula/exception/function/FormulaCheckWrongFunction.java b/designer-base/src/main/java/com/fr/design/formula/exception/function/FormulaCheckWrongFunction.java index 5328ca56e..417e9b37a 100644 --- a/designer-base/src/main/java/com/fr/design/formula/exception/function/FormulaCheckWrongFunction.java +++ b/designer-base/src/main/java/com/fr/design/formula/exception/function/FormulaCheckWrongFunction.java @@ -74,7 +74,7 @@ public class FormulaCheckWrongFunction implements Function Date: Thu, 23 Dec 2021 11:12:07 +0800 Subject: [PATCH 25/49] =?UTF-8?q?REPORT-65170=E3=80=90=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E8=BE=B9=E6=A1=86=E3=80=91=E6=82=AC=E6=B5=AE=E5=85=83=E7=B4=A0?= =?UTF-8?q?=E7=9A=84=E9=A2=84=E8=A7=88=E5=9B=BE=EF=BC=8C=E5=8F=B3=E4=B8=8B?= =?UTF-8?q?=E7=9A=84=E8=BE=B9=E6=A1=86=E7=BA=BF=E7=9C=8B=E4=B8=8D=E5=88=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 补充下双重线的处理逻辑 【改动思路】 同上 --- .../fr/design/cell/CellStylePreviewPane.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java b/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java index 899c04cb1..b4b382af5 100644 --- a/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java +++ b/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java @@ -7,6 +7,7 @@ import com.fr.base.ScreenResolution; import com.fr.base.Style; import com.fr.general.FRFont; import com.fr.general.IOUtils; +import com.fr.stable.Constants; import com.fr.stable.unit.PT; import javax.swing.JPanel; @@ -153,16 +154,16 @@ public class CellStylePreviewPane extends JPanel { float adjustRight = 0; float adjustBottom = 0; if (column == 0) { - adjustLeft = GraphHelper.getLineStyleSize(style.getBorderLeft()) / 2.0F; + adjustLeft = GraphHelper.getLineStyleSize(style.getBorderLeft()) / 2.0F + computeOffset4DoubleStyleBorder(style); } if (row == 0) { - adjustTop = GraphHelper.getLineStyleSize(style.getBorderTop()) / 2.0F; + adjustTop = GraphHelper.getLineStyleSize(style.getBorderTop()) / 2.0F + computeOffset4DoubleStyleBorder(style); } if (column == columnSpan - 1) { - adjustRight = -GraphHelper.getLineStyleSize(style.getBorderRight()) / 2.0F; + adjustRight = -GraphHelper.getLineStyleSize(style.getBorderRight()) / 2.0F - computeOffset4DoubleStyleBorder(style); } if (row == rowSpan - 1) { - adjustBottom = -GraphHelper.getLineStyleSize(style.getBorderBottom()) / 2.0F; + adjustBottom = -GraphHelper.getLineStyleSize(style.getBorderBottom()) / 2.0F - computeOffset4DoubleStyleBorder(style); } g2d.translate(adjustLeft, adjustTop); @@ -170,6 +171,17 @@ public class CellStylePreviewPane extends JPanel { g2d.translate(-adjustLeft, -adjustTop); } + private float computeOffset4DoubleStyleBorder(Style style) { + float offset = 0F; + if (style.getBorderLeft() == Constants.LINE_DOUBLE) { + offset += GraphHelper.getLineStyleSize(Constants.LINE_THIN) / 2.0F; + } else if (style.getBorderLeft() == Constants.LINE_DOUBLE_DOT) { + offset += GraphHelper.getLineStyleSize(Constants.LINE_DOT) / 2.0F; + } + + return offset; + } + @Override public Dimension getPreferredSize() { Dimension size = super.getPreferredSize(); From d357ff42c747d5b7a651ad7c46f33708c90598f2 Mon Sep 17 00:00:00 2001 From: hades Date: Fri, 31 Dec 2021 15:12:13 +0800 Subject: [PATCH 26/49] =?UTF-8?q?REPORT-64009=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=86=85=E5=AF=B9macOS12=E7=9A=84=E5=A4=84=E7=90=86?= =?UTF-8?q?=20fix=E9=97=A8=E6=A7=9B=E7=94=A8=E4=BE=8B=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/web/CustomIconPane.java | 9 ++++----- .../main/java/com/fr/start/module/DesignerActivator.java | 4 ++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java index 9e03dcc9d..93e65a7ea 100644 --- a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java +++ b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java @@ -4,14 +4,14 @@ import com.fr.base.BaseUtils; import com.fr.base.GraphHelper; import com.fr.base.Icon; import com.fr.base.IconManager; -import com.fr.design.designer.IntervalConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ifilechooser.FileChooserArgs; +import com.fr.design.gui.ifilechooser.FileChooserFactory; import com.fr.design.gui.ifilechooser.FileChooserProvider; -import com.fr.design.gui.ifilechooser.JavaFxNativeFileChooser; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.iscrollbar.UIScrollBar; import com.fr.design.gui.itextarea.DescriptionTextArea; @@ -451,9 +451,8 @@ public class CustomIconPane extends BasicPane { private void onBrowseButtonClicked() { // carl:不知道是否只要png格式,反正导出时全部都转成png了 - FileChooserProvider fileChooserProvider = new JavaFxNativeFileChooser.Builder(). - filter("Icon Image File", "*.jpg", "*.jpeg", "*.png", "*.gif"). - build(); + FileChooserProvider fileChooserProvider = FileChooserFactory.createFileChooser(FileChooserArgs.newBuilder(). + setFilter("Icon Image File", "*.jpg", "*.jpeg", "*.png", "*.gif").build()); if (JFileChooser.APPROVE_OPTION == fileChooserProvider.showDialog(DesignerContext.getDesignerFrame())) { String path = fileChooserProvider.getSelectedFile().getAbsolutePath(); // 图片存储有最大值48*48限制,没有超过最大值时,按原图大小存储,超过最大值后,压缩至最大值存储 diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java index 3c9b4dc9d..8ea078cd4 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java @@ -8,6 +8,7 @@ import com.fr.base.passport.FinePassportManager; import com.fr.base.process.ProcessOperator; import com.fr.chart.chartattr.ChartCollection; import com.fr.config.MarketConfig; +import com.fr.config.ServerPreferenceConfig; import com.fr.decision.update.backup.RecoverManager; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; @@ -177,6 +178,9 @@ public class DesignerActivator extends Activator implements Prepare { //生成BasicChartQuickEditor对象,需要用到ChartDesignerActivator的注册信息(DesignModuleFactory.registerChartPropertyPaneClass(ChartPropertyPane.class);) //所以不能在registerCellEditor函数中进行注册 ActionFactory.registerCellEditor(ChartCollection.class, new BasicChartQuickEditor()); + if (DesignerEnvManager.getEnvManager().isUseOptimizedUPM4Adapter() && WorkContext.getCurrent().isLocal()) { + ServerPreferenceConfig.getInstance().setUseOptimizedUPM(DesignerEnvManager.getEnvManager().isUseOptimizedUPM4Adapter()); + } } private void loadLogAppender() { From 40e5ba10a1e43a649d189dfcfbe69a34e217b7ab Mon Sep 17 00:00:00 2001 From: hades Date: Fri, 31 Dec 2021 15:18:53 +0800 Subject: [PATCH 27/49] =?UTF-8?q?REPORT-64009=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=86=85=E5=AF=B9macOS12=E7=9A=84=E5=A4=84=E7=90=86?= =?UTF-8?q?=20fix=20import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/web/CustomIconPane.java | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java index 93e65a7ea..96b584020 100644 --- a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java +++ b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java @@ -30,23 +30,34 @@ import com.fr.stable.ListMap; import com.fr.stable.StringUtils; import com.fr.transaction.Configurations; import com.fr.transaction.WorkerFacade; -import javafx.stage.FileChooser; -import javax.swing.*; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import javax.swing.ButtonGroup; +import javax.swing.ImageIcon; +import javax.swing.JComponent; +import javax.swing.JFileChooser; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JToggleButton; +import javax.swing.ScrollPaneConstants; +import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.plaf.basic.BasicButtonUI; -import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; /** * carl:自定义Icon编辑 From 2ffdfa366cc7f47efba7069b4031d80d82710d48 Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 4 Jan 2022 10:13:30 +0800 Subject: [PATCH 28/49] =?UTF-8?q?REPORT-65307=20=E4=BA=8C=E8=BD=AE?= =?UTF-8?q?=E5=86=92=E7=83=9F=E6=B5=8B=E8=AF=95-=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E9=94=81=E5=AE=9A=E4=BC=98=E5=8C=96-?= =?UTF-8?q?=E5=9B=BD=E9=99=85=E5=8C=96=E9=97=AE=E9=A2=98-=E5=BC=B9?= =?UTF-8?q?=E7=AA=97=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/lock/LockInfoDialog.java | 3 ++- .../src/main/java/com/fr/design/mainframe/ForbiddenPane.java | 3 ++- .../main/resources/com/fr/design/i18n/dimension_en.properties | 4 +++- .../resources/com/fr/design/i18n/dimension_ja_JP.properties | 4 +++- .../resources/com/fr/design/i18n/dimension_ko_KR.properties | 4 +++- .../main/resources/com/fr/design/i18n/dimension_zh.properties | 4 +++- .../resources/com/fr/design/i18n/dimension_zh_TW.properties | 4 +++- 7 files changed, 19 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/lock/LockInfoDialog.java b/designer-base/src/main/java/com/fr/design/lock/LockInfoDialog.java index 71c954924..a0fd544d5 100644 --- a/designer-base/src/main/java/com/fr/design/lock/LockInfoDialog.java +++ b/designer-base/src/main/java/com/fr/design/lock/LockInfoDialog.java @@ -3,6 +3,7 @@ package com.fr.design.lock; import com.fr.design.file.TemplateTreePane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.DesignSizeI18nManager; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; @@ -44,7 +45,7 @@ public class LockInfoDialog extends JDialog { panel.add(createControlPane(), BorderLayout.SOUTH); this.getContentPane().add(panel); this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Title_Hint")); - this.setSize(400, 160); + this.setSize(DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.lock.LockInfoDialog")); this.setResizable(false); this.setModal(true); GUICoreUtils.centerWindow(this); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/ForbiddenPane.java b/designer-base/src/main/java/com/fr/design/mainframe/ForbiddenPane.java index f90391211..9c33534c7 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/ForbiddenPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/ForbiddenPane.java @@ -2,6 +2,7 @@ package com.fr.design.mainframe; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.DesignSizeI18nManager; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.guide.base.GuideView; import com.fr.design.utils.gui.GUICoreUtils; @@ -105,7 +106,7 @@ public class ForbiddenPane extends JPanel { super.paintComponent(g2d); } }; - refreshButton.setPreferredSize(new Dimension(68, 24)); + refreshButton.setPreferredSize(DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.mainframe.ForbiddenPane.refreshButton")); refreshButton.setForeground(Color.WHITE); refreshButton.setBorderPainted(false); refreshButton.setContentAreaFilled(false); diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties index 786fe2ad0..aa4a83f3e 100644 --- a/designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties +++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties @@ -12,4 +12,6 @@ com.fr.design.web.pane.text.field=450*20 com.fr.design.actions.server.dialog=800*630 com.fr.design.report.fit.templatePane.dialog=800*400 com.fr.design.report.fit.firstColumn=120*20 -com.fr.design.report.fit.column=160*20 \ No newline at end of file +com.fr.design.report.fit.column=160*20 +com.fr.design.lock.LockInfoDialog=500*180 +com.fr.design.mainframe.ForbiddenPane.refreshButton=75*24 \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_ja_JP.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_ja_JP.properties index 0956fa79d..96558262f 100644 --- a/designer-base/src/main/resources/com/fr/design/i18n/dimension_ja_JP.properties +++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_ja_JP.properties @@ -11,4 +11,6 @@ com.fr.design.web.pane.text.field=400*20 com.fr.design.actions.server.dialog=700*630 com.fr.design.report.fit.templatePane.dialog=600*400 com.fr.design.report.fit.firstColumn=170*20 -com.fr.design.report.fit.column=100*20 \ No newline at end of file +com.fr.design.report.fit.column=100*20 +com.fr.design.lock.LockInfoDialog=500*180 +com.fr.design.mainframe.ForbiddenPane.refreshButton=68*24 \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_ko_KR.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_ko_KR.properties index 17031793f..05e20c7aa 100644 --- a/designer-base/src/main/resources/com/fr/design/i18n/dimension_ko_KR.properties +++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_ko_KR.properties @@ -11,4 +11,6 @@ com.fr.design.web.pane.text.field=450*20 com.fr.design.actions.server.dialog=700*630 com.fr.design.report.fit.templatePane.dialog=600*400 com.fr.design.report.fit.firstColumn=130*20 -com.fr.design.report.fit.column=100*20 \ No newline at end of file +com.fr.design.report.fit.column=100*20 +com.fr.design.lock.LockInfoDialog=500*180 +com.fr.design.mainframe.ForbiddenPane.refreshButton=80*24 \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties index 931b79b44..a4b2993e6 100644 --- a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties +++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties @@ -12,4 +12,6 @@ com.fr.design.web.pane.text.field=450*20 com.fr.design.actions.server.dialog=700*630 com.fr.design.report.fit.templatePane.dialog=600*400 com.fr.design.report.fit.firstColumn=80*20 -com.fr.design.report.fit.column=100*20 \ No newline at end of file +com.fr.design.report.fit.column=100*20 +com.fr.design.lock.LockInfoDialog=400*160 +com.fr.design.mainframe.ForbiddenPane.refreshButton=68*24 \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh_TW.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh_TW.properties index 8ea7fd7c2..5813cd96c 100644 --- a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh_TW.properties +++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh_TW.properties @@ -11,4 +11,6 @@ com.fr.design.web.pane.text.field=450*20 com.fr.design.actions.server.dialog=700*630 com.fr.design.report.fit.templatePane.dialog=600*400 com.fr.design.report.fit.firstColumn=80*20 -com.fr.design.report.fit.column=100*20 \ No newline at end of file +com.fr.design.report.fit.column=100*20 +com.fr.design.lock.LockInfoDialog=400*160 +com.fr.design.mainframe.ForbiddenPane.refreshButton=68*24 \ No newline at end of file From e47c0f56723a88fbc81bcac7f5392d24beb6a73e Mon Sep 17 00:00:00 2001 From: Starryi Date: Tue, 4 Jan 2022 12:43:44 +0800 Subject: [PATCH 29/49] =?UTF-8?q?REPORT-65358=20=E3=80=90=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E8=BE=B9=E6=A1=86=E3=80=91=E5=8D=95=E5=85=83=E6=A0=BC?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E5=8F=8C=E7=BA=BF=E6=98=BE=E7=A4=BA=E6=9C=89?= =?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/cell/CellStylePreviewPane.java | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java b/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java index b4b382af5..eb3c2cd7b 100644 --- a/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java +++ b/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java @@ -19,9 +19,7 @@ import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; -import java.awt.Rectangle; import java.awt.RenderingHints; -import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.util.List; @@ -154,16 +152,16 @@ public class CellStylePreviewPane extends JPanel { float adjustRight = 0; float adjustBottom = 0; if (column == 0) { - adjustLeft = GraphHelper.getLineStyleSize(style.getBorderLeft()) / 2.0F + computeOffset4DoubleStyleBorder(style); + adjustLeft = computeHalfSize4StyledBorder(style.getBorderLeft()); } if (row == 0) { - adjustTop = GraphHelper.getLineStyleSize(style.getBorderTop()) / 2.0F + computeOffset4DoubleStyleBorder(style); + adjustTop = computeHalfSize4StyledBorder(style.getBorderTop()); } if (column == columnSpan - 1) { - adjustRight = -GraphHelper.getLineStyleSize(style.getBorderRight()) / 2.0F - computeOffset4DoubleStyleBorder(style); + adjustRight = -computeHalfSize4StyledBorder(style.getBorderRight()); } if (row == rowSpan - 1) { - adjustBottom = -GraphHelper.getLineStyleSize(style.getBorderBottom()) / 2.0F - computeOffset4DoubleStyleBorder(style); + adjustBottom = -computeHalfSize4StyledBorder(style.getBorderBottom()); } g2d.translate(adjustLeft, adjustTop); @@ -171,15 +169,16 @@ public class CellStylePreviewPane extends JPanel { g2d.translate(-adjustLeft, -adjustTop); } - private float computeOffset4DoubleStyleBorder(Style style) { - float offset = 0F; - if (style.getBorderLeft() == Constants.LINE_DOUBLE) { - offset += GraphHelper.getLineStyleSize(Constants.LINE_THIN) / 2.0F; - } else if (style.getBorderLeft() == Constants.LINE_DOUBLE_DOT) { - offset += GraphHelper.getLineStyleSize(Constants.LINE_DOT) / 2.0F; + private float computeHalfSize4StyledBorder(int border) { + float size = GraphHelper.getLineStyleSize(border) / 2.0F; + + if (border == Constants.LINE_DOUBLE) { + size += GraphHelper.getLineStyleSize(Constants.LINE_THIN) / 2.0F; + } else if (border == Constants.LINE_DOUBLE_DOT) { + size += GraphHelper.getLineStyleSize(Constants.LINE_DOT) / 2.0F; } - return offset; + return size; } @Override From 9c5a1e72f5d3a95d03917d3bba4c4545604e93c3 Mon Sep 17 00:00:00 2001 From: Starryi Date: Tue, 4 Jan 2022 12:44:38 +0800 Subject: [PATCH 30/49] =?UTF-8?q?REPORT-65365=20=E3=80=90=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E8=BE=B9=E6=A1=86=E3=80=91=E5=A4=9A=E6=AC=A1=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E5=8D=95=E5=85=83=E6=A0=BC=E6=A0=B7=E5=BC=8F=E5=90=8E?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E8=87=AA=E5=AE=9A=E4=B9=89=EF=BC=8C=E8=BE=B9?= =?UTF-8?q?=E6=A1=86=E7=BA=BF=E6=9C=89=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/gui/style/BorderPane.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/style/BorderPane.java b/designer-base/src/main/java/com/fr/design/gui/style/BorderPane.java index dcead1c87..3c917ea45 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/BorderPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/BorderPane.java @@ -4,7 +4,6 @@ package com.fr.design.gui.style; * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. */ -import com.fr.base.BaseUtils; import com.fr.base.CellBorderStyle; import com.fr.base.Style; import com.fr.design.constants.LayoutConstants; @@ -17,8 +16,8 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.style.color.NewColorSelectBox; -import com.fr.general.IOUtils; import com.fr.design.utils.gui.AdjustWorkBookDefaultStyleUtils; +import com.fr.general.IOUtils; import com.fr.stable.Constants; import com.fr.stable.CoreConstants; @@ -206,6 +205,8 @@ public class BorderPane extends AbstractBasicStylePane implements GlobalNameObse } public void populateLineStyleAndColor(CellBorderStyle cellBorderStyle, boolean onlyInspectTop) { + resetLineStyleAndColorSetting(); + if (cellBorderStyle.getTopStyle() != Constants.LINE_NONE) { this.currentLineCombo.setSelectedLineStyle(cellBorderStyle.getTopStyle()); this.currentLineColorPane.setSelectObject(cellBorderStyle.getTopColor()); @@ -225,9 +226,6 @@ public class BorderPane extends AbstractBasicStylePane implements GlobalNameObse } else if (cellBorderStyle.getHorizontalStyle() != Constants.LINE_NONE) { this.currentLineCombo.setSelectedLineStyle(cellBorderStyle.getHorizontalStyle()); this.currentLineColorPane.setSelectObject(cellBorderStyle.getHorizontalColor()); - } else { - this.currentLineCombo.setSelectedLineStyle(Constants.LINE_NONE); - this.currentLineColorPane.setSelectObject(Color.BLACK); } } @@ -236,6 +234,11 @@ public class BorderPane extends AbstractBasicStylePane implements GlobalNameObse } } + private void resetLineStyleAndColorSetting() { + this.currentLineCombo.setSelectedLineStyle(Constants.LINE_NONE); + this.currentLineColorPane.setSelectObject(null); + } + @Override public Style update(Style style) { From 0862c0aecf4e66872d9984b40fef097110dc789b Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 4 Jan 2022 13:54:35 +0800 Subject: [PATCH 31/49] =?UTF-8?q?REPORT-65343=20FR11-=E6=96=B0=E8=87=AA?= =?UTF-8?q?=E9=80=82=E5=BA=94=E5=BC=80=E5=8F=91=E8=80=85=E8=B0=83=E8=AF=95?= =?UTF-8?q?-=E6=96=B0=E5=BB=BA=E6=A8=A1=E6=9D=BF=EF=BC=8C=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E7=82=B9=E5=87=BB=E5=BC=80=E5=8F=91=E8=80=85=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E8=BF=9B=E8=A1=8C=E6=A8=A1=E6=9D=BF=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E5=92=8C=E9=A2=84=E8=A7=88=EF=BC=8C=E6=AD=A4=E6=97=B6=E8=99=BD?= =?UTF-8?q?=E7=84=B6=E5=BC=B9=E5=87=BA=E4=BF=9D=E5=AD=98=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=EF=BC=8C=E4=BD=86=E5=AF=B9=E8=AF=9D=E6=A1=86?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E8=BF=98=E6=B2=A1=E6=9C=89=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=E6=A8=A1=E6=9D=BFweb=E5=B0=B1?= =?UTF-8?q?=E6=89=93=E5=BC=80=E4=BA=86=E4=B8=94=E6=8A=A5=E9=94=99=EF=BC=8C?= =?UTF-8?q?=E5=9B=A0=E4=B8=BA=E6=A8=A1=E6=9D=BF=E6=B2=A1=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=88=90=E5=8A=9F=EF=BC=9B=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=AB=AF?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E7=9C=8B=E5=88=B0=E6=A8=A1=E6=9D=BF=E8=A2=AB?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worker/save/CallbackSaveWorker.java | 9 +++++++++ .../fr/design/preview/DeveloperPreview.java | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/worker/save/CallbackSaveWorker.java b/designer-base/src/main/java/com/fr/design/worker/save/CallbackSaveWorker.java index f8a0f5d4f..ed2597f1d 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/CallbackSaveWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/CallbackSaveWorker.java @@ -63,6 +63,15 @@ public class CallbackSaveWorker extends SaveWorker { } } + public void addSuccessCallbackBeforeLast(Runnable successRunnable) { + if (successRunnableList == null) { + successRunnableList = new LinkedList<>(); + } + if (successRunnable != null) { + successRunnableList.add(successRunnableList.size() - 1, successRunnable); + } + } + public void addFailCallback(Runnable failRunnable) { if (failRunnableList == null) { failRunnableList = new LinkedList<>(); diff --git a/designer-form/src/main/java/com/fr/design/preview/DeveloperPreview.java b/designer-form/src/main/java/com/fr/design/preview/DeveloperPreview.java index 782538f63..69e514b40 100644 --- a/designer-form/src/main/java/com/fr/design/preview/DeveloperPreview.java +++ b/designer-form/src/main/java/com/fr/design/preview/DeveloperPreview.java @@ -6,10 +6,13 @@ import com.fr.design.fun.impl.AbstractPreviewProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.JForm; import com.fr.design.mainframe.JTemplate; +import com.fr.design.worker.WorkerManager; +import com.fr.design.worker.save.CallbackSaveWorker; import com.fr.general.web.ParameterConstants; import java.util.HashMap; import java.util.Map; +import javax.swing.SwingWorker; /** * Created by kerry on 2020-04-23 @@ -44,6 +47,22 @@ public class DeveloperPreview extends AbstractPreviewProvider { @Override public void onClick(JTemplate jt) { super.onClick(jt); + SwingWorker worker = WorkerManager.getInstance().getWorker(jt.getRuntimeId()); + if (worker instanceof CallbackSaveWorker) { + CallbackSaveWorker callbackSaveWorker = (CallbackSaveWorker) worker; + callbackSaveWorker.addSuccessCallbackBeforeLast(new Runnable() { + @Override + public void run() { + onPreview(jt); + } + }); + } else if (jt.getEditingFILE().isEnvFile()) { + // 已经保存在当前工作目录了 + onPreview(jt); + } + } + + private void onPreview(JTemplate jt) { MutilTempalteTabPane.getInstance().closeCurrentTpl(); jt.generateForBiddenTemplate(); } From c262e42d2359c9cf4bb46f9e43845182e967f94c Mon Sep 17 00:00:00 2001 From: Starryi Date: Tue, 4 Jan 2022 15:34:43 +0800 Subject: [PATCH 32/49] =?UTF-8?q?REPORT-65371=20=E3=80=90=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E8=BE=B9=E6=A1=86=E3=80=91=E9=99=84=E4=BB=B6=E6=88=AA?= =?UTF-8?q?=E5=9B=BE=EF=BC=8C=E6=BB=9A=E5=8A=A8=E6=9D=A1=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=9C=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 右侧留点边距给滚动条,否则滚动条会遮挡住内容 【改动思路】 同上 --- .../fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java index 8efbb1eee..d8a4096ce 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java @@ -198,7 +198,7 @@ public class CellStyleEditPane extends MultiTabPane { @Override protected void layoutContentPane() { super.layoutContentPane(); - leftcontentPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + leftcontentPane.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 5, original)); } } } From 5132d43d76d4912e9ade46a730359dbef59542e4 Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 4 Jan 2022 15:56:06 +0800 Subject: [PATCH 33/49] =?UTF-8?q?REPORT-65381=20linux=5Farm=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8-=E7=82=B9=E5=87=BB=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E6=A0=8F=E6=96=87=E4=BB=B6-=E9=80=89=E9=A1=B9=EF=BC=8C?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E5=BC=B9=E7=AA=97=E5=90=8E=E5=86=8D=E7=82=B9?= =?UTF-8?q?=E5=87=BB=20=E7=A1=AE=E5=AE=9A=E6=8C=89=E9=92=AE=EF=BC=8C?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E4=B8=8D=E6=B6=88=E5=A4=B1=EF=BC=8C=E6=97=A0?= =?UTF-8?q?=E4=BB=BB=E4=BD=95=E5=8F=8D=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/actions/file/PreferencePane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java index e3dd02e95..db94ace66 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java @@ -788,7 +788,7 @@ public class PreferencePane extends BasicPane { designerEnvManager.setJoinProductImprove(this.joinProductImproveCheckBox.isSelected()); designerEnvManager.setEmbedServerLazyStartup(this.embedServerLazyStartupCheckBox.isSelected()); designerEnvManager.setImageCompress(this.imageCompressPanelCheckBox.isSelected()); - designerEnvManager.setUseOptimizedUPM4Adapter(this.useOptimizedUPMCheckbox.isSelected()); + designerEnvManager.setUseOptimizedUPM4Adapter(this.useOptimizedUPMCheckbox != null && this.useOptimizedUPMCheckbox.isSelected()); VcsConfigManager vcsConfigManager = designerEnvManager.getVcsConfigManager(); vcsConfigManager.setSaveInterval(this.saveIntervalEditor.getValue()); vcsConfigManager.setVcsEnable(this.vcsEnableCheckBox.isSelected()); From d1321ea0815c4b4a4c4b672b38ac363728852cf6 Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 4 Jan 2022 15:56:57 +0800 Subject: [PATCH 34/49] =?UTF-8?q?REPORT-65369=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=86=85=E5=AF=B9macOS12=E7=9A=84=E5=A4=84=E7=90=86-?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E5=9B=BE=E6=A0=87=E8=AE=BE=E7=BD=AE-?= =?UTF-8?q?=E5=9C=A8=E7=82=B9=E5=87=BB=20=E9=80=89=E6=8B=A9=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=97=B6=E5=9B=9E=E5=88=B0=E4=BA=86=E7=88=B6=E5=BC=B9?= =?UTF-8?q?=E7=AA=97=E7=95=8C=E9=9D=A2=EF=BC=8C=E6=B2=A1=E6=9C=89=E5=AE=9E?= =?UTF-8?q?=E6=97=B6=E6=98=BE=E7=A4=BA=E5=87=BA=E6=9D=A5=EF=BC=8C=E8=80=8C?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E5=86=8D=E6=AC=A1=E5=8D=95=E6=9C=BA=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/web/CustomIconPane.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java index 96b584020..564b09d46 100644 --- a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java +++ b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java @@ -40,6 +40,7 @@ import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; +import java.awt.Window; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JComponent; @@ -425,7 +426,7 @@ public class CustomIconPane extends BasicPane { browseButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - onBrowseButtonClicked(); + onBrowseButtonClicked(SwingUtilities.getWindowAncestor(EditIconDialog.this)); } }); @@ -460,11 +461,11 @@ public class CustomIconPane extends BasicPane { this.add(centerPane, BorderLayout.CENTER); } - private void onBrowseButtonClicked() { + private void onBrowseButtonClicked(Window parent) { // carl:不知道是否只要png格式,反正导出时全部都转成png了 FileChooserProvider fileChooserProvider = FileChooserFactory.createFileChooser(FileChooserArgs.newBuilder(). setFilter("Icon Image File", "*.jpg", "*.jpeg", "*.png", "*.gif").build()); - if (JFileChooser.APPROVE_OPTION == fileChooserProvider.showDialog(DesignerContext.getDesignerFrame())) { + if (JFileChooser.APPROVE_OPTION == fileChooserProvider.showDialog(parent)) { String path = fileChooserProvider.getSelectedFile().getAbsolutePath(); // 图片存储有最大值48*48限制,没有超过最大值时,按原图大小存储,超过最大值后,压缩至最大值存储 Image image = BaseUtils.readImage(path); From b74f5d3bd323a8a78d7ada1bd022e41ba53d7e44 Mon Sep 17 00:00:00 2001 From: Hoky <303455184@qq.com> Date: Tue, 4 Jan 2022 16:25:24 +0800 Subject: [PATCH 35/49] =?UTF-8?q?REPORT-65290=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E6=B0=B4=E5=8D=B0=EF=BC=8C=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E6=94=B9=E5=8F=98=E6=B0=B4=E5=8D=B0=E5=BC=80=E5=85=B3=EF=BC=8C?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E6=B0=B4=E5=8D=B0=E5=8F=98=E6=88=90=E4=BA=86?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=8D=95=E7=8B=AC=E8=AE=BE=E7=BD=AE=201.?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B0=B4=E5=8D=B0=E7=9A=84isvalid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/report/WatermarkSettingPane.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java b/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java index 0cc211c5f..e79bfcf6b 100644 --- a/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java +++ b/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java @@ -1,5 +1,6 @@ package com.fr.design.report; +import com.fr.base.iofile.attr.WaterMarkProvideConstant; import com.fr.base.iofile.attr.WatermarkAttr; import com.fr.design.dialog.AbstractTemplateServerSettingPane; import com.fr.report.core.ReportUtils; @@ -42,13 +43,13 @@ public class WatermarkSettingPane extends AbstractTemplateServerSettingPane { } public void populate(WatermarkAttr watermark) { - if (!watermark.isValid()) { + if (watermark.getWaterMarkProvider().equals(WaterMarkProvideConstant.TEMPLATE)) { + chooseComboBox.setSelectedIndex(SINGLE_SET); + watermarkPane.populate(watermark); + } else { chooseComboBox.setSelectedIndex(SERVER_SET); populateServerSettings(); - return; } - chooseComboBox.setSelectedIndex(SINGLE_SET); - watermarkPane.populate(watermark); } From 354400bec3cc6a452d291af16e8097d393115dd7 Mon Sep 17 00:00:00 2001 From: Starryi Date: Wed, 5 Jan 2022 11:36:54 +0800 Subject: [PATCH 36/49] =?UTF-8?q?REPORT-64811=2010.0=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E4=B8=8B=E8=BD=BD=E7=9A=84=E7=BB=84=E4=BB=B6=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=97=A0=E6=B3=95=E8=A7=A3=E5=8E=8B=E7=BC=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 10.0设计器无法通过配置文件使用测试服务器的下载接口,导致文件 下载失败. 【改动思路】 和11.0一样优先使用配置文件中的地址 --- .../com/fr/design/mainframe/share/util/DownloadUtils.java | 4 ++-- 1 file changed, 2 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 b6375b1d6..6c6e156b0 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 @@ -38,8 +38,8 @@ import java.util.Set; * 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 = ShareComponentConstants.REU_INFO_PATH + "file/download"; + private static final String PACKAGE_REUSES_URL = 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 da9398eead40e011cfabfd388fe1d157e92c626e Mon Sep 17 00:00:00 2001 From: Starryi Date: Wed, 5 Jan 2022 17:04:09 +0800 Subject: [PATCH 37/49] =?UTF-8?q?REPORT-65449=20=E5=9C=A8=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E5=8C=85=E8=AF=A6=E6=83=85=E9=A1=B5=E6=8B=96=E6=8B=BD?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=B9=B6=E4=BF=AE=E6=94=B9=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E5=86=8D=E7=82=B9=E5=88=B0=E5=9C=A8=E7=BA=BF=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E6=A0=87=E7=AD=BE=E5=92=8C=E5=86=85=E5=AE=B9=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E4=B8=8D=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 在线组件库页面刷新为所有在线组件列表时,Tab标题没有作出对应改变,出现了Tab投显示组件包,而列表页 显示所有在线组件的情况 【改动思路】 刷新时修改标题头"组件" --- .../mainframe/share/ui/online/OnlineWidgetTabPane.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetTabPane.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetTabPane.java index b48b74e67..52ea26bc2 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetTabPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetTabPane.java @@ -24,6 +24,7 @@ public class OnlineWidgetTabPane extends JPanel { private static final String COMPONENT = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Share"); private static final String COMPONENT_PACKAGE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Share_Package"); private static final String COMPONENT_EMBED = "COMPONENT_EMBED"; + private UITabGroup headGroup; private CardLayout cardLayout; private JPanel centerPane; private boolean packagePaneCreated = false; @@ -43,7 +44,7 @@ public class OnlineWidgetTabPane extends JPanel { this.centerPane.add(new OnlineWidgetShowPane(sharableWidgets), COMPONENT); this.centerPane.add( embedFilterShowPane = new OnlineEmbedFilterShowPane(new OnlineWidgetShowPane(sharableWidgets, OnlineWidgetSortType.SALES)), COMPONENT_EMBED); //延迟组件包面板的初始化,防止组件面板里组件的缩略图和组件包面板里组件的缩略图一起加载 - UITabGroup headGroup = new UITabGroup(new String[]{COMPONENT, COMPONENT_PACKAGE}) { + this.headGroup = new UITabGroup(new String[]{COMPONENT, COMPONENT_PACKAGE}) { public void tabChanged(int newSelectedIndex) { for (TabChangeListener changeListener : tabChangeListeners) { changeListener.tabChange(newSelectedIndex); @@ -63,7 +64,7 @@ public class OnlineWidgetTabPane extends JPanel { } }; - headGroup.setSelectedIndex(0); + this.headGroup.setSelectedIndex(0); this.centerPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); jPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); @@ -84,6 +85,7 @@ public class OnlineWidgetTabPane extends JPanel { } } public void refreshPane() { + this.headGroup.setSelectedIndex(0); this.cardLayout.show(centerPane, ComponentShareUtil.needShowEmbedFilterPane() ? COMPONENT_EMBED : COMPONENT); } From 914aa241de62f41ef830b013e1b7726ef089f7cf Mon Sep 17 00:00:00 2001 From: Hoky <303455184@qq.com> Date: Wed, 5 Jan 2022 20:07:14 +0800 Subject: [PATCH 38/49] =?UTF-8?q?REPORT-65474=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E6=B0=B4=E5=8D=B0=EF=BC=8C=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E6=94=B9=E5=8F=98=E6=B0=B4=E5=8D=B0=E5=BC=80=E5=85=B3=EF=BC=8C?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E6=B0=B4=E5=8D=B0=E5=8F=98=E6=88=90=E4=BA=86?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=8D=95=E7=8B=AC=E8=AE=BE=E7=BD=AE=201.?= =?UTF-8?q?=E6=96=B0=E5=BB=BA=E6=B0=B4=E5=8D=B0=E9=BB=98=E8=AE=A4=E4=B8=8D?= =?UTF-8?q?=E6=98=AF=E6=A8=A1=E6=9D=BF=E6=B0=B4=E5=8D=B0=EF=BC=8C=E5=BD=93?= =?UTF-8?q?=E6=96=B0=E5=BB=BA=E6=A8=A1=E6=9D=BF=E6=B0=B4=E5=8D=B0=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E5=80=99=EF=BC=8C=E8=BF=9B=E8=A1=8C=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=8D=B3=E5=8F=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/report/WatermarkSettingPane.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java b/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java index e79bfcf6b..f3de6eef9 100644 --- a/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java +++ b/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java @@ -34,6 +34,7 @@ public class WatermarkSettingPane extends AbstractTemplateServerSettingPane { @Override protected void populateServerSettings() { WatermarkAttr watermarkAttr = ReportUtils.getWatermarkAttrFromServerConfig(); + watermarkAttr.setValid(true); watermarkPane.populate(watermarkAttr); } @@ -55,8 +56,9 @@ public class WatermarkSettingPane extends AbstractTemplateServerSettingPane { public WatermarkAttr update() { WatermarkAttr watermark = watermarkPane.update(); - if (isUsingServerSettings()) { - watermark.setValid(false); + if (!isUsingServerSettings()) { + watermark.setValid(true); + watermark.setWaterMarkProvider(WaterMarkProvideConstant.TEMPLATE); } return watermark; } From 113fac5ff8588a6f4f1d42d665edd15f981e61ba Mon Sep 17 00:00:00 2001 From: shine Date: Thu, 6 Jan 2022 18:04:16 +0800 Subject: [PATCH 39/49] =?UTF-8?q?CHART-22259=20feat:=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E5=8A=A0=E8=BD=BD=E6=88=96=E8=80=85=E5=88=87?= =?UTF-8?q?=E6=8D=A2env=20fvs=E6=A8=A1=E6=9D=BF=E9=87=8D=E6=96=B0=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/file/HistoryTemplateListCache.java | 23 +++---------------- .../com/fr/design/mainframe/JTemplate.java | 18 +++++++++++++++ 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java index 667592552..c00f8bb44 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java @@ -15,7 +15,6 @@ import com.fr.design.mainframe.JVirtualTemplate; import com.fr.design.ui.util.UIUtil; import com.fr.file.FILE; import com.fr.file.FileNodeFILE; -import com.fr.file.StashedFILE; import com.fr.general.ComparatorUtils; import com.fr.invoke.ClassHelper; import com.fr.log.FineLoggerFactory; @@ -25,7 +24,7 @@ import com.fr.stable.CoreConstants; import com.fr.stable.StringUtils; import com.fr.third.org.apache.commons.io.FilenameUtils; -import java.io.ByteArrayOutputStream; +import javax.swing.SwingWorker; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -33,7 +32,6 @@ import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Set; -import javax.swing.SwingWorker; /** * 历史模板缓存 @@ -360,7 +358,7 @@ public class HistoryTemplateListCache implements CallbackEvent { int size = historyList.size(); for (int i = 0; i < size; i++) { JTemplate template = historyList.get(i); - FILE file = templateToStashFile(template); + FILE file = template.templateToStashFile(); if (file != null) { stashFILEMap.put(i, file); } @@ -368,21 +366,6 @@ public class HistoryTemplateListCache implements CallbackEvent { FineLoggerFactory.getLogger().info("Env Change Template Stashed."); } - private FILE templateToStashFile(JTemplate template) { - FILE file = template.getEditingFILE(); - try { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - BaseBook target = template.getTarget(); - if (target != null) { - target.export(outputStream); - return new StashedFILE(file, outputStream.toByteArray(), template.suffix()); - } - // 如果 target == null 那么这个模板是被模板内存优化功能处理过的,不用处理 - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - return null; - } private boolean checkStash() { try { @@ -465,7 +448,7 @@ public class HistoryTemplateListCache implements CallbackEvent { FILE file = template.getEditingFILE(); boolean needReload = context == null || needReloadTemplate(context, template); if (needReload) { - FILE stashFile = templateToStashFile(template); + FILE stashFile = template.templateToStashFile(); if (stashFile != null) { FineLoggerFactory.getLogger().info("{} is being reloaded", file.getName()); template.refreshResource(stashFile); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index f1f72b48c..e990012f8 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -56,6 +56,7 @@ import com.fr.event.EventDispatcher; import com.fr.file.FILE; import com.fr.file.FILEChooserPane; import com.fr.file.MemFILE; +import com.fr.file.StashedFILE; import com.fr.form.ui.NoneWidget; import com.fr.form.ui.Widget; import com.fr.general.ComparatorUtils; @@ -84,6 +85,7 @@ import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.undo.UndoManager; import java.awt.BorderLayout; +import java.io.ByteArrayOutputStream; import java.util.Set; import java.util.concurrent.Callable; @@ -371,6 +373,22 @@ public abstract class JTemplate> PluginListenerRegistration.getInstance().stopListen(this.pluginListener); } + public FILE templateToStashFile() { + FILE file = this.getEditingFILE(); + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + BaseBook target = this.getTarget(); + if (target != null) { + target.export(outputStream); + return new StashedFILE(file, outputStream.toByteArray(), template.suffix()); + } + // 如果 target == null 那么这个模板是被模板内存优化功能处理过的,不用处理 + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return null; + } + /** * 刷新内部资源 From 370ac70ae5b6b64789694d1f5c8619e8961ddaa9 Mon Sep 17 00:00:00 2001 From: hades Date: Thu, 6 Jan 2022 18:17:04 +0800 Subject: [PATCH 40/49] =?UTF-8?q?REPORT-61615=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=9C=AA=E5=AE=89=E8=A3=85=E6=95=B0=E6=8D=AE=E9=9B=86?= =?UTF-8?q?/=E6=95=B0=E6=8D=AE=E8=BF=9E=E6=8E=A5=E6=8F=92=E4=BB=B6=20?= =?UTF-8?q?=E4=BD=86=E6=9C=8D=E5=8A=A1=E5=99=A8=E5=AE=89=E8=A3=85=E4=BA=86?= =?UTF-8?q?=20=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=AB=AF=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86/=E6=95=B0=E6=8D=AE=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E4=BC=9A=E9=80=A0=E6=88=90=E8=BF=9E=E6=8E=A5=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datapane/TableDataPaneListPane.java | 20 ++++++++++++++++++- .../datapane/connect/ConnectionListPane.java | 19 +++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java index 07d7abfb7..87e322b26 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java @@ -17,9 +17,12 @@ import com.fr.event.EventDispatcher; import com.fr.file.ProcedureConfig; import com.fr.file.TableDataConfig; import com.fr.file.TableDataOperator; +import com.fr.file.TableDataOperatorImpl; import com.fr.general.ComparatorUtils; import com.fr.general.NameObject; import com.fr.log.FineLoggerFactory; +import com.fr.rpc.ExceptionHandler; +import com.fr.rpc.RPCInvokerExceptionInfo; import com.fr.stable.ArrayUtils; import com.fr.stable.Nameable; import com.fr.stable.StringUtils; @@ -246,7 +249,13 @@ public class TableDataPaneListPane extends JListControlPane implements TableData tableDataBeans.add(new TableDataBean(nameObject.getName(), oldName, (TableData) nameObject.getObject())); } try { - WorkContext.getCurrent().get(TableDataOperator.class).saveTableData(tableDataBeans); + WorkContext.getCurrent().get(TableDataOperator.class, new ExceptionHandler() { + @Override + public Object callHandler(RPCInvokerExceptionInfo exceptionInfo) { + // 走老的方式 + return saveByOldWay(tableDataBeans); + } + }).saveTableData(new ArrayList<>(tableDataConfig.getTableDatas().keySet()), tableDataBeans); if (!WorkContext.getCurrent().isLocal()) { EventDispatcher.fire(RemoteConfigEvent.EDIT, TableDataConfig.getInstance().getNameSpace()); } @@ -255,6 +264,15 @@ public class TableDataPaneListPane extends JListControlPane implements TableData } } + private boolean saveByOldWay(List tableDataBean) { + try { + return TableDataOperatorImpl.getInstance().saveTableData(tableDataBean); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + return false; + } + } + @Override public void update(TableDataSource tds) { tds.clearAllTableData(); diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java index 0c1967ef9..1566395ed 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java @@ -16,8 +16,11 @@ import com.fr.design.i18n.Toolkit; import com.fr.event.EventDispatcher; import com.fr.file.ConnectionConfig; import com.fr.file.ConnectionOperator; +import com.fr.file.ConnectionOperatorImpl; import com.fr.general.NameObject; import com.fr.log.FineLoggerFactory; +import com.fr.rpc.ExceptionHandler; +import com.fr.rpc.RPCInvokerExceptionInfo; import com.fr.stable.ArrayUtils; import com.fr.stable.Nameable; import com.fr.stable.StringUtils; @@ -170,7 +173,12 @@ public class ConnectionListPane extends JListControlPane implements ConnectionSh connectionBeans.add(new ConnectionBean(nameObject.getName(), oldName, (Connection) nameObject.getObject())); } try { - WorkContext.getCurrent().get(ConnectionOperator.class).saveConnection(connectionBeans); + WorkContext.getCurrent().get(ConnectionOperator.class, new ExceptionHandler() { + @Override + public Object callHandler(RPCInvokerExceptionInfo exceptionInfo) { + return saveByOldWay(connectionBeans); + } + }).saveConnection(new ArrayList<>(connectionConfig.getConnections().keySet()), connectionBeans); if (!WorkContext.getCurrent().isLocal()) { EventDispatcher.fire(RemoteConfigEvent.EDIT, ConnectionConfig.getInstance().getNameSpace()); } @@ -179,6 +187,15 @@ public class ConnectionListPane extends JListControlPane implements ConnectionSh } } + private boolean saveByOldWay(List connectionBeans) { + try { + return ConnectionOperatorImpl.getInstance().saveConnection(connectionBeans); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + return false; + } + } + public static void showDialog(Window parent) { final ConnectionConfig connectionConfig = ConnectionConfig.getInstance(); final ConnectionManagerPane connectionManagerPane = new ConnectionManagerPane() { From c480db219a7c4495040c9e4c1c23b9a18cbf9409 Mon Sep 17 00:00:00 2001 From: Hoky <303455184@qq.com> Date: Fri, 7 Jan 2022 09:49:13 +0800 Subject: [PATCH 41/49] =?UTF-8?q?REPORT-65515=E3=80=90=E7=A8=B3=E5=AE=9A?= =?UTF-8?q?=E5=85=B1=E5=88=9B=E3=80=91=E5=85=AC=E5=BC=8F=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E5=99=A8-=E5=AD=98=E5=9C=A8=E6=8F=92=E4=BB=B6=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E6=97=B6=EF=BC=8C=E9=80=89=E6=8B=A9=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E5=8F=82=E6=95=B0=E5=87=BD=E6=95=B0=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E6=98=BE=E7=A4=BA=E6=9C=89=E9=97=AE=E9=A2=98?= =?UTF-8?q?=201.=E9=80=89=E4=B8=AD=E5=8F=82=E6=95=B0=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E9=BB=98=E8=AE=A4=E7=9A=84=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/formula/FormulaPane.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java index 904cdf00b..a4354ee9d 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java @@ -555,6 +555,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { private void fixFunctionNameList(String functionName) { int signOfContinue = 1; int indexOfFunction = 0; + boolean found = false; for (int i = 0; i < functionTypeListModel.size(); i++) { int signOfType = 0; FunctionGroup functionType = (FunctionGroup) functionTypeListModel.getElementAt(i); @@ -568,6 +569,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { signOfType = 1; signOfContinue = 0; indexOfFunction = k; + found = true; } } @@ -577,8 +579,12 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { } } } - functionNameList.setSelectedIndex(indexOfFunction); - functionNameList.ensureIndexIsVisible(indexOfFunction); + if (found) { + functionNameList.setSelectedIndex(indexOfFunction); + functionNameList.ensureIndexIsVisible(indexOfFunction); + } else { + functionTypeList.setSelectedIndex(0); + } } private int getBeginPosition() { From b28f91667833550fd852868c0d0a5c54148b16a9 Mon Sep 17 00:00:00 2001 From: Hoky <303455184@qq.com> Date: Fri, 7 Jan 2022 09:51:25 +0800 Subject: [PATCH 42/49] =?UTF-8?q?REPORT-65515=E3=80=90=E7=A8=B3=E5=AE=9A?= =?UTF-8?q?=E5=85=B1=E5=88=9B=E3=80=91=E5=85=AC=E5=BC=8F=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E5=99=A8-=E5=AD=98=E5=9C=A8=E6=8F=92=E4=BB=B6=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E6=97=B6=EF=BC=8C=E9=80=89=E6=8B=A9=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E5=8F=82=E6=95=B0=E5=87=BD=E6=95=B0=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E6=98=BE=E7=A4=BA=E6=9C=89=E9=97=AE=E9=A2=98?= =?UTF-8?q?=201.=E9=80=89=E6=8B=A9=E5=8F=82=E6=95=B0=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E5=80=99=E8=BF=94=E5=9B=9E=E9=BB=98=E8=AE=A4=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/formula/FormulaPane.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java index 904cdf00b..a4354ee9d 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java @@ -555,6 +555,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { private void fixFunctionNameList(String functionName) { int signOfContinue = 1; int indexOfFunction = 0; + boolean found = false; for (int i = 0; i < functionTypeListModel.size(); i++) { int signOfType = 0; FunctionGroup functionType = (FunctionGroup) functionTypeListModel.getElementAt(i); @@ -568,6 +569,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { signOfType = 1; signOfContinue = 0; indexOfFunction = k; + found = true; } } @@ -577,8 +579,12 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { } } } - functionNameList.setSelectedIndex(indexOfFunction); - functionNameList.ensureIndexIsVisible(indexOfFunction); + if (found) { + functionNameList.setSelectedIndex(indexOfFunction); + functionNameList.ensureIndexIsVisible(indexOfFunction); + } else { + functionTypeList.setSelectedIndex(0); + } } private int getBeginPosition() { From bb26dd08041630faea295b8535554341b9f26738 Mon Sep 17 00:00:00 2001 From: Starryi Date: Fri, 7 Jan 2022 10:35:45 +0800 Subject: [PATCH 43/49] =?UTF-8?q?REPORT-65576=20=E6=A1=86=E9=80=89?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=A0=BC=EF=BC=8C=E5=88=87=E6=8D=A2=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E4=BC=9A=E5=BD=B1=E5=93=8D=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=A0=BC=E5=86=85=E5=AE=B9=E7=9A=84=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 格式面板从单元格样式面板中移除后,所以不能通过样式面板配置项修改格式。 这就要求修改样式面板中的设置项,产生新的样式对象,需要保留旧的样式对象中格式配置, 保证格式不变 【改动思路】 同上 --- .../fr/design/mainframe/cell/settingpane/CellStylePane.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellStylePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellStylePane.java index ec3c1bd05..3bdd034c6 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellStylePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellStylePane.java @@ -11,7 +11,6 @@ import com.fr.design.mainframe.theme.utils.DefaultThemedTemplateCellElementCase; import com.fr.design.style.BorderUtils; import com.fr.design.utils.gui.AdjustWorkBookDefaultStyleUtils; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.report.cell.DefaultTemplateCellElement; import com.fr.report.cell.TemplateCellElement; import com.fr.report.elementcase.TemplateElementCase; @@ -20,7 +19,7 @@ import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; -import java.awt.Rectangle; +import java.text.Format; /** * @author zhou @@ -118,7 +117,10 @@ public class CellStylePane extends AbstractCellAttrPane { AdjustWorkBookDefaultStyleUtils.adjustCellElement(cellElement); elementCase.addCellElement(cellElement); } + Format format = cellElement.getStyle().getFormat(); Style style = stylePane.updateBean(); + // 格式不能通过样式面板中的配置项修改,因此需要保留 + style = style.deriveFormat(format); cellElement.setStyle(style); } }); From 346bd67c91665b512379e25b50c1e9d1a05f25db Mon Sep 17 00:00:00 2001 From: Hoky <303455184@qq.com> Date: Fri, 7 Jan 2022 10:40:25 +0800 Subject: [PATCH 44/49] =?UTF-8?q?REPORT-65290=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E6=B0=B4=E5=8D=B0=EF=BC=8C=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E6=94=B9=E5=8F=98=E6=B0=B4=E5=8D=B0=E5=BC=80=E5=85=B3=EF=BC=8C?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E6=B0=B4=E5=8D=B0=E5=8F=98=E6=88=90=E4=BA=86?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=8D=95=E7=8B=AC=E8=AE=BE=E7=BD=AE=201.?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E6=B0=B4=E5=8D=B0=E7=9A=84=E6=9C=89=E6=95=88?= =?UTF-8?q?=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/report/WatermarkSettingPane.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java b/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java index e79bfcf6b..f3de6eef9 100644 --- a/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java +++ b/designer-base/src/main/java/com/fr/design/report/WatermarkSettingPane.java @@ -34,6 +34,7 @@ public class WatermarkSettingPane extends AbstractTemplateServerSettingPane { @Override protected void populateServerSettings() { WatermarkAttr watermarkAttr = ReportUtils.getWatermarkAttrFromServerConfig(); + watermarkAttr.setValid(true); watermarkPane.populate(watermarkAttr); } @@ -55,8 +56,9 @@ public class WatermarkSettingPane extends AbstractTemplateServerSettingPane { public WatermarkAttr update() { WatermarkAttr watermark = watermarkPane.update(); - if (isUsingServerSettings()) { - watermark.setValid(false); + if (!isUsingServerSettings()) { + watermark.setValid(true); + watermark.setWaterMarkProvider(WaterMarkProvideConstant.TEMPLATE); } return watermark; } From 48d530678876a50dcd90f3970e0f73890893898d Mon Sep 17 00:00:00 2001 From: pengda Date: Fri, 7 Jan 2022 11:01:42 +0800 Subject: [PATCH 45/49] =?UTF-8?q?REPORT-65502=20=E3=80=90=E5=A4=96?= =?UTF-8?q?=E5=8C=85=E9=AA=8C=E6=94=B6=E3=80=91=E5=88=86=E9=A1=B5=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE-=E6=8C=89=E8=A1=8C=E5=88=86=E9=A1=B5=EF=BC=8C?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E8=B6=85=E8=BF=87500=E6=97=B6=E5=80=BC?= =?UTF-8?q?=E4=BC=9A=E4=BF=9D=E5=AD=98=E4=B8=BA=E7=A9=BA=E8=80=8C=E4=B8=8D?= =?UTF-8?q?=E6=98=AF1=E6=88=96500?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/webattr/PageToolBarPane.java | 17 ++++++++++------- .../fr/design/webattr/PageWebSettingPane.java | 17 ++++++++++------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/webattr/PageToolBarPane.java b/designer-realize/src/main/java/com/fr/design/webattr/PageToolBarPane.java index 48fb0c8dd..783bc0e6a 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/PageToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/PageToolBarPane.java @@ -60,7 +60,7 @@ public class PageToolBarPane extends AbstractEditToolBarPane { private UICheckBox isPageFixedRowBox; private UITextField pageFixedRowCountTextField; private static final Color TIPS_FONT_COLOR = new Color(0x8f8f92); - private static final Pattern ROW_COUNT = Pattern.compile("^[1-9][\\d]{0,2}$"); + private static final Pattern ROW_COUNT = Pattern.compile("^[1-9][\\d]*$|^0"); //固定行数分页,每页最多500行,最少1行数据 private static final int MAX_ROW_COUNT = 500; @@ -275,18 +275,21 @@ public class PageToolBarPane extends AbstractEditToolBarPane { @Override public void keyReleased(KeyEvent e) { String rowCount = pageFixedRowCountTextField.getText(); - if (!isRowCountValid(rowCount)) { - pageFixedRowCountTextField.setText(StringUtils.EMPTY); - } + pageFixedRowCountTextField.setText(convert2ValidRowCount(rowCount)); } }; - private boolean isRowCountValid(String rowCount) { + private String convert2ValidRowCount(String rowCount) { Matcher matcher = ROW_COUNT.matcher(rowCount); if (matcher.find()) { int count = Integer.parseInt(matcher.group()); - return count >= MIN_ROW_COUNT && count <= MAX_ROW_COUNT; + if (count > MAX_ROW_COUNT) { + count = MAX_ROW_COUNT; + } else if (count < MIN_ROW_COUNT) { + count = MIN_ROW_COUNT; + } + return String.valueOf(count); } - return false; + return StringUtils.EMPTY; } } diff --git a/designer-realize/src/main/java/com/fr/design/webattr/PageWebSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/PageWebSettingPane.java index 98890f6d8..1a3d323e9 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/PageWebSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/PageWebSettingPane.java @@ -41,7 +41,7 @@ public class PageWebSettingPane extends WebSettingPane { private UICheckBox isPageFixedRowBox; private UITextField pageFixedRowCountTextField; private static final Color TIPS_FONT_COLOR = new Color(0x8f8f92); - private static final Pattern ROW_COUNT = Pattern.compile("^[1-9][\\d]{0,2}$"); + private static final Pattern ROW_COUNT = Pattern.compile("^[1-9][\\d]*$|^0"); private static final String DEFAULT_ROW_COUNT = "30"; //固定行数分页,每页最多500行,最少1行数据 @@ -82,9 +82,7 @@ public class PageWebSettingPane extends WebSettingPane { @Override public void keyReleased(KeyEvent e) { String rowCount = pageFixedRowCountTextField.getText(); - if (!isRowCountValid(rowCount)) { - pageFixedRowCountTextField.setText(StringUtils.EMPTY); - } + pageFixedRowCountTextField.setText(convert2ValidRowCount(rowCount)); } }); pageFixedRowCountTextField.addInputMethodListener(new InputMethodListener() { @@ -207,12 +205,17 @@ public class PageWebSettingPane extends WebSettingPane { reportWebAttr.setWebPage(webContent); } - private boolean isRowCountValid(String rowCount) { + private String convert2ValidRowCount(String rowCount) { Matcher matcher = ROW_COUNT.matcher(rowCount); if (matcher.find()) { int count = Integer.parseInt(matcher.group()); - return count >= MIN_ROW_COUNT && count <= MAX_ROW_COUNT; + if (count > MAX_ROW_COUNT) { + count = MAX_ROW_COUNT; + } else if (count < MIN_ROW_COUNT) { + count = MIN_ROW_COUNT; + } + return String.valueOf(count); } - return false; + return StringUtils.EMPTY; } } From 51dad67c885cd3ae86497f75e754526e0b1c9b4c Mon Sep 17 00:00:00 2001 From: Starryi Date: Fri, 7 Jan 2022 20:34:35 +0800 Subject: [PATCH 46/49] =?UTF-8?q?REPORT-65613=20=E3=80=90=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E8=BE=B9=E6=A1=86=E3=80=91=E5=8D=95=E5=85=83=E6=A0=BC?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E4=BF=AE=E6=94=B9=E6=96=87=E6=9C=AC=E5=92=8C?= =?UTF-8?q?=E5=AF=B9=E9=BD=90=E6=A0=B7=E5=BC=8F=EF=BC=8C=E4=BC=9A=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E8=BE=B9=E6=A1=86=E9=85=8D=E7=BD=AE=E4=B8=A2=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 只有当前面板是边框面板的时候才会保存边框数据,所以在边框面板没有被选中的时候,就不会保存数据了 【改动思路】 遍历主题单元格样式编辑面板中的所有BasicPane,保存其中的数据 --- .../mainframe/theme/edit/cell/CellStyleEditPane.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java index d8a4096ce..846da2649 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java @@ -88,13 +88,13 @@ public class CellStyleEditPane extends MultiTabPane { @Override public ThemedCellStyle updateBean() { - AbstractBasicStylePane basicStylePane = (AbstractBasicStylePane) paneList.get(tabPane.getSelectedIndex()); - Style style = basicStylePane.update(this.cellStyle.getStyle()); + Style style = this.cellStyle.getStyle(); CellBorderStyle borderStyle = createDefaultBorderStyleFromStyle(style); - - - if (ThemedFeatureController.isCellStyleSupportInnerBorder() && basicStylePane instanceof BorderPane) { - borderStyle = ((BorderPane) basicStylePane).update(); + for (BasicPane basicPane : paneList) { + style = ((AbstractBasicStylePane) basicPane).update(style); + if (ThemedFeatureController.isCellStyleSupportInnerBorder() && basicPane instanceof BorderPane) { + borderStyle = ((BorderPane) basicPane).update(); + } } this.cellStyle.setStyle(style); From 95dadd063a69dfbd3b5cabdf5b59cf8deefc124b Mon Sep 17 00:00:00 2001 From: hades Date: Mon, 10 Jan 2022 15:26:22 +0800 Subject: [PATCH 47/49] =?UTF-8?q?REPORT-65475=20AlphaFine=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E6=85=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/manager/impl/FileSearchManager.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java index 0497828c7..327d0555c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java @@ -11,10 +11,14 @@ import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.model.SearchResult; import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; import com.fr.file.filetree.FileNode; +import com.fr.file.filetree.FileNodes; import com.fr.general.ComparatorUtils; import com.fr.json.JSONObject; +import com.fr.rpc.ExceptionHandler; +import com.fr.rpc.RPCInvokerExceptionInfo; import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; +import com.fr.workspace.WorkContext; /** @@ -74,7 +78,12 @@ public class FileSearchManager implements AlphaFineSearchProvider { return lessModelList; } AlphaFineHelper.checkCancel(); - fileNodes = FRContext.getFileNodes().list(ProjectConstants.REPORTLETS_NAME, AlphaFineConstants.FILE_EXTENSIONS, true); + fileNodes = WorkContext.getCurrent().get(FileNodes.class, new ExceptionHandler() { + @Override + public Object callHandler(RPCInvokerExceptionInfo exceptionInfo) { + return FRContext.getFileNodes().list(ProjectConstants.REPORTLETS_NAME, AlphaFineConstants.FILE_EXTENSIONS, true); + } + }).list(ProjectConstants.REPORTLETS_NAME, AlphaFineConstants.FILE_EXTENSIONS, true, false); isContainCpt = true; isContainFrm = true; doSearch(this.searchText); @@ -128,7 +137,12 @@ public class FileSearchManager implements AlphaFineSearchProvider { */ private void doFileContentSearch(String searchText) { if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainFileContent()) { - FileNode[] fileNodes = FRContext.getFileNodes().filterFiles(searchText, ProjectConstants.REPORTLETS_NAME, new FileExtension[]{FileExtension.CPT, FileExtension.FRM}, true); + FileNode[] fileNodes = WorkContext.getCurrent().get(FileNodes.class, new ExceptionHandler() { + @Override + public Object callHandler(RPCInvokerExceptionInfo exceptionInfo) { + return FRContext.getFileNodes().filterFiles(searchText, ProjectConstants.REPORTLETS_NAME, new FileExtension[]{FileExtension.CPT, FileExtension.FRM}, true); + } + }).filterFiles(searchText, ProjectConstants.REPORTLETS_NAME, new FileExtension[]{FileExtension.CPT, FileExtension.FRM}, true, false); for (FileNode node : fileNodes) { FileModel model = new FileModel(node.getName(), node.getEnvPath()); if (!AlphaFineHelper.getFilterResult().contains(model) && !filterModelList.contains(model)) { From f7ee5493b14b35af3a9a39466f3d372cc7bdadf8 Mon Sep 17 00:00:00 2001 From: Hoky <303455184@qq.com> Date: Fri, 14 Jan 2022 10:18:41 +0800 Subject: [PATCH 48/49] =?UTF-8?q?REPORT-65194=20=E5=85=AC=E5=BC=8F?= =?UTF-8?q?=E6=A8=A1=E6=8B=9F=E8=AE=A1=E7=AE=97=E8=AE=A1=E7=AE=97=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E7=9A=84=E6=8F=90=E7=A4=BA=E6=A1=86=E5=86=85=E7=9A=84?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E4=B8=8D=E6=AD=A3=E7=A1=AE=201.=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E5=BC=82=E5=B8=B8=E7=9A=84=E6=97=B6=E5=80=99=E7=BB=99?= =?UTF-8?q?warn=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/formula/FormulaPane.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java index a4354ee9d..795ff721f 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java @@ -814,10 +814,11 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { String formulaText = formulaTextArea.getText().trim(); String unSupportFormula = containsUnsupportedSimulationFormulas(formulaText); if (unSupportFormula != null) { - showMessageDialog(Toolkit.i18nText("Fine-Design_Basic_Formula_Unsupported_Formulas") + ":" + unSupportFormula, false); + showMessageDialog(Toolkit.i18nText("Fine-Design_Basic_Formula_Unsupported_Formulas") + ":" + unSupportFormula, false, true); return; } + boolean calException = false; String messageTips; FormulaCheckResult checkResult = FormulaChecker.check(formulaText); if (checkResult.grammarValid()) { @@ -846,6 +847,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { } catch (Exception ce) { //模拟计算如果出现错误,则抛出错误 calResult = ce.getMessage(); + calException = true; FineLoggerFactory.getLogger().error(ce.getMessage(), ce); messageTips = messageTips + Toolkit.i18nText("Fine-Design_Basic_Formula_Cal_Error") + ":" + calResult; } @@ -854,7 +856,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { messageTips = checkResult.getTips(); } if (checkResult.isValid()) { - showMessageDialog(messageTips, checkResult.isValid()); + showMessageDialog(messageTips, checkResult.isValid(), calException); } else { confirmCheckResult(checkResult, messageTips); } @@ -871,7 +873,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { private boolean confirmCheckResult(FormulaCheckResult checkResult, String messageTips) { if (checkResult.isValid()) { - showMessageDialog(checkResult.getTips(), checkResult.isValid()); + showMessageDialog(checkResult.getTips(), checkResult.isValid(), false); } else { int columns = checkResult.getFormulaCoordinates().getColumns(); String position = StringUtils.EMPTY; @@ -897,8 +899,8 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { return true; } - private void showMessageDialog(String message, boolean formulaValid) { - if (formulaValid) { + private void showMessageDialog(String message, boolean formulaValid, boolean calException) { + if (formulaValid && !calException) { FineJOptionPane.showMessageDialog( FormulaPane.this, message); From c65515aace725cfe9277e88c2a4d8522d7221d7d Mon Sep 17 00:00:00 2001 From: "Yuan.Wang" <1536296691@qq.com> Date: Fri, 14 Jan 2022 15:42:09 +0800 Subject: [PATCH 49/49] =?UTF-8?q?REPORT-65513=20=E5=A1=AB=E6=8A=A5-?= =?UTF-8?q?=E5=A1=AB=E6=8A=A5=E5=B1=9E=E6=80=A7=E8=AE=BE=E7=BD=AE-?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=8D=95=E5=85=83=E6=A0=BC=E7=BB=84=EF=BC=8C?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E2=80=9C=E5=8D=95=E5=85=83=E6=A0=BC=E4=B8=AA?= =?UTF-8?q?=E6=95=B0=E5=BF=85=E9=A1=BB=E7=9B=B8=E5=90=8C=E2=80=9D=E7=9A=84?= =?UTF-8?q?=E4=BA=A4=E4=BA=92=E9=80=BB=E8=BE=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/write/submit/SmartInsertDBManipulationPane.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java b/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java index 3818f1ac8..193fd4de9 100644 --- a/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java +++ b/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java @@ -291,6 +291,10 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { @Override public void checkValid() throws Exception { KeyColumnTableModel model = (KeyColumnTableModel) keyColumnValuesTable.getModel(); + checkModelValid(model); + } + + private void checkModelValid(KeyColumnTableModel model) throws Exception { int cnt = model.getRowCount(); int groupLength = -1; for (int i = 0; i < cnt; i++) { @@ -374,7 +378,8 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { */ @Override public void checkValid() throws Exception { - SmartInsertDBManipulationPane.this.checkValid(); + KeyColumnTableModel model = (KeyColumnTableModel) table.getModel(); + SmartInsertDBManipulationPane.this.checkModelValid(model); } private SelectionListener listener = new SelectionListener() {