From f086badbf6a0d839f5cf141d80c724b044265ffb Mon Sep 17 00:00:00 2001 From: richie Date: Tue, 13 Nov 2018 12:04:05 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20=20websoc?= =?UTF-8?q?ket=E7=AB=AF=E5=8F=A3=E5=8F=AF=E4=BB=A5=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=A4=9A=E4=B8=AA=E5=8F=AF=E9=80=89=E7=AB=AF?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E8=AE=A9=E5=8D=95=E6=9C=BA=E5=A4=9A=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E9=9B=86=E7=BE=A4=E5=8F=AF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/socketio/DesignerSocketIO.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java index 132d72d17..bcf7450e1 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java @@ -68,8 +68,8 @@ public class DesignerSocketIO { return; } try { - String uri = getSocketUri(current); - socketIO = Optional.of(IO.socket(new URI(uri))); + String[] uri = getSocketUri(current); + socketIO = Optional.of(IO.socket(new URI(uri[0]))); socketIO.get().on(WorkspaceConstants.WS_LOGRECORD, printLog); socketIO.get().on(WorkspaceConstants.CONFIG_MODIFY, new Emitter.Listener() { @Override @@ -109,19 +109,23 @@ public class DesignerSocketIO { } } - private static String getSocketUri(Workspace current) throws IOException { + private static String[] getSocketUri(Workspace current) throws IOException { URL url = new URL(current.getPath()); - int port = WorkContext.getCurrent().get(SocketInfoOperator.class).getPort(); + Integer[] ports = WorkContext.getCurrent().get(SocketInfoOperator.class).getPort(); WorkspaceConnection connection = WorkContext.getCurrent().getConnection(); - return String.format("%s://%s:%s%s?%s=%s&%s=%s", - url.getProtocol(), - url.getHost(), - port, - WorkspaceConstants.WS_NAMESPACE, - DecisionServiceConstants.WEB_SOCKET_TOKEN_NAME, - connection.getToken(), - RemoteDesignConstants.USER_LOCK_ID, - connection.getId() - ); + String[] result = new String[ports.length]; + for (int i = 0; i < ports.length; i++ ) { + result[i] = String.format("%s://%s:%s%s?%s=%s&%s=%s", + url.getProtocol(), + url.getHost(), + ports[i], + WorkspaceConstants.WS_NAMESPACE, + DecisionServiceConstants.WEB_SOCKET_TOKEN_NAME, + connection.getToken(), + RemoteDesignConstants.USER_LOCK_ID, + connection.getId()); + } + return result; + } } From 5355d7dda4e6378403a8ab291600f370565e8ba7 Mon Sep 17 00:00:00 2001 From: "Mata.Li" Date: Wed, 14 Nov 2018 20:06:54 +0800 Subject: [PATCH 2/6] REPORT-12161 & REPORT-10599 --- .../java/com/fr/design/dialog/UIDialog.java | 23 +++++++++------ .../fr/design/javascript/JSContentPane.java | 27 ++++++++++++----- .../design/javascript/JavaScriptImplPane.java | 4 ++- .../fr/design/mainframe/DesignerFrame.java | 11 ++++++- .../com/fr/design/mainframe/JTemplate.java | 2 +- .../mainframe/toolbar/ToolBarMenuDock.java | 29 ++++++++++++++++--- .../design/mainframe/WidgetPropertyPane.java | 19 ++++++++---- .../fr/design/mainframe/ElementCasePane.java | 2 +- 8 files changed, 87 insertions(+), 30 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java b/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java index 7380bb58f..193a5ea07 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java +++ b/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java @@ -73,7 +73,7 @@ public abstract class UIDialog extends JDialog { } this.setName(pane.title4PopupWindow()); this.setModal(true); - this.pack(); + GUICoreUtils.centerWindow(this); } @@ -90,12 +90,10 @@ public abstract class UIDialog extends JDialog { //取消 addCancelButton(buttonsPane); - this.getRootPane().setDefaultButton(okButton); - return controlPane; } - protected void addCustomButton(JPanel buttonsPane){ + protected void addCustomButton(JPanel buttonsPane) { } @@ -110,6 +108,18 @@ public abstract class UIDialog extends JDialog { doCancel(); } }); + JPanel defaultPane = (JPanel) this.getContentPane(); + InputMap inputMapAncestor = defaultPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + ActionMap actionMap = defaultPane.getActionMap(); + + // transfer focus to CurrentEditor + inputMapAncestor.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "dialogOK"); + actionMap.put("dialogOK", new AbstractAction() { + + public void actionPerformed(ActionEvent evt) { + doOK(); + } + }); } private void addOkButton(JPanel buttonsPane) { @@ -130,7 +140,6 @@ public abstract class UIDialog extends JDialog { * 添加监听器 * * @param l 监听器 - * */ public void addDialogActionListener(DialogActionListener l) { listeners.add(l); @@ -138,7 +147,6 @@ public abstract class UIDialog extends JDialog { /** * 清除所有监听器 - * */ public void clearDialogActionListeners() { listeners.clear(); @@ -146,7 +154,6 @@ public abstract class UIDialog extends JDialog { /** * 确定操作 - * */ public void doOK() { try { @@ -177,7 +184,6 @@ public abstract class UIDialog extends JDialog { /** * 取消操作 - * */ public void doCancel() { @@ -224,7 +230,6 @@ public abstract class UIDialog extends JDialog { /** * 检测结果是否合法 - * */ public abstract void checkValid() throws Exception; diff --git a/designer-base/src/main/java/com/fr/design/javascript/JSContentPane.java b/designer-base/src/main/java/com/fr/design/javascript/JSContentPane.java index 77e16e312..cd6e01df3 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/JSContentPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/JSContentPane.java @@ -28,6 +28,7 @@ import java.util.ArrayList; public class JSContentPane extends BasicPane { private RSyntaxTextArea contentTextArea; private UILabel funNameLabel; + private AutoCompletion ac; private int titleWidth = 180; @@ -78,14 +79,6 @@ public class JSContentPane extends BasicPane { contentTextArea.setCodeFoldingEnabled(true); contentTextArea.setAntiAliasingEnabled(true); - CompletionProvider provider = createCompletionProvider(); - - AutoCompletion ac = new AutoCompletion(provider); - String shortCuts = DesignerEnvManager.getEnvManager().getAutoCompleteShortcuts(); - - ac.setTriggerKey(convert2KeyStroke(shortCuts)); - ac.install(contentTextArea); - UIScrollPane sp = new UIScrollPane(contentTextArea); this.add(sp, BorderLayout.CENTER); @@ -104,13 +97,31 @@ public class JSContentPane extends BasicPane { } public void populate(String js) { + if (ac == null) { + CompletionProvider provider = createCompletionProvider(); + ac = new AutoCompletion(provider); + String shortCuts = DesignerEnvManager.getEnvManager().getAutoCompleteShortcuts(); + + ac.setTriggerKey(convert2KeyStroke(shortCuts)); + ac.install(contentTextArea); + } + this.contentTextArea.setText(js); } public String update() { + if (ac != null) { + this.ac.uninstall(); + ac = null; + } + return this.contentTextArea.getText(); } + public void reset() { + this.contentTextArea.setText(null); + } + public void setFunctionTitle(String[] args) { funNameLabel.setText(createFunctionTitle(args)); } diff --git a/designer-base/src/main/java/com/fr/design/javascript/JavaScriptImplPane.java b/designer-base/src/main/java/com/fr/design/javascript/JavaScriptImplPane.java index 23a33976b..8806d6853 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/JavaScriptImplPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/JavaScriptImplPane.java @@ -138,6 +138,9 @@ public class JavaScriptImplPane extends AbstractHyperLinkPane { public void populateBean(JavaScriptImpl javaScriptImpl) { if (javaScriptImpl == null) { javaScriptImpl = new JavaScriptImpl(); + jsPane.reset(); + }else{ + jsPane.populate(javaScriptImpl.getContent()); } int rowCount = javaScriptImpl.getJSImportSize(); @@ -147,7 +150,6 @@ public class JavaScriptImplPane extends AbstractHyperLinkPane { } importedJsPane.populate(value); parameterPane.populate(javaScriptImpl.getParameters()); - jsPane.populate(javaScriptImpl.getContent()); if (itemNameTextField != null) { itemNameTextField.setText(javaScriptImpl.getItemName()); 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 be2695815..7d9a3d749 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 @@ -155,6 +155,9 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta // 右边的虚线 private DottedLine rightDottedLine; + //用于判断设计器是否打开了 + private boolean designerOpened = false; + private int contentWidth = (int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth()); private int contentHeight = (int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight()); @@ -351,7 +354,9 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta */ public void addDesignerOpenedListener(DesignerOpenedListener listener) { - designerOpenedListenerList.add(listener); + if (!designerOpened) { + designerOpenedListenerList.add(listener); + } } /** @@ -362,6 +367,10 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta for (DesignerOpenedListener listener : designerOpenedListenerList) { listener.designerOpened(); } + + designerOpened = true; + //使用完清除监听 + designerOpenedListenerList.clear(); } protected DesktopCardPane getCenterTemplateCardPane() { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index 737b5ba16..d14a066e5 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -780,7 +780,7 @@ public abstract class JTemplate> ((JTemplateActionListener) listeners[i + 1]).templateClosed(this); } } - + this.undoState = null; this.repaint(30); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index 8f20583ab..b46719efe 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -148,6 +148,9 @@ public abstract class ToolBarMenuDock { }; private static final String FINEREPORT = "FineReport"; private static final int MENUBAR_HEIGHT = 22; + + private static final List PLUGIN_LISTENERS = new ArrayList<>(); + private MenuDef[] menus; private ToolBarDef toolBarDef; private List shortCutsList; @@ -218,6 +221,8 @@ public abstract class ToolBarMenuDock { } public MenuDef[] menus(final ToolBarMenuDockPlus plus) { + //删除之前创建的插件菜单监听 + clearPluginListeners(); java.util.List menuList = new java.util.ArrayList(); // 添加文件菜单 menuList.add(createFileMenuDef(plus)); @@ -248,6 +253,15 @@ public abstract class ToolBarMenuDock { return menuList.toArray(new MenuDef[menuList.size()]); } + //清空监听 + private static synchronized void clearPluginListeners() { + + for (PluginEventListener listener : PLUGIN_LISTENERS) { + GeneralContext.stopListenPlugin(listener); + } + PLUGIN_LISTENERS.clear(); + } + /** * 获取所有actionmodel * @@ -644,7 +658,7 @@ public abstract class ToolBarMenuDock { } }; - GeneralContext.listenPlugin(PluginEventType.BeforeStop, new PluginEventListener() { + PluginEventListener beforeStop = new PluginEventListener() { @Override public void on(PluginEvent event) { @@ -652,8 +666,9 @@ public abstract class ToolBarMenuDock { Set menuHandlers = runtime.get(MenuHandler.MARK_STRING); removeExtraMenus(menuDef, anchor, action, menuHandlers); } - }, filter); - GeneralContext.listenPlugin(PluginEventType.AfterRun, new PluginEventListener() { + }; + + PluginEventListener afterRun = new PluginEventListener() { @Override public void on(PluginEvent event) { @@ -662,7 +677,13 @@ public abstract class ToolBarMenuDock { Set menuHandlers = runtime.get(MenuHandler.MARK_STRING); addExtraMenus(menuDef, anchor, action, menuHandlers); } - }, filter); + }; + + GeneralContext.listenPlugin(PluginEventType.BeforeStop, beforeStop, filter); + GeneralContext.listenPlugin(PluginEventType.AfterRun, afterRun, filter); + + PLUGIN_LISTENERS.add(afterRun); + PLUGIN_LISTENERS.add(beforeStop); } private void removeExtraMenus(MenuDef menuDef, String anchor, ShortCutMethodAction action, Set set) { diff --git a/designer-form/src/main/java/com/fr/design/mainframe/WidgetPropertyPane.java b/designer-form/src/main/java/com/fr/design/mainframe/WidgetPropertyPane.java index d6ee25342..0cf740dbe 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/WidgetPropertyPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/WidgetPropertyPane.java @@ -28,7 +28,7 @@ import java.util.Set; * 控件属性表绘制 * Modified by fanglei */ -public class WidgetPropertyPane extends FormDockView implements BaseWidgetPropertyPane { +public class WidgetPropertyPane extends FormDockView implements BaseWidgetPropertyPane { private static final int PADDING = 10; private static final int PADDING_M = 12; @@ -108,11 +108,10 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetPrope */ private void initTables() { formWidgetCardPane.populate(); - eventTable.refresh(); + if (mobileExtraPropertyPanes != null) { for (MobileWidgetDefinePane extraPane : mobileExtraPropertyPanes) { extraPane.initPropertyGroups(designer); - extraPane.populate(designer); } } if (widgetPropertyTables != null) { @@ -222,7 +221,7 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetPrope com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Widget_Mobile_Terminal") }; - final CardLayout tabbedPane = new CardLayout(); + final CardLayout tabbedPane = new CardLayout(); final JPanel center = new JPanel(tabbedPane); center.add(formWidgetCardPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Properties")); center.add(eventTable, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event")); @@ -232,6 +231,16 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetPrope tabsHeaderIconPane = new UIHeadGroup(tabTitles) { @Override public void tabChanged(int index) { + //切换的时候再populate + if (index == 1) { + eventTable.refresh(); + } else if (index == 2) { + if (mobileExtraPropertyPanes != null) { + for (MobileWidgetDefinePane extraPane : mobileExtraPropertyPanes) { + extraPane.populate(designer); + } + } + } tabbedPane.show(center, tabTitles[index]); } }; @@ -292,7 +301,7 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetPrope if (evt.getCreatorEventID() == DesignerEvent.CREATOR_DELETED || evt.getCreatorEventID() == DesignerEvent.CREATOR_RESIZED) { formWidgetCardPane.populate(); - } else if (evt.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED){ + } else if (evt.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED) { // 防止多次触发 if (lastAffectedCreator != null && lastAffectedCreator == evt.getAffectedCreator()) { return; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java index 8832ec4c3..df9476c71 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java @@ -596,7 +596,7 @@ public abstract class ElementCasePane extends Tar * @return 是则返回true */ public boolean isSelectedOneCell() { - return selection.isSelectedOneCell(this); + return (selection == null) ? false : selection.isSelectedOneCell(this); } /** From 916fcba1a67db2773edf3cf8469b9edcaacd7a9f Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 15 Nov 2018 11:13:30 +0800 Subject: [PATCH 3/6] =?UTF-8?q?REPORT-12697=20mac=E5=9C=A8jni=E5=9C=A8?= =?UTF-8?q?=E9=83=A8=E5=88=86=E7=B3=BB=E7=BB=9F=E4=B8=8B=E6=8A=A5=E7=AD=BE?= =?UTF-8?q?=E5=90=8D=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/com/fr/start/jni/splash.dylib | Bin 41248 -> 57200 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/designer-realize/src/main/resources/com/fr/start/jni/splash.dylib b/designer-realize/src/main/resources/com/fr/start/jni/splash.dylib index 5d096b2b37d34197e377f7b1ed115c3768bd0d08..2b59ee3eb04f6377b0a8f06d9f60096a1216ee32 100755 GIT binary patch literal 57200 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 literal 41248 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 Date: Thu, 15 Nov 2018 20:17:55 +0800 Subject: [PATCH 4/6] =?UTF-8?q?REPORT-12721=20HistoryTemplateListPane?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/file/HistoryTemplateListPane.java | 143 +++++++++++++++++- 1 file changed, 140 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListPane.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListPane.java index 073c4fd1d..73d305333 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListPane.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListPane.java @@ -1,16 +1,153 @@ package com.fr.design.file; +import com.fr.base.chart.chartdata.CallbackEvent; +import com.fr.design.mainframe.JTemplate; +import com.fr.file.FILE; +import com.fr.file.FileNodeFILE; + +import java.util.List; + /** * 历史模板缓存 - * + *

* 为可能存在的插件做兼容处理 * * @see HistoryTemplateListCache * @deprecated use HistoryTemplateListCache instead */ @Deprecated -public class HistoryTemplateListPane { - public static HistoryTemplateListCache getInstance() { +public class HistoryTemplateListPane implements CallbackEvent { + + + private static volatile HistoryTemplateListPane THIS; + + public static HistoryTemplateListPane getInstance() { + if (THIS == null) { + synchronized (HistoryTemplateListPane.class) { + if (THIS == null) { + THIS = new HistoryTemplateListPane(); + } + } + } + return THIS; + } + + private static HistoryTemplateListCache instead() { return HistoryTemplateListCache.getInstance(); } + + + /** + * 关闭选择的文件 + * + * @param selected 选择的 + */ + public void closeSelectedReport(JTemplate selected) { + instead().closeSelectedReport(selected); + } + + /** + * 临时关闭选择的文件 + * + * @param selected 选择的 + */ + public void closeVirtualSelectedReport(JTemplate selected) { + instead().closeVirtualSelectedReport(selected); + } + + + public JTemplate getCurrentEditingTemplate() { + return instead().getCurrentEditingTemplate(); + } + + public void setCurrentEditingTemplate(JTemplate jt) { + instead().setCurrentEditingTemplate(jt); + + } + + /** + * 添加历史记录 + */ + public void addHistory() { + instead().addHistory(); + } + + + public List> getHistoryList() { + return instead().getHistoryList(); + } + + + /** + * 清空历史记录 + */ + public void removeAllHistory() { + instead().removeAllHistory(); + } + + public int getHistoryCount() { + return instead().getHistoryCount(); + } + + + public JTemplate get(int index) { + return instead().get(index); + } + + + public JTemplate getTemplate(int index) { + return instead().getTemplate(index); + } + + /** + * 获取模板的index + * + * @param jt 模板 + * @return 位置 + */ + public int contains(JTemplate jt) { + return instead().contains(jt); + } + + + /** + * 判断是否打开过该模板 + * + * @param filename 文件名 + * @return 文件位置 + */ + public int contains(String filename) { + return instead().contains(filename); + } + + /** + * 是否是当前编辑的文件 + * + * @param filename 文件名 + * @return 是则返回TRUE + */ + public boolean isCurrentEditingFile(String filename) { + return instead().isCurrentEditingFile(filename); + } + + + public void callback() { + getCurrentEditingTemplate().repaint(); + } + + /** + * 打开new模板的同时关闭old模板,优先关已保存的、先打开的 + */ + public void closeOverLineTemplate() { + instead().closeOverLineTemplate(); + } + + + public void deleteFile(FileNodeFILE file) { + instead().deleteFile(file); + } + + public boolean rename(FILE tplFile, String from, String to) { + return instead().rename(tplFile, from, to); + } } From 8a9923d02a7e9d30111531b0b47027b706039536 Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Thu, 15 Nov 2018 20:24:24 +0800 Subject: [PATCH 5/6] =?UTF-8?q?REPORT-12721=20HistoryTemplateListPane?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/file/HistoryTemplateListPane.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListPane.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListPane.java index 73d305333..a51735f64 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListPane.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListPane.java @@ -131,8 +131,9 @@ public class HistoryTemplateListPane implements CallbackEvent { } + @Override public void callback() { - getCurrentEditingTemplate().repaint(); + instead().callback(); } /** From 3c40011366f54e8e4844cab5e3f409fc90abc43a Mon Sep 17 00:00:00 2001 From: richie Date: Fri, 16 Nov 2018 16:37:19 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=20=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=80=A6=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/fun/ConnectionProvider.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/fun/ConnectionProvider.java b/designer-base/src/main/java/com/fr/design/fun/ConnectionProvider.java index 766f7d414..8e5aed5b8 100644 --- a/designer-base/src/main/java/com/fr/design/fun/ConnectionProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/ConnectionProvider.java @@ -10,32 +10,36 @@ import com.fr.stable.fun.mark.Mutable; */ public interface ConnectionProvider extends Mutable { - public static final String XML_TAG = "ConnectionProvider"; + String XML_TAG = "ConnectionProvider"; // 2016-12-14 1 -> 2 , 增加connection.feature方法导致不兼容. int CURRENT_LEVEL = 2; /** * 数据连接弹出菜单的名字 + * * @return 名字 */ - public String nameForConnection(); + String nameForConnection(); /** * 数据连接弹出菜单的图标 + * * @return 图标路径 */ - public String iconPathForConnection(); + String iconPathForConnection(); /** * 数据连接的类型 + * * @return 连接类型 */ - public Class classForConnection(); + Class classForConnection(); /** * 数据连接的设计界面 + * * @return 设计界面 */ - public Class> appearanceForConnection(); + Class> appearanceForConnection(); } \ No newline at end of file