diff --git a/build.gradle b/build.gradle index 6446da404..3580cbae0 100644 --- a/build.gradle +++ b/build.gradle @@ -64,7 +64,7 @@ allprojects { implementation 'org.swingexplorer:swexpl:2.0.1' implementation 'org.swingexplorer:swag:1.0' implementation 'net.java.dev.jna:jna:5.4.0' - implementation 'org.apache.tomcat:tomcat-catalina:8.5.32' + implementation 'org.apache.tomcat:tomcat-catalina:8.5.57' implementation 'io.socket:socket.io-client:0.7.0' implementation 'com.fr.third:fine-third:' + frVersion implementation 'com.fr.core:fine-core:' + frDevVersion @@ -73,6 +73,7 @@ allprojects { implementation 'com.fr.decision:fine-decision:' + frVersion implementation 'com.fr.schedule:fine-schedule:' + frVersion implementation 'com.fr.report:fine-report-engine:' + frDevVersion + implementation 'com.fr.design:design-i18n:' + frDevVersion testImplementation 'org.easymock:easymock:3.5.1' testImplementation 'org.powermock:powermock-module-junit4:1.7.1' testImplementation 'org.powermock:powermock-api-easymock:1.7.1' diff --git a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java index 88d2625d0..6f1c94eee 100644 --- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java +++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java @@ -163,7 +163,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { * alphafine */ private AlphaFineConfigManager alphaFineConfigManager = AlphaFineConfigManager.getInstance(); - + /** * 阅后即焚的配置项 */ @@ -218,14 +218,9 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { if (needCheckEnv) { checkNameEnvMap(); } - - GeneralContext.addEnvChangedListener(new EnvChangedListener() { - @Override - public void envChanged() { - - designerEnvManager.setCurrentDirectoryPrefix(FILEFactory.ENV_PREFIX); - designerEnvManager.setDialogCurrentDirectory(ProjectConstants.REPORTLETS_NAME); - } + GeneralContext.addEnvChangedListener(() -> { + designerEnvManager.setCurrentDirectoryPrefix(FILEFactory.ENV_PREFIX); + designerEnvManager.setDialogCurrentDirectory(ProjectConstants.REPORTLETS_NAME); }); } @@ -1424,7 +1419,9 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { * @return */ private Locale checkLocale(Locale locale) { - return SupportLocale.getInstance().isSupport(locale) ? locale : Locale.US; + // Yvan: REPORT-39341,有一些情况下,获取到的是zh-Hans-CN这种,需要找到项目中最匹配的Locale + return SupportLocale.getInstance().isSupport(locale) ? + locale : SupportLocale.getInstance().getSuitableLocale(locale); } private void readReportLengthUnit(XMLableReader reader) { @@ -1475,7 +1472,10 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { } public String getUUID() { - return StringUtils.isEmpty(uuid) ? UUID.randomUUID().toString() : uuid; + if (StringUtils.isEmpty(uuid)) { + uuid = UUID.randomUUID().toString(); + } + return uuid; } public int getActiveKeyStatus() { @@ -1578,7 +1578,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { } } } - + private void readSnapChatConfig(XMLableReader reader) { reader.readXMLObject(this.snapChatConfig = SnapChatConfig.getInstance()); } @@ -1801,14 +1801,14 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { writeSnapChatConfig(writer); writer.end(); } - + private void writeSnapChatConfig(XMLPrintWriter writer) { - + if (this.snapChatConfig != null) { this.snapChatConfig.writeXML(writer); } } - + private void writeAlphaFineAttr(XMLPrintWriter writer) { if (this.alphaFineConfigManager != null) { this.alphaFineConfigManager.writeXML(writer); 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 23e6f4613..d1beacb1d 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 @@ -218,7 +218,7 @@ public class DBTableDataPane extends AbstractTableDataPane { paramTexts[0] = SqlUtils.tryPureSqlText(sqlTextPane.getText()); paramTexts[1] = SqlUtils.tryPureSqlText(pageQuery); List existParameterList = editorPane.update(); - Parameter[] ps = existParameterList == null ? new Parameter[0] : existParameterList.toArray(new Parameter[existParameterList.size()]); + Parameter[] ps = existParameterList == null ? new Parameter[0] : existParameterList.toArray(new Parameter[0]); editorPane.populate(ParameterUtils.analyzeAndUnionParameters(paramTexts, ps)); } diff --git a/designer-base/src/main/java/com/fr/design/dialog/ErrorDialog.java b/designer-base/src/main/java/com/fr/design/dialog/ErrorDialog.java index 21042a57a..11a49fafe 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/ErrorDialog.java +++ b/designer-base/src/main/java/com/fr/design/dialog/ErrorDialog.java @@ -35,7 +35,7 @@ public abstract class ErrorDialog extends JDialog implements ActionListener { JPanel messagePane = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); UILabel boldFontLabel = new UILabel(message); UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Send_Report_To_Us")); - Font font = FRFont.getInstance("Dialog", Font.BOLD, 20); + Font font = FRFont.getInstance(label.getFont().getFontName(), Font.BOLD, 20); boldFontLabel.setFont(font); messagePane.add(boldFontLabel); messagePane.add(label); diff --git a/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java b/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java index 2f30f70b9..37a671eeb 100644 --- a/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java +++ b/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java @@ -40,6 +40,12 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo { private WorkspaceConnectionInfo connection; + /** + * 标记下新创建的远程工作目录 兼容存留的远程目录客户升级后再回退 读取为密文 + * 仅保证当前新增是加密的 + */ + private boolean newCreated; + public static RemoteDesignerWorkspaceInfo create(WorkspaceConnectionInfo connection) { RemoteDesignerWorkspaceInfo info = new RemoteDesignerWorkspaceInfo(); info.connection = connection; @@ -79,12 +85,21 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo { return remindTime; } + public boolean isNewCreated() { + return newCreated; + } + + public void setNewCreated(boolean newCreated) { + this.newCreated = newCreated; + } + @Override public void readXML(XMLableReader reader) { if (reader.isAttr()) { this.name = reader.getAttrAsString("name", StringUtils.EMPTY); this.remindTime = reader.getAttrAsString("remindTime", StringUtils.EMPTY); + this.newCreated = reader.getAttrAsBoolean("newCreated", false); } if (reader.isChildNode()) { String tagName = reader.getTagName(); @@ -92,32 +107,49 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo { String url = reader.getAttrAsString("url", StringUtils.EMPTY); String username = reader.getAttrAsString("username", StringUtils.EMPTY); //密码解密 - String password = SecurityToolbox.defaultDecrypt(reader.getAttrAsString("password", StringUtils.EMPTY).replaceAll(" ", "\r\n")); + String password = SecurityToolbox.defaultDecrypt(reader.getAttrAsString("password", StringUtils.EMPTY).replaceAll(StringUtils.BLANK, "\r\n")); String certPath = reader.getAttrAsString("certPath", StringUtils.EMPTY); - String certSecretKey = reader.getAttrAsString("certSecretKey", StringUtils.EMPTY); + String certSecretKey = readCertSecretKey(reader); boolean rememberPwd = reader.getAttrAsBoolean("rememberPwd", true); this.connection = new WorkspaceConnectionInfo(url, username, password, certPath, certSecretKey, rememberPwd); } } } + private String readCertSecretKey(XMLableReader reader) { + if (isNewCreated()) { + return SecurityToolbox.defaultDecrypt(reader.getAttrAsString("certSecretKey", StringUtils.EMPTY).replaceAll(StringUtils.BLANK, "\r\n")); + } else { + return reader.getAttrAsString("certSecretKey", StringUtils.EMPTY); + } + } + @Override public void writeXML(XMLPrintWriter writer) { writer.attr("name", name); writer.attr("remindTime", remindTime); + writer.attr("newCreated", isNewCreated()); if (this.connection != null) { writer.startTAG("Connection"); writer.attr("url", connection.getUrl()); writer.attr("username", connection.getUserName()); writer.attr("password", SecurityToolbox.defaultEncrypt(connection.getPassword())); writer.attr("certPath", connection.getCertPath()); - writer.attr("certSecretKey", connection.getCertSecretKey()); + writeCertSecretKey(writer); writer.attr("rememberPwd", connection.isRememberPwd()); writer.end(); } } + private void writeCertSecretKey(XMLPrintWriter writer) { + if (isNewCreated()) { + writer.attr("certSecretKey", SecurityToolbox.defaultEncrypt(connection.getCertSecretKey())); + } else { + writer.attr("certSecretKey", connection.getCertSecretKey()); + } + } + @Override @SuppressWarnings("squid:S2975") public Object clone() throws CloneNotSupportedException { diff --git a/designer-base/src/main/java/com/fr/design/extra/LoginDialog.java b/designer-base/src/main/java/com/fr/design/extra/LoginDialog.java index 42791ad52..8fbb2d2a5 100644 --- a/designer-base/src/main/java/com/fr/design/extra/LoginDialog.java +++ b/designer-base/src/main/java/com/fr/design/extra/LoginDialog.java @@ -24,7 +24,7 @@ public class LoginDialog extends UIDialog { } private void init(Component pane) { - if (StableUtils.getMajorJavaVersion() == 8) { + if (StableUtils.getMajorJavaVersion() >= 8) { setUndecorated(true); } JPanel panel = (JPanel) getContentPane(); diff --git a/designer-base/src/main/java/com/fr/design/extra/ShopDialog.java b/designer-base/src/main/java/com/fr/design/extra/ShopDialog.java index 72fa6149b..69ad0f08d 100644 --- a/designer-base/src/main/java/com/fr/design/extra/ShopDialog.java +++ b/designer-base/src/main/java/com/fr/design/extra/ShopDialog.java @@ -16,7 +16,7 @@ public class ShopDialog extends UIDialog { public ShopDialog(Frame frame, BasicPane pane) { super(frame); - if (StableUtils.getMajorJavaVersion() == 8) { + if (StableUtils.getMajorJavaVersion() >= 8) { setUndecorated(true); } JPanel panel = (JPanel) getContentPane(); diff --git a/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java b/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java index d7f858b65..628adfec6 100644 --- a/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java +++ b/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java @@ -159,7 +159,7 @@ public class WebViewDlgHelper { } public static void createLoginDialog() { - if (StableUtils.getMajorJavaVersion() == VERSION_8) { + if (StableUtils.getMajorJavaVersion() >= VERSION_8) { File file = new File(StableUtils.pathJoin(installHome, "scripts")); if (!file.exists()) { confirmDownLoadShopJS(); @@ -172,7 +172,7 @@ public class WebViewDlgHelper { public static void createLoginDialog(Window parent) { - if (StableUtils.getMajorJavaVersion() == VERSION_8) { + if (StableUtils.getMajorJavaVersion() >= VERSION_8) { File file = new File(StableUtils.pathJoin(installHome, "scripts")); if (!file.exists()) { confirmDownLoadShopJS(); diff --git a/designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java b/designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java index e94b18269..10ea21a9a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java @@ -200,13 +200,17 @@ public class ColumnRowPane extends JPanel implements UIObserver { column = 0; } removeDocumentListener(d); - columnSpinner.setValue(StableUtils.convertIntToABC(column + 1)); + String colValue = StableUtils.convertIntToABC(column + 1); + columnSpinner.setValue(colValue); + ((DefaultEditor) columnSpinner.getEditor()).getTextField().setText(colValue); int row = columnRow.getRow(); // shoc 小于0就蹦了 if (row < 0) { row = 0; } - rowSpinner.setValue("" + (row + 1)); + String rowValue = Integer.toString(row + 1); + rowSpinner.setValue(rowValue); + ((DefaultEditor) rowSpinner.getEditor()).getTextField().setText(rowValue); addDocumentListener(d); fireChanged(); } diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java index 37e9db154..9906749b7 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java @@ -3,10 +3,10 @@ */ package com.fr.design.gui.icombobox; +import com.fr.design.gui.UILookAndFeel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.log.FineLoggerFactory; -import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; import javax.swing.JFrame; import javax.swing.JPanel; @@ -23,7 +23,7 @@ import java.awt.event.ItemListener; public class LazyComboBoxTest { public static void main(String[] args) { try { - UIManager.setLookAndFeel(new WindowsLookAndFeel()); + UIManager.setLookAndFeel(new UILookAndFeel()); } catch (UnsupportedLookAndFeelException e1) { FineLoggerFactory.getLogger().error(e1.getMessage(), e1); } diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java index df07acf1a..77407a3ed 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java @@ -19,7 +19,7 @@ import java.awt.event.MouseMotionListener; public class UIEastResizableContainer extends JPanel { private static final long serialVersionUID = 1854340560790476907L; - public static final int MAX_CONTAINER_WIDTH = 500; + public static final int MAX_CONTAINER_WIDTH = 340; public static final int MIN_CONTAINER_WIDTH = 286; private int containerWidth = 240; @@ -266,13 +266,7 @@ public class UIEastResizableContainer extends JPanel { @Override public void mouseDragged(MouseEvent e) { - containerWidth = UIEastResizableContainer.this.getWidth() + (UIEastResizableContainer.this.getLocationOnScreen().x - e.getXOnScreen()); - containerWidth = Math.min(containerWidth, MAX_CONTAINER_WIDTH); - containerWidth = Math.max(containerWidth, MIN_CONTAINER_WIDTH); - refreshContainer(); - if ( DesignModeContext.isAuthorityEditing()) { - DesignerContext.getDesignerFrame().doResize(); - } + // do noting } }); addMouseListener(new MouseAdapter() { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index 42365dcc5..fe0276b38 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -257,8 +257,6 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta } }; - private ProgressDialog progressDialog; - public DesignerFrame(ToolBarMenuDock ad) { setName(DESIGNER_FRAME_NAME); @@ -338,7 +336,6 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta this.setDropTarget(new DropTarget(this, DnDConstants.ACTION_MOVE, new FileDropTargetListener(), true)); closeMode = UIConstants.CLOSE_OF_AUTHORITY; initMenuPane(); - this.progressDialog = new ProgressDialog(this); } public void resizeFrame() { @@ -748,9 +745,11 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * @param al 组件名称 */ public void checkCombineUp(boolean flag, ArrayList al) { - + //Yvan: 检查当前是否为WORK_SHEET状态,因为只有WORK_SHEET中含有格式刷组件,此时是不需要进行checkComponentsByNames的 + if (HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getMenuState() == DesignState.WORK_SHEET) { + return; + } combineUp.checkComponentsByNames(flag, al); - } /** @@ -1262,23 +1261,15 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta } } + @Deprecated public ProgressDialog getProgressDialog() { - return progressDialog; - } - - public void showProgressDialog() { - - progressDialog.setVisible(true); - + return new ProgressDialog(this); } - /** - * 隐藏进度框 - */ - public void hideProgressDialog() { + @Deprecated + public void openProgressDialog() { - progressDialog.setVisible(false); } /** @@ -1286,17 +1277,17 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * * @param progress 进度值 */ + @Deprecated public void updateProgress(int progress) { - progressDialog.setProgressValue(progress); } /** * 释放进度框 */ + @Deprecated public void disposeProgressDialog() { - progressDialog.dispose(); } /** @@ -1307,4 +1298,5 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta public boolean isDesignerOpened() { return designerOpened; } + } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index bcac7f946..a9d9281e9 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -856,7 +856,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt BorderLayout.CENTER); - this.setSize(340, 180); + this.setSize(380, 180); this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Mkdir")); this.setResizable(false); this.setAlwaysOnTop(true); diff --git a/designer-base/src/main/java/com/fr/env/EnvListPane.java b/designer-base/src/main/java/com/fr/env/EnvListPane.java index 911a7b22f..2d875cb45 100644 --- a/designer-base/src/main/java/com/fr/env/EnvListPane.java +++ b/designer-base/src/main/java/com/fr/env/EnvListPane.java @@ -3,6 +3,7 @@ package com.fr.env; import com.fr.design.DesignerEnvManager; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.env.DesignerWorkspaceInfo; +import com.fr.design.env.DesignerWorkspaceType; import com.fr.design.env.LocalDesignerWorkspaceInfo; import com.fr.design.env.RemoteDesignerWorkspaceInfo; import com.fr.design.gui.controlpane.JListControlPane; @@ -17,8 +18,10 @@ import com.fr.stable.core.PropertyChangeAdapter; import javax.swing.*; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Set; /** * @author yaohwu @@ -98,11 +101,30 @@ public class EnvListPane extends JListControlPane { DesignerEnvManager mgr = DesignerEnvManager.getEnvManager(); //这里代码时序换一下,因为update中需要借助mgr来获取提醒时间,已确认mgr对res无依赖 Nameable[] res = this.update(); + Set set = findNewWorkSpaceInfo(res); mgr.clearAllEnv(); for (Nameable re : res) { NameObject nameObject = (NameObject) re; - mgr.putEnv(nameObject.getName(), (DesignerWorkspaceInfo) nameObject.getObject()); + DesignerWorkspaceInfo info = (DesignerWorkspaceInfo) nameObject.getObject(); + if (set.contains(re) && info.getType() == DesignerWorkspaceType.Remote) { + RemoteDesignerWorkspaceInfo newInfo = (RemoteDesignerWorkspaceInfo) info; + newInfo.setNewCreated(true); + mgr.putEnv(nameObject.getName(), newInfo); + } else { + mgr.putEnv(nameObject.getName(), info); + } } return this.getSelectedName(); } + + private Set findNewWorkSpaceInfo(Nameable[] res) { + Set set = new HashSet<>(); + for (Nameable val : res) { + NameObject nameObject = (NameObject) val; + if (DesignerEnvManager.getEnvManager().getWorkspaceInfo(nameObject.getName()) == null) { + set.add(val); + } + } + return set; + } } diff --git a/designer-base/src/main/java/com/fr/start/BaseDesigner.java b/designer-base/src/main/java/com/fr/start/BaseDesigner.java index 1469dd32e..7808bd7ec 100644 --- a/designer-base/src/main/java/com/fr/start/BaseDesigner.java +++ b/designer-base/src/main/java/com/fr/start/BaseDesigner.java @@ -64,14 +64,11 @@ public abstract class BaseDesigner extends ToolBarMenuDock { @Override public void on(Event event, Null param) { EventDispatcher.stopListen(this); - UIUtil.invokeLaterIfNeeded(new Runnable() { - @Override - public void run() { + UIUtil.invokeLaterIfNeeded(() -> { - // 打开上次的文件 - showDesignerFrame(false); - DesignerLaunchStatus.setStatus(DesignerLaunchStatus.OPEN_LAST_FILE_COMPLETE); - } + // 打开上次的文件 + showDesignerFrame(false); + DesignerLaunchStatus.setStatus(DesignerLaunchStatus.OPEN_LAST_FILE_COMPLETE); }); } }); @@ -90,12 +87,7 @@ public abstract class BaseDesigner extends ToolBarMenuDock { } public void show() { - UIUtil.invokeLaterIfNeeded(new Runnable() { - @Override - public void run() { - refreshTemplateTree(); - } - }); + UIUtil.invokeLaterIfNeeded(this::refreshTemplateTree); } private void refreshTemplateTree() { diff --git a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java index e07daf93b..36b86cb89 100644 --- a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java +++ b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java @@ -62,6 +62,10 @@ public class FineEmbedServerActivator extends Activator { tomcat.setPort(DesignerEnvManager.getEnvManager().getEmbedServerPort()); // 设置解码uri使用的字符编码 tomcat.getConnector().setURIEncoding(EncodeConstants.ENCODING_UTF_8); + // 参考 https://jira.atlassian.com/browse/CONFSERVER-57582 + // https://tomcat.apache.org/tomcat-8.5-doc/config/http.html + // 8.5.x 请求参数带特殊字符被tomcat拒绝 []|{}^\`"<> + tomcat.getConnector().setProperty("relaxedQueryChars", "[]|{}^\`"<>"); setMaxPostSize(); String docBase = new File(WorkContext.getCurrent().getPath()).getParent(); diff --git a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java index 7e95c48d2..f8f7a13ea 100644 --- a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java +++ b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java @@ -32,7 +32,7 @@ public class FineEmbedServerMonitor { */ private static final int STEP_HEARTBEAT = 40; private static volatile FineEmbedServerMonitor monitor; - private static ProgressDialog progressBar = DesignerContext.getDesignerFrame().getProgressDialog(); + private static ProgressDialog progressDialog = new ProgressDialog(DesignerContext.getDesignerFrame()); //由于默认值的字体不支持韩文,所以要对韩文单独生成字体 private FRFont font = null; private static final int FONT_RGB = 333334; @@ -47,7 +47,7 @@ public class FineEmbedServerMonitor { @Override public void on(Event event, Null aNull) { getInstance().reset(); - DesignerContext.getDesignerFrame().hideProgressDialog(); + progressDialog.dispose(); } }); } @@ -64,7 +64,7 @@ public class FineEmbedServerMonitor { } public int getProgress() { - if (progress == progressBar.getProgressMaximum()) { + if (progress == progressDialog.getProgressMaximum()) { return progress; } else { progress += STEP; @@ -73,7 +73,7 @@ public class FineEmbedServerMonitor { } public void setComplete() { - this.progress = progressBar.getProgressMaximum(); + this.progress = progressDialog.getProgressMaximum(); } public void reset() { @@ -81,7 +81,7 @@ public class FineEmbedServerMonitor { } public boolean isComplete() { - return this.progress >= progressBar.getProgressMaximum(); + return this.progress >= progressDialog.getProgressMaximum(); } public void monitor() { @@ -92,11 +92,12 @@ public class FineEmbedServerMonitor { public void run() { if (isComplete()) { scheduler.shutdown(); - DesignerContext.getDesignerFrame().hideProgressDialog(); + progressDialog.dispose(); return; } - if (!DesignerContext.getDesignerFrame().getProgressDialog().isVisible()) { - DesignerContext.getDesignerFrame().showProgressDialog(); + if (!progressDialog.isVisible()) { + progressDialog = new ProgressDialog(DesignerContext.getDesignerFrame()); + progressDialog.setVisible(true); //如果为韩文则改变字体 LocaleCenter.buildAction(new LocaleAction() { @Override @@ -105,9 +106,9 @@ public class FineEmbedServerMonitor { } }, SupportLocaleImpl.SUPPORT_KOREA); String text = Toolkit.i18nText("Fine-Design_Basic_Loading_Embed_Server"); - DesignerContext.getDesignerFrame().getProgressDialog().updateLoadingText(text, font); + progressDialog.updateLoadingText(text, font); } - DesignerContext.getDesignerFrame().updateProgress(getProgress()); + progressDialog.setProgressValue(getProgress()); } }, 0, STEP_HEARTBEAT, TimeUnit.MILLISECONDS); diff --git a/designer-base/src/main/java/com/fr/start/server/ServerTray.java b/designer-base/src/main/java/com/fr/start/server/ServerTray.java index 2b3713c0f..4ad6e15b4 100644 --- a/designer-base/src/main/java/com/fr/start/server/ServerTray.java +++ b/designer-base/src/main/java/com/fr/start/server/ServerTray.java @@ -29,9 +29,9 @@ public class ServerTray { private MenuItem stopMenu; - private Image trayStartedImage = BaseUtils.readImage("/com/fr/base/images/oem/trayStarted.png"); + private Image trayStartedImage = BaseUtils.readImage("/com/fr/base/images/oem/trayStarted@2x.png"); - private Image trayStoppedImage = BaseUtils.readImage("/com/fr/base/images/oem/trayStopped.png"); + private Image trayStoppedImage = BaseUtils.readImage("/com/fr/base/images/oem/trayStopped@2x.png"); private ServerManageFrame serverManageFrame; @@ -188,4 +188,4 @@ public class ServerTray { } }); } -} \ No newline at end of file +} diff --git a/designer-base/src/test/java/com/fr/design/DesignerEnvManagerTest.java b/designer-base/src/test/java/com/fr/design/DesignerEnvManagerTest.java index b7d123d66..f60d6da29 100644 --- a/designer-base/src/test/java/com/fr/design/DesignerEnvManagerTest.java +++ b/designer-base/src/test/java/com/fr/design/DesignerEnvManagerTest.java @@ -3,6 +3,7 @@ package com.fr.design; import junit.framework.TestCase; import java.util.Locale; +import org.junit.Assert; public class DesignerEnvManagerTest extends TestCase{ @@ -17,4 +18,11 @@ public class DesignerEnvManagerTest extends TestCase{ assertEquals("下边界", envManager.getLanguage(), Locale.SIMPLIFIED_CHINESE); } + + public void testGetUUID() { + DesignerEnvManager envManager = new DesignerEnvManager(); + String uuid0 = envManager.getUUID(); + String uuid1 = envManager.getUUID(); + Assert.assertEquals(uuid0, uuid1); + } } diff --git a/designer-base/src/test/java/com/fr/design/env/RemoteDesignerWorkspaceInfoTest.java b/designer-base/src/test/java/com/fr/design/env/RemoteDesignerWorkspaceInfoTest.java index 54dbae3b0..d6e89cd93 100644 --- a/designer-base/src/test/java/com/fr/design/env/RemoteDesignerWorkspaceInfoTest.java +++ b/designer-base/src/test/java/com/fr/design/env/RemoteDesignerWorkspaceInfoTest.java @@ -1,9 +1,16 @@ package com.fr.design.env; +import com.fr.invoke.Reflect; +import com.fr.stable.xml.XMLPrintWriter; +import com.fr.stable.xml.XMLReaderHelper; +import com.fr.stable.xml.XMLableReader; import com.fr.workspace.connect.WorkspaceConnectionInfo; import junit.framework.TestCase; import org.junit.Assert; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + /** * @author hades * @version 10.0 @@ -22,4 +29,64 @@ public class RemoteDesignerWorkspaceInfoTest extends TestCase { Assert.assertFalse(workspaceInfo3.checkValid()); } + public void testReadXml() { + String xml0 = ""; + String xml1 = ""; + byte[] bytes0 = xml0.getBytes(); + byte[] bytes1 = xml1.getBytes(); + RemoteDesignerWorkspaceInfo info = new RemoteDesignerWorkspaceInfo(); + ByteArrayInputStream in0 = new ByteArrayInputStream(bytes0); + ByteArrayInputStream in1 = new ByteArrayInputStream(bytes1); + + try { + XMLableReader reader0 = XMLReaderHelper.createXMLableReader(in0, XMLPrintWriter.XML_ENCODER); + Reflect.on(reader0).set("state", 1); + info.setNewCreated(true); + info.readXML(reader0); + Assert.assertEquals("xxxxxxx", info.getConnection().getCertSecretKey()); + + XMLableReader reader1 = XMLReaderHelper.createXMLableReader(in1, XMLPrintWriter.XML_ENCODER); + Reflect.on(reader1).set("state", 1); + info.setNewCreated(false); + info.readXML(reader1); + Assert.assertEquals("xxxxxxx", info.getConnection().getCertSecretKey()); + } catch (Exception ignore) { + + } + } + + public void testWriteXml() { + ByteArrayOutputStream out0 = new ByteArrayOutputStream(); + XMLPrintWriter writer0 = XMLPrintWriter.create(out0); + RemoteDesignerWorkspaceInfo info0 = RemoteDesignerWorkspaceInfo.create(new WorkspaceConnectionInfo("127.0.0.1", "1", "1", "/xxx", "xxxxx", true)); + info0.setNewCreated(true); + info0.writeXML(writer0); + writer0.close(); + String result0 = new String(out0.toByteArray()); + Assert.assertTrue(result0.contains("certSecretKey")); + Assert.assertFalse(result0.contains("certSecretKey=\"xxxxx\"")); + + ByteArrayOutputStream out1 = new ByteArrayOutputStream(); + XMLPrintWriter writer1 = XMLPrintWriter.create(out1); + RemoteDesignerWorkspaceInfo info1 = RemoteDesignerWorkspaceInfo.create(new WorkspaceConnectionInfo("127.0.0.1", "1", "1", "/xxx", "xxxxx", true)); + info1.writeXML(writer1); + writer1.close(); + String result1 = new String(out1.toByteArray()); + Assert.assertTrue(result1.contains("certSecretKey")); + Assert.assertTrue(result1.contains("certSecretKey=\"xxxxx\"")); + + } + } diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java index e4e27b7f4..16f983c75 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java @@ -82,6 +82,10 @@ public abstract class AbstractCustomFieldComboBoxPane extends BasicBeanPane extends BasicBeanPane{ * @return 界面是否接受对象 */ public boolean accept(Object ob) { - return ob instanceof ChartCollection && ((ChartCollection)ob).getSelectedChart().getFilterDefinition() instanceof ReportDataDefinition; + TopDefinitionProvider filterDefinition = ((ChartCollection) ob).getSelectedChartProvider(Chart.class).getFilterDefinition(); + return ob instanceof ChartCollection && filterDefinition instanceof ReportDataDefinition && !(filterDefinition instanceof CustomDefinition); } /** diff --git a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java index 119d73bda..fe02f67c0 100644 --- a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java +++ b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java @@ -22,6 +22,10 @@ public class ExtendedCustomFieldComboBoxPane extends AbstractCustomFieldComboBox return new ExtendedCustomFieldNamePane(); } + @Override + protected boolean seriesComboBoxHasNone() { + return true; + } @Override public void populateBean(AbstractDataConfig ob) { diff --git a/designer-chart/src/main/java/com/fr/extended/chart/UIComboBoxWithNone.java b/designer-chart/src/main/java/com/fr/extended/chart/UIComboBoxWithNone.java index 6df855cd7..f20675066 100644 --- a/designer-chart/src/main/java/com/fr/extended/chart/UIComboBoxWithNone.java +++ b/designer-chart/src/main/java/com/fr/extended/chart/UIComboBoxWithNone.java @@ -41,7 +41,9 @@ public class UIComboBoxWithNone extends UIComboBox { public void setSelectedItem(Object anObject) { super.setSelectedItem(anObject); - if (getSelectedIndex() == -1) {//找不到的都选中无。中文的无 英文下是none。 + //找不到的都选中无。中文的无 英文下是none。 + //改正:找不到的且anObject不是null的 全部选中无。 + if (getSelectedIndex() == -1 && anObject != null) { super.setSelectedItem(getDefaultLocaleString()); } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java index 5cec0753a..5d254ebb6 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java @@ -5,12 +5,12 @@ import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.area.AreaIndependentVanChart; import com.fr.plugin.chart.area.VanChartAreaPlot; -import com.fr.van.chart.designer.type.AbstractVanChartTypePane; +import com.fr.van.chart.designer.type.AbstractRectanglePlotPane; /** * Created by Mitisky on 15/11/18. */ -public class VanChartAreaPlotPane extends AbstractVanChartTypePane { +public class VanChartAreaPlotPane extends AbstractRectanglePlotPane { @Override protected String[] getTypeIconPath() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/bar/VanChartBarPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/bar/VanChartBarPlotPane.java index 83d1db2e9..811dde312 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/bar/VanChartBarPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/bar/VanChartBarPlotPane.java @@ -5,12 +5,12 @@ import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.bar.BarIndependentVanChart; import com.fr.plugin.chart.column.VanChartColumnPlot; -import com.fr.van.chart.designer.type.AbstractVanChartTypePane; +import com.fr.van.chart.designer.type.AbstractRectanglePlotPane; /** * Created by Mitisky on 15/10/20. */ -public class VanChartBarPlotPane extends AbstractVanChartTypePane { +public class VanChartBarPlotPane extends AbstractRectanglePlotPane { @Override protected String[] getTypeIconPath() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubblePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubblePlotPane.java index 407c7758b..ef90c8a01 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubblePlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubblePlotPane.java @@ -12,15 +12,22 @@ import com.fr.chartx.data.field.AbstractColumnFieldCollection; import com.fr.chartx.data.field.diff.BubbleColumnFieldCollection; import com.fr.chartx.data.field.diff.MultiCategoryColumnFieldCollection; import com.fr.log.FineLoggerFactory; +import com.fr.plugin.chart.area.VanChartAreaPlot; import com.fr.plugin.chart.attr.plot.VanChartPlot; import com.fr.plugin.chart.base.VanChartTools; import com.fr.plugin.chart.base.VanChartZoom; import com.fr.plugin.chart.bubble.BubbleIndependentVanChart; import com.fr.plugin.chart.bubble.VanChartBubblePlot; +import com.fr.plugin.chart.column.VanChartColumnPlot; +import com.fr.plugin.chart.line.VanChartLinePlot; +import com.fr.plugin.chart.scatter.VanChartScatterPlot; import com.fr.plugin.chart.scatter.attr.ScatterAttrLabel; import com.fr.plugin.chart.vanchart.VanChart; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; +import java.util.HashSet; +import java.util.Set; + /** * Created by Mitisky on 16/3/31. */ @@ -32,6 +39,20 @@ public class VanChartBubblePlotPane extends AbstractVanChartTypePane { private static final float ALPHA = 0.7f; + private static Set forceExtendPlotIds = new HashSet<>(); + + private static Set extendPlotIds = new HashSet<>(); + + static { + extendPlotIds.add(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID); + extendPlotIds.add(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID); + extendPlotIds.add(VanChartLinePlot.VAN_CHART_LINE_PLOT); + extendPlotIds.add(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID); + extendPlotIds.add(VanChartScatterPlot.VAN_CHART_SCATTER_PLOT_ID); + + forceExtendPlotIds.add(VanChartScatterPlot.VAN_CHART_SCATTER_PLOT_ID); + } + @Override protected String[] getTypeIconPath() { return new String[]{"/com/fr/van/chart/bubble/images/bubble.png", @@ -122,16 +143,16 @@ public class VanChartBubblePlotPane extends AbstractVanChartTypePane { * @param chart */ @Override - protected void resetChartAttr4SamePlot(Chart chart) { + protected void resetChartAttr4SamePlot(VanChart chart) { //图表缩放新设计 恢复用注释。下面2行删除。 VanChartZoom vanChartZoom = new VanChartZoom(); - ((VanChart) chart).setVanChartZoom(vanChartZoom); + chart.setVanChartZoom(vanChartZoom); //图表缩放新设计 恢复用注释。下面一行取消注释。 //((VanChart) chart).setZoomAttribute(new ZoomAttribute()); //重置监控刷新选项 - resetRefreshMoreLabelAttr((VanChart) chart); + resetRefreshMoreLabelAttr(chart); } @Override @@ -147,4 +168,12 @@ public class VanChartBubblePlotPane extends AbstractVanChartTypePane { } return false; } + + //是否支持属性的继承 + @Override + protected boolean supportExtendAttr(VanChart chart) { + VanChartBubblePlot selectedClonedPlot = (VanChartBubblePlot) getSelectedClonedPlot(); + return selectedClonedPlot.isForceBubble() ? forceExtendPlotIds.contains(chart.getID()) : + extendPlotIds.contains(chart.getID()); + } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotPane.java index 40269cc15..8b37e952c 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotPane.java @@ -5,12 +5,12 @@ import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.column.ColumnIndependentVanChart; import com.fr.plugin.chart.column.VanChartColumnPlot; -import com.fr.van.chart.designer.type.AbstractVanChartTypePane; +import com.fr.van.chart.designer.type.AbstractRectanglePlotPane; /** * Created by Mitisky on 15/9/24. */ -public class VanChartColumnPlotPane extends AbstractVanChartTypePane { +public class VanChartColumnPlotPane extends AbstractRectanglePlotPane { @Override protected String[] getTypeIconPath() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotPane.java index 6bace5ef9..ff0147652 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotPane.java @@ -119,7 +119,7 @@ public class VanChartCustomPlotPane extends AbstractVanChartTypePane { } @Override - public void updateBean(Chart chart) { + public void updateBean(VanChart chart) { //保存上次选中的值,其会在super中更新 int lastState = chart.getPlot().getDetailType(); @@ -129,7 +129,7 @@ public class VanChartCustomPlotPane extends AbstractVanChartTypePane { //如果上次的状态和这次的装填不在同一个页面,说明同一个图表內切换了,需要情況数据配置 if (lastState != chart.getPlot().getDetailType()) { chart.setFilterDefinition(null); - ((VanChart) chart).setChartDataDefinition(null); + chart.setChartDataDefinition(null); } Chart[] customChart = CustomIndependentVanChart.CustomVanChartTypes; @@ -214,12 +214,12 @@ public class VanChartCustomPlotPane extends AbstractVanChartTypePane { * @param newPlot */ @Override - protected void resetChartAttr(Chart chart, Plot newPlot) { + protected void resetChartAttr(VanChart chart, VanChartPlot newPlot) { super.resetChartAttr(chart, newPlot); //切换图表清空数据配置 chart.setFilterDefinition(null); //设置默认不排序 - VanChartTools tools = ((VanChart) chart).getVanChartTools(); + VanChartTools tools = chart.getVanChartTools(); if (tools != null) { tools.setSort(false); } @@ -228,7 +228,7 @@ public class VanChartCustomPlotPane extends AbstractVanChartTypePane { /** * 更新界面内容 */ - public void populateBean(Chart chart) { + public void populateBean(VanChart chart) { for (ChartImagePane imagePane : typeDemo) { imagePane.isPressing = false; } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractRectanglePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractRectanglePlotPane.java new file mode 100644 index 000000000..6babd6a2f --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractRectanglePlotPane.java @@ -0,0 +1,90 @@ +package com.fr.van.chart.designer.type; + +import com.fr.chart.chartglyph.ConditionCollection; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.chart.PiePlot4VanChart; +import com.fr.plugin.chart.area.VanChartAreaPlot; +import com.fr.plugin.chart.attr.axis.VanChartAxis; +import com.fr.plugin.chart.attr.plot.VanChartPlot; +import com.fr.plugin.chart.attr.plot.VanChartRectanglePlot; +import com.fr.plugin.chart.bubble.VanChartBubblePlot; +import com.fr.plugin.chart.column.VanChartColumnPlot; +import com.fr.plugin.chart.line.VanChartLinePlot; +import com.fr.plugin.chart.scatter.VanChartScatterPlot; +import com.fr.plugin.chart.type.VanChartPlotType; +import com.fr.plugin.chart.vanchart.VanChart; +import com.fr.stable.StringUtils; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2020-08-24 + */ +public abstract class AbstractRectanglePlotPane extends AbstractVanChartTypePane { + + private static Set extendPlotIds = new HashSet<>(); + + static { + extendPlotIds.add(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID); + extendPlotIds.add(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID); + extendPlotIds.add(VanChartLinePlot.VAN_CHART_LINE_PLOT); + extendPlotIds.add(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID); + extendPlotIds.add(VanChartScatterPlot.VAN_CHART_SCATTER_PLOT_ID); + extendPlotIds.add(PiePlot4VanChart.VAN_CHART_PIE_PLOT); + } + + @Override + protected VanChartPlot cloneOldPlot2New(VanChartPlot oldPlot, VanChartPlot newPlot) { + try { + VanChartRectanglePlot vanChartRectanglePlot = (VanChartRectanglePlot) newPlot; + VanChartRectanglePlot clonePlot = (VanChartRectanglePlot) oldPlot.clone(); + clonePlot.setVanChartPlotType(vanChartRectanglePlot.getVanChartPlotType()); + //自定义类型的图形要增加一个y2轴,并且增加系列中的堆积条件,反之则要去掉y2轴和条件 + if (clonePlot.isCustomChart()) { + List valueAxisList = clonePlot.getValueAxisList(); + valueAxisList.add(vanChartRectanglePlot.getValueAxisList().get(1)); + clonePlot.setStackAndAxisCondition(vanChartRectanglePlot.getStackAndAxisCondition()); + } else { + List xAxisList = clonePlot.getXAxisList(); + List yAxisList = clonePlot.getYAxisList(); + List newXAxisList = new ArrayList<>(); + List newYAxisList = new ArrayList<>(); + newXAxisList.add(xAxisList.get(0)); + newYAxisList.add(yAxisList.get(0)); + clonePlot.setXAxisList(newXAxisList); + clonePlot.setYAxisList(newYAxisList); + clonePlot.setStackAndAxisCondition(new ConditionCollection()); + } + + //百分比堆积图值轴的格式不保留 + if (clonePlot.getVanChartPlotType() == VanChartPlotType.STACK_BY_PERCENT || + ((VanChartRectanglePlot) oldPlot).getVanChartPlotType() == VanChartPlotType.STACK_BY_PERCENT) { + VanChartAxis cloneAxis = clonePlot.getValueAxisList().get(0); + VanChartAxis vanChartAxis = vanChartRectanglePlot.getValueAxisList().get(0); + cloneAxis.setFormat(vanChartAxis.getFormat()); + cloneAxis.setPercentage(vanChartAxis.isPercentage()); + cloneAxis.setCommonValueFormat(vanChartAxis.isCommonValueFormat()); + cloneAxis.setHtmlLabel(vanChartAxis.getHtmlLabel()); + } + return clonePlot; + } catch (CloneNotSupportedException ex) { + FineLoggerFactory.getLogger().error("Error in change plot"); + return newPlot; + } + } + + //是否支持属性的继承 + @Override + protected boolean supportExtendAttr(VanChart chart) { + if (StringUtils.equals(VanChartBubblePlot.VAN_CHART_BUBBLE_PLOT_ID, chart.getID())) { + VanChartBubblePlot vanChartBubblePlot = chart.getPlot(); + return !vanChartBubblePlot.isForceBubble(); + } + return extendPlotIds.contains(chart.getID()); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java index 6189c347b..9cf916554 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java @@ -1,10 +1,13 @@ package com.fr.van.chart.designer.type; import com.fr.base.BaseUtils; +import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.base.AttrFillStyle; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Legend; import com.fr.chart.chartattr.Plot; +import com.fr.chart.chartdata.NormalReportDataDefinition; +import com.fr.chart.chartdata.NormalTableDataDefinition; import com.fr.chart.chartglyph.ConditionAttr; import com.fr.chart.chartglyph.ConditionCollection; import com.fr.chart.chartglyph.DataSheet; @@ -37,7 +40,7 @@ import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionListener; -public abstract class AbstractVanChartTypePane extends AbstractChartTypePane { +public abstract class AbstractVanChartTypePane extends AbstractChartTypePane { private static final long serialVersionUID = 7743244512351499265L; private UICheckBox largeModelCheckBox; @@ -119,7 +122,7 @@ public abstract class AbstractVanChartTypePane extends AbstractChartTypePane children = root.children(); + Enumeration children = root.children(); if (children.hasMoreElements()) { - DefaultMutableTreeNode child = children.nextElement(); + DefaultMutableTreeNode child = (DefaultMutableTreeNode) children.nextElement(); if(GEOJSONTreeHelper.getInstance().isSelectableTreeNode(child)){ selectTreeNode(child, m_model); @@ -59,9 +59,9 @@ public class MapDataTree extends JTree { } private void setFirstChildTreeNode(DefaultMutableTreeNode parent, DefaultTreeModel m_model){ - Enumeration children = parent.children(); + Enumeration children = parent.children(); if (children.hasMoreElements()){ - DefaultMutableTreeNode node = children.nextElement(); + DefaultMutableTreeNode node = (DefaultMutableTreeNode) children.nextElement(); selectTreeNode(node, m_model); } } @@ -89,9 +89,9 @@ public class MapDataTree extends JTree { DefaultTreeModel m_model = (DefaultTreeModel) this.getModel(); DefaultMutableTreeNode root = (DefaultMutableTreeNode) m_model.getRoot(); - Enumeration els = root.postorderEnumeration(); + Enumeration els = root.postorderEnumeration(); while(els.hasMoreElements()){ - DefaultMutableTreeNode el = els.nextElement(); + DefaultMutableTreeNode el = (DefaultMutableTreeNode) els.nextElement(); if(el == null || el.getUserObject() == null){ return null; } @@ -145,10 +145,10 @@ public class MapDataTree extends JTree { DefaultTreeModel m_model = (DefaultTreeModel) this.getModel(); DefaultMutableTreeNode root = (DefaultMutableTreeNode) m_model.getRoot(); - Enumeration els = root.postorderEnumeration(); + Enumeration els = root.postorderEnumeration(); while(els.hasMoreElements()){ - DefaultMutableTreeNode el = els.nextElement(); + DefaultMutableTreeNode el = (DefaultMutableTreeNode) els.nextElement(); String path = el.getUserObject().toString(); String fileName = ChartGEOJSONHelper.getPresentNameWithPath(path); if (StringUtils.contains(fileName, text) && GEOJSONTreeHelper.isValidDirPath(path)) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartGanttSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartGanttSeriesPane.java index c89dff039..9236773e7 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartGanttSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartGanttSeriesPane.java @@ -59,10 +59,6 @@ public class VanChartGanttSeriesPane extends VanChartAbstractPlotSeriesPane { return ganntStylePane; } - protected void checkCompsEnabledWithLarge(Plot plot) { - - } - private JPanel createLinkLinePane(){ lineWidth = new LineComboBox(CoreConstants.STRIKE_LINE_STYLE_ARRAY_4_CHART); colorSelect = new ColorSelectBoxWithOutTransparent(100); diff --git a/designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugePlotPane.java index 1ede3efb3..3d979119c 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugePlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugePlotPane.java @@ -8,10 +8,13 @@ import com.fr.chartx.data.field.AbstractColumnFieldCollection; import com.fr.chartx.data.field.diff.GaugeColumnFieldCollection; import com.fr.chartx.data.field.diff.MultiCategoryColumnFieldCollection; import com.fr.log.FineLoggerFactory; +import com.fr.plugin.chart.attr.GaugeDetailStyle; import com.fr.plugin.chart.attr.plot.VanChartPlot; +import com.fr.plugin.chart.base.AttrLabel; import com.fr.plugin.chart.gauge.GaugeIndependentVanChart; import com.fr.plugin.chart.gauge.VanChartGaugePlot; import com.fr.plugin.chart.type.GaugeStyle; +import com.fr.plugin.chart.vanchart.VanChart; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; /** @@ -31,12 +34,12 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane { }; } - protected Plot getSelectedClonedPlot(){ + protected Plot getSelectedClonedPlot() { VanChartGaugePlot newPlot = null; Chart[] GaugeChart = GaugeIndependentVanChart.GaugeVanChartTypes; - for(int i = 0, len = GaugeChart.length; i < len; i++){ - if(typeDemo.get(i).isPressing){ - newPlot = (VanChartGaugePlot)GaugeChart[i].getPlot(); + for (int i = 0, len = GaugeChart.length; i < len; i++) { + if (typeDemo.get(i).isPressing) { + newPlot = (VanChartGaugePlot) GaugeChart[i].getPlot(); } } @@ -44,8 +47,8 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane { try { if (newPlot == null) { throw new IllegalArgumentException("newPlot con not be null"); - }else { - cloned = (Plot)newPlot.clone(); + } else { + cloned = (Plot) newPlot.clone(); } } catch (CloneNotSupportedException e) { FineLoggerFactory.getLogger().error("Error In GaugeChart"); @@ -56,16 +59,70 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane { /** * 保存界面属性 */ - public void updateBean(Chart chart) { - boolean oldISMulti = chart.getPlot() instanceof VanChartGaugePlot && ((VanChartGaugePlot)chart.getPlot()).isMultiPointer(); + public void updateBean(VanChart chart) { + boolean oldISMulti = chart.getPlot() instanceof VanChartGaugePlot && ((VanChartGaugePlot) chart.getPlot()).isMultiPointer(); super.updateBean(chart); - boolean newISMulti = chart.getPlot() instanceof VanChartGaugePlot && ((VanChartGaugePlot)chart.getPlot()).isMultiPointer(); - if(oldISMulti != newISMulti){ + boolean newISMulti = chart.getPlot() instanceof VanChartGaugePlot && ((VanChartGaugePlot) chart.getPlot()).isMultiPointer(); + if (oldISMulti != newISMulti) { chart.setFilterDefinition(null); } } - protected void cloneOldConditionCollection(Plot oldPlot, Plot newPlot) throws CloneNotSupportedException{ + @Override + protected VanChartPlot cloneOldPlot2New(VanChartPlot oldPlot, VanChartPlot newPlot) { + try { + VanChartGaugePlot vanChartNewPlot = (VanChartGaugePlot) newPlot; + VanChartGaugePlot vanChartOldPlot = (VanChartGaugePlot) oldPlot; + if (vanChartNewPlot.isMultiPointer() != vanChartOldPlot.isMultiPointer()) { + return super.cloneOldPlot2New(oldPlot, newPlot); + } + + VanChartGaugePlot clonePlot = (VanChartGaugePlot) vanChartOldPlot.clone(); + clonePlot.setGaugeStyle(vanChartNewPlot.getGaugeStyle()); + //都是多指针仪表盘,所有属性都一样 + if (clonePlot.isMultiPointer()) { + return clonePlot; + } + //超链和系列中的样式、布局不保留 + clonePlot.setHotHyperLink(vanChartNewPlot.getHotHyperLink()); + clonePlot.setRadius(vanChartNewPlot.getRadius()); + reductionDetail(clonePlot.getGaugeDetailStyle(), vanChartNewPlot.getGaugeDetailStyle()); + + //如果切换试管型仪表盘,部分属性不保留 + if (clonePlot.getGaugeStyle() == GaugeStyle.THERMOMETER || + vanChartOldPlot.getGaugeStyle() == GaugeStyle.THERMOMETER) { + clonePlot.setGaugeAxis(vanChartNewPlot.getGaugeAxis()); + clonePlot.getGaugeDetailStyle().setHorizontalLayout(vanChartNewPlot.getGaugeDetailStyle().isHorizontalLayout()); + clonePlot.getGaugeDetailStyle().setHotAreaColor(vanChartNewPlot.getGaugeDetailStyle().getHotAreaColor()); + + AttrLabel cloneLabel = clonePlot.getAttrLabelFromConditionCollection(); + AttrLabel newLabel = vanChartNewPlot.getAttrLabelFromConditionCollection(); + cloneLabel.getAttrLabelDetail().setPosition(newLabel.getAttrLabelDetail().getPosition()); + cloneLabel.getAttrLabelDetail().setAlign(newLabel.getAttrLabelDetail().getAlign()); + cloneLabel.getAttrLabelDetail().setTextAttr(newLabel.getAttrLabelDetail().getTextAttr()); + cloneLabel.getGaugeValueLabelDetail().setPosition(newLabel.getGaugeValueLabelDetail().getPosition()); + cloneLabel.getGaugeValueLabelDetail().setAlign(newLabel.getGaugeValueLabelDetail().getAlign()); + cloneLabel.getGaugeValueLabelDetail().setTextAttr(newLabel.getGaugeValueLabelDetail().getTextAttr()); + } + return clonePlot; + + } catch (CloneNotSupportedException e) { + FineLoggerFactory.getLogger().error("Error in change plot"); + return newPlot; + } + } + + private void reductionDetail(GaugeDetailStyle cloneDetail, GaugeDetailStyle newDetail) { + cloneDetail.setNeedleColor(newDetail.getNeedleColor()); + cloneDetail.setPaneBackgroundColor(newDetail.getPaneBackgroundColor()); + cloneDetail.setSlotBackgroundColor(newDetail.getSlotBackgroundColor()); + cloneDetail.setAntiClockWise(newDetail.isAntiClockWise()); + cloneDetail.setInnerPaneBackgroundColor(newDetail.getInnerPaneBackgroundColor()); + cloneDetail.setThermometerWidth(newDetail.getThermometerWidth()); + cloneDetail.setChutePercent(newDetail.getChutePercent()); + } + + protected void cloneOldConditionCollection(Plot oldPlot, Plot newPlot) throws CloneNotSupportedException { } public Chart getDefaultChart() { @@ -74,8 +131,8 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane { @Override protected void cloneHotHyperLink(Plot oldPlot, Plot newPlot) throws CloneNotSupportedException { - if(oldPlot instanceof VanChartGaugePlot && newPlot instanceof VanChartGaugePlot){ - if(((VanChartGaugePlot) oldPlot).isMultiPointer() == ((VanChartGaugePlot) newPlot).isMultiPointer()){ + if (oldPlot instanceof VanChartGaugePlot && newPlot instanceof VanChartGaugePlot) { + if (((VanChartGaugePlot) oldPlot).isMultiPointer() == ((VanChartGaugePlot) newPlot).isMultiPointer()) { super.cloneHotHyperLink(oldPlot, newPlot); } } @@ -83,7 +140,7 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane { @Override protected boolean acceptDefinition(ChartDataDefinitionProvider definition, VanChartPlot vanChartPlot) { - if(definition instanceof AbstractDataDefinition) { + if (definition instanceof AbstractDataDefinition) { AbstractColumnFieldCollection columnFieldCollection = ((AbstractDataDefinition) definition).getColumnFieldCollection(); GaugeStyle gaugeStyle = ((VanChartGaugePlot) vanChartPlot).getGaugeStyle(); switch (gaugeStyle) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java b/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java index 43f03a13d..8f4a72de2 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java @@ -10,6 +10,7 @@ import com.fr.plugin.chart.base.VanChartTools; import com.fr.plugin.chart.heatmap.HeatMapIndependentVanChart; import com.fr.plugin.chart.heatmap.VanChartHeatMapPlot; import com.fr.plugin.chart.map.server.CompatibleGEOJSONHelper; +import com.fr.plugin.chart.vanchart.VanChart; import com.fr.van.chart.map.designer.type.VanChartMapPlotPane; import com.fr.van.chart.map.designer.type.VanChartMapSourceChoosePane; @@ -30,7 +31,7 @@ public class VanChartHeatMapTypePane extends VanChartMapPlotPane { } //适用一种图表只有一种类型的 - public void populateBean(Chart chart) { + public void populateBean(VanChart chart) { typeDemo.get(0).isPressing = true; VanChartHeatMapPlot plot = (VanChartHeatMapPlot)chart.getPlot(); populateSourcePane(plot); diff --git a/designer-chart/src/main/java/com/fr/van/chart/line/VanChartLinePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/line/VanChartLinePlotPane.java index 49be523d6..7af9e6bb7 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/line/VanChartLinePlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/line/VanChartLinePlotPane.java @@ -5,12 +5,12 @@ import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.line.LineIndependentVanChart; import com.fr.plugin.chart.line.VanChartLinePlot; -import com.fr.van.chart.designer.type.AbstractVanChartTypePane; +import com.fr.van.chart.designer.type.AbstractRectanglePlotPane; /** * Created by Mitisky on 15/11/5. */ -public class VanChartLinePlotPane extends AbstractVanChartTypePane { +public class VanChartLinePlotPane extends AbstractRectanglePlotPane { @Override protected String[] getTypeIconPath() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java index ba4158ed5..a4356be87 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java @@ -9,13 +9,18 @@ import com.fr.design.utils.gui.GUICoreUtils; import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.attr.plot.VanChartPlot; import com.fr.plugin.chart.base.VanChartTools; +import com.fr.plugin.chart.drillmap.VanChartDrillMapPlot; +import com.fr.plugin.chart.heatmap.VanChartHeatMapPlot; import com.fr.plugin.chart.map.MapIndependentVanChart; import com.fr.plugin.chart.map.VanChartMapPlot; import com.fr.plugin.chart.map.data.VanMapDefinition; import com.fr.plugin.chart.map.server.CompatibleGEOJSONHelper; +import com.fr.plugin.chart.vanchart.VanChart; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; import javax.swing.JPanel; +import java.util.HashSet; +import java.util.Set; import java.awt.Component; /** @@ -25,6 +30,14 @@ public class VanChartMapPlotPane extends AbstractVanChartTypePane { private VanChartMapSourceChoosePane sourceChoosePane; + private static Set extendPlotIds = new HashSet<>(); + + static { + extendPlotIds.add(VanChartMapPlot.VAN_CHART_MAP_ID); + extendPlotIds.add(VanChartDrillMapPlot.VAN_CHART_DRILL_MAP_ID); + extendPlotIds.add(VanChartHeatMapPlot.VAN_CHART_HEAT_MAP_ID); + } + @Override protected String[] getTypeIconPath() { return new String[]{"/com/fr/van/chart/map/images/area-map.png", @@ -54,7 +67,7 @@ public class VanChartMapPlotPane extends AbstractVanChartTypePane { /** * 更新界面内容 */ - public void populateBean(Chart chart) { + public void populateBean(VanChart chart) { for (ChartImagePane imagePane : typeDemo) { imagePane.isPressing = false; } @@ -80,7 +93,7 @@ public class VanChartMapPlotPane extends AbstractVanChartTypePane { } } - public void updateBean(Chart chart) { + public void updateBean(VanChart chart) { super.updateBean(chart); Plot plot = chart.getPlot(); if (plot instanceof VanChartMapPlot) { @@ -154,4 +167,10 @@ public class VanChartMapPlotPane extends AbstractVanChartTypePane { protected boolean acceptDefinition(ChartDataDefinitionProvider definition, VanChartPlot vanChartPlot) { return definition instanceof MapChartDataDefinition; } + + //是否支持属性的继承 + @Override + protected boolean supportExtendAttr(VanChart chart) { + return extendPlotIds.contains(chart.getID()); + } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/VanChartMultiPiePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/VanChartMultiPiePlotPane.java index 555cca468..7854ecd17 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/VanChartMultiPiePlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/VanChartMultiPiePlotPane.java @@ -55,10 +55,10 @@ public class VanChartMultiPiePlotPane extends AbstractVanChartTypePane { return MultiPieIndependentVanChart.MultilayerVanChartTypes[0]; } - protected void resetChartAttr(Chart chart, Plot newPlot) { + protected void resetChartAttr(VanChart chart, VanChartPlot newPlot) { super.resetChartAttr(chart, newPlot); //重置工具栏选项 - VanChartTools tools = ((VanChart) chart).getVanChartTools(); + VanChartTools tools = chart.getVanChartTools(); if (tools != null) { tools.setSort(false); tools.setFullScreen(false); diff --git a/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPiePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPiePlotPane.java index 9bbddbb03..27f10bfc8 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPiePlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPiePlotPane.java @@ -5,9 +5,17 @@ import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.PiePlot4VanChart; +import com.fr.plugin.chart.area.VanChartAreaPlot; +import com.fr.plugin.chart.attr.plot.VanChartPlot; +import com.fr.plugin.chart.column.VanChartColumnPlot; +import com.fr.plugin.chart.line.VanChartLinePlot; import com.fr.plugin.chart.pie.PieIndependentVanChart; +import com.fr.plugin.chart.vanchart.VanChart; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; +import java.util.HashSet; +import java.util.Set; + /** * 饼图(新特性) 属性表 选择类型 布局界面. */ @@ -15,6 +23,15 @@ public class VanChartPiePlotPane extends AbstractVanChartTypePane { private static final long serialVersionUID = 6163246902689597259L; + private static Set extendPlotIds = new HashSet<>(); + + static { + extendPlotIds.add(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID); + extendPlotIds.add(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID); + extendPlotIds.add(VanChartLinePlot.VAN_CHART_LINE_PLOT); + extendPlotIds.add(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID); + } + @Override protected String[] getTypeIconPath() { return new String[]{"/com/fr/van/chart/pie/images/pie.png", @@ -44,7 +61,31 @@ public class VanChartPiePlotPane extends AbstractVanChartTypePane { return cloned; } + @Override + protected VanChartPlot cloneOldPlot2New(VanChartPlot oldPlot, VanChartPlot newPlot) { + try { + PiePlot4VanChart piePlot4VanChart = (PiePlot4VanChart) newPlot; + PiePlot4VanChart clonePlot = (PiePlot4VanChart) oldPlot.clone(); + clonePlot.setRoseType(piePlot4VanChart.getRoseType()); + return clonePlot; + } catch (CloneNotSupportedException e) { + FineLoggerFactory.getLogger().error("Error in change plot"); + return newPlot; + } + } + + //是否支持属性的继承 + @Override + protected boolean supportExtendAttr(VanChart chart) { + return extendPlotIds.contains(chart.getID()); + } + public Chart getDefaultChart() { return PieIndependentVanChart.newPieChartTypes[0]; } + + //重置数据配置 + protected void resetFilterDefinition(Chart chart) { + resetMoreCateDefinition(chart); + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarConditionPane.java b/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarConditionPane.java index 9c46cd8ef..0d60f64de 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarConditionPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarConditionPane.java @@ -53,7 +53,7 @@ public class VanChartRadarConditionPane extends DataSeriesConditionPane{ } else { classPaneMap.put(VanChartAttrMarker.class, new VanChartMarkerConditionPane(this)); classPaneMap.put(VanChartAttrLine.class, new VanChartLineWidthConditionPane(this)); - classPaneMap.put(AttrAreaSeriesFillColorBackground.class, new VanChartAreaFillColorConditionPane(this)); + classPaneMap.put(AttrAreaSeriesFillColorBackground.class, new VanChartAreaFillColorConditionPane(this, plot)); classPaneMap.put(AttrEffect.class, new VanChartEffectConditionPane(this, EffectHelper.getRadarPlotDefaultEffect())); } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarPlotPane.java index a77c71bc9..e05bbe242 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarPlotPane.java @@ -49,4 +49,8 @@ public class VanChartRadarPlotPane extends AbstractVanChartTypePane { return RadarIndependentVanChart.RadarVanChartTypes[0]; } + //重置数据配置 + protected void resetFilterDefinition(Chart chart) { + resetMoreCateDefinition(chart); + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterPlotPane.java index f93051a74..9ef5155a7 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterPlotPane.java @@ -10,13 +10,21 @@ import com.fr.chartx.data.ChartDataDefinitionProvider; import com.fr.chartx.data.field.AbstractColumnFieldCollection; import com.fr.chartx.data.field.diff.BubbleColumnFieldCollection; import com.fr.log.FineLoggerFactory; +import com.fr.plugin.chart.area.VanChartAreaPlot; import com.fr.plugin.chart.attr.plot.VanChartPlot; import com.fr.plugin.chart.base.VanChartAttrLine; import com.fr.plugin.chart.base.VanChartTools; +import com.fr.plugin.chart.bubble.VanChartBubblePlot; +import com.fr.plugin.chart.column.VanChartColumnPlot; +import com.fr.plugin.chart.line.VanChartLinePlot; import com.fr.plugin.chart.scatter.ScatterIndependentVanChart; import com.fr.plugin.chart.scatter.VanChartScatterPlot; +import com.fr.plugin.chart.vanchart.VanChart; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; +import java.util.HashSet; +import java.util.Set; + /** * Created by Mitisky on 16/2/16. */ @@ -29,6 +37,16 @@ public class VanChartScatterPlotPane extends AbstractVanChartTypePane { }; } + private static Set extendPlotIds = new HashSet<>(); + + static { + extendPlotIds.add(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID); + extendPlotIds.add(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID); + extendPlotIds.add(VanChartLinePlot.VAN_CHART_LINE_PLOT); + extendPlotIds.add(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID); + extendPlotIds.add(VanChartBubblePlot.VAN_CHART_BUBBLE_PLOT_ID); + } + protected Plot getSelectedClonedPlot(){ VanChartScatterPlot newPlot = null; Chart[] scatterChart = ScatterIndependentVanChart.ScatterVanChartTypes; @@ -95,4 +113,10 @@ public class VanChartScatterPlotPane extends AbstractVanChartTypePane { } return false; } + + //是否支持属性的继承 + @Override + protected boolean supportExtendAttr(VanChart chart) { + return extendPlotIds.contains(chart.getID()); + } } \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java b/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java index ff89f059b..b3215ede1 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java @@ -77,12 +77,13 @@ public class SelectionModel { * @param e 鼠标事件 */ public void selectACreatorAtMouseEvent(MouseEvent e) { + //单选因为要先从已选择的组件中筛选一遍,所以先选择再reset + XCreator comp = designer.getComponentAt(e); if (e.getButton() == MouseEvent.BUTTON3 || (!InputEventBaseOnOS.isControlDown(e) && !e.isShiftDown())) { // 如果Ctrl或者Shift键盘没有按下,则清除已经选择的组件 selection.reset(); } else { //按下Ctrl或者shift键时鼠标可以进行多选,两次点击同一控件就取消选中 - XCreator comp = designer.getComponentAt(e); XLayoutContainer topLayout = XCreatorUtils.getHotspotContainer(comp).getTopLayout(); if (topLayout != null && !topLayout.isEditable()) { comp = topLayout; @@ -93,9 +94,9 @@ public class SelectionModel { selection.removeCreator(selected); } } + comp = designer.getComponentAt(e); } // 获取e所在的组件 - XCreator comp = designer.getComponentAt(e); selectACreator(comp); } diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java b/designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java index 1e7badb8a..c5150baa5 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java @@ -300,6 +300,13 @@ public class StateModel { int y = getMouseXY(e).y; Rectangle bounds = createCurrentBounds(x, y); + // 有参数面板时 要考虑下参数面板的高度影响 + int yOffset = 0; + XLayoutContainer paramComponent = designer.getParaComponent(); + if (paramComponent != null) { + yOffset = paramComponent.getHeight(); + } + bounds.y = Math.max(bounds.y - yOffset, 0); if ((x != currentX) || (y != currentY)) { ArrayList creators = getHotspotCreators(bounds, designer.getRootComponent()); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XButton.java b/designer-form/src/main/java/com/fr/design/designer/creator/XButton.java index 44996df8c..9a627ab2c 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XButton.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XButton.java @@ -308,5 +308,4 @@ public class XButton extends XWidgetCreator { } } - } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java b/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java index b0f6e1158..c002bceb3 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java @@ -229,6 +229,9 @@ public class XChartEditor extends XBorderStyleWidgetCreator { */ public void paint(Graphics g) { designerEditor.paintEditor(g, this.getSize()); + if (coverPanel != null) { + coverPanel.setSize(this.getSize()); + } super.paint(g); if (isEditing) { g.setColor(INNER_BORDER_COLOR); @@ -258,6 +261,7 @@ public class XChartEditor extends XBorderStyleWidgetCreator { (e.getClickCount() == 2 || designer.getCursor().getType() == Cursor.HAND_CURSOR); displayCoverPane(!isEditing); selectionModel.selectACreatorAtMouseEvent(e); + editingMouseListener.refreshTopXCreator(isEditing); if (editingMouseListener.stopEditing()) { if (this != (XCreator) designer.getRootComponent()) { @@ -357,4 +361,5 @@ public class XChartEditor extends XBorderStyleWidgetCreator { public boolean supportMobileStyle() { return false; } + } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java b/designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java index dcb693883..ec83a1f9a 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java @@ -539,6 +539,8 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo selectionModel.selectACreatorAtMouseEvent(e); } + editingMouseListener.refreshTopXCreator(); + if (editingMouseListener.stopEditing() && this != designer.getRootComponent()) { ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, this); editingMouseListener.startEditing(this, adapter.getDesignerEditor(), adapter); @@ -798,10 +800,16 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo /** * 是否支持共享-现只支持报表块、图表、tab块、绝对布局 - * @return */ public boolean isSupportShared() { return false; } + /** + * 是否支持置顶显示 + */ + public boolean isTopable() { + return true; + } + } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java b/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java index 42069e4d8..0c4ea6313 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java @@ -336,4 +336,26 @@ public class XCreatorUtils { } return IOUtils.readIcon(iconPath); } + + public static boolean containComponent(Container ancestor, Container xCreator) { + while (xCreator != null && xCreator.getParent() != ancestor) { + xCreator = xCreator.getParent(); + } + return xCreator != null; + } + + /** + * 获取组件的最顶层XMainBorderLayout,没有则返回null + * */ + @Nullable + public static XWCardMainBorderLayout getTopXMainBorderLayout(Container creator) { + XWCardMainBorderLayout result = null; + while (creator != null) { + if (creator instanceof XWCardMainBorderLayout) { + result = (XWCardMainBorderLayout) creator; + } + creator = creator.getParent(); + } + return result; + } } \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java b/designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java index ec06a1597..718c30aeb 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java @@ -319,6 +319,7 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme public void respondClick(EditingMouseListener editingMouseListener,MouseEvent e){ HelpDialogManager.getInstance().setPane(coverPanel); super.respondClick(editingMouseListener, e); + editingMouseListener.refreshTopXCreator(); if (this.isHelpBtnOnFocus()) { coverPanel.setMsgDisplay(e); } else { @@ -370,4 +371,5 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme public boolean isSupportShared() { return true; } + } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XNameWidget.java b/designer-form/src/main/java/com/fr/design/designer/creator/XNameWidget.java index 267101787..0f78c5739 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XNameWidget.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XNameWidget.java @@ -68,9 +68,6 @@ public class XNameWidget extends XWidgetCreator { Widget widget; if (wc != null && (widget= wc.toWidget()) != null) { editor = XCreatorUtils.createXCreator(widget); - Widget currentWidget = toData(); - currentWidget.setVisible(widget.isVisible()); - currentWidget.setEnabled(widget.isEnabled()); this.setBorder(null); } else { this.setBorder(DEFALUTBORDER); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java index 6190ffaeb..2c88e6252 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java @@ -130,4 +130,9 @@ public class XWAbsoluteBodyLayout extends XWAbsoluteLayout { public boolean isSupportShared() { return false; } + + @Override + public boolean isTopable() { + return false; + } } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteLayout.java index b98c2a952..da268b0e6 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteLayout.java @@ -542,6 +542,7 @@ public class XWAbsoluteLayout extends XLayoutContainer { selectionModel.selectACreatorAtMouseEvent(e); designer.repaint(); + editingMouseListener.refreshTopXCreator(isEditing); if (editingMouseListener.stopEditing()) { if (this != designer.getRootComponent()) { @@ -606,4 +607,5 @@ public class XWAbsoluteLayout extends XLayoutContainer { return super.getWidgetPropertyUIProviders(); } } + } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java index 06aca3c1b..3e425b4cd 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java @@ -1222,6 +1222,11 @@ public class XWFitLayout extends XLayoutContainer { return false; } + @Override + public boolean isTopable() { + return false; + } + public boolean switch2FitBodyLayout(XCreator creator) { try { XWFitLayout xfl = (XWFitLayout) creator.getBackupParent(); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWParameterLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWParameterLayout.java index cb288c98c..1d37024d9 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWParameterLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWParameterLayout.java @@ -251,4 +251,8 @@ public class XWParameterLayout extends XWAbsoluteLayout { return false; } + @Override + public boolean isTopable() { + return false; + } } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java index 2cc56ee9b..964f0aa03 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java @@ -189,4 +189,5 @@ public class XWTitleLayout extends DedicateLayoutContainer { XCreator creator = getPropertyDescriptorCreator(); return creator.getWidgetPropertyUIProviders(); } + } \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java index 25da3e775..5b37ad313 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java @@ -16,10 +16,7 @@ import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XWBorderLayout; import com.fr.design.designer.creator.XWidgetCreator; -import com.fr.design.designer.properties.mobile.MobileBooKMarkUsePropertyUI; -import com.fr.design.form.util.FormDesignerUtils; import com.fr.design.form.util.XCreatorConstants; -import com.fr.design.fun.WidgetPropertyUIProvider; import com.fr.design.icon.IconPathConstants; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.EditingMouseListener; @@ -438,6 +435,7 @@ public class XWCardMainBorderLayout extends XWBorderLayout { setEditable(isEditing); selectionModel.selectACreatorAtMouseEvent(e); + editingMouseListener.refreshTopXCreator(isEditing); designer.repaint(); if (editingMouseListener.stopEditing()) { @@ -514,4 +512,5 @@ public class XWCardMainBorderLayout extends XWBorderLayout { public boolean isSupportShared() { return true; } + } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java index 49f246256..010a38217 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java @@ -248,6 +248,7 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { if (e.getClickCount() <= 1) { selectionModel.selectACreatorAtMouseEvent(e); } + editingMouseListener.refreshTopXCreator(); if (editingMouseListener.stopEditing()) { if (this != designer.getRootComponent()) { ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, this); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java index babc54b31..f6f6b2b41 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java @@ -204,6 +204,7 @@ public class XWCardTitleLayout extends XWBorderLayout { if (e.getClickCount() <= 1) { selectionModel.selectACreatorAtMouseEvent(e); } + editingMouseListener.refreshTopXCreator(); if (editingMouseListener.stopEditing()) { if (this != designer.getRootComponent()) { diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java index 8d5d232fa..a706674c7 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java @@ -639,4 +639,8 @@ public class XWTabFitLayout extends XWFitLayout { checkVisible(); } + @Override + public boolean isTopable() { + return true; + } } diff --git a/designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java b/designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java index 16ec4405d..78b606a7f 100644 --- a/designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java +++ b/designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java @@ -4,6 +4,7 @@ import com.fr.design.constants.UIConstants; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.gui.ilable.UILabel; +import com.fr.log.FineLoggerFactory; import javax.swing.Icon; import javax.swing.JTree; @@ -23,7 +24,12 @@ public class ComponentTreeCellRenderer extends DefaultTreeCellRenderer { if (value instanceof XCreator) { String name = ((XCreator) value).toData().getWidgetName(); setText(name); - Icon icon = XCreatorUtils.getCreatorIcon((XCreator) value); + Icon icon = null; + try { + icon = XCreatorUtils.getCreatorIcon((XCreator) value); + } catch (Exception e) { + FineLoggerFactory.getLogger().info("{} has not icon or has been deleted", name); + } if (icon != null) { setIcon(icon); } diff --git a/designer-form/src/main/java/com/fr/design/form/util/FormDesignerUtils.java b/designer-form/src/main/java/com/fr/design/form/util/FormDesignerUtils.java index 46377b1ad..352aa80e5 100644 --- a/designer-form/src/main/java/com/fr/design/form/util/FormDesignerUtils.java +++ b/designer-form/src/main/java/com/fr/design/form/util/FormDesignerUtils.java @@ -1,5 +1,6 @@ package com.fr.design.form.util; +import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.JTemplate; @@ -17,7 +18,7 @@ public class FormDesignerUtils { * @return */ public static boolean isAppRelayout(FormDesigner designer) { - if (!designer.getRootComponent().acceptType(WFitLayout.class)) { + if (!designer.getRootComponent().acceptType(XWFitLayout.class)) { return false; } return ((WFitLayout) designer.getRootComponent().toData()).isAppRelayout(); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java b/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java index a2f295f87..ee667fd38 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java @@ -2,7 +2,11 @@ package com.fr.design.mainframe; import com.fr.design.constants.UIConstants; import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.designer.creator.XLayoutContainer; +import com.fr.design.designer.creator.XWAbsoluteBodyLayout; +import com.fr.design.designer.creator.XWFitLayout; +import com.fr.design.designer.creator.cardlayout.XCardSwitchButton; import com.fr.design.designer.treeview.ComponentTreeCellRenderer; import com.fr.design.designer.treeview.ComponentTreeModel; import com.fr.design.gui.itree.UITreeUI; @@ -15,7 +19,9 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JTree; import javax.swing.SwingUtilities; +import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeCellRenderer; +import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import java.awt.BorderLayout; @@ -30,6 +36,9 @@ import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.Vector; public class ComponentTree extends JTree { @@ -129,6 +138,7 @@ public class ComponentTree extends JTree { setSelectionPaths(treepath); if (treepath.length > 0) { scrollPathToVisible(treepath[0]); + //expandPath(treepath[0]); } } @@ -228,6 +238,52 @@ public class ComponentTree extends JTree { repaint(); } + /** + * 获得树的展开路径 + * */ + public void getExpandNodes(List searchList) { + getExpandNodes((XLayoutContainer)designer.getTopContainer(),searchList); + } + + public void getExpandNodes(XLayoutContainer container, List searchList) { + TreePath treePath = buildTreePath(container); + if (isExpanded(treePath)) { + searchList.add(treePath); + for (int i = 0, size = container.getXCreatorCount(); i < size; i++) { + XCreator creator = container.getXCreator(i); + if (creator.acceptType(XLayoutContainer.class) || creator.acceptType(XCardSwitchButton.class)) { + getExpandNodes((XLayoutContainer) creator.getXCreator(), searchList); + } + } + } + //对绝对布局做特殊处理 + if (container.acceptType(XWFitLayout.class)) { + XWFitLayout bodyFitLayout = (XWFitLayout) container; + for (int j = 0; j < bodyFitLayout.getXCreatorCount(); j++) { + //类型是绝对布局并且还是body + if (bodyFitLayout.getXCreator(j).acceptType(XWAbsoluteBodyLayout.class)) { + container = (XLayoutContainer) bodyFitLayout.getXCreator(j); + getExpandNodes(container, searchList); + } + } + } + } + + /** + * 将树按照展开路径进行展开 + * */ + public void expandNodes(List list){ + for(TreePath treePath:list) { + if (treePath.getLastPathComponent() instanceof XLayoutContainer) { + XLayoutContainer creator= (XLayoutContainer) treePath.getLastPathComponent(); + if (XCreatorUtils.getParentXLayoutContainer(creator) == null) { + continue; + } + expandPath(treePath); + } + } + } + private TreePath buildTreePath(Component comp) { ArrayList path = new ArrayList(); Component parent = comp; diff --git a/designer-form/src/main/java/com/fr/design/mainframe/CoverPane.java b/designer-form/src/main/java/com/fr/design/mainframe/CoverPane.java index d692eaa5e..a4c401440 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/CoverPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/CoverPane.java @@ -8,7 +8,7 @@ import com.fr.general.IOUtils; import com.fr.stable.Constants; -import javax.swing.JPanel; +import javax.swing.JComponent; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Component; @@ -28,7 +28,7 @@ import java.awt.Rectangle; * Date: 14-7-24 * Time: 上午9:09 */ -public class CoverPane extends JPanel { +public class CoverPane extends JComponent { private UIButton editButton; private AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java b/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java index 183c0b08c..2f2d8eb5b 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java @@ -210,6 +210,7 @@ public class EditingMouseListener extends MouseInputAdapter { */ public void mouseReleased(MouseEvent e) { MouseEvent transEvent = new MouseEvent(e.getComponent(), MouseEvent.MOUSE_CLICKED, e.getWhen(), e.getModifiers(), e.getX(), e.getY(), e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger(), e.getButton()); + MouseEvent clickEvent = new MouseEvent(e.getComponent(), MouseEvent.MOUSE_CLICKED, e.getWhen(), e.getModifiers(), e.getX(), e.getY(), e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger(), e.getButton()); int oldX = e.getX(); int oldY = e.getY(); offsetEventPoint(e); @@ -234,14 +235,21 @@ public class EditingMouseListener extends MouseInputAdapter { lastPressEvent = null; lastXCreator = null; e.translatePoint(oldX - e.getX(), oldY - e.getY()); - if (pressX != oldX || pressY != oldY) { + if (isAutoFire(transEvent, clickEvent)) { // click只有在mouseReleased和mousePressed前后x/y坐标相等时才会被触发在mouseReleased之后 // 但是当使用者来回点击切换时 存在mouseReleased和mousePressed前后x/y坐标不相等的情况 即鼠标按下去的位置和鼠标释放的位置不相等 存在偏移 // 当这种偏移很小时 看起来就好像是点击了 实际上是手抖了或者鼠标轻微滑动了 所以这里对这种情况要有容错处理 - mouseClicked(transEvent); + mouseClicked(clickEvent); } } + private boolean isAutoFire(MouseEvent transEvent, MouseEvent clickEvent ) { + offsetEventPoint(transEvent); + XCreator xCreator = designer.getComponentAt(transEvent); + return (pressX != clickEvent.getX() || pressY != clickEvent.getY()) + && xCreator != null && xCreator.acceptType(XCardSwitchButton.class); + } + private void mouseDraggingRelease(MouseEvent e) { // 当前鼠标所在的组件 XCreator hoveredComponent = designer.getComponentAt(e.getX(), e.getY()); @@ -355,7 +363,7 @@ public class EditingMouseListener extends MouseInputAdapter { designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } // component.getParent() 是报表块所在的XWTitleLayout int minX = button.getX() + getParentPositionX(component, 0) - designer.getHorizontalScaleValue(); - int minY = button.getY() + getParentPositionY(component, 0) - designer.getVerticalScaleValue(); + int minY = button.getY() + getParentPositionY(component, 0) - designer.getVerticalScaleValue() + xElementCase.getY(); if (e.getX() + GAP - xElementCase.getInsets().left > minX && e.getX() - GAP - xElementCase.getInsets().left < minX + button.getWidth()) { if (e.getY() + GAP - xElementCase.getInsets().top > minY && e.getY() - GAP - xElementCase.getInsets().top < minY + button.getHeight()) { designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); @@ -397,16 +405,7 @@ public class EditingMouseListener extends MouseInputAdapter { } private void setCoverPaneNotDisplay(XCreator component, MouseEvent e, boolean isLinkedHelpDialog) { - if (xElementCase != null) { - int x = getParentPositionX(xElementCase, 0) - designer.getArea().getHorizontalValue(); - int y = getParentPositionY(xElementCase, 0) - designer.getArea().getVerticalValue(); - Rectangle rect = new Rectangle(x, y, xElementCase.getWidth(), xElementCase.getHeight()); - if (rect.contains(e.getPoint())) { - return; - } - xElementCase.displayCoverPane(false); - } if (xChartEditor != null) { xChartEditor.displayCoverPane(false); } @@ -417,6 +416,15 @@ public class EditingMouseListener extends MouseInputAdapter { if (xTopLayoutContainer != null) { xTopLayoutContainer.setMouseEnter(false); } + //不知道为什么要对XElementCase进行判断,但是直接return会有bug,所以把他放在最后 + if (xElementCase != null) { + int x = getParentPositionX(xElementCase, 0) - designer.getArea().getHorizontalValue(); + int y = getParentPositionY(xElementCase, 0) - designer.getArea().getVerticalValue(); + Rectangle rect = new Rectangle(x, y, xElementCase.getWidth(), xElementCase.getHeight()); + if (!rect.contains(e.getPoint())) { + xElementCase.displayCoverPane(false); + } + } designer.repaint(); } @@ -454,7 +462,7 @@ public class EditingMouseListener extends MouseInputAdapter { designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } int minX = button.getX() + getParentPositionX(component, 0) - designer.getHorizontalScaleValue(); - int minY = button.getY() + getParentPositionY(component, 0) - designer.getVerticalScaleValue(); + int minY = button.getY() + getParentPositionY(component, 0) - designer.getVerticalScaleValue() + xChartEditor.getY(); if (e.getX() + GAP > minX && e.getX() - GAP < minX + button.getWidth()) { if (e.getY() + GAP > minY && e.getY() - GAP < minY + button.getHeight()) { designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); @@ -692,6 +700,7 @@ public class EditingMouseListener extends MouseInputAdapter { currentXCreator.stopEditing(); currentXCreator = null; currentEditor = null; + refreshTopXCreator(); return true; } return true; @@ -719,4 +728,19 @@ public class EditingMouseListener extends MouseInputAdapter { } currentEditor.getEditorTarget().setBounds(bounds); } + + /** + * 刷新顶层组件 + * */ + public void refreshTopXCreator(boolean isEditing){ + designer.refreshTopXCreator(isEditing); + } + + /** + * 刷新顶层组件 + * */ + public void refreshTopXCreator(){ + refreshTopXCreator(false); + } + } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java b/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java index e5ce0f726..eefeb01a3 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java @@ -36,6 +36,8 @@ import com.fr.design.designer.creator.XWAbsoluteBodyLayout; import com.fr.design.designer.creator.XWAbsoluteLayout; import com.fr.design.designer.creator.XWBorderLayout; import com.fr.design.designer.creator.XWParameterLayout; +import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; +import com.fr.design.designer.creator.cardlayout.XWTabFitLayout; import com.fr.design.designer.properties.FormWidgetAuthorityEditPane; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.event.DesignerOpenedListener; @@ -121,6 +123,7 @@ public class FormDesigner extends TargetComponent
implements TreeSelection private FormArea formArea; private ConnectorHelper connectorHelper; private boolean isReportBlockEditing = false; + private TopXCreators topXCreators; //组件重叠 private boolean isWidgetsIntersect = false; @@ -184,6 +187,9 @@ public class FormDesigner extends TargetComponent implements TreeSelection new FormDesignerDropTarget(this);// 添加Drag and Drop. this.switchAction = switchAction; + topXCreators=new TopXCreators(this); + topXCreators.setVisible(true); + add(topXCreators); // 必须刷新"参数/控件树"面板,否则,若最近一次打开模版为 cpt,重启设计器,打开 frm,控件树消失 populateParameterPropertyPane(); @@ -825,6 +831,46 @@ public class FormDesigner extends TargetComponent implements TreeSelection return null; } + /** + * 从已选择的组件中找x,y所在的组件 + */ + private XCreator xCreatorAt(int x, int y, XCreator root) { + XCreator[] xCreators = selectionModel.getSelection().getSelectedCreators(); + for (XCreator creator : xCreators) { + boolean shouldContinue = creator == null + || !creator.isVisible() + || !XCreatorUtils.containComponent(root, creator); + if (shouldContinue) { + continue; + } + //如果组件为XWCardMainBorderLayout的子组件,直接从XWCardMainBorderLayout中去找 + XWCardMainBorderLayout borderLayout = XCreatorUtils.getTopXMainBorderLayout(creator); + if (borderLayout != null) { + return xCreatorAt(x, y, borderLayout, null); + } + if (creator instanceof XLayoutContainer) { + return xCreatorAt(x, y, creator, null); + } + x -= creator.getX(); + y -= creator.getY(); + Rectangle rect = ComponentUtils.computeVisibleRect(creator); + // 判断是否处于交叉区域 + if (!isIntersectArea(x, y, rect)) { + continue; + } + return creator; + } + return null; + } + + /** + * 刷新顶层组件 + * */ + public void refreshTopXCreator(boolean isEditing){ + topXCreators.refresh(); + topXCreators.setVisible(!isEditing); + } + private boolean isIntersectArea(int x, int y, Rectangle rect) { return x >= rect.getX() && (x <= (rect.getX() + rect.getWidth())) && (y >= rect.getY()) && (y <= (rect.getY() + rect.getHeight())); @@ -984,6 +1030,10 @@ public class FormDesigner extends TargetComponent implements TreeSelection invalidateLayout(); } + public TopXCreators getTopXCreators() { + return topXCreators; + } + public StateModel getStateModel() { return stateModel; } @@ -1001,9 +1051,19 @@ public class FormDesigner extends TargetComponent implements TreeSelection return getComponentAt(p.x, p.y); } + /** + * 先从已选择则的组件中去找,再遍历root去找 + * */ @Override public XCreator getComponentAt(int x, int y) { - return getComponentAt(x, y, null); + XLayoutContainer container = y < paraHeight - formArea.getVerticalValue() ? paraComponent : rootComponent; + if (container == null) { + container = rootComponent; + } + int relativeX = x + (int) (formArea.getHorizontalValue() / scale) - container.getX(); + int relativeY = y + (int) (formArea.getVerticalValue() / scale) - container.getY(); + XCreator result = xCreatorAt(relativeX, relativeY, container); + return result == null ? getComponentAt(x, y, null) : result; } @Nullable @@ -1311,6 +1371,10 @@ public class FormDesigner extends TargetComponent implements TreeSelection } } + public void paintTopCreators(Graphics clipg){ + topXCreators.paint(clipg); + } + /** * 重置组件边界 */ diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java b/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java index 26547229b..2a8e255e8 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java @@ -84,6 +84,7 @@ public class FormDesignerUI extends ComponentUI { // 设计参数面板 repaintPara(g, paraComponent, c); } + repaintTopXCreators(g); if (designer.isDrawLineMode() && designer.getDrawLineHelper().drawLining()) { designer.getDrawLineHelper().drawAuxiliaryLine(g); @@ -445,4 +446,8 @@ public class FormDesignerUI extends ComponentUI { ComponentUtils.resetBuffer(dbcomponents); } + private void repaintTopXCreators(Graphics g){ + designer.paintTopCreators(g); + } + } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java b/designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java index 6822422b2..f94475a76 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java @@ -24,12 +24,14 @@ import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.SwingUtilities; +import javax.swing.tree.TreePath; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.ArrayList; +import java.util.List; /** @@ -89,10 +91,13 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree /** * 刷新 */ + //TODO 太乱了,需要重写,监听器里加了监听器是什么意思,每次调用该方法都会添加一个新的监听器 public void refreshDockingView() { FormDesigner formDesigner = this.getEditingFormDesigner(); + List list = new ArrayList<>(); removeAll(); if (this.componentTree != null) { + componentTree.getExpandNodes(list); this.componentTree.removeAll(); } if (formDesigner == null) { @@ -100,6 +105,8 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree return; } componentTree = new ComponentTree(formDesigner); + //保证删除组件后组件树不收起 + componentTree.expandNodes(list); formDesigner.addDesignerEditListener(new DesignerEditListener() { @Override public void fireCreatorModified(DesignerEvent evt) { diff --git a/designer-form/src/main/java/com/fr/design/mainframe/TopXCreator.java b/designer-form/src/main/java/com/fr/design/mainframe/TopXCreator.java new file mode 100644 index 000000000..72541a1fe --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/mainframe/TopXCreator.java @@ -0,0 +1,68 @@ +package com.fr.design.mainframe; + +import com.fr.design.designer.creator.XCreator; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.WidgetPropertyPane; +import com.fr.design.utils.ComponentUtils; +import com.fr.stable.CoreGraphHelper; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseEvent; +import java.awt.geom.AffineTransform; +import java.awt.image.BufferedImage; +import java.util.ArrayList; + +/** + * @Author: Yuan.Wang + * @Date: 2020/8/31 + */ +public class TopXCreator extends JComponent { + private final FormDesigner designer; + private final XCreator creator; + + public TopXCreator(FormDesigner designer, XCreator creator) { + this.designer = designer; + this.creator = creator; + init(); + } + + private void init() { + setOpaque(false); + setBackground(null); + setLayout(null); + setBounds(calculateBounds()); + } + + + /** + * 重新设置组件大小 + * */ + public void resizeTopXCreator() { + setBounds(calculateBounds()); + } + + /** + * 计算显示大小 + * */ + private Rectangle calculateBounds() { + Rectangle rect = ComponentUtils.getRelativeBounds(creator); + Rectangle bounds = new Rectangle(0, 0, creator.getWidth(), creator.getHeight()); + bounds.x += (rect.x - designer.getHorizontalScaleValue()); + bounds.y += (rect.y - designer.getVerticalScaleValue()); + return bounds; + } + + + @Override + public void paint(Graphics g) { + super.paint(g); + ArrayList dbcomponents = new ArrayList(); + // 禁止双缓冲 + ComponentUtils.disableBuffer(creator, dbcomponents); + creator.paint(g); + // 恢复双缓冲 + ComponentUtils.resetBuffer(dbcomponents); + } +} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/TopXCreators.java b/designer-form/src/main/java/com/fr/design/mainframe/TopXCreators.java new file mode 100644 index 000000000..89b261bb9 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/mainframe/TopXCreators.java @@ -0,0 +1,82 @@ +package com.fr.design.mainframe; + +import com.fr.design.designer.beans.events.DesignerEvent; +import com.fr.design.designer.beans.models.SelectionModel; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XCreatorUtils; +import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; + +import javax.swing.*; +import java.awt.*; + + +/** + * 需要显示顶层的组件层 + * + * @Author: Yuan.Wang + * @Date: 2020/8/25 + */ +public class TopXCreators extends JComponent { + final private FormDesigner designer; + + public TopXCreators(FormDesigner designer) { + this.designer = designer; + init(); + } + + private void init() { + setLayout(null); + setVisible(false); + setBackground(null); + setOpaque(false); + designer.addDesignerEditListener(e -> { + if (e.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED) { + refresh(); + } + }); + } + + /** + * 选中的组件有变化时刷新 + */ + public void refresh() { + removeAll(); + addXCreators(); + } + + @Override + public void paint(Graphics g) { + setSize(designer.getSize()); + resizeTopXCreators(); + super.paint(g); + } + + /** + * 加入被选择的组件 + */ + private void addXCreators() { + SelectionModel selectionModel = designer.getSelectionModel(); + XCreator[] xCreators = selectionModel.getSelection().getSelectedCreators(); + for (XCreator creator : xCreators) { + if (!creator.isTopable()) { + continue; + } + XWCardMainBorderLayout topXMainBorderLayout = XCreatorUtils.getTopXMainBorderLayout(creator); + add(new TopXCreator(designer, creator)); + if (topXMainBorderLayout != null) { + add(new TopXCreator(designer, topXMainBorderLayout)); + } + + } + } + + /** + * 更新顶层组件的位置和大小 + */ + private void resizeTopXCreators() { + for (int i = 0, count = getComponentCount(); i < count; i++) { + TopXCreator topXCreator = (TopXCreator) getComponent(i); + topXCreator.resizeTopXCreator(); + } + } +} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/widget/UITreeComboBox.java b/designer-form/src/main/java/com/fr/design/mainframe/widget/UITreeComboBox.java index 4a59484e1..aab50fbcc 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/widget/UITreeComboBox.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/widget/UITreeComboBox.java @@ -3,16 +3,8 @@ package com.fr.design.mainframe.widget; /** * Created by xiaxiang on 2016/9/30. */ -import java.awt.*; -import java.awt.event.*; -import javax.swing.*; -import javax.swing.plaf.*; -import javax.swing.plaf.basic.*; -import javax.swing.plaf.metal.*; -import javax.swing.tree.*; - import com.fr.design.constants.UIConstants; -import com.fr.design.designer.beans.*; +import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.events.DesignerEditListener; import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.creator.XCreator; @@ -20,8 +12,36 @@ import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icombobox.UIComboBoxUI; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.mainframe.ComponentTree; -import com.sun.java.swing.plaf.motif.*; -import com.sun.java.swing.plaf.windows.*; +import com.sun.java.swing.plaf.motif.MotifComboBoxUI; + +import javax.swing.DefaultListCellRenderer; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JTree; +import javax.swing.ListCellRenderer; +import javax.swing.MenuSelectionManager; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.plaf.ComboBoxUI; +import javax.swing.plaf.basic.ComboPopup; +import javax.swing.plaf.metal.MetalComboBoxUI; +import javax.swing.tree.TreeCellRenderer; +import javax.swing.tree.TreePath; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Rectangle; +import java.awt.event.KeyListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionAdapter; +import java.awt.event.MouseMotionListener; /** * 控件树下拉列表框 @@ -111,12 +131,6 @@ public class UITreeComboBox extends UIComboBox { } } - class WindowsJTreeComboBoxUI extends WindowsComboBoxUI{ - protected ComboPopup createPopup() { - return new TreePopup(comboBox); - } - } - class UIJTreeComboBoxUI extends UIComboBoxUI { protected ComboPopup createPopup() { return new TreePopup(comboBox); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java index b68833f83..80c8b2d0b 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java @@ -456,12 +456,17 @@ public class JWorkBook extends JTemplate { grid.setHorizontalExtent(GridUtils.getExtentValue(0, columnWidthList, grid.getWidth(), resolution)); elementCasePane.getGrid().updateUI(); //更新Column和Row - ((DynamicScrollBar) elementCasePane.getVerticalScrollBar()).setDpi(resolution); - ((DynamicScrollBar) elementCasePane.getHorizontalScrollBar()).setDpi(resolution); + DynamicScrollBar verticalScrollBar = (DynamicScrollBar) elementCasePane.getVerticalScrollBar(); + DynamicScrollBar horizontalScrollBar = (DynamicScrollBar) elementCasePane.getHorizontalScrollBar(); + verticalScrollBar.setDpi(resolution); + horizontalScrollBar.setDpi(resolution); elementCasePane.getGridColumn().setResolution(resolution); elementCasePane.getGridColumn().updateUI(); elementCasePane.getGridRow().setResolution(resolution); elementCasePane.getGridRow().updateUI(); + //Yvan:更新滚动条值(主要是为了重置滚动条里的BoundedRangeModel的extent值),使之随着界面缩放 + verticalScrollBar.setValue(verticalScrollBar.getValue()); + horizontalScrollBar.setValue(horizontalScrollBar.getValue()); } if (polyDezi != null) { polyDezi.setResolution(resolution); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java index c8f92721c..503a4f413 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java @@ -49,9 +49,7 @@ public class BottomModel extends AlphaCellModel { public void doAction() { try { Desktop.getDesktop().browse(new URI(AlphaFineConstants.ALPHA_GO_TO_FORUM)); - } catch (IOException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); - } catch (URISyntaxException e) { + } catch (IOException | URISyntaxException e) { FineLoggerFactory.getLogger().error(e.getMessage()); } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java index 07f5b4d4e..da44fa510 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java @@ -106,11 +106,10 @@ public class ContentCellRender implements ListCellRenderer { if (strings == null) { return modelName; } - for (int i = 0; i < strings.length; i++) { - String primaryStr = getReplacedString(modelName, strings[i]); - modelName = modelName.replaceAll("(?i)" + strings[i], "|" + strings[i] + "|"); + for (String string : strings) { + String primaryStr = getReplacedString(modelName, string); if (StringUtils.isNotEmpty(primaryStr)) { - modelName = modelName.replaceAll(strings[i], primaryStr); + modelName = modelName.replaceAll("(?i)" + primaryStr, "|" + primaryStr + "|"); } } modelName = "