From 5d264469f7b650b061a6e3cd82b8c0c9f86c8928 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Mon, 22 May 2017 11:00:37 +0800 Subject: [PATCH 01/54] fix --- .../fr/design/ExtraDesignClassManager.java | 174 ++++---- .../fr/design/ChartTypeInterfaceManager.java | 374 ++++++++---------- 2 files changed, 248 insertions(+), 300 deletions(-) diff --git a/designer_base/src/com/fr/design/ExtraDesignClassManager.java b/designer_base/src/com/fr/design/ExtraDesignClassManager.java index 72c902821..429e0ce45 100644 --- a/designer_base/src/com/fr/design/ExtraDesignClassManager.java +++ b/designer_base/src/com/fr/design/ExtraDesignClassManager.java @@ -9,18 +9,18 @@ import com.fr.design.data.datapane.TableDataNameObjectCreator; import com.fr.design.fun.*; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.core.WidgetOptionFactory; +import com.fr.design.menu.ShortCut; import com.fr.design.widget.Appearance; import com.fr.form.ui.Widget; import com.fr.general.FRLogger; -import com.fr.general.GeneralContext; import com.fr.general.GeneralUtils; import com.fr.general.IOUtils; -import com.fr.plugin.ExtraXMLFileManager; -import com.fr.stable.EnvChangedListener; +import com.fr.plugin.AbstractExtraClassManager; +import com.fr.plugin.injectable.CompatibleInjectionContainer; +import com.fr.plugin.injectable.PluginModule; +import com.fr.plugin.injectable.PluginSingleInjection; +import com.fr.stable.bridge.StableFactory; import com.fr.stable.plugin.ExtraDesignClassManagerProvider; -import com.fr.stable.plugin.PluginSimplify; -import com.fr.stable.xml.XMLPrintWriter; -import com.fr.stable.xml.XMLableReader; import java.util.*; @@ -29,42 +29,25 @@ import java.util.*; * @since : 8.0 * 用于设计器扩展的管理类 */ -public class ExtraDesignClassManager extends ExtraXMLFileManager implements ExtraDesignClassManagerProvider { - - private static final String XML_TAG = "ExtraDesignClassManager"; - - private static ExtraDesignClassManager classManager; - +public class ExtraDesignClassManager extends AbstractExtraClassManager implements ExtraDesignClassManagerProvider { + + private static ExtraDesignClassManager classManager = new ExtraDesignClassManager(); + + private CompatibleInjectionContainer shortCuts = new CompatibleInjectionContainer<>(); + public synchronized static ExtraDesignClassManager getInstance() { - if (classManager == null) { - classManager = new ExtraDesignClassManager(); - classManager.readXMLFile(); - } - return classManager; } - + static { - GeneralContext.addEnvChangedListener(new EnvChangedListener() { - public void envChanged() { - ExtraDesignClassManager.envChanged(); - } - }); + StableFactory.registerMarkedObject(PluginModule.EXTRA_DESIGN.getAgentName(), classManager); } - - - private synchronized static void envChanged() { - classManager = null; - } - - - - + public TableDataNameObjectCreator[] getReportTableDataCreators() { return getKindsOfTableDataCreators(TableDataDefineProvider.XML_TAG); } - - + + /** * 添加serverTDCreators * @@ -73,7 +56,7 @@ public class ExtraDesignClassManager extends ExtraXMLFileManager implements Extr public TableDataNameObjectCreator[] getServerTableDataCreators() { return getKindsOfTableDataCreators(ServerTableDataDefineProvider.XML_TAG); } - + private TableDataNameObjectCreator[] getKindsOfTableDataCreators(String tag) { Set set = getArray(tag); if (set.isEmpty()) { @@ -82,19 +65,19 @@ public class ExtraDesignClassManager extends ExtraXMLFileManager implements Extr List creators = new ArrayList<>(); for (TableDataDefineProvider provider : set) { TableDataNameObjectCreator creator = new TableDataNameObjectCreator( - provider.nameForTableData(), - provider.prefixForTableData(), - provider.iconPathForTableData(), - provider.classForTableData(), - provider.classForInitTableData(), - provider.appearanceForTableData() + provider.nameForTableData(), + provider.prefixForTableData(), + provider.iconPathForTableData(), + provider.classForTableData(), + provider.classForInitTableData(), + provider.appearanceForTableData() ); creators.add(creator); } return creators.toArray(new TableDataNameObjectCreator[creators.size()]); } - - + + public Map, Class> getParameterWidgetOptionsMap() { Map, Class> map = new HashMap<>(); Set set = getArray(ParameterWidgetOptionProvider.XML_TAG); @@ -103,7 +86,7 @@ public class ExtraDesignClassManager extends ExtraXMLFileManager implements Extr } return map; } - + public WidgetOption[] getParameterWidgetOptions() { Set set = getArray(ParameterWidgetOptionProvider.XML_TAG); if (set.isEmpty()) { @@ -112,16 +95,16 @@ public class ExtraDesignClassManager extends ExtraXMLFileManager implements Extr Set result = new HashSet<>(); for (ParameterWidgetOptionProvider provider : set) { WidgetOption option = WidgetOptionFactory.createByWidgetClass( - provider.nameForWidget(), - IOUtils.readIcon(provider.iconPathForWidget()), - provider.classForWidget() + provider.nameForWidget(), + IOUtils.readIcon(provider.iconPathForWidget()), + provider.classForWidget() ); result.add(option); } return result.toArray(new WidgetOption[result.size()]); } - - + + public WidgetOption[] getWebWidgetOptions() { Set set = getArray(ToolbarItemProvider.XML_TAG); if (set.isEmpty()) { @@ -130,17 +113,17 @@ public class ExtraDesignClassManager extends ExtraXMLFileManager implements Extr List list = new ArrayList<>(); for (ToolbarItemProvider provider : set) { WidgetOption option = WidgetOptionFactory.createByWidgetClass( - provider.nameForWidget(), - IOUtils.readIcon(provider.iconPathForWidget()), - provider.classForWidget() + provider.nameForWidget(), + IOUtils.readIcon(provider.iconPathForWidget()), + provider.classForWidget() ); list.add(option); } return list.toArray(new WidgetOption[list.size()]); } - - - + + + public Map, Class> getFormWidgetOptionsMap() { Set set = getArray(FormWidgetOptionProvider.XML_TAG); Map, Class> map = new HashMap<>(); @@ -149,15 +132,15 @@ public class ExtraDesignClassManager extends ExtraXMLFileManager implements Extr } return map; } - + public WidgetOption[] getFormWidgetOptions() { return getFormUnits(false); } - + public WidgetOption[] getFormWidgetContainerOptions() { return getFormUnits(true); } - + private WidgetOption[] getFormUnits(boolean isContainer) { Set set = getArray(FormWidgetOptionProvider.XML_TAG); if (set.isEmpty()) { @@ -167,18 +150,18 @@ public class ExtraDesignClassManager extends ExtraXMLFileManager implements Extr for (FormWidgetOptionProvider provider : set) { if (provider.isContainer() == isContainer) { WidgetOption option = WidgetOptionFactory.createByWidgetClass( - provider.nameForWidget(), - BaseUtils.readIcon(provider.iconPathForWidget()), - provider.classForWidget() + provider.nameForWidget(), + BaseUtils.readIcon(provider.iconPathForWidget()), + provider.classForWidget() ); result.add(option); } } return result.toArray(new WidgetOption[result.size()]); } - - - + + + public WidgetOption[] getCellWidgetOptions() { Set set = getArray(CellWidgetOptionProvider.XML_TAG); if (set.isEmpty()) { @@ -187,16 +170,16 @@ public class ExtraDesignClassManager extends ExtraXMLFileManager implements Extr Set result = new HashSet<>(); for (CellWidgetOptionProvider provider : set) { WidgetOption option = WidgetOptionFactory.createByWidgetClass( - provider.nameForWidget(), - IOUtils.readIcon(provider.iconPathForWidget()), - provider.classForWidget() + provider.nameForWidget(), + IOUtils.readIcon(provider.iconPathForWidget()), + provider.classForWidget() ); - result.add(option); + result.add(option); } return result.toArray(new WidgetOption[result.size()]); - + } - + public Map, Appearance> getCellWidgetOptionsMap() { Set set = getArray(CellWidgetOptionProvider.XML_TAG); Map, Appearance> map = new HashMap<>(); @@ -205,8 +188,8 @@ public class ExtraDesignClassManager extends ExtraXMLFileManager implements Extr } return map; } - - + + public Feedback getFeedback() { try { Class clazz = GeneralUtils.classForName("com.fr.design.feedback.CurrentFeedback"); @@ -218,34 +201,29 @@ public class ExtraDesignClassManager extends ExtraXMLFileManager implements Extr } return Feedback.EMPTY; } - - /** - * 文件名 - * - * @return 文件名 - */ + @Override - public String fileName() { - return "designer.xml"; + protected boolean demountSpecific(PluginSingleInjection injection) { + + if (ShortCut.TEMPLATE_TREE.equals(injection.getName()) && injection.getOriginalObject() instanceof ShortCut) { + shortCuts.remove(injection.getObject()); + return true; + } + return false; } - - /** - * 读xml - * - * @param reader xml对象 - */ - public void readXML(XMLableReader reader) { - readXML(reader, null, PluginSimplify.NULL); + + @Override + protected boolean mountSpecific(PluginSingleInjection injection) { + + if (ShortCut.TEMPLATE_TREE.equals(injection.getName()) && injection.getOriginalObject() instanceof ShortCut) { + shortCuts.put(injection.getObject(), (ShortCut) injection.getOriginalObject()); + return true; + } + return false; } - - - /** - * 写xml - * - * @param writer xml对象 - */ - public void writeXML(XMLPrintWriter writer) { - writer.startTAG(XML_TAG); - writer.end(); + + public Set getExtraShortCuts() { + + return shortCuts.getSet(); } } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java b/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java index c67a6aea5..689471f5b 100644 --- a/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java +++ b/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java @@ -19,128 +19,113 @@ import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; import com.fr.design.module.DesignModuleFactory; -import com.fr.file.XMLFileManager; import com.fr.form.ui.ChartEditor; -import com.fr.general.*; -import com.fr.plugin.PluginCollector; -import com.fr.plugin.PluginLicenseManager; -import com.fr.plugin.PluginMessage; -import com.fr.design.extra.ChartTypeInterfaceCloseableHandler; -import com.fr.plugin.proxy.PluginInstanceProxyFactory; -import com.fr.plugin.proxy.PluginInvocationHandler; +import com.fr.general.GeneralContext; +import com.fr.general.IOUtils; +import com.fr.general.Inter; +import com.fr.plugin.injectable.PluginSingleInjection; import com.fr.stable.ArrayUtils; -import com.fr.stable.EnvChangedListener; import com.fr.stable.StringUtils; +import com.fr.stable.bridge.StableFactory; import com.fr.stable.collections.map.CloseableContainedMap; -import com.fr.stable.fun.Authorize; import com.fr.stable.plugin.ExtraChartDesignClassManagerProvider; import com.fr.stable.plugin.PluginReadListener; -import com.fr.stable.plugin.PluginSimplify; -import com.fr.stable.plugin.closeable.Closeable; -import com.fr.stable.xml.XMLPrintWriter; -import com.fr.stable.xml.XMLableReader; import javax.swing.*; import java.util.*; /** - * Created by eason on 14/12/29. + * Created by eason on 14/12/29. */ -public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraChartDesignClassManagerProvider { - - private static ClassLoader loader = Thread.currentThread().getContextClassLoader(); - - private static ChartTypeInterfaceManager classManager = null; - +public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerProvider { + + + private static ChartTypeInterfaceManager classManager = new ChartTypeInterfaceManager(); + private static LinkedHashMap> chartTypeInterfaces = - new LinkedHashMap<>(); - + new LinkedHashMap>(); + public synchronized static ChartTypeInterfaceManager getInstance() { - if (classManager == null) { - classManager = new ChartTypeInterfaceManager(); - chartTypeInterfaces.clear(); - classManager.readDefault(); - } + return classManager; } - + static { - GeneralContext.addEnvChangedListener(new EnvChangedListener() { - public void envChanged() { - ChartTypeInterfaceManager.envChanged(); - } - }); + readDefault(); + StableFactory.registerMarkedObject(XML_TAG, classManager); } - + + // TODO: 2017/3/8 static { GeneralContext.addPluginReadListener(new PluginReadListener() { + @Override - public void success(Status status) { + public void success() { //重新注册designModuleFactory DesignModuleFactory.registerExtraWidgetOptions(initWidgetOption()); } }); } - - public static WidgetOption[] initWidgetOption(){ - + + private static WidgetOption[] initWidgetOption() { + ChartInternationalNameContentBean[] typeName = ChartTypeManager.getInstance().getAllChartBaseNames(); ChartWidgetOption[] child = new ChartWidgetOption[typeName.length]; final Chart[][] allCharts = new Chart[typeName.length][]; for (int i = 0; i < typeName.length; i++) { String plotID = typeName[i].getPlotID(); Chart[] rowChart = ChartTypeManager.getInstance().getChartTypes(plotID); - if(ArrayUtils.isEmpty(rowChart)) { + if (ArrayUtils.isEmpty(rowChart)) { continue; } String iconPath = ChartTypeInterfaceManager.getInstance().getIconPath(plotID); Icon icon = IOUtils.readIcon(iconPath); child[i] = new ChartWidgetOption(Inter.getLocText(typeName[i].getName()), icon, ChartEditor.class, rowChart[0]); - + allCharts[i] = rowChart; } - + //异步加载图片 new Thread(new Runnable() { + @Override public void run() { + initAllChartsDemoImage(allCharts); } }).start(); - + return child; } - + //加载所有图表图片 - private static void initAllChartsDemoImage(Chart[][] allCharts){ - for (int i = 0; i < allCharts.length; i++) { - Chart[] rowChart = allCharts[i]; - if(rowChart == null) { + private static void initAllChartsDemoImage(Chart[][] allCharts) { + + for (Chart[] rowChart : allCharts) { + if (rowChart == null) { continue; } //加载初始化图表模型图片 initChartsDemoImage(rowChart); } } - + private static void initChartsDemoImage(Chart[] rowChart) { - int rowChartsCount = rowChart.length; - for (int j = 0; j < rowChartsCount; j++) { + + for (Chart aRowChart : rowChart) { //此时,为图片生成模型数据 - rowChart[j].createSlotImage(); + aRowChart.createSlotImage(); } } - - private synchronized static void envChanged() { - classManager = null; - } - + + private static void readDefault() { - if (chartTypeInterfaces.containsKey(ChartTypeManager.CHART_PRIORITY)){ + + if (chartTypeInterfaces.containsKey(ChartTypeManager.CHART_PRIORITY)) { return; } CloseableContainedMap chartUIList = - new CloseableContainedMap<>(LinkedHashMap.class); + new CloseableContainedMap(LinkedHashMap.class); chartUIList.put(ChartConstants.COLUMN_CHART, new ColumnIndependentChartInterface()); chartUIList.put(ChartConstants.LINE_CHART, new LineIndependentChartInterface()); chartUIList.put(ChartConstants.BAR_CHART, new BarIndependentChartInterface()); @@ -158,16 +143,16 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh chartUIList.put(ChartConstants.MAP_CHART, new MapIndependentChartInterface()); chartUIList.put(ChartConstants.GIS_CHAER, new GisMapIndependentChartInterface()); chartUIList.put(ChartConstants.FUNNEL_CHART, new FunnelIndependentChartInterface()); - + chartTypeInterfaces.put(ChartTypeManager.CHART_PRIORITY, chartUIList); } - + + public String getIconPath(String plotID) { + if (chartTypeInterfaces != null) { - Iterator iterator = chartTypeInterfaces.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry entry = (Map.Entry) iterator.next(); - String priority = (String) entry.getKey(); + for (Map.Entry> entry : chartTypeInterfaces.entrySet()) { + String priority = entry.getKey(); String imagePath = getIconPath(priority, plotID); if (StringUtils.isNotEmpty(imagePath)) { return imagePath; @@ -176,25 +161,26 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh } return StringUtils.EMPTY; } - + private String getIconPath(String priority, String plotID) { - + if (chartTypeInterfaces.get(priority) != null && chartTypeInterfaces.get(priority).get(plotID) != null) { return chartTypeInterfaces.get(priority).get(plotID).getIconPath(); - }else { + } else { return StringUtils.EMPTY; } } - - public static void addChartTypeInterface(IndependentChartUIProvider provider, String priority, String plotID) { - if (chartTypeInterfaces != null){ - if (!chartTypeInterfaces.containsKey(priority)){ + + private static void addChartTypeInterface(IndependentChartUIProvider provider, String priority, String plotID) { + + if (chartTypeInterfaces != null) { + if (!chartTypeInterfaces.containsKey(priority)) { //新建一个具体图表列表 CloseableContainedMap chartUIList - = new CloseableContainedMap<>(LinkedHashMap.class); + = new CloseableContainedMap(LinkedHashMap.class); chartUIList.put(plotID, provider); chartTypeInterfaces.put(priority, chartUIList); - }else { + } else { Map chartUIList = chartTypeInterfaces.get(priority); if (!chartUIList.containsKey(plotID)) { chartUIList.put(plotID, provider); @@ -202,54 +188,18 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh } } } - - /** - * 增加界面接口定义 - * - * @param className 类名 - * @param plotID 标志ID - */ - public void addChartInterface(String className, String priority, String plotID, PluginSimplify simplify) { - if (StringUtils.isNotBlank(className)) { - try { - Class clazz = Class.forName(className); - Authorize authorize = clazz.getAnnotation(Authorize.class); - if (authorize != null) { - PluginLicenseManager.getInstance().registerPaid(authorize, simplify); - } - IndependentChartUIProvider provider = getProxyObj(plotID, simplify, clazz); - if (PluginCollector.getCollector().isError(provider, IndependentChartUIProvider.CURRENT_API_LEVEL, simplify.getPluginName())) { - PluginMessage.remindUpdate(className); - } else { - addChartTypeInterface(provider, priority, plotID); - } - } catch (ClassNotFoundException e) { - FRLogger.getLogger().error("class not found:" + e.getMessage()); - } catch (IllegalAccessException | InstantiationException e) { - FRLogger.getLogger().error("object create error:" + e.getMessage()); - } catch (NoSuchMethodException e) { - FRLogger.getLogger().error(e.getMessage()); - } - } - } - - private IndependentChartUIProvider getProxyObj(String plotID, PluginSimplify simplify, Class clazz) throws IllegalAccessException, InstantiationException, NoSuchMethodException { - - PluginInstanceProxyFactory factory = new PluginInstanceProxyFactory(clazz, simplify); - PluginInvocationHandler handler = new ChartTypeInterfaceCloseableHandler(plotID); - return (IndependentChartUIProvider) factory.addProxy(Closeable.class, handler).getProxyObj(); - } - - + + /** * 把所有的pane加到list里 * * @param paneList pane容器 */ public void addPlotTypePaneList(List> paneList) { + List priorityList = getPriorityInOrder(); - for (int i = 0; i < priorityList.size(); i++){ - String priority = String.valueOf(priorityList.get(i)); + for (Integer aPriorityList : priorityList) { + String priority = String.valueOf(aPriorityList); Iterator chartUIIterator = chartTypeInterfaces.get(priority).entrySet().iterator(); while (chartUIIterator.hasNext()) { Map.Entry chartUIEntry = (Map.Entry) chartUIIterator.next(); @@ -258,9 +208,10 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh } } } - - public String[] getTitle4PopupWindow(String priority){ - if (priority.isEmpty()){ + + public String[] getTitle4PopupWindow(String priority) { + + if (priority.isEmpty()) { return getTitle4PopupWindow(); } String[] names = new String[getChartSize(priority)]; @@ -268,7 +219,7 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh Map chartUIList = chartTypeInterfaces.get(priority); Iterator iterator = chartUIList.entrySet().iterator(); int i = 0; - while (iterator.hasNext()){ + while (iterator.hasNext()) { Map.Entry entry = (Map.Entry) iterator.next(); IndependentChartUIProvider provider = (IndependentChartUIProvider) entry.getValue(); names[i++] = provider.getPlotTypeTitle4PopupWindow(); @@ -277,19 +228,17 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh } return new String[0]; } - + /** * 获取指定图表的标题 - * @param priority - * @return */ - public String getTitle4PopupWindow(String priority, String plotID){ - + public String getTitle4PopupWindow(String priority, String plotID) { + if (chartTypeInterfaces != null && chartTypeInterfaces.containsKey(priority) && chartTypeInterfaces.get(priority).containsKey(plotID)) { IndependentChartUIProvider provider = chartTypeInterfaces.get(priority).get(plotID); return provider.getPlotTypeTitle4PopupWindow(); } - + //兼容老的插件 if (chartTypeInterfaces != null) { Iterator iterator = chartTypeInterfaces.entrySet().iterator(); @@ -301,34 +250,36 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh } } } - return new String(); + return StringUtils.EMPTY; } - - private String[] getTitle4PopupWindow(){ + + private String[] getTitle4PopupWindow() { + List priorityList = getPriorityInOrder(); - - if (priorityList.size() == 0){ + + if (priorityList.size() == 0) { return new String[0]; } - + int size = 0; //获取总得图表格式 - for (int i = 0; i < priorityList.size(); i++) { - size += getChartSize(String.valueOf(priorityList.get(i))); + for (Integer aPriorityList : priorityList) { + size += getChartSize(String.valueOf(aPriorityList)); } String[] names = new String[size]; - + int index = 0; - for (int i = 0; i < priorityList.size(); i++){ - String priority = String.valueOf(priorityList.get(i)); + for (Integer aPriorityList : priorityList) { + String priority = String.valueOf(aPriorityList); Iterator chartUI = chartTypeInterfaces.get(priority).entrySet().iterator(); index = fetchNames(chartUI, names, index); } - + return names; } - + private List getPriorityInOrder() { + List priorityList = new ArrayList(); if (chartTypeInterfaces != null) { Iterator iterator = chartTypeInterfaces.entrySet().iterator(); @@ -340,8 +291,9 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh } return ChartTypeManager.orderInPriority(priorityList); } - + private int fetchNames(Iterator chartUI, String[] names, int index) { + while (chartUI.hasNext()) { Map.Entry chartUIEntry = (Map.Entry) chartUI.next(); IndependentChartUIProvider provider = (IndependentChartUIProvider) chartUIEntry.getValue(); @@ -349,10 +301,11 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh } return index; } - + public ChartDataPane getChartDataPane(String plotID, AttributeChangeListener listener) { + Iterator iterator = chartTypeInterfaces.entrySet().iterator(); - while (iterator.hasNext()){ + while (iterator.hasNext()) { Map.Entry entry = (Map.Entry) iterator.next(); String priority = (String) entry.getKey(); if (plotInChart(plotID, priority)) { @@ -361,26 +314,28 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh } return getChartDataPane(ChartTypeManager.CHART_PRIORITY, plotID, listener); } - + private ChartDataPane getChartDataPane(String priority, String plotID, AttributeChangeListener listener) { + return chartTypeInterfaces.get(priority).get(plotID).getChartDataPane(listener); } - + /** * 获取对应ID的图表数量 - * @param key - * @return + * */ - private int getChartSize(String key){ - if (chartTypeInterfaces != null && chartTypeInterfaces.containsKey(key)){ + private int getChartSize(String key) { + + if (chartTypeInterfaces != null && chartTypeInterfaces.containsKey(key)) { return chartTypeInterfaces.get(key).size(); } return 0; } - + public AbstractChartAttrPane[] getAttrPaneArray(String plotID, AttributeChangeListener listener) { + Iterator iterator = chartTypeInterfaces.entrySet().iterator(); - while (iterator.hasNext()){ + while (iterator.hasNext()) { Map.Entry entry = (Map.Entry) iterator.next(); String priority = (String) entry.getKey(); if (plotInChart(plotID, priority)) { @@ -389,14 +344,16 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh } return getAttrPaneArray(ChartTypeManager.CHART_PRIORITY, plotID, listener); } - + private AbstractChartAttrPane[] getAttrPaneArray(String priority, String plotID, AttributeChangeListener listener) { + return chartTypeInterfaces.get(priority).get(plotID).getAttrPaneArray(listener); } - + public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent) { + Iterator iterator = chartTypeInterfaces.entrySet().iterator(); - while (iterator.hasNext()){ + while (iterator.hasNext()) { Map.Entry entry = (Map.Entry) iterator.next(); String priority = (String) entry.getKey(); if (plotInChart(plot.getPlotID(), priority)) { @@ -405,15 +362,17 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh } return getTableDataSourcePane(ChartTypeManager.CHART_PRIORITY, plot, parent); } - + private AbstractTableDataContentPane getTableDataSourcePane(String priority, Plot plot, ChartDataPane parent) { + return chartTypeInterfaces.get(priority).get(plot.getPlotID()).getTableDataSourcePane(plot, parent); } - - + + public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent) { + Iterator iterator = chartTypeInterfaces.entrySet().iterator(); - while (iterator.hasNext()){ + while (iterator.hasNext()) { Map.Entry entry = (Map.Entry) iterator.next(); String priority = (String) entry.getKey(); String plotID = plot.getPlotID(); @@ -423,21 +382,24 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh } return getReportDataSourcePane(ChartTypeManager.CHART_PRIORITY, plot, parent); } - + private boolean plotInChart(String plotID, String priority) { + return chartTypeInterfaces != null - && chartTypeInterfaces.containsKey(priority) + && chartTypeInterfaces.containsKey(priority) && chartTypeInterfaces.get(priority).containsKey(plotID); } - + private AbstractReportDataContentPane getReportDataSourcePane(String priority, Plot plot, ChartDataPane parent) { + return chartTypeInterfaces.get(priority).get(plot.getPlotID()).getReportDataSourcePane(plot, parent); } - - + + public ConditionAttributesPane getPlotConditionPane(Plot plot) { + Iterator iterator = chartTypeInterfaces.entrySet().iterator(); - while (iterator.hasNext()){ + while (iterator.hasNext()) { Map.Entry entry = (Map.Entry) iterator.next(); String priority = (String) entry.getKey(); if (plotInChart(plot.getPlotID(), priority)) { @@ -446,15 +408,17 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh } return getPlotConditionPane(ChartTypeManager.CHART_PRIORITY, plot); } - + private ConditionAttributesPane getPlotConditionPane(String priority, Plot plot) { + return chartTypeInterfaces.get(priority).get(plot.getPlotID()).getPlotConditionPane(plot); } - - + + public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot) { + Iterator iterator = chartTypeInterfaces.entrySet().iterator(); - while (iterator.hasNext()){ + while (iterator.hasNext()) { Map.Entry entry = (Map.Entry) iterator.next(); String priority = (String) entry.getKey(); if (plotInChart(plot.getPlotID(), priority)) { @@ -463,11 +427,12 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh } return getPlotSeriesPane(ChartTypeManager.CHART_PRIORITY, parent, plot); } - + private BasicBeanPane getPlotSeriesPane(String priority, ChartStylePane parent, Plot plot) { + return chartTypeInterfaces.get(priority).get(plot.getPlotID()).getPlotSeriesPane(parent, plot); } - + /** * 是否使用默认的界面,为了避免界面来回切换 * @@ -475,55 +440,60 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh * @return 是否使用默认的界面 */ public boolean isUseDefaultPane(String plotID) { + Iterator iterator = chartTypeInterfaces.entrySet().iterator(); - while (iterator.hasNext()){ + while (iterator.hasNext()) { Map.Entry entry = (Map.Entry) iterator.next(); String priority = (String) entry.getKey(); if (chartTypeInterfaces.get(priority).containsKey(plotID)) { return isUseDefaultPane(priority, plotID); } } - + return true; } - + private boolean isUseDefaultPane(String priority, String plotID) { - - if (chartTypeInterfaces.containsKey(priority) && chartTypeInterfaces.get(priority).containsKey(plotID)) { - return chartTypeInterfaces.get(priority).get(plotID).isUseDefaultPane(); - } - - return true; + + return !(chartTypeInterfaces.containsKey(priority) && chartTypeInterfaces.get(priority).containsKey(plotID)) || chartTypeInterfaces.get(priority).get(plotID).isUseDefaultPane(); + } - - public void readXML(XMLableReader reader) { - readXML(reader, null, PluginSimplify.NULL); + + @Override + public void mount(PluginSingleInjection injection) { + + if (isIndependentChartUIProvider(injection)) { + String priority = injection.getAttribute("priority"); + String plotID = injection.getAttribute("plotID"); + IndependentChartUIProvider instance = (IndependentChartUIProvider) injection.getObject(); + addChartTypeInterface(instance, priority, plotID); + } } - + + @Override - public void readXML(XMLableReader reader, List extraChartDesignInterfaceList, PluginSimplify simplify) { - if (reader.isChildNode()) { - String tagName = reader.getTagName(); - if (extraChartDesignInterfaceList != null) { - extraChartDesignInterfaceList.add(tagName); - } - if (IndependentChartUIProvider.XML_TAG.equals(tagName)) { - addChartInterface(reader.getAttrAsString("class", ""), reader.getAttrAsString("priority", ChartTypeManager.CHART_PRIORITY),reader.getAttrAsString("plotID", ""), simplify); - } + public void demount(PluginSingleInjection injection) { + + if (isIndependentChartUIProvider(injection)) { + String priority = injection.getAttribute("priority"); + String plotID = injection.getAttribute("plotID"); + removeChartTypeInterface(priority, plotID); } } - - /** - * 文件名 - * - * @return 文件名 - */ - public String fileName() { - return "chart.xml"; + + private void removeChartTypeInterface(String priority, String plotID) { + + if (chartTypeInterfaces != null) { + if (chartTypeInterfaces.containsKey(priority)) { + Map chartUIList = chartTypeInterfaces.get(priority); + chartUIList.remove(plotID); + } + } } - - @Override - public void writeXML(XMLPrintWriter writer) { - + + + private boolean isIndependentChartUIProvider(PluginSingleInjection injection) { + + return !(injection == null || injection.getObject() == null) && IndependentChartUIProvider.XML_TAG.equals(injection.getName()) && injection.getObject() instanceof IndependentChartUIProvider; } } \ No newline at end of file From bcbb08418f9af62651f938b04f270c04b4e769ee Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Mon, 22 May 2017 11:03:15 +0800 Subject: [PATCH 02/54] fix --- .../fr/design/mainframe/DesignerFrameFileDealerPane.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/designer_base/src/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer_base/src/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index 352fc1564..60f5067f1 100644 --- a/designer_base/src/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer_base/src/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -27,9 +27,7 @@ import com.fr.file.FILE; import com.fr.file.FileNodeFILE; import com.fr.file.filetree.FileNode; import com.fr.general.ComparatorUtils; -import com.fr.general.GeneralContext; import com.fr.general.Inter; -import com.fr.plugin.proxy.PluginProxyCompatibleUtils; import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.stable.project.ProjectConstants; @@ -44,7 +42,6 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.util.HashMap; -import java.util.Locale; import java.util.Map; import java.util.Set; @@ -131,8 +128,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt toolbarDef.addShortCut(openFolderAction, renameAction); } toolbarDef.addShortCut(delFileAction); - Set extraShortCuts = ExtraDesignClassManager.getInstance().getArray(ShortCut.TEMPLATE_TREE); - extraShortCuts = PluginProxyCompatibleUtils.toOriObjectHashSet(extraShortCuts); + Set extraShortCuts = ExtraDesignClassManager.getInstance().getExtraShortCuts(); for (ShortCut shortCut : extraShortCuts){ toolbarDef.addShortCut(shortCut); } From 14c81276e0ef94fc538a29f17feba01a4ae73b76 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Mon, 22 May 2017 15:58:19 +0800 Subject: [PATCH 03/54] =?UTF-8?q?ba-9.0=20=3D>=20pf-9.0=20=E6=9A=82?= =?UTF-8?q?=E6=97=B6=E5=85=88=E6=8A=8Awar=E9=83=A8=E7=BD=B2=E4=B8=8B?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E7=9B=B8=E5=85=B3=E7=9A=84=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=88=A0=E4=BA=86=EF=BC=8C=E4=B8=80=E4=BC=9A=E5=84=BF=E5=B0=9D?= =?UTF-8?q?=E8=AF=95=E5=86=99=E5=88=B0=E6=96=B0=E7=9A=84=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91=E9=87=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/fr/design/extra/PluginHelper.java | 359 ------------------ 1 file changed, 359 deletions(-) delete mode 100644 designer_base/src/com/fr/design/extra/PluginHelper.java diff --git a/designer_base/src/com/fr/design/extra/PluginHelper.java b/designer_base/src/com/fr/design/extra/PluginHelper.java deleted file mode 100644 index 5180af88f..000000000 --- a/designer_base/src/com/fr/design/extra/PluginHelper.java +++ /dev/null @@ -1,359 +0,0 @@ -package com.fr.design.extra; - -import com.fr.base.Env; -import com.fr.base.FRContext; -import com.fr.design.DesignerEnvManager; -import com.fr.design.extra.plugindependence.DownLoadDependenceUI; -import com.fr.general.*; -import com.fr.general.http.HttpClient; -import com.fr.plugin.Plugin; -import com.fr.plugin.PluginConfigManager; -import com.fr.stable.plugin.PluginConstants; -import com.fr.plugin.PluginLoader; -import com.fr.plugin.PluginManagerHelper; -import com.fr.plugin.dependence.PluginDependence; -import com.fr.plugin.dependence.PluginDependenceException; -import com.fr.plugin.dependence.PluginDependenceUnit; -import com.fr.stable.ArrayUtils; -import com.fr.stable.EncodeConstants; -import com.fr.stable.StableUtils; -import com.fr.stable.StringUtils; -import com.fr.stable.project.ProjectConstants; -import com.fr.stable.xml.XMLTools; - -import javax.swing.*; -import java.io.*; -import java.net.HttpURLConnection; -import java.net.URLDecoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.concurrent.ExecutionException; - -/** - * @author richie - * @date 2015-03-10 - * @since 8.0 - */ -public class PluginHelper { - private static final String TEMP_PATH = System.getProperty("user.dir") + "/tmp"; - public static final String DOWNLOAD_PATH = System.getProperty("user.dir") + "/download"; - //插件依赖的下载位置 - public static final String DEPENDENCE_DOWNLOAD_PATH = System.getProperty("user.dir") + "/download/dependence"; - public static final String TEMP_FILE = "temp.zip"; - public static final String CONNECTION_404 = "404"; - - /** - * 下载插件 - * - * @param id 插件id - * @param p 下载百分比处理 - */ - public static void downloadPluginFile(String id, String username, String password, Process p) throws Exception { - HttpClient httpClient = new HttpClient(getDownloadPath(id, username, password)); - if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { - int totalSize = httpClient.getContentLength(); - InputStream reader = httpClient.getResponseStream(); - String temp = StableUtils.pathJoin(DOWNLOAD_PATH, TEMP_FILE); - StableUtils.makesureFileExist(new File(temp)); - FileOutputStream writer = new FileOutputStream(temp); - byte[] buffer = new byte[PluginConstants.BYTES_NUM]; - int bytesRead = 0; - int totalBytesRead = 0; - - while ((bytesRead = reader.read(buffer)) > 0) { - writer.write(buffer, 0, bytesRead); - buffer = new byte[PluginConstants.BYTES_NUM]; - totalBytesRead += bytesRead; - p.process(totalBytesRead / (double) totalSize); - } - reader.close(); - writer.flush(); - writer.close(); - } else { - throw new com.fr.plugin.PluginVerifyException(Inter.getLocText("FR-Designer-Plugin_Connect_Server_Error")); - } - } - - private static boolean invalidUser(String id, String username, String password) { - if (StringUtils.isEmpty(id)) { - return false; - } else if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)){ - return false; - } else { - return true; - } - } - - private static String getDownloadPath(String id, String username, String password) throws Exception { - HashMap map = new HashMap(); - map.put("id", id); - map.put("username", username); - map.put("password", password); - HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("plugin.download"), map); - String resText = httpClient.getResponseText(); - String charSet = EncodeConstants.ENCODING_UTF_8; - resText = URLDecoder.decode(URLDecoder.decode(resText, charSet), charSet); - - return resText; - } - - public static File getDownloadTempFile() { - return new File(StableUtils.pathJoin(DOWNLOAD_PATH, TEMP_FILE)); - } - - /** - * 从压缩文件中读取插件信息 - * - * @param chosenFile 选择的压缩文件 - * @return 返回插件对象 - * @throws Exception 读取插件信息失败则抛出异常 - */ - public static Plugin readPlugin(File chosenFile) throws Exception { - // 需要先删除临时目录保证加压出来的文件不会和安装失败的文件混合到一起 - StableUtils.deleteFile(new File(TEMP_PATH)); - - IOUtils.unzip(chosenFile, TEMP_PATH); - File pluginFileDir = getTempPluginFileDirectory(); - if (pluginFileDir == null) { - return null; - } - Plugin plugin = null; - if (pluginFileDir.isDirectory()) { - File[] pluginFiles = pluginFileDir.listFiles(); - if (ArrayUtils.isNotEmpty(pluginFiles)) { - for (File f : pluginFiles) { - if (f.getName().equals("plugin.xml")) { - plugin = new Plugin(); - InputStream inputStream = plugin.readEncryptXml(new FileInputStream(f)); - XMLTools.readInputStreamXML(plugin, inputStream); - //检查是否需要准备插件依赖环境 - checkDependenceEnv(plugin); - if (!plugin.isValidate()) { - return null; - } - inputStream.close(); - break; - } - } - } - } - return plugin; - } - - //将所有未配置好的资源文件依赖准备好 - private static void checkDependenceEnv(Plugin plugin) throws PluginDependenceException { - PluginDependence dependence = plugin.getDependence(); - if (dependence == null) { - return; - } - - List needInstallDependence = new ArrayList(); - - String currentID = dependence.getCurrentPluginID(); - List list = dependence.getDependPlugins(); - for (int i = 0; list != null && i < list.size(); i++) { - PluginDependenceUnit dependenceUnit = list.get(i); - if (!dependenceUnit.checkFileEnv()) { - needInstallDependence.add(dependenceUnit); - } - } - - if (needInstallDependence.isEmpty()) { - return; - } - - //安装插件依赖 - installDependenceOnline(currentID, needInstallDependence); - } - - /** - * 构造一个下载UI - * - * @param currentID - * @param list - * @throws PluginDependenceException - */ - private static void installDependenceOnline(String currentID, List list) throws PluginDependenceException { - DownLoadDependenceUI ui = new DownLoadDependenceUI(currentID, list); - ui.installOnline(); - } - - /** - * 从选中的压缩文件中安装插件 - * - * @param chosenFile 选择的压缩文件 - * @param after 操作完成事件 - * @throws Exception 安装失败则抛出异常 - */ - public static void installPluginFromDisk(File chosenFile, After after) throws Exception { - Plugin plugin = readPlugin(chosenFile); - installPluginFromUnzippedTempDir(FRContext.getCurrentEnv(), plugin, after); - } - - /** - * 从压缩文件中复制Restart*.class和restart.exe到bin目录下 - * - * @param file 插件文件 - * @param plugin 插件 - * @throws Exception - */ - public static void copyFilesToBinFolder(File file, Plugin plugin) throws Exception { - File[] pluginFiles = file.listFiles(); - for (File restartFile : pluginFiles) { - if (restartFile.getAbsolutePath().endsWith(".class")) { - String installHome = StableUtils.getInstallHome(); - IOUtils.copy(restartFile, new File(StableUtils.pathJoin(new String[]{installHome, "bin"}))); - } - } - } - - /** - * 从插件压缩包解压到得临时文件中安装插件 - * - * @param env 报表运行环境 - * @param plugin 插件 - * @param after 操作完成事件 - * @throws Exception - */ - public static void installPluginFromUnzippedTempDir(Env env, final Plugin plugin, final After after) throws Exception { - validPlugin(plugin); - if (plugin.isValidate()) { - File file = getTempPluginFileDirectory(); - env.copyFilesToPluginAndLibFolder(file, plugin); - copyFilesToBinFolder(file, plugin); - env.movePluginEmbFile(file, plugin); - } - // 删除放解压文件的临时文件夹 - StableUtils.deleteFile(new File(TEMP_PATH)); - PluginConfigManager.getProviderInstance().pushNewPlugin(plugin); - PluginConfigManager.getProviderInstance().syncPluginConfig(); - new SwingWorker() { - - @Override - protected String doInBackground() throws Exception { - return sendInstalledPluginInfo(plugin); - } - - @Override - protected void done() { - try { - String text = get(); - FRLogger.getLogger().info("plugin install:" + text); - } catch (InterruptedException e) { - FRLogger.getLogger().error(e.getMessage(), e); - } catch (ExecutionException e) { - FRLogger.getLogger().error(e.getMessage(), e); - } - if (after != null) { - after.done(); - } - } - }.execute(); - } - - private static void validPlugin(Plugin plugin) throws Exception { - if (plugin == null) { - throw new com.fr.plugin.PluginVerifyException(Inter.getLocText("FR-Designer-Plugin_Illegal_Plugin_Zip_Cannot_Be_Install")); - } - if (PluginLoader.getLoader().isInstalled(plugin)) { - throw new com.fr.plugin.PluginVerifyException(Inter.getLocText("FR-Designer-Plugin_Has_Been_Installed")); - } - if (plugin.checkIfJarExpired()) { - String jarExpiredInfo = Inter.getLocText(new String[]{"FR-Designer-Plugin_Jar_Expired", ",", "FR-Designer-Plugin_Install_Failed", ",", "FR-Designer-Plugin_Please_Update_Jar", plugin.getRequiredJarTime()}); - FRLogger.getLogger().error(jarExpiredInfo); - throw new com.fr.plugin.PluginVerifyException(jarExpiredInfo); - } - File fileToCheck = getTempPluginFileDirectory(); - File oldfile = new File(StableUtils.pathJoin(FRContext.getCurrentEnv().getPath(), ProjectConstants.PLUGINS_NAME, "plugin-" + plugin.getId())); - if (!PluginManagerHelper.checkLic(plugin, fileToCheck)) { - if (!PluginManagerHelper.checkLic(plugin, oldfile)) {//安装时,在安装目录下和压缩包里都没有才弹框 - String checkLicFail = Inter.getLocText("FR-Designer-PluginLicense_Check_Failed"); - FRLogger.getLogger().error(checkLicFail); - throw new com.fr.plugin.PluginVerifyException(checkLicFail); - } - } - } - - /** - * 获取插件解压的临时文件夹 - * - * @return 临时文件 - */ - public static File getTempPluginFileDirectory() { - File file = new File(TEMP_PATH); - if (file.isDirectory() && !file.getName().startsWith(".")) { - File[] files = file.listFiles(); - if (ArrayUtils.isNotEmpty(files)) { - for (File f : files) { - if (foundConfigFile(f)) { - return f; - } - } - } - } - return null; - } - - private static boolean foundConfigFile(File dir) { - if (!dir.isDirectory()) { - return false; - } - File[] files = dir.listFiles(); - if (ArrayUtils.isNotEmpty(files)) { - for (File f : files) { - if ("plugin.xml".equals(f.getName())) { - return true; - } - } - } - return false; - } - - /** - * 从运行环境中卸载插件 - * - * @param env 报表运行环境 - * @param plugin 插件 - * @return 返回没有删除掉的文件的集合 - * @throws Exception 卸载出错的时候抛出此异常 - */ - public static String[] uninstallPlugin(Env env, Plugin plugin) throws Exception { - if (plugin == null || env == null) { - return ArrayUtils.EMPTY_STRING_ARRAY; - } - //卸载前监听 - plugin.preUninstall(); - PluginLoader.getLoader().deletePlugin(plugin); - return env.deleteFileFromPluginAndLibFolder(plugin); - } - - /** - * 比较插件的版本,这里简单的比价字符串,不需要用数字作为标号 - * 版本号相同也认为是更新 - * - * @param plugin 当前的插件 - * @param oldPlugin 老的插件 - * @return 当前插件比老的插件版本高则返回true,否则返回false - */ - public static boolean isNewThan(Plugin plugin, Plugin oldPlugin) { - return ComparatorUtils.compare(plugin.getVersion(), oldPlugin.getVersion()) >= 0; - } - - private static String sendInstalledPluginInfo(final Plugin plugin) { - if (StableUtils.isDebug()) { - return "debug status"; - } - HashMap map = new HashMap(); - map.put("key", DesignerEnvManager.getEnvManager().getActivationKey()); - map.put("detail", plugin.toJSONObject().toString()); - map.put("build", GeneralUtils.readBuildNO()); - //第三个参数encode, nodejs服务器那边如果参数不encode, 带了空格会报错, 直接用urlconnection也是一样, jetty没能还原. - HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("plugin.install"), map, true); - httpClient.setTimeout(TIME_OUT); - httpClient.asGet(); - return httpClient.getResponseText(); - } - - private static final int TIME_OUT = 5000; -} From 75da65e5896071ac8555897269eb7a5534176e6a Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Mon, 22 May 2017 17:42:19 +0800 Subject: [PATCH 04/54] =?UTF-8?q?=E6=94=AF=E6=8C=81War=E9=83=A8=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer_base/src/com/fr/env/RemoteEnv.java | 82 ++++++--------------- 1 file changed, 21 insertions(+), 61 deletions(-) diff --git a/designer_base/src/com/fr/env/RemoteEnv.java b/designer_base/src/com/fr/env/RemoteEnv.java index ac5732e73..f1c8cbd10 100644 --- a/designer_base/src/com/fr/env/RemoteEnv.java +++ b/designer_base/src/com/fr/env/RemoteEnv.java @@ -27,10 +27,9 @@ import com.fr.general.http.HttpClient; import com.fr.json.JSONArray; import com.fr.json.JSONException; import com.fr.json.JSONObject; -import com.fr.plugin.Plugin; import com.fr.plugin.PluginLicense; import com.fr.plugin.PluginLicenseManager; -import com.fr.plugin.PluginLoader; +import com.fr.plugin.xml.PluginXml; import com.fr.share.ShareConstants; import com.fr.stable.*; import com.fr.stable.file.XMLFileManagerProvider; @@ -388,7 +387,6 @@ public class RemoteEnv extends AbstractEnv { private void extraChangeEnvPara() { //在env连接之前, 加载一下不依赖env的插件. 看看需不需要改变参数. - PluginLoader.init(); DesignerEnvProcessor envProcessor = ExtraDesignClassManager.getInstance().getSingle(DesignerEnvProcessor.XML_TAG); if (envProcessor != null) { this.path = envProcessor.changeEnvPathBeforeConnect(user, password, path); @@ -1993,7 +1991,12 @@ public class RemoteEnv extends AbstractEnv { public void setLicName(String licName) { //do nth } - + + @Override + public void checkAndRegisterLic(FileNode node, PluginXml plugin) throws Exception { + + } + /** * 获取当前env的build文件路径 */ @@ -2029,57 +2032,8 @@ public class RemoteEnv extends AbstractEnv { info.parseJSON(jo); return info; } - - /** - * 将文件拷贝到插件目录 - * - * @param dir 要拷贝的文件 - * @param plugin 插件 - */ - public void copyFilesToPluginAndLibFolder(File dir, Plugin plugin) throws Exception { - - } - - /** - * 将文件添加到指定目录或者删除指定目录的文件 - * - * @param file 解压插件的临时目录 - * @param plugin 当前处理的插件 - */ - public void movePluginEmbFile(File file, Plugin plugin) throws Exception { - - } - - /** - * 将文件从插件目录删除 - * - * @param plugin 要删除插件 - * @return 同上 - */ - public String[] deleteFileFromPluginAndLibFolder(Plugin plugin) { - return new String[0]; - } - - /** - * 保存插件的配置文件 - * - * @param plugin 插件 - */ - public void writePlugin(Plugin plugin) throws Exception { - - } - - - /** - * 获取插件的配置目录 - * - * @param plugin - */ - public String getPluginFilePath(Plugin plugin) { - - return StringUtils.EMPTY; - } - + + public void readPluginLicenses() throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); HashMap para = new HashMap(); @@ -2117,12 +2071,6 @@ public class RemoteEnv extends AbstractEnv { @Override public void pluginServiceStart(String serviceID){ } - - @Override - public void checkAndRegisterLic(FileNode node, Plugin plugin) throws Exception { - - } - @Override public File[] loadREUFile() throws Exception { File target = new File(CacheManager.getProviderInstance().getCacheDirectory(), @@ -2238,4 +2186,16 @@ public class RemoteEnv extends AbstractEnv { return StringUtils.EMPTY; } } + + @Override + public boolean isLocalEnv() { + + return false; + } + + @Override + public boolean hasPluginServiceStarted(String key) { + // TODO: 2017/5/22 + return true; + } } \ No newline at end of file From 1f70c2dd16ccc91d46bb150ec7c45deb203f9eb8 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Wed, 24 May 2017 11:46:45 +0800 Subject: [PATCH 05/54] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E7=A7=BB=E6=A4=8D?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E7=9B=91=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/ExtraDesignClassManager.java | 2 +- .../data/datapane/TableDataTreePane.java | 23 +++++- .../fr/design/mainframe/DesignerFrame.java | 77 ++++++++++--------- .../mainframe/WestRegionContainerPane.java | 26 ++++++- .../fr/design/ChartTypeInterfaceManager.java | 21 ++++- 5 files changed, 101 insertions(+), 48 deletions(-) diff --git a/designer_base/src/com/fr/design/ExtraDesignClassManager.java b/designer_base/src/com/fr/design/ExtraDesignClassManager.java index 429e0ce45..ee86d8adf 100644 --- a/designer_base/src/com/fr/design/ExtraDesignClassManager.java +++ b/designer_base/src/com/fr/design/ExtraDesignClassManager.java @@ -40,7 +40,7 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement } static { - StableFactory.registerMarkedObject(PluginModule.EXTRA_DESIGN.getAgentName(), classManager); + StableFactory.registerMarkedObject(PluginModule.ExtraDesign.getAgentName(), classManager); } public TableDataNameObjectCreator[] getReportTableDataCreators() { diff --git a/designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java b/designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java index c8f5ba317..205bf8939 100644 --- a/designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java @@ -14,6 +14,7 @@ import com.fr.design.data.tabledata.wrapper.AbstractTableDataWrapper; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.fun.TableDataDefineProvider; import com.fr.design.fun.TableDataPaneProcessor; import com.fr.design.gui.ibutton.UIHeadGroup; import com.fr.design.gui.icontainer.UIScrollPane; @@ -29,6 +30,13 @@ import com.fr.general.ComparatorUtils; import com.fr.general.GeneralContext; import com.fr.general.Inter; import com.fr.general.NameObject; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.injectable.PluginModule; +import com.fr.plugin.manage.PluginFilter; +import com.fr.plugin.observer.PluginEvent; +import com.fr.plugin.observer.PluginEventListener; +import com.fr.plugin.observer.PluginListenerPriority; +import com.fr.plugin.observer.PluginListenerRegistration; import com.fr.stable.core.PropertyChangeAdapter; import com.fr.stable.plugin.PluginReadListener; @@ -81,13 +89,22 @@ public class TableDataTreePane extends BasicTableDataTreePane { addMenuDef.setIconPath(IconPathConstants.ADD_POPMENU_ICON_PATH); createAddMenuDef(); - - GeneralContext.addPluginReadListener(new PluginReadListener() { + + PluginListenerRegistration.getInstance().listenRunningChanged(new PluginEventListener(PluginListenerPriority.TableDataTreePane) { + @Override - public void success(Status status) { + public void on(PluginEvent event) { + addMenuDef.clearShortCuts(); createAddMenuDef(); } + }, new PluginFilter() { + + @Override + public boolean accept(PluginContext context) { + + return context.contain(PluginModule.ExtraDesign, TableDataDefineProvider.XML_TAG); + } }); editAction = new EditAction(); diff --git a/designer_base/src/com/fr/design/mainframe/DesignerFrame.java b/designer_base/src/com/fr/design/mainframe/DesignerFrame.java index f67608aca..3b64c4b3f 100644 --- a/designer_base/src/com/fr/design/mainframe/DesignerFrame.java +++ b/designer_base/src/com/fr/design/mainframe/DesignerFrame.java @@ -15,11 +15,7 @@ import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.TableDataTreePane; import com.fr.design.event.TargetModifiedEvent; import com.fr.design.event.TargetModifiedListener; -import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.file.MutilTempalteTabPane; -import com.fr.design.file.NewTemplatePane; -import com.fr.design.file.SaveSomeTemplatePane; -import com.fr.design.file.TemplateTreePane; +import com.fr.design.file.*; import com.fr.design.fun.TitlePlaceProcessor; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.imenu.UIMenuHighLight; @@ -40,12 +36,16 @@ import com.fr.general.ComparatorUtils; import com.fr.general.FRLogger; import com.fr.general.GeneralContext; import com.fr.general.Inter; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.manage.PluginFilter; +import com.fr.plugin.observer.PluginEvent; +import com.fr.plugin.observer.PluginEventListener; +import com.fr.plugin.observer.PluginListenerRegistration; import com.fr.stable.CoreConstants; import com.fr.stable.OperatingSystem; import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.image4j.codec.ico.ICODecoder; -import com.fr.stable.plugin.PluginReadListener; import com.fr.stable.project.ProjectConstants; import javax.swing.*; @@ -53,20 +53,8 @@ import javax.swing.border.MatteBorder; import java.awt.*; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; -import java.awt.dnd.DnDConstants; -import java.awt.dnd.DropTarget; -import java.awt.dnd.DropTargetDragEvent; -import java.awt.dnd.DropTargetDropEvent; -import java.awt.dnd.DropTargetEvent; -import java.awt.dnd.DropTargetListener; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.awt.event.WindowListener; +import java.awt.dnd.*; +import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; @@ -186,26 +174,43 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta //hugh: private修改为protected方便oem的时候修改右上的组件构成 //顶部日志+登陆按钮 final JPanel northEastPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - GeneralContext.addPluginReadListener(new PluginReadListener() { + + PluginListenerRegistration.getInstance().listenRunningChanged(new PluginEventListener() { + @Override - public void success(Status status) { - TitlePlaceProcessor processor = ExtraDesignClassManager.getInstance().getSingle(TitlePlaceProcessor.MARK_STRING); - if (processor == null) { - processor = new DefaultTitlePlace(); - } - processor.hold(northEastPane, LogMessageBar.getInstance(), ad.createBBSLoginPane()); + public void on(PluginEvent event) { + + refreshNorthEastPane(northEastPane, ad); + } + }, new PluginFilter() { + + @Override + public boolean accept(PluginContext context) { + + return context.contain(TitlePlaceProcessor.MARK_STRING); } }); - + if (DesignerEnvManager.getEnvManager().getAlphafineConfigManager().isEnabled()) { - northEastPane.add(ad.createAlphafinePane(), BorderLayout.CENTER); - } - return northEastPane; - } - - public DesignerFrame(ToolBarMenuDock ad) { - setName(DESIGNER_FRAME_NAME); - this.ad = ad; + northEastPane.add(ad.createAlphafinePane(), BorderLayout.CENTER); + } + refreshNorthEastPane(northEastPane, ad); + return northEastPane; + } + + private void refreshNorthEastPane(JPanel northEastPane, ToolBarMenuDock ad) { + + TitlePlaceProcessor processor = ExtraDesignClassManager.getInstance().getSingle(TitlePlaceProcessor.MARK_STRING); + if (processor == null) { + processor = new DefaultTitlePlace(); + } + processor.hold(northEastPane, LogMessageBar.getInstance(), ad.createBBSLoginPane()); + } + + public DesignerFrame(ToolBarMenuDock ad) { + + setName(DESIGNER_FRAME_NAME); + this.ad = ad; this.initTitleIcon(); this.setTitle();// james:因为有默认的了 // set this to context. diff --git a/designer_base/src/com/fr/design/mainframe/WestRegionContainerPane.java b/designer_base/src/com/fr/design/mainframe/WestRegionContainerPane.java index 7fa8012fe..401d16298 100644 --- a/designer_base/src/com/fr/design/mainframe/WestRegionContainerPane.java +++ b/designer_base/src/com/fr/design/mainframe/WestRegionContainerPane.java @@ -3,10 +3,15 @@ package com.fr.design.mainframe; import com.fr.design.DesignModelAdapter; import com.fr.design.DesignerEnvManager; import com.fr.design.data.datapane.TableDataTreePane; +import com.fr.design.fun.TableDataPaneProcessor; import com.fr.design.gui.icontainer.UIResizableContainer; -import com.fr.general.GeneralContext; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.manage.PluginFilter; +import com.fr.plugin.observer.PluginEvent; +import com.fr.plugin.observer.PluginEventListener; +import com.fr.plugin.observer.PluginListenerPriority; +import com.fr.plugin.observer.PluginListenerRegistration; import com.fr.stable.Constants; -import com.fr.stable.plugin.PluginReadListener; public class WestRegionContainerPane extends UIResizableContainer { @@ -27,12 +32,25 @@ public class WestRegionContainerPane extends UIResizableContainer { public WestRegionContainerPane() { super(DesignerFrameFileDealerPane.getInstance(), Constants.RIGHT); - GeneralContext.addPluginReadListener(new PluginReadListener() { + + setDownPane(TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter())); + + PluginListenerRegistration.getInstance().listenRunningChanged(new PluginEventListener(PluginListenerPriority.WestRegionContainerPane) { + @Override - public void success(Status status) { + public void on(PluginEvent event) { + setDownPane(TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter())); } + }, new PluginFilter() { + + @Override + public boolean accept(PluginContext context) { + + return context.contain(TableDataPaneProcessor.XML_TAG); + } }); + setContainerWidth(165); } } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java b/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java index 689471f5b..aa646fa38 100644 --- a/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java +++ b/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java @@ -23,7 +23,13 @@ import com.fr.form.ui.ChartEditor; import com.fr.general.GeneralContext; import com.fr.general.IOUtils; import com.fr.general.Inter; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.injectable.PluginModule; import com.fr.plugin.injectable.PluginSingleInjection; +import com.fr.plugin.manage.PluginFilter; +import com.fr.plugin.observer.PluginEvent; +import com.fr.plugin.observer.PluginEventListener; +import com.fr.plugin.observer.PluginListenerRegistration; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; import com.fr.stable.bridge.StableFactory; @@ -55,15 +61,22 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr StableFactory.registerMarkedObject(XML_TAG, classManager); } - // TODO: 2017/3/8 static { - GeneralContext.addPluginReadListener(new PluginReadListener() { - + + PluginListenerRegistration.getInstance().listenRunningChanged(new PluginEventListener() { + @Override - public void success() { + public void on(PluginEvent event) { //重新注册designModuleFactory DesignModuleFactory.registerExtraWidgetOptions(initWidgetOption()); } + }, new PluginFilter() { + + @Override + public boolean accept(PluginContext context) { + + return context.contain(PluginModule.ExtraChartType); + } }); } From 64463991460e3969f4fb328acc4c1bb6c1937b07 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Wed, 24 May 2017 11:56:12 +0800 Subject: [PATCH 06/54] =?UTF-8?q?=E5=B1=80=E9=83=A8=E7=9A=84=E7=9B=91?= =?UTF-8?q?=E5=90=AC=E4=BC=98=E5=85=88=E7=BA=A7=E5=B0=B1=E4=B8=8D=E6=94=BE?= =?UTF-8?q?=E5=88=B0=E5=BC=95=E6=93=8E=E9=87=8C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/data/datapane/TableDataTreePane.java | 8 +++----- .../com/fr/design/mainframe/WestRegionContainerPane.java | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java b/designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java index 205bf8939..ca49365e4 100644 --- a/designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java @@ -27,7 +27,6 @@ import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; import com.fr.design.menu.ToolBarDef; import com.fr.general.ComparatorUtils; -import com.fr.general.GeneralContext; import com.fr.general.Inter; import com.fr.general.NameObject; import com.fr.plugin.context.PluginContext; @@ -35,10 +34,8 @@ import com.fr.plugin.injectable.PluginModule; import com.fr.plugin.manage.PluginFilter; import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; -import com.fr.plugin.observer.PluginListenerPriority; import com.fr.plugin.observer.PluginListenerRegistration; import com.fr.stable.core.PropertyChangeAdapter; -import com.fr.stable.plugin.PluginReadListener; import javax.swing.*; import java.awt.*; @@ -53,7 +50,8 @@ import java.util.Map; public class TableDataTreePane extends BasicTableDataTreePane { private static TableDataTreePane singleton = new TableDataTreePane(); - + + public static final int PLUGIN_LISTENER_PRIORITY = 1; public synchronized static BasicTableDataTreePane getInstance(DesignModelAdapter tc) { @@ -90,7 +88,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { createAddMenuDef(); - PluginListenerRegistration.getInstance().listenRunningChanged(new PluginEventListener(PluginListenerPriority.TableDataTreePane) { + PluginListenerRegistration.getInstance().listenRunningChanged(new PluginEventListener(PLUGIN_LISTENER_PRIORITY) { @Override public void on(PluginEvent event) { diff --git a/designer_base/src/com/fr/design/mainframe/WestRegionContainerPane.java b/designer_base/src/com/fr/design/mainframe/WestRegionContainerPane.java index 401d16298..d1cb5a27f 100644 --- a/designer_base/src/com/fr/design/mainframe/WestRegionContainerPane.java +++ b/designer_base/src/com/fr/design/mainframe/WestRegionContainerPane.java @@ -35,7 +35,7 @@ public class WestRegionContainerPane extends UIResizableContainer { setDownPane(TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter())); - PluginListenerRegistration.getInstance().listenRunningChanged(new PluginEventListener(PluginListenerPriority.WestRegionContainerPane) { + PluginListenerRegistration.getInstance().listenRunningChanged(new PluginEventListener(TableDataTreePane.PLUGIN_LISTENER_PRIORITY - 1) { @Override public void on(PluginEvent event) { From a6467c01f08de104f75fc3cde1b5110d4c8bbdbe Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Wed, 24 May 2017 13:51:02 +0800 Subject: [PATCH 07/54] =?UTF-8?q?=E9=BB=98=E8=AE=A4Logger=E6=94=BE?= =?UTF-8?q?=E5=88=B0StableFactory=E9=87=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/module/DesignerModule.java | 4 +- .../DownLoadDependenceUI.java | 281 ------------------ .../plugindependence/image/background.png | Bin 107927 -> 0 bytes 3 files changed, 1 insertion(+), 284 deletions(-) delete mode 100644 designer_base/src/com/fr/design/extra/plugindependence/DownLoadDependenceUI.java delete mode 100644 designer_base/src/com/fr/design/extra/plugindependence/image/background.png diff --git a/designer/src/com/fr/design/module/DesignerModule.java b/designer/src/com/fr/design/module/DesignerModule.java index 9e0837ac0..58e00fa0e 100644 --- a/designer/src/com/fr/design/module/DesignerModule.java +++ b/designer/src/com/fr/design/module/DesignerModule.java @@ -32,7 +32,6 @@ import com.fr.general.xml.GeneralXMLTools; import com.fr.io.importer.Excel2007ReportImporter; import com.fr.io.importer.ExcelReportImporter; import com.fr.main.impl.WorkBook; -import com.fr.plugin.ExtraClassManager; import com.fr.quickeditor.ChartQuickEditor; import com.fr.quickeditor.cellquick.*; import com.fr.quickeditor.floatquick.FloatImageQuickEditor; @@ -47,7 +46,6 @@ import com.fr.stable.ParameterProvider; import com.fr.stable.StringUtils; import com.fr.stable.bridge.StableFactory; import com.fr.stable.fun.LogProvider; -import com.fr.stable.plugin.PluginSimplify; import com.fr.stable.script.CalculatorProviderContext; import com.fr.stable.script.ValueConverter; import com.fr.stable.web.ServletContext; @@ -99,7 +97,7 @@ public class DesignerModule extends DesignModule { InformationCollector.getInstance().collectStartTime(); ExtraDesignClassManager.getInstance().getFeedback().didFeedback(); - ExtraClassManager.getInstance().addMutable(LogProvider.MARK_STRING, DesignerLogImpl.getInstance(), PluginSimplify.NULL); + StableFactory.registerMarkedObject(LogProvider.MARK_STRING, DesignerLogImpl.getInstance()); } private void registerOtherPane() { diff --git a/designer_base/src/com/fr/design/extra/plugindependence/DownLoadDependenceUI.java b/designer_base/src/com/fr/design/extra/plugindependence/DownLoadDependenceUI.java deleted file mode 100644 index 29097a5ee..000000000 --- a/designer_base/src/com/fr/design/extra/plugindependence/DownLoadDependenceUI.java +++ /dev/null @@ -1,281 +0,0 @@ -package com.fr.design.extra.plugindependence; - -import com.fr.base.FRContext; -import com.fr.design.extra.PluginHelper; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.mainframe.DesignerContext; -import com.fr.general.IOUtils; -import com.fr.general.Inter; -import com.fr.general.SiteCenter; -import com.fr.general.http.HttpClient; -import com.fr.plugin.dependence.PluginDependenceException; -import com.fr.plugin.dependence.PluginDependenceUnit; -import com.fr.stable.StableUtils; -import com.fr.stable.StringUtils; -import com.fr.stable.plugin.PluginConstants; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.util.List; - -/** - * Created by hufan on 2016/9/5. - */ -public class DownLoadDependenceUI implements ActionListener { - //进度显示界面 - private JDialog frame = null; - //进度条 - private JProgressBar progressbar; - //进度信息 - private JLabel label; - //进度条更新时钟 - private Timer timer; - //是否继续下载 - private boolean flag = true; - - // 定义加载窗口大小 - private static final int LOAD_WIDTH = 455; - - private static final int INCIDENT_WIDTH = 15; - - private static final int LOAD_HEIGHT = 295; - - - //安装环境相关信息 - private String currentID; - private List list = null; - //安装结果 - private boolean result = false; - //链接服务器的客户端 - private HttpClient httpClient; - //已读文件字节数 - private int totalBytesRead = 0; - //文件总长度 - private int totalSize = 0; - - public DownLoadDependenceUI() { - } - public DownLoadDependenceUI(String currentID, List list) { - this.currentID = currentID; - this.list = list; - this.totalSize = getFileLength(); - init(); - } - - private void init() { - // 创建标签,并在标签上放置一张图片 - BufferedImage image = IOUtils.readImage("/com/fr/design/extra/plugindependence/image/background.png"); - ImageIcon imageIcon = new ImageIcon(image); - label = new UILabel(imageIcon); - label.setBounds(0, 0, LOAD_WIDTH, LOAD_HEIGHT - INCIDENT_WIDTH); - - progressbar = new JProgressBar(); - // 显示当前进度值信息 - progressbar.setStringPainted(true); - // 设置进度条边框不显示 - progressbar.setBorderPainted(false); - // 设置进度条的前景色 - progressbar.setForeground(new Color(0x38aef5)); - // 设置进度条的背景色 - progressbar.setBackground(new Color(188, 190, 194)); - progressbar.setBounds(0, LOAD_HEIGHT - INCIDENT_WIDTH, LOAD_WIDTH, INCIDENT_WIDTH); - progressbar.setMinimum(0); - progressbar.setMaximum(totalSize); - progressbar.setValue(0); - - timer = new Timer(100, this); - - frame = new JDialog(DesignerContext.getDesignerFrame(), true); - frame.setTitle(Inter.getLocText("FR-Designer-Dependence_Install_Online")); - frame.setSize(LOAD_WIDTH, LOAD_HEIGHT); - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - frame.setLocation(screenSize.width / 2 - LOAD_WIDTH / 2, screenSize.height / 2 - LOAD_HEIGHT / 2); - frame.setResizable(false); - // 设置布局为空 - frame.setLayout(new BorderLayout(0, 0)); - frame.getContentPane().add(label, BorderLayout.CENTER); - frame.getContentPane().add(progressbar, BorderLayout.SOUTH); - - frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); - frame.addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent e) { - //取消下载 - flag = false; - frame.dispose(); - } - }); - } - - - //是否可以连接服务器 - private boolean connectToServer() { - for (int i = 0; i < list.size(); i++) { - PluginDependenceUnit dependenceUnit = list.get(i); - httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind(dependenceUnit.getDependenceID())); - if (httpClient.getResponseCode() != HttpURLConnection.HTTP_OK){ - return false; - } - } - return true; - } - - //获取依赖文件大小 - private int getFileLength(){ - int size = 0; - for (int i = 0; i < list.size(); i++) { - PluginDependenceUnit dependenceUnit = list.get(i); - HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind(dependenceUnit.getDependenceID())); - if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { - size += httpClient.getContentLength(); - }else { - return -1; - } - } - return size; - } - - //安装 - private boolean install() { - //开始时钟 - timer.start(); - //开始下载 - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - installDependenceOnline(); - } - }); - thread.start(); - - frame.setVisible(true); - //等待下载线程处理结束 - try { - thread.join(); - } catch (InterruptedException e) { - FRContext.getLogger().error(e.getMessage()); - return false; - } - //停止时钟 - timer.stop(); - return result; - } - - /** - * 下载和安装不分开是因为,本地如果只安装好了一个依赖,下次就不需要重复下载了 - * 如果下载依赖后不安装,则后面的插件会把前面的插件覆盖,故而下载好了一个安装一个 - * @return - * @throws Exception - */ - private void downloadAndInstallPluginDependenceFile() throws Exception { - totalBytesRead = 0; - for (int i = 0; i < list.size(); i++) { - PluginDependenceUnit dependenceUnit = list.get(i); - httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind(dependenceUnit.getDependenceID())); - if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { - InputStream reader = httpClient.getResponseStream(); - String temp = StableUtils.pathJoin(PluginHelper.DEPENDENCE_DOWNLOAD_PATH, PluginHelper.TEMP_FILE); - StableUtils.makesureFileExist(new File(temp)); - FileOutputStream writer = new FileOutputStream(temp); - byte[] buffer = new byte[PluginConstants.BYTES_NUM]; - int bytesRead = 0; - while ((bytesRead = reader.read(buffer)) > 0 && flag) { - writer.write(buffer, 0, bytesRead); - buffer = new byte[PluginConstants.BYTES_NUM]; - totalBytesRead += bytesRead; - } - reader.close(); - writer.flush(); - writer.close(); - - //下载被取消 - if (flag == false) { - result = false; - throw new PluginDependenceException(Inter.getLocText("FR-Designer-Dependence_Install_Failed")); - } - - //安装文件 - IOUtils.unZipFilesGBK(temp, FRContext.getCurrentEnv().getPath() + dependenceUnit.getDependenceDir()); - - } else { - result = false; - throw new PluginDependenceException(Inter.getLocText("FR-Designer-Dependence_Install_Failed")); - } - } - //所有依赖都正常安装下载完毕,则结果为true - result = true; - } - - public void installDependenceOnline() { - try { - //下载并安装文件 - downloadAndInstallPluginDependenceFile(); - } catch (Exception e) { - result = false; - FRContext.getLogger().error(e.getMessage()); - } - } - - //安装已经下载好的文件,如果是服务文件,则需要复制一份到安装目录下, - //以便切换远程时,使用本地的服务 - //如果是服务器环境,则只会安装一份 - private void installPluginDependenceFile(List filePathList){ - if (filePathList.isEmpty()){ - result = false; - return; - } - for(int i = 0; i < filePathList.size(); i++) { - if (StringUtils.EMPTY.equals(filePathList.get(i))){ - result = false; - return; - } - PluginDependenceUnit dependenceUnit = list.get(i); - IOUtils.unzip(new File(filePathList.get(i)), FRContext.getCurrentEnv().getPath() + dependenceUnit.getDependenceDir()); - result = true; - } - } - - public void actionPerformed(ActionEvent e) { - if (e.getSource() == timer) { - int value = progressbar.getValue(); - if (value < totalSize) { - progressbar.setValue(totalBytesRead); - } else { - timer.stop(); - frame.dispose(); - } - } - } - - public void installOnline()throws PluginDependenceException { - - int choose = JOptionPane.showConfirmDialog(null, Inter.getLocText("FR-Designer-Plugin_DownLoadMessage", showFileLength()), "install tooltip", JOptionPane.YES_NO_OPTION); - if (choose == 0) {//下载安装 - if (!connectToServer()) { - throw new PluginDependenceException(Inter.getLocText("FR-Designer-Dependence_Connect_Server_Error")); - } - //安装依赖环境 - if (install()) { - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Dependence_Install_Succeed") + "!!"); - } else { - throw new PluginDependenceException(Inter.getLocText("FR-Designer-Dependence_Install_Failed")); - } - }else {//不选择下载,则不安装图标插件 - throw new PluginDependenceException(Inter.getLocText("FR-Designer-Dependence_Install_Failed")); - } - } - - private String showFileLength(){ - double len = totalSize / Math.pow(10, 6); - String lenStr = String.format("%.2f", len); - return totalSize == -1 ? "NAN" : lenStr; - } -} diff --git a/designer_base/src/com/fr/design/extra/plugindependence/image/background.png b/designer_base/src/com/fr/design/extra/plugindependence/image/background.png deleted file mode 100644 index 45bf328e3333701813afd76b1d6efa7bd41f60ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107927 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

WfA@8Op?D@gtX|Iyh?nh?mm)j5w(}Fy2`Y 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

    K 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 mSa1rKaC?m&R_x&QkFh*+?YBY@`P>$x)R5_+ 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 Date: Wed, 24 May 2017 14:23:21 +0800 Subject: [PATCH 08/54] fix --- .../alphafine/cell/render/ContentCellRender.java | 3 ++- .../alphafine/cell/render/TitleCellRender.java | 4 +++- .../alphafine/component/AlphaFineDialog.java | 13 +++++++------ .../fr/design/mainframe/bbs/BBSConstants.java | 3 ++- .../fr/design/dialog/InformationWarnPane.java | 3 ++- .../src/com/fr/design/extra/QQLoginWebPane.java | 5 +++-- .../src/com/fr/design/gui/UILookAndFeel.java | 11 ++++++----- .../com/fr/design/gui/autocomplete/TipUtil.java | 16 +++++++--------- .../mainframe/chart/gui/type/ChartImagePane.java | 10 ++++++---- 9 files changed, 38 insertions(+), 30 deletions(-) diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java b/designer/src/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java index ba2371421..74fbf8e01 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java @@ -4,6 +4,7 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; +import com.fr.stable.resource.ResourceLoader; import javax.swing.*; import java.awt.*; @@ -33,7 +34,7 @@ public class ContentCellRender implements ListCellRenderer { AlphaCellModel model = (AlphaCellModel) value; name.setText(model.getName()); String iconUrl = "/com/fr/design/mainframe/alphafine/images/alphafine" + model.getType().getTypeValue() + ".png"; - name.setIcon(new ImageIcon(getClass().getResource(iconUrl))); + name.setIcon(new ImageIcon(ResourceLoader.getResource(iconUrl, getClass()))); name.setFont(AlphaFineConstants.MEDIUM_FONT); name.setForeground(AlphaFineConstants.BLACK); name.setVerticalTextPosition(SwingConstants.CENTER); diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/render/TitleCellRender.java b/designer/src/com/fr/design/mainframe/alphafine/cell/render/TitleCellRender.java index 84784ecdb..f607f8fec 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/cell/render/TitleCellRender.java +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/render/TitleCellRender.java @@ -3,6 +3,8 @@ package com.fr.design.mainframe.alphafine.cell.render; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; +import com.fr.stable.resource.ResourceLoader; + import javax.swing.*; import java.awt.*; @@ -35,7 +37,7 @@ public class TitleCellRender implements ListCellRenderer { panel.add(this.more, BorderLayout.EAST); } if (moreModel.isLoading()) { - ImageIcon imageIcon = new ImageIcon(getClass().getResource("/com/fr/design/mainframe/alphafine/images/loading.gif")); + ImageIcon imageIcon = new ImageIcon(ResourceLoader.getResource("/com/fr/design/mainframe/alphafine/images/loading.gif", getClass())); //设置cell的加载动画 imageIcon.setImageObserver(list); diff --git a/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java index 00e1744fc..5f93957ac 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java +++ b/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -10,8 +10,8 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.cell.CellModelHelper; -import com.fr.design.mainframe.alphafine.cell.render.ContentCellRender; import com.fr.design.mainframe.alphafine.cell.model.*; +import com.fr.design.mainframe.alphafine.cell.render.ContentCellRender; import com.fr.design.mainframe.alphafine.listener.ComponentHandler; import com.fr.design.mainframe.alphafine.listener.DocumentAdapter; import com.fr.design.mainframe.alphafine.model.SearchListModel; @@ -36,6 +36,7 @@ import com.fr.main.impl.WorkBook; import com.fr.stable.CodeUtils; import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; +import com.fr.stable.resource.ResourceLoader; import javax.imageio.ImageIO; import javax.swing.*; @@ -45,7 +46,7 @@ import javax.swing.event.ListSelectionListener; import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; -import java.io.*; +import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; @@ -82,7 +83,7 @@ public class AlphaFineDialog extends UIDialog { searchTextField.setBorderPainted(false); searchTextField.initKeyListener(this); JPanel topPane = new JPanel(new BorderLayout()); - UILabel iconLabel = new UILabel(new ImageIcon(getClass().getResource("/com/fr/design/mainframe/alphafine/images/bigsearch.png"))); + UILabel iconLabel = new UILabel(new ImageIcon(ResourceLoader.getResource("/com/fr/design/mainframe/alphafine/images/bigsearch.png", getClass()))); iconLabel.setPreferredSize(AlphaFineConstants.ICON_LABEL_SIZE); iconLabel.setOpaque(true); iconLabel.setBackground(Color.white); @@ -98,7 +99,7 @@ public class AlphaFineDialog extends UIDialog { }; closeButton.setContentAreaFilled(false); closeButton.setPreferredSize(AlphaFineConstants.CLOSE_BUTTON_SIZE); - closeButton.setIcon(new ImageIcon(getClass().getResource("/com/fr/design/mainframe/alphafine/images/alphafine_close.png"))); + closeButton.setIcon(new ImageIcon(ResourceLoader.getResource("/com/fr/design/mainframe/alphafine/images/alphafine_close.png", getClass()))); closeButton.set4ToolbarButton(); closeButton.addActionListener(new ActionListener() { @Override @@ -371,7 +372,7 @@ public class AlphaFineDialog extends UIDialog { bufferedImage = ImageIO.read(new URL(((PluginModel) selectedValue).getImageUrl())); } catch (IOException e) { try { - bufferedImage = ImageIO.read(getClass().getResource("/com/fr/design/mainframe/alphafine/images/default_product.png")); + bufferedImage = ImageIO.read(ResourceLoader.getResource("/com/fr/design/mainframe/alphafine/images/default_product.png", getClass())); } catch (IOException e1) { FRLogger.getLogger().error(e.getMessage()); } @@ -417,7 +418,7 @@ public class AlphaFineDialog extends UIDialog { private void showDefaultPreviewPane() { rightSearchResultPane.removeAll(); - UILabel label = new UILabel(new ImageIcon(getClass().getResource("/com/fr/design/mainframe/alphafine/images/opening.gif"))); + UILabel label = new UILabel(new ImageIcon(ResourceLoader.getResource("/com/fr/design/mainframe/alphafine/images/opening.gif", getClass()))); label.setBorder(BorderFactory.createEmptyBorder(120,0,0,0)); rightSearchResultPane.add(label, BorderLayout.CENTER); validate(); diff --git a/designer/src/com/fr/design/mainframe/bbs/BBSConstants.java b/designer/src/com/fr/design/mainframe/bbs/BBSConstants.java index 121929e09..77f2c2fab 100644 --- a/designer/src/com/fr/design/mainframe/bbs/BBSConstants.java +++ b/designer/src/com/fr/design/mainframe/bbs/BBSConstants.java @@ -4,6 +4,7 @@ package com.fr.design.mainframe.bbs; import com.fr.stable.StringUtils; +import com.fr.stable.resource.ResourceLoader; import java.util.Properties; @@ -43,7 +44,7 @@ public class BBSConstants { if (PROP == null) { PROP = new Properties(); try { - PROP.load(BBSConstants.class.getResourceAsStream("/com/fr/design/mainframe/bbs/bbs.properties")); + PROP.load(ResourceLoader.getResourceAsStream("/com/fr/design/mainframe/bbs/bbs.properties", BBSConstants.class)); } catch (Exception e) { } } diff --git a/designer_base/src/com/fr/design/dialog/InformationWarnPane.java b/designer_base/src/com/fr/design/dialog/InformationWarnPane.java index e5dd4fd9f..c6282ca67 100644 --- a/designer_base/src/com/fr/design/dialog/InformationWarnPane.java +++ b/designer_base/src/com/fr/design/dialog/InformationWarnPane.java @@ -25,6 +25,7 @@ import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.general.Inter; import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.stable.resource.ResourceLoader; public class InformationWarnPane extends JPanel{ private UITextArea moreText; @@ -42,7 +43,7 @@ public class InformationWarnPane extends JPanel{ this.title = title; this.setLayout(null); this.setBounds(5,5,410,130); - UILabel image = new UILabel(new ImageIcon(getClass().getResource("/com/fr/design/images/buttonicon/warn.png"))); + UILabel image = new UILabel(new ImageIcon(ResourceLoader.getResource("/com/fr/design/images/buttonicon/warn.png", getClass()))); image.setBounds(10, 25, 80, 80); UITextArea warnLabel = new UITextArea(infor); warnLabel.setLineWrap(true); diff --git a/designer_base/src/com/fr/design/extra/QQLoginWebPane.java b/designer_base/src/com/fr/design/extra/QQLoginWebPane.java index f3c96d219..04211e568 100644 --- a/designer_base/src/com/fr/design/extra/QQLoginWebPane.java +++ b/designer_base/src/com/fr/design/extra/QQLoginWebPane.java @@ -5,6 +5,7 @@ import com.fr.general.ComparatorUtils; import com.fr.general.FRLogger; import com.fr.general.Inter; import com.fr.general.SiteCenter; +import com.fr.stable.resource.ResourceLoader; import javafx.application.Platform; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; @@ -74,7 +75,7 @@ public class QQLoginWebPane extends JFXPanel { try { primaryStage.initStyle(StageStyle.TRANSPARENT); primaryStage.setScene(new Scene(layout)); - webView.getScene().getStylesheets().add(getClass().getResource("modal-dialog.css").toExternalForm()); + webView.getScene().getStylesheets().add(ResourceLoader.getResource("modal-dialog.css", getClass()).toExternalForm()); primaryStage.initStyle(StageStyle.UTILITY); primaryStage.setScene(new Scene(new Group(), DEFAULT_PRIMARYSTAGE_WIDTH, DEFAULT_PRIMARYSTAGE_HEIGHT)); primaryStage.setX(0); @@ -193,7 +194,7 @@ public class QQLoginWebPane extends JFXPanel { ); configDrag(dialog); // style and show the dialog. - dialog.getScene().getStylesheets().add(getClass().getResource("modal-dialog.css").toExternalForm()); + dialog.getScene().getStylesheets().add(ResourceLoader.getResource("modal-dialog.css", getClass()).toExternalForm()); dialog.setOnCloseRequest(new EventHandler() { @Override public void handle(WindowEvent event) { diff --git a/designer_base/src/com/fr/design/gui/UILookAndFeel.java b/designer_base/src/com/fr/design/gui/UILookAndFeel.java index 3bdf14d31..e70d03469 100644 --- a/designer_base/src/com/fr/design/gui/UILookAndFeel.java +++ b/designer_base/src/com/fr/design/gui/UILookAndFeel.java @@ -3,10 +3,12 @@ package com.fr.design.gui; import com.fr.base.BaseUtils; import com.fr.design.gui.borders.*; import com.fr.design.gui.frpane.UIBasicOptionPaneUI; +import com.fr.design.gui.ibutton.UIBasicButtonUI; import com.fr.design.gui.ibutton.UIButtonBorder; import com.fr.design.gui.ibutton.UIRadioButtonMenuItemUI; import com.fr.design.gui.ibutton.UIRadioButtonUI; import com.fr.design.gui.icheckbox.UICheckBoxUI; +import com.fr.design.gui.icombobox.UIBasicComboBoxUI; import com.fr.design.gui.icontainer.UIScrollPaneBorder; import com.fr.design.gui.icontainer.UIScrollPaneUI; import com.fr.design.gui.icontainer.UITableScrollPaneBorder; @@ -16,6 +18,7 @@ import com.fr.design.gui.imenu.UIPopupMenuBorder; import com.fr.design.gui.imenu.UIPopupMenuSeparatorUI; import com.fr.design.gui.iprogressbar.UIProgressBarBorder; import com.fr.design.gui.iprogressbar.UIProgressBarUI; +import com.fr.design.gui.iscrollbar.UIBasicScrollBarUI; import com.fr.design.gui.ispinner.UISpinnerUI; import com.fr.design.gui.isplitpanedivider.UISplitPaneUI; import com.fr.design.gui.itable.UIBasicTableUI; @@ -23,10 +26,8 @@ import com.fr.design.gui.itoolbar.UIToolBarBorder; import com.fr.design.gui.itoolbar.UIToolBarSeparatorUI; import com.fr.design.gui.itooltip.UIToolTipBorder; import com.fr.design.gui.itree.UITreeUI; -import com.fr.design.gui.iscrollbar.UIBasicScrollBarUI; -import com.fr.design.gui.icombobox.UIBasicComboBoxUI; -import com.fr.design.gui.ibutton.UIBasicButtonUI; import com.fr.general.FRLogger; +import com.fr.stable.resource.ResourceLoader; import javax.swing.*; import javax.swing.border.Border; @@ -187,8 +188,8 @@ public class UILookAndFeel extends MetalLookAndFeel { if (url == null) { // Another try - url = UILookAndFeel.class.getResource( - "com/fr/design/images/lookandfeel/" + fileName); + url = ResourceLoader.getResource( + "com/fr/design/images/lookandfeel/" + fileName, UILookAndFeel.class); if (url == null) { FRLogger.getLogger().error("Icon directory could not be resolved."); diff --git a/designer_base/src/com/fr/design/gui/autocomplete/TipUtil.java b/designer_base/src/com/fr/design/gui/autocomplete/TipUtil.java index bb8f32469..2201dd174 100644 --- a/designer_base/src/com/fr/design/gui/autocomplete/TipUtil.java +++ b/designer_base/src/com/fr/design/gui/autocomplete/TipUtil.java @@ -8,16 +8,14 @@ */ package com.fr.design.gui.autocomplete; -import java.awt.Color; -import java.awt.Font; -import java.awt.SystemColor; -import java.net.URL; -import javax.swing.BorderFactory; -import javax.swing.JEditorPane; -import javax.swing.UIManager; +import com.fr.stable.resource.ResourceLoader; + +import javax.swing.*; import javax.swing.border.Border; import javax.swing.plaf.ColorUIResource; import javax.swing.text.html.HTMLDocument; +import java.awt.*; +import java.net.URL; /** @@ -166,8 +164,8 @@ class TipUtil { Color linkFG = Util.getHyperlinkForeground(); doc.getStyleSheet().addRule( "a { color: " + Util.getHexString(linkFG) + "; }"); - - URL url = TipUtil.class.getResource("bullet_black.png"); + + URL url = ResourceLoader.getResource("bullet_black.png", TipUtil.class); if (url!=null) { doc.getStyleSheet().addRule( "ul { list-style-image: '" + url.toString() + "'; }"); diff --git a/designer_chart/src/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java b/designer_chart/src/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java index f56146b8b..c386d1cab 100644 --- a/designer_chart/src/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java +++ b/designer_chart/src/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java @@ -3,6 +3,7 @@ package com.fr.design.mainframe.chart.gui.type; import com.fr.design.chart.series.PlotStyle.ChartSelectDemoPane; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ilable.UILabel; +import com.fr.stable.resource.ResourceLoader; import javax.swing.*; import java.awt.*; @@ -14,9 +15,9 @@ public class ChartImagePane extends ChartSelectDemoPane { public boolean isDoubleClicked = false; public ChartImagePane(String iconPath, String tipName) {// 建立太复杂? 耗费内存.. - UILabel image = new UILabel(new ImageIcon(getClass().getResource(iconPath))); - this.setLayout(new BorderLayout()); - this.add(image, BorderLayout.CENTER); + UILabel image = new UILabel(new ImageIcon(ResourceLoader.getResource(iconPath, getClass()))); + this.setLayout(new BorderLayout()); + this.add(image, BorderLayout.CENTER); addMouseListener(this); this.setToolTipText(tipName); @@ -28,7 +29,8 @@ public class ChartImagePane extends ChartSelectDemoPane { } private void constructImagePane(String fullIconPath, String tipName, boolean isDrawRightLine){ - UILabel image = new UILabel(new ImageIcon(getClass().getResource(fullIconPath))); + + UILabel image = new UILabel(new ImageIcon(ResourceLoader.getResource(fullIconPath, getClass()))); this.setLayout(new BorderLayout()); this.add(image, BorderLayout.CENTER); addMouseListener(this); From f67996f5570617072e57a5796f7741e1f3ae0f92 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Wed, 24 May 2017 16:41:24 +0800 Subject: [PATCH 09/54] =?UTF-8?q?=C2=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/gui/autocomplete/TipUtil.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/designer_base/src/com/fr/design/gui/autocomplete/TipUtil.java b/designer_base/src/com/fr/design/gui/autocomplete/TipUtil.java index 2201dd174..bb8f32469 100644 --- a/designer_base/src/com/fr/design/gui/autocomplete/TipUtil.java +++ b/designer_base/src/com/fr/design/gui/autocomplete/TipUtil.java @@ -8,14 +8,16 @@ */ package com.fr.design.gui.autocomplete; -import com.fr.stable.resource.ResourceLoader; - -import javax.swing.*; +import java.awt.Color; +import java.awt.Font; +import java.awt.SystemColor; +import java.net.URL; +import javax.swing.BorderFactory; +import javax.swing.JEditorPane; +import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.plaf.ColorUIResource; import javax.swing.text.html.HTMLDocument; -import java.awt.*; -import java.net.URL; /** @@ -164,8 +166,8 @@ class TipUtil { Color linkFG = Util.getHyperlinkForeground(); doc.getStyleSheet().addRule( "a { color: " + Util.getHexString(linkFG) + "; }"); - - URL url = ResourceLoader.getResource("bullet_black.png", TipUtil.class); + + URL url = TipUtil.class.getResource("bullet_black.png"); if (url!=null) { doc.getStyleSheet().addRule( "ul { list-style-image: '" + url.toString() + "'; }"); From 2dd7ddb52ce5cb8f4de03bf3d3abed2a5238e777 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Wed, 24 May 2017 16:42:13 +0800 Subject: [PATCH 10/54] =?UTF-8?q?=C2=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/fr/design/dialog/InformationWarnPane.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/designer_base/src/com/fr/design/dialog/InformationWarnPane.java b/designer_base/src/com/fr/design/dialog/InformationWarnPane.java index c6282ca67..e5dd4fd9f 100644 --- a/designer_base/src/com/fr/design/dialog/InformationWarnPane.java +++ b/designer_base/src/com/fr/design/dialog/InformationWarnPane.java @@ -25,7 +25,6 @@ import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.general.Inter; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.stable.resource.ResourceLoader; public class InformationWarnPane extends JPanel{ private UITextArea moreText; @@ -43,7 +42,7 @@ public class InformationWarnPane extends JPanel{ this.title = title; this.setLayout(null); this.setBounds(5,5,410,130); - UILabel image = new UILabel(new ImageIcon(ResourceLoader.getResource("/com/fr/design/images/buttonicon/warn.png", getClass()))); + UILabel image = new UILabel(new ImageIcon(getClass().getResource("/com/fr/design/images/buttonicon/warn.png"))); image.setBounds(10, 25, 80, 80); UITextArea warnLabel = new UITextArea(infor); warnLabel.setLineWrap(true); From 7ea04c49a5581954717022f17fc95c966559579c Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Thu, 25 May 2017 09:14:19 +0800 Subject: [PATCH 11/54] =?UTF-8?q?IOUtils=E6=B7=BB=E5=8A=A0=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E5=8A=A0=E8=BD=BD=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=8F=AF?= =?UTF-8?q?=E8=AE=BF=E9=97=AE=E5=88=B0IOUtils=E7=9A=84=E5=9C=B0=E6=96=B9?= =?UTF-8?q?=E9=83=BD=E7=94=A8IOUtils=E5=8A=A0=E8=BD=BD=E8=B5=84=E6=BA=90?= =?UTF-8?q?=EF=BC=8C=E8=AE=BF=E9=97=AE=E4=B8=8D=E5=88=B0=E7=9A=84=E8=AF=9D?= =?UTF-8?q?=E5=86=8D=E7=9B=B4=E6=8E=A5=E7=94=A8ResourceLoader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alphafine/cell/render/ContentCellRender.java | 4 ++-- .../alphafine/cell/render/TitleCellRender.java | 4 ++-- .../mainframe/alphafine/component/AlphaFineDialog.java | 10 +++++----- .../src/com/fr/design/mainframe/bbs/BBSConstants.java | 4 ++-- .../src/com/fr/design/extra/QQLoginWebPane.java | 10 +++------- designer_base/src/com/fr/design/gui/UILookAndFeel.java | 4 ++-- .../mainframe/chart/gui/type/ChartImagePane.java | 6 +++--- 7 files changed, 19 insertions(+), 23 deletions(-) diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java b/designer/src/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java index 74fbf8e01..fa31794d3 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java @@ -4,7 +4,7 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; -import com.fr.stable.resource.ResourceLoader; +import com.fr.general.IOUtils; import javax.swing.*; import java.awt.*; @@ -34,7 +34,7 @@ public class ContentCellRender implements ListCellRenderer { AlphaCellModel model = (AlphaCellModel) value; name.setText(model.getName()); String iconUrl = "/com/fr/design/mainframe/alphafine/images/alphafine" + model.getType().getTypeValue() + ".png"; - name.setIcon(new ImageIcon(ResourceLoader.getResource(iconUrl, getClass()))); + name.setIcon(new ImageIcon(IOUtils.getResource(iconUrl, getClass()))); name.setFont(AlphaFineConstants.MEDIUM_FONT); name.setForeground(AlphaFineConstants.BLACK); name.setVerticalTextPosition(SwingConstants.CENTER); diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/render/TitleCellRender.java b/designer/src/com/fr/design/mainframe/alphafine/cell/render/TitleCellRender.java index f607f8fec..339815d5c 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/cell/render/TitleCellRender.java +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/render/TitleCellRender.java @@ -3,7 +3,7 @@ package com.fr.design.mainframe.alphafine.cell.render; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; -import com.fr.stable.resource.ResourceLoader; +import com.fr.general.IOUtils; import javax.swing.*; import java.awt.*; @@ -37,7 +37,7 @@ public class TitleCellRender implements ListCellRenderer { panel.add(this.more, BorderLayout.EAST); } if (moreModel.isLoading()) { - ImageIcon imageIcon = new ImageIcon(ResourceLoader.getResource("/com/fr/design/mainframe/alphafine/images/loading.gif", getClass())); + ImageIcon imageIcon = new ImageIcon(IOUtils.getResource("/com/fr/design/mainframe/alphafine/images/loading.gif", getClass())); //设置cell的加载动画 imageIcon.setImageObserver(list); diff --git a/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java index 5f93957ac..6ac98a2c8 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java +++ b/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -26,6 +26,7 @@ import com.fr.form.main.Form; import com.fr.form.main.FormIO; import com.fr.general.ComparatorUtils; import com.fr.general.FRLogger; +import com.fr.general.IOUtils; import com.fr.general.Inter; import com.fr.general.http.HttpClient; import com.fr.io.TemplateWorkBookIO; @@ -36,7 +37,6 @@ import com.fr.main.impl.WorkBook; import com.fr.stable.CodeUtils; import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; -import com.fr.stable.resource.ResourceLoader; import javax.imageio.ImageIO; import javax.swing.*; @@ -83,7 +83,7 @@ public class AlphaFineDialog extends UIDialog { searchTextField.setBorderPainted(false); searchTextField.initKeyListener(this); JPanel topPane = new JPanel(new BorderLayout()); - UILabel iconLabel = new UILabel(new ImageIcon(ResourceLoader.getResource("/com/fr/design/mainframe/alphafine/images/bigsearch.png", getClass()))); + UILabel iconLabel = new UILabel(new ImageIcon(IOUtils.getResource("/com/fr/design/mainframe/alphafine/images/bigsearch.png", getClass()))); iconLabel.setPreferredSize(AlphaFineConstants.ICON_LABEL_SIZE); iconLabel.setOpaque(true); iconLabel.setBackground(Color.white); @@ -99,7 +99,7 @@ public class AlphaFineDialog extends UIDialog { }; closeButton.setContentAreaFilled(false); closeButton.setPreferredSize(AlphaFineConstants.CLOSE_BUTTON_SIZE); - closeButton.setIcon(new ImageIcon(ResourceLoader.getResource("/com/fr/design/mainframe/alphafine/images/alphafine_close.png", getClass()))); + closeButton.setIcon(new ImageIcon(IOUtils.getResource("/com/fr/design/mainframe/alphafine/images/alphafine_close.png", getClass()))); closeButton.set4ToolbarButton(); closeButton.addActionListener(new ActionListener() { @Override @@ -372,7 +372,7 @@ public class AlphaFineDialog extends UIDialog { bufferedImage = ImageIO.read(new URL(((PluginModel) selectedValue).getImageUrl())); } catch (IOException e) { try { - bufferedImage = ImageIO.read(ResourceLoader.getResource("/com/fr/design/mainframe/alphafine/images/default_product.png", getClass())); + bufferedImage = ImageIO.read(IOUtils.getResource("/com/fr/design/mainframe/alphafine/images/default_product.png", getClass())); } catch (IOException e1) { FRLogger.getLogger().error(e.getMessage()); } @@ -418,7 +418,7 @@ public class AlphaFineDialog extends UIDialog { private void showDefaultPreviewPane() { rightSearchResultPane.removeAll(); - UILabel label = new UILabel(new ImageIcon(ResourceLoader.getResource("/com/fr/design/mainframe/alphafine/images/opening.gif", getClass()))); + UILabel label = new UILabel(new ImageIcon(IOUtils.getResource("/com/fr/design/mainframe/alphafine/images/opening.gif", getClass()))); label.setBorder(BorderFactory.createEmptyBorder(120,0,0,0)); rightSearchResultPane.add(label, BorderLayout.CENTER); validate(); diff --git a/designer/src/com/fr/design/mainframe/bbs/BBSConstants.java b/designer/src/com/fr/design/mainframe/bbs/BBSConstants.java index 77f2c2fab..21d815727 100644 --- a/designer/src/com/fr/design/mainframe/bbs/BBSConstants.java +++ b/designer/src/com/fr/design/mainframe/bbs/BBSConstants.java @@ -3,8 +3,8 @@ */ package com.fr.design.mainframe.bbs; +import com.fr.general.IOUtils; import com.fr.stable.StringUtils; -import com.fr.stable.resource.ResourceLoader; import java.util.Properties; @@ -44,7 +44,7 @@ public class BBSConstants { if (PROP == null) { PROP = new Properties(); try { - PROP.load(ResourceLoader.getResourceAsStream("/com/fr/design/mainframe/bbs/bbs.properties", BBSConstants.class)); + PROP.load(IOUtils.getResourceAsStream("/com/fr/design/mainframe/bbs/bbs.properties", BBSConstants.class)); } catch (Exception e) { } } diff --git a/designer_base/src/com/fr/design/extra/QQLoginWebPane.java b/designer_base/src/com/fr/design/extra/QQLoginWebPane.java index 04211e568..096f9bb25 100644 --- a/designer_base/src/com/fr/design/extra/QQLoginWebPane.java +++ b/designer_base/src/com/fr/design/extra/QQLoginWebPane.java @@ -1,11 +1,7 @@ package com.fr.design.extra; import com.fr.base.FRContext; -import com.fr.general.ComparatorUtils; -import com.fr.general.FRLogger; -import com.fr.general.Inter; -import com.fr.general.SiteCenter; -import com.fr.stable.resource.ResourceLoader; +import com.fr.general.*; import javafx.application.Platform; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; @@ -75,7 +71,7 @@ public class QQLoginWebPane extends JFXPanel { try { primaryStage.initStyle(StageStyle.TRANSPARENT); primaryStage.setScene(new Scene(layout)); - webView.getScene().getStylesheets().add(ResourceLoader.getResource("modal-dialog.css", getClass()).toExternalForm()); + webView.getScene().getStylesheets().add(IOUtils.getResource("modal-dialog.css", getClass()).toExternalForm()); primaryStage.initStyle(StageStyle.UTILITY); primaryStage.setScene(new Scene(new Group(), DEFAULT_PRIMARYSTAGE_WIDTH, DEFAULT_PRIMARYSTAGE_HEIGHT)); primaryStage.setX(0); @@ -194,7 +190,7 @@ public class QQLoginWebPane extends JFXPanel { ); configDrag(dialog); // style and show the dialog. - dialog.getScene().getStylesheets().add(ResourceLoader.getResource("modal-dialog.css", getClass()).toExternalForm()); + dialog.getScene().getStylesheets().add(IOUtils.getResource("modal-dialog.css", getClass()).toExternalForm()); dialog.setOnCloseRequest(new EventHandler() { @Override public void handle(WindowEvent event) { diff --git a/designer_base/src/com/fr/design/gui/UILookAndFeel.java b/designer_base/src/com/fr/design/gui/UILookAndFeel.java index e70d03469..205abed29 100644 --- a/designer_base/src/com/fr/design/gui/UILookAndFeel.java +++ b/designer_base/src/com/fr/design/gui/UILookAndFeel.java @@ -27,7 +27,7 @@ import com.fr.design.gui.itoolbar.UIToolBarSeparatorUI; import com.fr.design.gui.itooltip.UIToolTipBorder; import com.fr.design.gui.itree.UITreeUI; import com.fr.general.FRLogger; -import com.fr.stable.resource.ResourceLoader; +import com.fr.general.IOUtils; import javax.swing.*; import javax.swing.border.Border; @@ -188,7 +188,7 @@ public class UILookAndFeel extends MetalLookAndFeel { if (url == null) { // Another try - url = ResourceLoader.getResource( + url = IOUtils.getResource( "com/fr/design/images/lookandfeel/" + fileName, UILookAndFeel.class); if (url == null) { diff --git a/designer_chart/src/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java b/designer_chart/src/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java index c386d1cab..247dd5c08 100644 --- a/designer_chart/src/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java +++ b/designer_chart/src/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java @@ -3,7 +3,7 @@ package com.fr.design.mainframe.chart.gui.type; import com.fr.design.chart.series.PlotStyle.ChartSelectDemoPane; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ilable.UILabel; -import com.fr.stable.resource.ResourceLoader; +import com.fr.general.IOUtils; import javax.swing.*; import java.awt.*; @@ -15,7 +15,7 @@ public class ChartImagePane extends ChartSelectDemoPane { public boolean isDoubleClicked = false; public ChartImagePane(String iconPath, String tipName) {// 建立太复杂? 耗费内存.. - UILabel image = new UILabel(new ImageIcon(ResourceLoader.getResource(iconPath, getClass()))); + UILabel image = new UILabel(new ImageIcon(IOUtils.getResource(iconPath, getClass()))); this.setLayout(new BorderLayout()); this.add(image, BorderLayout.CENTER); addMouseListener(this); @@ -30,7 +30,7 @@ public class ChartImagePane extends ChartSelectDemoPane { private void constructImagePane(String fullIconPath, String tipName, boolean isDrawRightLine){ - UILabel image = new UILabel(new ImageIcon(ResourceLoader.getResource(fullIconPath, getClass()))); + UILabel image = new UILabel(new ImageIcon(IOUtils.getResource(fullIconPath, getClass()))); this.setLayout(new BorderLayout()); this.add(image, BorderLayout.CENTER); addMouseListener(this); From 628f655e1a3ba2ef3c069aa5ac3174e9040d707e Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Thu, 25 May 2017 09:43:28 +0800 Subject: [PATCH 12/54] pmd --- .../mainframe/alphafine/cell/render/ContentCellRender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java b/designer/src/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java index fa31794d3..a008258fe 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java @@ -34,7 +34,7 @@ public class ContentCellRender implements ListCellRenderer { AlphaCellModel model = (AlphaCellModel) value; name.setText(model.getName()); String iconUrl = "/com/fr/design/mainframe/alphafine/images/alphafine" + model.getType().getTypeValue() + ".png"; - name.setIcon(new ImageIcon(IOUtils.getResource(iconUrl, getClass()))); + name.setIcon(IOUtils.readIcon(iconUrl)); name.setFont(AlphaFineConstants.MEDIUM_FONT); name.setForeground(AlphaFineConstants.BLACK); name.setVerticalTextPosition(SwingConstants.CENTER); From 452019169e5c15652b6e3fac4c422e0349695340 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Thu, 25 May 2017 09:59:02 +0800 Subject: [PATCH 13/54] =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E7=94=A8IOUtils?= =?UTF-8?q?=E7=9A=84=E5=B7=A5=E5=85=B7=E6=96=B9=E6=B3=95=E8=AF=BB=E5=8F=96?= =?UTF-8?q?Icon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alphafine/cell/render/TitleCellRender.java | 4 ++-- .../alphafine/component/AlphaFineDialog.java | 12 ++++-------- .../mainframe/chart/gui/type/ChartImagePane.java | 4 ++-- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/render/TitleCellRender.java b/designer/src/com/fr/design/mainframe/alphafine/cell/render/TitleCellRender.java index 339815d5c..5926d4e21 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/cell/render/TitleCellRender.java +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/render/TitleCellRender.java @@ -37,8 +37,8 @@ public class TitleCellRender implements ListCellRenderer { panel.add(this.more, BorderLayout.EAST); } if (moreModel.isLoading()) { - ImageIcon imageIcon = new ImageIcon(IOUtils.getResource("/com/fr/design/mainframe/alphafine/images/loading.gif", getClass())); - + ImageIcon imageIcon = (ImageIcon) IOUtils.readIcon("/com/fr/design/mainframe/alphafine/images/loading.gif"); + //设置cell的加载动画 imageIcon.setImageObserver(list); UILabel loadingLabel = new UILabel(imageIcon); diff --git a/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java index 6ac98a2c8..169f1a492 100644 --- a/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java +++ b/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -83,7 +83,7 @@ public class AlphaFineDialog extends UIDialog { searchTextField.setBorderPainted(false); searchTextField.initKeyListener(this); JPanel topPane = new JPanel(new BorderLayout()); - UILabel iconLabel = new UILabel(new ImageIcon(IOUtils.getResource("/com/fr/design/mainframe/alphafine/images/bigsearch.png", getClass()))); + UILabel iconLabel = new UILabel(IOUtils.readIcon("/com/fr/design/mainframe/alphafine/images/bigsearch.png")); iconLabel.setPreferredSize(AlphaFineConstants.ICON_LABEL_SIZE); iconLabel.setOpaque(true); iconLabel.setBackground(Color.white); @@ -99,7 +99,7 @@ public class AlphaFineDialog extends UIDialog { }; closeButton.setContentAreaFilled(false); closeButton.setPreferredSize(AlphaFineConstants.CLOSE_BUTTON_SIZE); - closeButton.setIcon(new ImageIcon(IOUtils.getResource("/com/fr/design/mainframe/alphafine/images/alphafine_close.png", getClass()))); + closeButton.setIcon(IOUtils.readIcon("/com/fr/design/mainframe/alphafine/images/alphafine_close.png")); closeButton.set4ToolbarButton(); closeButton.addActionListener(new ActionListener() { @Override @@ -371,11 +371,7 @@ public class AlphaFineDialog extends UIDialog { try { bufferedImage = ImageIO.read(new URL(((PluginModel) selectedValue).getImageUrl())); } catch (IOException e) { - try { - bufferedImage = ImageIO.read(IOUtils.getResource("/com/fr/design/mainframe/alphafine/images/default_product.png", getClass())); - } catch (IOException e1) { - FRLogger.getLogger().error(e.getMessage()); - } + bufferedImage = IOUtils.readImage("/com/fr/design/mainframe/alphafine/images/default_product.png"); } return bufferedImage; } @@ -418,7 +414,7 @@ public class AlphaFineDialog extends UIDialog { private void showDefaultPreviewPane() { rightSearchResultPane.removeAll(); - UILabel label = new UILabel(new ImageIcon(IOUtils.getResource("/com/fr/design/mainframe/alphafine/images/opening.gif", getClass()))); + UILabel label = new UILabel(IOUtils.readIcon("/com/fr/design/mainframe/alphafine/images/opening.gif")); label.setBorder(BorderFactory.createEmptyBorder(120,0,0,0)); rightSearchResultPane.add(label, BorderLayout.CENTER); validate(); diff --git a/designer_chart/src/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java b/designer_chart/src/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java index 247dd5c08..7b35b8d8d 100644 --- a/designer_chart/src/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java +++ b/designer_chart/src/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java @@ -15,7 +15,7 @@ public class ChartImagePane extends ChartSelectDemoPane { public boolean isDoubleClicked = false; public ChartImagePane(String iconPath, String tipName) {// 建立太复杂? 耗费内存.. - UILabel image = new UILabel(new ImageIcon(IOUtils.getResource(iconPath, getClass()))); + UILabel image = new UILabel(IOUtils.readIcon(iconPath)); this.setLayout(new BorderLayout()); this.add(image, BorderLayout.CENTER); addMouseListener(this); @@ -30,7 +30,7 @@ public class ChartImagePane extends ChartSelectDemoPane { private void constructImagePane(String fullIconPath, String tipName, boolean isDrawRightLine){ - UILabel image = new UILabel(new ImageIcon(IOUtils.getResource(fullIconPath, getClass()))); + UILabel image = new UILabel(IOUtils.readIcon(fullIconPath)); this.setLayout(new BorderLayout()); this.add(image, BorderLayout.CENTER); addMouseListener(this); From 90d92b536ad66befb70fd10ddf4cd4d600535046 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Thu, 25 May 2017 11:02:47 +0800 Subject: [PATCH 14/54] fix --- designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java b/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java index aa646fa38..b77e1f399 100644 --- a/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java +++ b/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java @@ -20,7 +20,6 @@ import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPa import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; import com.fr.design.module.DesignModuleFactory; import com.fr.form.ui.ChartEditor; -import com.fr.general.GeneralContext; import com.fr.general.IOUtils; import com.fr.general.Inter; import com.fr.plugin.context.PluginContext; @@ -35,7 +34,6 @@ import com.fr.stable.StringUtils; import com.fr.stable.bridge.StableFactory; import com.fr.stable.collections.map.CloseableContainedMap; import com.fr.stable.plugin.ExtraChartDesignClassManagerProvider; -import com.fr.stable.plugin.PluginReadListener; import javax.swing.*; import java.util.*; From 8d1239824cf9dffa39e119ad8d047199ece1c41e Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Thu, 25 May 2017 14:52:27 +0800 Subject: [PATCH 15/54] =?UTF-8?q?=E8=BF=9C=E7=A8=8B=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E8=87=AA=E5=8A=A8=E5=90=8C=E6=AD=A5=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E8=BF=90=E8=A1=8C=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer_base/src/com/fr/env/RemoteEnv.java | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/designer_base/src/com/fr/env/RemoteEnv.java b/designer_base/src/com/fr/env/RemoteEnv.java index f1c8cbd10..cc60cc648 100644 --- a/designer_base/src/com/fr/env/RemoteEnv.java +++ b/designer_base/src/com/fr/env/RemoteEnv.java @@ -2195,7 +2195,25 @@ public class RemoteEnv extends AbstractEnv { @Override public boolean hasPluginServiceStarted(String key) { - // TODO: 2017/5/22 + return true; } + + @Override + public JSONArray getPluginStatus() { + + try { + HashMap para = new HashMap(); + para.put("op", "plugin"); + para.put("cmd", "get_states"); + para.put("current_uid", this.createUserID()); + para.put("currentUsername", this.getUser()); + + HttpClient client = createHttpMethod(para); + InputStream input = execute4InputStream(client); + return new JSONArray(stream2String(input)); + } catch (Exception e) { + return JSONArray.create(); + } + } } \ No newline at end of file From 7f9abdb73562166c33cbd1aba61e40fc0a8d7392 Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 26 May 2017 17:02:34 +0800 Subject: [PATCH 16/54] =?UTF-8?q?REPORT-2354=20=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E6=93=8D=E4=BD=9C=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/extra/PluginWebBridge.java | 78 ++-------- .../com/fr/design/extra/WebViewDlgHelper.java | 4 +- .../extra/exe/GetLoginInfoExecutor.java | 4 +- .../exe/GetPluginCategoriesExecutor.java | 5 +- .../extra/exe/GetPluginFromStoreExecutor.java | 4 +- .../extra/exe/InstallFromDiskExecutor.java | 64 ++++++-- .../extra/exe/InstallOnlineExecutor.java | 138 +++++++++-------- .../extra/exe/ModifyStatusExecutor.java | 51 +++++-- .../extra/exe/ReadUpdateOnlineExecutor.java | 12 +- .../design/extra/exe/UninstallExecutor.java | 62 ++++---- .../extra/exe/UpdateFromDiskExecutor.java | 46 +++++- .../extra/exe/UpdateOnlineExecutor.java | 139 +++++++++--------- 12 files changed, 333 insertions(+), 274 deletions(-) diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer_base/src/com/fr/design/extra/PluginWebBridge.java index f1759f016..8df0f7494 100644 --- a/designer_base/src/com/fr/design/extra/PluginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/PluginWebBridge.java @@ -9,10 +9,10 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.general.FRLogger; import com.fr.general.Inter; import com.fr.general.SiteCenter; -import com.fr.plugin.Plugin; import com.fr.plugin.PluginLicense; import com.fr.plugin.PluginLicenseManager; -import com.fr.plugin.PluginLoader; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.manage.PluginManager; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; import javafx.concurrent.Task; @@ -143,14 +143,16 @@ public class PluginWebBridge { /** * 从插件服务器上安装插件 * - * @param pluginID 插件的ID + * @param pluginInfo 插件的ID * @param callback 回调函数 */ - public void installPluginOnline(final String pluginID, final JSObject callback) { - Task task = new PluginTask<>(webEngine, callback, new InstallOnlineExecutor(pluginID)); + public void installPluginOnline(final String pluginInfo, final JSObject callback) { + Task task = new PluginTask<>(webEngine, callback, new InstallOnlineExecutor(pluginInfo)); new Thread(task).start(); } + + /** * 从磁盘上选择插件安装包进行安装 * @@ -164,13 +166,14 @@ public class PluginWebBridge { /** * 卸载当前选中的插件 * - * @param pluginIDs 插件集合 + * @param pluginInfo 插件信息 */ - public void uninstallPlugin(JSObject pluginIDs, final JSObject callback) { - Task task = new PluginTask<>(webEngine, callback, new UninstallExecutor(jsObjectToStringArray(pluginIDs))); + public void uninstallPlugin(final String pluginInfo, final boolean isForce, final JSObject callback) { + Task task = new PluginTask<>(webEngine, callback, new UninstallExecutor(pluginInfo, isForce)); new Thread(task).start(); } + /** * 从插件服务器上更新选中的插件 * @@ -266,8 +269,9 @@ public class PluginWebBridge { * * @return 已安装的插件组成的数组 */ - public Plugin[] getInstalledPlugins() { - return PluginLoader.getLoader().getInstalled(); + public PluginContext[] getInstalledPlugins() { + List plugins = PluginManager.getContexts(); + return plugins.toArray(new PluginContext[plugins.size()]); } @@ -439,60 +443,6 @@ public class PluginWebBridge { } } - /** - * 从硬盘升级 - * - * @param fileOnDisk 硬盘上的文件 - */ - public void updateFileFromDisk(File fileOnDisk) { - try { - Plugin plugin = PluginHelper.readPlugin(fileOnDisk); - if (plugin == null) { - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Illegal_Plugin_Zip"), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - return; - } - Plugin oldPlugin = PluginLoader.getLoader().getPluginById(plugin.getId()); - if (oldPlugin != null) { - // 说明安装了同ID的插件,再比较两个插件的版本 - if (PluginHelper.isNewThan(plugin, oldPlugin)) { - // 说明是新的插件,删除老的然后安装新的 - final String[] files = PluginHelper.uninstallPlugin(FRContext.getCurrentEnv(), oldPlugin); - PluginHelper.installPluginFromUnzippedTempDir(FRContext.getCurrentEnv(), plugin, new After() { - @Override - public void done() { - int rv = JOptionPane.showOptionDialog( - null, - Inter.getLocText("FR-Designer-Plugin_Update_Successful"), - Inter.getLocText("FR-Designer-Plugin_Warning"), - JOptionPane.YES_NO_OPTION, - JOptionPane.INFORMATION_MESSAGE, - null, - new String[]{Inter.getLocText("FR-Designer-Basic_Restart_Designer"), - Inter.getLocText("FR-Designer-Basic_Restart_Designer_Later") - }, - null - ); - - if (rv == JOptionPane.OK_OPTION) { - RestartHelper.restart(); - } - // 如果不是立即重启,就把要删除的文件存放起来 - if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) { - RestartHelper.saveFilesWhichToDelete(files); - } - } - }); - } else { - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Version_Is_Lower_Than_Current"), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } - } else { - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Cannot_Update_Not_Install"), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } - } catch (Exception e1) { - JOptionPane.showMessageDialog(null, e1.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } - } - /*-------------------------------登录部分的处理----------------------------------*/ diff --git a/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java b/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java index 481498fc8..8bb7cfc57 100644 --- a/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java +++ b/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java @@ -133,7 +133,7 @@ public class WebViewDlgHelper { String username = DesignerEnvManager.getEnvManager().getBBSName(); String password = DesignerEnvManager.getEnvManager().getBBSPassword(); try { - PluginHelper.downloadPluginFile(scriptsId, username, password, new Process() { + PluginUtils.downloadShopScripts(scriptsId, username, password, new Process() { @Override public void process(Double integer) { } @@ -153,7 +153,7 @@ public class WebViewDlgHelper { try { if (get()) { - IOUtils.unzip(new File(StableUtils.pathJoin(PluginHelper.DOWNLOAD_PATH, PluginHelper.TEMP_FILE)), StableUtils.getInstallHome()); + IOUtils.unzip(new File(StableUtils.pathJoin(PluginConstants.DOWNLOAD_PATH, PluginConstants.TEMP_FILE)), StableUtils.getInstallHome()); int rv = JOptionPane.showOptionDialog( null, Inter.getLocText("FR-Designer-Plugin_Shop_Installed"), diff --git a/designer_base/src/com/fr/design/extra/exe/GetLoginInfoExecutor.java b/designer_base/src/com/fr/design/extra/exe/GetLoginInfoExecutor.java index 91402c47c..f65dd1584 100644 --- a/designer_base/src/com/fr/design/extra/exe/GetLoginInfoExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/GetLoginInfoExecutor.java @@ -2,6 +2,7 @@ package com.fr.design.extra.exe; import com.fr.design.DesignerEnvManager; import com.fr.design.extra.Process; +import com.fr.plugin.manage.bbs.BBSPluginLogin; import com.fr.stable.StringUtils; /** @@ -26,9 +27,10 @@ public class GetLoginInfoExecutor implements Executor { @Override public void run(Process process) { - String username = DesignerEnvManager.getEnvManager().getBBSName(); + String username = BBSPluginLogin.getInstance().getUserInfo().getUserName(); String inShowUsername = DesignerEnvManager.getEnvManager().getInShowBBsName(); if (StringUtils.isEmpty(username) && StringUtils.isEmpty(inShowUsername)) { + return; }else { result = StringUtils.isEmpty(inShowUsername) ? username : inShowUsername; } diff --git a/designer_base/src/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java b/designer_base/src/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java index 92aa0bbe8..c90521316 100644 --- a/designer_base/src/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java @@ -1,6 +1,6 @@ package com.fr.design.extra.exe; -import com.fr.design.extra.PluginHelper; +import com.fr.design.extra.PluginConstants; import com.fr.design.extra.Process; import com.fr.general.SiteCenter; import com.fr.general.http.HttpClient; @@ -32,9 +32,8 @@ public class GetPluginCategoriesExecutor implements Executor { HttpClient httpClient = new HttpClient(url); result = httpClient.getResponseText(); } else { - result = PluginHelper.CONNECTION_404; + result = PluginConstants.CONNECTION_404; } - } } }; diff --git a/designer_base/src/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java b/designer_base/src/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java index 9bd7e2bbe..a276d386c 100644 --- a/designer_base/src/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java @@ -1,6 +1,6 @@ package com.fr.design.extra.exe; -import com.fr.design.extra.PluginHelper; +import com.fr.design.extra.PluginConstants; import com.fr.design.extra.Process; import com.fr.general.FRLogger; import com.fr.general.SiteCenter; @@ -59,7 +59,7 @@ public class GetPluginFromStoreExecutor implements Executor { FRLogger.getLogger().error(e.getMessage()); } } else { - result = PluginHelper.CONNECTION_404; + result = PluginConstants.CONNECTION_404; } } } diff --git a/designer_base/src/com/fr/design/extra/exe/InstallFromDiskExecutor.java b/designer_base/src/com/fr/design/extra/exe/InstallFromDiskExecutor.java index da5222f96..5e7f5e2b8 100644 --- a/designer_base/src/com/fr/design/extra/exe/InstallFromDiskExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/InstallFromDiskExecutor.java @@ -1,12 +1,12 @@ package com.fr.design.extra.exe; -import com.fr.design.extra.After; -import com.fr.design.extra.PluginHelper; -import com.fr.design.extra.PluginWebBridge; import com.fr.design.extra.Process; import com.fr.general.FRLogger; import com.fr.general.Inter; -import com.fr.plugin.PluginVerifyException; +import com.fr.plugin.error.PluginErrorCode; +import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.manage.control.PluginTaskResult; +import com.fr.plugin.manage.control.ProgressCallback; import javax.swing.*; import java.io.File; @@ -49,21 +49,55 @@ public class InstallFromDiskExecutor implements Executor { @Override public void run(Process process) { - try { - PluginHelper.installPluginFromDisk(new File(filePath), new After() { - @Override - public void done() { + PluginManager.getController().install(new File(filePath), new ProgressCallback() { + @Override + public void updateProgress(String description, double progress) { + } + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { FRLogger.getLogger().info("插件安装成功"); - PluginWebBridge.getHelper().showRestartMessage(Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + } else if(result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()){ + int rv = JOptionPane.showOptionDialog( + null, + Inter.getLocText("安装依赖"), + Inter.getLocText("FR-Designer-Plugin_Warning"), + JOptionPane.YES_NO_CANCEL_OPTION, + JOptionPane.INFORMATION_MESSAGE, + null, + null, + null + ); + if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) { + return; + } + installWithDepenndence(); + }else{ + FRLogger.getLogger().info("插件安装失败"); + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } - }); - } catch (PluginVerifyException e) { - JOptionPane.showMessageDialog(null, e.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } catch (Exception e) { - FRLogger.getLogger().error(e.getMessage()); - } + } + }); } } }; } + + public void installWithDepenndence(){ + PluginManager.getController().install(new File(filePath), new ProgressCallback() { + @Override + public void updateProgress(String description, double progress) { + } + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + FRLogger.getLogger().info("插件安装成功"); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + } else{ + FRLogger.getLogger().info("插件安装失败"); + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } + }); + } } diff --git a/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java b/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java index 53fc738ad..2a95ec29a 100644 --- a/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java @@ -1,16 +1,16 @@ package com.fr.design.extra.exe; -import com.fr.base.FRContext; -import com.fr.design.DesignerEnvManager; -import com.fr.design.RestartHelper; -import com.fr.design.extra.After; import com.fr.design.extra.LoginCheckContext; -import com.fr.design.extra.PluginHelper; +import com.fr.design.extra.PluginUtils; import com.fr.design.extra.Process; +import com.fr.general.FRLogger; import com.fr.general.Inter; -import com.fr.plugin.PluginVerifyException; -import com.fr.plugin.dependence.PluginDependenceException; -import com.fr.stable.StringUtils; +import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.error.PluginErrorCode; +import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.manage.bbs.BBSPluginLogin; +import com.fr.plugin.manage.control.PluginTaskResult; +import com.fr.plugin.manage.control.ProgressCallback; import javax.swing.*; @@ -19,10 +19,10 @@ import javax.swing.*; */ public class InstallOnlineExecutor implements Executor { - private String pluginID; + private String pluginInfo; - public InstallOnlineExecutor(String pluginID) { - this.pluginID = pluginID; + public InstallOnlineExecutor(String pluginInfo) { + this.pluginInfo = pluginInfo; } @Override @@ -36,69 +36,89 @@ public class InstallOnlineExecutor implements Executor { new Command() { @Override public String getExecuteMessage() { - return "正在下载插件:" + pluginID; + return "正在下载插件:" + pluginInfo.split("_")[0]; } @Override public void run(final Process process) { //下载插件 - if(StringUtils.isBlank(DesignerEnvManager.getEnvManager().getBBSName())){ + if (!BBSPluginLogin.getInstance().hasLogin()) { LoginCheckContext.fireLoginCheckListener(); } - if(StringUtils.isNotBlank(DesignerEnvManager.getEnvManager().getBBSName())) { - String username = DesignerEnvManager.getEnvManager().getBBSName(); - String password = DesignerEnvManager.getEnvManager().getBBSPassword(); - try { - PluginHelper.downloadPluginFile(pluginID, username, password, new Process() { - @Override - public void process(Double integer) { - process.process(Math.round(integer * 100) + "%"); - } - }); - } catch (Exception e) { - FRContext.getLogger().error(e.getMessage(), e); - } - } - } - }, - new Command() { - @Override - public String getExecuteMessage() { - return "正在安装插件:" + pluginID; - } + PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); + if (BBSPluginLogin.getInstance().hasLogin()) { + PluginManager.getController().download(pluginMarker, new ProgressCallback() { + @Override + public void updateProgress(String description, double aProgress) { + process.process(Math.round(aProgress * 100) + "%"); + } - @Override - public void run(Process process) { - try { - PluginHelper.installPluginFromDisk(PluginHelper.getDownloadTempFile(), new After() { @Override - public void done() { - int rv = JOptionPane.showOptionDialog( - null, - Inter.getLocText("FR-Designer-Plugin_Install_Successful"), - Inter.getLocText("FR-Designer-Plugin_Warning"), - JOptionPane.YES_NO_OPTION, - JOptionPane.INFORMATION_MESSAGE, - null, - new String[]{Inter.getLocText("FR-Designer-Basic_Restart_Designer"), Inter.getLocText("FR-Designer-Basic_Restart_Designer_Later")}, - null - ); - if (rv == JOptionPane.OK_OPTION) { - RestartHelper.restart(); + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + installPlugin(pluginMarker); + } else { + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } } }); - } catch (PluginVerifyException e) { - JOptionPane.showMessageDialog(null, e.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } catch (PluginDependenceException e){ - JOptionPane.showMessageDialog(null, e.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (Exception e) { - e.printStackTrace(); + } } } }; } + + public void installPlugin(PluginMarker pluginMarker) { + PluginManager.getController().install(pluginMarker, new ProgressCallback() { + @Override + public void updateProgress(String description, double progress) { + + } + + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + FRLogger.getLogger().info("插件安装成功"); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { + int rv = JOptionPane.showOptionDialog( + null, + Inter.getLocText("安装依赖"), + Inter.getLocText("FR-Designer-Plugin_Warning"), + JOptionPane.YES_NO_CANCEL_OPTION, + JOptionPane.INFORMATION_MESSAGE, + null, + null, + null + ); + if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) { + return; + } + installPluginWithDependence(pluginMarker); + } else { + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } + }); + } + + public void installPluginWithDependence(PluginMarker pluginMarker) { + PluginManager.getController().install(pluginMarker, new ProgressCallback() { + @Override + public void updateProgress(String description, double progress) { + } + + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + FRLogger.getLogger().info("插件安装成功"); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + } else { + FRLogger.getLogger().info("插件安装失败"); + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } + }); + } } diff --git a/designer_base/src/com/fr/design/extra/exe/ModifyStatusExecutor.java b/designer_base/src/com/fr/design/extra/exe/ModifyStatusExecutor.java index c544858dd..0f1c6405d 100644 --- a/designer_base/src/com/fr/design/extra/exe/ModifyStatusExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/ModifyStatusExecutor.java @@ -1,24 +1,28 @@ package com.fr.design.extra.exe; -import com.fr.base.FRContext; -import com.fr.design.extra.PluginWebBridge; +import com.fr.design.extra.PluginUtils; import com.fr.design.extra.Process; import com.fr.general.Inter; -import com.fr.plugin.Plugin; -import com.fr.plugin.PluginLoader; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.manage.control.PluginTaskCallback; +import com.fr.plugin.manage.control.PluginTaskResult; import com.fr.stable.StringUtils; +import javax.swing.*; + /** * Created by richie on 16/3/19. */ public class ModifyStatusExecutor implements Executor { - private String pluginID; + private String pluginInfo; private boolean active; - private Plugin plugin; + private PluginContext plugin; - public ModifyStatusExecutor(String pluginID) { - this.pluginID = pluginID; + public ModifyStatusExecutor(String pluginInfo) { + this.pluginInfo = pluginInfo; } @Override @@ -37,14 +41,31 @@ public class ModifyStatusExecutor implements Executor { @Override public void run(Process process) { - plugin = PluginLoader.getLoader().getPluginById(pluginID); + PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); + plugin = PluginManager.getContext(pluginMarker); active = !plugin.isActive(); - plugin.setActive(active); - try { - FRContext.getCurrentEnv().writePlugin(plugin); - PluginWebBridge.getHelper().showRestartMessage(plugin.isActive() ? Inter.getLocText("FR-Designer-Plugin_Has_Been_Actived") : Inter.getLocText("FR-Designer-Plugin_Has_Been_Disabled")); - } catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + if (active) { + PluginManager.getController().forbid(pluginMarker, new PluginTaskCallback() { + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Has_Been_Disabled")); + } else { + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } + }); + } else { + PluginManager.getController().enable(pluginMarker, new PluginTaskCallback() { + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Has_Been_Actived")); + } else { + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } + }); } } } diff --git a/designer_base/src/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java b/designer_base/src/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java index c510a67cc..9bcfce699 100644 --- a/designer_base/src/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java @@ -1,10 +1,8 @@ package com.fr.design.extra.exe; -import com.fr.design.extra.PluginsReaderFromStore; +import com.fr.design.extra.PluginReaderForDesigner; import com.fr.design.extra.Process; import com.fr.general.FRLogger; - -import com.fr.plugin.Plugin; import com.fr.stable.StringUtils; import org.json.JSONArray; import org.json.JSONObject; @@ -13,7 +11,7 @@ import org.json.JSONObject; * Created by vito on 16/4/19. */ public class ReadUpdateOnlineExecutor implements Executor { - private Plugin[] plugins; + private String[] plugins; private String result; @Override @@ -33,11 +31,11 @@ public class ReadUpdateOnlineExecutor implements Executor { @Override public void run(Process process) { try { - plugins = PluginsReaderFromStore.readPluginsForUpdate(); + plugins = PluginReaderForDesigner.readPluginsForUpdate(); JSONArray jsonArray = new JSONArray(); - for (Plugin plugin : plugins) { + for (String plugin : plugins) { JSONObject jsonObject = new JSONObject(); - jsonObject.put("pluginid", plugin.getId()); + jsonObject.put("pluginid", plugin); jsonArray.put(jsonObject); } result = jsonArray.toString(); diff --git a/designer_base/src/com/fr/design/extra/exe/UninstallExecutor.java b/designer_base/src/com/fr/design/extra/exe/UninstallExecutor.java index d8fc7d9ec..9eaa49ac9 100644 --- a/designer_base/src/com/fr/design/extra/exe/UninstallExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/UninstallExecutor.java @@ -1,12 +1,13 @@ package com.fr.design.extra.exe; -import com.fr.base.FRContext; -import com.fr.design.RestartHelper; -import com.fr.design.extra.PluginHelper; +import com.fr.design.extra.PluginUtils; import com.fr.design.extra.Process; +import com.fr.general.FRLogger; import com.fr.general.Inter; -import com.fr.plugin.Plugin; -import com.fr.plugin.PluginLoader; +import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.manage.control.PluginTaskCallback; +import com.fr.plugin.manage.control.PluginTaskResult; import javax.swing.*; @@ -15,11 +16,13 @@ import javax.swing.*; */ public class UninstallExecutor implements Executor { - private String[] pluginIDs; + private String pluginInfo; + private boolean isForce; private String result = "undo"; - public UninstallExecutor(String[] pluginIDs) { - this.pluginIDs = pluginIDs; + public UninstallExecutor(String pluginInfo, boolean isForce) { + this.pluginInfo = pluginInfo; + this.isForce = isForce; } @Override @@ -38,35 +41,20 @@ public class UninstallExecutor implements Executor { @Override public void run(Process process) { - int rv = JOptionPane.showOptionDialog( - null, - Inter.getLocText("FR-Designer-Plugin_Will_Be_Delete"), - Inter.getLocText("FR-Designer-Plugin_Warning"), - JOptionPane.YES_NO_CANCEL_OPTION, - JOptionPane.INFORMATION_MESSAGE, - null, - new String[]{Inter.getLocText("FR-Designer-Basic_Restart_Designer"), - Inter.getLocText("FR-Designer-Basic_Restart_Designer_Later"), - Inter.getLocText("FR-Designer-Basic_Cancel") - }, - null - ); - if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) { - return; - } - for (String pluginID : pluginIDs) { - try { - Plugin plugin = PluginLoader.getLoader().getPluginById(pluginID); - String[] filesToBeDelete = PluginHelper.uninstallPlugin(FRContext.getCurrentEnv(), plugin); - RestartHelper.saveFilesWhichToDelete(filesToBeDelete); - } catch (Exception e) { - JOptionPane.showMessageDialog(null, e.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } - } - result = "done"; - if (rv == JOptionPane.OK_OPTION) { - RestartHelper.restart(); - } + PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); + PluginManager.getController().uninstall(pluginMarker, isForce, new PluginTaskCallback() { + @Override + public void done(PluginTaskResult pluginTaskResult) { + if (pluginTaskResult.isSuccess()) { + result = "done"; + FRLogger.getLogger().info("删除成功"); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + } else { + FRLogger.getLogger().info("删除失败"); + JOptionPane.showMessageDialog(null, pluginTaskResult.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } + }); } } }; diff --git a/designer_base/src/com/fr/design/extra/exe/UpdateFromDiskExecutor.java b/designer_base/src/com/fr/design/extra/exe/UpdateFromDiskExecutor.java index 5c8c6e361..c415127f7 100644 --- a/designer_base/src/com/fr/design/extra/exe/UpdateFromDiskExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/UpdateFromDiskExecutor.java @@ -1,8 +1,14 @@ package com.fr.design.extra.exe; -import com.fr.design.extra.PluginWebBridge; import com.fr.design.extra.Process; +import com.fr.general.FRLogger; +import com.fr.general.Inter; +import com.fr.plugin.error.PluginErrorCode; +import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.manage.control.PluginTaskResult; +import com.fr.plugin.manage.control.ProgressCallback; +import javax.swing.*; import java.io.File; /** @@ -32,9 +38,45 @@ public class UpdateFromDiskExecutor implements Executor { @Override public void run(Process process) { - PluginWebBridge.getHelper().updateFileFromDisk(new File(filePath)); + PluginManager.getController().update(new File(filePath), new ProgressCallback() { + @Override + public void updateProgress(String description, double progress) { + + } + + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + FRLogger.getLogger().info("更新成功"); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { + updatePluginWithDependence(); + } else { + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } + }); } } }; } + + public void updatePluginWithDependence() { + PluginManager.getController().update(new File(filePath), new ProgressCallback() { + @Override + public void updateProgress(String description, double progress) { + + } + + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + FRLogger.getLogger().info("更新成功"); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + } else { + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } + }); + } } diff --git a/designer_base/src/com/fr/design/extra/exe/UpdateOnlineExecutor.java b/designer_base/src/com/fr/design/extra/exe/UpdateOnlineExecutor.java index fa295cd36..7cb467470 100644 --- a/designer_base/src/com/fr/design/extra/exe/UpdateOnlineExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/UpdateOnlineExecutor.java @@ -2,30 +2,32 @@ package com.fr.design.extra.exe; import com.fr.base.FRContext; import com.fr.design.DesignerEnvManager; -import com.fr.design.RestartHelper; -import com.fr.design.extra.After; -import com.fr.design.extra.LoginCheckContext; -import com.fr.design.extra.PluginHelper; +import com.fr.design.extra.*; import com.fr.design.extra.Process; +import com.fr.general.FRLogger; import com.fr.general.Inter; -import com.fr.plugin.Plugin; -import com.fr.plugin.PluginLoader; -import com.fr.plugin.PluginVerifyException; +import com.fr.json.JSONObject; +import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.error.PluginErrorCode; +import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.manage.control.PluginTaskResult; +import com.fr.plugin.manage.control.ProgressCallback; import com.fr.stable.StringUtils; import javax.swing.*; -import java.io.File; +import java.util.ArrayList; +import java.util.List; /** * Created by richie on 16/3/19. */ public class UpdateOnlineExecutor implements Executor { - private String[] pluginIDs; + private String[] pluginInfos; private static final int PERCENT_100 = 100; - public UpdateOnlineExecutor(String[] pluginIDs) { - this.pluginIDs = pluginIDs; + public UpdateOnlineExecutor(String[] pluginInfos) { + this.pluginInfos = pluginInfos; } @Override @@ -48,69 +50,72 @@ public class UpdateOnlineExecutor implements Executor { LoginCheckContext.fireLoginCheckListener(); } if (StringUtils.isNotBlank(DesignerEnvManager.getEnvManager().getBBSName())) { - try { - for (int i = 0; i < pluginIDs.length; i++) { - try { - Plugin plugin = PluginLoader.getLoader().getPluginById(pluginIDs[i]); - String id = null; - if (plugin != null) { - id = plugin.getId(); - } - String username = DesignerEnvManager.getEnvManager().getBBSName(); - String password = DesignerEnvManager.getEnvManager().getBBSPassword(); - PluginHelper.downloadPluginFile(id, username, password, new Process() { - @Override - public void process(Double integer) { - } - }); - updateFileFromDisk(PluginHelper.getDownloadTempFile()); - process.process(PERCENT_100 / pluginIDs.length * (i + 1) + "%"); - } catch (PluginVerifyException e) { - throw e; - } catch (Exception e) { - FRContext.getLogger().error(e.getMessage(), e); - } - } - int rv = JOptionPane.showOptionDialog( - null, - Inter.getLocText("FR-Designer-Plugin_Update_Successful"), - Inter.getLocText("FR-Designer-Plugin_Warning"), - JOptionPane.YES_NO_OPTION, - JOptionPane.INFORMATION_MESSAGE, - null, - new String[]{Inter.getLocText("FR-Designer-Basic_Restart_Designer"), - Inter.getLocText("FR-Designer-Basic_Restart_Designer_Later") - }, - null - ); - if (rv == JOptionPane.OK_OPTION) { - RestartHelper.restart(); - } - } catch (PluginVerifyException e) { - JOptionPane.showMessageDialog(null, e.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + List pluginMarkerList = new ArrayList(); + for (int i = 0; i < pluginInfos.length; i++) { + pluginMarkerList.add(PluginUtils.createPluginMarker(pluginInfos[i])); } - } + updatePlugins(pluginMarkerList, process); } } } }; } - private void updateFileFromDisk(File fileOnDisk) throws Exception { - Plugin plugin = PluginHelper.readPlugin(fileOnDisk); - if (plugin == null) { - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Illegal_Plugin_Zip"), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - return; - } - Plugin oldPlugin = PluginLoader.getLoader().getPluginById(plugin.getId()); - if (oldPlugin != null) { - String[] files = PluginHelper.uninstallPlugin(FRContext.getCurrentEnv(), oldPlugin); - PluginHelper.installPluginFromUnzippedTempDir(FRContext.getCurrentEnv(), plugin, new After() { - @Override - public void done() { + public void updatePluginWithDependence(PluginMarker pluginMarker, PluginMarker toMarker) { + PluginManager.getController().update(pluginMarker, toMarker, new ProgressCallback() { + @Override + public void updateProgress(String description, double progress) { + + } + + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + FRLogger.getLogger().info("更新成功"); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + } else { + FRLogger.getLogger().info("更新失败"); + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } - }); - } else { - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Cannot_Update_Not_Install"), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + }); + } + + public void updatePlugins(List pluginMarkerList, Process process) { + for (int i = 0; i < pluginMarkerList.size(); i++) { + try { + int a = i; + //todo check下此插件的最新版本 + String latestPluginInfo = PluginUtils.getLatestPluginInfo(pluginMarkerList.get(i).getPluginID()); + if (StringUtils.isEmpty(latestPluginInfo) || PluginConstants.CONNECTION_404.equals(latestPluginInfo)) { + JOptionPane.showMessageDialog(null, "插件商城连接失败", Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + return; + } + JSONObject resultArr = new JSONObject(latestPluginInfo); + String latestPluginVersion = (String) resultArr.get("version"); + PluginManager.getController().update(pluginMarkerList.get(i), PluginMarker.create(pluginMarkerList.get(i).getPluginID(), latestPluginVersion), new ProgressCallback() { + @Override + public void updateProgress(String description, double progress) { + process.process(PERCENT_100 / pluginMarkerList.size() * (a + 1) + "%"); + + } + + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + FRLogger.getLogger().info("更新成功"); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { + updatePluginWithDependence(pluginMarkerList.get(a), PluginMarker.create(pluginMarkerList.get(a).getPluginID(), latestPluginVersion)); + } else { + FRLogger.getLogger().info("更新失败"); + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } + }); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } } } + } From 6b3bdcaa9d56ff2863bceba973924f3e6d0b9c83 Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 26 May 2017 17:03:25 +0800 Subject: [PATCH 17/54] =?UTF-8?q?REPORT-2354=20=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E6=93=8D=E4=BD=9C=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/extra/PluginConstants.java | 15 +++ .../design/extra/PluginReaderForDesigner.java | 60 ++++++++++ .../src/com/fr/design/extra/PluginUtils.java | 107 ++++++++++++++++++ 3 files changed, 182 insertions(+) create mode 100644 designer_base/src/com/fr/design/extra/PluginConstants.java create mode 100644 designer_base/src/com/fr/design/extra/PluginReaderForDesigner.java create mode 100644 designer_base/src/com/fr/design/extra/PluginUtils.java diff --git a/designer_base/src/com/fr/design/extra/PluginConstants.java b/designer_base/src/com/fr/design/extra/PluginConstants.java new file mode 100644 index 000000000..ad560b458 --- /dev/null +++ b/designer_base/src/com/fr/design/extra/PluginConstants.java @@ -0,0 +1,15 @@ +package com.fr.design.extra; + +/** + * Created by ibm on 2017/5/25. + */ +public class PluginConstants { + public static final int BYTES_NUM = 1024; + private static final String TEMP_PATH = System.getProperty("user.dir") + "/tmp"; + public static final String DOWNLOAD_PATH = System.getProperty("user.dir") + "/download"; + //插件依赖的下载位置 + public static final String DEPENDENCE_DOWNLOAD_PATH = System.getProperty("user.dir") + "/download/dependence"; + public static final String TEMP_FILE = "temp.zip"; + public static final String CONNECTION_404 = "404"; + +} diff --git a/designer_base/src/com/fr/design/extra/PluginReaderForDesigner.java b/designer_base/src/com/fr/design/extra/PluginReaderForDesigner.java new file mode 100644 index 000000000..5fbb410fd --- /dev/null +++ b/designer_base/src/com/fr/design/extra/PluginReaderForDesigner.java @@ -0,0 +1,60 @@ +package com.fr.design.extra; + +import com.fr.general.GeneralUtils; +import com.fr.general.Inter; +import com.fr.general.SiteCenter; +import com.fr.general.http.HttpClient; +import com.fr.json.JSONArray; +import com.fr.json.JSONException; +import com.fr.json.JSONObject; +import com.fr.plugin.manage.PluginManager; +import com.fr.stable.EncodeConstants; +import com.fr.stable.StringUtils; + +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + +/** + * Created by ibm on 2017/5/25. + */ +public class PluginReaderForDesigner { + private static Set pluginsToUpdate = new HashSet(); + + /** + * 从插件商店服务器读取插件信息,以JSON形式返回 + * + * @return 插件信息 + */ + public static String[] readPluginsForUpdate() throws Exception { + String resText = null; + String url = SiteCenter.getInstance().acquireUrlByKind("plugin.update"); + if (StringUtils.isNotEmpty(url)) { + HashMap para = new HashMap(); + para.put("plugins", PluginUtils.transPluginsToString(PluginManager.getContexts())); + //只有当前设计器的jar高于插件新版本需要的jarTime时, 才提示更新该插件. + para.put("jarTime", GeneralUtils.readBuildNO()); + HttpClient httpClient = new HttpClient(url, para); + resText = httpClient.getResponseText(); + String charSet = EncodeConstants.ENCODING_UTF_8; + resText = URLDecoder.decode(URLDecoder.decode(resText, charSet), charSet); + } + if (StringUtils.isNotEmpty(resText)) { + try { + pluginsToUpdate.clear(); + JSONArray jsonArray = new JSONArray(resText); + for (int i = 0, size = jsonArray.length(); i < size; i++) { + JSONObject jo = jsonArray.optJSONObject(i); + String id = jo.optString("id"); + if(StringUtils.isNotEmpty(id)){ + pluginsToUpdate.add(jo.optString("id", "")); + } + } + } catch (JSONException e) { + throw new Exception(Inter.getLocText("FS-Web-Plugin_Read_Plugin_List_Error")); + } + } + return pluginsToUpdate.toArray(new String[pluginsToUpdate.size()]); + } +} diff --git a/designer_base/src/com/fr/design/extra/PluginUtils.java b/designer_base/src/com/fr/design/extra/PluginUtils.java new file mode 100644 index 000000000..31a1ff203 --- /dev/null +++ b/designer_base/src/com/fr/design/extra/PluginUtils.java @@ -0,0 +1,107 @@ +package com.fr.design.extra; + +import com.fr.general.FRLogger; +import com.fr.general.Inter; +import com.fr.general.SiteCenter; +import com.fr.general.http.HttpClient; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.context.PluginMarker; + +import com.fr.stable.EncodeConstants; +import com.fr.stable.StableUtils; +import com.fr.stable.StringUtils; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.List; + +/** + * Created by ibm on 2017/5/25. + */ +public class PluginUtils { + + + public static PluginMarker createPluginMarker(String pluginInfo) { + //todo 判空 + String[] plugin = pluginInfo.split("_"); + PluginMarker pluginMarker = PluginMarker.create(plugin[0], plugin[1]); + return pluginMarker; + } + + public static String getLatestPluginInfo(String pluginID){ + String result = ""; + String plistUrl = SiteCenter.getInstance().acquireUrlByKind("plugin.searchAPI"); + if (StringUtils.isNotEmpty(plistUrl)) { + StringBuilder url = new StringBuilder(plistUrl); + if (StringUtils.isNotBlank(pluginID)) { + url.append("?keyword=").append(pluginID); + } + try { + HttpClient httpClient = new HttpClient(url.toString()); + result = httpClient.getResponseText(); + } catch (Exception e) { + FRLogger.getLogger().error(e.getMessage()); + } + } else { + result = PluginConstants.CONNECTION_404; + } + return result; + } + + public static String transPluginsToString(List plugins) throws Exception { + JSONArray jsonArray = new JSONArray(); + for (PluginContext plugin : plugins) { + JSONObject jo = new JSONObject(); + jo.put("id", plugin.getID()); + jo.put("version", plugin.getVersion()); + jsonArray.put(jo); + } + return jsonArray.toString(); + } + + public static void downloadShopScripts(String id, String username, String password, Process p) throws Exception{ + HttpClient httpClient = new HttpClient(getDownloadPath(id, username, password)); + if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { + int totalSize = httpClient.getContentLength(); + InputStream reader = httpClient.getResponseStream(); + String temp = StableUtils.pathJoin(PluginConstants.DOWNLOAD_PATH, PluginConstants.TEMP_FILE); + StableUtils.makesureFileExist(new File(temp)); + FileOutputStream writer = new FileOutputStream(temp); + byte[] buffer = new byte[PluginConstants.BYTES_NUM]; + int bytesRead = 0; + int totalBytesRead = 0; + + while ((bytesRead = reader.read(buffer)) > 0) { + writer.write(buffer, 0, bytesRead); + buffer = new byte[PluginConstants.BYTES_NUM]; + totalBytesRead += bytesRead; + p.process(totalBytesRead / (double) totalSize); + } + reader.close(); + writer.flush(); + writer.close(); + } else { + throw new com.fr.plugin.PluginVerifyException(Inter.getLocText("FR-Designer-Plugin_Connect_Server_Error")); + } + } + + private static String getDownloadPath(String id, String username, String password) throws Exception { + HashMap map = new HashMap(); + map.put("id", id); + map.put("username", username); + map.put("password", password); + HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("plugin.download"), map); + String resText = httpClient.getResponseText(); + String charSet = EncodeConstants.ENCODING_UTF_8; + resText = URLDecoder.decode(URLDecoder.decode(resText, charSet), charSet); + + return resText; + } + +} From 363138e5fc2283c6a1e3f4c678e30cedc4a089f5 Mon Sep 17 00:00:00 2001 From: kerry Date: Sat, 27 May 2017 13:46:21 +0800 Subject: [PATCH 18/54] =?UTF-8?q?report-2354=20=E6=95=B4=E5=90=88=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E6=8F=92=E4=BB=B6=E6=93=8D=E4=BD=9C=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/extra/PluginOperateUtils.java | 111 ++++++++++++++++++ .../com/fr/design/extra/PluginWebBridge.java | 25 ++-- .../callback/AbstractPluginTaskCallback.java | 21 ++++ .../extra/exe/callback/DownloadCallback.java | 34 ++++++ .../exe/callback/InstallFromDiskCallback.java | 52 ++++++++ .../exe/callback/InstallOnlineCallback.java | 53 +++++++++ .../design/extra/exe/callback/JSCallback.java | 29 +++++ .../exe/callback/ModifyStatusCallback.java | 28 +++++ .../exe/callback/UnistallPluginCallback.java | 26 ++++ .../exe/callback/UpdateFromDiskCallback.java | 53 +++++++++ .../exe/callback/UpdateOnlineCallback.java | 55 +++++++++ .../extra/exe/extratask/ExtraPluginTask.java | 10 ++ .../exe/extratask/InstallPluginTask.java | 25 ++++ .../extra/exe/extratask/UpdatePluginTask.java | 28 +++++ 14 files changed, 538 insertions(+), 12 deletions(-) create mode 100644 designer_base/src/com/fr/design/extra/PluginOperateUtils.java create mode 100644 designer_base/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java create mode 100644 designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java create mode 100644 designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java create mode 100644 designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java create mode 100644 designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java create mode 100644 designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java create mode 100644 designer_base/src/com/fr/design/extra/exe/callback/UnistallPluginCallback.java create mode 100644 designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java create mode 100644 designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java create mode 100644 designer_base/src/com/fr/design/extra/exe/extratask/ExtraPluginTask.java create mode 100644 designer_base/src/com/fr/design/extra/exe/extratask/InstallPluginTask.java create mode 100644 designer_base/src/com/fr/design/extra/exe/extratask/UpdatePluginTask.java diff --git a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java new file mode 100644 index 000000000..beb84b9c6 --- /dev/null +++ b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java @@ -0,0 +1,111 @@ +package com.fr.design.extra; + +import com.fr.base.FRContext; +import com.fr.design.extra.exe.callback.*; +import com.fr.design.extra.exe.extratask.InstallPluginTask; +import com.fr.design.extra.exe.extratask.UpdatePluginTask; +import com.fr.general.FRLogger; +import com.fr.general.Inter; +import com.fr.json.JSONObject; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.manage.bbs.BBSPluginLogin; +import com.fr.plugin.manage.control.PluginTaskCallback; +import com.fr.plugin.manage.control.PluginTaskResult; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StringUtils; +import javafx.scene.web.WebEngine; +import netscape.javascript.JSObject; +import sun.plugin2.main.server.Plugin; + +import javax.swing.*; +import java.io.File; +import java.util.ArrayList; +import java.util.List; + + +/** + * Created by ibm on 2017/5/26. + */ +public class PluginOperateUtils { + + public static void installPluginOnline(final String pluginInfo, JSCallback jsCallback) { + //下载插件 + if (!BBSPluginLogin.getInstance().hasLogin()) { + LoginCheckContext.fireLoginCheckListener(); + } + PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); + if (BBSPluginLogin.getInstance().hasLogin()) { + PluginManager.getController().download(pluginMarker, new DownloadCallback(new InstallPluginTask(pluginMarker, jsCallback), jsCallback)); + } + } + + public static void installPluginFromDisk(final String filePath, JSCallback jsCallback) { + PluginManager.getController().install(new File(filePath), new InstallFromDiskCallback(new File(filePath), jsCallback)); + } + + public static void updatePluginOnline(JSObject pluginIDs, JSCallback jsCallback) { + String[] pluginInfos = jsObjectToStringArray(pluginIDs); + if (!(BBSPluginLogin.getInstance().hasLogin())) { + LoginCheckContext.fireLoginCheckListener(); + } + if (BBSPluginLogin.getInstance().hasLogin()) { + List pluginMarkerList = new ArrayList(); + for (int i = 0; i < pluginInfos.length; i++) { + pluginMarkerList.add(PluginUtils.createPluginMarker(pluginInfos[i])); + } + for (int i = 0; i < pluginMarkerList.size(); i++) { + try { + //todo check下此插件的最新版本 + String latestPluginInfo = PluginUtils.getLatestPluginInfo(pluginMarkerList.get(i).getPluginID()); + if (StringUtils.isEmpty(latestPluginInfo) || PluginConstants.CONNECTION_404.equals(latestPluginInfo)) { + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Connect_Failed"), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + return; + } + JSONObject resultArr = new JSONObject(latestPluginInfo); + String latestPluginVersion = (String) resultArr.get("version"); + PluginMarker pluginMarker = pluginMarkerList.get(i); + PluginMarker toPluginMarker = PluginMarker.create(pluginMarkerList.get(i).getPluginID(), latestPluginVersion); + PluginManager.getController().download(pluginMarkerList.get(i), new DownloadCallback(new UpdatePluginTask(pluginMarker, toPluginMarker, jsCallback), jsCallback)); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } + } + } + } + + public static void updatePluginFromDisk(final String filePath, JSCallback jsCallback) { + PluginManager.getController().update(new File(filePath), new UpdateFromDiskCallback(new File(filePath), jsCallback)); + } + + public static void setPluginActive(String pluginInfo, JSCallback jsCallback) { + PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); + PluginContext plugin = PluginManager.getContext(pluginMarker); + boolean active = !plugin.isActive(); + PluginTaskCallback modifyStatusCallback = new ModifyStatusCallback(active); + if (active) { + PluginManager.getController().forbid(pluginMarker, modifyStatusCallback); + } else { + PluginManager.getController().enable(pluginMarker, modifyStatusCallback); + } + } + + public static void uninstallPlugin(final String pluginInfo, final boolean isForce, JSCallback jsCallback) { + PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); + PluginManager.getController().uninstall(pluginMarker, isForce, new UnistallPluginCallback()); + } + + private static String[] jsObjectToStringArray(JSObject obj) { + if (obj == null) { + return ArrayUtils.EMPTY_STRING_ARRAY; + } + int len = (int) obj.getMember("length"); + List list = new ArrayList<>(); + for (int i = 0; i < len; i++) { + list.add(obj.getSlot(i).toString()); + } + return list.toArray(new String[len]); + } + +} diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer_base/src/com/fr/design/extra/PluginWebBridge.java index 8df0f7494..808eabfe1 100644 --- a/designer_base/src/com/fr/design/extra/PluginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/PluginWebBridge.java @@ -5,6 +5,7 @@ import com.fr.design.DesignerEnvManager; import com.fr.design.RestartHelper; import com.fr.design.dialog.UIDialog; import com.fr.design.extra.exe.*; +import com.fr.design.extra.exe.callback.JSCallback; import com.fr.design.gui.ilable.UILabel; import com.fr.general.FRLogger; import com.fr.general.Inter; @@ -147,8 +148,8 @@ public class PluginWebBridge { * @param callback 回调函数 */ public void installPluginOnline(final String pluginInfo, final JSObject callback) { - Task task = new PluginTask<>(webEngine, callback, new InstallOnlineExecutor(pluginInfo)); - new Thread(task).start(); + JSCallback jsCallback = new JSCallback(webEngine, callback); + PluginOperateUtils.installPluginOnline(pluginInfo,jsCallback); } @@ -159,8 +160,8 @@ public class PluginWebBridge { * @param filePath 插件包的路径 */ public void installPluginFromDisk(final String filePath, final JSObject callback) { - Task task = new PluginTask<>(webEngine, callback, new InstallFromDiskExecutor(filePath)); - new Thread(task).start(); + JSCallback jsCallback = new JSCallback(webEngine, callback); + PluginOperateUtils.installPluginFromDisk(filePath,jsCallback); } /** @@ -169,8 +170,8 @@ public class PluginWebBridge { * @param pluginInfo 插件信息 */ public void uninstallPlugin(final String pluginInfo, final boolean isForce, final JSObject callback) { - Task task = new PluginTask<>(webEngine, callback, new UninstallExecutor(pluginInfo, isForce)); - new Thread(task).start(); + JSCallback jsCallback = new JSCallback(webEngine, callback); + PluginOperateUtils.uninstallPlugin(pluginInfo, isForce, jsCallback); } @@ -180,8 +181,8 @@ public class PluginWebBridge { * @param pluginIDs 插件集合 */ public void updatePluginOnline(JSObject pluginIDs, final JSObject callback) { - Task task = new PluginTask<>(webEngine, callback, new UpdateOnlineExecutor(jsObjectToStringArray(pluginIDs))); - new Thread(task).start(); + JSCallback jsCallback = new JSCallback(webEngine, callback); + PluginOperateUtils.updatePluginOnline(pluginIDs, jsCallback); } /** @@ -190,8 +191,8 @@ public class PluginWebBridge { * @param filePath 插件包的路径 */ public void updatePluginFromDisk(String filePath, final JSObject callback) { - Task task = new PluginTask<>(webEngine, callback, new UpdateFromDiskExecutor(filePath)); - new Thread(task).start(); + JSCallback jsCallback = new JSCallback(webEngine, callback); + PluginOperateUtils.updatePluginFromDisk(filePath, jsCallback); } /** @@ -200,8 +201,8 @@ public class PluginWebBridge { * @param pluginID 插件ID */ public void setPluginActive(String pluginID, final JSObject callback) { - Task task = new PluginTask<>(webEngine, callback, new ModifyStatusExecutor(pluginID)); - new Thread(task).start(); + JSCallback jsCallback = new JSCallback(webEngine, callback); + PluginOperateUtils.setPluginActive(pluginID, jsCallback); } /** diff --git a/designer_base/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java new file mode 100644 index 000000000..b0d4813cf --- /dev/null +++ b/designer_base/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java @@ -0,0 +1,21 @@ +package com.fr.design.extra.exe.callback; + +import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.manage.control.ProgressCallback; + +import java.io.File; + +/** + * Created by ibm on 2017/5/26. + */ +public abstract class AbstractPluginTaskCallback implements ProgressCallback{ + + protected PluginMarker pluginMarker; + protected JSCallback jsCallback; + + @Override + public void updateProgress(String description, double aProgress) { + } + + +} diff --git a/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java new file mode 100644 index 000000000..405a41528 --- /dev/null +++ b/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java @@ -0,0 +1,34 @@ +package com.fr.design.extra.exe.callback; + +import com.fr.design.extra.exe.extratask.ExtraPluginTask; +import com.fr.general.Inter; +import com.fr.plugin.manage.control.PluginTaskResult; +import com.fr.plugin.manage.control.ProgressCallback; + +import javax.swing.*; + +/** + * Created by ibm on 2017/5/26. + */ +public class DownloadCallback extends AbstractPluginTaskCallback { + private ExtraPluginTask extraPluginTask; + + public DownloadCallback(ExtraPluginTask extraPluginTask, JSCallback jsCallback) { + this.extraPluginTask = extraPluginTask; + this.jsCallback = jsCallback; + } + + @Override + public void updateProgress(String description, double aProgress) { + jsCallback.execute(String.valueOf(aProgress)); + } + + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + extraPluginTask.doExtraPluginTask(); + } else { + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } +} diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java new file mode 100644 index 000000000..4c64d1426 --- /dev/null +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java @@ -0,0 +1,52 @@ +package com.fr.design.extra.exe.callback; + +import com.fr.general.FRLogger; +import com.fr.general.Inter; +import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.manage.control.PluginTaskResult; + +import javax.swing.*; +import java.io.File; + +/** + * Created by ibm on 2017/5/26. + */ +public class InstallFromDiskCallback extends AbstractPluginTaskCallback{ + private File zipFile; + public InstallFromDiskCallback(File zipFile, JSCallback jsCallback){ + this.zipFile = zipFile; + this.jsCallback = jsCallback; + } + + @Override + public void updateProgress(String description, double aProgress) { + jsCallback.execute(String.valueOf(aProgress)); + } + + + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + } else if (result.errorCode() == 30) { + int rv = JOptionPane.showOptionDialog( + null, + Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Success")), + Inter.getLocText("FR-Designer-Plugin_Install_Dependence"), + JOptionPane.YES_NO_CANCEL_OPTION, + JOptionPane.INFORMATION_MESSAGE, + null, + null, + null + ); + if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) { + return; + } + PluginManager.getController().install(zipFile, new InstallFromDiskCallback(zipFile, jsCallback)); +// jsCallback.execute("installDependence"); + } else { + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } +} diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java new file mode 100644 index 000000000..ef96acf72 --- /dev/null +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java @@ -0,0 +1,53 @@ +package com.fr.design.extra.exe.callback; + +import com.fr.general.FRLogger; +import com.fr.general.Inter; +import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.manage.control.PluginTaskResult; + +import javax.swing.*; + +/** + * Created by ibm on 2017/5/26. + */ +public class InstallOnlineCallback extends AbstractPluginTaskCallback { + + public InstallOnlineCallback(PluginMarker pluginMarker, JSCallback jsCallback){ + this.pluginMarker = pluginMarker; + this.jsCallback = jsCallback; + } + + @Override + public void updateProgress(String description, double aProgress) { + jsCallback.execute(String.valueOf(aProgress)); + } + + + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + } else if (result.errorCode() == 30) { + int rv = JOptionPane.showOptionDialog( + null, + Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Success")), + Inter.getLocText("FR-Designer-Plugin_Install_Dependence"), + JOptionPane.YES_NO_CANCEL_OPTION, + JOptionPane.INFORMATION_MESSAGE, + null, + null, + null + ); + if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) { + return; + } + //执行JS回调 + PluginManager.getController().install(pluginMarker, new InstallOnlineCallback(pluginMarker, jsCallback)); +// jsCallback.execute("installDependence"); + } else { + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } +} diff --git a/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java new file mode 100644 index 000000000..5ee99a69c --- /dev/null +++ b/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java @@ -0,0 +1,29 @@ +package com.fr.design.extra.exe.callback; + +import javafx.scene.web.WebEngine; +import netscape.javascript.JSObject; + +/** + * Created by ibm on 2017/5/27. + */ +public class JSCallback { + private WebEngine webEngine; + private JSObject callback; + + public JSCallback(final WebEngine webEngine, final JSObject callback) { + this.webEngine = webEngine; + this.callback = callback; + } + + public void execute(String newValue) { + String fun = "(" + callback + ")(\"" + newValue + "\")"; + try { + webEngine.executeScript(fun); + } catch (Exception e) { + webEngine.executeScript("alert(\"" + e.getMessage() + "\")"); + } + } + + +} + diff --git a/designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java new file mode 100644 index 000000000..2a22e0b90 --- /dev/null +++ b/designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java @@ -0,0 +1,28 @@ +package com.fr.design.extra.exe.callback; + +import com.fr.general.Inter; +import com.fr.plugin.manage.control.PluginTaskCallback; +import com.fr.plugin.manage.control.PluginTaskResult; + +import javax.swing.*; + +/** + * Created by ibm on 2017/5/27. + */ +public class ModifyStatusCallback implements PluginTaskCallback{ + private boolean isActive; + + public ModifyStatusCallback (boolean isActive){ + this.isActive = isActive; + } + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + String modifyMessage = isActive ? Inter.getLocText("FR-Designer-Plugin_Has_Been_Actived") : Inter.getLocText("FR-Designer-Plugin_Has_Been_Disabled"); + JOptionPane.showMessageDialog(null, modifyMessage); + } else { + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } + +} diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UnistallPluginCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UnistallPluginCallback.java new file mode 100644 index 000000000..66282df9d --- /dev/null +++ b/designer_base/src/com/fr/design/extra/exe/callback/UnistallPluginCallback.java @@ -0,0 +1,26 @@ +package com.fr.design.extra.exe.callback; + +import com.fr.general.FRLogger; +import com.fr.general.Inter; +import com.fr.plugin.manage.control.PluginTaskCallback; +import com.fr.plugin.manage.control.PluginTaskResult; +import sun.plugin2.main.server.Plugin; + +import javax.swing.*; + +/** + * Created by ibm on 2017/5/27. + */ +public class UnistallPluginCallback implements PluginTaskCallback { + + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Delete_Success")); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + } else { + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Delete_Failed")); + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } +} diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java new file mode 100644 index 000000000..e666c8e81 --- /dev/null +++ b/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java @@ -0,0 +1,53 @@ +package com.fr.design.extra.exe.callback; + +import com.fr.general.FRLogger; +import com.fr.general.Inter; +import com.fr.general.jsqlparser.expression.StringValue; +import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.manage.control.PluginTaskResult; + +import javax.swing.*; +import java.io.File; + +/** + * Created by ibm on 2017/5/27. + */ +public class UpdateFromDiskCallback extends AbstractPluginTaskCallback { + private File zipFile; + + public UpdateFromDiskCallback(File zipFile,JSCallback jsCallback) { + this.zipFile = zipFile; + this.jsCallback = jsCallback; + } + + @Override + public void updateProgress(String description, double aProgress) { + jsCallback.execute(String.valueOf(aProgress)); + } + + + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + } else if (result.errorCode() == 30) { + int rv = JOptionPane.showOptionDialog( + null, + Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Success")), + Inter.getLocText("FR-Designer-Plugin_Install_Dependence"), + JOptionPane.YES_NO_CANCEL_OPTION, + JOptionPane.INFORMATION_MESSAGE, + null, + null, + null + ); + if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) { + return; + } + PluginManager.getController().update(zipFile, new UpdateFromDiskCallback(zipFile, jsCallback)); + } else { + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } +} diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java new file mode 100644 index 000000000..7d709e935 --- /dev/null +++ b/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java @@ -0,0 +1,55 @@ +package com.fr.design.extra.exe.callback; + +import com.fr.general.FRLogger; +import com.fr.general.Inter; +import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.error.PluginErrorCode; +import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.manage.control.PluginTaskResult; + +import javax.swing.*; + +/** + * Created by ibm on 2017/5/26. + */ +public class UpdateOnlineCallback extends AbstractPluginTaskCallback { + public PluginMarker toPluginMarker; + + + public UpdateOnlineCallback(PluginMarker pluginMarker , PluginMarker toPluginMarker, JSCallback jsCallback) { + this.pluginMarker = pluginMarker; + this.toPluginMarker = toPluginMarker; + this.jsCallback = jsCallback; + } + + @Override + public void updateProgress(String description, double aProgress) { + jsCallback.execute(String.valueOf(aProgress)); + } + + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + FRLogger.getLogger().info("更新成功"); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { + int rv = JOptionPane.showOptionDialog( + null, + Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Success")), + Inter.getLocText("FR-Designer-Plugin_Install_Dependence"), + JOptionPane.YES_NO_CANCEL_OPTION, + JOptionPane.INFORMATION_MESSAGE, + null, + null, + null + ); + if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) { + return; + } + PluginManager.getController().update(pluginMarker, toPluginMarker, new UpdateOnlineCallback(pluginMarker, toPluginMarker, jsCallback)); + } else { + FRLogger.getLogger().info("更新失败"); + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } +} diff --git a/designer_base/src/com/fr/design/extra/exe/extratask/ExtraPluginTask.java b/designer_base/src/com/fr/design/extra/exe/extratask/ExtraPluginTask.java new file mode 100644 index 000000000..834d59e38 --- /dev/null +++ b/designer_base/src/com/fr/design/extra/exe/extratask/ExtraPluginTask.java @@ -0,0 +1,10 @@ +package com.fr.design.extra.exe.extratask; + + +/** + * Created by ibm on 2017/5/27. + */ +public interface ExtraPluginTask { + + void doExtraPluginTask(); +} diff --git a/designer_base/src/com/fr/design/extra/exe/extratask/InstallPluginTask.java b/designer_base/src/com/fr/design/extra/exe/extratask/InstallPluginTask.java new file mode 100644 index 000000000..4ae1fe381 --- /dev/null +++ b/designer_base/src/com/fr/design/extra/exe/extratask/InstallPluginTask.java @@ -0,0 +1,25 @@ +package com.fr.design.extra.exe.extratask; + + +import com.fr.design.extra.exe.callback.InstallOnlineCallback; +import com.fr.design.extra.exe.callback.JSCallback; +import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.manage.PluginManager; + +import javax.swing.*; + +/** + * Created by ibm on 2017/5/27. + */ +public class InstallPluginTask implements ExtraPluginTask{ + public PluginMarker pluginMarker; + public JSCallback jsCallback; + public InstallPluginTask(PluginMarker pluginMarker, JSCallback jsCallback){ + this.pluginMarker = pluginMarker; + this.jsCallback = jsCallback; + } + @Override + public void doExtraPluginTask() { + PluginManager.getController().install(pluginMarker, new InstallOnlineCallback(pluginMarker, jsCallback)); + } +} diff --git a/designer_base/src/com/fr/design/extra/exe/extratask/UpdatePluginTask.java b/designer_base/src/com/fr/design/extra/exe/extratask/UpdatePluginTask.java new file mode 100644 index 000000000..c79ea114a --- /dev/null +++ b/designer_base/src/com/fr/design/extra/exe/extratask/UpdatePluginTask.java @@ -0,0 +1,28 @@ +package com.fr.design.extra.exe.extratask; + +import com.fr.design.extra.exe.callback.JSCallback; +import com.fr.design.extra.exe.callback.UpdateOnlineCallback; +import com.fr.form.ui.WaterMark; +import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.manage.PluginManager; + +/** + * Created by ibm on 2017/5/27. + */ +public class UpdatePluginTask implements ExtraPluginTask { + + public PluginMarker pluginMarker; + public PluginMarker toPluginMarker; + public JSCallback jsCallback; + + public UpdatePluginTask(PluginMarker pluginMarker, PluginMarker toPluginMarker, JSCallback jsCallback){ + this.pluginMarker = pluginMarker; + this.toPluginMarker = toPluginMarker; + this.jsCallback = jsCallback; + } + + @Override + public void doExtraPluginTask() { + PluginManager.getController().update(pluginMarker, toPluginMarker, new UpdateOnlineCallback(pluginMarker, toPluginMarker, jsCallback)); + } +} From 94113f6b0e258a98a749fda50d6a9572f154db6e Mon Sep 17 00:00:00 2001 From: kerry Date: Sat, 27 May 2017 14:31:21 +0800 Subject: [PATCH 19/54] REPORT-235 --- .../fr/design/extra/PluginOperateUtils.java | 81 +++++++++++++++++++ .../com/fr/design/extra/PluginWebBridge.java | 20 ++--- .../callback/AbstractPluginTaskCallback.java | 1 - .../extra/exe/callback/DownloadCallback.java | 1 - .../exe/callback/InstallFromDiskCallback.java | 6 +- .../exe/callback/InstallOnlineCallback.java | 1 - 6 files changed, 94 insertions(+), 16 deletions(-) diff --git a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java index beb84b9c6..00e610eb0 100644 --- a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java +++ b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java @@ -1,11 +1,14 @@ package com.fr.design.extra; import com.fr.base.FRContext; +import com.fr.design.DesignerEnvManager; import com.fr.design.extra.exe.callback.*; import com.fr.design.extra.exe.extratask.InstallPluginTask; import com.fr.design.extra.exe.extratask.UpdatePluginTask; import com.fr.general.FRLogger; import com.fr.general.Inter; +import com.fr.general.SiteCenter; +import com.fr.general.http.HttpClient; import com.fr.json.JSONObject; import com.fr.plugin.context.PluginContext; import com.fr.plugin.context.PluginMarker; @@ -17,6 +20,7 @@ import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; import javafx.scene.web.WebEngine; import netscape.javascript.JSObject; +import org.json.JSONArray; import sun.plugin2.main.server.Plugin; import javax.swing.*; @@ -96,6 +100,83 @@ public class PluginOperateUtils { PluginManager.getController().uninstall(pluginMarker, isForce, new UnistallPluginCallback()); } + public static void readUpdateOnline(JSCallback jsCallback){ + try { + String [] plugins = PluginReaderForDesigner.readPluginsForUpdate(); + JSONArray jsonArray = new JSONArray(); + for (String plugin : plugins) { + org.json.JSONObject jsonObject = new org.json.JSONObject(); + jsonObject.put("pluginid", plugin); + jsonArray.put(jsonObject); + } + String result = jsonArray.toString(); + jsCallback.execute(result); + } catch (Exception e) { + FRLogger.getLogger().error(e.getMessage()); + } + + } + + public static void searchPlugin(String keyword, JSCallback jsCallback) { + try { + HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("plugin.plist") + "&keyword=" + keyword); + String result = httpClient.getResponseText(); + jsCallback.execute(result); + } catch (Exception e) { + FRLogger.getLogger().error(e.getMessage()); + } + } + + public static void getPluginFromStore(String category, String seller, String fee, JSCallback jsCallback){ + String plistUrl = SiteCenter.getInstance().acquireUrlByKind("plugin.plist"); + if (StringUtils.isNotBlank(plistUrl)) { + StringBuilder url = new StringBuilder(); + url.append(plistUrl); + if (StringUtils.isNotBlank(category)) { + url.append("&cid=").append(category.split("-")[1]); + } + if (StringUtils.isNotBlank(seller)) { + url.append("&seller=").append(seller.split("-")[1]); + } + if (StringUtils.isNotBlank(fee)) { + url.append("&fee=").append(fee.split("-")[1]); + } + try { + HttpClient httpClient = new HttpClient(url.toString()); + String result = httpClient.getResponseText(); + jsCallback.execute(result); + } catch (Exception e) { + FRLogger.getLogger().error(e.getMessage()); + } + } else { + String result = PluginConstants.CONNECTION_404; + jsCallback.execute(result); + } + } + + public static void getPluginCategories(JSCallback jsCallback){ + String result; + String url = SiteCenter.getInstance().acquireUrlByKind("plugin.category"); + if (url != null) { + HttpClient httpClient = new HttpClient(url); + result = httpClient.getResponseText(); + } else { + result = PluginConstants.CONNECTION_404; + } + jsCallback.execute(result); + } + + public static void getLoginInfo(JSCallback jsCallback){ + String username = BBSPluginLogin.getInstance().getUserInfo().getUserName(); + String inShowUsername = DesignerEnvManager.getEnvManager().getInShowBBsName(); + if (StringUtils.isEmpty(username) && StringUtils.isEmpty(inShowUsername)) { + return; + }else { + String result = StringUtils.isEmpty(inShowUsername) ? username : inShowUsername; + jsCallback.execute(result); + } + } + private static String[] jsObjectToStringArray(JSObject obj) { if (obj == null) { return ArrayUtils.EMPTY_STRING_ARRAY; diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer_base/src/com/fr/design/extra/PluginWebBridge.java index 808eabfe1..5f5caac5d 100644 --- a/designer_base/src/com/fr/design/extra/PluginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/PluginWebBridge.java @@ -209,8 +209,8 @@ public class PluginWebBridge { * 已安装插件检查更新 */ public void readUpdateOnline(final JSObject callback) { - Task task = new PluginTask<>(webEngine, callback, new ReadUpdateOnlineExecutor()); - new Thread(task).start(); + JSCallback jsCallback = new JSCallback(webEngine, callback); + PluginOperateUtils.readUpdateOnline(jsCallback); } /** @@ -303,8 +303,8 @@ public class PluginWebBridge { * @param keyword 关键字 */ public void searchPlugin(String keyword, final JSObject callback) { - Task task = new PluginTask<>(webEngine, callback, new SearchOnlineExecutor(keyword)); - new Thread(task).start(); + JSCallback jsCallback = new JSCallback(webEngine, callback); + PluginOperateUtils.searchPlugin(keyword, jsCallback); } /** @@ -316,8 +316,8 @@ public class PluginWebBridge { * @param callback 回调函数 */ public void getPluginFromStore(String category, String seller, String fee, final JSObject callback) { - Task task = new PluginTask<>(webEngine, callback, new GetPluginFromStoreExecutor(category, seller, fee)); - new Thread(task).start(); + JSCallback jsCallback = new JSCallback(webEngine, callback); + PluginOperateUtils.getPluginFromStore(category, seller, fee, jsCallback); } /** @@ -326,8 +326,8 @@ public class PluginWebBridge { * @param callback 回调函数 */ public void getPluginCategories(final JSObject callback) { - Task task = new PluginTask<>(webEngine, callback, new GetPluginCategoriesExecutor()); - new Thread(task).start(); + JSCallback jsCallback = new JSCallback(webEngine, callback); + PluginOperateUtils.getPluginCategories(jsCallback); } /** @@ -377,8 +377,8 @@ public class PluginWebBridge { * @param callback */ public void getLoginInfo(final JSObject callback) { - Task task = new PluginTask<>(webEngine, callback, new GetLoginInfoExecutor()); - new Thread(task).start(); + JSCallback jsCallback = new JSCallback(webEngine, callback); + PluginOperateUtils.getLoginInfo(jsCallback); } /** diff --git a/designer_base/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java index b0d4813cf..c641c622f 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java @@ -3,7 +3,6 @@ package com.fr.design.extra.exe.callback; import com.fr.plugin.context.PluginMarker; import com.fr.plugin.manage.control.ProgressCallback; -import java.io.File; /** * Created by ibm on 2017/5/26. diff --git a/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java index 405a41528..d12f50592 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java @@ -3,7 +3,6 @@ package com.fr.design.extra.exe.callback; import com.fr.design.extra.exe.extratask.ExtraPluginTask; import com.fr.general.Inter; import com.fr.plugin.manage.control.PluginTaskResult; -import com.fr.plugin.manage.control.ProgressCallback; import javax.swing.*; diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java index 4c64d1426..bd2f3bec1 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java @@ -11,9 +11,10 @@ import java.io.File; /** * Created by ibm on 2017/5/26. */ -public class InstallFromDiskCallback extends AbstractPluginTaskCallback{ +public class InstallFromDiskCallback extends AbstractPluginTaskCallback { private File zipFile; - public InstallFromDiskCallback(File zipFile, JSCallback jsCallback){ + + public InstallFromDiskCallback(File zipFile, JSCallback jsCallback) { this.zipFile = zipFile; this.jsCallback = jsCallback; } @@ -44,7 +45,6 @@ public class InstallFromDiskCallback extends AbstractPluginTaskCallback{ return; } PluginManager.getController().install(zipFile, new InstallFromDiskCallback(zipFile, jsCallback)); -// jsCallback.execute("installDependence"); } else { JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java index ef96acf72..253ea4005 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java @@ -45,7 +45,6 @@ public class InstallOnlineCallback extends AbstractPluginTaskCallback { } //执行JS回调 PluginManager.getController().install(pluginMarker, new InstallOnlineCallback(pluginMarker, jsCallback)); -// jsCallback.execute("installDependence"); } else { JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } From 556dce803ac7bbcb26e162faee5a5093ed36ebe3 Mon Sep 17 00:00:00 2001 From: kerry Date: Sat, 27 May 2017 14:35:18 +0800 Subject: [PATCH 20/54] =?UTF-8?q?=E9=81=BF=E5=85=8D=E9=AD=94=E6=9C=AF?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/extra/exe/callback/InstallFromDiskCallback.java | 3 ++- .../fr/design/extra/exe/callback/InstallOnlineCallback.java | 3 ++- .../fr/design/extra/exe/callback/UpdateFromDiskCallback.java | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java index bd2f3bec1..035ebbf32 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java @@ -2,6 +2,7 @@ package com.fr.design.extra.exe.callback; import com.fr.general.FRLogger; import com.fr.general.Inter; +import com.fr.plugin.error.PluginErrorCode; import com.fr.plugin.manage.PluginManager; import com.fr.plugin.manage.control.PluginTaskResult; @@ -30,7 +31,7 @@ public class InstallFromDiskCallback extends AbstractPluginTaskCallback { if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else if (result.errorCode() == 30) { + } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { int rv = JOptionPane.showOptionDialog( null, Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Success")), diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java index 253ea4005..8649b5cd3 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java @@ -3,6 +3,7 @@ package com.fr.design.extra.exe.callback; import com.fr.general.FRLogger; import com.fr.general.Inter; import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.error.PluginErrorCode; import com.fr.plugin.manage.PluginManager; import com.fr.plugin.manage.control.PluginTaskResult; @@ -29,7 +30,7 @@ public class InstallOnlineCallback extends AbstractPluginTaskCallback { if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else if (result.errorCode() == 30) { + } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { int rv = JOptionPane.showOptionDialog( null, Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Success")), diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java index e666c8e81..390598835 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java @@ -3,6 +3,7 @@ package com.fr.design.extra.exe.callback; import com.fr.general.FRLogger; import com.fr.general.Inter; import com.fr.general.jsqlparser.expression.StringValue; +import com.fr.plugin.error.PluginErrorCode; import com.fr.plugin.manage.PluginManager; import com.fr.plugin.manage.control.PluginTaskResult; @@ -31,7 +32,7 @@ public class UpdateFromDiskCallback extends AbstractPluginTaskCallback { if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else if (result.errorCode() == 30) { + } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { int rv = JOptionPane.showOptionDialog( null, Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Success")), From 47138c4840c132eb3228af6f320c4cedd9beb6b7 Mon Sep 17 00:00:00 2001 From: kerry Date: Sat, 27 May 2017 14:39:19 +0800 Subject: [PATCH 21/54] =?UTF-8?q?=E4=BF=AE=E6=94=B9PMD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extra/exe/InstallFromDiskExecutor.java | 20 +++++++++---------- .../extra/exe/InstallOnlineExecutor.java | 12 +++++------ .../design/extra/exe/UninstallExecutor.java | 4 ++-- .../extra/exe/UpdateFromDiskExecutor.java | 5 ++--- .../extra/exe/UpdateOnlineExecutor.java | 11 ++++------ .../exe/callback/UpdateOnlineCallback.java | 4 ++-- 6 files changed, 26 insertions(+), 30 deletions(-) diff --git a/designer_base/src/com/fr/design/extra/exe/InstallFromDiskExecutor.java b/designer_base/src/com/fr/design/extra/exe/InstallFromDiskExecutor.java index 5e7f5e2b8..3d5629a3c 100644 --- a/designer_base/src/com/fr/design/extra/exe/InstallFromDiskExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/InstallFromDiskExecutor.java @@ -24,7 +24,7 @@ public class InstallFromDiskExecutor implements Executor { @Override public String getTaskFinishMessage() { - return "已成功安装"; + return Inter.getLocText("FR-Designer-Plugin_Success_Install"); } @Override @@ -33,7 +33,7 @@ public class InstallFromDiskExecutor implements Executor { new Command() { @Override public String getExecuteMessage() { - return "正在解压文件" + filePath; + return Inter.getLocText("FR-Designer-Plugin_Unzipping") + filePath; } @Override @@ -44,7 +44,7 @@ public class InstallFromDiskExecutor implements Executor { new Command() { @Override public String getExecuteMessage() { - return "正在安装"; + return Inter.getLocText("FR-Designer-Plugin_Installing"); } @Override @@ -56,11 +56,11 @@ public class InstallFromDiskExecutor implements Executor { @Override public void done(PluginTaskResult result) { if (result.isSuccess()) { - FRLogger.getLogger().info("插件安装成功"); + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); } else if(result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()){ int rv = JOptionPane.showOptionDialog( null, - Inter.getLocText("安装依赖"), + Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, @@ -71,9 +71,9 @@ public class InstallFromDiskExecutor implements Executor { if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) { return; } - installWithDepenndence(); + installWithDependence(); }else{ - FRLogger.getLogger().info("插件安装失败"); + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Failed")); JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } } @@ -83,7 +83,7 @@ public class InstallFromDiskExecutor implements Executor { }; } - public void installWithDepenndence(){ + public void installWithDependence(){ PluginManager.getController().install(new File(filePath), new ProgressCallback() { @Override public void updateProgress(String description, double progress) { @@ -91,10 +91,10 @@ public class InstallFromDiskExecutor implements Executor { @Override public void done(PluginTaskResult result) { if (result.isSuccess()) { - FRLogger.getLogger().info("插件安装成功"); + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); } else{ - FRLogger.getLogger().info("插件安装失败"); + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Failed")); JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } } diff --git a/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java b/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java index 2a95ec29a..fd960d3e8 100644 --- a/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java @@ -36,7 +36,7 @@ public class InstallOnlineExecutor implements Executor { new Command() { @Override public String getExecuteMessage() { - return "正在下载插件:" + pluginInfo.split("_")[0]; + return Inter.getLocText("FR-Designer-Plugin_Downloading") + ":" + pluginInfo.split("_")[0]; } @Override @@ -79,13 +79,13 @@ public class InstallOnlineExecutor implements Executor { @Override public void done(PluginTaskResult result) { if (result.isSuccess()) { - FRLogger.getLogger().info("插件安装成功"); + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { int rv = JOptionPane.showOptionDialog( null, - Inter.getLocText("安装依赖"), - Inter.getLocText("FR-Designer-Plugin_Warning"), + Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Success")), + Inter.getLocText("FR-Designer-Plugin_Install_Dependence"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, @@ -112,10 +112,10 @@ public class InstallOnlineExecutor implements Executor { @Override public void done(PluginTaskResult result) { if (result.isSuccess()) { - FRLogger.getLogger().info("插件安装成功"); + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); } else { - FRLogger.getLogger().info("插件安装失败"); + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Failed")); JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } } diff --git a/designer_base/src/com/fr/design/extra/exe/UninstallExecutor.java b/designer_base/src/com/fr/design/extra/exe/UninstallExecutor.java index 9eaa49ac9..79d34bf21 100644 --- a/designer_base/src/com/fr/design/extra/exe/UninstallExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/UninstallExecutor.java @@ -47,10 +47,10 @@ public class UninstallExecutor implements Executor { public void done(PluginTaskResult pluginTaskResult) { if (pluginTaskResult.isSuccess()) { result = "done"; - FRLogger.getLogger().info("删除成功"); + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Delete_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); } else { - FRLogger.getLogger().info("删除失败"); + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Delete_Failed")); JOptionPane.showMessageDialog(null, pluginTaskResult.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } } diff --git a/designer_base/src/com/fr/design/extra/exe/UpdateFromDiskExecutor.java b/designer_base/src/com/fr/design/extra/exe/UpdateFromDiskExecutor.java index c415127f7..8be5a3834 100644 --- a/designer_base/src/com/fr/design/extra/exe/UpdateFromDiskExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/UpdateFromDiskExecutor.java @@ -24,7 +24,7 @@ public class UpdateFromDiskExecutor implements Executor { @Override public String getTaskFinishMessage() { - return "插件更新操作结束"; + return Inter.getLocText("FR-Designer-Plugin_Update_End"); } @Override @@ -47,7 +47,7 @@ public class UpdateFromDiskExecutor implements Executor { @Override public void done(PluginTaskResult result) { if (result.isSuccess()) { - FRLogger.getLogger().info("更新成功"); + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Update_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { updatePluginWithDependence(); @@ -71,7 +71,6 @@ public class UpdateFromDiskExecutor implements Executor { @Override public void done(PluginTaskResult result) { if (result.isSuccess()) { - FRLogger.getLogger().info("更新成功"); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); } else { JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); diff --git a/designer_base/src/com/fr/design/extra/exe/UpdateOnlineExecutor.java b/designer_base/src/com/fr/design/extra/exe/UpdateOnlineExecutor.java index 7cb467470..c8f1fc778 100644 --- a/designer_base/src/com/fr/design/extra/exe/UpdateOnlineExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/UpdateOnlineExecutor.java @@ -10,6 +10,7 @@ import com.fr.json.JSONObject; import com.fr.plugin.context.PluginMarker; import com.fr.plugin.error.PluginErrorCode; import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.manage.bbs.BBSPluginLogin; import com.fr.plugin.manage.control.PluginTaskResult; import com.fr.plugin.manage.control.ProgressCallback; import com.fr.stable.StringUtils; @@ -46,10 +47,10 @@ public class UpdateOnlineExecutor implements Executor { @Override public void run(Process process) { - if (StringUtils.isBlank(DesignerEnvManager.getEnvManager().getBBSName())) { + if (!(BBSPluginLogin.getInstance().hasLogin())){ LoginCheckContext.fireLoginCheckListener(); } - if (StringUtils.isNotBlank(DesignerEnvManager.getEnvManager().getBBSName())) { + if (BBSPluginLogin.getInstance().hasLogin()) { List pluginMarkerList = new ArrayList(); for (int i = 0; i < pluginInfos.length; i++) { pluginMarkerList.add(PluginUtils.createPluginMarker(pluginInfos[i])); @@ -70,10 +71,8 @@ public class UpdateOnlineExecutor implements Executor { @Override public void done(PluginTaskResult result) { if (result.isSuccess()) { - FRLogger.getLogger().info("更新成功"); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); } else { - FRLogger.getLogger().info("更新失败"); JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } } @@ -87,7 +86,7 @@ public class UpdateOnlineExecutor implements Executor { //todo check下此插件的最新版本 String latestPluginInfo = PluginUtils.getLatestPluginInfo(pluginMarkerList.get(i).getPluginID()); if (StringUtils.isEmpty(latestPluginInfo) || PluginConstants.CONNECTION_404.equals(latestPluginInfo)) { - JOptionPane.showMessageDialog(null, "插件商城连接失败", Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Connect_Failed"), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); return; } JSONObject resultArr = new JSONObject(latestPluginInfo); @@ -102,12 +101,10 @@ public class UpdateOnlineExecutor implements Executor { @Override public void done(PluginTaskResult result) { if (result.isSuccess()) { - FRLogger.getLogger().info("更新成功"); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { updatePluginWithDependence(pluginMarkerList.get(a), PluginMarker.create(pluginMarkerList.get(a).getPluginID(), latestPluginVersion)); } else { - FRLogger.getLogger().info("更新失败"); JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } } diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java index 7d709e935..cce4934b6 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java @@ -30,7 +30,7 @@ public class UpdateOnlineCallback extends AbstractPluginTaskCallback { @Override public void done(PluginTaskResult result) { if (result.isSuccess()) { - FRLogger.getLogger().info("更新成功"); + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Update_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { int rv = JOptionPane.showOptionDialog( @@ -48,7 +48,7 @@ public class UpdateOnlineCallback extends AbstractPluginTaskCallback { } PluginManager.getController().update(pluginMarker, toPluginMarker, new UpdateOnlineCallback(pluginMarker, toPluginMarker, jsCallback)); } else { - FRLogger.getLogger().info("更新失败"); + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Delete_Failed")); JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } } From 68c33117566ef88ba9ff9c8f1d308c838cb57c1a Mon Sep 17 00:00:00 2001 From: kerry Date: Sat, 27 May 2017 14:42:07 +0800 Subject: [PATCH 22/54] =?UTF-8?q?=E4=BF=AE=E6=94=B9PMD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/fr/design/extra/exe/InstallOnlineExecutor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java b/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java index fd960d3e8..42f7be72d 100644 --- a/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java @@ -50,7 +50,7 @@ public class InstallOnlineExecutor implements Executor { PluginManager.getController().download(pluginMarker, new ProgressCallback() { @Override public void updateProgress(String description, double aProgress) { - process.process(Math.round(aProgress * 100) + "%"); +// process.process(Math.round(aProgress * 100) + "%"); } @Override From 8bc49176faf18091fceae120b86d9a8581861930 Mon Sep 17 00:00:00 2001 From: kerry Date: Wed, 31 May 2017 15:48:29 +0800 Subject: [PATCH 23/54] =?UTF-8?q?REPORT-2354=20=20=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E4=BC=A0=E7=BB=9F=E6=8F=92=E4=BB=B6=E5=95=86=E5=9F=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/extra/PluginControlPane.java | 43 +++--- .../com/fr/design/extra/PluginDetailPane.java | 6 +- .../fr/design/extra/PluginFromStorePane.java | 125 +++++++----------- .../fr/design/extra/PluginInstalledPane.java | 83 +++++++----- .../fr/design/extra/PluginOperateUtils.java | 53 +++----- .../design/extra/PluginReaderForDesigner.java | 60 --------- .../fr/design/extra/PluginSelectListener.java | 5 +- .../com/fr/design/extra/PluginUpdatePane.java | 125 +++++------------- .../src/com/fr/design/extra/PluginUtils.java | 49 +++++++ .../com/fr/design/extra/PluginWebBridge.java | 18 ++- .../design/extra/PluginsReaderFromStore.java | 52 +++----- .../extra/exe/GetLoginInfoExecutor.java | 41 ------ .../exe/GetPluginCategoriesExecutor.java | 41 ------ .../extra/exe/GetPluginFromStoreExecutor.java | 68 ---------- .../extra/exe/InstallFromDiskExecutor.java | 103 --------------- .../extra/exe/InstallOnlineExecutor.java | 124 ----------------- .../extra/exe/ModifyStatusExecutor.java | 74 ----------- .../design/extra/exe/PluginLoginExecutor.java | 49 ------- .../extra/exe/ReadUpdateOnlineExecutor.java | 49 ------- .../extra/exe/SearchOnlineExecutor.java | 47 ------- .../design/extra/exe/UninstallExecutor.java | 62 --------- .../extra/exe/UpdateFromDiskExecutor.java | 81 ------------ .../extra/exe/UpdateOnlineExecutor.java | 118 ----------------- .../callback/AbstractPluginTaskCallback.java | 1 - .../extra/exe/callback/DownloadCallback.java | 2 + .../exe/callback/InstallFromDiskCallback.java | 6 +- .../exe/callback/InstallOnlineCallback.java | 7 +- .../design/extra/exe/callback/JSCallback.java | 31 ++++- .../exe/callback/UnistallPluginCallback.java | 1 - .../exe/callback/UpdateFromDiskCallback.java | 9 +- .../exe/callback/UpdateOnlineCallback.java | 9 +- .../extratask/AbstractExtraPluginTask.java | 11 ++ .../exe/extratask/InstallPluginTask.java | 11 +- .../extra/exe/extratask/UpdatePluginTask.java | 8 +- .../callback/UpdateOnlineCallback.java | 55 ++++++++ 35 files changed, 393 insertions(+), 1234 deletions(-) delete mode 100644 designer_base/src/com/fr/design/extra/PluginReaderForDesigner.java delete mode 100644 designer_base/src/com/fr/design/extra/exe/GetLoginInfoExecutor.java delete mode 100644 designer_base/src/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java delete mode 100644 designer_base/src/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java delete mode 100644 designer_base/src/com/fr/design/extra/exe/InstallFromDiskExecutor.java delete mode 100644 designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java delete mode 100644 designer_base/src/com/fr/design/extra/exe/ModifyStatusExecutor.java delete mode 100644 designer_base/src/com/fr/design/extra/exe/PluginLoginExecutor.java delete mode 100644 designer_base/src/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java delete mode 100644 designer_base/src/com/fr/design/extra/exe/SearchOnlineExecutor.java delete mode 100644 designer_base/src/com/fr/design/extra/exe/UninstallExecutor.java delete mode 100644 designer_base/src/com/fr/design/extra/exe/UpdateFromDiskExecutor.java delete mode 100644 designer_base/src/com/fr/design/extra/exe/UpdateOnlineExecutor.java create mode 100644 designer_base/src/com/fr/design/extra/exe/extratask/AbstractExtraPluginTask.java create mode 100644 designer_base/src/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java diff --git a/designer_base/src/com/fr/design/extra/PluginControlPane.java b/designer_base/src/com/fr/design/extra/PluginControlPane.java index 82657904f..ac63ae7f4 100644 --- a/designer_base/src/com/fr/design/extra/PluginControlPane.java +++ b/designer_base/src/com/fr/design/extra/PluginControlPane.java @@ -8,10 +8,13 @@ import com.fr.design.gui.itextfield.UITextField; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.IOUtils; import com.fr.general.Inter; -import com.fr.plugin.Plugin; import com.fr.plugin.PluginLicense; import com.fr.plugin.PluginLicenseManager; -import com.fr.plugin.PluginLoader; +import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.manage.control.PluginTaskCallback; +import com.fr.plugin.manage.control.PluginTaskResult; +import com.fr.plugin.view.PluginView; import com.fr.stable.StringUtils; import javax.swing.*; @@ -20,7 +23,8 @@ import javax.swing.event.DocumentListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.*; -import java.util.ArrayList; +import java.util.*; +import java.util.List; /** * @author richie @@ -32,7 +36,7 @@ public class PluginControlPane extends BasicPane { private DefaultListModel listModel; private PluginDetailPane detailPane; private java.util.List listeners = new ArrayList(); - private Plugin[] plugins; + private List plugins; private UITextField searchTextField; public PluginControlPane() { @@ -63,8 +67,8 @@ public class PluginControlPane extends BasicPane { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (value instanceof Plugin) { - PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(((Plugin) value).getId()); + if (value instanceof PluginView) { + PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(((PluginView) value).getID()); String extraInfo = ""; if (pluginLicense.isJarDamage()) { extraInfo = "(" + Inter.getLocText("FR-Plugin-Plugin_Damaged") + ")"; @@ -75,7 +79,7 @@ public class PluginControlPane extends BasicPane { extraInfo = "(" + (pluginLicense.isTrial() ? Inter.getLocText("FR-Plugin-Designer_Trial") : Inter.getLocText("FR-Plugin-Designer_Authorized")) + Inter.getLocText("FR-Plugin-Designer_Expired") + ")"; } } - setText(((Plugin) value).getName() + extraInfo); + setText(((PluginView) value).getName() + extraInfo); setIcon(IOUtils.readIcon("/com/fr/design/images/server/plugin.png")); } return this; @@ -101,7 +105,7 @@ public class PluginControlPane extends BasicPane { pluginList.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { - Plugin plugin = (Plugin) pluginList.getSelectedValue(); + PluginView plugin = (PluginView) pluginList.getSelectedValue(); if (plugin != null) { detailPane.populate(plugin); for (PluginSelectListener l : listeners) { @@ -118,9 +122,9 @@ public class PluginControlPane extends BasicPane { listeners.add(l); } - public void loadPlugins(Plugin[] plugins) { + public void loadPlugins(java.util.List plugins) { this.plugins = plugins; - for (Plugin plugin : plugins) { + for (PluginView plugin : plugins) { listModel.addElement(plugin); } } @@ -128,21 +132,28 @@ public class PluginControlPane extends BasicPane { private void doSearch(String text) { if (StringUtils.isNotBlank(text)) { listModel.clear(); - for (Plugin plugin : plugins) { - if (plugin.match(text)) { + for (PluginView plugin : plugins) { + if (PluginUtils.isPluginMatch(plugin, text)) { listModel.addElement(plugin); } } } } - public Plugin getSelectedPlugin() { - return (Plugin) pluginList.getSelectedValue(); + public PluginView getSelectedPlugin() { + return (PluginView) pluginList.getSelectedValue(); } - public void deletePlugin(Plugin plugin) { + public void deletePlugin(PluginView plugin) { listModel.removeElement(plugin); - PluginLoader.getLoader().deletePlugin(plugin); + String id = plugin.getID(); + String version = plugin.getVersion(); + PluginManager.getController().uninstall(PluginMarker.create(id, version), true, new PluginTaskCallback() { + @Override + public void done(PluginTaskResult result) { + + } + }); } @Override diff --git a/designer_base/src/com/fr/design/extra/PluginDetailPane.java b/designer_base/src/com/fr/design/extra/PluginDetailPane.java index 4edfb934f..a5d44a614 100644 --- a/designer_base/src/com/fr/design/extra/PluginDetailPane.java +++ b/designer_base/src/com/fr/design/extra/PluginDetailPane.java @@ -3,7 +3,7 @@ package com.fr.design.extra; import com.fr.design.dialog.BasicPane; import com.fr.general.FRLogger; import com.fr.general.Inter; -import com.fr.plugin.Plugin; +import com.fr.plugin.view.PluginView; import com.fr.stable.StringUtils; import javax.swing.*; @@ -56,8 +56,8 @@ public class PluginDetailPane extends BasicPane { } - public void populate(Plugin plugin) { - textPane.setText(plugin.toHTML()); + public void populate(PluginView plugin) { + textPane.setText(PluginUtils.pluginToHtml(plugin)); } public void reset() { diff --git a/designer_base/src/com/fr/design/extra/PluginFromStorePane.java b/designer_base/src/com/fr/design/extra/PluginFromStorePane.java index e40f5a2bf..0b8393ccf 100644 --- a/designer_base/src/com/fr/design/extra/PluginFromStorePane.java +++ b/designer_base/src/com/fr/design/extra/PluginFromStorePane.java @@ -1,26 +1,29 @@ package com.fr.design.extra; import com.fr.base.FRContext; -import com.fr.design.DesignerEnvManager; -import com.fr.design.RestartHelper; +import com.fr.design.extra.tradition.callback.UpdateOnlineCallback; import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.gui.ilable.UILabel; +import com.fr.general.FRLogger; import com.fr.general.Inter; -import com.fr.plugin.Plugin; -import com.fr.stable.StringUtils; +import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.manage.bbs.BBSPluginLogin; +import com.fr.plugin.manage.control.PluginTaskResult; +import com.fr.plugin.manage.control.ProgressCallback; +import com.fr.plugin.view.PluginView; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.io.File; import java.util.List; -import java.util.concurrent.ExecutionException; /** * @author richie * @date 2015-03-10 * @since 8.0 */ -public class PluginFromStorePane extends PluginAbstractLoadingViewPane { +public class PluginFromStorePane extends PluginAbstractLoadingViewPane, Void> { private UILabel errorMsgLabel; private UITabbedPane tabbedPane; private PluginControlPane controlPane; @@ -29,7 +32,6 @@ public class PluginFromStorePane extends PluginAbstractLoadingViewPane loadData() throws Exception { //Thread.sleep(3000); return PluginsReaderFromStore.readPlugins(); } /** * 加载成功处理 + * * @param plugins 插件 */ - public void loadOnSuccess(Plugin[] plugins) { + public void loadOnSuccess(List plugins) { controlPane.loadPlugins(plugins); - tabbedPane.setTitleAt(2, Inter.getLocText("FR-Designer-Plugin_All_Plugins") + "(" + plugins.length + ")"); + tabbedPane.setTitleAt(2, Inter.getLocText("FR-Designer-Plugin_All_Plugins") + "(" + plugins.size() + ")"); } /** * 加载失败 + * * @param e 异常消息 */ public void loadOnFailed(Exception e) { @@ -159,85 +166,52 @@ public class PluginFromStorePane extends PluginAbstractLoadingViewPane(){ - - @Override - protected Void doInBackground() throws Exception { - Plugin plugin = controlPane.getSelectedPlugin(); - String id = null; - if (plugin != null) { - id = plugin.getId(); - } - String username = DesignerEnvManager.getEnvManager().getBBSName(); - String password = DesignerEnvManager.getEnvManager().getBBSPassword(); - try { - PluginHelper.downloadPluginFile(id,username,password, new Process() { - @Override - public void process(Double integer) { - publish(integer); - } - }); - Thread.sleep(2000); - } catch (Exception e) { - FRContext.getLogger().error(e.getMessage(), e); - } - return null; - } + if (BBSPluginLogin.getInstance().hasLogin()) { + PluginView plugin = controlPane.getSelectedPlugin(); + String id = null; + if (plugin != null) { + id = plugin.getID(); + } - public void process(List list) { - pane.setProgress(list.get(list.size() - LISTNUM1) * LISTNUM100); - } + try { + PluginMarker pluginMarker = PluginMarker.create(id, plugin.getVersion()); + String latestPluginInfo = PluginUtils.getLatestPluginInfo(id); + PluginMarker toPluginMarker = PluginMarker.create(id, latestPluginInfo); + PluginManager.getController().download(pluginMarker, new UpdateOnlineCallback(pluginMarker, toPluginMarker, pane)); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } - public void done() { - //下载完成,开始执行安装 - try { - get(); - pane.didTaskFinished(); - installFromDiskZipFile(PluginHelper.getDownloadTempFile()); - } catch (InterruptedException e) { - FRContext.getLogger().error(e.getMessage(), e); - } catch (ExecutionException e) { - FRContext.getLogger().error(e.getMessage(), e); - } catch (Exception e) { - FRContext.getLogger().error(e.getMessage(), e); - } - } - }.execute(); } - } /** * 正在加载页的标题 + * * @return 标题字符串 */ public String textForLoadingLabel() { @@ -246,11 +220,12 @@ public class PluginFromStorePane extends PluginAbstractLoadingViewPane plugins = PluginManager.getContexts(); + List pluginViews = new ArrayList<>(); + for (PluginContext plugin : plugins) { + pluginViews.add((PluginView) plugin); + } + controlPane.loadPlugins(pluginViews); + num = plugins.size(); } /** * tab标题 + * * @return 同上 */ public String tabTitle() { return Inter.getLocText("FR-Designer-Plugin_Installed") + "(" + num + ")"; } - private void doDelete(Plugin plugin) { + private void doDelete(PluginView plugin) { int rv = JOptionPane.showOptionDialog( PluginInstalledPane.this, Inter.getLocText("FR-Designer-Plugin_Will_Be_Delete"), @@ -114,21 +131,19 @@ public class PluginInstalledPane extends PluginAbstractViewPane { if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) { return; } - + try { - String[] filesToBeDelete = PluginHelper.uninstallPlugin(FRContext.getCurrentEnv(), plugin); controlPane.deletePlugin(plugin); - RestartHelper.saveFilesWhichToDelete(filesToBeDelete); } catch (Exception e) { JOptionPane.showMessageDialog(PluginInstalledPane.this, e.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } - + if (rv == JOptionPane.OK_OPTION) { RestartHelper.restart(); } } - private void changeTextForButton(Plugin plugin) { + private void changeTextForButton(PluginView plugin) { if (plugin.isActive()) { disableButton.setText(Inter.getLocText("FR-Designer-Plugin_Disable")); } else { diff --git a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java index 00e610eb0..4f2a2e204 100644 --- a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java +++ b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java @@ -15,13 +15,11 @@ import com.fr.plugin.context.PluginMarker; import com.fr.plugin.manage.PluginManager; import com.fr.plugin.manage.bbs.BBSPluginLogin; import com.fr.plugin.manage.control.PluginTaskCallback; -import com.fr.plugin.manage.control.PluginTaskResult; +import com.fr.plugin.view.PluginView; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; -import javafx.scene.web.WebEngine; import netscape.javascript.JSObject; import org.json.JSONArray; -import sun.plugin2.main.server.Plugin; import javax.swing.*; import java.io.File; @@ -45,23 +43,17 @@ public class PluginOperateUtils { } } - public static void installPluginFromDisk(final String filePath, JSCallback jsCallback) { - PluginManager.getController().install(new File(filePath), new InstallFromDiskCallback(new File(filePath), jsCallback)); + public static void installPluginFromDisk(File zipFile, JSCallback jsCallback) { + PluginManager.getController().install(zipFile, new InstallFromDiskCallback(zipFile, jsCallback)); } - public static void updatePluginOnline(JSObject pluginIDs, JSCallback jsCallback) { - String[] pluginInfos = jsObjectToStringArray(pluginIDs); + public static void updatePluginOnline(List pluginMarkerList, JSCallback jsCallback) { if (!(BBSPluginLogin.getInstance().hasLogin())) { LoginCheckContext.fireLoginCheckListener(); } if (BBSPluginLogin.getInstance().hasLogin()) { - List pluginMarkerList = new ArrayList(); - for (int i = 0; i < pluginInfos.length; i++) { - pluginMarkerList.add(PluginUtils.createPluginMarker(pluginInfos[i])); - } for (int i = 0; i < pluginMarkerList.size(); i++) { try { - //todo check下此插件的最新版本 String latestPluginInfo = PluginUtils.getLatestPluginInfo(pluginMarkerList.get(i).getPluginID()); if (StringUtils.isEmpty(latestPluginInfo) || PluginConstants.CONNECTION_404.equals(latestPluginInfo)) { JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Connect_Failed"), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); @@ -86,7 +78,7 @@ public class PluginOperateUtils { public static void setPluginActive(String pluginInfo, JSCallback jsCallback) { PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); PluginContext plugin = PluginManager.getContext(pluginMarker); - boolean active = !plugin.isActive(); + boolean active = plugin.isActive(); PluginTaskCallback modifyStatusCallback = new ModifyStatusCallback(active); if (active) { PluginManager.getController().forbid(pluginMarker, modifyStatusCallback); @@ -100,13 +92,13 @@ public class PluginOperateUtils { PluginManager.getController().uninstall(pluginMarker, isForce, new UnistallPluginCallback()); } - public static void readUpdateOnline(JSCallback jsCallback){ + public static void readUpdateOnline(JSCallback jsCallback) { try { - String [] plugins = PluginReaderForDesigner.readPluginsForUpdate(); + List plugins = PluginsReaderFromStore.readPluginsForUpdate(); JSONArray jsonArray = new JSONArray(); - for (String plugin : plugins) { + for (PluginView plugin : plugins) { org.json.JSONObject jsonObject = new org.json.JSONObject(); - jsonObject.put("pluginid", plugin); + jsonObject.put("pluginid", plugin.getID()); jsonArray.put(jsonObject); } String result = jsonArray.toString(); @@ -127,7 +119,7 @@ public class PluginOperateUtils { } } - public static void getPluginFromStore(String category, String seller, String fee, JSCallback jsCallback){ + public static void getPluginFromStore(String category, String seller, String fee, JSCallback jsCallback) { String plistUrl = SiteCenter.getInstance().acquireUrlByKind("plugin.plist"); if (StringUtils.isNotBlank(plistUrl)) { StringBuilder url = new StringBuilder(); @@ -154,7 +146,7 @@ public class PluginOperateUtils { } } - public static void getPluginCategories(JSCallback jsCallback){ + public static void getPluginCategories(JSCallback jsCallback) { String result; String url = SiteCenter.getInstance().acquireUrlByKind("plugin.category"); if (url != null) { @@ -166,27 +158,22 @@ public class PluginOperateUtils { jsCallback.execute(result); } - public static void getLoginInfo(JSCallback jsCallback){ + public static void getLoginInfo(JSCallback jsCallback) { String username = BBSPluginLogin.getInstance().getUserInfo().getUserName(); String inShowUsername = DesignerEnvManager.getEnvManager().getInShowBBsName(); if (StringUtils.isEmpty(username) && StringUtils.isEmpty(inShowUsername)) { return; - }else { - String result = StringUtils.isEmpty(inShowUsername) ? username : inShowUsername; - jsCallback.execute(result); + } else { + String result = StringUtils.isEmpty(inShowUsername) ? username : inShowUsername; + jsCallback.execute(result); } } - private static String[] jsObjectToStringArray(JSObject obj) { - if (obj == null) { - return ArrayUtils.EMPTY_STRING_ARRAY; - } - int len = (int) obj.getMember("length"); - List list = new ArrayList<>(); - for (int i = 0; i < len; i++) { - list.add(obj.getSlot(i).toString()); - } - return list.toArray(new String[len]); + public static boolean pluginValidate(PluginView pluginView){ + return StringUtils.isNotEmpty(pluginView.getID()) + && StringUtils.isNotEmpty(pluginView.getName()) + && StringUtils.isNotEmpty(pluginView.getVersion()) + && StringUtils.isNotEmpty(pluginView.getEnvVersion()); } } diff --git a/designer_base/src/com/fr/design/extra/PluginReaderForDesigner.java b/designer_base/src/com/fr/design/extra/PluginReaderForDesigner.java deleted file mode 100644 index 5fbb410fd..000000000 --- a/designer_base/src/com/fr/design/extra/PluginReaderForDesigner.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.fr.design.extra; - -import com.fr.general.GeneralUtils; -import com.fr.general.Inter; -import com.fr.general.SiteCenter; -import com.fr.general.http.HttpClient; -import com.fr.json.JSONArray; -import com.fr.json.JSONException; -import com.fr.json.JSONObject; -import com.fr.plugin.manage.PluginManager; -import com.fr.stable.EncodeConstants; -import com.fr.stable.StringUtils; - -import java.net.URLDecoder; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; - -/** - * Created by ibm on 2017/5/25. - */ -public class PluginReaderForDesigner { - private static Set pluginsToUpdate = new HashSet(); - - /** - * 从插件商店服务器读取插件信息,以JSON形式返回 - * - * @return 插件信息 - */ - public static String[] readPluginsForUpdate() throws Exception { - String resText = null; - String url = SiteCenter.getInstance().acquireUrlByKind("plugin.update"); - if (StringUtils.isNotEmpty(url)) { - HashMap para = new HashMap(); - para.put("plugins", PluginUtils.transPluginsToString(PluginManager.getContexts())); - //只有当前设计器的jar高于插件新版本需要的jarTime时, 才提示更新该插件. - para.put("jarTime", GeneralUtils.readBuildNO()); - HttpClient httpClient = new HttpClient(url, para); - resText = httpClient.getResponseText(); - String charSet = EncodeConstants.ENCODING_UTF_8; - resText = URLDecoder.decode(URLDecoder.decode(resText, charSet), charSet); - } - if (StringUtils.isNotEmpty(resText)) { - try { - pluginsToUpdate.clear(); - JSONArray jsonArray = new JSONArray(resText); - for (int i = 0, size = jsonArray.length(); i < size; i++) { - JSONObject jo = jsonArray.optJSONObject(i); - String id = jo.optString("id"); - if(StringUtils.isNotEmpty(id)){ - pluginsToUpdate.add(jo.optString("id", "")); - } - } - } catch (JSONException e) { - throw new Exception(Inter.getLocText("FS-Web-Plugin_Read_Plugin_List_Error")); - } - } - return pluginsToUpdate.toArray(new String[pluginsToUpdate.size()]); - } -} diff --git a/designer_base/src/com/fr/design/extra/PluginSelectListener.java b/designer_base/src/com/fr/design/extra/PluginSelectListener.java index b1962335b..4f82886f6 100644 --- a/designer_base/src/com/fr/design/extra/PluginSelectListener.java +++ b/designer_base/src/com/fr/design/extra/PluginSelectListener.java @@ -1,6 +1,7 @@ package com.fr.design.extra; -import com.fr.plugin.Plugin; + +import com.fr.plugin.view.PluginView; /** * @author richie @@ -9,5 +10,5 @@ import com.fr.plugin.Plugin; */ public interface PluginSelectListener { - public void valueChanged(Plugin plugin); + public void valueChanged(PluginView plugin); } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/extra/PluginUpdatePane.java b/designer_base/src/com/fr/design/extra/PluginUpdatePane.java index e0b3ada35..5506b5dc4 100644 --- a/designer_base/src/com/fr/design/extra/PluginUpdatePane.java +++ b/designer_base/src/com/fr/design/extra/PluginUpdatePane.java @@ -3,12 +3,20 @@ package com.fr.design.extra; import com.fr.base.FRContext; import com.fr.design.DesignerEnvManager; import com.fr.design.RestartHelper; +import com.fr.design.extra.tradition.callback.UpdateOnlineCallback; import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.gui.ilable.UILabel; +import com.fr.general.FRLogger; import com.fr.general.Inter; -import com.fr.plugin.Plugin; -import com.fr.plugin.PluginLoader; +import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.error.PluginErrorCode; +import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.manage.bbs.BBSPluginLogin; +import com.fr.plugin.manage.control.PluginTaskResult; +import com.fr.plugin.manage.control.ProgressCallback; +import com.fr.plugin.view.PluginView; import com.fr.stable.StringUtils; +import sun.plugin2.main.server.Plugin; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; @@ -20,7 +28,7 @@ import java.util.List; * @date 2015-03-10 * @since 8.0 */ -public class PluginUpdatePane extends PluginAbstractLoadingViewPane { +public class PluginUpdatePane extends PluginAbstractLoadingViewPane, Void> { private PluginControlPane controlPane; private JLabel errorMsgLabel; @@ -68,7 +76,7 @@ public class PluginUpdatePane extends PluginAbstractLoadingViewPane loadData() throws Exception { return PluginsReaderFromStore.readPluginsForUpdate(); } @@ -131,9 +139,9 @@ public class PluginUpdatePane extends PluginAbstractLoadingViewPane plugins) { controlPane.loadPlugins(plugins); - tabbedPane.setTitleAt(1, Inter.getLocText("FR-Designer-Plugin_Update") + "(" + plugins.length + ")"); + tabbedPane.setTitleAt(1, Inter.getLocText("FR-Designer-Plugin_Update") + "(" + plugins.size() + ")"); } /** @@ -167,101 +175,36 @@ public class PluginUpdatePane extends PluginAbstractLoadingViewPane() { - - @Override - protected Void doInBackground() throws Exception { - Plugin plugin = controlPane.getSelectedPlugin(); - String id = null; - if (plugin != null) { - id = plugin.getId(); - } - String username = DesignerEnvManager.getEnvManager().getBBSName(); - String password = DesignerEnvManager.getEnvManager().getBBSPassword(); - try { - PluginHelper.downloadPluginFile(id, username, password, new Process() { - @Override - public void process(Double integer) { - publish(integer); - } - }); - } catch (Exception e) { - FRContext.getLogger().error(e.getMessage(), e); - } - return null; - } - - public void process(List list) { - pane.setProgress(list.get(list.size() - 1) * PERSENT); - } - - public void done() { - //下载完成,开始执行安装 - try { - get(); - pane.didTaskFinished(); - doUpdateFromFile(PluginHelper.getDownloadTempFile()); - } catch (Exception e) { - FRContext.getLogger().error(e.getMessage(), e); - } - } - }.execute(); + if (BBSPluginLogin.getInstance().hasLogin()) { + PluginView plugin = controlPane.getSelectedPlugin(); + PluginMarker pluginMarker = PluginMarker.create(plugin.getID(), plugin.getVersion()); + String latestPluginInfo = PluginUtils.getLatestPluginInfo(pluginMarker.getPluginID()); + PluginMarker toPluginMarker = PluginMarker.create(pluginMarker.getPluginID(), latestPluginInfo); + PluginManager.getController().download(pluginMarker, new UpdateOnlineCallback(pluginMarker, toPluginMarker, pane)); } } private void doUpdateFromFile(File chosenFile) { - try { - Plugin plugin = PluginHelper.readPlugin(chosenFile); - if (plugin == null) { - JOptionPane.showMessageDialog(PluginUpdatePane.this, Inter.getLocText("FR-Designer-Plugin_Illegal_Plugin_Zip"), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - return; + PluginManager.getController().update(chosenFile, new ProgressCallback() { + @Override + public void updateProgress(String description, double progress) { + } - Plugin oldPlugin = PluginLoader.getLoader().getPluginById(plugin.getId()); - if (oldPlugin != null) { - // 说明安装了同ID的插件,再比较两个插件的版本 - if (PluginHelper.isNewThan(plugin, oldPlugin)) { - // 说明是新的插件,删除老的然后安装新的 - final String[] files = PluginHelper.uninstallPlugin(FRContext.getCurrentEnv(), oldPlugin); - PluginHelper.installPluginFromUnzippedTempDir(FRContext.getCurrentEnv(), plugin, new After() { - @Override - public void done() { - int rv = JOptionPane.showOptionDialog( - PluginUpdatePane.this, - Inter.getLocText("FR-Designer-Plugin_Update_Successful"), - Inter.getLocText("FR-Designer-Plugin_Warning"), - JOptionPane.YES_NO_OPTION, - JOptionPane.INFORMATION_MESSAGE, - null, - new String[]{Inter.getLocText("FR-Designer-Basic_Restart_Designer"), - Inter.getLocText("FR-Designer-Basic_Restart_Designer_Later") - }, - null - ); - - if (rv == JOptionPane.OK_OPTION) { - RestartHelper.restart(); - } - - // 如果不是立即重启,就把要删除的文件存放起来 - if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) { - RestartHelper.saveFilesWhichToDelete(files); - } - } - }); + + @Override + public void done(PluginTaskResult result) { + if (result.isSuccess()) { + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Update_Success")); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); } else { - JOptionPane.showMessageDialog(PluginUpdatePane.this, Inter.getLocText("FR-Designer-Plugin_Version_Is_Lower_Than_Current"), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } - } else { - JOptionPane.showMessageDialog(PluginUpdatePane.this, Inter.getLocText("FR-Designer-Plugin_Cannot_Update_Not_Install"), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } - } catch (Exception e1) { - JOptionPane.showMessageDialog(PluginUpdatePane.this, e1.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } + }); } /** diff --git a/designer_base/src/com/fr/design/extra/PluginUtils.java b/designer_base/src/com/fr/design/extra/PluginUtils.java index 31a1ff203..4871f5546 100644 --- a/designer_base/src/com/fr/design/extra/PluginUtils.java +++ b/designer_base/src/com/fr/design/extra/PluginUtils.java @@ -1,5 +1,6 @@ package com.fr.design.extra; +import com.fr.base.TemplateUtils; import com.fr.general.FRLogger; import com.fr.general.Inter; import com.fr.general.SiteCenter; @@ -9,17 +10,20 @@ import com.fr.json.JSONObject; import com.fr.plugin.context.PluginContext; import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.view.PluginView; import com.fr.stable.EncodeConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import java.io.File; import java.io.FileOutputStream; +import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URLDecoder; import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Created by ibm on 2017/5/25. @@ -104,4 +108,49 @@ public class PluginUtils { return resText; } + public static boolean isPluginMatch(PluginView pluginView, String text){ + return StringUtils.contains(pluginView.getID(), text) + || StringUtils.contains(pluginView.getName(), text) + || StringUtils.contains(pluginView.getVersion(), text) + || StringUtils.contains(pluginView.getEnvVersion(), text) + || StringUtils.contains(pluginView.getVendor(), text) + || StringUtils.contains(pluginView.getDescription(), text) + || StringUtils.contains(pluginView.getChangeNotes(), text); + + } + + public static String pluginToHtml(PluginView pluginView){ + String pluginName = Inter.getLocText("FR-Plugin-Plugin_Name"); + String pluginVersion = Inter.getLocText("FR-Plugin-Plugin_Version"); + String startVersion = Inter.getLocText("FR-Plugin-Start_Version"); + String developer = Inter.getLocText("FR-Plugin_Developer"); + String desc = Inter.getLocText("FR-Plugin-Function_Description"); + String updateLog = Inter.getLocText("FR-Plugin-Update_Log"); + Map map = new HashMap(); + + map.put("name", pluginName); + map.put("name_value", pluginView.getName()); + + map.put("version", pluginVersion); + map.put("version_value", pluginView.getVersion()); + + map.put("env", startVersion); + map.put("env_value", pluginView.getEnvVersion()); + + map.put("dev", developer); + map.put("dev_value", pluginView.getVendor()); + + map.put("fun", desc); + map.put("fun_value", pluginView.getDescription()); + + map.put("update", updateLog); + map.put("update_value", pluginView.getDescription()); + + try { + return TemplateUtils.renderTemplate("/com/fr/plugin/plugin.html", map); + } catch (IOException e) { + return StringUtils.EMPTY; + } + } + } diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer_base/src/com/fr/design/extra/PluginWebBridge.java index 5f5caac5d..5c8a45587 100644 --- a/designer_base/src/com/fr/design/extra/PluginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/PluginWebBridge.java @@ -6,6 +6,8 @@ import com.fr.design.RestartHelper; import com.fr.design.dialog.UIDialog; import com.fr.design.extra.exe.*; import com.fr.design.extra.exe.callback.JSCallback; +import com.fr.design.extra.exe.extratask.ExtraPluginTask; +import com.fr.design.extra.exe.extratask.UpdatePluginTask; import com.fr.design.gui.ilable.UILabel; import com.fr.general.FRLogger; import com.fr.general.Inter; @@ -13,6 +15,7 @@ import com.fr.general.SiteCenter; import com.fr.plugin.PluginLicense; import com.fr.plugin.PluginLicenseManager; import com.fr.plugin.context.PluginContext; +import com.fr.plugin.context.PluginMarker; import com.fr.plugin.manage.PluginManager; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; @@ -145,15 +148,14 @@ public class PluginWebBridge { * 从插件服务器上安装插件 * * @param pluginInfo 插件的ID - * @param callback 回调函数 + * @param callback 回调函数 */ public void installPluginOnline(final String pluginInfo, final JSObject callback) { JSCallback jsCallback = new JSCallback(webEngine, callback); - PluginOperateUtils.installPluginOnline(pluginInfo,jsCallback); + PluginOperateUtils.installPluginOnline(pluginInfo, jsCallback); } - /** * 从磁盘上选择插件安装包进行安装 * @@ -161,7 +163,8 @@ public class PluginWebBridge { */ public void installPluginFromDisk(final String filePath, final JSObject callback) { JSCallback jsCallback = new JSCallback(webEngine, callback); - PluginOperateUtils.installPluginFromDisk(filePath,jsCallback); + File file = new File(filePath); + PluginOperateUtils.installPluginFromDisk(file, jsCallback); } /** @@ -182,7 +185,12 @@ public class PluginWebBridge { */ public void updatePluginOnline(JSObject pluginIDs, final JSObject callback) { JSCallback jsCallback = new JSCallback(webEngine, callback); - PluginOperateUtils.updatePluginOnline(pluginIDs, jsCallback); + String[] pluginInfos = jsObjectToStringArray(pluginIDs); + List pluginMarkerList = new ArrayList(); + for (int i = 0; i < pluginInfos.length; i++) { + pluginMarkerList.add(PluginUtils.createPluginMarker(pluginInfos[i])); + } + PluginOperateUtils.updatePluginOnline(pluginMarkerList, jsCallback); } /** diff --git a/designer_base/src/com/fr/design/extra/PluginsReaderFromStore.java b/designer_base/src/com/fr/design/extra/PluginsReaderFromStore.java index abd053362..add949796 100644 --- a/designer_base/src/com/fr/design/extra/PluginsReaderFromStore.java +++ b/designer_base/src/com/fr/design/extra/PluginsReaderFromStore.java @@ -6,15 +6,14 @@ import com.fr.general.SiteCenter; import com.fr.general.http.HttpClient; import com.fr.json.JSONArray; import com.fr.json.JSONException; -import com.fr.plugin.Plugin; -import com.fr.plugin.PluginLoader; +import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.view.PluginView; +import com.fr.plugin.view.PluginViewReader; import com.fr.stable.EncodeConstants; import com.fr.stable.StringUtils; import java.net.URLDecoder; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; +import java.util.*; /** * @author richie @@ -22,15 +21,15 @@ import java.util.Set; * @since 8.0 */ public class PluginsReaderFromStore { - private static Set plugins = new HashSet(); - private static Set pluginsToUpdate = new HashSet(); + private static Set plugins = new HashSet(); + private static Set pluginsToUpdate = new HashSet(); /** * 从插件商店服务器读取插件信息,以JSON形式返回 * * @return 插件信息 */ - public static Plugin[] readPlugins() throws Exception { + public static List readPlugins() throws Exception { String resText; try { HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("plugin.store")); @@ -40,23 +39,7 @@ public class PluginsReaderFromStore { } catch (Exception e) { throw new Exception(Inter.getLocText("FR-Designer-Plugin_PluginMarket_Coding")); } - if (StringUtils.isNotEmpty(resText)) { - try { - plugins.clear();//先清空set - JSONArray jsonArray = new JSONArray(resText); - for (int i = 0, size = jsonArray.length(); i < size; i++) { - Plugin plugin = new Plugin(); - plugin.parseJSON(jsonArray.optJSONObject(i)); - if (plugin.isValidate()) { - plugins.add(plugin); - } - } - } catch (JSONException e) { - throw new Exception(Inter.getLocText("FR-Designer-Plugin_Read_Plugin_List_Error")); - } - } - - return plugins.toArray(new Plugin[plugins.size()]); + return parseResText(resText, plugins); } /** @@ -64,12 +47,12 @@ public class PluginsReaderFromStore { * * @return 插件信息 */ - public static Plugin[] readPluginsForUpdate() throws Exception { + public static List readPluginsForUpdate() throws Exception { String resText = null; String url = SiteCenter.getInstance().acquireUrlByKind("plugin.update"); if (StringUtils.isNotEmpty(url)) { HashMap para = new HashMap(); - para.put("plugins", PluginLoader.getLoader().pluginsToString()); + para.put("plugins", PluginUtils.transPluginsToString(PluginManager.getContexts())); //只有当前设计器的jar高于插件新版本需要的jarTime时, 才提示更新该插件. para.put("jarTime", GeneralUtils.readBuildNO()); HttpClient httpClient = new HttpClient(url, para); @@ -77,22 +60,25 @@ public class PluginsReaderFromStore { String charSet = EncodeConstants.ENCODING_UTF_8; resText = URLDecoder.decode(URLDecoder.decode(resText, charSet), charSet); } + return parseResText(resText, pluginsToUpdate); + } + + private static List parseResText(String resText, Set plugins) throws Exception { if (StringUtils.isNotEmpty(resText)) { try { - pluginsToUpdate.clear(); + plugins.clear(); JSONArray jsonArray = new JSONArray(resText); for (int i = 0, size = jsonArray.length(); i < size; i++) { - Plugin plugin = new Plugin(); - plugin.parseJSON(jsonArray.optJSONObject(i)); - if (plugin.isValidate()) { - pluginsToUpdate.add(plugin); + PluginView pluginView = PluginViewReader.readFromJson(jsonArray.optJSONObject(i)); + if (PluginOperateUtils.pluginValidate(pluginView)) { + plugins.add(pluginView); } } } catch (JSONException e) { throw new Exception(Inter.getLocText("FR-Designer-Plugin_Read_Plugin_List_Error")); } } - return pluginsToUpdate.toArray(new Plugin[pluginsToUpdate.size()]); + return new ArrayList<>(plugins); } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/extra/exe/GetLoginInfoExecutor.java b/designer_base/src/com/fr/design/extra/exe/GetLoginInfoExecutor.java deleted file mode 100644 index f65dd1584..000000000 --- a/designer_base/src/com/fr/design/extra/exe/GetLoginInfoExecutor.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.fr.design.extra.exe; - -import com.fr.design.DesignerEnvManager; -import com.fr.design.extra.Process; -import com.fr.plugin.manage.bbs.BBSPluginLogin; -import com.fr.stable.StringUtils; - -/** - * Created by lp on 2016/8/16. - */ -public class GetLoginInfoExecutor implements Executor { - private String result = "[]"; - - @Override - public String getTaskFinishMessage() { - return result; - } - - @Override - public Command[] getCommands() { - return new Command[]{ - new Command() { - @Override - public String getExecuteMessage() { - return null; - } - - @Override - public void run(Process process) { - String username = BBSPluginLogin.getInstance().getUserInfo().getUserName(); - String inShowUsername = DesignerEnvManager.getEnvManager().getInShowBBsName(); - if (StringUtils.isEmpty(username) && StringUtils.isEmpty(inShowUsername)) { - return; - }else { - result = StringUtils.isEmpty(inShowUsername) ? username : inShowUsername; - } - } - } - }; - } -} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java b/designer_base/src/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java deleted file mode 100644 index c90521316..000000000 --- a/designer_base/src/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.fr.design.extra.exe; - -import com.fr.design.extra.PluginConstants; -import com.fr.design.extra.Process; -import com.fr.general.SiteCenter; -import com.fr.general.http.HttpClient; - -/** - * Created by vito on 16/5/16. - */ -public class GetPluginCategoriesExecutor implements Executor { - private String result = "[]"; - - @Override - public String getTaskFinishMessage() { - return result; - } - - @Override - public Command[] getCommands() { - return new Command[]{ - new Command() { - @Override - public String getExecuteMessage() { - return null; - } - - @Override - public void run(Process process) { - String url = SiteCenter.getInstance().acquireUrlByKind("plugin.category"); - if (url != null) { - HttpClient httpClient = new HttpClient(url); - result = httpClient.getResponseText(); - } else { - result = PluginConstants.CONNECTION_404; - } - } - } - }; - } -} diff --git a/designer_base/src/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java b/designer_base/src/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java deleted file mode 100644 index a276d386c..000000000 --- a/designer_base/src/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.fr.design.extra.exe; - -import com.fr.design.extra.PluginConstants; -import com.fr.design.extra.Process; -import com.fr.general.FRLogger; -import com.fr.general.SiteCenter; -import com.fr.general.http.HttpClient; -import com.fr.stable.StringUtils; - -/** - * Created by vito on 16/4/18. - * 获取插件分类信息 - */ -public class GetPluginFromStoreExecutor implements Executor { - private String result = "[]"; - private String category; - private String seller; - private String fee; - - public GetPluginFromStoreExecutor(String category, String seller, String fee) { - this.category = category; - this.seller = seller; - this.fee = fee; - } - - @Override - public String getTaskFinishMessage() { - return result; - } - - @Override - public Command[] getCommands() { - return new Command[]{ - new Command() { - @Override - public String getExecuteMessage() { - return StringUtils.EMPTY; - } - - @Override - public void run(Process process) { - String plistUrl = SiteCenter.getInstance().acquireUrlByKind("plugin.plist"); - if (StringUtils.isNotBlank(plistUrl)) { - StringBuilder url = new StringBuilder(); - url.append(plistUrl); - if (StringUtils.isNotBlank(category)) { - url.append("&cid=").append(category.split("-")[1]); - } - if (StringUtils.isNotBlank(seller)) { - url.append("&seller=").append(seller.split("-")[1]); - } - if (StringUtils.isNotBlank(fee)) { - url.append("&fee=").append(fee.split("-")[1]); - } - try { - HttpClient httpClient = new HttpClient(url.toString()); - result = httpClient.getResponseText(); - } catch (Exception e) { - FRLogger.getLogger().error(e.getMessage()); - } - } else { - result = PluginConstants.CONNECTION_404; - } - } - } - }; - } -} diff --git a/designer_base/src/com/fr/design/extra/exe/InstallFromDiskExecutor.java b/designer_base/src/com/fr/design/extra/exe/InstallFromDiskExecutor.java deleted file mode 100644 index 3d5629a3c..000000000 --- a/designer_base/src/com/fr/design/extra/exe/InstallFromDiskExecutor.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.fr.design.extra.exe; - -import com.fr.design.extra.Process; -import com.fr.general.FRLogger; -import com.fr.general.Inter; -import com.fr.plugin.error.PluginErrorCode; -import com.fr.plugin.manage.PluginManager; -import com.fr.plugin.manage.control.PluginTaskResult; -import com.fr.plugin.manage.control.ProgressCallback; - -import javax.swing.*; -import java.io.File; - -/** - * Created by richie on 16/3/19. - */ -public class InstallFromDiskExecutor implements Executor { - private String filePath; - - public InstallFromDiskExecutor(String filePath) { - this.filePath = filePath; - - } - - @Override - public String getTaskFinishMessage() { - return Inter.getLocText("FR-Designer-Plugin_Success_Install"); - } - - @Override - public Command[] getCommands() { - return new Command[]{ - new Command() { - @Override - public String getExecuteMessage() { - return Inter.getLocText("FR-Designer-Plugin_Unzipping") + filePath; - } - - @Override - public void run(Process process) { - - } - }, - new Command() { - @Override - public String getExecuteMessage() { - return Inter.getLocText("FR-Designer-Plugin_Installing"); - } - - @Override - public void run(Process process) { - PluginManager.getController().install(new File(filePath), new ProgressCallback() { - @Override - public void updateProgress(String description, double progress) { - } - @Override - public void done(PluginTaskResult result) { - if (result.isSuccess()) { - FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); - } else if(result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()){ - int rv = JOptionPane.showOptionDialog( - null, - Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), - Inter.getLocText("FR-Designer-Plugin_Warning"), - JOptionPane.YES_NO_CANCEL_OPTION, - JOptionPane.INFORMATION_MESSAGE, - null, - null, - null - ); - if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) { - return; - } - installWithDependence(); - }else{ - FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Failed")); - JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } - } - }); - } - } - }; - } - - public void installWithDependence(){ - PluginManager.getController().install(new File(filePath), new ProgressCallback() { - @Override - public void updateProgress(String description, double progress) { - } - @Override - public void done(PluginTaskResult result) { - if (result.isSuccess()) { - FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else{ - FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Failed")); - JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } - } - }); - } -} diff --git a/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java b/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java deleted file mode 100644 index 42f7be72d..000000000 --- a/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.fr.design.extra.exe; - -import com.fr.design.extra.LoginCheckContext; -import com.fr.design.extra.PluginUtils; -import com.fr.design.extra.Process; -import com.fr.general.FRLogger; -import com.fr.general.Inter; -import com.fr.plugin.context.PluginMarker; -import com.fr.plugin.error.PluginErrorCode; -import com.fr.plugin.manage.PluginManager; -import com.fr.plugin.manage.bbs.BBSPluginLogin; -import com.fr.plugin.manage.control.PluginTaskResult; -import com.fr.plugin.manage.control.ProgressCallback; - -import javax.swing.*; - -/** - * Created by richie on 16/3/19. - */ -public class InstallOnlineExecutor implements Executor { - - private String pluginInfo; - - public InstallOnlineExecutor(String pluginInfo) { - this.pluginInfo = pluginInfo; - } - - @Override - public String getTaskFinishMessage() { - return "task succeed"; - } - - @Override - public Command[] getCommands() { - return new Command[]{ - new Command() { - @Override - public String getExecuteMessage() { - return Inter.getLocText("FR-Designer-Plugin_Downloading") + ":" + pluginInfo.split("_")[0]; - } - - @Override - public void run(final Process process) { - //下载插件 - if (!BBSPluginLogin.getInstance().hasLogin()) { - LoginCheckContext.fireLoginCheckListener(); - } - PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); - if (BBSPluginLogin.getInstance().hasLogin()) { - PluginManager.getController().download(pluginMarker, new ProgressCallback() { - @Override - public void updateProgress(String description, double aProgress) { -// process.process(Math.round(aProgress * 100) + "%"); - } - - @Override - public void done(PluginTaskResult result) { - if (result.isSuccess()) { - installPlugin(pluginMarker); - } else { - JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } - } - }); - - } - } - } - }; - } - - public void installPlugin(PluginMarker pluginMarker) { - PluginManager.getController().install(pluginMarker, new ProgressCallback() { - @Override - public void updateProgress(String description, double progress) { - - } - - @Override - public void done(PluginTaskResult result) { - if (result.isSuccess()) { - FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { - int rv = JOptionPane.showOptionDialog( - null, - Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Success")), - Inter.getLocText("FR-Designer-Plugin_Install_Dependence"), - JOptionPane.YES_NO_CANCEL_OPTION, - JOptionPane.INFORMATION_MESSAGE, - null, - null, - null - ); - if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) { - return; - } - installPluginWithDependence(pluginMarker); - } else { - JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } - } - }); - } - - public void installPluginWithDependence(PluginMarker pluginMarker) { - PluginManager.getController().install(pluginMarker, new ProgressCallback() { - @Override - public void updateProgress(String description, double progress) { - } - - @Override - public void done(PluginTaskResult result) { - if (result.isSuccess()) { - FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else { - FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Failed")); - JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } - } - }); - } -} diff --git a/designer_base/src/com/fr/design/extra/exe/ModifyStatusExecutor.java b/designer_base/src/com/fr/design/extra/exe/ModifyStatusExecutor.java deleted file mode 100644 index 0f1c6405d..000000000 --- a/designer_base/src/com/fr/design/extra/exe/ModifyStatusExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.fr.design.extra.exe; - -import com.fr.design.extra.PluginUtils; -import com.fr.design.extra.Process; -import com.fr.general.Inter; -import com.fr.plugin.context.PluginContext; -import com.fr.plugin.context.PluginMarker; -import com.fr.plugin.manage.PluginManager; -import com.fr.plugin.manage.control.PluginTaskCallback; -import com.fr.plugin.manage.control.PluginTaskResult; -import com.fr.stable.StringUtils; - -import javax.swing.*; - -/** - * Created by richie on 16/3/19. - */ -public class ModifyStatusExecutor implements Executor { - - private String pluginInfo; - private boolean active; - private PluginContext plugin; - - public ModifyStatusExecutor(String pluginInfo) { - this.pluginInfo = pluginInfo; - } - - @Override - public String getTaskFinishMessage() { - return plugin.isActive() ? Inter.getLocText("FR-Designer-Plugin_Has_Been_Actived") : Inter.getLocText("FR-Designer-Plugin_Has_Been_Disabled"); - } - - @Override - public Command[] getCommands() { - return new Command[]{ - new Command() { - @Override - public String getExecuteMessage() { - return StringUtils.EMPTY; - } - - @Override - public void run(Process process) { - PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); - plugin = PluginManager.getContext(pluginMarker); - active = !plugin.isActive(); - if (active) { - PluginManager.getController().forbid(pluginMarker, new PluginTaskCallback() { - @Override - public void done(PluginTaskResult result) { - if (result.isSuccess()) { - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Has_Been_Disabled")); - } else { - JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } - } - }); - } else { - PluginManager.getController().enable(pluginMarker, new PluginTaskCallback() { - @Override - public void done(PluginTaskResult result) { - if (result.isSuccess()) { - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Has_Been_Actived")); - } else { - JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } - } - }); - } - } - } - }; - } -} diff --git a/designer_base/src/com/fr/design/extra/exe/PluginLoginExecutor.java b/designer_base/src/com/fr/design/extra/exe/PluginLoginExecutor.java deleted file mode 100644 index c1101f800..000000000 --- a/designer_base/src/com/fr/design/extra/exe/PluginLoginExecutor.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.fr.design.extra.exe; - -import com.fr.design.extra.LoginWebBridge; -import com.fr.design.extra.Process; -import com.fr.design.gui.ilable.UILabel; - -/** - * Created by Slpire on 2016/11/7. - */ -public class PluginLoginExecutor implements Executor { - - private String result = "[]"; - - private String username; - private String password; - private UILabel uiLabel; - - public PluginLoginExecutor(String username, String password, UILabel uiLabel) { - this.username = username; - this.password = password; - this.uiLabel = uiLabel; - } - - @Override - public String getTaskFinishMessage() { - return result; - } - - @Override - public Command[] getCommands() { - return new Command[] { - new Command() { - @Override - public String getExecuteMessage() { - return null; - } - - @Override - public void run(Process process) { - String loginResult = LoginWebBridge.getHelper().login(username, password, uiLabel); - if (Integer.valueOf(loginResult) == 0) { - LoginWebBridge.getHelper().updateMessageCount(); - } - result = loginResult; - } - } - }; - } -} diff --git a/designer_base/src/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java b/designer_base/src/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java deleted file mode 100644 index 9bcfce699..000000000 --- a/designer_base/src/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.fr.design.extra.exe; - -import com.fr.design.extra.PluginReaderForDesigner; -import com.fr.design.extra.Process; -import com.fr.general.FRLogger; -import com.fr.stable.StringUtils; -import org.json.JSONArray; -import org.json.JSONObject; - -/** - * Created by vito on 16/4/19. - */ -public class ReadUpdateOnlineExecutor implements Executor { - private String[] plugins; - private String result; - - @Override - public String getTaskFinishMessage() { - return result; - } - - @Override - public Command[] getCommands() { - return new Command[]{ - new Command() { - @Override - public String getExecuteMessage() { - return StringUtils.EMPTY; - } - - @Override - public void run(Process process) { - try { - plugins = PluginReaderForDesigner.readPluginsForUpdate(); - JSONArray jsonArray = new JSONArray(); - for (String plugin : plugins) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("pluginid", plugin); - jsonArray.put(jsonObject); - } - result = jsonArray.toString(); - } catch (Exception e) { - FRLogger.getLogger().error(e.getMessage()); - } - } - } - }; - } -} diff --git a/designer_base/src/com/fr/design/extra/exe/SearchOnlineExecutor.java b/designer_base/src/com/fr/design/extra/exe/SearchOnlineExecutor.java deleted file mode 100644 index 089173c98..000000000 --- a/designer_base/src/com/fr/design/extra/exe/SearchOnlineExecutor.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.fr.design.extra.exe; - -import com.fr.design.extra.Process; -import com.fr.general.FRLogger; -import com.fr.general.SiteCenter; -import com.fr.general.http.HttpClient; -import com.fr.stable.StringUtils; - -/** - * Created by vito on 16/4/18. - */ -public class SearchOnlineExecutor implements Executor { - private String result; - private String keyword; - - public SearchOnlineExecutor(String keyword) { - this.keyword = keyword; - } - - @Override - public String getTaskFinishMessage() { - return result; - } - - @Override - public Command[] getCommands() { - return new Command[]{ - new Command() { - @Override - public String getExecuteMessage() { - return StringUtils.EMPTY; - } - - @Override - public void run(Process process) { - try { - HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("plugin.plist") + "&keyword=" + keyword); - result = httpClient.getResponseText(); - - } catch (Exception e) { - FRLogger.getLogger().error(e.getMessage()); - } - } - } - }; - } -} diff --git a/designer_base/src/com/fr/design/extra/exe/UninstallExecutor.java b/designer_base/src/com/fr/design/extra/exe/UninstallExecutor.java deleted file mode 100644 index 79d34bf21..000000000 --- a/designer_base/src/com/fr/design/extra/exe/UninstallExecutor.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.fr.design.extra.exe; - -import com.fr.design.extra.PluginUtils; -import com.fr.design.extra.Process; -import com.fr.general.FRLogger; -import com.fr.general.Inter; -import com.fr.plugin.context.PluginMarker; -import com.fr.plugin.manage.PluginManager; -import com.fr.plugin.manage.control.PluginTaskCallback; -import com.fr.plugin.manage.control.PluginTaskResult; - -import javax.swing.*; - -/** - * Created by richie on 16/3/19. - */ -public class UninstallExecutor implements Executor { - - private String pluginInfo; - private boolean isForce; - private String result = "undo"; - - public UninstallExecutor(String pluginInfo, boolean isForce) { - this.pluginInfo = pluginInfo; - this.isForce = isForce; - } - - @Override - public String getTaskFinishMessage() { - return result; - } - - @Override - public Command[] getCommands() { - return new Command[]{ - new Command() { - @Override - public String getExecuteMessage() { - return null; - } - - @Override - public void run(Process process) { - PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); - PluginManager.getController().uninstall(pluginMarker, isForce, new PluginTaskCallback() { - @Override - public void done(PluginTaskResult pluginTaskResult) { - if (pluginTaskResult.isSuccess()) { - result = "done"; - FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Delete_Success")); - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else { - FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Delete_Failed")); - JOptionPane.showMessageDialog(null, pluginTaskResult.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } - } - }); - } - } - }; - } -} diff --git a/designer_base/src/com/fr/design/extra/exe/UpdateFromDiskExecutor.java b/designer_base/src/com/fr/design/extra/exe/UpdateFromDiskExecutor.java deleted file mode 100644 index 8be5a3834..000000000 --- a/designer_base/src/com/fr/design/extra/exe/UpdateFromDiskExecutor.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.fr.design.extra.exe; - -import com.fr.design.extra.Process; -import com.fr.general.FRLogger; -import com.fr.general.Inter; -import com.fr.plugin.error.PluginErrorCode; -import com.fr.plugin.manage.PluginManager; -import com.fr.plugin.manage.control.PluginTaskResult; -import com.fr.plugin.manage.control.ProgressCallback; - -import javax.swing.*; -import java.io.File; - -/** - * Created by richie on 16/3/19. - */ -public class UpdateFromDiskExecutor implements Executor { - - private String filePath; - - public UpdateFromDiskExecutor(String filePath) { - this.filePath = filePath; - } - - @Override - public String getTaskFinishMessage() { - return Inter.getLocText("FR-Designer-Plugin_Update_End"); - } - - @Override - public Command[] getCommands() { - return new Command[]{ - new Command() { - @Override - public String getExecuteMessage() { - return null; - } - - @Override - public void run(Process process) { - PluginManager.getController().update(new File(filePath), new ProgressCallback() { - @Override - public void updateProgress(String description, double progress) { - - } - - @Override - public void done(PluginTaskResult result) { - if (result.isSuccess()) { - FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Update_Success")); - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { - updatePluginWithDependence(); - } else { - JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } - } - }); - } - } - }; - } - - public void updatePluginWithDependence() { - PluginManager.getController().update(new File(filePath), new ProgressCallback() { - @Override - public void updateProgress(String description, double progress) { - - } - - @Override - public void done(PluginTaskResult result) { - if (result.isSuccess()) { - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else { - JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } - } - }); - } -} diff --git a/designer_base/src/com/fr/design/extra/exe/UpdateOnlineExecutor.java b/designer_base/src/com/fr/design/extra/exe/UpdateOnlineExecutor.java deleted file mode 100644 index c8f1fc778..000000000 --- a/designer_base/src/com/fr/design/extra/exe/UpdateOnlineExecutor.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.fr.design.extra.exe; - -import com.fr.base.FRContext; -import com.fr.design.DesignerEnvManager; -import com.fr.design.extra.*; -import com.fr.design.extra.Process; -import com.fr.general.FRLogger; -import com.fr.general.Inter; -import com.fr.json.JSONObject; -import com.fr.plugin.context.PluginMarker; -import com.fr.plugin.error.PluginErrorCode; -import com.fr.plugin.manage.PluginManager; -import com.fr.plugin.manage.bbs.BBSPluginLogin; -import com.fr.plugin.manage.control.PluginTaskResult; -import com.fr.plugin.manage.control.ProgressCallback; -import com.fr.stable.StringUtils; - -import javax.swing.*; -import java.util.ArrayList; -import java.util.List; - -/** - * Created by richie on 16/3/19. - */ -public class UpdateOnlineExecutor implements Executor { - - private String[] pluginInfos; - private static final int PERCENT_100 = 100; - - public UpdateOnlineExecutor(String[] pluginInfos) { - this.pluginInfos = pluginInfos; - } - - @Override - public String getTaskFinishMessage() { - return "task succeed"; - } - - @Override - public Command[] getCommands() { - return new Command[]{ - new Command() { - @Override - public String getExecuteMessage() { - return null; - } - - @Override - public void run(Process process) { - if (!(BBSPluginLogin.getInstance().hasLogin())){ - LoginCheckContext.fireLoginCheckListener(); - } - if (BBSPluginLogin.getInstance().hasLogin()) { - List pluginMarkerList = new ArrayList(); - for (int i = 0; i < pluginInfos.length; i++) { - pluginMarkerList.add(PluginUtils.createPluginMarker(pluginInfos[i])); - } - updatePlugins(pluginMarkerList, process); } - } - } - }; - } - - public void updatePluginWithDependence(PluginMarker pluginMarker, PluginMarker toMarker) { - PluginManager.getController().update(pluginMarker, toMarker, new ProgressCallback() { - @Override - public void updateProgress(String description, double progress) { - - } - - @Override - public void done(PluginTaskResult result) { - if (result.isSuccess()) { - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else { - JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } - } - }); - } - - public void updatePlugins(List pluginMarkerList, Process process) { - for (int i = 0; i < pluginMarkerList.size(); i++) { - try { - int a = i; - //todo check下此插件的最新版本 - String latestPluginInfo = PluginUtils.getLatestPluginInfo(pluginMarkerList.get(i).getPluginID()); - if (StringUtils.isEmpty(latestPluginInfo) || PluginConstants.CONNECTION_404.equals(latestPluginInfo)) { - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Connect_Failed"), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - return; - } - JSONObject resultArr = new JSONObject(latestPluginInfo); - String latestPluginVersion = (String) resultArr.get("version"); - PluginManager.getController().update(pluginMarkerList.get(i), PluginMarker.create(pluginMarkerList.get(i).getPluginID(), latestPluginVersion), new ProgressCallback() { - @Override - public void updateProgress(String description, double progress) { - process.process(PERCENT_100 / pluginMarkerList.size() * (a + 1) + "%"); - - } - - @Override - public void done(PluginTaskResult result) { - if (result.isSuccess()) { - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { - updatePluginWithDependence(pluginMarkerList.get(a), PluginMarker.create(pluginMarkerList.get(a).getPluginID(), latestPluginVersion)); - } else { - JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - } - } - }); - } catch (Exception e) { - FRContext.getLogger().error(e.getMessage(), e); - } - } - } - -} diff --git a/designer_base/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java index c641c622f..3f13f531d 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java @@ -10,7 +10,6 @@ import com.fr.plugin.manage.control.ProgressCallback; public abstract class AbstractPluginTaskCallback implements ProgressCallback{ protected PluginMarker pluginMarker; - protected JSCallback jsCallback; @Override public void updateProgress(String description, double aProgress) { diff --git a/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java index d12f50592..ba4d9b31f 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java @@ -11,6 +11,7 @@ import javax.swing.*; */ public class DownloadCallback extends AbstractPluginTaskCallback { private ExtraPluginTask extraPluginTask; + protected JSCallback jsCallback; public DownloadCallback(ExtraPluginTask extraPluginTask, JSCallback jsCallback) { this.extraPluginTask = extraPluginTask; @@ -24,6 +25,7 @@ public class DownloadCallback extends AbstractPluginTaskCallback { @Override public void done(PluginTaskResult result) { + jsCallback.execute("done"); if (result.isSuccess()) { extraPluginTask.doExtraPluginTask(); } else { diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java index 035ebbf32..cf13dd0a5 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java @@ -14,6 +14,7 @@ import java.io.File; */ public class InstallFromDiskCallback extends AbstractPluginTaskCallback { private File zipFile; + protected JSCallback jsCallback; public InstallFromDiskCallback(File zipFile, JSCallback jsCallback) { this.zipFile = zipFile; @@ -28,14 +29,15 @@ public class InstallFromDiskCallback extends AbstractPluginTaskCallback { @Override public void done(PluginTaskResult result) { + jsCallback.execute("done"); if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { int rv = JOptionPane.showOptionDialog( null, - Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Success")), - Inter.getLocText("FR-Designer-Plugin_Install_Dependence"), + Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), + Inter.getLocText("FR-Designer-Plugin_Install_Success"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java index 8649b5cd3..a1ee0ee4c 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java @@ -13,6 +13,8 @@ import javax.swing.*; * Created by ibm on 2017/5/26. */ public class InstallOnlineCallback extends AbstractPluginTaskCallback { + protected JSCallback jsCallback; + public InstallOnlineCallback(PluginMarker pluginMarker, JSCallback jsCallback){ this.pluginMarker = pluginMarker; @@ -27,14 +29,15 @@ public class InstallOnlineCallback extends AbstractPluginTaskCallback { @Override public void done(PluginTaskResult result) { + jsCallback.execute("done"); if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { int rv = JOptionPane.showOptionDialog( null, - Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Success")), - Inter.getLocText("FR-Designer-Plugin_Install_Dependence"), + Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), + Inter.getLocText("FR-Designer-Plugin_Install_Success"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, diff --git a/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java index 5ee99a69c..8204a88eb 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java @@ -1,5 +1,6 @@ package com.fr.design.extra.exe.callback; +import com.fr.stable.StringUtils; import javafx.scene.web.WebEngine; import netscape.javascript.JSObject; @@ -16,7 +17,7 @@ public class JSCallback { } public void execute(String newValue) { - String fun = "(" + callback + ")(\"" + newValue + "\")"; + String fun = "(" + callback + ")(\"" + trimText(newValue) + "\")"; try { webEngine.executeScript(fun); } catch (Exception e) { @@ -24,6 +25,34 @@ public class JSCallback { } } + public void execute(double progress) { + String fun = "(" + callback + ")(\"" + trimText(String.valueOf(progress)) + "\")"; + try { + webEngine.executeScript(fun); + } catch (Exception e) { + webEngine.executeScript("alert(\"" + e.getMessage() + "\")"); + } + } + + /** + * vito:由于使用webEngine.executeScript("(" + callback + ")(\"" + newValue + "\")") + * 执行脚本,所以原来规范的json格式也会在拼接字符串后可能抛出参数异常,需要转换掉一些会造成错误的特殊字符, + * 选择在java端替换的原因是异常抛出自executeScript方法的参数. + *

    + * 1.""中的""必须转义 + * 2.js字符串中的\n会导致js字符串变成多行,而js字符串不支持多行拼接 + * 3.由JSONObject.toString()得到的字符串中html标签的属性会自动加上\造成替换难度加大, + * 这边建议去除所有的html标签 + * + * @param old 原始字符串 + * @return 处理之后的字符串 + */ + private String trimText(String old) { + if (StringUtils.isNotBlank(old)) { + return old.replaceAll("\n", "").replaceAll("\"", "\\\\\"").replaceAll("\'", "\\\\\'"); + } + return StringUtils.EMPTY; + } } diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UnistallPluginCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UnistallPluginCallback.java index 66282df9d..851c9e4e4 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/UnistallPluginCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/UnistallPluginCallback.java @@ -4,7 +4,6 @@ import com.fr.general.FRLogger; import com.fr.general.Inter; import com.fr.plugin.manage.control.PluginTaskCallback; import com.fr.plugin.manage.control.PluginTaskResult; -import sun.plugin2.main.server.Plugin; import javax.swing.*; diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java index 390598835..0f79a1614 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java @@ -2,7 +2,6 @@ package com.fr.design.extra.exe.callback; import com.fr.general.FRLogger; import com.fr.general.Inter; -import com.fr.general.jsqlparser.expression.StringValue; import com.fr.plugin.error.PluginErrorCode; import com.fr.plugin.manage.PluginManager; import com.fr.plugin.manage.control.PluginTaskResult; @@ -15,8 +14,9 @@ import java.io.File; */ public class UpdateFromDiskCallback extends AbstractPluginTaskCallback { private File zipFile; + protected JSCallback jsCallback; - public UpdateFromDiskCallback(File zipFile,JSCallback jsCallback) { + public UpdateFromDiskCallback(File zipFile, JSCallback jsCallback) { this.zipFile = zipFile; this.jsCallback = jsCallback; } @@ -29,14 +29,15 @@ public class UpdateFromDiskCallback extends AbstractPluginTaskCallback { @Override public void done(PluginTaskResult result) { + jsCallback.execute("done"); if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { int rv = JOptionPane.showOptionDialog( null, - Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Success")), - Inter.getLocText("FR-Designer-Plugin_Install_Dependence"), + Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), + Inter.getLocText("FR-Designer-Plugin_Install_Success"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java index cce4934b6..65a71a80c 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java @@ -14,9 +14,9 @@ import javax.swing.*; */ public class UpdateOnlineCallback extends AbstractPluginTaskCallback { public PluginMarker toPluginMarker; + protected JSCallback jsCallback; - - public UpdateOnlineCallback(PluginMarker pluginMarker , PluginMarker toPluginMarker, JSCallback jsCallback) { + public UpdateOnlineCallback(PluginMarker pluginMarker, PluginMarker toPluginMarker, JSCallback jsCallback) { this.pluginMarker = pluginMarker; this.toPluginMarker = toPluginMarker; this.jsCallback = jsCallback; @@ -29,14 +29,15 @@ public class UpdateOnlineCallback extends AbstractPluginTaskCallback { @Override public void done(PluginTaskResult result) { + jsCallback.execute("done"); if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Update_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { int rv = JOptionPane.showOptionDialog( null, - Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Success")), - Inter.getLocText("FR-Designer-Plugin_Install_Dependence"), + Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), + Inter.getLocText("FR-Designer-Plugin_Install_Success"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, diff --git a/designer_base/src/com/fr/design/extra/exe/extratask/AbstractExtraPluginTask.java b/designer_base/src/com/fr/design/extra/exe/extratask/AbstractExtraPluginTask.java new file mode 100644 index 000000000..22cd8c826 --- /dev/null +++ b/designer_base/src/com/fr/design/extra/exe/extratask/AbstractExtraPluginTask.java @@ -0,0 +1,11 @@ +package com.fr.design.extra.exe.extratask; + +import com.fr.design.extra.exe.callback.JSCallback; +import com.fr.plugin.context.PluginMarker; + +/** + * Created by ibm on 2017/5/27. + */ +public abstract class AbstractExtraPluginTask implements ExtraPluginTask { + protected PluginMarker pluginMarker; +} diff --git a/designer_base/src/com/fr/design/extra/exe/extratask/InstallPluginTask.java b/designer_base/src/com/fr/design/extra/exe/extratask/InstallPluginTask.java index 4ae1fe381..37ac42d4d 100644 --- a/designer_base/src/com/fr/design/extra/exe/extratask/InstallPluginTask.java +++ b/designer_base/src/com/fr/design/extra/exe/extratask/InstallPluginTask.java @@ -6,18 +6,19 @@ import com.fr.design.extra.exe.callback.JSCallback; import com.fr.plugin.context.PluginMarker; import com.fr.plugin.manage.PluginManager; -import javax.swing.*; /** * Created by ibm on 2017/5/27. */ -public class InstallPluginTask implements ExtraPluginTask{ - public PluginMarker pluginMarker; - public JSCallback jsCallback; - public InstallPluginTask(PluginMarker pluginMarker, JSCallback jsCallback){ +public class InstallPluginTask extends AbstractExtraPluginTask { + protected JSCallback jsCallback; + + + public InstallPluginTask(PluginMarker pluginMarker, JSCallback jsCallback) { this.pluginMarker = pluginMarker; this.jsCallback = jsCallback; } + @Override public void doExtraPluginTask() { PluginManager.getController().install(pluginMarker, new InstallOnlineCallback(pluginMarker, jsCallback)); diff --git a/designer_base/src/com/fr/design/extra/exe/extratask/UpdatePluginTask.java b/designer_base/src/com/fr/design/extra/exe/extratask/UpdatePluginTask.java index c79ea114a..7cfdf9622 100644 --- a/designer_base/src/com/fr/design/extra/exe/extratask/UpdatePluginTask.java +++ b/designer_base/src/com/fr/design/extra/exe/extratask/UpdatePluginTask.java @@ -2,20 +2,18 @@ package com.fr.design.extra.exe.extratask; import com.fr.design.extra.exe.callback.JSCallback; import com.fr.design.extra.exe.callback.UpdateOnlineCallback; -import com.fr.form.ui.WaterMark; import com.fr.plugin.context.PluginMarker; import com.fr.plugin.manage.PluginManager; /** * Created by ibm on 2017/5/27. */ -public class UpdatePluginTask implements ExtraPluginTask { +public class UpdatePluginTask extends AbstractExtraPluginTask { - public PluginMarker pluginMarker; public PluginMarker toPluginMarker; - public JSCallback jsCallback; + protected JSCallback jsCallback; - public UpdatePluginTask(PluginMarker pluginMarker, PluginMarker toPluginMarker, JSCallback jsCallback){ + public UpdatePluginTask(PluginMarker pluginMarker, PluginMarker toPluginMarker, JSCallback jsCallback) { this.pluginMarker = pluginMarker; this.toPluginMarker = toPluginMarker; this.jsCallback = jsCallback; diff --git a/designer_base/src/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java b/designer_base/src/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java new file mode 100644 index 000000000..bac8d080a --- /dev/null +++ b/designer_base/src/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java @@ -0,0 +1,55 @@ +package com.fr.design.extra.tradition.callback; + +import com.fr.design.extra.PluginStatusCheckCompletePane; +import com.fr.general.FRLogger; +import com.fr.general.Inter; +import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.error.PluginErrorCode; +import com.fr.plugin.manage.PluginManager; +import com.fr.plugin.manage.control.PluginTaskResult; +import com.fr.plugin.manage.control.ProgressCallback; + +import javax.swing.*; + +/** + * Created by ibm on 2017/5/31. + */ +public class UpdateOnlineCallback implements ProgressCallback { + private PluginStatusCheckCompletePane pane; + private PluginMarker pluginMarker; + private PluginMarker toPluginMarker; + + public UpdateOnlineCallback(PluginMarker pluginMarker, PluginMarker toPluginMarker, PluginStatusCheckCompletePane pane){ + this.pluginMarker = pluginMarker; + this.toPluginMarker = toPluginMarker; + this.pane = pane; + } + public void updateProgress(String description, double progress){ + pane.setProgress(progress); + } + + public void done(PluginTaskResult result){ + if (result.isSuccess()) { + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Update_Success")); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { + int rv = JOptionPane.showOptionDialog( + null, + Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), + Inter.getLocText("FR-Designer-Plugin_Install_Success"), + JOptionPane.YES_NO_CANCEL_OPTION, + JOptionPane.INFORMATION_MESSAGE, + null, + null, + null + ); + if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) { + return; + } + PluginManager.getController().update(pluginMarker, toPluginMarker, new UpdateOnlineCallback(pluginMarker, toPluginMarker, pane)); + } else { + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Delete_Failed")); + JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } + } +} From eca6b16c621fc2cba9b43fcecffe59408f0d216f Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Wed, 31 May 2017 17:20:17 +0800 Subject: [PATCH 24/54] merge chart : ba-9.0 => pf-9.0 --- .../ChartTypeInterfaceCloseableHandler.java | 31 ------------------- 1 file changed, 31 deletions(-) delete mode 100644 designer_chart/src/com/fr/design/extra/ChartTypeInterfaceCloseableHandler.java diff --git a/designer_chart/src/com/fr/design/extra/ChartTypeInterfaceCloseableHandler.java b/designer_chart/src/com/fr/design/extra/ChartTypeInterfaceCloseableHandler.java deleted file mode 100644 index 8e9715574..000000000 --- a/designer_chart/src/com/fr/design/extra/ChartTypeInterfaceCloseableHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.fr.design.extra; - -import com.fr.chart.charttypes.ChartTypeManager; -import com.fr.plugin.proxy.CloseableInvocationHandler; - -/** - * Created by juhaoyu on 2016/12/27. - */ -public class ChartTypeInterfaceCloseableHandler extends CloseableInvocationHandler { - - - private final String plotID; - - public ChartTypeInterfaceCloseableHandler(String plotID) throws NoSuchMethodException { - - super(); - this.plotID = plotID; - } - - @Override - protected boolean invokeIsClosed() { - - //UI对应的chart如果关闭或者不存在,则UI关闭 - return super.invokeIsClosed() || !containsChart(); - } - - private boolean containsChart() { - - return ChartTypeManager.getInstance().containsPlot(plotID); - } -} From e574304306f716d124c9de31501d82d5ce75f15d Mon Sep 17 00:00:00 2001 From: kerry Date: Thu, 1 Jun 2017 10:24:41 +0800 Subject: [PATCH 25/54] =?UTF-8?q?REPORT-2354=20=E5=B0=86=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86=E5=92=8C=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=B5=B7=E6=9D=A5(=E6=9A=82=E6=97=B6?= =?UTF-8?q?=E5=85=88=E4=BC=A0=EF=BC=8C=E7=94=A8=E6=9D=A5=E8=B0=83=E8=AF=95?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/extra/PluginWebBridge.java | 10 ++++ .../com/fr/design/extra/WebViewDlgHelper.java | 49 ++++++++++--------- .../extra/exe/callback/DownloadCallback.java | 4 +- .../exe/callback/InstallFromDiskCallback.java | 4 +- .../extratask/AbstractExtraPluginTask.java | 1 - 5 files changed, 39 insertions(+), 29 deletions(-) diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer_base/src/com/fr/design/extra/PluginWebBridge.java index 5c8a45587..be0d9a3ba 100644 --- a/designer_base/src/com/fr/design/extra/PluginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/PluginWebBridge.java @@ -508,4 +508,14 @@ public class PluginWebBridge { DesignerEnvManager.getEnvManager().setInShowBBsName(StringUtils.EMPTY); uiLabel.setText(Inter.getLocText("FR-Base_UnSignIn")); } + public void initExtraDiff(final JSObject callback){ + + } + public void showLoginContent(){ + + } + public boolean isDesigner(){ + return true; + } + } diff --git a/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java b/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java index 8bb7cfc57..bccc259f2 100644 --- a/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java +++ b/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java @@ -33,20 +33,20 @@ public class WebViewDlgHelper { public static void createPluginDialog() { if (StableUtils.getMajorJavaVersion() >= VERSION_8) { - String relativePath = "/scripts/store/web/index.html"; - String mainJsPath = StableUtils.pathJoin(new File(installHome).getAbsolutePath(), relativePath); + String relativePath = "index.html"; + String mainJsPath = StableUtils.pathJoin(FRContext.getCurrentEnv().getWebReportPath(), relativePath); File file = new File(mainJsPath); if (!file.exists()) { - int rv = JOptionPane.showConfirmDialog( - null, - Inter.getLocText("FR-Designer-Plugin_Shop_Need_Install"), - Inter.getLocText("FR-Designer-Plugin_Warning"), - JOptionPane.OK_CANCEL_OPTION, - JOptionPane.INFORMATION_MESSAGE - ); - if (rv == JOptionPane.OK_OPTION) { - downloadShopScripts(SHOP_SCRIPTS); - } +// int rv = JOptionPane.showConfirmDialog( +// null, +// Inter.getLocText("FR-Designer-Plugin_Shop_Need_Install"), +// Inter.getLocText("FR-Designer-Plugin_Warning"), +// JOptionPane.OK_CANCEL_OPTION, +// JOptionPane.INFORMATION_MESSAGE +// ); +// if (rv == JOptionPane.OK_OPTION) { +// downloadShopScripts(SHOP_SCRIPTS); +// } } else { updateShopScripts(SHOP_SCRIPTS); showPluginDlg(mainJsPath); @@ -111,7 +111,7 @@ public class WebViewDlgHelper { } private static void showLoginDlg() { - LoginWebPane webPane = new LoginWebPane(new File(installHome).getAbsolutePath()); + LoginWebPane webPane = new LoginWebPane(FRContext.getCurrentEnv().getWebReportPath()); UIDialog qqdlg = new LoginDialog(DesignerContext.getDesignerFrame(), webPane); LoginWebBridge.getHelper().setDialogHandle(qqdlg); qqdlg.setVisible(true); @@ -153,7 +153,8 @@ public class WebViewDlgHelper { try { if (get()) { - IOUtils.unzip(new File(StableUtils.pathJoin(PluginConstants.DOWNLOAD_PATH, PluginConstants.TEMP_FILE)), StableUtils.getInstallHome()); + IOUtils.unzip(new File(StableUtils.pathJoin(PluginConstants.DOWNLOAD_PATH, PluginConstants.TEMP_FILE)), FRContext.getCurrentEnv().getWebReportPath()); + // TODO: 2017/4/17 删除之前存放在安装目录下的script int rv = JOptionPane.showOptionDialog( null, Inter.getLocText("FR-Designer-Plugin_Shop_Installed"), @@ -184,16 +185,16 @@ public class WebViewDlgHelper { if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { String text = httpClient.getResponseText(); if (!ComparatorUtils.equals(text, LATEST)) { - int rv = JOptionPane.showConfirmDialog( - null, - Inter.getLocText("FR-Designer-Plugin_Shop_Need_Update"), - Inter.getLocText("FR-Designer-Plugin_Warning"), - JOptionPane.OK_CANCEL_OPTION, - JOptionPane.INFORMATION_MESSAGE - ); - if (rv == JOptionPane.OK_OPTION) { - downloadShopScripts(scriptsId); - } +// int rv = JOptionPane.showConfirmDialog( +// null, +// Inter.getLocText("FR-Designer-Plugin_Shop_Need_Update"), +// Inter.getLocText("FR-Designer-Plugin_Warning"), +// JOptionPane.OK_CANCEL_OPTION, +// JOptionPane.INFORMATION_MESSAGE +// ); +// if (rv == JOptionPane.OK_OPTION) { +// downloadShopScripts(scriptsId); +// } } } return null; diff --git a/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java index ba4d9b31f..93ea0fe22 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java @@ -11,9 +11,9 @@ import javax.swing.*; */ public class DownloadCallback extends AbstractPluginTaskCallback { private ExtraPluginTask extraPluginTask; - protected JSCallback jsCallback; + private JSCallback jsCallback; - public DownloadCallback(ExtraPluginTask extraPluginTask, JSCallback jsCallback) { + public DownloadCallback(final ExtraPluginTask extraPluginTask, final JSCallback jsCallback) { this.extraPluginTask = extraPluginTask; this.jsCallback = jsCallback; } diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java index cf13dd0a5..aa74e9c02 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java @@ -14,9 +14,9 @@ import java.io.File; */ public class InstallFromDiskCallback extends AbstractPluginTaskCallback { private File zipFile; - protected JSCallback jsCallback; + private JSCallback jsCallback; - public InstallFromDiskCallback(File zipFile, JSCallback jsCallback) { + public InstallFromDiskCallback(final File zipFile, final JSCallback jsCallback) { this.zipFile = zipFile; this.jsCallback = jsCallback; } diff --git a/designer_base/src/com/fr/design/extra/exe/extratask/AbstractExtraPluginTask.java b/designer_base/src/com/fr/design/extra/exe/extratask/AbstractExtraPluginTask.java index 22cd8c826..a287ca7ed 100644 --- a/designer_base/src/com/fr/design/extra/exe/extratask/AbstractExtraPluginTask.java +++ b/designer_base/src/com/fr/design/extra/exe/extratask/AbstractExtraPluginTask.java @@ -1,6 +1,5 @@ package com.fr.design.extra.exe.extratask; -import com.fr.design.extra.exe.callback.JSCallback; import com.fr.plugin.context.PluginMarker; /** From b2bc24b9ff94d6dd7da52123d73a69992fccda6c Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Thu, 1 Jun 2017 18:27:01 +0800 Subject: [PATCH 26/54] merge --- .../fr/design/extra/exe/callback/InstallFromDiskCallback.java | 2 +- .../com/fr/design/extra/exe/callback/InstallOnlineCallback.java | 2 +- .../fr/design/extra/exe/callback/UpdateFromDiskCallback.java | 2 +- .../com/fr/design/extra/exe/callback/UpdateOnlineCallback.java | 2 +- .../design/extra/tradition/callback/UpdateOnlineCallback.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java index aa74e9c02..26e767eae 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java @@ -33,7 +33,7 @@ public class InstallFromDiskCallback extends AbstractPluginTaskCallback { if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { + } else if (result.errorCode() == PluginErrorCode.OperationNotSupport) { int rv = JOptionPane.showOptionDialog( null, Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java index a1ee0ee4c..a399472bc 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java @@ -33,7 +33,7 @@ public class InstallOnlineCallback extends AbstractPluginTaskCallback { if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { + } else if (result.errorCode() == PluginErrorCode.OperationNotSupport) { int rv = JOptionPane.showOptionDialog( null, Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java index 0f79a1614..4d028341d 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java @@ -33,7 +33,7 @@ public class UpdateFromDiskCallback extends AbstractPluginTaskCallback { if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { + } else if (result.errorCode() == PluginErrorCode.OperationNotSupport) { int rv = JOptionPane.showOptionDialog( null, Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java index 65a71a80c..072c24762 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java @@ -33,7 +33,7 @@ public class UpdateOnlineCallback extends AbstractPluginTaskCallback { if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Update_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { + } else if (result.errorCode() == PluginErrorCode.OperationNotSupport) { int rv = JOptionPane.showOptionDialog( null, Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), diff --git a/designer_base/src/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java b/designer_base/src/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java index bac8d080a..ff52efaa3 100644 --- a/designer_base/src/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java +++ b/designer_base/src/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java @@ -32,7 +32,7 @@ public class UpdateOnlineCallback implements ProgressCallback { if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Update_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else if (result.errorCode() == PluginErrorCode.OperationNotSupport.getCode()) { + } else if (result.errorCode() == PluginErrorCode.OperationNotSupport) { int rv = JOptionPane.showOptionDialog( null, Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), From ec45d8457d3c897bb2a17f81f0a97883ee338a69 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Fri, 2 Jun 2017 16:20:51 +0800 Subject: [PATCH 27/54] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E5=A4=8D=E5=B7=B2?= =?UTF-8?q?=E5=8F=91=E7=8E=B0=E7=9A=84=E9=97=AE=E9=A2=98=202=E3=80=81?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E7=9B=91=E5=90=AC=E7=9B=B8=E5=85=B3=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=8F=98=E5=8A=A8=EF=BC=8C=E8=87=AA=E5=8A=A8=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E8=8F=9C=E5=8D=95=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/toolbar/ToolBarMenuDock.java | 84 +++++++++++++++++-- .../src/com/fr/design/menu/MenuDef.java | 9 +- 2 files changed, 83 insertions(+), 10 deletions(-) diff --git a/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index f80e20331..c6adb1d4b 100644 --- a/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -11,9 +11,9 @@ import com.fr.design.actions.UpdateAction; import com.fr.design.actions.community.*; import com.fr.design.actions.file.*; import com.fr.design.actions.help.AboutAction; -import com.fr.design.actions.help.alphafine.AlphafineAction; import com.fr.design.actions.help.TutorialAction; import com.fr.design.actions.help.WebDemoAction; +import com.fr.design.actions.help.alphafine.AlphafineAction; import com.fr.design.actions.server.*; import com.fr.design.file.NewTemplatePane; import com.fr.design.fun.MenuHandler; @@ -32,6 +32,13 @@ import com.fr.design.menu.ToolBarDef; import com.fr.env.RemoteEnv; import com.fr.general.ComparatorUtils; import com.fr.general.Inter; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.context.PluginRuntime; +import com.fr.plugin.manage.PluginFilter; +import com.fr.plugin.observer.PluginEvent; +import com.fr.plugin.observer.PluginEventListener; +import com.fr.plugin.observer.PluginEventType; +import com.fr.plugin.observer.PluginListenerRegistration; import com.fr.stable.ArrayUtils; import com.fr.stable.ProductConstants; @@ -570,17 +577,56 @@ public abstract class ToolBarMenuDock { protected void insertMenu(MenuDef menuDef, String anchor) { insertMenu(menuDef, anchor, new NoTargetAction()); } - + protected void insertMenu(MenuDef menuDef, String anchor, ShortCutMethodAction action) { - // 下面是插件接口接入点 - Set set = ExtraDesignClassManager.getInstance().getArray(MenuHandler.MARK_STRING); - java.util.List target = new ArrayList<>(); + + listenPluginMenuChange(menuDef, anchor, action); + addExtraMenus(menuDef, anchor, action, ExtraDesignClassManager.getInstance().getArray(MenuHandler.MARK_STRING)); + + } + + private void listenPluginMenuChange(MenuDef menuDef, String anchor, ShortCutMethodAction action) { + + PluginFilter filter = new PluginFilter() { + + @Override + public boolean accept(PluginContext context) { + + return context.contain(MenuHandler.MARK_STRING); + } + }; + + PluginListenerRegistration.getInstance().listen(PluginEventType.BeforeStop, new PluginEventListener() { + + @Override + public void on(PluginEvent event) { + PluginRuntime runtime = event.getContext().getRuntime(); + Set menuHandlers = runtime.get(MenuHandler.MARK_STRING); + removeExtraMenus(menuDef, anchor, action, menuHandlers); + } + }, filter); + PluginListenerRegistration.getInstance().listen(PluginEventType.AfterRun, new PluginEventListener() { + + @Override + public void on(PluginEvent event) { + + PluginRuntime runtime = event.getContext().getRuntime(); + Set menuHandlers = runtime.get(MenuHandler.MARK_STRING); + addExtraMenus(menuDef, anchor, action, menuHandlers); + } + }, filter); + } + + private void removeExtraMenus(MenuDef menuDef, String anchor, ShortCutMethodAction action, Set set) { + + + List target = new ArrayList<>(); for (MenuHandler handler : set) { if (ComparatorUtils.equals(handler.category(), anchor)) { target.add(handler); } } - + for (MenuHandler handler : target) { int insertPosition = handler.insertPosition(menuDef.getShortCutCount()); if (insertPosition == MenuHandler.HIDE) { @@ -590,7 +636,29 @@ public abstract class ToolBarMenuDock { if (shortCut == null){ continue; } - + menuDef.removeShortCut(shortCut); + } + } + + private void addExtraMenus(MenuDef menuDef, String anchor, ShortCutMethodAction action, Set set) { + + List target = new ArrayList<>(); + for (MenuHandler handler : set) { + if (ComparatorUtils.equals(handler.category(), anchor)) { + target.add(handler); + } + } + + for (MenuHandler handler : target) { + int insertPosition = handler.insertPosition(menuDef.getShortCutCount()); + if (insertPosition == MenuHandler.HIDE) { + return; + } + ShortCut shortCut = action.methodAction(handler); + if (shortCut == null){ + continue; + } + if (insertPosition == MenuHandler.LAST) { if (handler.insertSeparatorBefore()) { menuDef.addShortCut(SeparatorDef.DEFAULT); @@ -609,7 +677,7 @@ public abstract class ToolBarMenuDock { } } } - + /** * 设计器退出时, 做的一些操作. * diff --git a/designer_base/src/com/fr/design/menu/MenuDef.java b/designer_base/src/com/fr/design/menu/MenuDef.java index 9de4dba4e..319b94f2e 100644 --- a/designer_base/src/com/fr/design/menu/MenuDef.java +++ b/designer_base/src/com/fr/design/menu/MenuDef.java @@ -117,6 +117,11 @@ public class MenuDef extends ShortCut { this.shortcutList.add(i); } } + + public void removeShortCut(ShortCut shortCut) { + + this.shortcutList.remove(shortCut); + } /** * 清理 @@ -349,6 +354,6 @@ public class MenuDef extends ShortCut { public void setPopupMenu(JPopupMenu popupMenu) { this.popupMenu = popupMenu; } - - + + } \ No newline at end of file From 89a2d4d08b109609587e19144b8c50cc687126c2 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Fri, 2 Jun 2017 16:35:42 +0800 Subject: [PATCH 28/54] =?UTF-8?q?=E8=A7=84=E8=8C=83=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E5=85=81=E8=AE=B8=E9=80=9A=E8=BF=87GeneralContext?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E6=8F=92=E4=BB=B6=E7=9B=91=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/data/datapane/TableDataTreePane.java | 4 ++-- .../src/com/fr/design/mainframe/DesignerFrame.java | 3 +-- .../com/fr/design/mainframe/WestRegionContainerPane.java | 5 ++--- .../com/fr/design/mainframe/toolbar/ToolBarMenuDock.java | 8 ++++---- .../src/com/fr/design/ChartTypeInterfaceManager.java | 4 ++-- 5 files changed, 11 insertions(+), 13 deletions(-) diff --git a/designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java b/designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java index ca49365e4..1507d77b5 100644 --- a/designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java @@ -27,6 +27,7 @@ import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; import com.fr.design.menu.ToolBarDef; import com.fr.general.ComparatorUtils; +import com.fr.general.GeneralContext; import com.fr.general.Inter; import com.fr.general.NameObject; import com.fr.plugin.context.PluginContext; @@ -34,7 +35,6 @@ import com.fr.plugin.injectable.PluginModule; import com.fr.plugin.manage.PluginFilter; import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; -import com.fr.plugin.observer.PluginListenerRegistration; import com.fr.stable.core.PropertyChangeAdapter; import javax.swing.*; @@ -88,7 +88,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { createAddMenuDef(); - PluginListenerRegistration.getInstance().listenRunningChanged(new PluginEventListener(PLUGIN_LISTENER_PRIORITY) { + GeneralContext.listenPluginRunningChanged(new PluginEventListener(PLUGIN_LISTENER_PRIORITY) { @Override public void on(PluginEvent event) { diff --git a/designer_base/src/com/fr/design/mainframe/DesignerFrame.java b/designer_base/src/com/fr/design/mainframe/DesignerFrame.java index 3b64c4b3f..6cdc72e2a 100644 --- a/designer_base/src/com/fr/design/mainframe/DesignerFrame.java +++ b/designer_base/src/com/fr/design/mainframe/DesignerFrame.java @@ -40,7 +40,6 @@ import com.fr.plugin.context.PluginContext; import com.fr.plugin.manage.PluginFilter; import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; -import com.fr.plugin.observer.PluginListenerRegistration; import com.fr.stable.CoreConstants; import com.fr.stable.OperatingSystem; import com.fr.stable.ProductConstants; @@ -175,7 +174,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta //顶部日志+登陆按钮 final JPanel northEastPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - PluginListenerRegistration.getInstance().listenRunningChanged(new PluginEventListener() { + GeneralContext.listenPluginRunningChanged(new PluginEventListener() { @Override public void on(PluginEvent event) { diff --git a/designer_base/src/com/fr/design/mainframe/WestRegionContainerPane.java b/designer_base/src/com/fr/design/mainframe/WestRegionContainerPane.java index d1cb5a27f..e2a6d64d5 100644 --- a/designer_base/src/com/fr/design/mainframe/WestRegionContainerPane.java +++ b/designer_base/src/com/fr/design/mainframe/WestRegionContainerPane.java @@ -5,12 +5,11 @@ import com.fr.design.DesignerEnvManager; import com.fr.design.data.datapane.TableDataTreePane; import com.fr.design.fun.TableDataPaneProcessor; import com.fr.design.gui.icontainer.UIResizableContainer; +import com.fr.general.GeneralContext; import com.fr.plugin.context.PluginContext; import com.fr.plugin.manage.PluginFilter; import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; -import com.fr.plugin.observer.PluginListenerPriority; -import com.fr.plugin.observer.PluginListenerRegistration; import com.fr.stable.Constants; public class WestRegionContainerPane extends UIResizableContainer { @@ -35,7 +34,7 @@ public class WestRegionContainerPane extends UIResizableContainer { setDownPane(TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter())); - PluginListenerRegistration.getInstance().listenRunningChanged(new PluginEventListener(TableDataTreePane.PLUGIN_LISTENER_PRIORITY - 1) { + GeneralContext.listenPluginRunningChanged(new PluginEventListener(TableDataTreePane.PLUGIN_LISTENER_PRIORITY - 1) { @Override public void on(PluginEvent event) { diff --git a/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index c6adb1d4b..b9bf0070a 100644 --- a/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -31,6 +31,7 @@ import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; import com.fr.env.RemoteEnv; import com.fr.general.ComparatorUtils; +import com.fr.general.GeneralContext; import com.fr.general.Inter; import com.fr.plugin.context.PluginContext; import com.fr.plugin.context.PluginRuntime; @@ -38,7 +39,6 @@ import com.fr.plugin.manage.PluginFilter; import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; import com.fr.plugin.observer.PluginEventType; -import com.fr.plugin.observer.PluginListenerRegistration; import com.fr.stable.ArrayUtils; import com.fr.stable.ProductConstants; @@ -595,8 +595,8 @@ public abstract class ToolBarMenuDock { return context.contain(MenuHandler.MARK_STRING); } }; - - PluginListenerRegistration.getInstance().listen(PluginEventType.BeforeStop, new PluginEventListener() { + + GeneralContext.listenPlugin(PluginEventType.BeforeStop, new PluginEventListener() { @Override public void on(PluginEvent event) { @@ -605,7 +605,7 @@ public abstract class ToolBarMenuDock { removeExtraMenus(menuDef, anchor, action, menuHandlers); } }, filter); - PluginListenerRegistration.getInstance().listen(PluginEventType.AfterRun, new PluginEventListener() { + GeneralContext.listenPlugin(PluginEventType.AfterRun, new PluginEventListener() { @Override public void on(PluginEvent event) { diff --git a/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java b/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java index b77e1f399..b23954ab4 100644 --- a/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java +++ b/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java @@ -20,6 +20,7 @@ import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPa import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; import com.fr.design.module.DesignModuleFactory; import com.fr.form.ui.ChartEditor; +import com.fr.general.GeneralContext; import com.fr.general.IOUtils; import com.fr.general.Inter; import com.fr.plugin.context.PluginContext; @@ -28,7 +29,6 @@ import com.fr.plugin.injectable.PluginSingleInjection; import com.fr.plugin.manage.PluginFilter; import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; -import com.fr.plugin.observer.PluginListenerRegistration; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; import com.fr.stable.bridge.StableFactory; @@ -61,7 +61,7 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr static { - PluginListenerRegistration.getInstance().listenRunningChanged(new PluginEventListener() { + GeneralContext.listenPluginRunningChanged(new PluginEventListener() { @Override public void on(PluginEvent event) { From 3a18665323ffc930cd23c70d930302f4b887f9a5 Mon Sep 17 00:00:00 2001 From: kerry Date: Mon, 5 Jun 2017 09:38:04 +0800 Subject: [PATCH 29/54] =?UTF-8?q?REPORT-2354=09=E5=B0=86=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86=E5=92=8C=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=B5=B7=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/extra/PluginOperateUtils.java | 61 ++++++++++--------- .../extra/exe/callback/DownloadCallback.java | 4 +- .../exe/callback/InstallFromDiskCallback.java | 5 +- .../exe/callback/InstallOnlineCallback.java | 6 +- .../design/extra/exe/callback/JSCallback.java | 50 +++++++++------ .../exe/callback/ModifyStatusCallback.java | 5 +- ...back.java => UninstallPluginCallback.java} | 8 ++- .../exe/callback/UpdateFromDiskCallback.java | 7 ++- .../exe/callback/UpdateOnlineCallback.java | 5 +- 9 files changed, 89 insertions(+), 62 deletions(-) rename designer_base/src/com/fr/design/extra/exe/callback/{UnistallPluginCallback.java => UninstallPluginCallback.java} (77%) diff --git a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java index 4f2a2e204..f867574e6 100644 --- a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java +++ b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java @@ -16,14 +16,11 @@ import com.fr.plugin.manage.PluginManager; import com.fr.plugin.manage.bbs.BBSPluginLogin; import com.fr.plugin.manage.control.PluginTaskCallback; import com.fr.plugin.view.PluginView; -import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; -import netscape.javascript.JSObject; import org.json.JSONArray; import javax.swing.*; import java.io.File; -import java.util.ArrayList; import java.util.List; @@ -79,7 +76,7 @@ public class PluginOperateUtils { PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); PluginContext plugin = PluginManager.getContext(pluginMarker); boolean active = plugin.isActive(); - PluginTaskCallback modifyStatusCallback = new ModifyStatusCallback(active); + PluginTaskCallback modifyStatusCallback = new ModifyStatusCallback(active, jsCallback); if (active) { PluginManager.getController().forbid(pluginMarker, modifyStatusCallback); } else { @@ -89,7 +86,7 @@ public class PluginOperateUtils { public static void uninstallPlugin(final String pluginInfo, final boolean isForce, JSCallback jsCallback) { PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); - PluginManager.getController().uninstall(pluginMarker, isForce, new UnistallPluginCallback()); + PluginManager.getController().uninstall(pluginMarker, isForce, new UninstallPluginCallback(jsCallback)); } public static void readUpdateOnline(JSCallback jsCallback) { @@ -120,30 +117,36 @@ public class PluginOperateUtils { } public static void getPluginFromStore(String category, String seller, String fee, JSCallback jsCallback) { - String plistUrl = SiteCenter.getInstance().acquireUrlByKind("plugin.plist"); - if (StringUtils.isNotBlank(plistUrl)) { - StringBuilder url = new StringBuilder(); - url.append(plistUrl); - if (StringUtils.isNotBlank(category)) { - url.append("&cid=").append(category.split("-")[1]); - } - if (StringUtils.isNotBlank(seller)) { - url.append("&seller=").append(seller.split("-")[1]); - } - if (StringUtils.isNotBlank(fee)) { - url.append("&fee=").append(fee.split("-")[1]); - } - try { - HttpClient httpClient = new HttpClient(url.toString()); - String result = httpClient.getResponseText(); - jsCallback.execute(result); - } catch (Exception e) { - FRLogger.getLogger().error(e.getMessage()); + new Thread(new Runnable() { + @Override + public void run() { + String plistUrl = SiteCenter.getInstance().acquireUrlByKind("plugin.plist"); + if (StringUtils.isNotBlank(plistUrl)) { + StringBuilder url = new StringBuilder(); + url.append(plistUrl); + if (StringUtils.isNotBlank(category)) { + url.append("&cid=").append(category.split("-")[1]); + } + if (StringUtils.isNotBlank(seller)) { + url.append("&seller=").append(seller.split("-")[1]); + } + if (StringUtils.isNotBlank(fee)) { + url.append("&fee=").append(fee.split("-")[1]); + } + try { + HttpClient httpClient = new HttpClient(url.toString()); + String result = httpClient.getResponseText(); + jsCallback.execute(result); + } catch (Exception e) { + FRLogger.getLogger().error(e.getMessage()); + } + } else { + String result = PluginConstants.CONNECTION_404; + jsCallback.execute(result); + } } - } else { - String result = PluginConstants.CONNECTION_404; - jsCallback.execute(result); - } + }).start(); + } public static void getPluginCategories(JSCallback jsCallback) { @@ -176,4 +179,4 @@ public class PluginOperateUtils { && StringUtils.isNotEmpty(pluginView.getEnvVersion()); } -} + } diff --git a/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java index 93ea0fe22..6c5e3eadf 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java @@ -12,6 +12,7 @@ import javax.swing.*; public class DownloadCallback extends AbstractPluginTaskCallback { private ExtraPluginTask extraPluginTask; private JSCallback jsCallback; + private static int HUNDRED_PERCENT = 100; public DownloadCallback(final ExtraPluginTask extraPluginTask, final JSCallback jsCallback) { this.extraPluginTask = extraPluginTask; @@ -20,12 +21,11 @@ public class DownloadCallback extends AbstractPluginTaskCallback { @Override public void updateProgress(String description, double aProgress) { - jsCallback.execute(String.valueOf(aProgress)); + jsCallback.execute(String.valueOf(aProgress * HUNDRED_PERCENT + "%")); } @Override public void done(PluginTaskResult result) { - jsCallback.execute("done"); if (result.isSuccess()) { extraPluginTask.doExtraPluginTask(); } else { diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java index aa74e9c02..07bbf7a3f 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java @@ -15,6 +15,7 @@ import java.io.File; public class InstallFromDiskCallback extends AbstractPluginTaskCallback { private File zipFile; private JSCallback jsCallback; + private static int HUNDRED_PERCENT = 100; public InstallFromDiskCallback(final File zipFile, final JSCallback jsCallback) { this.zipFile = zipFile; @@ -23,13 +24,13 @@ public class InstallFromDiskCallback extends AbstractPluginTaskCallback { @Override public void updateProgress(String description, double aProgress) { - jsCallback.execute(String.valueOf(aProgress)); + jsCallback.execute(String.valueOf(aProgress * HUNDRED_PERCENT + "%")); } @Override public void done(PluginTaskResult result) { - jsCallback.execute("done"); + jsCallback.execute("success"); if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java index a1ee0ee4c..16fcae743 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java @@ -14,7 +14,7 @@ import javax.swing.*; */ public class InstallOnlineCallback extends AbstractPluginTaskCallback { protected JSCallback jsCallback; - + private static int HUNDRED_PERCENT = 100; public InstallOnlineCallback(PluginMarker pluginMarker, JSCallback jsCallback){ this.pluginMarker = pluginMarker; @@ -23,13 +23,13 @@ public class InstallOnlineCallback extends AbstractPluginTaskCallback { @Override public void updateProgress(String description, double aProgress) { - jsCallback.execute(String.valueOf(aProgress)); + jsCallback.execute(String.valueOf(aProgress * HUNDRED_PERCENT + "%")); } @Override public void done(PluginTaskResult result) { - jsCallback.execute("done"); + jsCallback.execute("success"); if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); diff --git a/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java index 8204a88eb..4d2fb7ade 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java @@ -1,39 +1,51 @@ package com.fr.design.extra.exe.callback; import com.fr.stable.StringUtils; +import javafx.application.Platform; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.concurrent.Task; import javafx.scene.web.WebEngine; import netscape.javascript.JSObject; /** * Created by ibm on 2017/5/27. */ -public class JSCallback { - private WebEngine webEngine; - private JSObject callback; +public class JSCallback extends Task { + public JSCallback(final WebEngine webEngine, final JSObject callback) { - this.webEngine = webEngine; - this.callback = callback; + init(webEngine, callback); } - public void execute(String newValue) { - String fun = "(" + callback + ")(\"" + trimText(newValue) + "\")"; - try { - webEngine.executeScript(fun); - } catch (Exception e) { - webEngine.executeScript("alert(\"" + e.getMessage() + "\")"); - } + public void init(final WebEngine webEngine, final JSObject callback){ + messageProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, String oldValue, String newValue) { + Platform.runLater(new Runnable() { + @Override + public void run() { + String fun = "(" + callback + ")(\"" + trimText(newValue) + "\")"; + try { + webEngine.executeScript(fun); + } catch (Exception e) { + webEngine.executeScript("alert(\"" + e.getMessage() + "\")"); + } + } + }); + } + }); + } + @Override + protected T call() throws Exception { + return null; } - public void execute(double progress) { - String fun = "(" + callback + ")(\"" + trimText(String.valueOf(progress)) + "\")"; - try { - webEngine.executeScript(fun); - } catch (Exception e) { - webEngine.executeScript("alert(\"" + e.getMessage() + "\")"); - } + public void execute(String newValue) { + updateMessage(newValue); } + /** * vito:由于使用webEngine.executeScript("(" + callback + ")(\"" + newValue + "\")") * 执行脚本,所以原来规范的json格式也会在拼接字符串后可能抛出参数异常,需要转换掉一些会造成错误的特殊字符, diff --git a/designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java index 2a22e0b90..a02f7628a 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java @@ -11,13 +11,16 @@ import javax.swing.*; */ public class ModifyStatusCallback implements PluginTaskCallback{ private boolean isActive; + private JSCallback jsCallback; - public ModifyStatusCallback (boolean isActive){ + public ModifyStatusCallback (boolean isActive, JSCallback jsCallback){ this.isActive = isActive; + this.jsCallback = jsCallback; } @Override public void done(PluginTaskResult result) { if (result.isSuccess()) { + jsCallback.execute("success"); String modifyMessage = isActive ? Inter.getLocText("FR-Designer-Plugin_Has_Been_Actived") : Inter.getLocText("FR-Designer-Plugin_Has_Been_Disabled"); JOptionPane.showMessageDialog(null, modifyMessage); } else { diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UnistallPluginCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UninstallPluginCallback.java similarity index 77% rename from designer_base/src/com/fr/design/extra/exe/callback/UnistallPluginCallback.java rename to designer_base/src/com/fr/design/extra/exe/callback/UninstallPluginCallback.java index 851c9e4e4..983a2a0c5 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/UnistallPluginCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/UninstallPluginCallback.java @@ -10,11 +10,17 @@ import javax.swing.*; /** * Created by ibm on 2017/5/27. */ -public class UnistallPluginCallback implements PluginTaskCallback { +public class UninstallPluginCallback implements PluginTaskCallback { + private JSCallback jsCallback; + + public UninstallPluginCallback(JSCallback jsCallback){ + this.jsCallback = jsCallback; + } @Override public void done(PluginTaskResult result) { if (result.isSuccess()) { + jsCallback.execute("success"); FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Delete_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); } else { diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java index 0f79a1614..9a4e0d093 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java @@ -14,7 +14,8 @@ import java.io.File; */ public class UpdateFromDiskCallback extends AbstractPluginTaskCallback { private File zipFile; - protected JSCallback jsCallback; + private JSCallback jsCallback; + private static int HUNDRED_PERCENT = 100; public UpdateFromDiskCallback(File zipFile, JSCallback jsCallback) { this.zipFile = zipFile; @@ -23,13 +24,13 @@ public class UpdateFromDiskCallback extends AbstractPluginTaskCallback { @Override public void updateProgress(String description, double aProgress) { - jsCallback.execute(String.valueOf(aProgress)); + jsCallback.execute(String.valueOf(aProgress * HUNDRED_PERCENT + "%")); } @Override public void done(PluginTaskResult result) { - jsCallback.execute("done"); + jsCallback.execute("success"); if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java index 65a71a80c..c139cea2c 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java @@ -15,6 +15,7 @@ import javax.swing.*; public class UpdateOnlineCallback extends AbstractPluginTaskCallback { public PluginMarker toPluginMarker; protected JSCallback jsCallback; + private static int HUNDRED_PERCENT = 100; public UpdateOnlineCallback(PluginMarker pluginMarker, PluginMarker toPluginMarker, JSCallback jsCallback) { this.pluginMarker = pluginMarker; @@ -24,12 +25,12 @@ public class UpdateOnlineCallback extends AbstractPluginTaskCallback { @Override public void updateProgress(String description, double aProgress) { - jsCallback.execute(String.valueOf(aProgress)); + jsCallback.execute(String.valueOf(aProgress * HUNDRED_PERCENT + "%")); } @Override public void done(PluginTaskResult result) { - jsCallback.execute("done"); + jsCallback.execute("success"); if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Update_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); From 0caa8c6a46dbc70ebdbd58317219d44ac195c425 Mon Sep 17 00:00:00 2001 From: kerry Date: Mon, 5 Jun 2017 16:55:24 +0800 Subject: [PATCH 30/54] =?UTF-8?q?REPORT-2354=20=E5=B0=86=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86=E5=92=8C=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=B5=B7=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/extra/LoginWebBridge.java | 3 + .../fr/design/extra/PluginFromStorePane.java | 6 +- .../fr/design/extra/PluginOperateUtils.java | 85 +++++++++++-------- .../com/fr/design/extra/PluginUpdatePane.java | 15 ++-- .../src/com/fr/design/extra/PluginUtils.java | 15 ++-- .../com/fr/design/extra/PluginWebBridge.java | 11 ++- 6 files changed, 80 insertions(+), 55 deletions(-) diff --git a/designer_base/src/com/fr/design/extra/LoginWebBridge.java b/designer_base/src/com/fr/design/extra/LoginWebBridge.java index 7db9fc5ac..2990ad133 100644 --- a/designer_base/src/com/fr/design/extra/LoginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/LoginWebBridge.java @@ -9,6 +9,8 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.general.SiteCenter; import com.fr.general.http.HttpClient; import com.fr.json.JSONObject; +import com.fr.plugin.manage.bbs.BBSPluginLogin; +import com.fr.plugin.manage.bbs.BBSUserInfo; import com.fr.stable.EncodeConstants; import com.fr.stable.StringUtils; import javafx.scene.web.WebEngine; @@ -320,6 +322,7 @@ public class LoginWebBridge { DesignerEnvManager.getEnvManager().setBBSName(username); DesignerEnvManager.getEnvManager().setInShowBBsName(username); DesignerEnvManager.getEnvManager().setBBSPassword(password); + BBSPluginLogin.getInstance().login(new BBSUserInfo(username, password)); return LOGININ;//登录成功,0 } else if ($uid == -1) { return USERNAME_NOT_EXSIT;//用户名不存在,-1 diff --git a/designer_base/src/com/fr/design/extra/PluginFromStorePane.java b/designer_base/src/com/fr/design/extra/PluginFromStorePane.java index 0b8393ccf..4de4b0d18 100644 --- a/designer_base/src/com/fr/design/extra/PluginFromStorePane.java +++ b/designer_base/src/com/fr/design/extra/PluginFromStorePane.java @@ -6,6 +6,7 @@ import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.gui.ilable.UILabel; import com.fr.general.FRLogger; import com.fr.general.Inter; +import com.fr.json.JSONObject; import com.fr.plugin.context.PluginMarker; import com.fr.plugin.manage.PluginManager; import com.fr.plugin.manage.bbs.BBSPluginLogin; @@ -199,8 +200,9 @@ public class PluginFromStorePane extends PluginAbstractLoadingViewPane plugins = PluginsReaderFromStore.readPluginsForUpdate(); - JSONArray jsonArray = new JSONArray(); - for (PluginView plugin : plugins) { - org.json.JSONObject jsonObject = new org.json.JSONObject(); - jsonObject.put("pluginid", plugin.getID()); - jsonArray.put(jsonObject); + + new Thread(new Runnable() { + @Override + public void run() { + try { + List plugins = PluginsReaderFromStore.readPluginsForUpdate(); + JSONArray jsonArray = new JSONArray(); + for (PluginView plugin : plugins) { + org.json.JSONObject jsonObject = new org.json.JSONObject(); + jsonObject.put("pluginid", plugin.getID()); + jsonArray.put(jsonObject); + } + String result = jsonArray.toString(); + jsCallback.execute(result); + } catch (Exception e) { + FRLogger.getLogger().error(e.getMessage()); + } } - String result = jsonArray.toString(); - jsCallback.execute(result); - } catch (Exception e) { - FRLogger.getLogger().error(e.getMessage()); - } + }).start(); + } public static void searchPlugin(String keyword, JSCallback jsCallback) { try { - HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("plugin.plist") + "&keyword=" + keyword); - String result = httpClient.getResponseText(); - jsCallback.execute(result); + new Thread(new Runnable() { + @Override + public void run() { + HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("plugin.plist") + "&keyword=" + keyword); + String result = httpClient.getResponseText(); + jsCallback.execute(result); + } + }).start(); } catch (Exception e) { FRLogger.getLogger().error(e.getMessage()); } @@ -150,19 +155,25 @@ public class PluginOperateUtils { } public static void getPluginCategories(JSCallback jsCallback) { - String result; - String url = SiteCenter.getInstance().acquireUrlByKind("plugin.category"); - if (url != null) { - HttpClient httpClient = new HttpClient(url); - result = httpClient.getResponseText(); - } else { - result = PluginConstants.CONNECTION_404; - } - jsCallback.execute(result); + new Thread(new Runnable() { + @Override + public void run() { + String result; + String url = SiteCenter.getInstance().acquireUrlByKind("plugin.category"); + if (url != null) { + HttpClient httpClient = new HttpClient(url); + result = httpClient.getResponseText(); + } else { + result = PluginConstants.CONNECTION_404; + } + jsCallback.execute(result); + } + }).start(); } public static void getLoginInfo(JSCallback jsCallback) { - String username = BBSPluginLogin.getInstance().getUserInfo().getUserName(); + BBSUserInfo bbsUserInfo = BBSPluginLogin.getInstance().getUserInfo(); + String username = bbsUserInfo == null ? "" : bbsUserInfo.getUserName(); String inShowUsername = DesignerEnvManager.getEnvManager().getInShowBBsName(); if (StringUtils.isEmpty(username) && StringUtils.isEmpty(inShowUsername)) { return; @@ -172,11 +183,11 @@ public class PluginOperateUtils { } } - public static boolean pluginValidate(PluginView pluginView){ + public static boolean pluginValidate(PluginView pluginView) { return StringUtils.isNotEmpty(pluginView.getID()) && StringUtils.isNotEmpty(pluginView.getName()) && StringUtils.isNotEmpty(pluginView.getVersion()) && StringUtils.isNotEmpty(pluginView.getEnvVersion()); } - } +} diff --git a/designer_base/src/com/fr/design/extra/PluginUpdatePane.java b/designer_base/src/com/fr/design/extra/PluginUpdatePane.java index 5506b5dc4..5de8c9588 100644 --- a/designer_base/src/com/fr/design/extra/PluginUpdatePane.java +++ b/designer_base/src/com/fr/design/extra/PluginUpdatePane.java @@ -8,6 +8,7 @@ import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.gui.ilable.UILabel; import com.fr.general.FRLogger; import com.fr.general.Inter; +import com.fr.json.JSONObject; import com.fr.plugin.context.PluginMarker; import com.fr.plugin.error.PluginErrorCode; import com.fr.plugin.manage.PluginManager; @@ -179,11 +180,15 @@ public class PluginUpdatePane extends PluginAbstractLoadingViewPane plugins) throws Exception { @@ -69,7 +74,7 @@ public class PluginUtils { return jsonArray.toString(); } - public static void downloadShopScripts(String id, String username, String password, Process p) throws Exception{ + public static void downloadShopScripts(String id, String username, String password, Process p) throws Exception { HttpClient httpClient = new HttpClient(getDownloadPath(id, username, password)); if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { int totalSize = httpClient.getContentLength(); @@ -108,7 +113,7 @@ public class PluginUtils { return resText; } - public static boolean isPluginMatch(PluginView pluginView, String text){ + public static boolean isPluginMatch(PluginView pluginView, String text) { return StringUtils.contains(pluginView.getID(), text) || StringUtils.contains(pluginView.getName(), text) || StringUtils.contains(pluginView.getVersion(), text) @@ -119,7 +124,7 @@ public class PluginUtils { } - public static String pluginToHtml(PluginView pluginView){ + public static String pluginToHtml(PluginView pluginView) { String pluginName = Inter.getLocText("FR-Plugin-Plugin_Name"); String pluginVersion = Inter.getLocText("FR-Plugin-Plugin_Version"); String startVersion = Inter.getLocText("FR-Plugin-Start_Version"); diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer_base/src/com/fr/design/extra/PluginWebBridge.java index be0d9a3ba..a961183ad 100644 --- a/designer_base/src/com/fr/design/extra/PluginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/PluginWebBridge.java @@ -4,10 +4,7 @@ import com.fr.base.FRContext; import com.fr.design.DesignerEnvManager; import com.fr.design.RestartHelper; import com.fr.design.dialog.UIDialog; -import com.fr.design.extra.exe.*; import com.fr.design.extra.exe.callback.JSCallback; -import com.fr.design.extra.exe.extratask.ExtraPluginTask; -import com.fr.design.extra.exe.extratask.UpdatePluginTask; import com.fr.design.gui.ilable.UILabel; import com.fr.general.FRLogger; import com.fr.general.Inter; @@ -19,7 +16,6 @@ import com.fr.plugin.context.PluginMarker; import com.fr.plugin.manage.PluginManager; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; -import javafx.concurrent.Task; import javafx.scene.web.WebEngine; import javafx.stage.FileChooser; import javafx.stage.Stage; @@ -488,8 +484,11 @@ public class PluginWebBridge { * @param password * @return */ - public String defaultLogin(String username, String password) { - return LoginWebBridge.getHelper().pluginManageLogin(username, password, uiLabel); + public void defaultLogin(String username, String password, final JSObject callback) { + JSCallback jsCallback = new JSCallback(webEngine, callback); + String result = LoginWebBridge.getHelper().pluginManageLogin(username, password, uiLabel); + jsCallback.execute(result); + } /** From 8b673ec809c66eebaa7d5af21bc4e3413762b406 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Tue, 6 Jun 2017 14:55:30 +0800 Subject: [PATCH 31/54] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E6=94=B9=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=A8=A1=E5=9D=97=E5=88=9D=E5=A7=8B=E5=8C=96=E7=9A=84?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=EF=BC=9A=E5=9C=A8BaseDesigner=E5=92=8CBaseSe?= =?UTF-8?q?rvlet=E4=B8=ADinit=E3=80=81=E5=9C=A8=E7=8E=AF=E5=A2=83=E5=88=87?= =?UTF-8?q?=E5=85=A5=E6=97=B6=E5=8A=A0=E8=BD=BD=E6=8F=92=E4=BB=B6=202?= =?UTF-8?q?=E3=80=81=E4=BF=AE=E6=94=B9=E4=BD=BF=E7=94=A81.8=E8=AF=AD?= =?UTF-8?q?=E6=B3=95=E7=9A=84=E5=9C=B0=E6=96=B9=203=E3=80=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9FSPlate=E7=9B=B8=E5=85=B3=E7=9A=84=E5=9C=B0=E6=96=B9?= =?UTF-8?q?=EF=BC=8C=E5=AE=8C=E6=95=B4=E6=94=AF=E6=8C=81=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E8=BF=90=E8=A1=8C=E5=92=8C=E5=81=9C=E6=AD=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer_base/src/com/fr/start/BaseDesigner.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/designer_base/src/com/fr/start/BaseDesigner.java b/designer_base/src/com/fr/start/BaseDesigner.java index 301a9191f..26d8d5611 100644 --- a/designer_base/src/com/fr/start/BaseDesigner.java +++ b/designer_base/src/com/fr/start/BaseDesigner.java @@ -26,6 +26,7 @@ import com.fr.general.FRLogger; import com.fr.general.Inter; import com.fr.general.ModuleContext; import com.fr.plugin.PluginCollector; +import com.fr.plugin.manage.PluginManager; import com.fr.stable.*; import javax.swing.*; @@ -89,6 +90,8 @@ public abstract class BaseDesigner extends ToolBarMenuDock { switch2LastEnv(); initDefaultFont(); + //PluginManager要在环境切换和模块启动之前初始化 + PluginManager.init(); // 必须先初始化Env再去startModule, 不然会导致lic读取不到 ModuleContext.startModule(module2Start()); From 970d9a517e63d0bec183960162ddcf45d7f5e74b Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Thu, 8 Jun 2017 16:45:56 +0800 Subject: [PATCH 32/54] =?UTF-8?q?=E6=95=B4=E5=90=88License=E9=83=A8?= =?UTF-8?q?=E5=88=86(=E8=BF=98=E6=98=AF=E6=8F=90=E7=A4=BA=E6=B2=A1?= =?UTF-8?q?=E5=86=99)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/extra/PluginControlPane.java | 19 ++++++++------ .../com/fr/design/extra/PluginWebBridge.java | 14 +--------- designer_base/src/com/fr/env/RemoteEnv.java | 26 +------------------ 3 files changed, 13 insertions(+), 46 deletions(-) diff --git a/designer_base/src/com/fr/design/extra/PluginControlPane.java b/designer_base/src/com/fr/design/extra/PluginControlPane.java index ac63ae7f4..be3c8601d 100644 --- a/designer_base/src/com/fr/design/extra/PluginControlPane.java +++ b/designer_base/src/com/fr/design/extra/PluginControlPane.java @@ -8,9 +8,9 @@ import com.fr.design.gui.itextfield.UITextField; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.IOUtils; import com.fr.general.Inter; -import com.fr.plugin.PluginLicense; -import com.fr.plugin.PluginLicenseManager; +import com.fr.plugin.context.PluginContext; import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.license.Licensed; import com.fr.plugin.manage.PluginManager; import com.fr.plugin.manage.control.PluginTaskCallback; import com.fr.plugin.manage.control.PluginTaskResult; @@ -68,15 +68,18 @@ public class PluginControlPane extends BasicPane { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (value instanceof PluginView) { - PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(((PluginView) value).getID()); + Licensed context = PluginManager.getContext(PluginMarker.read((PluginView) value)); + if (context == null) { + return this; + } String extraInfo = ""; - if (pluginLicense.isJarDamage()) { + if (context.isLicDamaged()) { extraInfo = "(" + Inter.getLocText("FR-Plugin-Plugin_Damaged") + ")"; - } else if (pluginLicense.getLeftTime() != -1) { - if (pluginLicense.isAvailable()) { - extraInfo = "(" + (pluginLicense.isTrial() ? Inter.getLocText("FR-Plugin-Designer_Trial") : Inter.getLocText("FR-Plugin-Designer_Authorized")) + pluginLicense.getLeftTime() + Inter.getLocText("FR-Plugin-Designer_Left") + ")"; + } else if (!context.isFree()) { + if (context.isAvailable()) { + extraInfo = "(" + (context.isOnTrial() ? Inter.getLocText("FR-Plugin-Designer_Trial") : Inter.getLocText("FR-Plugin-Designer_Authorized")) + context.getLeftDays() + Inter.getLocText("FR-Plugin-Designer_Left") + ")"; } else { - extraInfo = "(" + (pluginLicense.isTrial() ? Inter.getLocText("FR-Plugin-Designer_Trial") : Inter.getLocText("FR-Plugin-Designer_Authorized")) + Inter.getLocText("FR-Plugin-Designer_Expired") + ")"; + extraInfo = "(" + (context.isOnTrial() ? Inter.getLocText("FR-Plugin-Designer_Trial") : Inter.getLocText("FR-Plugin-Designer_Authorized")) + Inter.getLocText("FR-Plugin-Designer_Expired") + ")"; } } setText(((PluginView) value).getName() + extraInfo); diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer_base/src/com/fr/design/extra/PluginWebBridge.java index a961183ad..3efa0fd6e 100644 --- a/designer_base/src/com/fr/design/extra/PluginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/PluginWebBridge.java @@ -9,8 +9,6 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.general.FRLogger; import com.fr.general.Inter; import com.fr.general.SiteCenter; -import com.fr.plugin.PluginLicense; -import com.fr.plugin.PluginLicenseManager; import com.fr.plugin.context.PluginContext; import com.fr.plugin.context.PluginMarker; import com.fr.plugin.manage.PluginManager; @@ -278,17 +276,7 @@ public class PluginWebBridge { List plugins = PluginManager.getContexts(); return plugins.toArray(new PluginContext[plugins.size()]); } - - - /** - * 获取已经安装的插件的授权情况 - * - * @return 已安装的插件授权对象 - */ - public PluginLicense getPluginLicenseByID(String pluginID) { - return PluginLicenseManager.getInstance().getPluginLicenseByID(pluginID); - } - + private String[] jsObjectToStringArray(JSObject obj) { if (obj == null) { return ArrayUtils.EMPTY_STRING_ARRAY; diff --git a/designer_base/src/com/fr/env/RemoteEnv.java b/designer_base/src/com/fr/env/RemoteEnv.java index cc60cc648..a17815092 100644 --- a/designer_base/src/com/fr/env/RemoteEnv.java +++ b/designer_base/src/com/fr/env/RemoteEnv.java @@ -27,9 +27,6 @@ import com.fr.general.http.HttpClient; import com.fr.json.JSONArray; import com.fr.json.JSONException; import com.fr.json.JSONObject; -import com.fr.plugin.PluginLicense; -import com.fr.plugin.PluginLicenseManager; -import com.fr.plugin.xml.PluginXml; import com.fr.share.ShareConstants; import com.fr.stable.*; import com.fr.stable.file.XMLFileManagerProvider; @@ -1991,11 +1988,7 @@ public class RemoteEnv extends AbstractEnv { public void setLicName(String licName) { //do nth } - - @Override - public void checkAndRegisterLic(FileNode node, PluginXml plugin) throws Exception { - - } + /** * 获取当前env的build文件路径 @@ -2034,23 +2027,6 @@ public class RemoteEnv extends AbstractEnv { } - public void readPluginLicenses() throws Exception { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - HashMap para = new HashMap(); - para.put("op", "fr_remote_design"); - para.put("cmd", "design_plugin_licenses"); - - InputStream inputStream = postBytes2ServerB(out.toByteArray(), para); - String pluginsLicensesStr = IOUtils.inputStream2String(inputStream, EncodeConstants.ENCODING_UTF_8); - if (StringUtils.isNotBlank(pluginsLicensesStr) && pluginsLicensesStr.startsWith("[")) { - JSONArray jsonArray = new JSONArray(pluginsLicensesStr); - for (int i = 0; i < jsonArray.length(); i++) { - PluginLicense pluginLicense = new PluginLicense(); - pluginLicense.parseJSON(jsonArray.getJSONObject(i)); - PluginLicenseManager.getInstance().addRemotePluginLicense(pluginLicense); - } - } - } @Override public String pluginServiceAction(String serviceID, String req) throws Exception { From a349fb16d4adc6f271429221a82dccfc652b3784 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Fri, 9 Jun 2017 09:52:30 +0800 Subject: [PATCH 33/54] =?UTF-8?q?=E7=9B=91=E5=90=AC=E5=8C=85=E5=90=ABFormP?= =?UTF-8?q?araWidgetPane=E6=8E=A5=E5=8F=A3=E7=9A=84=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designer/creator/XCreatorUtils.java | 69 ++++++++++++++----- .../design/mainframe/FormParaWidgetPane.java | 31 ++++++++- 2 files changed, 82 insertions(+), 18 deletions(-) diff --git a/designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java b/designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java index 3c58e2f19..726c16178 100644 --- a/designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java +++ b/designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java @@ -5,13 +5,9 @@ package com.fr.design.designer.creator; import com.fr.base.FRContext; import com.fr.design.ExtraDesignClassManager; -import com.fr.design.designer.creator.cardlayout.XCardAddButton; -import com.fr.design.designer.creator.cardlayout.XCardSwitchButton; -import com.fr.design.designer.creator.cardlayout.XWCardLayout; -import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; -import com.fr.design.designer.creator.cardlayout.XWCardTagLayout; -import com.fr.design.designer.creator.cardlayout.XWCardTitleLayout; -import com.fr.design.designer.creator.cardlayout.XWTabFitLayout; +import com.fr.design.designer.creator.cardlayout.*; +import com.fr.design.fun.FormWidgetOptionProvider; +import com.fr.design.fun.ParameterWidgetOptionProvider; import com.fr.design.module.DesignModuleFactory; import com.fr.design.utils.gui.LayoutUtils; import com.fr.form.parameter.FormSubmitButton; @@ -24,7 +20,13 @@ import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.form.ui.container.cardlayout.WCardTitleLayout; import com.fr.form.ui.container.cardlayout.WTabFitLayout; +import com.fr.general.GeneralContext; import com.fr.general.IOUtils; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.injectable.PluginModule; +import com.fr.plugin.manage.PluginFilter; +import com.fr.plugin.observer.PluginEvent; +import com.fr.plugin.observer.PluginEventListener; import com.fr.stable.StringUtils; import javax.swing.*; @@ -38,11 +40,35 @@ import java.lang.reflect.Constructor; * @since 6.5.3 */ public class XCreatorUtils { - + public static java.util.Map, Class> objectMap = new java.util.HashMap, Class>(); + + private static java.util.Map, Class> extraObjectMap = new java.util.HashMap, Class>(); + public static java.util.Map, Class> xLayoutMap = new java.util.HashMap, Class>(); - + static { + init(); + GeneralContext.listenPluginRunningChanged(new PluginEventListener() { + + @Override + public void on(PluginEvent event) { + + reInitExtra(); + } + }, new PluginFilter() { + + @Override + public boolean accept(PluginContext context) { + + return context.contain(PluginModule.ExtraDesign, ParameterWidgetOptionProvider.XML_TAG) + || context.contain(PluginModule.ExtraDesign, FormWidgetOptionProvider.XML_TAG); + } + }); + } + + private static void init() { + objectMap.put(TextEditor.class, XTextEditor.class); objectMap.put(TextArea.class, XTextArea.class); objectMap.put(NumberEditor.class, XNumberEditor.class); @@ -74,7 +100,7 @@ public class XCreatorUtils { objectMap.put(CardSwitchButton.class, XCardSwitchButton.class); objectMap.put(CardAddButton.class, XCardAddButton.class); putExtraEditor(); - + xLayoutMap.put(WAbsoluteLayout.class, XWAbsoluteLayout.class); xLayoutMap.put(WParameterLayout.class, XWParameterLayout.class); xLayoutMap.put(WAbsoluteBodyLayout.class, XWAbsoluteBodyLayout.class); @@ -86,7 +112,7 @@ public class XCreatorUtils { xLayoutMap.put(WHorizontalSplitLayout.class, XWHorizontalSplitLayout.class); xLayoutMap.put(WVerticalSplitLayout.class, XWVerticalSplitLayout.class); xLayoutMap.put(WGridLayout.class, XWGridLayout.class); - + xLayoutMap.put(WFitLayout.class, XWFitLayout.class); xLayoutMap.put(WScaleLayout.class, XWScaleLayout.class); xLayoutMap.put(WTitleLayout.class, XWTitleLayout.class); @@ -94,19 +120,30 @@ public class XCreatorUtils { xLayoutMap.put(WCardTitleLayout.class, XWCardTitleLayout.class); xLayoutMap.put(WTabFitLayout.class, XWTabFitLayout.class); xLayoutMap.put(WCardMainBorderLayout.class, XWCardMainBorderLayout.class); - - objectMap.putAll(ExtraDesignClassManager.getInstance().getParameterWidgetOptionsMap()); - objectMap.putAll(ExtraDesignClassManager.getInstance().getFormWidgetOptionsMap()); + + reInitExtra(); } - + + private static void reInitExtra() { + + extraObjectMap.clear(); + extraObjectMap.putAll(ExtraDesignClassManager.getInstance().getParameterWidgetOptionsMap()); + extraObjectMap.putAll(ExtraDesignClassManager.getInstance().getFormWidgetOptionsMap()); + } + private static void putExtraEditor() { if (DesignModuleFactory.getChartEditorClass() != null) { objectMap.put(DesignModuleFactory.getChartEditorClass(), XChartEditor.class); } } - + + @SuppressWarnings("unchecked") private static Class searchXCreatorClass(Class clazz) { + Class xClazz = (Class) objectMap.get(clazz); + if (xClazz == null) { + xClazz = (Class) extraObjectMap.get(clazz); + } if (xClazz == null) { xClazz = (Class) xLayoutMap.get(clazz); } diff --git a/designer_form/src/com/fr/design/mainframe/FormParaWidgetPane.java b/designer_form/src/com/fr/design/mainframe/FormParaWidgetPane.java index 6187bbd48..c3855c3c9 100644 --- a/designer_form/src/com/fr/design/mainframe/FormParaWidgetPane.java +++ b/designer_form/src/com/fr/design/mainframe/FormParaWidgetPane.java @@ -6,6 +6,7 @@ import com.fr.design.constants.UIConstants; import com.fr.design.designer.beans.events.DesignerEditListener; import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.creator.XCreatorUtils; +import com.fr.design.fun.FormWidgetOptionProvider; import com.fr.design.gui.core.FormWidgetOption; import com.fr.design.gui.core.UserDefinedWidgetOption; import com.fr.design.gui.core.WidgetOption; @@ -16,7 +17,13 @@ import com.fr.design.module.DesignModuleFactory; import com.fr.design.utils.gui.LayoutUtils; import com.fr.form.ui.*; import com.fr.general.ComparatorUtils; +import com.fr.general.GeneralContext; import com.fr.general.Inter; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.injectable.PluginModule; +import com.fr.plugin.manage.PluginFilter; +import com.fr.plugin.observer.PluginEvent; +import com.fr.plugin.observer.PluginEventListener; import com.fr.stable.ArrayUtils; import javax.swing.*; @@ -55,8 +62,28 @@ public class FormParaWidgetPane extends JPanel { private UILabel paraLabel; private FormDesigner designer; - - public static final FormParaWidgetPane getInstance(FormDesigner designer) { + + static { + GeneralContext.listenPluginRunningChanged(new PluginEventListener() { + + @Override + public void on(PluginEvent event) { + + synchronized (FormParaWidgetPane.class) { + THIS = null; + } + } + }, new PluginFilter() { + + @Override + public boolean accept(PluginContext context) { + + return context.contain(PluginModule.ExtraDesign, FormWidgetOptionProvider.XML_TAG); + } + }); + } + + public static synchronized final FormParaWidgetPane getInstance(FormDesigner designer) { if (THIS == null) { THIS = new FormParaWidgetPane(); } From 7195e9f19b2811cad3515576734ecf91b192a6e3 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Fri, 9 Jun 2017 09:54:53 +0800 Subject: [PATCH 34/54] fix --- .../designer/creator/XCreatorUtils.java | 54 +++++++++++-------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java b/designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java index 726c16178..4b6b4240a 100644 --- a/designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java +++ b/designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java @@ -69,6 +69,37 @@ public class XCreatorUtils { private static void init() { + putDefault(); + putExtraEditor(); + putDefaultLayouts(); + reInitExtra(); + } + + private static void putDefaultLayouts() { + + xLayoutMap.put(WAbsoluteLayout.class, XWAbsoluteLayout.class); + xLayoutMap.put(WParameterLayout.class, XWParameterLayout.class); + xLayoutMap.put(WAbsoluteBodyLayout.class, XWAbsoluteBodyLayout.class); + xLayoutMap.put(WAbsoluteLayout.class, XWAbsoluteLayout.class); + xLayoutMap.put(WHorizontalBoxLayout.class, XWHorizontalBoxLayout.class); + xLayoutMap.put(WBorderLayout.class, XWBorderLayout.class); + xLayoutMap.put(WCardLayout.class, XWCardLayout.class); + xLayoutMap.put(WVerticalBoxLayout.class, XWVerticalBoxLayout.class); + xLayoutMap.put(WHorizontalSplitLayout.class, XWHorizontalSplitLayout.class); + xLayoutMap.put(WVerticalSplitLayout.class, XWVerticalSplitLayout.class); + xLayoutMap.put(WGridLayout.class, XWGridLayout.class); + + xLayoutMap.put(WFitLayout.class, XWFitLayout.class); + xLayoutMap.put(WScaleLayout.class, XWScaleLayout.class); + xLayoutMap.put(WTitleLayout.class, XWTitleLayout.class); + xLayoutMap.put(WCardTagLayout.class, XWCardTagLayout.class); + xLayoutMap.put(WCardTitleLayout.class, XWCardTitleLayout.class); + xLayoutMap.put(WTabFitLayout.class, XWTabFitLayout.class); + xLayoutMap.put(WCardMainBorderLayout.class, XWCardMainBorderLayout.class); + } + + private static void putDefault() { + objectMap.put(TextEditor.class, XTextEditor.class); objectMap.put(TextArea.class, XTextArea.class); objectMap.put(NumberEditor.class, XNumberEditor.class); @@ -99,29 +130,6 @@ public class XCreatorUtils { objectMap.put(NameWidget.class, XNameWidget.class); objectMap.put(CardSwitchButton.class, XCardSwitchButton.class); objectMap.put(CardAddButton.class, XCardAddButton.class); - putExtraEditor(); - - xLayoutMap.put(WAbsoluteLayout.class, XWAbsoluteLayout.class); - xLayoutMap.put(WParameterLayout.class, XWParameterLayout.class); - xLayoutMap.put(WAbsoluteBodyLayout.class, XWAbsoluteBodyLayout.class); - xLayoutMap.put(WAbsoluteLayout.class, XWAbsoluteLayout.class); - xLayoutMap.put(WHorizontalBoxLayout.class, XWHorizontalBoxLayout.class); - xLayoutMap.put(WBorderLayout.class, XWBorderLayout.class); - xLayoutMap.put(WCardLayout.class, XWCardLayout.class); - xLayoutMap.put(WVerticalBoxLayout.class, XWVerticalBoxLayout.class); - xLayoutMap.put(WHorizontalSplitLayout.class, XWHorizontalSplitLayout.class); - xLayoutMap.put(WVerticalSplitLayout.class, XWVerticalSplitLayout.class); - xLayoutMap.put(WGridLayout.class, XWGridLayout.class); - - xLayoutMap.put(WFitLayout.class, XWFitLayout.class); - xLayoutMap.put(WScaleLayout.class, XWScaleLayout.class); - xLayoutMap.put(WTitleLayout.class, XWTitleLayout.class); - xLayoutMap.put(WCardTagLayout.class, XWCardTagLayout.class); - xLayoutMap.put(WCardTitleLayout.class, XWCardTitleLayout.class); - xLayoutMap.put(WTabFitLayout.class, XWTabFitLayout.class); - xLayoutMap.put(WCardMainBorderLayout.class, XWCardMainBorderLayout.class); - - reInitExtra(); } private static void reInitExtra() { From f3356e2be00b20e258e65f2964da3ff95628e9fb Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 9 Jun 2017 10:48:10 +0800 Subject: [PATCH 35/54] =?UTF-8?q?REPORT-2354=20=E5=B0=86=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86=E5=92=8C=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=B5=B7=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/extra/PluginOperateUtils.java | 46 +++++++++++++------ .../com/fr/design/extra/PluginWebBridge.java | 7 +++ .../design/extra/exe/callback/JSCallback.java | 3 +- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java index abf97093c..acea728d0 100644 --- a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java +++ b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java @@ -8,6 +8,7 @@ import com.fr.design.extra.exe.extratask.UpdatePluginTask; import com.fr.general.FRLogger; import com.fr.general.SiteCenter; import com.fr.general.http.HttpClient; +import com.fr.json.JSONArray; import com.fr.json.JSONObject; import com.fr.plugin.context.PluginContext; import com.fr.plugin.context.PluginMarker; @@ -17,7 +18,7 @@ import com.fr.plugin.manage.bbs.BBSUserInfo; import com.fr.plugin.manage.control.PluginTaskCallback; import com.fr.plugin.view.PluginView; import com.fr.stable.StringUtils; -import org.json.JSONArray; + import java.io.File; import java.util.List; @@ -107,25 +108,34 @@ public class PluginOperateUtils { } public static void searchPlugin(String keyword, JSCallback jsCallback) { - try { - new Thread(new Runnable() { - @Override - public void run() { - HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("plugin.plist") + "&keyword=" + keyword); + new Thread(new Runnable() { + @Override + public void run() { + try { +// HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("plugin.plist") + "&keyword=" + keyword); + HttpClient httpClient = new HttpClient("http://shop.finereport.com/searchApi?type=all" + "&keyword=" + keyword); + httpClient.asGet(); String result = httpClient.getResponseText(); - jsCallback.execute(result); + JSONObject jsonObject = new JSONObject(result); + JSONArray jsonArray = jsonObject.getJSONArray("result"); + jsCallback.execute(jsonArray.toString()); + } catch (Exception e) { + FRLogger.getLogger().error(e.getMessage()); } - }).start(); - } catch (Exception e) { - FRLogger.getLogger().error(e.getMessage()); - } + } + }).start(); + } public static void getPluginFromStore(String category, String seller, String fee, JSCallback jsCallback) { new Thread(new Runnable() { @Override public void run() { - String plistUrl = SiteCenter.getInstance().acquireUrlByKind("plugin.plist"); +// String plistUrl = SiteCenter.getInstance().acquireUrlByKind("plugin.plist"); + String plistUrl = "http://shop.finereport.com/shopServer?pg=plist"; + if (StringUtils.isEmpty(category) && StringUtils.isEmpty(seller) && StringUtils.isEmpty(fee)){ + plistUrl = "http://shop.finereport.com/ShopServer?pg=feature"; + } if (StringUtils.isNotBlank(plistUrl)) { StringBuilder url = new StringBuilder(); url.append(plistUrl); @@ -159,7 +169,7 @@ public class PluginOperateUtils { @Override public void run() { String result; - String url = SiteCenter.getInstance().acquireUrlByKind("plugin.category"); + String url = "http://shop.finereport.com/shopServer?pg=category"; if (url != null) { HttpClient httpClient = new HttpClient(url); result = httpClient.getResponseText(); @@ -171,6 +181,16 @@ public class PluginOperateUtils { }).start(); } + public static void getPluginPrefix(JSCallback jsCallback) { + new Thread(new Runnable() { + @Override + public void run() { + String result = SiteCenter.getInstance().acquireUrlByKind("plugin.url.prefix"); + jsCallback.execute(result); + } + }).start(); + } + public static void getLoginInfo(JSCallback jsCallback) { BBSUserInfo bbsUserInfo = BBSPluginLogin.getInstance().getUserInfo(); String username = bbsUserInfo == null ? "" : bbsUserInfo.getUserName(); diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer_base/src/com/fr/design/extra/PluginWebBridge.java index 3efa0fd6e..b7cadcbde 100644 --- a/designer_base/src/com/fr/design/extra/PluginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/PluginWebBridge.java @@ -312,6 +312,13 @@ public class PluginWebBridge { PluginOperateUtils.getPluginFromStore(category, seller, fee, jsCallback); } + + public void getPluginPrefix(final JSObject callback){ + JSCallback jsCallback = new JSCallback(webEngine, callback); + PluginOperateUtils.getPluginPrefix(jsCallback); + } + + /** * 在线获取插件分类 * diff --git a/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java index 4d2fb7ade..de7d77949 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java @@ -55,13 +55,14 @@ public class JSCallback extends Task { * 2.js字符串中的\n会导致js字符串变成多行,而js字符串不支持多行拼接 * 3.由JSONObject.toString()得到的字符串中html标签的属性会自动加上\造成替换难度加大, * 这边建议去除所有的html标签 + * 字符\在java中实际存储的是\\,替换字符串\\n, 需要用\\\\n * * @param old 原始字符串 * @return 处理之后的字符串 */ private String trimText(String old) { if (StringUtils.isNotBlank(old)) { - return old.replaceAll("\n", "").replaceAll("\"", "\\\\\"").replaceAll("\'", "\\\\\'"); + return old.replaceAll("\\\\n", "").replaceAll("\"", "\\\\\"").replaceAll("\'", "\\\\\'"); } return StringUtils.EMPTY; } From c156cbc9add19429b2f6409f33cb658a66f7172a Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 9 Jun 2017 11:02:22 +0800 Subject: [PATCH 36/54] PMD --- designer_base/src/com/fr/design/extra/PluginOperateUtils.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java index acea728d0..42d646b11 100644 --- a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java +++ b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java @@ -133,7 +133,8 @@ public class PluginOperateUtils { public void run() { // String plistUrl = SiteCenter.getInstance().acquireUrlByKind("plugin.plist"); String plistUrl = "http://shop.finereport.com/shopServer?pg=plist"; - if (StringUtils.isEmpty(category) && StringUtils.isEmpty(seller) && StringUtils.isEmpty(fee)){ + boolean getRecommend = StringUtils.isEmpty(category) && StringUtils.isEmpty(seller) && StringUtils.isEmpty(fee); + if (getRecommend){ plistUrl = "http://shop.finereport.com/ShopServer?pg=feature"; } if (StringUtils.isNotBlank(plistUrl)) { From 016a70ee471d74aa3ea5b9a9f8498108fada5180 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Fri, 9 Jun 2017 16:00:35 +0800 Subject: [PATCH 37/54] fix --- .../design/gui/frpane/HyperlinkGroupPane.java | 13 -- .../src/com/fr/plugin/PluginManager.java | 128 ------------------ 2 files changed, 141 deletions(-) delete mode 100644 designer_base/src/com/fr/plugin/PluginManager.java diff --git a/designer_base/src/com/fr/design/gui/frpane/HyperlinkGroupPane.java b/designer_base/src/com/fr/design/gui/frpane/HyperlinkGroupPane.java index 99fc5948e..3408bf371 100644 --- a/designer_base/src/com/fr/design/gui/frpane/HyperlinkGroupPane.java +++ b/designer_base/src/com/fr/design/gui/frpane/HyperlinkGroupPane.java @@ -1,8 +1,6 @@ package com.fr.design.gui.frpane; import com.fr.design.ExtraDesignClassManager; -import com.fr.design.actions.HyperlinkPluginAction; -import com.fr.design.actions.UpdateAction; import com.fr.design.fun.HyperlinkProvider; import com.fr.design.gui.controlpane.JListControlPane; import com.fr.design.gui.controlpane.NameableCreator; @@ -12,14 +10,12 @@ import com.fr.general.NameObject; import com.fr.js.JavaScript; import com.fr.js.NameJavaScript; import com.fr.js.NameJavaScriptGroup; -import com.fr.plugin.PluginManager; import com.fr.stable.ListMap; import com.fr.stable.Nameable; import java.util.ArrayList; import java.util.Map; import java.util.Set; -import java.util.TreeMap; /** * 超级链接 界面. @@ -40,15 +36,6 @@ public class HyperlinkGroupPane extends JListControlPane { for (NameableCreator creator : creators) { nameCreators.put(creator.menuName(), creator); } - PluginManager.getInstance().setExtensionPoint(HyperlinkPluginAction.XML_TAG); - ArrayList templateArrayLisy = PluginManager.getInstance().getResultList(); -// if (templateArrayLisy.isEmpty()) { -// return creators; -// } - for (int i = 0; i < templateArrayLisy.size(); i++) { - NameableCreator nameableCreator = ((HyperlinkPluginAction) templateArrayLisy.get(i)).getHyperlinkCreator(); - nameCreators.put(nameableCreator.menuName(), nameableCreator); - } Set providers = ExtraDesignClassManager.getInstance().getArray(HyperlinkProvider.XML_TAG); for (HyperlinkProvider provider : providers) { NameableCreator nc = provider.createHyperlinkCreator(); diff --git a/designer_base/src/com/fr/plugin/PluginManager.java b/designer_base/src/com/fr/plugin/PluginManager.java deleted file mode 100644 index c539db874..000000000 --- a/designer_base/src/com/fr/plugin/PluginManager.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.fr.plugin; - -import com.fr.design.actions.UpdateAction; -import com.fr.file.XMLFileManager; -import com.fr.general.ComparatorUtils; -import com.fr.general.FRLogger; -import com.fr.general.GeneralUtils; -import com.fr.stable.StringUtils; -import com.fr.stable.xml.XMLPrintWriter; -import com.fr.stable.xml.XMLReadable; -import com.fr.stable.xml.XMLableReader; - -import java.util.ArrayList; - -/** - * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 13-12-20 - * Time: 下午5:05 - */ -public class PluginManager extends XMLFileManager { - - private static PluginManager pluginManager = null; - - private String extensionPoint = StringUtils.EMPTY; - - private ArrayList resultList = new ArrayList(); - - - public synchronized static PluginManager getInstance() { - if (pluginManager == null) { - pluginManager = new PluginManager(); - } - return pluginManager; - } - - - public PluginManager() { - - } - - /** - * 文件名 - * @return 文件名 - */ - public String fileName() { - return "plugin.xml"; - } - - - public void setExtensionPoint(String point) { - extensionPoint = point; - resultList.clear(); - pluginManager.readXMLFile(); - } - - - @Override - public void readXML(XMLableReader reader) { - if (extensionPoint == StringUtils.EMPTY) { - return; - } - if (reader.getTagName().equals("PluginManager")) { - reader.readXMLObject(new XMLReadable() { - @Override - public void readXML(XMLableReader reader) { - readExtension(reader); - } - }); - } - - - } - - private void readExtension(XMLableReader reader) { - if (reader.isChildNode()) { - if (reader.getTagName().equals("Extension")) { - String name = null, tmpVal = null; - if ((tmpVal = reader.getAttrAsString("position", null)) != null) { - name = tmpVal; - } - if (!ComparatorUtils.equals(name, extensionPoint)) { - return; - } - reader.readXMLObject(new XMLReadable() { - @Override - public void readXML(XMLableReader reader) { - readActions(reader); - } - }); - - } - } - } - - private void readActions(XMLableReader reader) { - if (reader.isChildNode()) { - if (reader.getTagName().equals("Action")) { - String name = null, tmpVal = null; - if ((tmpVal = reader.getAttrAsString("class", null)) != null) { - name = tmpVal; - } - //读取模板数据集菜单 - if (name.isEmpty()) { - return; - } - try { - UpdateAction action = (UpdateAction) GeneralUtils.classForName(name).newInstance(); - PluginManager.this.resultList.add(action); - } catch (Exception exp) { - FRLogger.getLogger().error(exp.getMessage(), exp); - } - } - } - - } - - - public ArrayList getResultList() { - return resultList; - } - - @Override - public void writeXML(XMLPrintWriter writer) { - } - -} \ No newline at end of file From 27d27a7d722fcb55dcb3eae1d09712892c9286d3 Mon Sep 17 00:00:00 2001 From: kerry Date: Mon, 12 Jun 2017 10:07:03 +0800 Subject: [PATCH 38/54] =?UTF-8?q?REPORT-2354=20=E5=B0=86=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86=E5=92=8C=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=B5=B7=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/extra/PluginOperateUtils.java | 2 +- .../exe/callback/InstallFromDiskCallback.java | 3 ++- .../exe/callback/InstallOnlineCallback.java | 3 ++- .../design/extra/exe/callback/JSCallback.java | 26 ++++++++++++++++++- .../exe/callback/UninstallPluginCallback.java | 24 ++++++++++++++--- .../exe/callback/UpdateFromDiskCallback.java | 11 ++++---- .../exe/callback/UpdateOnlineCallback.java | 10 +++---- 7 files changed, 62 insertions(+), 17 deletions(-) diff --git a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java index 42d646b11..dbb03fc68 100644 --- a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java +++ b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java @@ -80,7 +80,7 @@ public class PluginOperateUtils { public static void uninstallPlugin(final String pluginInfo, final boolean isForce, JSCallback jsCallback) { PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); - PluginManager.getController().uninstall(pluginMarker, isForce, new UninstallPluginCallback(jsCallback)); + PluginManager.getController().uninstall(pluginMarker, isForce, new UninstallPluginCallback(pluginMarker, jsCallback)); } public static void readUpdateOnline(JSCallback jsCallback) { diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java index 64f3ca56d..d0d517543 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java @@ -34,7 +34,7 @@ public class InstallFromDiskCallback extends AbstractPluginTaskCallback { if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else if (result.errorCode() == PluginErrorCode.OperationNotSupport) { + } else if (result.errorCode() == PluginErrorCode.NeedInstallInterPluginDependency) { int rv = JOptionPane.showOptionDialog( null, Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), @@ -50,6 +50,7 @@ public class InstallFromDiskCallback extends AbstractPluginTaskCallback { } PluginManager.getController().install(zipFile, new InstallFromDiskCallback(zipFile, jsCallback)); } else { + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Failed")); JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } } diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java index 40bf674ed..d6182c2b4 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java @@ -33,7 +33,7 @@ public class InstallOnlineCallback extends AbstractPluginTaskCallback { if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else if (result.errorCode() == PluginErrorCode.OperationNotSupport) { + } else if (result.errorCode() == PluginErrorCode.NeedInstallInterPluginDependency) { int rv = JOptionPane.showOptionDialog( null, Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), @@ -50,6 +50,7 @@ public class InstallOnlineCallback extends AbstractPluginTaskCallback { //执行JS回调 PluginManager.getController().install(pluginMarker, new InstallOnlineCallback(pluginMarker, jsCallback)); } else { + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Failed")); JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } } diff --git a/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java index de7d77949..600feceff 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java @@ -56,16 +56,40 @@ public class JSCallback extends Task { * 3.由JSONObject.toString()得到的字符串中html标签的属性会自动加上\造成替换难度加大, * 这边建议去除所有的html标签 * 字符\在java中实际存储的是\\,替换字符串\\n, 需要用\\\\n + * "\t"和"\n" 都要转义成" " 不然会解析出错 + * "\\"需要转换成"\" + * 过滤掉html标签及内容 * * @param old 原始字符串 * @return 处理之后的字符串 */ private String trimText(String old) { if (StringUtils.isNotBlank(old)) { - return old.replaceAll("\\\\n", "").replaceAll("\"", "\\\\\"").replaceAll("\'", "\\\\\'"); + String a = filterHtmlTag(old, "a"); + String b = filterHtmlTag(a, "font"); + return b.replaceAll("\\\\n", "").replaceAll("\\\\t", "").replaceAll("\"", "\\\\\"").replaceAll("\'", "\\\\\'").replaceAll("\\\\\\\\", "\\\\"); } return StringUtils.EMPTY; } + /** + * 进行html标签过滤 + * @param origin 原始字符串 + * @param tag html标签 + * @return 处理之后的字符串 + */ + private String filterHtmlTag(String origin, String tag) { + String matter1 = "<" + tag; + String matter2 = ""; + int a = origin.indexOf(matter1); + int b = origin.indexOf(matter2); + while (a != -1 && b != -1) { + origin = origin.substring(0, a) + origin.substring(b + matter2.length(), origin.length()); + a = origin.indexOf(matter1); + b = origin.indexOf(matter2); + } + return origin; + } + } diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UninstallPluginCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UninstallPluginCallback.java index 983a2a0c5..66e39ec88 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/UninstallPluginCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/UninstallPluginCallback.java @@ -2,7 +2,9 @@ package com.fr.design.extra.exe.callback; import com.fr.general.FRLogger; import com.fr.general.Inter; -import com.fr.plugin.manage.control.PluginTaskCallback; +import com.fr.plugin.context.PluginMarker; +import com.fr.plugin.error.PluginErrorCode; +import com.fr.plugin.manage.PluginManager; import com.fr.plugin.manage.control.PluginTaskResult; import javax.swing.*; @@ -10,11 +12,12 @@ import javax.swing.*; /** * Created by ibm on 2017/5/27. */ -public class UninstallPluginCallback implements PluginTaskCallback { +public class UninstallPluginCallback extends AbstractPluginTaskCallback { private JSCallback jsCallback; - public UninstallPluginCallback(JSCallback jsCallback){ + public UninstallPluginCallback(PluginMarker pluginMarker, JSCallback jsCallback){ this.jsCallback = jsCallback; + this.pluginMarker = pluginMarker; } @Override @@ -23,6 +26,21 @@ public class UninstallPluginCallback implements PluginTaskCallback { jsCallback.execute("success"); FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Delete_Success")); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + }else if (result.errorCode() == PluginErrorCode.NeedInstallInterPluginDependency) { + int rv = JOptionPane.showOptionDialog( + null, + Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Delete_Dependence")), + Inter.getLocText("FR-Designer-Plugin_Delete_Success"), + JOptionPane.YES_NO_CANCEL_OPTION, + JOptionPane.INFORMATION_MESSAGE, + null, + null, + null + ); + if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) { + return; + } + PluginManager.getController().uninstall(pluginMarker, true, new UninstallPluginCallback(pluginMarker, jsCallback)); } else { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Delete_Failed")); JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java index c2190e25a..1ea304bfb 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java @@ -32,13 +32,13 @@ public class UpdateFromDiskCallback extends AbstractPluginTaskCallback { public void done(PluginTaskResult result) { jsCallback.execute("success"); if (result.isSuccess()) { - FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else if (result.errorCode() == PluginErrorCode.OperationNotSupport) { + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Update_Success")); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Update_Success")); + } else if (result.errorCode() == PluginErrorCode.NeedInstallInterPluginDependency) { int rv = JOptionPane.showOptionDialog( null, - Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), - Inter.getLocText("FR-Designer-Plugin_Install_Success"), + Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Update_Dependence")), + Inter.getLocText("FR-Designer-Plugin_Update_Success"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, @@ -50,6 +50,7 @@ public class UpdateFromDiskCallback extends AbstractPluginTaskCallback { } PluginManager.getController().update(zipFile, new UpdateFromDiskCallback(zipFile, jsCallback)); } else { + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Update_Failed")); JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } } diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java index 2285b7a8d..b858b6eee 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java @@ -33,12 +33,12 @@ public class UpdateOnlineCallback extends AbstractPluginTaskCallback { jsCallback.execute("success"); if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Update_Success")); - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); - } else if (result.errorCode() == PluginErrorCode.OperationNotSupport) { + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Update_Success")); + } else if (result.errorCode() == PluginErrorCode.NeedInstallInterPluginDependency) { int rv = JOptionPane.showOptionDialog( null, - Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), - Inter.getLocText("FR-Designer-Plugin_Install_Success"), + Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Update_Dependence")), + Inter.getLocText("FR-Designer-Plugin_Update_Success"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, @@ -50,7 +50,7 @@ public class UpdateOnlineCallback extends AbstractPluginTaskCallback { } PluginManager.getController().update(pluginMarker, toPluginMarker, new UpdateOnlineCallback(pluginMarker, toPluginMarker, jsCallback)); } else { - FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Delete_Failed")); + FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Update_Failed")); JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } } From e384ed0732ea23cbd6c864907d15271a8fa966cd Mon Sep 17 00:00:00 2001 From: kerry Date: Mon, 12 Jun 2017 12:30:01 +0800 Subject: [PATCH 39/54] =?UTF-8?q?REPORT-2354=20=E5=B0=86=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86=E5=92=8C=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=B5=B7=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/extra/PluginOperateUtils.java | 93 ++++++++++++++----- .../design/extra/exe/callback/JSCallback.java | 2 +- 2 files changed, 69 insertions(+), 26 deletions(-) diff --git a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java index dbb03fc68..c40bc5a30 100644 --- a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java +++ b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java @@ -18,6 +18,7 @@ import com.fr.plugin.manage.bbs.BBSUserInfo; import com.fr.plugin.manage.control.PluginTaskCallback; import com.fr.plugin.view.PluginView; import com.fr.stable.StringUtils; +import com.fr.third.v2.org.apache.poi.util.StringUtil; import java.io.File; import java.util.List; @@ -132,39 +133,81 @@ public class PluginOperateUtils { @Override public void run() { // String plistUrl = SiteCenter.getInstance().acquireUrlByKind("plugin.plist"); - String plistUrl = "http://shop.finereport.com/shopServer?pg=plist"; + String plistUrl = "http://shop.finereport.com/plugins" + "?"; boolean getRecommend = StringUtils.isEmpty(category) && StringUtils.isEmpty(seller) && StringUtils.isEmpty(fee); - if (getRecommend){ - plistUrl = "http://shop.finereport.com/ShopServer?pg=feature"; + if (getRecommend) { + getRecommendPlugins(jsCallback); + return; } - if (StringUtils.isNotBlank(plistUrl)) { - StringBuilder url = new StringBuilder(); - url.append(plistUrl); - if (StringUtils.isNotBlank(category)) { - url.append("&cid=").append(category.split("-")[1]); - } - if (StringUtils.isNotBlank(seller)) { - url.append("&seller=").append(seller.split("-")[1]); - } - if (StringUtils.isNotBlank(fee)) { - url.append("&fee=").append(fee.split("-")[1]); - } - try { - HttpClient httpClient = new HttpClient(url.toString()); - String result = httpClient.getResponseText(); - jsCallback.execute(result); - } catch (Exception e) { - FRLogger.getLogger().error(e.getMessage()); - } - } else { - String result = PluginConstants.CONNECTION_404; - jsCallback.execute(result); + + if (StringUtils.isNotBlank(plistUrl)) { + StringBuilder url = new StringBuilder(); + url.append(plistUrl); + dealParams(url, category, seller, fee); + try { + HttpClient httpClient = new HttpClient(url.toString()); + httpClient.asGet(); + String result = httpClient.getResponseText(); + JSONObject resultJSONObject = new JSONObject(result); + JSONArray resultArr = resultJSONObject.getJSONArray("result"); + jsCallback.execute(resultArr.toString()); + } catch (Exception e) { + FRLogger.getLogger().error(e.getMessage()); } + } else { + String result = PluginConstants.CONNECTION_404; + jsCallback.execute(result); } + } + }).start(); } + public static void getRecommendPlugins(JSCallback jsCallback){ + String plistUrl = "http://shop.finereport.com/ShopServer?pg=feature"; + try { + HttpClient httpClient = new HttpClient(plistUrl.toString()); + String result = httpClient.getResponseText(); + jsCallback.execute(result); + } catch (Exception e) { + FRLogger.getLogger().error(e.getMessage()); + } + + } + + public static void dealParams(StringBuilder url, String category, String seller, String fee){ + if (StringUtils.isNotBlank(category)) { + url.append("cid=").append(category.split("-")[1]); + } else { + url.append("cid=").append(""); + } + if (StringUtils.isNotBlank(seller)) { + switch (seller.split("-")[1]) { + case "finereport": + url.append("&seller=").append(1); + break; + case "developer": + url.append("&seller=").append(2); + break; + default: + url.append("&seller=").append(""); + } + } + if (StringUtils.isNotBlank(fee)) { + switch (fee.split("-")[1]) { + case "free": + url.append("&fee=").append(1); + break; + case "charge": + url.append("&fee=").append(2); + break; + default: + url.append("&fee=").append(""); + } + } + } + public static void getPluginCategories(JSCallback jsCallback) { new Thread(new Runnable() { @Override diff --git a/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java index 600feceff..bf421e67f 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java @@ -80,7 +80,7 @@ public class JSCallback extends Task { */ private String filterHtmlTag(String origin, String tag) { String matter1 = "<" + tag; - String matter2 = ""; + String matter2 = tag + ">"; int a = origin.indexOf(matter1); int b = origin.indexOf(matter2); while (a != -1 && b != -1) { From 6033f508d26ff259776af8befe096b5f7f1fb59f Mon Sep 17 00:00:00 2001 From: kerry Date: Mon, 12 Jun 2017 17:04:05 +0800 Subject: [PATCH 40/54] =?UTF-8?q?REPORT-2354=20=E5=B0=86=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86=E5=92=8C=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=B5=B7=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/extra/PluginOperateUtils.java | 4 + .../com/fr/design/extra/PluginWebBridge.java | 15 +++- .../extra/exe/callback/DownloadCallback.java | 1 + .../exe/callback/InstallFromDiskCallback.java | 4 +- .../exe/callback/InstallOnlineCallback.java | 4 +- .../exe/callback/ModifyStatusCallback.java | 2 +- .../exe/callback/UninstallPluginCallback.java | 4 +- .../exe/callback/UpdateFromDiskCallback.java | 2 +- .../exe/callback/UpdateOnlineCallback.java | 2 +- .../com/fr/design/locale/designer.properties | 75 +++++++++++++++++- .../design/locale/designer_en_US.properties | 75 +++++++++++++++++- .../design/locale/designer_ja_JP.properties | 75 +++++++++++++++++- .../design/locale/designer_ko_KR.properties | 75 +++++++++++++++++- .../design/locale/designer_zh_CN.properties | 77 ++++++++++++++++++- .../design/locale/designer_zh_TW.properties | 75 +++++++++++++++++- 15 files changed, 466 insertions(+), 24 deletions(-) diff --git a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java index c40bc5a30..1c9141562 100644 --- a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java +++ b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java @@ -114,6 +114,10 @@ public class PluginOperateUtils { public void run() { try { // HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("plugin.plist") + "&keyword=" + keyword); + if(StringUtils.isBlank(keyword)){ + getRecommendPlugins(jsCallback); + return; + } HttpClient httpClient = new HttpClient("http://shop.finereport.com/searchApi?type=all" + "&keyword=" + keyword); httpClient.asGet(); String result = httpClient.getResponseText(); diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer_base/src/com/fr/design/extra/PluginWebBridge.java index b7cadcbde..416c0491c 100644 --- a/designer_base/src/com/fr/design/extra/PluginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/PluginWebBridge.java @@ -502,12 +502,25 @@ public class PluginWebBridge { DesignerEnvManager.getEnvManager().setInShowBBsName(StringUtils.EMPTY); uiLabel.setText(Inter.getLocText("FR-Base_UnSignIn")); } + + /** + * 初始化设计器部分 + */ public void initExtraDiff(final JSObject callback){ } - public void showLoginContent(){ + /** + * 国际化 + */ + public void parseI18(final String key, final JSObject callback){ + JSCallback jsCallback = new JSCallback(webEngine, callback); + jsCallback.execute(Inter.getLocText("FR-Designer-" + key)); } + + /** + * 是否是在设计器中操作 + */ public boolean isDesigner(){ return true; } diff --git a/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java index 6c5e3eadf..1c851b5d6 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/DownloadCallback.java @@ -29,6 +29,7 @@ public class DownloadCallback extends AbstractPluginTaskCallback { if (result.isSuccess()) { extraPluginTask.doExtraPluginTask(); } else { + jsCallback.execute("failed"); JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } } diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java index d0d517543..9f0fdcdbe 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java @@ -33,12 +33,12 @@ public class InstallFromDiskCallback extends AbstractPluginTaskCallback { jsCallback.execute("success"); if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Success")); } else if (result.errorCode() == PluginErrorCode.NeedInstallInterPluginDependency) { int rv = JOptionPane.showOptionDialog( null, Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), - Inter.getLocText("FR-Designer-Plugin_Install_Success"), + Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java index d6182c2b4..aa1666179 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java @@ -32,12 +32,12 @@ public class InstallOnlineCallback extends AbstractPluginTaskCallback { jsCallback.execute("success"); if (result.isSuccess()) { FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Install_Success")); - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Success")); } else if (result.errorCode() == PluginErrorCode.NeedInstallInterPluginDependency) { int rv = JOptionPane.showOptionDialog( null, Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Install_Dependence")), - Inter.getLocText("FR-Designer-Plugin_Install_Success"), + Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, diff --git a/designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java index a02f7628a..6258dc958 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java @@ -21,7 +21,7 @@ public class ModifyStatusCallback implements PluginTaskCallback{ public void done(PluginTaskResult result) { if (result.isSuccess()) { jsCallback.execute("success"); - String modifyMessage = isActive ? Inter.getLocText("FR-Designer-Plugin_Has_Been_Actived") : Inter.getLocText("FR-Designer-Plugin_Has_Been_Disabled"); + String modifyMessage = isActive ? Inter.getLocText("FR-Designer-Plugin_Actived") : Inter.getLocText("FR-Designer-Plugin_Disabled"); JOptionPane.showMessageDialog(null, modifyMessage); } else { JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UninstallPluginCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UninstallPluginCallback.java index 66e39ec88..52fec77dd 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/UninstallPluginCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/UninstallPluginCallback.java @@ -25,12 +25,12 @@ public class UninstallPluginCallback extends AbstractPluginTaskCallback { if (result.isSuccess()) { jsCallback.execute("success"); FRLogger.getLogger().info(Inter.getLocText("FR-Designer-Plugin_Delete_Success")); - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Install_Successful")); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Plugin_Delete_Success")); }else if (result.errorCode() == PluginErrorCode.NeedInstallInterPluginDependency) { int rv = JOptionPane.showOptionDialog( null, Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Delete_Dependence")), - Inter.getLocText("FR-Designer-Plugin_Delete_Success"), + Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java index 1ea304bfb..978503983 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java @@ -38,7 +38,7 @@ public class UpdateFromDiskCallback extends AbstractPluginTaskCallback { int rv = JOptionPane.showOptionDialog( null, Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Update_Dependence")), - Inter.getLocText("FR-Designer-Plugin_Update_Success"), + Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java index b858b6eee..51f5a3597 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java @@ -38,7 +38,7 @@ public class UpdateOnlineCallback extends AbstractPluginTaskCallback { int rv = JOptionPane.showOptionDialog( null, Inter.getLocText(Inter.getLocText("FR-Designer-Plugin_Update_Dependence")), - Inter.getLocText("FR-Designer-Plugin_Update_Success"), + Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, diff --git a/designer_base/src/com/fr/design/locale/designer.properties b/designer_base/src/com/fr/design/locale/designer.properties index e632fafd2..250838cee 100644 --- a/designer_base/src/com/fr/design/locale/designer.properties +++ b/designer_base/src/com/fr/design/locale/designer.properties @@ -849,7 +849,6 @@ PageSetup-Placement_Center_on_Page=Page Center sure_to_delete=sure to delete Already_exists_not_add_repeat=Already exists, do not add repeat Axis_Title=Axis title -FR-Designer-Plugin_Install_Failed=Install failed FR-Designer-Widget-Style_Frame= MainGraduationUnit=MainGraduationUnit Second_Axis=Second Axis @@ -2006,4 +2005,76 @@ FR-Designer_AlphaFine_ShowAll=show all FR-Designer_AlphaFine_Latest=Latest FR-Designer_AlphaFine_ShowLess=show less FR-Designer_Alphafine=AlphaFine -FR-Designer-Alphafine_No_Remind= \ No newline at end of file +FR-Designer-Alphafine_No_Remind= +FR-Designer-Plugin_Install_Success= +FR-Designer-Plugin_Install_Failed= +FR-Designer-Plugin_Install_Dependence= +FR-Designer-Plugin_Delete_Dependence= +FR-Designer-Plugin_Delete_Success= +FR-Designer-Plugin_Delete_Failed= +FR-Designer-Plugin_Update_Dependence= +FR-Designer-Plugin_Update_Success= +FR-Designer-Plugin_Update_Failed= +FR-Designer-Plugin_Actived= +FR-Designer-Plugin_Disabled= +FR-Designer-Plugin-Store_App= +FR-Designer-Plugin-Store_Businesses= +FR-Designer-Plugin-Store_Official= +FR-Designer-Plugin-Store_Not_Official= +FR-Designer-Plugin-Store_Cost= +FR-Designer-Plugin-Store_Pay= +FR-Designer-Plugin-Store_Free= +FR-Designer-Plugin-Store_Category= +FR-Designer-Plugin-Store_Designer= +FR-Designer-Plugin-Store_Front_End_Display= +FR-Designer-Plugin-Store_Report_Write= +FR-Designer-Plugin-Store_Chart= +FR-Designer-Plugin-Store_BI= +FR-Designer-Plugin-Store_Export_Print= +FR-Designer-Plugin-Store_Mobile_Terminal= +FR-Designer-Plugin-Store_Integrate_Deployment= +FR-Designer-Plugin-Store_Data_Interface= +FR-Designer-Plugin-Store_Form_Components= +FR-Designer-Plugin-Store_Function= +FR-Designer-Plugin-Store_Recommend= +FR-Designer-Plugin-Store_Commodity_Description= +FR-Designer-Plugin-Store_Install= +FR-Designer-Plugin-Store_Install_From_Local= +FR-Designer-Plugin-Store_My_Plugins= +FR-Designer-Plugin-Store_No_Plugins= +FR-Designer-Plugin-Store_Disabled= +FR-Designer-Plugin-Store_Enable= +FR-Designer-Plugin-Store_Delete= +FR-Designer-Plugin-Store_Update= +FR-Designer-Plugin-Store_Update-ALL= +FR-Designer-Plugin-Store_Update_From_Local= +FR-Designer-Plugin-Store_BBS_Account_Login= +FR-Designer-Plugin-Store_Register= +FR-Designer-Plugin-Store_Forgot_Password= +FR-Designer-Plugin-Store_Quick_Login= +FR-Designer-Plugin-Store_Account= +FR-Designer-Plugin-Store_Password= +FR-Designer-Plugin-Store_Not_Login= +FR-Designer-Plugin-Store_Installed= +FR-Designer-Plugin-Store_Plugins_Count= +FR-Designer-Plugin-Store_Key_Word= +FR-Designer-Plugin-Store_Login= +FR-Designer-Plugin-Store_Login_By_QQ= +FR-Designer-Plugin-Store_User_Not_Exist= +FR-Designer-Plugin-Store_User_Password_Error= +FR-Designer-Plugin-Store_Unexpected_Error= +FR-Designer-Plugin-Store_Net_Connect_Failed= +FR-Designer-Plugin-Store_Not_Null= +FR-Designer-Plugin-Store_Switch_Account= +FR-Designer-Plugin-Store_Private_Message= +FR-Designer-Plugin-Store_Jar_Damaged= +FR-Designer-Plugin-Store_Probation= +FR-Designer-Plugin-Store_Authorize= +FR-Designer-Plugin-Store_Permanent= +FR-Designer-Plugin-Store_Expired= +FR-Designer-Plugin-Store_Day= +FR-Designer-Plugin-Store_Finereport= +FR-Designer-Plugin-Store_Version= +FR-Designer-Plugin-Store_Developer= +FR-Designer-Plugin-Store_Jar= +FR-Designer-Plugin-Store_Disconnected= \ No newline at end of file diff --git a/designer_base/src/com/fr/design/locale/designer_en_US.properties b/designer_base/src/com/fr/design/locale/designer_en_US.properties index 774beedf5..bab429c8f 100644 --- a/designer_base/src/com/fr/design/locale/designer_en_US.properties +++ b/designer_base/src/com/fr/design/locale/designer_en_US.properties @@ -850,7 +850,6 @@ PageSetup-Placement_Center_on_Page=Center on Page sure_to_delete=sure to delete Already_exists_not_add_repeat=Already exist, please do not repeat Axis_Title=Axis title -FR-Designer-Plugin_Install_Failed=Install failed FR-Designer-Widget-Style_Frame=Frame MainGraduationUnit=Major Graduation Unit Second_Axis=Secondary Axis @@ -2004,4 +2003,76 @@ FR-Designer_AlphaFine_ShowAll=show all FR-Designer_AlphaFine_Latest=Recent FR-Designer_AlphaFine_ShowLess=show less FR-Designer_Alphafine=AlphaFine -FR-Designer-Alphafine_No_Remind=don't remind \ No newline at end of file +FR-Designer-Alphafine_No_Remind=don't remind +FR-Designer-Plugin_Install_Success= +FR-Designer-Plugin_Install_Failed= +FR-Designer-Plugin_Install_Dependence= +FR-Designer-Plugin_Delete_Dependence= +FR-Designer-Plugin_Delete_Success= +FR-Designer-Plugin_Delete_Failed= +FR-Designer-Plugin_Update_Dependence= +FR-Designer-Plugin_Update_Success= +FR-Designer-Plugin_Update_Failed= +FR-Designer-Plugin_Actived= +FR-Designer-Plugin_Disabled= +FR-Designer-Plugin-Store_App= +FR-Designer-Plugin-Store_Businesses= +FR-Designer-Plugin-Store_Official= +FR-Designer-Plugin-Store_Not_Official= +FR-Designer-Plugin-Store_Cost= +FR-Designer-Plugin-Store_Pay= +FR-Designer-Plugin-Store_Free= +FR-Designer-Plugin-Store_Category= +FR-Designer-Plugin-Store_Designer= +FR-Designer-Plugin-Store_Front_End_Display= +FR-Designer-Plugin-Store_Report_Write= +FR-Designer-Plugin-Store_Chart= +FR-Designer-Plugin-Store_BI= +FR-Designer-Plugin-Store_Export_Print= +FR-Designer-Plugin-Store_Mobile_Terminal= +FR-Designer-Plugin-Store_Integrate_Deployment= +FR-Designer-Plugin-Store_Data_Interface= +FR-Designer-Plugin-Store_Form_Components= +FR-Designer-Plugin-Store_Function= +FR-Designer-Plugin-Store_Recommend= +FR-Designer-Plugin-Store_Commodity_Description= +FR-Designer-Plugin-Store_Install= +FR-Designer-Plugin-Store_Install_From_Local= +FR-Designer-Plugin-Store_My_Plugins= +FR-Designer-Plugin-Store_No_Plugins= +FR-Designer-Plugin-Store_Disabled= +FR-Designer-Plugin-Store_Enable= +FR-Designer-Plugin-Store_Delete= +FR-Designer-Plugin-Store_Update= +FR-Designer-Plugin-Store_Update-ALL= +FR-Designer-Plugin-Store_Update_From_Local= +FR-Designer-Plugin-Store_BBS_Account_Login= +FR-Designer-Plugin-Store_Register= +FR-Designer-Plugin-Store_Forgot_Password= +FR-Designer-Plugin-Store_Quick_Login= +FR-Designer-Plugin-Store_Account= +FR-Designer-Plugin-Store_Password= +FR-Designer-Plugin-Store_Not_Login= +FR-Designer-Plugin-Store_Installed= +FR-Designer-Plugin-Store_Plugins_Count= +FR-Designer-Plugin-Store_Key_Word= +FR-Designer-Plugin-Store_Login= +FR-Designer-Plugin-Store_Login_By_QQ= +FR-Designer-Plugin-Store_User_Not_Exist= +FR-Designer-Plugin-Store_User_Password_Error= +FR-Designer-Plugin-Store_Unexpected_Error= +FR-Designer-Plugin-Store_Net_Connect_Failed= +FR-Designer-Plugin-Store_Not_Null= +FR-Designer-Plugin-Store_Switch_Account= +FR-Designer-Plugin-Store_Private_Message= +FR-Designer-Plugin-Store_Jar_Damaged= +FR-Designer-Plugin-Store_Probation= +FR-Designer-Plugin-Store_Authorize= +FR-Designer-Plugin-Store_Permanent= +FR-Designer-Plugin-Store_Expired= +FR-Designer-Plugin-Store_Day= +FR-Designer-Plugin-Store_Finereport= +FR-Designer-Plugin-Store_Version= +FR-Designer-Plugin-Store_Developer= +FR-Designer-Plugin-Store_Jar= +FR-Designer-Plugin-Store_Disconnected= \ No newline at end of file diff --git a/designer_base/src/com/fr/design/locale/designer_ja_JP.properties b/designer_base/src/com/fr/design/locale/designer_ja_JP.properties index 9cb8cd654..ccec13290 100644 --- a/designer_base/src/com/fr/design/locale/designer_ja_JP.properties +++ b/designer_base/src/com/fr/design/locale/designer_ja_JP.properties @@ -845,7 +845,6 @@ PageSetup-Placement_Center_on_Page=\u4E2D\u592E\u63C3\u3048 sure_to_delete=\u524A\u9664\u3092\u78BA\u8A8D\u3057\u307E\u3059 Already_exists_not_add_repeat=\u3059\u3067\u306B\u5B58\u5728\u3057\u3066\u3044\u308B\u3001\u30EA\u30D4\u30FC\u30C8\u3092\u8FFD\u52A0\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044 Axis_Title=\u8EF8\u306E\u8868\u984C -FR-Designer-Plugin_Install_Failed=\u30D7\u30E9\u30B0\u30A4\u30F3\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u306B\u5931\u6557\u3057\u307E\u3057\u305F FR-Designer-Widget-Style_Frame=\u30D5\u30EC\u30FC\u30E0 MainGraduationUnit=\u4E3B\u306A\u76EE\u76DB\u308A\u5358\u4F4D Second_Axis=\u6B21\u5EA7\u6A19\u8EF8 @@ -1982,4 +1981,76 @@ FR-Designer_Edit_String_To_Formula=\u30AD\u30E3\u30E9\u30AF\u30BF\u30FC\u6587\u5 FR-Base_UnSignIn=\ \u672A\u30ED\u30B0\u30A4\u30F3 Every=\u6BCF CellWrite-Preview_Cell_Content=\u30BB\u30EB\u306E\u5185\u5BB9\u3092\u30D7\u30EC\u30D3\u30E5\u30FC\u3059\u308B -FormulaD-Data_Fields=\u30C7\u30FC\u30BF\u30D5\u30A3\u30FC\u30EB\u30C9 \ No newline at end of file +FormulaD-Data_Fields=\u30C7\u30FC\u30BF\u30D5\u30A3\u30FC\u30EB\u30C9 +FR-Designer-Plugin_Install_Success= +FR-Designer-Plugin_Install_Failed= +FR-Designer-Plugin_Install_Dependence= +FR-Designer-Plugin_Delete_Dependence= +FR-Designer-Plugin_Delete_Success= +FR-Designer-Plugin_Delete_Failed= +FR-Designer-Plugin_Update_Dependence= +FR-Designer-Plugin_Update_Success= +FR-Designer-Plugin_Update_Failed= +FR-Designer-Plugin_Actived= +FR-Designer-Plugin_Disabled= +FR-Designer-Plugin-Store_App= +FR-Designer-Plugin-Store_Businesses= +FR-Designer-Plugin-Store_Official= +FR-Designer-Plugin-Store_Not_Official= +FR-Designer-Plugin-Store_Cost= +FR-Designer-Plugin-Store_Pay= +FR-Designer-Plugin-Store_Free= +FR-Designer-Plugin-Store_Category= +FR-Designer-Plugin-Store_Designer= +FR-Designer-Plugin-Store_Front_End_Display= +FR-Designer-Plugin-Store_Report_Write= +FR-Designer-Plugin-Store_Chart= +FR-Designer-Plugin-Store_BI= +FR-Designer-Plugin-Store_Export_Print= +FR-Designer-Plugin-Store_Mobile_Terminal= +FR-Designer-Plugin-Store_Integrate_Deployment= +FR-Designer-Plugin-Store_Data_Interface= +FR-Designer-Plugin-Store_Form_Components= +FR-Designer-Plugin-Store_Function= +FR-Designer-Plugin-Store_Recommend= +FR-Designer-Plugin-Store_Commodity_Description= +FR-Designer-Plugin-Store_Install= +FR-Designer-Plugin-Store_Install_From_Local= +FR-Designer-Plugin-Store_My_Plugins= +FR-Designer-Plugin-Store_No_Plugins= +FR-Designer-Plugin-Store_Disabled= +FR-Designer-Plugin-Store_Enable= +FR-Designer-Plugin-Store_Delete= +FR-Designer-Plugin-Store_Update= +FR-Designer-Plugin-Store_Update-ALL= +FR-Designer-Plugin-Store_Update_From_Local= +FR-Designer-Plugin-Store_BBS_Account_Login= +FR-Designer-Plugin-Store_Register= +FR-Designer-Plugin-Store_Forgot_Password= +FR-Designer-Plugin-Store_Quick_Login= +FR-Designer-Plugin-Store_Account= +FR-Designer-Plugin-Store_Password= +FR-Designer-Plugin-Store_Not_Login= +FR-Designer-Plugin-Store_Installed= +FR-Designer-Plugin-Store_Plugins_Count= +FR-Designer-Plugin-Store_Key_Word= +FR-Designer-Plugin-Store_Login= +FR-Designer-Plugin-Store_Login_By_QQ= +FR-Designer-Plugin-Store_User_Not_Exist= +FR-Designer-Plugin-Store_User_Password_Error= +FR-Designer-Plugin-Store_Unexpected_Error= +FR-Designer-Plugin-Store_Net_Connect_Failed= +FR-Designer-Plugin-Store_Not_Null= +FR-Designer-Plugin-Store_Switch_Account= +FR-Designer-Plugin-Store_Private_Message= +FR-Designer-Plugin-Store_Jar_Damaged= +FR-Designer-Plugin-Store_Probation= +FR-Designer-Plugin-Store_Authorize= +FR-Designer-Plugin-Store_Permanent= +FR-Designer-Plugin-Store_Expired= +FR-Designer-Plugin-Store_Day= +FR-Designer-Plugin-Store_Finereport= +FR-Designer-Plugin-Store_Version= +FR-Designer-Plugin-Store_Developer= +FR-Designer-Plugin-Store_Jar= +FR-Designer-Plugin-Store_Disconnected= \ No newline at end of file diff --git a/designer_base/src/com/fr/design/locale/designer_ko_KR.properties b/designer_base/src/com/fr/design/locale/designer_ko_KR.properties index 93a796d79..d561a2e6c 100644 --- a/designer_base/src/com/fr/design/locale/designer_ko_KR.properties +++ b/designer_base/src/com/fr/design/locale/designer_ko_KR.properties @@ -846,7 +846,6 @@ PageSetup-Placement_Center_on_Page=\uAC00\uC6B4\uB370\uC815\uB82C\uBC29\uC2DD sure_to_delete=\uC0AD\uC81C\uD655\uC778 Already_exists_not_add_repeat=\uC774\uBBF8\uC874\uC7AC\uD569\uB2C8\uB2E4.\uC911\uBCF5\uCD94\uAC00\uD558\uC9C0\uB9C8\uC2ED\uC2DC\uC624. Axis_Title=\uCD95\uC81C\uBAA9 -FR-Designer-Plugin_Install_Failed=\uD50C\uB7EC\uADF8\uC778\uC124\uCE58\uC2E4\uD328 FR-Designer-Widget-Style_Frame=\uD504\uB808\uC784 MainGraduationUnit=\uC8FC\uB208\uAE08\uB2E8\uC704 Second_Axis=\uBCF4\uC870\uC88C\uD45C\uCD95 @@ -1983,4 +1982,76 @@ FR-Designer_Edit_String_To_Formula=\uBB38\uC790\uC5F4\uC744\uC218\uC2DD\uC73C\uB FR-Base_UnSignIn=\uC544\uC9C1 \uB4F1\uB85D Every=\uAC01 CellWrite-Preview_Cell_Content=\uC140\uB0B4\uC6A9\uBBF8\uB9AC\uBCF4\uAE30 -FormulaD-Data_Fields=\uB370\uC774\uD130\uD56D\uBAA9 \ No newline at end of file +FormulaD-Data_Fields=\uB370\uC774\uD130\uD56D\uBAA9 +FR-Designer-Plugin_Install_Success= +FR-Designer-Plugin_Install_Failed= +FR-Designer-Plugin_Install_Dependence= +FR-Designer-Plugin_Delete_Dependence= +FR-Designer-Plugin_Delete_Success= +FR-Designer-Plugin_Delete_Failed= +FR-Designer-Plugin_Update_Dependence= +FR-Designer-Plugin_Update_Success= +FR-Designer-Plugin_Update_Failed= +FR-Designer-Plugin_Actived= +FR-Designer-Plugin_Disabled= +FR-Designer-Plugin-Store_App= +FR-Designer-Plugin-Store_Businesses= +FR-Designer-Plugin-Store_Official= +FR-Designer-Plugin-Store_Not_Official= +FR-Designer-Plugin-Store_Cost= +FR-Designer-Plugin-Store_Pay= +FR-Designer-Plugin-Store_Free= +FR-Designer-Plugin-Store_Category= +FR-Designer-Plugin-Store_Designer= +FR-Designer-Plugin-Store_Front_End_Display= +FR-Designer-Plugin-Store_Report_Write= +FR-Designer-Plugin-Store_Chart= +FR-Designer-Plugin-Store_BI= +FR-Designer-Plugin-Store_Export_Print= +FR-Designer-Plugin-Store_Mobile_Terminal= +FR-Designer-Plugin-Store_Integrate_Deployment= +FR-Designer-Plugin-Store_Data_Interface= +FR-Designer-Plugin-Store_Form_Components= +FR-Designer-Plugin-Store_Function= +FR-Designer-Plugin-Store_Recommend= +FR-Designer-Plugin-Store_Commodity_Description= +FR-Designer-Plugin-Store_Install= +FR-Designer-Plugin-Store_Install_From_Local= +FR-Designer-Plugin-Store_My_Plugins= +FR-Designer-Plugin-Store_No_Plugins= +FR-Designer-Plugin-Store_Disabled= +FR-Designer-Plugin-Store_Enable= +FR-Designer-Plugin-Store_Delete= +FR-Designer-Plugin-Store_Update= +FR-Designer-Plugin-Store_Update-ALL= +FR-Designer-Plugin-Store_Update_From_Local= +FR-Designer-Plugin-Store_BBS_Account_Login= +FR-Designer-Plugin-Store_Register= +FR-Designer-Plugin-Store_Forgot_Password= +FR-Designer-Plugin-Store_Quick_Login= +FR-Designer-Plugin-Store_Account= +FR-Designer-Plugin-Store_Password= +FR-Designer-Plugin-Store_Not_Login= +FR-Designer-Plugin-Store_Installed= +FR-Designer-Plugin-Store_Plugins_Count= +FR-Designer-Plugin-Store_Key_Word= +FR-Designer-Plugin-Store_Login= +FR-Designer-Plugin-Store_Login_By_QQ= +FR-Designer-Plugin-Store_User_Not_Exist= +FR-Designer-Plugin-Store_User_Password_Error= +FR-Designer-Plugin-Store_Unexpected_Error= +FR-Designer-Plugin-Store_Net_Connect_Failed= +FR-Designer-Plugin-Store_Not_Null= +FR-Designer-Plugin-Store_Switch_Account= +FR-Designer-Plugin-Store_Private_Message= +FR-Designer-Plugin-Store_Jar_Damaged= +FR-Designer-Plugin-Store_Probation= +FR-Designer-Plugin-Store_Authorize= +FR-Designer-Plugin-Store_Permanent= +FR-Designer-Plugin-Store_Expired= +FR-Designer-Plugin-Store_Day= +FR-Designer-Plugin-Store_Finereport= +FR-Designer-Plugin-Store_Version= +FR-Designer-Plugin-Store_Developer= +FR-Designer-Plugin-Store_Jar= +FR-Designer-Plugin-Store_Disconnected= \ No newline at end of file diff --git a/designer_base/src/com/fr/design/locale/designer_zh_CN.properties b/designer_base/src/com/fr/design/locale/designer_zh_CN.properties index 008f2df8d..e2f3cd6b3 100644 --- a/designer_base/src/com/fr/design/locale/designer_zh_CN.properties +++ b/designer_base/src/com/fr/design/locale/designer_zh_CN.properties @@ -845,7 +845,6 @@ PageSetup-Placement_Center_on_Page=\u5C45\u4E2D\u65B9\u5F0F sure_to_delete=\u786E\u8BA4\u5220\u9664 Already_exists_not_add_repeat=\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u4E0D\u8981\u91CD\u590D\u6DFB\u52A0 Axis_Title=\u8F74\u6807\u9898 -FR-Designer-Plugin_Install_Failed=\u63D2\u4EF6\u5B89\u88C5\u5931\u8D25 FR-Designer-Widget-Style_Frame=\u6846\u67B6 MainGraduationUnit=\u4E3B\u8981\u523B\u5EA6\u5355\u4F4D Second_Axis=\u6B21\u5750\u6807\u8F74 @@ -1207,7 +1206,6 @@ FS_Start_Date=\u8D77\u59CB\u65E5\u671F FR-ConditionB_Operator=\u64CD\u4F5C\u7B26 Printer-Alias=\u522B\u540D DS-Class_Name=\u7C7B\u540D -FR-Designer-Plugin_Has_Been_Disabled=\u63D2\u4EF6\u5DF2\u88AB\u7981\u7528\uFF0C\u91CD\u542F\u8BBE\u8BA1\u5668\u53CA\u670D\u52A1\u5668\u751F\u6548\uFF0C\u670D\u52A1\u5668\u9700\u624B\u52A8\u91CD\u542F Sort-Original=\u4E0D\u6392\u5E8F Utils-Top_to_Bottom_a=\u4ECE\u4E0A\u5F80\u4E0B Parameter-String=\u5B57\u7B26\u4E32 @@ -1460,7 +1458,6 @@ DBCP_TEST_ON_BORROW=\u83B7\u53D6\u8FDE\u63A5\u524D\u68C0\u9A8C FR-Designer_layerIndex=\u4F9D\u8D56\u7684\u5C42\u6570 WEB-Write_Setting=\u586B\u62A5\u9875\u9762\u8BBE\u7F6E M-New_WorkBook=\u65B0\u5EFA\u5DE5\u4F5C\u7C3F -FR-Designer-Plugin_Has_Been_Actived=\u63D2\u4EF6\u5DF2\u88AB\u542F\u7528\uFF0C\u91CD\u542F\u8BBE\u8BA1\u5668\u53CA\u670D\u52A1\u5668\u751F\u6548\uFF0C\u670D\u52A1\u5668\u9700\u624B\u52A8\u91CD\u542F Datasource-Maximum_Number_of_Preview_Rows=\u6700\u5927\u7684\u9884\u89C8\u884C\u6570 ExpandD-Cell_Expand_Attributes=\u6269\u5C55\u5C5E\u6027 Select_the_repeated_row_and_column=\u9009\u62E9\u9700\u8981\u91CD\u590D\u7684\u884C\u5217 @@ -2002,4 +1999,76 @@ FR-Designer_AlphaFine_Conclude=\u731C\u60A8\u9700\u8981 FR-Designer_AlphaFine_Latest=\u672C\u5730\u5E38\u7528 FR-Designer_AlphaFine_ShowLess=\u6536\u8D77 FR-Designer_Alphafine=AlphaFine\u667A\u80FD\u641C\u7D22 -FR-Designer-Alphafine_No_Remind=\u4E0D\u518D\u63D0\u793A \ No newline at end of file +FR-Designer-Alphafine_No_Remind=\u4E0D\u518D\u63D0\u793A +FR-Designer-Plugin_Install_Success=\u63D2\u4EF6\u5B89\u88C5\u6210\u529F +FR-Designer-Plugin_Install_Failed=\u63D2\u4EF6\u5B89\u88C5\u5931\u8D25 +FR-Designer-Plugin_Install_Dependence=\u662F\u5426\u5B89\u88C5\u4F9D\u8D56\u73AF\u5883 +FR-Designer-Plugin_Delete_Dependence=\u662F\u5426\u5220\u9664\u4F9D\u8D56\u73AF\u5883 +FR-Designer-Plugin_Delete_Success=\u63D2\u4EF6\u5220\u9664\u6210\u529F +FR-Designer-Plugin_Delete_Failed=\u63D2\u4EF6\u5220\u9664\u5931\u8D25 +FR-Designer-Plugin_Update_Dependence=\u662F\u5426\u66F4\u65B0\u4F9D\u8D56\u73AF\u5883 +FR-Designer-Plugin_Update_Success=\u63D2\u4EF6\u66F4\u65B0\u6210\u529F +FR-Designer-Plugin_Update_Failed=\u63D2\u4EF6\u66F4\u65B0\u5931\u8D25 +FR-Designer-Plugin_Actived=\u63D2\u4EF6\u5DF2\u88AB\u542F\u7528 +FR-Designer-Plugin_Disabled=\u63D2\u4EF6\u5DF2\u88AB\u7981\u7528 +FR-Designer-Plugin-Store_App=\u5E94\u7528\u5546\u57CE +FR-Designer-Plugin-Store_Businesses=\u5546\u5BB6 +FR-Designer-Plugin-Store_Official=\u5B98\u65B9(\u5E06\u8F6F) +FR-Designer-Plugin-Store_Not_Official=\u975E\u5B98\u65B9 +FR-Designer-Plugin-Store_Cost=\u8D39\u7528 +FR-Designer-Plugin-Store_Pay=\u4ED8\u8D39 +FR-Designer-Plugin-Store_Free=\u514D\u8D39 +FR-Designer-Plugin-Store_Category=\u7C7B\u522B +FR-Designer-Plugin-Store_Designer=\u8BBE\u8BA1\u5668 +FR-Designer-Plugin-Store_Front_End_Display=\u524D\u7AEF\u5C55\u73B0 +FR-Designer-Plugin-Store_Report_Write=\u586B\u62A5 +FR-Designer-Plugin-Store_Chart=\u56FE\u8868 +FR-Designer-Plugin-Store_BI=\u51B3\u7B56\u5E73\u53F0 +FR-Designer-Plugin-Store_Export_Print=\u5BFC\u51FA\u6253\u5370 +FR-Designer-Plugin-Store_Mobile_Terminal=\u79FB\u52A8\u7AEF +FR-Designer-Plugin-Store_Integrate_Deployment=\u90E8\u7F72\u96C6\u6210 +FR-Designer-Plugin-Store_Data_Interface=\u6570\u636E\u63A5\u53E3 +FR-Designer-Plugin-Store_Form_Components=\u8868\u5355\u7EC4\u4EF6 +FR-Designer-Plugin-Store_Function=\u51FD\u6570 +FR-Designer-Plugin-Store_Recommend=\u63A8\u8350 +FR-Designer-Plugin-Store_Commodity_Description=\u5546\u54C1|\u7248\u672C\u53F7|\u8BF4\u660E +FR-Designer-Plugin-Store_Install=\u5B89\u88C5 +FR-Designer-Plugin-Store_Install_From_Local=\u4ECE\u672C\u5730\u5B89\u88C5 +FR-Designer-Plugin-Store_My_Plugins=\u6211\u7684\u63D2\u4EF6 +FR-Designer-Plugin-Store_No_Plugins=\u5DF2\u5B89\u88C5\u4E860\u4E2A\u63D2\u4EF6 +FR-Designer-Plugin-Store_Disabled=\u7981\u7528 +FR-Designer-Plugin-Store_Enable=\u542F\u7528 +FR-Designer-Plugin-Store_Delete=\u5220\u9664 +FR-Designer-Plugin-Store_Update=\u66F4\u65B0 +FR-Designer-Plugin-Store_Update-ALL=\u5168\u90E8\u66F4\u65B0 +FR-Designer-Plugin-Store_Update_From_Local=\u4ECE\u672C\u5730\u66F4\u65B0 +FR-Designer-Plugin-Store_BBS_Account_Login=\u8BBA\u575B\u8D26\u53F7\u767B\u5F55 +FR-Designer-Plugin-Store_Register=\u6CE8\u518C +FR-Designer-Plugin-Store_Forgot_Password=\u5FD8\u8BB0\u5BC6\u7801 +FR-Designer-Plugin-Store_Quick_Login=\u5FEB\u6377\u767B\u5F55: +FR-Designer-Plugin-Store_Account=\u8D26\u53F7 +FR-Designer-Plugin-Store_Password=\u5BC6\u7801 +FR-Designer-Plugin-Store_Not_Login=\u672A\u767B\u5F55 +FR-Designer-Plugin-Store_Installed=\u5DF2\u5B89\u88C5 +FR-Designer-Plugin-Store_Plugins_Count=\u4E2A\u63D2\u4EF6 +FR-Designer-Plugin-Store_Key_Word=\u5173\u952E\u5B57 +FR-Designer-Plugin-Store_Login=\u767B\u5F55 +FR-Designer-Plugin-Store_Login_By_QQ=\u7528QQ\u53F7\u767B\u5F55 +FR-Designer-Plugin-Store_User_Not_Exist=\u7528\u6237\u540D\u4E0D\u5B58\u5728 +FR-Designer-Plugin-Store_User_Password_Error=\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF +FR-Designer-Plugin-Store_Unexpected_Error=\u672A\u77E5\u9519\u8BEF +FR-Designer-Plugin-Store_Net_Connect_Failed=\u7F51\u7EDC\u8FDE\u63A5\u5931\u8D25 +FR-Designer-Plugin-Store_Not_Null=\u7528\u6237\u540D\u6216\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A +FR-Designer-Plugin-Store_Switch_Account=\u5207\u6362\u8D26\u6237 +FR-Designer-Plugin-Store_Private_Message=\u79C1\u4EBA\u6D88\u606F +FR-Designer-Plugin-Store_Jar_Damaged=Jar\u5305\u635F\u574F +FR-Designer-Plugin-Store_Probation=\u8BD5\u7528: +FR-Designer-Plugin-Store_Authorize=\u6388\u6743: +FR-Designer-Plugin-Store_Permanent=\u6C38\u4E45 +FR-Designer-Plugin-Store_Expired=\u8FC7\u671F +FR-Designer-Plugin-Store_Day=\u5929 +FR-Designer-Plugin-Store_Finereport=\u5E06\u8F6F +FR-Designer-Plugin-Store_Version=\u7248\u672C +FR-Designer-Plugin-Store_Developer=\u5F00\u53D1\u8005 +FR-Designer-Plugin-Store_Jar=jar\u5305 +FS-Plugin-Store_Disconnected=\u65E0\u6CD5\u8FDE\u63A5\u5E94\u7528\u4E2D\u5FC3 diff --git a/designer_base/src/com/fr/design/locale/designer_zh_TW.properties b/designer_base/src/com/fr/design/locale/designer_zh_TW.properties index 4a8a86d71..74fadd0e9 100644 --- a/designer_base/src/com/fr/design/locale/designer_zh_TW.properties +++ b/designer_base/src/com/fr/design/locale/designer_zh_TW.properties @@ -845,7 +845,6 @@ PageSetup-Placement_Center_on_Page=\u7F6E\u4E2D\u65B9\u5F0F sure_to_delete=\u78BA\u8A8D\u522A\u9664 Already_exists_not_add_repeat=\u5DF2\u7D93\u5B58\u5728\uFF0C\u8ACB\u4E0D\u8981\u91CD\u8907\u65B0\u589E Axis_Title=\u8EF8\u6A19\u984C -FR-Designer-Plugin_Install_Failed=Install failed FR-Designer-Widget-Style_Frame=\u6846\u67B6 MainGraduationUnit=\u4E3B\u8981\u523B\u5EA6\u55AE\u4F4D Second_Axis=\u6B21\u5750\u6A19\u8EF8 @@ -2000,4 +1999,76 @@ FR-Designer_AlphaFine_Latest=\u6700\u8FD1\u5E38\u7528 FR-Designer_AlphaFine_ShowLess=\u6536\u8D77 FR-Designer_Alphafine=AlphaFine\u667A\u80FD\u641C\u7D22 FR-Designer_AlphaFine_ShowAll=\u986F\u793A\u5168\u90E8 -FR-Designer-Alphafine_No_Remind=\u4E0D\u518D\u63D0\u793A \ No newline at end of file +FR-Designer-Alphafine_No_Remind=\u4E0D\u518D\u63D0\u793A +FR-Designer-Plugin_Install_Success= +FR-Designer-Plugin_Install_Failed= +FR-Designer-Plugin_Install_Dependence= +FR-Designer-Plugin_Delete_Dependence= +FR-Designer-Plugin_Delete_Success= +FR-Designer-Plugin_Delete_Failed= +FR-Designer-Plugin_Update_Dependence= +FR-Designer-Plugin_Update_Success= +FR-Designer-Plugin_Update_Failed= +FR-Designer-Plugin_Actived= +FR-Designer-Plugin_Disabled= +FR-Designer-Plugin-Store_App= +FR-Designer-Plugin-Store_Businesses= +FR-Designer-Plugin-Store_Official= +FR-Designer-Plugin-Store_Not_Official= +FR-Designer-Plugin-Store_Cost= +FR-Designer-Plugin-Store_Pay= +FR-Designer-Plugin-Store_Free= +FR-Designer-Plugin-Store_Category= +FR-Designer-Plugin-Store_Designer= +FR-Designer-Plugin-Store_Front_End_Display= +FR-Designer-Plugin-Store_Report_Write= +FR-Designer-Plugin-Store_Chart= +FR-Designer-Plugin-Store_BI= +FR-Designer-Plugin-Store_Export_Print= +FR-Designer-Plugin-Store_Mobile_Terminal= +FR-Designer-Plugin-Store_Integrate_Deployment= +FR-Designer-Plugin-Store_Data_Interface= +FR-Designer-Plugin-Store_Form_Components= +FR-Designer-Plugin-Store_Function= +FR-Designer-Plugin-Store_Recommend= +FR-Designer-Plugin-Store_Commodity_Description= +FR-Designer-Plugin-Store_Install= +FR-Designer-Plugin-Store_Install_From_Local= +FR-Designer-Plugin-Store_My_Plugins= +FR-Designer-Plugin-Store_No_Plugins= +FR-Designer-Plugin-Store_Disabled= +FR-Designer-Plugin-Store_Enable= +FR-Designer-Plugin-Store_Delete= +FR-Designer-Plugin-Store_Update= +FR-Designer-Plugin-Store_Update-ALL= +FR-Designer-Plugin-Store_Update_From_Local= +FR-Designer-Plugin-Store_BBS_Account_Login= +FR-Designer-Plugin-Store_Register= +FR-Designer-Plugin-Store_Forgot_Password= +FR-Designer-Plugin-Store_Quick_Login= +FR-Designer-Plugin-Store_Account= +FR-Designer-Plugin-Store_Password= +FR-Designer-Plugin-Store_Not_Login= +FR-Designer-Plugin-Store_Installed= +FR-Designer-Plugin-Store_Plugins_Count= +FR-Designer-Plugin-Store_Key_Word= +FR-Designer-Plugin-Store_Login= +FR-Designer-Plugin-Store_Login_By_QQ= +FR-Designer-Plugin-Store_User_Not_Exist= +FR-Designer-Plugin-Store_User_Password_Error= +FR-Designer-Plugin-Store_Unexpected_Error= +FR-Designer-Plugin-Store_Net_Connect_Failed= +FR-Designer-Plugin-Store_Not_Null= +FR-Designer-Plugin-Store_Switch_Account= +FR-Designer-Plugin-Store_Private_Message= +FR-Designer-Plugin-Store_Jar_Damaged= +FR-Designer-Plugin-Store_Probation= +FR-Designer-Plugin-Store_Authorize= +FR-Designer-Plugin-Store_Permanent= +FR-Designer-Plugin-Store_Expired= +FR-Designer-Plugin-Store_Day= +FR-Designer-Plugin-Store_Finereport= +FR-Designer-Plugin-Store_Version= +FR-Designer-Plugin-Store_Developer= +FR-Designer-Plugin-Store_Jar= +FR-Designer-Plugin-Store_Disconnected= \ No newline at end of file From 762ff0495ead61c84f541b42775bb4da8023ceab Mon Sep 17 00:00:00 2001 From: kerry Date: Mon, 12 Jun 2017 17:10:38 +0800 Subject: [PATCH 41/54] =?UTF-8?q?REPORT-2354=20=E5=B0=86=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86=E5=92=8C=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=B5=B7=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer_base/src/com/fr/design/extra/PluginOperateUtils.java | 1 - 1 file changed, 1 deletion(-) diff --git a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java index 1c9141562..7f54a9e3b 100644 --- a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java +++ b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java @@ -18,7 +18,6 @@ import com.fr.plugin.manage.bbs.BBSUserInfo; import com.fr.plugin.manage.control.PluginTaskCallback; import com.fr.plugin.view.PluginView; import com.fr.stable.StringUtils; -import com.fr.third.v2.org.apache.poi.util.StringUtil; import java.io.File; import java.util.List; From 3e8eef93a8417771f24ed752fe73c047b00dedc4 Mon Sep 17 00:00:00 2001 From: kerry Date: Tue, 13 Jun 2017 09:19:34 +0800 Subject: [PATCH 42/54] =?UTF-8?q?REPORT-2354=20=E5=B0=86=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86=E5=92=8C=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=B5=B7=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/extra/PluginOperateUtils.java | 52 +++++++++---------- .../com/fr/design/extra/PluginWebBridge.java | 7 +-- .../com/fr/design/locale/designer.properties | 1 + .../design/locale/designer_en_US.properties | 3 +- .../design/locale/designer_ja_JP.properties | 3 +- .../design/locale/designer_ko_KR.properties | 3 +- .../design/locale/designer_zh_CN.properties | 3 +- .../design/locale/designer_zh_TW.properties | 3 +- 8 files changed, 40 insertions(+), 35 deletions(-) diff --git a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java index 7f54a9e3b..29e6e1886 100644 --- a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java +++ b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java @@ -112,16 +112,15 @@ public class PluginOperateUtils { @Override public void run() { try { -// HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("plugin.plist") + "&keyword=" + keyword); - if(StringUtils.isBlank(keyword)){ + if (StringUtils.isBlank(keyword)) { getRecommendPlugins(jsCallback); return; } - HttpClient httpClient = new HttpClient("http://shop.finereport.com/searchApi?type=all" + "&keyword=" + keyword); + HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("shop.plugin.store") + "&keyword=" + keyword); httpClient.asGet(); String result = httpClient.getResponseText(); JSONObject jsonObject = new JSONObject(result); - JSONArray jsonArray = jsonObject.getJSONArray("result"); + JSONArray jsonArray = jsonObject.getJSONArray("result"); jsCallback.execute(jsonArray.toString()); } catch (Exception e) { FRLogger.getLogger().error(e.getMessage()); @@ -135,40 +134,39 @@ public class PluginOperateUtils { new Thread(new Runnable() { @Override public void run() { -// String plistUrl = SiteCenter.getInstance().acquireUrlByKind("plugin.plist"); - String plistUrl = "http://shop.finereport.com/plugins" + "?"; + String plistUrl = SiteCenter.getInstance().acquireUrlByKind("shop.plugin.plist") + "?"; boolean getRecommend = StringUtils.isEmpty(category) && StringUtils.isEmpty(seller) && StringUtils.isEmpty(fee); if (getRecommend) { getRecommendPlugins(jsCallback); return; } - if (StringUtils.isNotBlank(plistUrl)) { - StringBuilder url = new StringBuilder(); - url.append(plistUrl); - dealParams(url, category, seller, fee); - try { - HttpClient httpClient = new HttpClient(url.toString()); - httpClient.asGet(); - String result = httpClient.getResponseText(); - JSONObject resultJSONObject = new JSONObject(result); - JSONArray resultArr = resultJSONObject.getJSONArray("result"); - jsCallback.execute(resultArr.toString()); - } catch (Exception e) { - FRLogger.getLogger().error(e.getMessage()); + if (StringUtils.isNotBlank(plistUrl)) { + StringBuilder url = new StringBuilder(); + url.append(plistUrl); + dealParams(url, category, seller, fee); + try { + HttpClient httpClient = new HttpClient(url.toString()); + httpClient.asGet(); + String result = httpClient.getResponseText(); + JSONObject resultJSONObject = new JSONObject(result); + JSONArray resultArr = resultJSONObject.getJSONArray("result"); + jsCallback.execute(resultArr.toString()); + } catch (Exception e) { + FRLogger.getLogger().error(e.getMessage()); + } + } else { + String result = PluginConstants.CONNECTION_404; + jsCallback.execute(result); } - } else { - String result = PluginConstants.CONNECTION_404; - jsCallback.execute(result); } - } }).start(); } - public static void getRecommendPlugins(JSCallback jsCallback){ - String plistUrl = "http://shop.finereport.com/ShopServer?pg=feature"; + public static void getRecommendPlugins(JSCallback jsCallback) { + String plistUrl = SiteCenter.getInstance().acquireUrlByKind("shop.plugin.feature"); try { HttpClient httpClient = new HttpClient(plistUrl.toString()); String result = httpClient.getResponseText(); @@ -179,7 +177,7 @@ public class PluginOperateUtils { } - public static void dealParams(StringBuilder url, String category, String seller, String fee){ + public static void dealParams(StringBuilder url, String category, String seller, String fee) { if (StringUtils.isNotBlank(category)) { url.append("cid=").append(category.split("-")[1]); } else { @@ -216,7 +214,7 @@ public class PluginOperateUtils { @Override public void run() { String result; - String url = "http://shop.finereport.com/shopServer?pg=category"; + String url = SiteCenter.getInstance().acquireUrlByKind("shop.plugin.category"); if (url != null) { HttpClient httpClient = new HttpClient(url); result = httpClient.getResponseText(); diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer_base/src/com/fr/design/extra/PluginWebBridge.java index 416c0491c..3cd2a7ce7 100644 --- a/designer_base/src/com/fr/design/extra/PluginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/PluginWebBridge.java @@ -44,6 +44,8 @@ public class PluginWebBridge { private UILabel uiLabel; + private final String DesignerI18Prefix = "FR-Designer-"; + /** * 动作枚举 */ @@ -513,9 +515,8 @@ public class PluginWebBridge { /** * 国际化 */ - public void parseI18(final String key, final JSObject callback){ - JSCallback jsCallback = new JSCallback(webEngine, callback); - jsCallback.execute(Inter.getLocText("FR-Designer-" + key)); + public String parseI18(final String key){ + return Inter.getLocText(DesignerI18Prefix + key); } /** diff --git a/designer_base/src/com/fr/design/locale/designer.properties b/designer_base/src/com/fr/design/locale/designer.properties index 250838cee..841e0656c 100644 --- a/designer_base/src/com/fr/design/locale/designer.properties +++ b/designer_base/src/com/fr/design/locale/designer.properties @@ -2009,6 +2009,7 @@ FR-Designer-Alphafine_No_Remind= FR-Designer-Plugin_Install_Success= FR-Designer-Plugin_Install_Failed= FR-Designer-Plugin_Install_Dependence= +FR-Designer-Plugin-Install_Package= FR-Designer-Plugin_Delete_Dependence= FR-Designer-Plugin_Delete_Success= FR-Designer-Plugin_Delete_Failed= diff --git a/designer_base/src/com/fr/design/locale/designer_en_US.properties b/designer_base/src/com/fr/design/locale/designer_en_US.properties index bab429c8f..c7e18a15d 100644 --- a/designer_base/src/com/fr/design/locale/designer_en_US.properties +++ b/designer_base/src/com/fr/design/locale/designer_en_US.properties @@ -2004,9 +2004,10 @@ FR-Designer_AlphaFine_Latest=Recent FR-Designer_AlphaFine_ShowLess=show less FR-Designer_Alphafine=AlphaFine FR-Designer-Alphafine_No_Remind=don't remind -FR-Designer-Plugin_Install_Success= +Designer-Plugin_Install_Success= FR-Designer-Plugin_Install_Failed= FR-Designer-Plugin_Install_Dependence= +FR-Designer-Plugin-Install_Package= FR-Designer-Plugin_Delete_Dependence= FR-Designer-Plugin_Delete_Success= FR-Designer-Plugin_Delete_Failed= diff --git a/designer_base/src/com/fr/design/locale/designer_ja_JP.properties b/designer_base/src/com/fr/design/locale/designer_ja_JP.properties index ccec13290..e736183f3 100644 --- a/designer_base/src/com/fr/design/locale/designer_ja_JP.properties +++ b/designer_base/src/com/fr/design/locale/designer_ja_JP.properties @@ -1982,9 +1982,10 @@ FR-Base_UnSignIn=\ \u672A\u30ED\u30B0\u30A4\u30F3 Every=\u6BCF CellWrite-Preview_Cell_Content=\u30BB\u30EB\u306E\u5185\u5BB9\u3092\u30D7\u30EC\u30D3\u30E5\u30FC\u3059\u308B FormulaD-Data_Fields=\u30C7\u30FC\u30BF\u30D5\u30A3\u30FC\u30EB\u30C9 -FR-Designer-Plugin_Install_Success= +Designer-Plugin_Install_Success= FR-Designer-Plugin_Install_Failed= FR-Designer-Plugin_Install_Dependence= +FR-Designer-Plugin-Install_Package= FR-Designer-Plugin_Delete_Dependence= FR-Designer-Plugin_Delete_Success= FR-Designer-Plugin_Delete_Failed= diff --git a/designer_base/src/com/fr/design/locale/designer_ko_KR.properties b/designer_base/src/com/fr/design/locale/designer_ko_KR.properties index d561a2e6c..a5fa8cb3f 100644 --- a/designer_base/src/com/fr/design/locale/designer_ko_KR.properties +++ b/designer_base/src/com/fr/design/locale/designer_ko_KR.properties @@ -1983,9 +1983,10 @@ FR-Base_UnSignIn=\uC544\uC9C1 \uB4F1\uB85D Every=\uAC01 CellWrite-Preview_Cell_Content=\uC140\uB0B4\uC6A9\uBBF8\uB9AC\uBCF4\uAE30 FormulaD-Data_Fields=\uB370\uC774\uD130\uD56D\uBAA9 -FR-Designer-Plugin_Install_Success= +Designer-Plugin_Install_Success= FR-Designer-Plugin_Install_Failed= FR-Designer-Plugin_Install_Dependence= +FR-Designer-Plugin-Install_Package= FR-Designer-Plugin_Delete_Dependence= FR-Designer-Plugin_Delete_Success= FR-Designer-Plugin_Delete_Failed= diff --git a/designer_base/src/com/fr/design/locale/designer_zh_CN.properties b/designer_base/src/com/fr/design/locale/designer_zh_CN.properties index e2f3cd6b3..bc0ae2787 100644 --- a/designer_base/src/com/fr/design/locale/designer_zh_CN.properties +++ b/designer_base/src/com/fr/design/locale/designer_zh_CN.properties @@ -2003,6 +2003,7 @@ FR-Designer-Alphafine_No_Remind=\u4E0D\u518D\u63D0\u793A FR-Designer-Plugin_Install_Success=\u63D2\u4EF6\u5B89\u88C5\u6210\u529F FR-Designer-Plugin_Install_Failed=\u63D2\u4EF6\u5B89\u88C5\u5931\u8D25 FR-Designer-Plugin_Install_Dependence=\u662F\u5426\u5B89\u88C5\u4F9D\u8D56\u73AF\u5883 +FR-Designer-Plugin-Install_Package=\u63D2\u4EF6\u5B89\u88C5\u5305 FR-Designer-Plugin_Delete_Dependence=\u662F\u5426\u5220\u9664\u4F9D\u8D56\u73AF\u5883 FR-Designer-Plugin_Delete_Success=\u63D2\u4EF6\u5220\u9664\u6210\u529F FR-Designer-Plugin_Delete_Failed=\u63D2\u4EF6\u5220\u9664\u5931\u8D25 @@ -2071,4 +2072,4 @@ FR-Designer-Plugin-Store_Finereport=\u5E06\u8F6F FR-Designer-Plugin-Store_Version=\u7248\u672C FR-Designer-Plugin-Store_Developer=\u5F00\u53D1\u8005 FR-Designer-Plugin-Store_Jar=jar\u5305 -FS-Plugin-Store_Disconnected=\u65E0\u6CD5\u8FDE\u63A5\u5E94\u7528\u4E2D\u5FC3 +FR-Designer-Plugin-Store_Disconnected=\u65E0\u6CD5\u8FDE\u63A5\u5E94\u7528\u4E2D\u5FC3 diff --git a/designer_base/src/com/fr/design/locale/designer_zh_TW.properties b/designer_base/src/com/fr/design/locale/designer_zh_TW.properties index 74fadd0e9..577d9d476 100644 --- a/designer_base/src/com/fr/design/locale/designer_zh_TW.properties +++ b/designer_base/src/com/fr/design/locale/designer_zh_TW.properties @@ -2000,9 +2000,10 @@ FR-Designer_AlphaFine_ShowLess=\u6536\u8D77 FR-Designer_Alphafine=AlphaFine\u667A\u80FD\u641C\u7D22 FR-Designer_AlphaFine_ShowAll=\u986F\u793A\u5168\u90E8 FR-Designer-Alphafine_No_Remind=\u4E0D\u518D\u63D0\u793A -FR-Designer-Plugin_Install_Success= +Designer-Plugin_Install_Success= FR-Designer-Plugin_Install_Failed= FR-Designer-Plugin_Install_Dependence= +FR-Designer-Plugin-Install_Package= FR-Designer-Plugin_Delete_Dependence= FR-Designer-Plugin_Delete_Success= FR-Designer-Plugin_Delete_Failed= From e93dd7534fe222fc244a4adea245736eb1dd1d68 Mon Sep 17 00:00:00 2001 From: kerry Date: Tue, 13 Jun 2017 09:22:22 +0800 Subject: [PATCH 43/54] =?UTF-8?q?REPORT-2354=20=E5=B0=86=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86=E5=92=8C=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=B5=B7=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/extra/exe/callback/ModifyStatusCallback.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java b/designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java index 6258dc958..5545c06c4 100644 --- a/designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java +++ b/designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java @@ -21,7 +21,7 @@ public class ModifyStatusCallback implements PluginTaskCallback{ public void done(PluginTaskResult result) { if (result.isSuccess()) { jsCallback.execute("success"); - String modifyMessage = isActive ? Inter.getLocText("FR-Designer-Plugin_Actived") : Inter.getLocText("FR-Designer-Plugin_Disabled"); + String modifyMessage = isActive ? Inter.getLocText("FR-Designer-Plugin_Disabled") : Inter.getLocText("FR-Designer-Plugin_Actived"); JOptionPane.showMessageDialog(null, modifyMessage); } else { JOptionPane.showMessageDialog(null, result.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); From 414f733f7ad51e997b931d2369283d4a5bd20378 Mon Sep 17 00:00:00 2001 From: kerry Date: Tue, 13 Jun 2017 09:23:13 +0800 Subject: [PATCH 44/54] PMD --- designer_base/src/com/fr/design/extra/PluginWebBridge.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer_base/src/com/fr/design/extra/PluginWebBridge.java index 3cd2a7ce7..41eba4afe 100644 --- a/designer_base/src/com/fr/design/extra/PluginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/PluginWebBridge.java @@ -44,7 +44,7 @@ public class PluginWebBridge { private UILabel uiLabel; - private final String DesignerI18Prefix = "FR-Designer-"; + private static final String DesignerI18Prefix = "FR-Designer-"; /** * 动作枚举 From 679087e1207719911c548e32b5fc82a265d0e26b Mon Sep 17 00:00:00 2001 From: kerry Date: Tue, 13 Jun 2017 09:25:11 +0800 Subject: [PATCH 45/54] PMD --- designer_base/src/com/fr/design/extra/PluginWebBridge.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer_base/src/com/fr/design/extra/PluginWebBridge.java index 41eba4afe..126a85fa9 100644 --- a/designer_base/src/com/fr/design/extra/PluginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/PluginWebBridge.java @@ -44,7 +44,7 @@ public class PluginWebBridge { private UILabel uiLabel; - private static final String DesignerI18Prefix = "FR-Designer-"; + private static final String DESIGNERI18PREFIX = "FR-Designer-"; /** * 动作枚举 @@ -516,7 +516,7 @@ public class PluginWebBridge { * 国际化 */ public String parseI18(final String key){ - return Inter.getLocText(DesignerI18Prefix + key); + return Inter.getLocText(DESIGNERI18PREFIX + key); } /** From ed2289f4203c4118433337031129f327563eda03 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Wed, 14 Jun 2017 11:51:50 +0800 Subject: [PATCH 46/54] =?UTF-8?q?bug=20fix=EF=BC=9AgetName=E6=9C=89?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E6=98=AFnull?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer_base/src/com/fr/design/actions/UpdateAction.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/designer_base/src/com/fr/design/actions/UpdateAction.java b/designer_base/src/com/fr/design/actions/UpdateAction.java index 93a553f9c..fdb73db15 100644 --- a/designer_base/src/com/fr/design/actions/UpdateAction.java +++ b/designer_base/src/com/fr/design/actions/UpdateAction.java @@ -6,19 +6,19 @@ package com.fr.design.actions; import com.fr.base.NameStyle; import com.fr.base.ScreenResolution; import com.fr.base.Style; -import com.fr.design.constants.UIConstants; import com.fr.design.actions.core.ActionFactory; +import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.imenu.UICheckBoxMenuItem; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.menu.ShortCut; import com.fr.design.selection.SelectionListener; +import com.fr.general.ComparatorUtils; import com.fr.stable.StringUtils; import javax.swing.*; import java.awt.*; import java.awt.event.ComponentEvent; -import java.awt.event.ContainerEvent; import java.beans.PropertyChangeListener; import java.util.HashMap; import java.util.Iterator; @@ -293,8 +293,7 @@ public abstract class UpdateAction extends ShortCut implements Action { if (!(object instanceof UpdateAction)) { return false; } - - return ((UpdateAction) object).getName().equals(this.getName()); + return ComparatorUtils.equals(((UpdateAction) object).getName(), this.getName()); } @Override From 1603f98c6f4e5bf458599356d999d3c333c88a8f Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Wed, 14 Jun 2017 14:46:23 +0800 Subject: [PATCH 47/54] =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E8=AE=BA?= =?UTF-8?q?=E5=9D=9B=E7=99=BB=E9=99=86=E8=A6=81=E5=85=88=E4=BB=8EDesignerE?= =?UTF-8?q?nvManager=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/fr/design/extra/PluginOperateUtils.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java index 29e6e1886..6b6c0409a 100644 --- a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java +++ b/designer_base/src/com/fr/design/extra/PluginOperateUtils.java @@ -237,6 +237,14 @@ public class PluginOperateUtils { } public static void getLoginInfo(JSCallback jsCallback) { + + if (!BBSPluginLogin.getInstance().hasLogin()) { + String userName = DesignerEnvManager.getEnvManager().getBBSName(); + String password = DesignerEnvManager.getEnvManager().getBBSPassword(); + if (StringUtils.isNotBlank(userName)) { + BBSPluginLogin.getInstance().login(new BBSUserInfo(userName, password)); + } + } BBSUserInfo bbsUserInfo = BBSPluginLogin.getInstance().getUserInfo(); String username = bbsUserInfo == null ? "" : bbsUserInfo.getUserName(); String inShowUsername = DesignerEnvManager.getEnvManager().getInShowBBsName(); From e56c707fadbf98b7f8dae822e33046ae836347e5 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Thu, 15 Jun 2017 10:22:19 +0800 Subject: [PATCH 48/54] =?UTF-8?q?=E6=8F=92=E4=BB=B6=E6=94=B9=E5=8F=98?= =?UTF-8?q?=E6=97=B6=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/CellElementPropertyPane.java | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/designer/src/com/fr/design/mainframe/CellElementPropertyPane.java b/designer/src/com/fr/design/mainframe/CellElementPropertyPane.java index 69a68f451..27e7e22ce 100644 --- a/designer/src/com/fr/design/mainframe/CellElementPropertyPane.java +++ b/designer/src/com/fr/design/mainframe/CellElementPropertyPane.java @@ -12,14 +12,22 @@ import javax.swing.JPanel; import javax.swing.SwingConstants; import com.fr.base.BaseUtils; +import com.fr.design.fun.CellAttributeProvider; +import com.fr.design.fun.PresentKindProvider; import com.fr.design.gui.frpane.UITitlePanel; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itabpane.TitleChangeListener; import com.fr.design.mainframe.cell.CellElementEditPane; +import com.fr.general.GeneralContext; import com.fr.general.Inter; import com.fr.grid.selection.CellSelection; import com.fr.grid.selection.FloatSelection; import com.fr.grid.selection.Selection; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.injectable.PluginModule; +import com.fr.plugin.manage.PluginFilter; +import com.fr.plugin.observer.PluginEvent; +import com.fr.plugin.observer.PluginEventListener; import com.fr.report.cell.DefaultTemplateCellElement; import com.fr.report.cell.Elem; import com.fr.report.elementcase.TemplateElementCase; @@ -34,7 +42,29 @@ import com.fr.report.elementcase.TemplateElementCase; * @since 2012-5-24下午1:50:21 */ public class CellElementPropertyPane extends DockingView { - + + static { + GeneralContext.listenPluginRunningChanged(new PluginEventListener() { + + @Override + public void on(PluginEvent event) { + + synchronized (CellElementPropertyPane.class) { + singleton = new CellElementPropertyPane(); + } + } + }, new PluginFilter() { + + @Override + public boolean accept(PluginContext context) { + + return context.contain(PluginModule.ExtraDesign, PresentKindProvider.MARK_STRING) || + context.contain(PluginModule.ExtraDesign, CellAttributeProvider.MARK_STRING); + } + }); + } + + public synchronized static CellElementPropertyPane getInstance() { if (singleton == null) { singleton = new CellElementPropertyPane(); From 387dbb523447025537d02dbe02a81d41398ce3f8 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Thu, 15 Jun 2017 10:42:11 +0800 Subject: [PATCH 49/54] =?UTF-8?q?=E6=8F=92=E4=BB=B6=E6=94=B9=E5=8F=98?= =?UTF-8?q?=E6=97=B6=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/GlobalListenerProviderManager.java | 108 ++++++++++++++++++ .../src/com/fr/start/BaseDesigner.java | 7 +- 2 files changed, 111 insertions(+), 4 deletions(-) create mode 100644 designer_base/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java diff --git a/designer_base/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java b/designer_base/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java new file mode 100644 index 000000000..b3a52d520 --- /dev/null +++ b/designer_base/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java @@ -0,0 +1,108 @@ +package com.fr.design.fun.impl; + +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.fun.GlobalListenerProvider; +import com.fr.general.GeneralContext; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.context.PluginRuntime; +import com.fr.plugin.injectable.PluginModule; +import com.fr.plugin.manage.PluginFilter; +import com.fr.plugin.observer.PluginEvent; +import com.fr.plugin.observer.PluginEventListener; +import com.fr.plugin.observer.PluginEventType; + +import java.awt.*; +import java.awt.event.AWTEventListener; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * Created by juhaoyu on 2017/6/15. + * 管理GlobalListenerProvider接口 + */ +public class GlobalListenerProviderManager { + + private static final GlobalListenerProviderManager INSTANCE = new GlobalListenerProviderManager(); + + private Map map = new HashMap<>(); + + private GlobalListenerProviderManager() {} + + public static GlobalListenerProviderManager getInstance() { + + return INSTANCE; + } + + public void init() { + + Set providers = ExtraDesignClassManager.getInstance().getArray(GlobalListenerProvider.XML_TAG); + addAWTEventListeners(providers); + listenPlugin(); + } + + private void listenPlugin() { + + PluginFilter filter = new PluginFilter() { + + @Override + public boolean accept(PluginContext context) { + + return context.contain(PluginModule.ExtraDesign, GlobalListenerProvider.XML_TAG); + } + }; + PluginEventListener onRun = new PluginEventListener() { + + @Override + public void on(PluginEvent event) { + + PluginRuntime runtime = event.getContext().getRuntime(); + Set providers = runtime.get(PluginModule.ExtraDesign, GlobalListenerProvider.XML_TAG); + addAWTEventListeners(providers); + } + }; + PluginEventListener onStop = new PluginEventListener() { + + @Override + public void on(PluginEvent event) { + + PluginRuntime runtime = event.getContext().getRuntime(); + Set providers = runtime.get(PluginModule.ExtraDesign, GlobalListenerProvider.XML_TAG); + removeAWTEventListeners(providers); + } + }; + GeneralContext.listenPlugin(PluginEventType.AfterRun, onRun, filter); + GeneralContext.listenPlugin(PluginEventType.BeforeStop, onStop, filter); + + + } + + private void addAWTEventListeners(Set providers) { + + AWTEventListener listener; + for (GlobalListenerProvider provider : providers) { + listener = provider.listener(); + Toolkit.getDefaultToolkit().addAWTEventListener(listener, AWTEvent.KEY_EVENT_MASK); + add(provider, listener); + } + } + + private void removeAWTEventListeners(Set providers) { + + AWTEventListener listener; + for (GlobalListenerProvider provider : providers) { + listener = get(provider); + Toolkit.getDefaultToolkit().removeAWTEventListener(listener); + } + } + + private synchronized void add(GlobalListenerProvider provider, AWTEventListener listener) { + + map.put(provider, listener); + } + + private synchronized AWTEventListener get(GlobalListenerProvider provider) { + + return map.get(provider); + } +} diff --git a/designer_base/src/com/fr/start/BaseDesigner.java b/designer_base/src/com/fr/start/BaseDesigner.java index 26d8d5611..0d5332cc8 100644 --- a/designer_base/src/com/fr/start/BaseDesigner.java +++ b/designer_base/src/com/fr/start/BaseDesigner.java @@ -13,6 +13,7 @@ import com.fr.design.file.MutilTempalteTabPane; import com.fr.design.file.TemplateTreePane; import com.fr.design.fun.DesignerStartOpenFileProcessor; import com.fr.design.fun.GlobalListenerProvider; +import com.fr.design.fun.impl.GlobalListenerProviderManager; import com.fr.design.mainframe.DesignerFrame; import com.fr.design.mainframe.TemplatePane; import com.fr.design.mainframe.toolbar.ToolBarMenuDock; @@ -114,10 +115,8 @@ public abstract class BaseDesigner extends ToolBarMenuDock { } private void bindGlobalListener() { - Set providers = ExtraDesignClassManager.getInstance().getArray(GlobalListenerProvider.XML_TAG); - for (GlobalListenerProvider provider : providers) { - Toolkit.getDefaultToolkit().addAWTEventListener(provider.listener(), AWTEvent.KEY_EVENT_MASK); - } + + GlobalListenerProviderManager.getInstance().init(); } private void showErrorPluginsMessage() { From 6181b4f59ad541541ac2cac2f1575ce73fbbd490 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Thu, 15 Jun 2017 10:50:06 +0800 Subject: [PATCH 50/54] =?UTF-8?q?=E6=8F=92=E4=BB=B6=E6=94=B9=E5=8F=98?= =?UTF-8?q?=E6=97=B6=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer_base/src/com/fr/design/mainframe/DesignerFrame.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designer_base/src/com/fr/design/mainframe/DesignerFrame.java b/designer_base/src/com/fr/design/mainframe/DesignerFrame.java index 6cdc72e2a..385bbb60f 100644 --- a/designer_base/src/com/fr/design/mainframe/DesignerFrame.java +++ b/designer_base/src/com/fr/design/mainframe/DesignerFrame.java @@ -198,7 +198,8 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta } private void refreshNorthEastPane(JPanel northEastPane, ToolBarMenuDock ad) { - + + northEastPane.removeAll(); TitlePlaceProcessor processor = ExtraDesignClassManager.getInstance().getSingle(TitlePlaceProcessor.MARK_STRING); if (processor == null) { processor = new DefaultTitlePlace(); From 1251875ece187c7d47645d6e626e1bba5f974b2a Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Thu, 15 Jun 2017 11:47:50 +0800 Subject: [PATCH 51/54] =?UTF-8?q?=E8=B0=83=E8=AF=95=E5=87=A0=E4=B8=AA?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E6=8F=92=E4=BB=B6=EF=BC=8C=E6=8C=BA?= =?UTF-8?q?=E5=A4=9A=E5=9C=B0=E6=96=B9=E6=9C=89=E7=BC=93=E5=AD=98=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E6=B7=BB=E5=8A=A0=E7=9B=91=E5=90=AC=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/module/DesignerModule.java | 7 +++- .../tabledata/wrapper/TableDataFactory.java | 33 +++++++++++++------ ...AbstractServerTableDataDefineProvider.java | 8 ++++- .../impl/AbstractTableDataDefineProvider.java | 8 ++++- .../design/mainframe/AbstractAppProvider.java | 6 ++++ .../fr/design/mainframe/DesignerFrame.java | 7 ++++ 6 files changed, 56 insertions(+), 13 deletions(-) diff --git a/designer/src/com/fr/design/module/DesignerModule.java b/designer/src/com/fr/design/module/DesignerModule.java index 58e00fa0e..12ada2f02 100644 --- a/designer/src/com/fr/design/module/DesignerModule.java +++ b/designer/src/com/fr/design/module/DesignerModule.java @@ -212,7 +212,7 @@ public class DesignerModule extends DesignModule { } }); } - + private static abstract class AbstractWorkBookApp implements App { @Override @@ -234,6 +234,11 @@ public class DesignerModule extends DesignModule { public void process() { } + + @Override + public void undo() { + + } } @Override diff --git a/designer_base/src/com/fr/design/data/tabledata/wrapper/TableDataFactory.java b/designer_base/src/com/fr/design/data/tabledata/wrapper/TableDataFactory.java index bc414d1a9..ca118df76 100644 --- a/designer_base/src/com/fr/design/data/tabledata/wrapper/TableDataFactory.java +++ b/designer_base/src/com/fr/design/data/tabledata/wrapper/TableDataFactory.java @@ -5,20 +5,15 @@ import com.fr.base.TableData; import com.fr.data.TableDataSource; import com.fr.data.impl.*; import com.fr.data.impl.storeproc.StoreProcedure; -import com.fr.design.ExtraDesignClassManager; import com.fr.design.data.datapane.TableDataNameObjectCreator; import com.fr.design.data.tabledata.tabledatapane.*; -import com.fr.design.fun.TableDataCreatorProvider; import com.fr.file.DatasourceManagerProvider; import com.fr.general.ComparatorUtils; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; import java.lang.reflect.Constructor; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; /** @@ -32,6 +27,8 @@ public abstract class TableDataFactory { * 有顺序的,用来排序用 */ private static Map map = new java.util.LinkedHashMap(); + + private static Map extraMap = new LinkedHashMap<>(); /** * 同一类型的只能加一次,就加最上层的类,因为要排序。如果将所有的 FileTableData都加进来,那么FileTableData的排序就不正确了 @@ -54,11 +51,27 @@ public abstract class TableDataFactory { * @param clazz 数据集类 * @param creator 组件 */ - public static void register(Class clazz, TableDataNameObjectCreator creator) { - map.put(clazz.getName(), creator); + public static void registerExtra(Class clazz, TableDataNameObjectCreator creator) { + + extraMap.put(clazz.getName(), creator); } - + + public static void removeExtra(Class clazz) { + + extraMap.remove(clazz.getName()); + } + private static TableDataNameObjectCreator getTableDataNameObjectCreator(TableData tabledata) { + + TableDataNameObjectCreator creator = getFrom(tabledata, extraMap); + if (creator == null) { + creator = getFrom(tabledata, map); + } + return creator; + } + + private static TableDataNameObjectCreator getFrom(TableData tabledata, Map map) { + TableDataNameObjectCreator tableDataNameObjectCreator = map.get(tabledata.getClass().getName()); if (tableDataNameObjectCreator == null) { tableDataNameObjectCreator = map.get(tabledata.getClass().getSuperclass().getName()); @@ -69,7 +82,7 @@ public abstract class TableDataFactory { } return tableDataNameObjectCreator; } - + /** * 获取数据集所对应的编辑面板 * diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractServerTableDataDefineProvider.java b/designer_base/src/com/fr/design/fun/impl/AbstractServerTableDataDefineProvider.java index de7be2750..c149d8f33 100644 --- a/designer_base/src/com/fr/design/fun/impl/AbstractServerTableDataDefineProvider.java +++ b/designer_base/src/com/fr/design/fun/impl/AbstractServerTableDataDefineProvider.java @@ -34,6 +34,12 @@ public abstract class AbstractServerTableDataDefineProvider extends AbstractProv classForInitTableData(), appearanceForTableData() ); - TableDataFactory.register(classForTableData(), creator); + TableDataFactory.registerExtra(classForTableData(), creator); + } + + @Override + public void undo() { + + TableDataFactory.removeExtra(classForTableData()); } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractTableDataDefineProvider.java b/designer_base/src/com/fr/design/fun/impl/AbstractTableDataDefineProvider.java index 42433a68b..187e7948c 100644 --- a/designer_base/src/com/fr/design/fun/impl/AbstractTableDataDefineProvider.java +++ b/designer_base/src/com/fr/design/fun/impl/AbstractTableDataDefineProvider.java @@ -34,6 +34,12 @@ public abstract class AbstractTableDataDefineProvider extends AbstractProvider i classForInitTableData(), appearanceForTableData() ); - TableDataFactory.register(classForTableData(), creator); + TableDataFactory.registerExtra(classForTableData(), creator); + } + + @Override + public void undo() { + + TableDataFactory.removeExtra(classForTableData()); } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/mainframe/AbstractAppProvider.java b/designer_base/src/com/fr/design/mainframe/AbstractAppProvider.java index f4f6bea97..25b0931f2 100644 --- a/designer_base/src/com/fr/design/mainframe/AbstractAppProvider.java +++ b/designer_base/src/com/fr/design/mainframe/AbstractAppProvider.java @@ -23,4 +23,10 @@ public abstract class AbstractAppProvider extends AbstractProv public void process() { DesignerFrame.registApp(this); } + + @Override + public void undo() { + + DesignerFrame.removeApp(this); + } } diff --git a/designer_base/src/com/fr/design/mainframe/DesignerFrame.java b/designer_base/src/com/fr/design/mainframe/DesignerFrame.java index 385bbb60f..4fed8d2d9 100644 --- a/designer_base/src/com/fr/design/mainframe/DesignerFrame.java +++ b/designer_base/src/com/fr/design/mainframe/DesignerFrame.java @@ -149,6 +149,13 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta appList.add(app); } } + + public static void removeApp(App app) { + + if (app != null) { + appList.remove(app); + } + } protected DesktopCardPane getCenterTemplateCardPane() { return centerTemplateCardPane; From 175925e8cc173ed941969782a1e91b42fc43aeac Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Thu, 15 Jun 2017 16:22:10 +0800 Subject: [PATCH 52/54] fix --- .../design/fun/impl/GlobalListenerProviderManager.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/designer_base/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java b/designer_base/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java index b3a52d520..5ce250ba6 100644 --- a/designer_base/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java +++ b/designer_base/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java @@ -19,7 +19,7 @@ import java.util.Set; /** * Created by juhaoyu on 2017/6/15. - * 管理GlobalListenerProvider接口 + * 管理正在运行中的GlobalListenerProvider接口 */ public class GlobalListenerProviderManager { @@ -91,7 +91,7 @@ public class GlobalListenerProviderManager { AWTEventListener listener; for (GlobalListenerProvider provider : providers) { - listener = get(provider); + listener = pop(provider); Toolkit.getDefaultToolkit().removeAWTEventListener(listener); } } @@ -101,8 +101,9 @@ public class GlobalListenerProviderManager { map.put(provider, listener); } - private synchronized AWTEventListener get(GlobalListenerProvider provider) { + private synchronized AWTEventListener pop(GlobalListenerProvider provider) { - return map.get(provider); + return map.remove(provider); } + } From 603b21bb6e18a55ba478c40e0c3b04f4b9442af6 Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Thu, 15 Jun 2017 16:22:22 +0800 Subject: [PATCH 53/54] fix --- .../com/fr/design/fun/impl/GlobalListenerProviderManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_base/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java b/designer_base/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java index 5ce250ba6..fed142bf3 100644 --- a/designer_base/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java +++ b/designer_base/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java @@ -19,7 +19,7 @@ import java.util.Set; /** * Created by juhaoyu on 2017/6/15. - * 管理正在运行中的GlobalListenerProvider接口 + * 管理正在运行中插件的GlobalListenerProvider接口 */ public class GlobalListenerProviderManager { From 9302a4f30db08baf58c25164e320295b99d48f5d Mon Sep 17 00:00:00 2001 From: juhaoyu <2335173323@qq.com> Date: Thu, 15 Jun 2017 17:21:53 +0800 Subject: [PATCH 54/54] merge: ba-9.0 => pf-9.0 --- .../fr/design/mainframe/DesignerFrame.java | 28 +++++-------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/designer_base/src/com/fr/design/mainframe/DesignerFrame.java b/designer_base/src/com/fr/design/mainframe/DesignerFrame.java index e745aecc5..717674f22 100644 --- a/designer_base/src/com/fr/design/mainframe/DesignerFrame.java +++ b/designer_base/src/com/fr/design/mainframe/DesignerFrame.java @@ -196,17 +196,15 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta return context.contain(TitlePlaceProcessor.MARK_STRING); } }); -<<<<<<< HEAD - - if (DesignerEnvManager.getEnvManager().getAlphafineConfigManager().isEnabled()) { - northEastPane.add(ad.createAlphafinePane(), BorderLayout.CENTER); - } refreshNorthEastPane(northEastPane, ad); - return northEastPane; - } + if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isEnabled()) { + northEastPane.add(ad.createAlphafinePane(), BorderLayout.CENTER); + } + return northEastPane; + } private void refreshNorthEastPane(JPanel northEastPane, ToolBarMenuDock ad) { - + northEastPane.removeAll(); TitlePlaceProcessor processor = ExtraDesignClassManager.getInstance().getSingle(TitlePlaceProcessor.MARK_STRING); if (processor == null) { @@ -219,19 +217,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta setName(DESIGNER_FRAME_NAME); this.ad = ad; -======= - - if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isEnabled()) { - northEastPane.add(ad.createAlphafinePane(), BorderLayout.CENTER); - } - return northEastPane; - } - - public DesignerFrame(ToolBarMenuDock ad) { - setName(DESIGNER_FRAME_NAME); - this.ad = ad; ->>>>>>> d2de164e77196e797f514ec75b52974b32b99ac5 - this.initTitleIcon(); + this.initTitleIcon(); this.setTitle();// james:因为有默认的了 // set this to context. DesignerContext.setDesignerFrame(this);