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 dcc588fa3..17ca1083a 100644 --- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java +++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java @@ -146,7 +146,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { /** * alphafine */ - private AlphaFineConfigManager alphaFineConfigManager = new AlphaFineConfigManager(); + private AlphaFineConfigManager alphaFineConfigManager = AlphaFineConfigManager.getInstance(); private DesignerPushUpdateConfigManager designerPushUpdateConfigManager = DesignerPushUpdateConfigManager.getInstance(); @@ -1510,7 +1510,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { } private void readAlphaFineAttr(XMLableReader reader) { - reader.readXMLObject(this.alphaFineConfigManager = new AlphaFineConfigManager()); + reader.readXMLObject(this.alphaFineConfigManager = AlphaFineConfigManager.getInstance()); } private void readHttpsParas(XMLableReader reader) { diff --git a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java index c853db169..029632709 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java @@ -1,19 +1,29 @@ package com.fr.design.actions.help.alphafine; +import com.fr.general.ComparatorUtils; import com.fr.license.function.VT4FR; import com.fr.stable.OperatingSystem; import com.fr.stable.StringUtils; import com.fr.stable.xml.XMLPrintWriter; +import com.fr.stable.xml.XMLReadable; import com.fr.stable.xml.XMLable; import com.fr.stable.xml.XMLableReader; +import org.jetbrains.annotations.NotNull; import javax.swing.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; /** - * Created by XiaXiang on 2017/4/5. + * AlphaFine配置类 + * + * @author XiaXiang + * @date 2017/4/5 */ public class AlphaFineConfigManager implements XMLable { + private static final long serialVersionUID = -8170289826729582122L; private static AlphaFineConfigManager alphaFineConfigManager = new AlphaFineConfigManager(); /** * 是否开启alphafine @@ -56,12 +66,12 @@ public class AlphaFineConfigManager implements XMLable { */ private boolean containPlugin = true; /** - * 分词搜索 - */ + * 分词搜索 + */ private boolean needSegmentationCheckbox = true; /** - * 智能客服 - */ + * 智能客服 + */ private boolean needIntelligentCustomerService = true; /** * 快捷键 @@ -71,24 +81,30 @@ public class AlphaFineConfigManager implements XMLable { * 是否提醒 */ private boolean needRemind = true; + + private Map actionSearchTextCache = new HashMap<>(8); + + private String cacheBuildNO; /** * 直接操作菜单次数 */ private int operateCount; + private AlphaFineConfigManager() { + } + public static AlphaFineConfigManager getInstance() { return alphaFineConfigManager; } public static boolean isALPHALicAvailable() { - + return VT4FR.AlphaFine.isSupport(); } @Override public Object clone() throws CloneNotSupportedException { - AlphaFineConfigManager manager = (AlphaFineConfigManager) super.clone(); - return manager; + return super.clone(); } @Override @@ -107,9 +123,33 @@ public class AlphaFineConfigManager implements XMLable { this.setShortcuts(reader.getAttrAsString("shortcuts", getDefaultShortCuts())); this.setNeedRemind(reader.getAttrAsBoolean("isNeedRemind", true)); this.setOperateCount(reader.getAttrAsInt("operateCount", 0)); - + } else if (reader.isChildNode()) { + if (ComparatorUtils.equals(reader.getTagName(), "ActionSearchTextCache")) { + readActionSearchTextCacheXML(reader); + } } + } + /** + * 读出搜索缓存 + */ + private void readActionSearchTextCacheXML(XMLableReader reader) { + reader.readXMLObject(new XMLReadable() { + @Override + public void readXML(XMLableReader reader) { + if (ComparatorUtils.equals(reader.getTagName(), "ActionSearchTextCache")) { + setCacheBuildNO(reader.getAttrAsString("buildNO", "")); + } else if (ComparatorUtils.equals(reader.getTagName(), "item")) { + String tmpVal = reader.getElementValue(); + if (tmpVal != null) { + actionSearchTextCache.put(reader.getAttrAsString("key", ""), tmpVal); + } else { + actionSearchTextCache.put(reader.getAttrAsString("key", ""), StringUtils.EMPTY); + } + + } + } + }); } @Override @@ -128,6 +168,18 @@ public class AlphaFineConfigManager implements XMLable { .attr("operateCount", this.getOperateCount()) .attr("needSegmentationCheckbox", this.isNeedSegmentationCheckbox()) .attr("needIntelligentCustomerService", this.isNeedIntelligentCustomerService()); + writeActionSearchTextCacheXML(writer); + writer.end(); + } + + /** + * 写入搜索缓存 + */ + private void writeActionSearchTextCacheXML(XMLPrintWriter writer) { + writer.startTAG("ActionSearchTextCache").attr("buildNO", cacheBuildNO); + for (Map.Entry item : actionSearchTextCache.entrySet()) { + writer.startTAG("item").attr("key", item.getKey()).textNode(item.getValue()).end(); + } writer.end(); } @@ -262,4 +314,25 @@ public class AlphaFineConfigManager implements XMLable { public void setOperateCount(int operateCount) { this.operateCount = operateCount; } + + @NotNull + public Map getActionSearchTextCache() { + return Collections.unmodifiableMap(actionSearchTextCache); + } + + public void setActionSearchTextCache(@NotNull String key, @NotNull String value) { + this.actionSearchTextCache.put(key, value); + } + + @NotNull + public String getCacheBuildNO() { + if (cacheBuildNO == null) { + return StringUtils.EMPTY; + } + return cacheBuildNO; + } + + public void setCacheBuildNO(@NotNull String cacheBuildNO) { + this.cacheBuildNO = cacheBuildNO; + } } diff --git a/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java b/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java new file mode 100644 index 000000000..d62a84f78 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java @@ -0,0 +1,34 @@ +package com.fr.design.constants; + +import com.fr.event.Event; +import com.fr.event.EventDispatcher; +import com.fr.event.Null; + +/** + * 设计器启动事件类型 + * + * @author vito + * @date 2019-06-18 + */ +public enum DesignerLaunchStatus implements Event { + /** + * 初始化环境完成 + */ + WORKSPACE_INIT_COMPLETE, + + /** + * 设计器模块启动完成 + */ + DESIGNER_INIT_COMPLETE; + + private static DesignerLaunchStatus status; + + public static DesignerLaunchStatus getStatus() { + return status; + } + + public static void setStatus(DesignerLaunchStatus state) { + status = state; + EventDispatcher.fire(DesignerLaunchStatus.getStatus()); + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/BaseHyperlinkGroup.java b/designer-base/src/main/java/com/fr/design/gui/frpane/BaseHyperlinkGroup.java index 898101698..0c02e6c5c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/BaseHyperlinkGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/BaseHyperlinkGroup.java @@ -4,6 +4,7 @@ import com.fr.design.gui.controlpane.NameableCreator; import com.fr.design.module.DesignModuleFactory; import com.fr.js.JavaScript; import com.fr.stable.Filter; +import org.jetbrains.annotations.NotNull; /** * 基础的超级链接类型, 不包括图表相关超链. @@ -18,6 +19,8 @@ public class BaseHyperlinkGroup implements HyperlinkGroupType { * * @return NameableCreator[] */ + @NotNull + @Override public NameableCreator[] getHyperlinkCreators() { return DesignModuleFactory.getCreators4Hyperlink(); } diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/HyperlinkGroupType.java b/designer-base/src/main/java/com/fr/design/gui/frpane/HyperlinkGroupType.java index 8db0b9b94..4c5aec60e 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/HyperlinkGroupType.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/HyperlinkGroupType.java @@ -3,6 +3,7 @@ package com.fr.design.gui.frpane; import com.fr.design.gui.controlpane.NameableCreator; import com.fr.js.JavaScript; import com.fr.stable.Filter; +import org.jetbrains.annotations.NotNull; /** * 超级链接 支持的类型 种类. @@ -17,6 +18,7 @@ public interface HyperlinkGroupType { * * @return NameableCreator[] */ + @NotNull NameableCreator[] getHyperlinkCreators(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java index dcc053e12..8f4a4f3d8 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java @@ -1,29 +1,46 @@ package com.fr.design.mainframe.toolbar; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.actions.UpdateAction; +import com.fr.design.actions.help.alphafine.AlphaFineConfigManager; +import com.fr.design.constants.DesignerLaunchStatus; import com.fr.design.gui.frpane.LoadingBasicPane; -import com.fr.design.utils.concurrent.ThreadFactoryBuilder; +import com.fr.event.Event; +import com.fr.event.EventDispatcher; +import com.fr.event.Listener; +import com.fr.event.Null; import com.fr.general.ComparatorUtils; +import com.fr.general.GeneralUtils; import com.fr.log.FineLoggerFactory; import com.fr.stable.StableUtils; -import javax.swing.JPanel; +import javax.swing.*; +import java.util.HashMap; import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** - * Created by XiaXiang on 2017/4/13. + * 按钮面板管理类 + * + * @author XiaXiang + * @date 2017/4/13 */ public class UpdateActionManager { private static UpdateActionManager updateActionManager = null; + private List updateActions; - private ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( - 1, 2, - 30000L, TimeUnit.MILLISECONDS, - new LinkedBlockingQueue(), - new ThreadFactoryBuilder().setNameFormat("alphafine-thread-%s").build());//目前测下来一个线程慢慢做处理总共大概也只要两秒,暂时就这样 + + private Map updateActionsIndexCache = new HashMap<>(16); + + private static boolean isRegisterIndexSearchTextTask = false; + + /** + * 限制初始化 + */ + private UpdateActionManager() { + } public synchronized static UpdateActionManager getUpdateActionManager() { if (updateActionManager == null) { @@ -55,22 +72,92 @@ public class UpdateActionManager { return null; } - public synchronized void dealWithSearchText(final String paneClass, final UpdateAction updateAction) { - threadPoolExecutor.allowCoreThreadTimeOut(true); - threadPoolExecutor.execute(new Runnable() { + /** + * 处理action的搜索文本。 + * 缓存逻辑: + * 1.首次索引或缓存失效的时候(更新版本会使缓存失效),会将索引缓存存到env.xml, + * 下次直接加载。 + * 2.需要重新索引,则等待设计器初始化完毕之后单线程运行索引任务。 + * + * @param paneClass 面板类名 + * @param updateAction 待处理的updateAction + */ + public void dealWithSearchText(String paneClass, UpdateAction updateAction) { + Map actionSearchTextCache = AlphaFineConfigManager.getInstance().getActionSearchTextCache(); + if (!cacheValid() + || actionSearchTextCache.isEmpty() + || !actionSearchTextCache.containsKey(paneClass)) { + if (!updateActionsIndexCache.containsKey(paneClass)) { + updateActionsIndexCache.put(paneClass, updateAction); + } + registerIndexSearchTextTask(); + } else { + updateAction.setSearchText(actionSearchTextCache.get(paneClass)); + } + } + + /** + * 缓存是否有效。 + * 注意:开发工程版本为不是安装版本, + * 索引只会出现在首次启动。 + * + * @return true有效,false失效 + */ + private boolean cacheValid() { + return ComparatorUtils.equals(GeneralUtils.readBuildNO(), AlphaFineConfigManager.getInstance().getCacheBuildNO()); + } + + /** + * 由于是UI线程不考虑并发问题 + */ + private void registerIndexSearchTextTask() { + if (isRegisterIndexSearchTextTask) { + return; + } + isRegisterIndexSearchTextTask = true; + // 没有缓存或者缓存失效的时候,等待设计器启动之后开始索引任务 + EventDispatcher.listen(DesignerLaunchStatus.DESIGNER_INIT_COMPLETE, new Listener() { @Override - public void run() { - JPanel panel = null; - try { - panel = (JPanel) StableUtils.classForName(paneClass).newInstance(); - if (panel instanceof LoadingBasicPane) { - panel = ((LoadingBasicPane) panel).getAllComponents(); - } - updateAction.setSearchText(updateAction.getComponentTexts(panel, "_", new StringBuffer(), new StringBuffer(), new StringBuffer())); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + public void on(Event event, Null param) { + // 使用单线程索引 + ExecutorService es = Executors.newSingleThreadExecutor(new NamedThreadFactory("IndexAlphaFineSearchText")); + for (Map.Entry cache : updateActionsIndexCache.entrySet()) { + es.execute(new IndexTask(cache.getKey(), cache.getValue())); } + updateActionsIndexCache = null; + es.shutdown(); + // 标记一下缓存版本 + AlphaFineConfigManager.getInstance().setCacheBuildNO(GeneralUtils.readBuildNO()); } }); } + + /** + * 索引任务 + */ + class IndexTask implements Runnable { + private String className; + private UpdateAction updateAction; + + IndexTask(String className, UpdateAction updateAction) { + this.className = className; + this.updateAction = updateAction; + } + + @Override + public void run() { + JPanel panel; + try { + panel = (JPanel) StableUtils.classForName(className).newInstance(); + if (panel instanceof LoadingBasicPane) { + panel = ((LoadingBasicPane) panel).getAllComponents(); + } + String componentTexts = updateAction.getComponentTexts(panel, "_", new StringBuffer(), new StringBuffer(), new StringBuffer()); + updateAction.setSearchText(componentTexts); + AlphaFineConfigManager.getInstance().setActionSearchTextCache(className, componentTexts); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/menu/ToolBarDef.java b/designer-base/src/main/java/com/fr/design/menu/ToolBarDef.java index dde3acec6..07c51312e 100644 --- a/designer-base/src/main/java/com/fr/design/menu/ToolBarDef.java +++ b/designer-base/src/main/java/com/fr/design/menu/ToolBarDef.java @@ -2,25 +2,27 @@ package com.fr.design.menu; import com.fr.design.gui.itoolbar.UIToolBarUI; import com.fr.design.gui.itoolbar.UIToolbar; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** * Define toolbar.. */ -public class ToolBarDef { - +public class ToolBarDef { + // item List. private List shortcutList = new ArrayList(); - /* + /** * 一个static的方法生成一个JToolBar */ public static UIToolbar createJToolBar(final Color background) { - UIToolbar toolbar = new UIToolbar(FlowLayout.LEFT, new UIToolBarUI(){ + UIToolbar toolbar = new UIToolbar(FlowLayout.LEFT, new UIToolBarUI() { @Override public void paint(Graphics g, JComponent c) { Graphics2D g2 = (Graphics2D) g; @@ -33,13 +35,13 @@ public class ToolBarDef { } - /* + /** * 一个static的方法生成一个JToolBar */ public static UIToolbar createJToolBar() { - UIToolbar toolbar = new UIToolbar(FlowLayout.LEFT); + UIToolbar toolbar = new UIToolbar(FlowLayout.LEFT); toolbar.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0)); - return toolbar; + return toolbar; } public ToolBarDef() { @@ -49,31 +51,34 @@ public class ToolBarDef { return this.shortcutList.size(); } + @Nullable public ShortCut getShortCut(int index) { return this.shortcutList.get(index); } -// 用可变参数,方便添加数组 + /** + * 用可变参数,方便添加数组 + */ public void addShortCut(ShortCut... shortcut) { - for(ShortCut i : shortcut){ - this.shortcutList.add(i); - } + Collections.addAll(this.shortcutList, shortcut); } - + public void clearShortCuts() { this.shortcutList.clear(); } - /* + /** * 根据当前的ToolBarDef,更新toolBar */ public void updateToolBar(UIToolbar toolBar) { toolBar.removeAll(); - + int actionCount = this.getShortCutCount(); for (int i = 0; i < actionCount; i++) { - ShortCut shortcut = this.getShortCut(i); - shortcut.intoJToolBar(toolBar); + ShortCut shortcut = this.getShortCut(i); + if (shortcut != null) { + shortcut.intoJToolBar(toolBar); + } } } diff --git a/designer-base/src/main/java/com/fr/design/module/DesignModuleFactory.java b/designer-base/src/main/java/com/fr/design/module/DesignModuleFactory.java index 22ea7aa35..74cf7cbd3 100644 --- a/designer-base/src/main/java/com/fr/design/module/DesignModuleFactory.java +++ b/designer-base/src/main/java/com/fr/design/module/DesignModuleFactory.java @@ -16,6 +16,7 @@ import com.fr.design.parameter.ParameterReader; import com.fr.form.ui.Widget; import com.fr.log.FineLoggerFactory; import com.fr.stable.StableUtils; +import org.jetbrains.annotations.NotNull; import java.awt.Dialog; import java.awt.Frame; @@ -65,8 +66,9 @@ public class DesignModuleFactory { instance.creators4Hyperlink = nameableCreators; } + @NotNull public static NameableCreator[] getCreators4Hyperlink() { - return instance.creators4Hyperlink; + return instance.creators4Hyperlink == null? new NameableCreator[0]:instance.creators4Hyperlink; } public static void registerExtraWidgetOptions(WidgetOption[] options) { diff --git a/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateDialog.java b/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateDialog.java index ab093605e..d35b1dd54 100644 --- a/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateDialog.java @@ -37,6 +37,7 @@ class DesignerPushUpdateDialog extends UIDialog { static void createAndShow(final Frame parent, final DesignerUpdateInfo updateInfo) { SwingUtilities.invokeLater(new Runnable() { + @Override public void run() { DesignerPushUpdateDialog dialog = new DesignerPushUpdateDialog(parent); dialog.populate(updateInfo); diff --git a/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateManager.java b/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateManager.java index dcb5d45fd..44cfb146b 100644 --- a/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateManager.java +++ b/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateManager.java @@ -1,5 +1,6 @@ package com.fr.design.update.push; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.event.DesignerOpenedListener; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrame; @@ -13,12 +14,17 @@ import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + /** * Created by plough on 2019/4/8. */ public class DesignerPushUpdateManager { private static final String SPLIT_CHAR = "-"; private static DesignerPushUpdateManager singleton; + private final ExecutorService checkUpdateService = Executors.newSingleThreadExecutor(new NamedThreadFactory("DesignerCheckUpdate")); + private final ExecutorService updateService = Executors.newSingleThreadExecutor(new NamedThreadFactory("DesignerUpdate")); private DesignerUpdateInfo updateInfo; @@ -94,7 +100,7 @@ public class DesignerPushUpdateManager { * 检查更新,如果有合适的更新版本,则弹窗 */ private void checkAndPop() { - new Thread() { + checkUpdateService.execute(new Runnable() { @Override public void run() { if (!shouldPopUp()) { @@ -104,7 +110,8 @@ public class DesignerPushUpdateManager { final DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); DesignerPushUpdateDialog.createAndShow(designerFrame, updateInfo); } - }.start(); + }); + checkUpdateService.shutdown(); } private boolean shouldPopUp() { @@ -146,14 +153,15 @@ public class DesignerPushUpdateManager { * 跳转到更新升级窗口,并自动开始更新 */ void doUpdate() { - new Thread() { + updateService.execute(new Runnable() { @Override public void run() { UpdateMainDialog dialog = new UpdateMainDialog(DesignerContext.getDesignerFrame()); dialog.setAutoUpdateAfterInit(); dialog.showDialog(); } - }.start(); + }); + updateService.shutdown(); } /** diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartDesignerActivator.java b/designer-chart/src/main/java/com/fr/design/chart/ChartDesignerActivator.java index c3213c10b..2034f4591 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartDesignerActivator.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartDesignerActivator.java @@ -4,6 +4,7 @@ import com.fr.chart.chartattr.ChartCollection; import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.actions.core.ActionFactory; import com.fr.design.chart.gui.ChartComponent; +import com.fr.design.constants.DesignerLaunchStatus; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.mainframe.ChartPropertyPane; import com.fr.design.module.ChartEmptyDataStyleAction; @@ -53,6 +54,8 @@ public class ChartDesignerActivator extends Activator implements Prepare { DesignImageEvent.registerDefaultCallbackEvent(HistoryTemplateListPane.getInstance()); DesignImageEvent.registerDownloadSourcesEvent(new DownloadOnlineSourcesHelper()); + DesignerLaunchStatus.setStatus(DesignerLaunchStatus.DESIGNER_INIT_COMPLETE); + ChartTypeInterfaceManager.addPluginChangedListener(); } diff --git a/designer-chart/src/main/java/com/fr/design/module/ChartHyperlinkGroup.java b/designer-chart/src/main/java/com/fr/design/module/ChartHyperlinkGroup.java index 4e5037109..1c4d92752 100644 --- a/designer-chart/src/main/java/com/fr/design/module/ChartHyperlinkGroup.java +++ b/designer-chart/src/main/java/com/fr/design/module/ChartHyperlinkGroup.java @@ -19,6 +19,7 @@ import com.fr.js.JavaScript; import com.fr.stable.ArrayUtils; import com.fr.stable.Filter; import com.fr.stable.bridge.StableFactory; +import org.jetbrains.annotations.NotNull; /** * 图表的超级链接界面. 比一般的HyperlinkGroupPane多了图表的相关超级链接 @@ -33,6 +34,8 @@ public class ChartHyperlinkGroup extends BaseHyperlinkGroup { * * @return NameableCreator[] */ + @NotNull + @Override public NameableCreator[] getHyperlinkCreators() { FormHyperlinkProvider formHyperlink = StableFactory.getMarkedInstanceObjectFromClass(FormHyperlinkProvider.XML_TAG, FormHyperlinkProvider.class); diff --git a/designer-chart/src/main/java/com/fr/design/module/FormHyperlinkGroup.java b/designer-chart/src/main/java/com/fr/design/module/FormHyperlinkGroup.java index f10964d4c..65ad2594d 100644 --- a/designer-chart/src/main/java/com/fr/design/module/FormHyperlinkGroup.java +++ b/designer-chart/src/main/java/com/fr/design/module/FormHyperlinkGroup.java @@ -11,6 +11,7 @@ import com.fr.design.gui.frpane.BaseHyperlinkGroup; import com.fr.js.FormHyperlinkProvider; import com.fr.stable.ArrayUtils; import com.fr.stable.bridge.StableFactory; +import org.jetbrains.annotations.NotNull; /** * Created with IntelliJ IDEA. @@ -25,6 +26,8 @@ public class FormHyperlinkGroup extends BaseHyperlinkGroup { * * @return NameableCreator[] */ + @NotNull + @Override public NameableCreator[] getHyperlinkCreators() { FormHyperlinkProvider formHyperlink = StableFactory.getMarkedInstanceObjectFromClass(FormHyperlinkProvider.XML_TAG, FormHyperlinkProvider.class); NameableCreator[] related4ChartHyper = { 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 b16aa1b42..b68a5f72e 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 @@ -526,7 +526,10 @@ public abstract class ElementCasePane extends Tar !ComparatorUtils.equals(EastRegionContainerPane.getInstance().getCellAttrPane(), CellElementPropertyPane.getInstance())) { try { //旧选中内容编辑器释放模板对象 - this.getCurrentEditor().release(); + QuickEditor editor = this.getCurrentEditor(); + if(editor != null){ + editor.release(); + } } catch (UnsupportedOperationException e) { FineLoggerFactory.getLogger().info("Nothing to release"); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java index 629839a29..24ae13eda 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java @@ -4,6 +4,7 @@ package com.fr.design.mainframe.bbs; import com.fr.base.FRContext; +import com.fr.concurrent.NamedThreadFactory; import com.fr.config.MarketConfig; import com.fr.design.DesignerEnvManager; import com.fr.design.constants.UIConstants; @@ -20,6 +21,8 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** @@ -111,7 +114,7 @@ public class UserInfoPane extends BasicPane { return StringUtils.EMPTY; } - public void updateBBSUserInfo(){ + public void updateBBSUserInfo() { String username = MarketConfig.getInstance().getBbsUsername(); if (StringUtils.isEmpty(username)) { markUnSignIn(); @@ -149,7 +152,8 @@ public class UserInfoPane extends BasicPane { } private void autoPushLoginDialog() { - Thread showBBSThread = new Thread(new Runnable() { + ExecutorService executorService = Executors.newSingleThreadExecutor(new NamedThreadFactory("BBSAutoPushLogin")); + executorService.execute(new Runnable() { @Override public void run() { @@ -185,7 +189,7 @@ public class UserInfoPane extends BasicPane { } }); - showBBSThread.start(); + executorService.shutdown(); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/QuickEditorRegion.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/QuickEditorRegion.java index 77dcebef1..6291c5ddf 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/QuickEditorRegion.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/QuickEditorRegion.java @@ -46,7 +46,7 @@ public class QuickEditorRegion extends JPanel { */ public void populate(final QuickEditor currentEditor) { this.removeAll(); - if (currentEditor.getComponentCount() == 0) { + if (currentEditor == null || currentEditor.getComponentCount() == 0) { this.add(getEmptyEditor(), BorderLayout.CENTER); } else { this.add(currentEditor, BorderLayout.CENTER); diff --git a/designer-realize/src/main/java/com/fr/grid/GridUI.java b/designer-realize/src/main/java/com/fr/grid/GridUI.java index 1bb88c7b0..f2f5395f1 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridUI.java +++ b/designer-realize/src/main/java/com/fr/grid/GridUI.java @@ -26,6 +26,7 @@ import com.fr.main.FineBook; import com.fr.page.PaperSettingProvider; import com.fr.page.ReportSettingsProvider; import com.fr.page.WatermarkPainter; +import com.fr.page.stable.PaperSetting; import com.fr.report.ReportHelper; import com.fr.report.cell.CellElement; import com.fr.report.cell.FloatElement; @@ -48,20 +49,9 @@ import com.fr.stable.script.CalculatorUtils; import com.fr.stable.unit.FU; import com.fr.third.antlr.ANTLRException; -import javax.swing.JComponent; -import javax.swing.UIManager; +import javax.swing.*; import javax.swing.plaf.ComponentUI; -import java.awt.AlphaComposite; -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Composite; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Paint; -import java.awt.Rectangle; -import java.awt.Shape; -import java.awt.Stroke; +import java.awt.*; import java.awt.geom.Area; import java.awt.geom.GeneralPath; import java.awt.geom.Line2D; @@ -118,7 +108,7 @@ public class GridUI extends ComponentUI { protected ReportSettingsProvider getReportSettings(ElementCase elementCase) { if (elementCase instanceof Report) { return ReportUtils.getReportSettings((Report) elementCase); - } else if(elementCase instanceof FormElementCase){ + } else if (elementCase instanceof FormElementCase) { return ((FormElementCase) elementCase).getReportSettings(); } else { return new ReportSettings(); @@ -141,6 +131,9 @@ public class GridUI extends ComponentUI { // richer;聚合报表设计中,最初的ElementCase还没有加到Report中,所以elementCase.getReport()可能为空 ReportSettingsProvider reportSettings = getReportSettings(elementCase); PaperSettingProvider psetting = reportSettings.getPaperSetting(); + if (psetting == null) { + psetting = new PaperSetting(); + } if (grid.getPaginateLineShowType() != Grid.NO_PAGINATE_LINE) {// paint paper margin line. PaperSize paperSize = psetting.getPaperSize(); Margin margin = psetting.getMargin(); diff --git a/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java b/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java index 99066e964..470b382c9 100644 --- a/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java +++ b/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java @@ -1,5 +1,6 @@ package com.fr.start.fx; +import com.fr.concurrent.NamedThreadFactory; import com.sun.javafx.iio.ImageFrame; import com.sun.javafx.iio.ImageLoadListener; import com.sun.javafx.iio.ImageLoader; @@ -14,6 +15,8 @@ import com.sun.prism.impl.PrismSettings; import java.io.IOException; import java.io.InputStream; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * 边加载边播放的gif加载器 @@ -36,7 +39,8 @@ class PrismImageLoader2 implements com.sun.javafx.tk.ImageLoader { delayTimes = new int[gifCount]; this.width = width; this.height = height; - new Thread() { + ExecutorService es = Executors.newSingleThreadExecutor(new NamedThreadFactory("PrismImageLoader2")); + es.execute(new Runnable() { @Override public void run() { InputStream inputStream = null; @@ -47,14 +51,16 @@ class PrismImageLoader2 implements com.sun.javafx.tk.ImageLoader { e.printStackTrace(); } finally { try { - inputStream.close(); + if (inputStream != null) { + inputStream.close(); + } } catch (IOException e) { e.printStackTrace(); } } } - }.start(); - + }); + es.shutdown(); } @Override @@ -108,6 +114,7 @@ class PrismImageLoader2 implements com.sun.javafx.tk.ImageLoader { return 40; } + @Override public int getLoopCount() { return 0; } diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java index 539e8359a..49d12eb9c 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java @@ -12,30 +12,31 @@ import com.fr.start.ServerStarter; */ @EnableMetrics public class DesignerStartup extends Activator { - + @Override @Metrics public void start() { - startSub(PreStartActivator.class); +// startSub(DesignerInitActivator.class); +// startSub(DesignerShowActivator.class); getSub("parallel").start(); //designer模块启动好后,查看demo browserDemo(); - startSub(DesignerShowActivator.class); + startSub(StartFinishActivator.class); FineRuntime.startFinish(); } - + private void browserDemo() { - + if (getModule().leftFindSingleton(StartupArgs.class) != null && getModule().leftFindSingleton(StartupArgs.class).isDemo()) { ServerStarter.browserDemoURL(); } } - - + + @Override public void stop() { - + } } diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java index a6ba2c009..e1779c3e2 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java @@ -2,6 +2,7 @@ package com.fr.start.module; import com.fr.design.DesignerEnvManager; import com.fr.design.EnvChangeEntrance; +import com.fr.design.constants.DesignerLaunchStatus; import com.fr.design.env.DesignerWorkspaceGenerator; import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.log.FineLoggerFactory; @@ -15,12 +16,12 @@ import com.fr.workspace.Workspace; * 设计器启动时的环境相关模块activator */ public class DesignerWorkspaceProvider extends Activator { - + @Override public void start() { //检查环境 DesignerEnvManager.checkNameEnvMap(); - + if (getModule().leftFindSingleton(StartupArgs.class) != null && getModule().leftFindSingleton(StartupArgs.class).isDemo()) { DesignerEnvManager.getEnvManager().setCurrentEnv2Default(); } else { @@ -39,13 +40,12 @@ public class DesignerWorkspaceProvider extends Activator { EnvChangeEntrance.getInstance().dealEvnExceptionWhenStartDesigner(); } } + DesignerLaunchStatus.setStatus(DesignerLaunchStatus.WORKSPACE_INIT_COMPLETE); } - - + @Override public void stop() { - + } - - + }