Browse Source

Merge remote-tracking branch 'origin/bugfix/10.0' into bugfix/10.0

bugfix/10.0
Yvan 4 years ago
parent
commit
ea4a74953a
  1. 12
      designer-base/src/main/java/com/fr/design/DesignerEnvManager.java
  2. 19
      designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java
  3. 38
      designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java
  4. 50
      designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java
  5. 1
      designer-base/src/main/java/com/fr/design/extra/PluginUtils.java
  6. 11
      designer-base/src/main/java/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java
  7. 32
      designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java
  8. 27
      designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallOnlineCallback.java
  9. 14
      designer-base/src/main/java/com/fr/design/extra/exe/callback/ModifyStatusCallback.java
  10. 27
      designer-base/src/main/java/com/fr/design/extra/exe/callback/UninstallPluginCallback.java
  11. 37
      designer-base/src/main/java/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java
  12. 12
      designer-base/src/main/java/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java
  13. 3
      designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java
  14. 4
      designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java
  15. 71
      designer-base/src/main/java/com/fr/design/file/TemplateResource.java
  16. 66
      designer-base/src/main/java/com/fr/design/file/TemplateResourceManager.java
  17. 21
      designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java
  18. 19
      designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateResource.java
  19. 52
      designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateResource.java
  20. 34
      designer-base/src/main/java/com/fr/design/fun/LocalResourceProvider.java
  21. 19
      designer-base/src/main/java/com/fr/design/fun/TemplateTreeDefineProcessor.java
  22. 23
      designer-base/src/main/java/com/fr/design/fun/impl/AbstractLocalResourceProvider.java
  23. 24
      designer-base/src/main/java/com/fr/design/fun/impl/AbstractTemplateTreeDefineProcessor.java
  24. 13
      designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java
  25. 7
      designer-base/src/main/java/com/fr/design/gui/ilist/TableViewList.java
  26. 2
      designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java
  27. 25
      designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java
  28. 19
      designer-base/src/main/java/com/fr/design/mainframe/JTemplateEvent.java
  29. 3
      designer-base/src/main/java/com/fr/design/mainframe/JVirtualTemplate.java
  30. 14
      designer-base/src/main/java/com/fr/design/mainframe/WestRegionContainerPane.java
  31. 2
      designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleDictionaryEditor.java
  32. 6
      designer-base/src/main/java/com/fr/design/present/DictPresentPane.java
  33. 7
      designer-base/src/main/java/com/fr/design/present/dict/DictionaryPane.java
  34. 108
      designer-base/src/main/java/com/fr/design/present/dict/TableDataDictPane.java
  35. 2
      designer-base/src/main/java/com/fr/design/widget/component/NumberEditorValidatePane.java
  36. 1736
      designer-base/src/main/java/com/fr/design/write/submit/DBManipulationPane.java
  37. 108
      designer-base/src/main/java/com/fr/env/PluginErrorRemindDialog.java
  38. 18
      designer-base/src/main/java/com/fr/file/FileNodeFILE.java
  39. 62
      designer-base/src/test/java/com/fr/design/EnvChangeEntranceTest.java
  40. 155
      designer-base/src/test/java/com/fr/design/extra/PluginOperateUtilsTest.java
  41. 23
      designer-base/src/test/java/com/fr/design/extra/PluginUtilsTest.java
  42. 4
      designer-chart/src/main/java/com/fr/design/chartx/data/drillMap/DrillMapLayerPane.java
  43. 6
      designer-chart/src/main/java/com/fr/extended/chart/UIComboBoxWithNone.java
  44. 3
      designer-chart/src/main/java/com/fr/van/chart/designer/PlotFactory.java
  45. 6
      designer-chart/src/main/java/com/fr/van/chart/designer/component/border/VanChartBorderWithShapePane.java
  46. 23
      designer-chart/src/main/java/com/fr/van/chart/designer/component/format/SummaryValueFormatPaneWithCheckBox.java
  47. 23
      designer-chart/src/main/java/com/fr/van/chart/designer/component/format/SummaryValueFormatPaneWithoutCheckBox.java
  48. 1
      designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/gauge/VanChartGaugeDetailAxisPane.java
  49. 64
      designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPieCategoryLabelDetailPane.java
  50. 61
      designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPiePlotLabelPane.java
  51. 72
      designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPieValueLabelDetailPane.java
  52. 28
      designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java
  53. 4
      designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelPane.java
  54. 4
      designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/data/comp/DrillMapLayerPane.java
  55. 16
      designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/type/VanChartDrillMapPlotPane.java
  56. 15
      designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapSourceChoosePane.java
  57. 24
      designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java
  58. 170
      designer-chart/src/main/java/com/fr/van/chart/map/VanChartMapSeriesPane.java
  59. 3
      designer-chart/src/main/java/com/fr/van/chart/map/designer/other/VanChartMapConditionAttrContentPane.java
  60. 42
      designer-chart/src/main/java/com/fr/van/chart/map/designer/other/condition/item/VanChartAnchorMarkerConditionPane.java
  61. 26
      designer-chart/src/main/java/com/fr/van/chart/map/designer/other/condition/pane/VanChartAnchorPointMapConditionPane.java
  62. 64
      designer-chart/src/main/java/com/fr/van/chart/map/designer/style/series/VanChartMapAnchorMarkerPane.java
  63. 258
      designer-chart/src/main/java/com/fr/van/chart/map/designer/type/GeoUrlPane.java
  64. 303
      designer-chart/src/main/java/com/fr/van/chart/map/designer/type/GisLayerPane.java
  65. 167
      designer-chart/src/main/java/com/fr/van/chart/map/designer/type/MapStatusPane.java
  66. 51
      designer-chart/src/main/java/com/fr/van/chart/map/designer/type/TileLayerPane.java
  67. 1
      designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java
  68. 714
      designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapSourceChoosePane.java
  69. 165
      designer-chart/src/main/java/com/fr/van/chart/map/designer/type/WMSLayerPane.java
  70. 130
      designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieCategoryLabelContentPane.java
  71. 79
      designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieValueLabelContentPane.java
  72. 3
      designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java
  73. 45
      designer-form/src/main/java/com/fr/design/mainframe/template/info/JFormProcessInfo.java
  74. 4
      designer-form/src/main/java/com/fr/design/widget/ui/designer/CheckBoxGroupDefinePane.java
  75. 33
      designer-form/src/test/java/com/fr/design/mainframe/template/info/JFormProcessInfoTest.java
  76. 3
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java
  77. 4
      designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java
  78. 331
      designer-realize/src/main/java/com/fr/grid/GridUI.java
  79. 1
      designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java
  80. 25
      designer-realize/src/test/java/com.fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManagerTest.java

12
designer-base/src/main/java/com/fr/design/DesignerEnvManager.java

@ -240,7 +240,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
String installHome = StableUtils.getInstallHome();
//这里不判断路径是.的情况,放在checkValid方法里面,重新选
if (installHome != null) {
String name = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Engine_DEFAULT");
String name = Toolkit.i18nText("Fine-Design_Basic_Engine_DEFAULT");
String envPath = designerEnvManager.getDefaultenvPath(installHome);
designerEnvManager.putEnv(name, LocalDesignerWorkspaceInfo.create(name, envPath));
designerEnvManager.setCurEnvName(name);
@ -304,8 +304,8 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
String today = calender.get(Calendar.YEAR) + "-" + (calender.get(Calendar.MONTH) + 1) + "-" + calender.get(Calendar.DAY_OF_MONTH);
String fileName = StableUtils.pathJoin(logLocation, "fr_" + today + "_%g.log");
if (!new java.io.File(fileName).exists()) {
StableUtils.makesureFileExist(new java.io.File(fileName));
if (!new File(fileName).exists()) {
StableUtils.makesureFileExist(new File(fileName));
}
Handler handler = new FileHandler(fileName, true);
@ -529,7 +529,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
return env;
}
}
String name = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Workspace_Default");
String name = Toolkit.i18nText("Fine-Design_Basic_Workspace_Default");
LocalDesignerWorkspaceInfo newDefaultEnv = LocalDesignerWorkspaceInfo.create(name, defaultenvPath);
this.putEnv(name, newDefaultEnv);
return newDefaultEnv;
@ -552,7 +552,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
}
}
}
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Workspace_Default");
return Toolkit.i18nText("Fine-Design_Basic_Workspace_Default");
}
@ -1643,7 +1643,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
if ((tmpVal = reader.getAttrAsString("webinfLocation", null)) != null) {
// marks:兼容6.1的
// marks:设置默认的目录.
String curReportServerName = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Server_Embedded_Server");
String curReportServerName = Toolkit.i18nText("Fine-Design_Basic_Server_Embedded_Server");
LocalDesignerWorkspaceInfo reportServer = LocalDesignerWorkspaceInfo.create(curReportServerName, tmpVal);
this.putEnv(curReportServerName, reportServer);

19
designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java

@ -1,6 +1,7 @@
package com.fr.design;
import com.fr.common.report.ReportState;
import com.fr.decision.webservice.v10.plugin.helper.PluginErrorRemindHandler;
import com.fr.design.data.DesignTableDataManager;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.DialogActionAdapter;
@ -35,6 +36,7 @@ import com.fr.process.engine.core.FineProcessContext;
import com.fr.rpc.Result;
import com.fr.stable.AssistUtils;
import com.fr.stable.StringUtils;
import com.fr.env.PluginErrorRemindDialog;
import com.fr.start.server.ServerTray;
import com.fr.workspace.WorkContext;
import com.fr.workspace.WorkContextCallback;
@ -144,6 +146,7 @@ public class EnvChangeEntrance {
template.refreshToolArea();
}
showServiceDialog(selectedEnv);
pluginErrorRemind(selectedEnv);
} catch (WorkspaceAuthException | RegistEditionException e) {
// String title = Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Auth_Failed");
// String title = Toolkit.i18nText("Fine-Design_Basic_Lic_Does_Not_Support_Remote");
@ -297,6 +300,22 @@ public class EnvChangeEntrance {
}
}
/**
* 插件启动错误信息提示
* @param selectedEnv 选择的工作环境
*/
public void pluginErrorRemind(DesignerWorkspaceInfo selectedEnv) {
if (selectedEnv.getType() == DesignerWorkspaceType.Remote) {
return;
}
String content = PluginErrorRemindHandler.pluginErrorContent();
if (StringUtils.isNotEmpty(content)) {
PluginErrorRemindDialog dialog = new PluginErrorRemindDialog(DesignerContext.getDesignerFrame(), content);
dialog.setVisible(true);
}
}
/**
* 判断是否需要做版本验证判断依据为
* 1选择的环境为远程环境

38
designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java

@ -35,18 +35,18 @@ public abstract class AbstractTableDataWrapper implements TableDataWrapper {
/**
* 获取数据集的所有列名list
*
*
* @return 数据集的所有列名list
*
*
*
* @date 2014-11-24-下午3:51:41
*
*
*/
public List<String> calculateColumnNameList() {
if(columnNameList != null){
return columnNameList;
}
DesignModelAdapter adapter = DesignModelAdapter.getCurrentModelAdapter();
TableDataSource tds = adapter == null ? null : adapter.getBook();
String[] colNames = tabledata.getColumnNames(tds);
@ -56,13 +56,13 @@ public abstract class AbstractTableDataWrapper implements TableDataWrapper {
} else if (ArrayUtils.isNotEmpty(colNamesInCache)) {
return toColumnNameList(colNamesInCache);
}
EmbeddedTableData embeddedTableData = null;
try {
embeddedTableData = DesignTableDataManager.previewTableDataNotNeedInputParameters(tds, tabledata, TableData.RESULT_NOT_NEED, false);
} catch (Exception e) {
if (e.getMessage()!=null) {
DesignUtils.errorMessage(e.getMessage());
DesignUtils.errorMessage(e.getMessage());
}
}
columnNameList = DesignTableDataManager.getColumnNamesByTableData(embeddedTableData);
@ -78,12 +78,12 @@ public abstract class AbstractTableDataWrapper implements TableDataWrapper {
/**
* 生成子节点
*
*
* @return 生成子节点
*
*
*
* @date 2014-11-24-下午3:51:17
*
*
*/
public ExpandMutableTreeNode[] load() {
List<String> namelist = calculateColumnNameList();
@ -97,10 +97,10 @@ public abstract class AbstractTableDataWrapper implements TableDataWrapper {
/**
* 预览数据集
*
*
*
* @date 2014-11-24-下午3:50:20
*
*
*/
public void previewData() {
PreviewTablePane.previewTableData(tabledata);
@ -108,30 +108,30 @@ public abstract class AbstractTableDataWrapper implements TableDataWrapper {
/**
* 预览数据集,带有显示值和实际值的标记结果
*
*
* @param keyIndex 实际值
* @param valueIndex 显示值
*
*
*
* @date 2014-11-24-下午3:50:20
*
*
*/
public void previewData(final int keyIndex,final int valueIndex){
PreviewTablePane.previewTableData(tabledata, keyIndex, valueIndex);
}
@Override
public String getTableDataName(){
return name;
return name;
}
/**
* 获取数据集的面板
*
*
* @return 数据集面板
*
*
*
* @date 2014-11-24-下午3:50:00
*
*
*/
public AbstractTableDataPane<?> creatTableDataPane() {
return TableDataFactory.creatTableDataPane(tabledata, name);
@ -143,4 +143,4 @@ public abstract class AbstractTableDataWrapper implements TableDataWrapper {
&& ComparatorUtils.equals(this.tabledata, ((AbstractTableDataWrapper) obj).getTableData());
}
}
}

50
designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java

@ -18,6 +18,7 @@ import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.context.PluginContext;
import com.fr.plugin.context.PluginMarker;
import com.fr.plugin.context.PluginMarkerAdapter;
import com.fr.plugin.manage.PluginManager;
import com.fr.plugin.manage.control.PluginControllerHelper;
import com.fr.plugin.manage.control.PluginTask;
@ -26,7 +27,8 @@ import com.fr.plugin.manage.control.PluginTaskResult;
import com.fr.plugin.view.PluginView;
import com.fr.stable.StringUtils;
import javax.swing.*;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import java.io.File;
import java.net.HttpURLConnection;
import java.util.List;
@ -38,11 +40,23 @@ import java.util.List;
public class PluginOperateUtils {
public static void installPluginOnline(final PluginMarker pluginMarker, JSCallback jsCallback) {
PluginMarker marker = updateMarker2Online(pluginMarker);
//下载插件
PluginTask pluginTask = PluginTask.installTask(pluginMarker);
PluginTask pluginTask = PluginTask.installTask(marker);
PluginControllerHelper.installOnline(pluginMarker, new InstallOnlineCallback(pluginTask, jsCallback));
}
public static PluginMarker updateMarker2Online(PluginMarker pluginMarker) {
try {
JSONObject latestPluginInfo = PluginUtils.getLatestPluginInfo(pluginMarker.getPluginID());
String pluginName = latestPluginInfo.getString("name");
return PluginMarkerAdapter.create(pluginMarker, pluginName);
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
return pluginMarker;
}
public static void installPluginFromDisk(File zipFile, JSCallback jsCallback) {
PluginManager.getController().install(zipFile, new InstallFromDiskCallback(zipFile, jsCallback));
}
@ -57,10 +71,11 @@ public class PluginOperateUtils {
public static void updatePluginOnline(PluginMarker pluginMarker, JSCallback jsCallback) {
try {
JSONObject latestPluginInfo = PluginUtils.getLatestPluginInfo(pluginMarker.getPluginID());
String latestPluginVersion = (String) latestPluginInfo.get("version");
PluginMarker toPluginMarker = PluginMarker.create(pluginMarker.getPluginID(), latestPluginVersion);
String latestPluginVersion = latestPluginInfo.getString("version");
String pluginName = latestPluginInfo.getString("name");
PluginMarker toPluginMarker = PluginMarkerAdapter.create(pluginMarker.getPluginID(), latestPluginVersion, pluginName);
//当前已经安装的相同ID插件marker
PluginMarker currentMarker = PluginUtils.getInstalledPluginMarkerByID(pluginMarker.getPluginID());
PluginMarker currentMarker = PluginMarkerAdapter.create(PluginUtils.getInstalledPluginMarkerByID(pluginMarker.getPluginID()), pluginName);
PluginTask pluginTask = PluginTask.updateTask(currentMarker, toPluginMarker);
PluginControllerHelper.updateOnline(currentMarker, toPluginMarker, new UpdateOnlineCallback(pluginTask, jsCallback));
} catch (Exception e) {
@ -128,6 +143,10 @@ public class PluginOperateUtils {
}
public static void dealParams(StringBuilder url, String category, String seller, String fee, String scope) {
dealParams(url, category, seller, fee, StringUtils.EMPTY);
}
public static void dealParams(StringBuilder url, String category, String seller, String fee, String scope, String language) {
if (StringUtils.isNotBlank(category)) {
url.append("cid=").append(category.split("-")[1]);
} else {
@ -169,6 +188,9 @@ public class PluginOperateUtils {
url.append("&scope=").append(StringUtils.EMPTY);
}
}
if (StringUtils.isNotBlank(language)) {
url.append("&language=").append(language.split("-")[1]);
}
}
public static void getLoginInfo(JSCallback jsCallback, UILabel uiLabel) {
@ -203,16 +225,22 @@ public class PluginOperateUtils {
continue;
}
PluginMarker pluginMarker = pluginTask.getToMarker();
PluginContext pluginContext = PluginManager.getContext(pluginMarker);
if (pluginContext != null) {
pluginInfo.append(pluginContext.getName()).append(PluginUtils.getMessageByErrorCode(pluginTaskResult.errorCode()));
} else {
pluginInfo.append(pluginMarker.getPluginID()).append(PluginUtils.getMessageByErrorCode(pluginTaskResult.errorCode()));
}
PluginContext pluginContext = PluginManager.getContext(pluginMarker.getPluginID());
pluginInfo.append(getPluginName(pluginContext, pluginMarker)).append(PluginUtils.getMessageByErrorCode(pluginTaskResult.errorCode()));
}
return pluginInfo.toString();
}
private static String getPluginName(PluginContext pluginContext, PluginMarker pluginMarker) {
if (pluginContext != null) {
return pluginContext.getName();
}
else if (pluginMarker instanceof PluginMarkerAdapter) {
return ((PluginMarkerAdapter) pluginMarker).getPluginName();
}
return pluginMarker == null ? StringUtils.EMPTY : pluginMarker.getPluginID();
}
public static String getSwitchedInfo(PluginTaskResult result) {
StringBuilder pluginInfo = new StringBuilder();
List<PluginTaskResult> pluginTaskResults = result.asList();

1
designer-base/src/main/java/com/fr/design/extra/PluginUtils.java

@ -10,6 +10,7 @@ import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.PluginVerifyException;
import com.fr.plugin.basic.version.Version;
import com.fr.plugin.basic.version.VersionIntervalType;
import com.fr.plugin.basic.version.VersionIntervalFactory;
import com.fr.plugin.context.PluginContext;
import com.fr.plugin.context.PluginMarker;

11
designer-base/src/main/java/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java

@ -21,19 +21,26 @@ public class GetPluginFromStoreExecutor implements Executor {
private String seller;
private String fee;
private String scope;
private String language;
public GetPluginFromStoreExecutor(JSONObject info) {
this.category = info.optString("categories");
this.fee = info.optString("fee");
this.seller = info.optString("seller");
this.scope = info.optString("scope");
this.language = info.optString("language");
}
public GetPluginFromStoreExecutor(String category, String seller, String fee, String scope) {
this(category, seller, fee, scope, StringUtils.EMPTY);
}
public GetPluginFromStoreExecutor(String category, String seller, String fee, String scope, String language) {
this.category = category;
this.seller = seller;
this.fee = fee;
this.scope = scope;
this.language = language;
}
@Override
@ -53,7 +60,7 @@ public class GetPluginFromStoreExecutor implements Executor {
@Override
public void run(Process<String> process) {
String plistUrl = CloudCenter.getInstance().acquireUrlByKind("shop.plugin.plist");
boolean getRecommend = StringUtils.isEmpty(category) && StringUtils.isEmpty(seller) && StringUtils.isEmpty(fee) && StringUtils.isEmpty(scope);
boolean getRecommend = StringUtils.isEmpty(category) && StringUtils.isEmpty(seller) && StringUtils.isEmpty(fee) && StringUtils.isEmpty(scope) & StringUtils.isEmpty(language);
if (getRecommend) {
result = PluginOperateUtils.getRecommendPlugins();
return;
@ -62,7 +69,7 @@ public class GetPluginFromStoreExecutor implements Executor {
if (StringUtils.isNotBlank(plistUrl)) {
StringBuilder url = new StringBuilder();
url.append(plistUrl).append("?");
PluginOperateUtils.dealParams(url, category, seller, fee, scope);
PluginOperateUtils.dealParams(url, category, seller, fee, scope, language);
try {
HttpClient httpClient = new HttpClient(url.toString());
httpClient.asGet();

32
designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java

@ -3,7 +3,7 @@ package com.fr.design.extra.exe.callback;
import com.fr.design.bridge.exec.JSCallback;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.extra.PluginOperateUtils;
import com.fr.design.extra.PluginUtils;
import com.fr.design.i18n.Toolkit;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.context.PluginMarker;
@ -12,7 +12,6 @@ import com.fr.plugin.manage.PluginManager;
import com.fr.plugin.manage.control.PluginTask;
import com.fr.plugin.manage.control.PluginTaskResult;
import javax.swing.*;
import java.io.File;
import java.util.List;
@ -41,20 +40,21 @@ public class InstallFromDiskCallback extends AbstractPluginTaskCallback {
if (result.isSuccess()) {
String switchedInfo = PluginOperateUtils.getSwitchedInfo(result);
jsCallback.execute("success");
FineLoggerFactory.getLogger().info(pluginInfo + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Success") + switchedInfo);
FineJOptionPane.showMessageDialog(null, pluginInfo + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Success") + switchedInfo);
String successInfo = pluginInfo + Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Success") + switchedInfo;
FineLoggerFactory.getLogger().info(successInfo);
FineJOptionPane.showMessageDialog(null, successInfo);
} else if (result.errorCode() == PluginErrorCode.NeedDealWithPluginDependency) {
int rv = JOptionPane.showOptionDialog(
int rv = FineJOptionPane.showOptionDialog(
null,
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Dependence"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"),
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE,
FineJOptionPane.YES_NO_CANCEL_OPTION,
FineJOptionPane.INFORMATION_MESSAGE,
null,
FineJOptionPane.OPTION_YES_NO_CANCEL,
null
);
if (rv == JOptionPane.NO_OPTION || rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) {
if (rv == FineJOptionPane.NO_OPTION || rv == FineJOptionPane.CANCEL_OPTION || rv == FineJOptionPane.CLOSED_OPTION) {
return;
}
List<PluginTask> pluginTasks = result.getPreTasks();
@ -64,24 +64,24 @@ public class InstallFromDiskCallback extends AbstractPluginTaskCallback {
}
PluginManager.getController().install(zipFile, new InstallFromDiskCallback(zipFile, jsCallback));
} else if(result.errorCode() == PluginErrorCode.HasLowerPluginWhenInstall){
int rv = JOptionPane.showOptionDialog(
int rv = FineJOptionPane.showOptionDialog(
null,
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Has_Install_Lower"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"),
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE,
Toolkit.i18nText("Fine-Design_Basic_Plugin_Has_Install_Lower"),
Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"),
FineJOptionPane.YES_NO_CANCEL_OPTION,
FineJOptionPane.INFORMATION_MESSAGE,
null,
FineJOptionPane.OPTION_YES_NO_CANCEL,
null
);
if (rv == JOptionPane.NO_OPTION || rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) {
if (rv == FineJOptionPane.NO_OPTION || rv == FineJOptionPane.CANCEL_OPTION || rv == FineJOptionPane.CLOSED_OPTION) {
return;
}
PluginOperateUtils.updatePluginFromDisk(zipFile, jsCallback);
}else {
jsCallback.execute("failed");
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Failed"));
FineJOptionPane.showMessageDialog(null, PluginUtils.getMessageByErrorCode(result.errorCode()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Failed"), JOptionPane.ERROR_MESSAGE);
FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Failed"));
FineJOptionPane.showMessageDialog(null, pluginInfo, Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), FineJOptionPane.ERROR_MESSAGE);
}
}
}

27
designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallOnlineCallback.java

@ -3,6 +3,7 @@ package com.fr.design.extra.exe.callback;
import com.fr.design.bridge.exec.JSCallback;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.extra.PluginOperateUtils;
import com.fr.design.i18n.Toolkit;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.context.PluginMarker;
@ -11,8 +12,6 @@ import com.fr.plugin.manage.control.AbstractDealPreTaskCallback;
import com.fr.plugin.manage.control.PluginTask;
import com.fr.plugin.manage.control.PluginTaskResult;
import javax.swing.*;
/**
* Created by ibm on 2017/5/26.
@ -38,28 +37,30 @@ public class InstallOnlineCallback extends AbstractDealPreTaskCallback {
if (result.isSuccess()) {
String switchedInfo = PluginOperateUtils.getSwitchedInfo(result);
jsCallback.execute("success");
FineLoggerFactory.getLogger().info(pluginInfo + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Success") + switchedInfo);
FineJOptionPane.showMessageDialog(null, pluginInfo + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Success") + switchedInfo);
String successInfo = pluginInfo + Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Success") + switchedInfo;
FineLoggerFactory.getLogger().info(successInfo);
FineJOptionPane.showMessageDialog(null, successInfo);
} else if(result.errorCode() == PluginErrorCode.HasLowerPluginWhenInstall){
int rv = JOptionPane.showOptionDialog(
int rv = FineJOptionPane.showOptionDialog(
null,
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Has_Install_Lower"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"),
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE,
Toolkit.i18nText("Fine-Design_Basic_Plugin_Has_Install_Lower"),
Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"),
FineJOptionPane.YES_NO_CANCEL_OPTION,
FineJOptionPane.INFORMATION_MESSAGE,
null,
FineJOptionPane.OPTION_YES_NO_CANCEL,
null
);
if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) {
if (rv == FineJOptionPane.NO_OPTION || rv == FineJOptionPane.CANCEL_OPTION || rv == FineJOptionPane.CLOSED_OPTION) {
jsCallback.execute("success");
return;
}
PluginMarker pluginMarker = result.getCurrentTask().getMarker();
PluginOperateUtils.updatePluginOnline(pluginMarker, jsCallback);
}else {
} else {
jsCallback.execute("failed");
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Failed"));
FineJOptionPane.showMessageDialog(null, pluginInfo, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Failed"));
FineJOptionPane.showMessageDialog(null, pluginInfo, Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), FineJOptionPane.ERROR_MESSAGE);
}
}

14
designer-base/src/main/java/com/fr/design/extra/exe/callback/ModifyStatusCallback.java

@ -2,12 +2,14 @@ package com.fr.design.extra.exe.callback;
import com.fr.design.bridge.exec.JSCallback;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.extra.PluginUtils;
import com.fr.design.extra.PluginOperateUtils;
import com.fr.design.i18n.Toolkit;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.manage.control.PluginTaskCallback;
import com.fr.plugin.manage.control.PluginTaskResult;
import javax.swing.*;
import javax.swing.JOptionPane;
/**
* Created by ibm on 2017/5/27.
@ -22,12 +24,16 @@ public class ModifyStatusCallback implements PluginTaskCallback{
}
@Override
public void done(PluginTaskResult result) {
String pluginInfo = PluginOperateUtils.getSuccessInfo(result);
if (result.isSuccess()) {
jsCallback.execute("success");
String modifyMessage = isActive ? com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Has_Been_Disabled_Duplicate") : com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Plugin_Has_Been_Actived_Duplicate");
String modifyMessage = isActive ?
pluginInfo + Toolkit.i18nText("Fine-Design_Basic_Plugin_Has_Been_Disabled_Duplicate") :
pluginInfo + Toolkit.i18nText("Fine-Design_Plugin_Has_Been_Actived_Duplicate");
FineLoggerFactory.getLogger().info(modifyMessage);
FineJOptionPane.showMessageDialog(null, modifyMessage);
} else {
FineJOptionPane.showMessageDialog(null, PluginUtils.getMessageByErrorCode(result.errorCode()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
FineJOptionPane.showMessageDialog(null, pluginInfo, Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
}
}

27
designer-base/src/main/java/com/fr/design/extra/exe/callback/UninstallPluginCallback.java

@ -2,7 +2,8 @@ package com.fr.design.extra.exe.callback;
import com.fr.design.bridge.exec.JSCallback;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.extra.PluginUtils;
import com.fr.design.extra.PluginOperateUtils;
import com.fr.design.i18n.Toolkit;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.context.PluginMarker;
@ -10,8 +11,6 @@ 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/27.
*/
@ -25,29 +24,31 @@ public class UninstallPluginCallback extends AbstractPluginTaskCallback {
@Override
public void done(PluginTaskResult result) {
String pluginInfo = PluginOperateUtils.getSuccessInfo(result);
if (result.isSuccess()) {
jsCallback.execute("success");
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Success"));
FineJOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Success"));
String successInfo = pluginInfo + Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Success");
FineLoggerFactory.getLogger().info(successInfo);
FineJOptionPane.showMessageDialog(null, successInfo);
}else if (result.errorCode() == PluginErrorCode.NeedUninstallDependingPluginFirst) {
int rv = JOptionPane.showOptionDialog(
int rv = FineJOptionPane.showOptionDialog(
null,
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Dependence"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"),
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE,
Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Dependence"),
Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"),
FineJOptionPane.YES_NO_CANCEL_OPTION,
FineJOptionPane.INFORMATION_MESSAGE,
null,
FineJOptionPane.OPTION_YES_NO_CANCEL,
null
);
if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) {
if (rv == FineJOptionPane.CANCEL_OPTION || rv == FineJOptionPane.CLOSED_OPTION) {
return;
}
PluginManager.getController().uninstall(pluginMarker, true, new UninstallPluginCallback(pluginMarker, jsCallback));
} else {
jsCallback.execute("failed");
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Failed"));
FineJOptionPane.showMessageDialog(null, PluginUtils.getMessageByErrorCode(result.errorCode()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Failed"));
FineJOptionPane.showMessageDialog(null, pluginInfo, Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), FineJOptionPane.ERROR_MESSAGE);
}
}
}

37
designer-base/src/main/java/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java

@ -3,7 +3,7 @@ package com.fr.design.extra.exe.callback;
import com.fr.design.bridge.exec.JSCallback;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.extra.PluginOperateUtils;
import com.fr.design.extra.PluginUtils;
import com.fr.design.i18n.Toolkit;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.context.PluginMarker;
@ -12,7 +12,6 @@ import com.fr.plugin.manage.PluginManager;
import com.fr.plugin.manage.control.PluginTask;
import com.fr.plugin.manage.control.PluginTaskResult;
import javax.swing.*;
import java.io.File;
import java.util.List;
@ -37,22 +36,24 @@ public class UpdateFromDiskCallback extends AbstractPluginTaskCallback {
@Override
public void done(PluginTaskResult result) {
String pluginInfo = PluginOperateUtils.getSuccessInfo(result);
if (result.isSuccess()) {
jsCallback.execute("success");
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Update_Success"));
FineJOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Update_Success"));
String successInfo = pluginInfo + Toolkit.i18nText("Fine-Design_Basic_Plugin_Update_Success");
FineLoggerFactory.getLogger().info(successInfo);
FineJOptionPane.showMessageDialog(null, successInfo);
} else if (result.errorCode() == PluginErrorCode.NeedDealWithPluginDependency) {
int rv = JOptionPane.showOptionDialog(
int rv = FineJOptionPane.showOptionDialog(
null,
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Update_Dependence"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"),
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE,
Toolkit.i18nText("Fine-Design_Basic_Plugin_Update_Dependence"),
Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"),
FineJOptionPane.YES_NO_CANCEL_OPTION,
FineJOptionPane.INFORMATION_MESSAGE,
null,
FineJOptionPane.OPTION_YES_NO_CANCEL,
null
);
if (rv == JOptionPane.NO_OPTION || rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) {
if (rv == FineJOptionPane.NO_OPTION || rv == FineJOptionPane.CANCEL_OPTION || rv == FineJOptionPane.CLOSED_OPTION) {
return;
}
List<PluginTask> pluginTasks = result.getPreTasks();
@ -62,24 +63,24 @@ public class UpdateFromDiskCallback extends AbstractPluginTaskCallback {
}
PluginManager.getController().update(zipFile, new UpdateFromDiskCallback(zipFile, jsCallback));
} else if(result.errorCode() == PluginErrorCode.NoPluginToUpdate){
int rv = JOptionPane.showOptionDialog(
int rv = FineJOptionPane.showOptionDialog(
null,
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_No_Plugin_Update"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"),
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE,
Toolkit.i18nText("Fine-Design_Basic_Plugin_No_Plugin_Update"),
Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"),
FineJOptionPane.YES_NO_CANCEL_OPTION,
FineJOptionPane.INFORMATION_MESSAGE,
null,
FineJOptionPane.OPTION_YES_NO_CANCEL,
null
);
if (rv == JOptionPane.NO_OPTION || rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) {
if (rv == FineJOptionPane.NO_OPTION || rv == FineJOptionPane.CANCEL_OPTION || rv == FineJOptionPane.CLOSED_OPTION) {
return;
}
PluginOperateUtils.installPluginFromDisk(zipFile, jsCallback);
}else {
jsCallback.execute("failed");
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Update_Failed"));
FineJOptionPane.showMessageDialog(null, PluginUtils.getMessageByErrorCode(result.errorCode()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Plugin_Update_Failed"));
FineJOptionPane.showMessageDialog(null, pluginInfo, Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), FineJOptionPane.ERROR_MESSAGE);
}
}
}

12
designer-base/src/main/java/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java

@ -3,14 +3,13 @@ package com.fr.design.extra.exe.callback;
import com.fr.design.bridge.exec.JSCallback;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.extra.PluginOperateUtils;
import com.fr.design.i18n.Toolkit;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.manage.control.AbstractDealPreTaskCallback;
import com.fr.plugin.manage.control.PluginTask;
import com.fr.plugin.manage.control.PluginTaskResult;
import javax.swing.*;
/**
* Created by ibm on 2017/5/26.
*/
@ -33,12 +32,13 @@ public class UpdateOnlineCallback extends AbstractDealPreTaskCallback {
String pluginInfo = PluginOperateUtils.getSuccessInfo(result);
if (result.isSuccess()) {
jsCallback.execute("success");
FineLoggerFactory.getLogger().info(pluginInfo + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Update_Success"));
FineJOptionPane.showMessageDialog(null,pluginInfo + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Update_Success"));
String successInfo = pluginInfo + Toolkit.i18nText("Fine-Design_Basic_Plugin_Update_Success");
FineLoggerFactory.getLogger().info(successInfo);
FineJOptionPane.showMessageDialog(null, successInfo);
} else {
jsCallback.execute("failed");
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Update_Failed"));
FineJOptionPane.showMessageDialog(null, pluginInfo, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Plugin_Update_Failed"));
FineJOptionPane.showMessageDialog(null, pluginInfo, Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), FineJOptionPane.ERROR_MESSAGE);
}
}
}

3
designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java

@ -2,7 +2,6 @@ package com.fr.design.file;
import com.fr.base.chart.chartdata.CallbackEvent;
import com.fr.base.io.BaseBook;
import com.fr.design.DesignModelAdapter;
import com.fr.design.DesignerEnvManager;
import com.fr.design.base.mode.DesignModeContext;
import com.fr.design.data.DesignTableDataManager;
@ -23,7 +22,6 @@ import com.fr.stable.CoreConstants;
import com.fr.stable.StringUtils;
import com.fr.third.org.apache.commons.io.FilenameUtils;
import javax.swing.SwingUtilities;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Collections;
@ -441,4 +439,5 @@ public class HistoryTemplateListCache implements CallbackEvent {
}
});
}
}

4
designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java

@ -18,8 +18,6 @@ import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.Constants;
import com.fr.third.javax.annotation.Nonnull;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.lock.TplOperator;
import javax.swing.BorderFactory;
import javax.swing.ButtonModel;
@ -707,7 +705,7 @@ public class MutilTempalteTabPane extends JComponent {
// 只有是环境内的文件,才执行释放锁
if (file != null && file.isEnvFile()) {
// release lock
WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(file.getPath());
TemplateResourceManager.getResource().closeTemplate(file.getPath());
}
}

71
designer-base/src/main/java/com/fr/design/file/TemplateResource.java

@ -0,0 +1,71 @@
package com.fr.design.file;
import com.fr.common.annotations.Open;
import com.fr.file.FILE;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 模板资源操作可操作模板及模板目录
*
* @author hades
* @version 10.0
* Created by hades on 2020/12/23
*/
@Open
public interface TemplateResource {
/**
* 读取模板
* @param path
* @return
* @throws Exception
*/
InputStream readTemplate(String path) throws Exception;
/**
* 保存模板
* @param file
* @return
* @throws Exception
*/
OutputStream saveTemplate(FILE file) throws Exception;
/**
* 删除某个目录/某个模板
* @param file
* @return
*/
boolean delete(FILE file);
/**
* 关闭模板
* @param path
* @return
*/
boolean closeTemplate(String path);
/**
* 重命名模板/目录
* @param from
* @param to
* @return
*/
boolean rename(String from, String to);
/**
* 模板/目录是否存在
* @param path
* @return
*/
boolean exist(String path);
/**
* 创建目录
* @param path
* @return
*/
boolean mkdir(String path);
}

66
designer-base/src/main/java/com/fr/design/file/TemplateResourceManager.java

@ -0,0 +1,66 @@
package com.fr.design.file;
import com.fr.design.ExtraDesignClassManager;
import com.fr.design.file.impl.DefaultTemplateResource;
import com.fr.design.fun.LocalResourceProvider;
import com.fr.design.mainframe.DesignerFrameFileDealerPane;
import com.fr.design.ui.util.UIUtil;
import com.fr.file.filetree.FileNodes;
import com.fr.file.filetree.LocalFileNodes;
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 com.fr.plugin.observer.PluginListenerRegistration;
import com.fr.workspace.WorkContext;
import com.fr.workspace.engine.base.FineObjectPool;
/**
* @author hades
* @version 10.0
* Created by hades on 2020/12/23
*/
public class TemplateResourceManager {
private static final TemplateResource DEFAULT_OPERATION = new DefaultTemplateResource();
private static TemplateResource OPERATION = DEFAULT_OPERATION;
static {
PluginFilter filter = pluginContext -> pluginContext.contain(PluginModule.ExtraDesign, LocalResourceProvider.XML_TAG);
PluginListenerRegistration.getInstance().listen(PluginEventType.AfterStop, new PluginEventListener() {
@Override
public void on(PluginEvent event) {
registerOperation(new DefaultTemplateResource());
FineObjectPool.getInstance().getLocalPool().put(FileNodes.class, new LocalFileNodes());
UIUtil.invokeLaterIfNeeded(() -> DesignerFrameFileDealerPane.getInstance().refresh());
}
}, filter);
PluginListenerRegistration.getInstance().listen(PluginEventType.AfterRun, new PluginEventListener() {
@Override
public void on(PluginEvent event) {
LocalResourceProvider provider = ExtraDesignClassManager.getInstance().getSingle(LocalResourceProvider.XML_TAG);
if (provider != null && WorkContext.getCurrent().isLocal()) {
registerOperation(provider.createResourceOperation());
FineObjectPool.getInstance().getLocalPool().put(FileNodes.class, provider.createFileNodes());
UIUtil.invokeLaterIfNeeded(() -> DesignerFrameFileDealerPane.getInstance().refresh());
}
}
}, filter);
}
private static void registerOperation(TemplateResource operation) {
OPERATION = operation;
}
public static TemplateResource getResource() {
if (OPERATION == null) {
return DEFAULT_OPERATION;
}
return OPERATION;
}
}

21
designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java

@ -4,7 +4,9 @@
package com.fr.design.file;
import com.fr.base.FRContext;
import com.fr.design.ExtraDesignClassManager;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.fun.TemplateTreeDefineProcessor;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.gui.itree.filetree.TemplateFileTree;
import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode;
@ -23,12 +25,11 @@ import com.fr.stable.CoreConstants;
import com.fr.stable.StableUtils;
import com.fr.stable.project.ProjectConstants;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.lock.TplOperator;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
import javax.swing.UIManager;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
@ -87,6 +88,16 @@ public class TemplateTreePane extends JPanel implements FileOperations {
}
}
@Override
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
TemplateTreeDefineProcessor processor = ExtraDesignClassManager.getInstance().getSingle(TemplateTreeDefineProcessor.XML_TAG);
if (processor != null) {
processor.rightClickAction(e);
}
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (toolBarStateChangeListener != null) {
@ -182,7 +193,7 @@ public class TemplateTreePane extends JPanel implements FileOperations {
@Override
public boolean mkdir(String path) {
return WorkContext.getWorkResource().createDirectory(path);
return TemplateResourceManager.getResource().mkdir(path);
}
/**
@ -325,7 +336,7 @@ public class TemplateTreePane extends JPanel implements FileOperations {
if (node instanceof FileNode) {
FileNodeFILE nodeFILE = new FileNodeFILE((FileNode) node);
if (nodeFILE.exists()) {
if (WorkContext.getCurrent().get(TplOperator.class).delete(nodeFILE.getPath())) {
if (TemplateResourceManager.getResource().delete(nodeFILE)) {
HistoryTemplateListCache.getInstance().deleteFile(nodeFILE);
} else {
success = false;
@ -427,7 +438,7 @@ public class TemplateTreePane extends JPanel implements FileOperations {
try {
// 接收的是WEB-INF下的路径
return WorkContext.getCurrent().get(TplOperator.class).rename(from, to);
return TemplateResourceManager.getResource().rename(from, to);
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
return false;

19
designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateResource.java

@ -0,0 +1,19 @@
package com.fr.design.file.impl;
import com.fr.design.file.TemplateResource;
import com.fr.file.FILE;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.lock.TplOperator;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
* @author hades
* @version 10.0
* Created by hades on 2020/12/23
*/
public abstract class AbstractTemplateResource implements TemplateResource {
}

52
designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateResource.java

@ -0,0 +1,52 @@
package com.fr.design.file.impl;
import com.fr.file.FILE;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.lock.TplOperator;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
* @author hades
* @version 10.0
* Created by hades on 2020/12/23
*/
public class DefaultTemplateResource extends AbstractTemplateResource {
@Override
public InputStream readTemplate(String path) throws Exception {
return new ByteArrayInputStream(WorkContext.getCurrent().get(TplOperator.class).readAndLockFile(path));
}
@Override
public OutputStream saveTemplate(FILE file) throws Exception {
return file.asOutputStream();
}
@Override
public boolean closeTemplate(String path) {
return WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(path);
}
@Override
public boolean delete(FILE file) {
return WorkContext.getCurrent().get(TplOperator.class).delete(file.getPath());
}
@Override
public boolean rename(String from, String to) {
return WorkContext.getCurrent().get(TplOperator.class).rename(from, to);
}
@Override
public boolean exist(String path) {
return WorkContext.getWorkResource().exist(path);
}
@Override
public boolean mkdir(String path) {
return WorkContext.getWorkResource().createDirectory(path);
}
}

34
designer-base/src/main/java/com/fr/design/fun/LocalResourceProvider.java

@ -0,0 +1,34 @@
package com.fr.design.fun;
import com.fr.design.file.TemplateResource;
import com.fr.file.filetree.FileNodes;
import com.fr.stable.fun.mark.Immutable;
/**
* 本地资源操作插件接口
*
* @author hades
* @version 10.0
* Created by hades on 2020/12/22
*/
public interface LocalResourceProvider extends Immutable {
String XML_TAG = "LocalResourceProvider";
int CURRENT_LEVEL = 1;
/**
* eg: DefaultResourceOperation
*
* @return 目录/模板的各种操作
*/
TemplateResource createResourceOperation();
/**
* eg: LocalFileNodes
*
* @return 构建目录树的方式
*/
FileNodes createFileNodes();
}

19
designer-base/src/main/java/com/fr/design/fun/TemplateTreeDefineProcessor.java

@ -0,0 +1,19 @@
package com.fr.design.fun;
import com.fr.stable.fun.mark.Immutable;
import java.awt.event.MouseEvent;
/**
* @author hades
* @version 10.0
* Created by hades on 2020/12/14
*/
public interface TemplateTreeDefineProcessor extends Immutable {
String XML_TAG = "TemplateTreeDefineProcessor";
int CURRENT_LEVEL = 1;
void rightClickAction(MouseEvent mouseEvent);
}

23
designer-base/src/main/java/com/fr/design/fun/impl/AbstractLocalResourceProvider.java

@ -0,0 +1,23 @@
package com.fr.design.fun.impl;
import com.fr.design.fun.LocalResourceProvider;
import com.fr.stable.fun.mark.API;
/**
* @author hades
* @version 10.0
* Created by hades on 2020/12/22
*/
@API(level = LocalResourceProvider.CURRENT_LEVEL)
public abstract class AbstractLocalResourceProvider implements LocalResourceProvider {
@Override
public int currentAPILevel() {
return CURRENT_LEVEL;
}
@Override
public int layerIndex() {
return DEFAULT_LAYER_INDEX;
}
}

24
designer-base/src/main/java/com/fr/design/fun/impl/AbstractTemplateTreeDefineProcessor.java

@ -0,0 +1,24 @@
package com.fr.design.fun.impl;
import com.fr.design.fun.TemplateTreeDefineProcessor;
import com.fr.stable.fun.mark.API;
/**
* @author hades
* @version 10.0
* Created by hades on 2020/12/21
*/
@API(level = TemplateTreeDefineProcessor.CURRENT_LEVEL)
public abstract class AbstractTemplateTreeDefineProcessor implements TemplateTreeDefineProcessor {
@Override
public int currentAPILevel() {
return CURRENT_LEVEL;
}
@Override
public int layerIndex() {
return DEFAULT_LAYER_INDEX;
}
}

13
designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java

@ -1,12 +1,10 @@
package com.fr.design.gui.icontainer;
import com.fr.base.BaseUtils;
import com.fr.base.vcs.DesignerMode;
import com.fr.design.constants.UIConstants;
import com.fr.design.mainframe.DesignerContext;
import com.fr.stable.Constants;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.stable.collections.utils.MathUtils;
import javax.swing.*;
import java.awt.*;
@ -159,8 +157,7 @@ public class UIResizableContainer extends JPanel {
}
/**
* 设置关闭设计器前最后一次上下子面板的高度
*
* 设置关闭设计器前最新的上子面板的高度比例
* @param toolPaneY
*/
public void setLastToolPaneY(int toolPaneY) {
@ -242,10 +239,10 @@ public class UIResizableContainer extends JPanel {
if (parentHeight == -1) {
// 初始化下parentheight,存一下当前的父容器height
parentHeight = parent.getHeight();
} else if (parentHeight != parent.getHeight()) {
// parentHeight与父容器height不等时,代表用户调整分辨率或者dpi了,此时调整toolPaneY
toolPaneY = toolPaneY * parent.getHeight() / parentHeight;
toolPaneY = Math.min(toolPaneY, (parent.getHeight() - toolPaneHeight));
}
if (parentHeight != parent.getHeight() && (parent.getHeight() - toolPaneHeight) >= 0) {
// 调整toolPaneY,保证至少水平的拖拽条horizontToolPane不丢失
toolPaneY = Math.min(toolPaneY, parent.getHeight() - toolPaneHeight);
parentHeight = parent.getHeight();
}
}

7
designer-base/src/main/java/com/fr/design/gui/ilist/TableViewList.java

@ -106,6 +106,13 @@ public class TableViewList extends UIList {
if (!status) {
throw new Exception(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database_Connection_Failed"));
}
String[] schemas = DataCoreUtils.getDatabaseSchema(datasource);
schemas = (schemas == null || schemas.length == 0) ? new String[]{null} : schemas;
for (String schema : schemas) {
DataCoreUtils.refreshTables(datasource, TableProcedure.TABLE, schema);
DataCoreUtils.refreshTables(datasource, TableProcedure.VIEW, schema);
DataCoreUtils.refreshTables(datasource, TableProcedure.PROCEDURE, schema);
}
return processDataInAnotherThread(databaseName, searchFilter, typesFilter);
}

2
designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java

@ -17,7 +17,6 @@ import com.fr.design.file.FileToolbarStateChangeListener;
import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.file.MutilTempalteTabPane;
import com.fr.design.file.SaveSomeTemplatePane;
import com.fr.design.file.TemplateTreePane;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ilable.UILabel;
@ -58,7 +57,6 @@ import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.BorderLayout;

25
designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java

@ -3,7 +3,6 @@ package com.fr.design.mainframe;
import com.fr.base.BaseUtils;
import com.fr.base.FRContext;
import com.fr.base.Parameter;
import com.fr.base.ScreenResolution;
import com.fr.base.io.BaseBook;
import com.fr.base.iofile.attr.DesignBanCopyAttrMark;
import com.fr.base.iofile.attr.TemplateIdAttrMark;
@ -24,6 +23,7 @@ import com.fr.design.designer.TargetComponent;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.dialog.InformationWarnPane;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.file.TemplateResourceManager;
import com.fr.design.file.TemplateTreePane;
import com.fr.design.fun.DesignerFrameUpButtonProvider;
import com.fr.design.fun.MenuHandler;
@ -49,6 +49,7 @@ import com.fr.design.menu.ShortCut;
import com.fr.design.preview.PagePreview;
import com.fr.design.write.submit.DBManipulationInWidgetEventPane;
import com.fr.design.write.submit.DBManipulationPane;
import com.fr.event.EventDispatcher;
import com.fr.file.FILE;
import com.fr.file.FILEChooserPane;
import com.fr.file.MemFILE;
@ -107,7 +108,6 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
private DesignModelAdapter<T, ?> designModel;
private PreviewProvider previewType;
protected TimeConsumeTimer consumeTimer = new TimeConsumeTimer();
public int resolution = ScreenResolution.getScreenResolution();
private PluginEventListener pluginListener;
@ -125,6 +125,7 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
public JTemplate(T t, FILE file, boolean isNewFile) {
super(t);
beforeInit();
// 判断是否切换设计器状态到禁止拷贝剪切
if (t.getAttrMark(DesignBanCopyAttrMark.XML_TAG) != null) {
DesignModeContext.switchTo(com.fr.design.base.mode.DesignerMode.BAN_COPY_AND_CUT);
@ -301,6 +302,20 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
}
/**
* 模板初始化之前
*/
private void beforeInit() {
EventDispatcher.fire(JTemplateEvent.BEFORE_TEMPLATE_INIT, this);
}
/**
* 模板激活之前之前
*/
protected void beforeActive() {
EventDispatcher.fire(JTemplateEvent.BEFORE_TEMPLATE_ACTIVE, this);
}
/**
* 模板关闭时
*/
@ -309,6 +324,7 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
PluginListenerRegistration.getInstance().stopListen(this.pluginListener);
}
/**
* 刷新内部资源
*
@ -797,7 +813,7 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
return false;
}
try {
this.getTarget().export(editingFILE.asOutputStream());
this.getTarget().export(TemplateResourceManager.getResource().saveTemplate(editingFILE));
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), e.getMessage(), "Save Error", JOptionPane.ERROR_MESSAGE);
@ -1076,6 +1092,7 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
* 激活指定的template
*/
public void activeJTemplate(int index, JTemplate jt) {
beforeActive();
DesignerContext.getDesignerFrame().activateJTemplate(this);
}
@ -1083,6 +1100,7 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
* 激活已存在的模板
*/
public void activeOldJTemplate() {
beforeActive();
DesignerContext.getDesignerFrame().activateJTemplate(this);
}
@ -1090,6 +1108,7 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
* 激活新的模板
*/
public void activeNewJTemplate() {
beforeActive();
DesignerContext.getDesignerFrame().addAndActivateJTemplate(this);
}

19
designer-base/src/main/java/com/fr/design/mainframe/JTemplateEvent.java

@ -0,0 +1,19 @@
package com.fr.design.mainframe;
import com.fr.event.Event;
/**
* Created by kerry on 2020-12-11
*/
public enum JTemplateEvent implements Event<JTemplate> {
/**
* 模板初始化之前
*/
BEFORE_TEMPLATE_INIT,
/**
* 模板激活之前
*/
BEFORE_TEMPLATE_ACTIVE
}

3
designer-base/src/main/java/com/fr/design/mainframe/JVirtualTemplate.java

@ -208,6 +208,7 @@ public class JVirtualTemplate extends JTemplate {
@Override
public void activeJTemplate(int index, JTemplate jt) {
beforeActive();
List<JTemplate<?, ?>> historyList = HistoryTemplateListPane.getInstance().getHistoryList();
historyList.set(index, jt);
DesignerContext.getDesignerFrame().addAndActivateJTemplate(jt);
@ -217,11 +218,13 @@ public class JVirtualTemplate extends JTemplate {
@Override
public void activeOldJTemplate() {
beforeActive();
DesignerContext.getDesignerFrame().openTemplate(this.getEditingFILE());
}
@Override
public void activeNewJTemplate() {
beforeActive();
DesignerContext.getDesignerFrame().openTemplate(this.getEditingFILE());
}

14
designer-base/src/main/java/com/fr/design/mainframe/WestRegionContainerPane.java

@ -32,11 +32,11 @@ public class WestRegionContainerPane extends UIResizableContainer {
public WestRegionContainerPane() {
super(DesignerFrameFileDealerPane.getInstance(), Constants.RIGHT);
setDownPane(TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()));
GeneralContext.listenPluginRunningChanged(new PluginEventListener(TableDataTreePane.PLUGIN_LISTENER_PRIORITY - 1) {
@Override
public void on(PluginEvent event) {
@ -47,15 +47,15 @@ public class WestRegionContainerPane extends UIResizableContainer {
}
}
}, new PluginFilter() {
@Override
public boolean accept(PluginContext context) {
return context.contain(PluginModule.ExtraDesign);
}
});
setContainerWidth(165);
setBackground(UIConstants.TREE_BACKGROUND);
}
}
}

2
designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleDictionaryEditor.java

@ -58,4 +58,4 @@ public class AccessibleDictionaryEditor extends UneditableAccessibleEditor {
public Dictionary updateBean() {
return (Dictionary) this.getValue();
}
}
}

6
designer-base/src/main/java/com/fr/design/present/DictPresentPane.java

@ -10,7 +10,7 @@ import com.fr.design.present.dict.DictionaryPane;
/**
*
*
* @author zhou
* @since 2012-5-31上午10:54:20
*/
@ -42,7 +42,7 @@ public class DictPresentPane extends FurtherBasicBeanPane<DictPresent> implement
public boolean accept(Object ob) {
return ob instanceof DictPresent;
}
public void addTabChangeListener(ItemListener l){
dictionaryPane.addTabChangeListener(l);
}
@ -55,4 +55,4 @@ public class DictPresentPane extends FurtherBasicBeanPane<DictPresent> implement
public void registerDSChangeListener() {
dictionaryPane.registerDSChangeListener();
}
}
}

7
designer-base/src/main/java/com/fr/design/present/dict/DictionaryPane.java

@ -24,6 +24,13 @@ import java.util.List;
public class DictionaryPane extends UIComboBoxPane<Dictionary> implements DataCreatorUI, Prepare4DataSourceChange {
private TableDataDictPane tableDataDictPane;
public DictionaryPane() {
}
public DictionaryPane(boolean needTableDataChange) {
this.tableDataDictPane.setNeedTableDataChange(needTableDataChange);
}
@Override
protected void initLayout() {
this.setLayout(new BorderLayout(0, 4));

108
designer-base/src/main/java/com/fr/design/present/dict/TableDataDictPane.java

@ -31,17 +31,20 @@ import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.ArrayUtils;
import com.fr.stable.StringUtils;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingWorker;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
/**
* 数据字典的数据查询面板
@ -60,6 +63,8 @@ public class TableDataDictPane extends FurtherBasicBeanPane<TableDataDictionary>
private DoubleDeckValueEditorPane valueDictPane;
private ItemListener itemListener;
private UIObserverListener uiObserverListener;
private FormulaEditor localFormulaEditor = new FormulaEditor(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parameter_Formula"));
private boolean needTableDataChange = true;
public TableDataDictPane() {
initBasicComponets();
@ -67,6 +72,14 @@ public class TableDataDictPane extends FurtherBasicBeanPane<TableDataDictionary>
iniListener();
}
/**
* 设置为true后一旦触发TableDataComboBox的itemChange就会通过数据连接更换当前数据字典的列名List
* @param needTableDataChange
*/
public void setNeedTableDataChange(boolean needTableDataChange) {
this.needTableDataChange = needTableDataChange;
}
public static void main(String[] args) {
JFrame jf = new JFrame("test");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
@ -80,11 +93,9 @@ public class TableDataDictPane extends FurtherBasicBeanPane<TableDataDictionary>
private void initBasicComponets() {
tableDataNameComboBox = new TableDataComboBox(DesignTableDataManager.getEditingTableDataSource());
tableDataNameComboBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
tdChange(e);
}
tableDataNameComboBox.addItemListener(e -> {
if (e.getStateChange() == ItemEvent.SELECTED) {
tdChange(e);
}
});
// keyColumnPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()});
@ -158,39 +169,58 @@ public class TableDataDictPane extends FurtherBasicBeanPane<TableDataDictionary>
if (tableDataWrappe == null) {
return;
}
List<String> namelist = tableDataWrappe.calculateColumnNameList();
String[] columnNames = null;
if (!namelist.isEmpty()) {
columnNames = namelist.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
} else {
columnNames = new String[]{""};
if (itemListener != null) {
itemListener.itemStateChanged(e);
localFormulaEditor.addChangeListener(event -> itemListener.itemStateChanged(e));
}
if (isNeedTableDataChange()) {
changeColumnsName();
}
ColumnNameEditor columnNameEditor1 = new ColumnNameEditor(columnNames);
columnNameEditor1.addItemListener(itemListener);
ColumnIndexEditor columnIndexEditor1 = new ColumnIndexEditor(columnNames.length);
columnIndexEditor1.addItemListener(itemListener);
keyColumnPane.setEditors(new Editor[]{columnNameEditor1, columnIndexEditor1}, columnNames[0]);
}
FormulaEditor formulaEditor = new FormulaEditor(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parameter_Formula"));
formulaEditor.setEnabled(true);
formulaEditor.addChangeListener(new ChangeListener() {
private void changeColumnsName() {
TableDataWrapper tableDataWrappe = this.tableDataNameComboBox.getSelectedItem();
SwingWorker<List<String>, Object> worker = new SwingWorker<List<String>, Object>() {
@Override
protected List<String> doInBackground() {
if (tableDataWrappe == null) {
return new ArrayList<>();
}
return tableDataWrappe.calculateColumnNameList();
}
@Override
public void stateChanged(ChangeEvent ee) {
if (itemListener != null) {
itemListener.itemStateChanged(e);
protected void done() {
try {
List<String> namelist = get();
String[] columnNames = null;
if (!namelist.isEmpty()) {
columnNames = namelist.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
} else {
columnNames = new String[]{StringUtils.EMPTY};
}
// 实际值列名
ColumnNameEditor actualColumnNameEditor = new ColumnNameEditor(columnNames);
actualColumnNameEditor.addItemListener(itemListener);
// 实际值列序号
ColumnIndexEditor actualColumnIndexEditor = new ColumnIndexEditor(columnNames.length);
actualColumnIndexEditor.addItemListener(itemListener);
keyColumnPane.setEditors(new Editor[]{actualColumnNameEditor, actualColumnIndexEditor}, columnNames[0]);
localFormulaEditor.setEnabled(true);
// 显示值列名
ColumnNameEditor displayColumnNameEditor = new ColumnNameEditor(columnNames);
displayColumnNameEditor.addItemListener(itemListener);
// 显示值列序号
ColumnIndexEditor displayColumnIndexEditor = new ColumnIndexEditor(columnNames.length);
displayColumnIndexEditor.addItemListener(itemListener);
valueDictPane.setEditors(new Editor[]{displayColumnNameEditor, displayColumnIndexEditor, localFormulaEditor}, columnNames[0]);
} catch (InterruptedException | ExecutionException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
});
ColumnNameEditor columnNameEditor2 = new ColumnNameEditor(columnNames);
columnNameEditor2.addItemListener(itemListener);
ColumnIndexEditor columnIndexEditor2 = new ColumnIndexEditor(columnNames.length);
columnIndexEditor2.addItemListener(itemListener);
valueDictPane.setEditors(new Editor[]{columnNameEditor2, columnIndexEditor2, formulaEditor}, columnNames[0]);
if (itemListener != null) {
itemListener.itemStateChanged(e);
}
};
worker.execute();
}
@Override
@ -374,4 +404,8 @@ public class TableDataDictPane extends FurtherBasicBeanPane<TableDataDictionary>
public void registerDSChangeListener() {
tableDataNameComboBox.registerGlobalDSChangeListener();
}
public boolean isNeedTableDataChange() {
return needTableDataChange;
}
}

2
designer-base/src/main/java/com/fr/design/widget/component/NumberEditorValidatePane.java

@ -150,6 +150,7 @@ public class NumberEditorValidatePane extends JPanel {
setMaxListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
errorMsgTextFieldPane.setVisible(setMaxValueCheckBox.isSelected() || setMinValueCheckBox.isSelected());
if (setMaxValueCheckBox.isSelected()) {
maxValueSpinner.setEnabled(true);
Double value = (double) 0;
@ -171,6 +172,7 @@ public class NumberEditorValidatePane extends JPanel {
setMinListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
errorMsgTextFieldPane.setVisible(setMaxValueCheckBox.isSelected() || setMinValueCheckBox.isSelected());
if (setMinValueCheckBox.isSelected()) {
minValueSpinner.setEnabled(true);
Double value = (double) 0;

1736
designer-base/src/main/java/com/fr/design/write/submit/DBManipulationPane.java

File diff suppressed because it is too large Load Diff

108
designer-base/src/main/java/com/fr/env/PluginErrorRemindDialog.java vendored

@ -0,0 +1,108 @@
package com.fr.env;
import com.fr.design.actions.server.PluginManagerAction;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.FRFont;
import com.fr.general.GeneralContext;
import com.fr.general.IOUtils;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Locale;
/**
* 插件启动失败提示窗
*/
public class PluginErrorRemindDialog extends JDialog implements ActionListener {
public PluginErrorRemindDialog(Frame parent, String areaText) {
super(parent, true);
//上面的标签面板
JPanel topPanel = FRGUIPaneFactory.createBorderLayout_L_Pane();
JPanel imagePanel = new JPanel();
Icon icon = IOUtils.readIcon("com/fr/design/images/warnings/warning5.png");
JLabel imageLabel = new JLabel();
imageLabel.setIcon(icon);
imagePanel.add(imageLabel);
imagePanel.setPreferredSize(new Dimension(130, 100));
JPanel verticalPanel = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true);
JLabel label = new JLabel(Toolkit.i18nText("Fine-Design_Plugin_Error_Remind_Title"));
label.setFont(FRFont.getInstance().applySize(18).applyStyle(1));
label.setPreferredSize(new Dimension(650, 100));
verticalPanel.add(label);
topPanel.add(imagePanel, BorderLayout.WEST);
topPanel.add(verticalPanel, BorderLayout.CENTER);
topPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10));
//中间的文本域面板
JPanel centerPanel = FRGUIPaneFactory.createBorderLayout_L_Pane();
centerPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
centerPanel.setPreferredSize(new Dimension(480, 320));
JTextArea checkArea = new JTextArea(areaText);
checkArea.setEnabled(false);
centerPanel.add(checkArea, BorderLayout.CENTER);
UIButton cancelButton = new UIButton(Toolkit.i18nText("Fine-Design_Plugin_Error_Remind_Not_Deal_With"));
UIButton okButton = new UIButton(Toolkit.i18nText("Fine-Design_Plugin_Error_Remind_Deal_With"));
cancelButton.addActionListener(this);
okButton.addActionListener(new PluginManagerActionAdapter(this));
// 按钮
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
buttonPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
buttonPanel.add(cancelButton);
buttonPanel.add(okButton);
this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"));
this.setResizable(false);
this.add(topPanel, BorderLayout.NORTH);
this.add(centerPanel, BorderLayout.CENTER);
this.add(buttonPanel, BorderLayout.SOUTH);
this.setSize(new Dimension(GeneralContext.getLocale().equals(Locale.US) ? 750 : 600, 500));
GUICoreUtils.centerWindow(this);
}
@Override
public void actionPerformed(ActionEvent e) {
this.dispose();
}
private static class PluginManagerActionAdapter extends PluginManagerAction {
private JDialog jDialog;
public PluginManagerActionAdapter(JDialog jDialog) {
this.jDialog = jDialog;
}
@Override
public void actionPerformed(ActionEvent e) {
this.jDialog.dispose();
super.actionPerformed(e);
}
}
}

18
designer-base/src/main/java/com/fr/file/FileNodeFILE.java

@ -2,6 +2,7 @@ package com.fr.file;
import com.fr.base.BaseUtils;
import com.fr.base.FRContext;
import com.fr.design.file.TemplateResourceManager;
import com.fr.io.FineEncryptUtils;
import com.fr.base.io.XMLEncryptUtils;
import com.fr.design.file.NodeAuthProcessor;
@ -22,10 +23,8 @@ import com.fr.workspace.WorkContext;
import com.fr.workspace.Workspace;
import com.fr.workspace.WorkspaceEvent;
import com.fr.workspace.resource.WorkResourceTempRenameStream;
import com.fr.workspace.server.lock.TplOperator;
import javax.swing.*;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
@ -324,7 +323,7 @@ public class FileNodeFILE implements FILE {
}
try {
return WorkContext.getWorkResource().exist(node.getEnvPath());
return TemplateResourceManager.getResource().exist(node.getEnvPath());
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
return false;
@ -379,14 +378,11 @@ public class FileNodeFILE implements FILE {
if (!envPath.startsWith(ProjectConstants.REPORTLETS_NAME)) {
return null;
}
InputStream in = new ByteArrayInputStream(
WorkContext.getCurrent().get(TplOperator.class).readAndLockFile(
StableUtils.pathJoin(
ProjectConstants.REPORTLETS_NAME,
envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1)
)
)
);
InputStream in = TemplateResourceManager.getResource().readTemplate(
StableUtils.pathJoin(
ProjectConstants.REPORTLETS_NAME,
envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1)
));
return envPath.endsWith(".cpt") || envPath.endsWith(".frm")
? XMLEncryptUtils.decodeInputStream(EncryptUtils.decodeInputStream(FineEncryptUtils.decode(in))) : in;

62
designer-base/src/test/java/com/fr/design/EnvChangeEntranceTest.java

@ -1,10 +1,12 @@
package com.fr.design;
import com.fr.decision.webservice.v10.plugin.helper.PluginErrorRemindHandler;
import com.fr.design.env.DesignerWorkspaceInfo;
import com.fr.design.env.DesignerWorkspaceType;
import com.fr.design.env.LocalDesignerWorkspaceInfo;
import com.fr.design.env.RemoteDesignerWorkspaceInfo;
import com.fr.env.CheckServiceDialog;
import com.fr.env.PluginErrorRemindDialog;
import com.fr.invoke.Reflect;
import com.fr.workspace.connect.WorkspaceConnectionInfo;
import com.fr.workspace.engine.channel.http.FunctionalHttpRequest;
@ -16,13 +18,19 @@ import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.awt.Frame;
/**
* @author: Maksim
* @Date: Created in 2020/3/5
* @Description:
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({FunctionalHttpRequest.class,EnvChangeEntrance.class,CheckServiceDialog.class, DesignerEnvManager.class})
@PrepareForTest({FunctionalHttpRequest.class,
EnvChangeEntrance.class,
CheckServiceDialog.class,
DesignerEnvManager.class,
PluginErrorRemindHandler.class})
public class EnvChangeEntranceTest {
@Test
@ -44,17 +52,15 @@ public class EnvChangeEntranceTest {
EasyMock.expect(request.getServerBranch()).andReturn(remoteBranch);
CheckServiceDialog dialog = EasyMock.mock(CheckServiceDialog.class);
PowerMock.expectNew(CheckServiceDialog.class, EasyMock.anyObject(), EasyMock.anyObject(), EasyMock.anyObject(), EasyMock.anyObject()).andReturn(dialog);
PowerMock.expectNew(CheckServiceDialog.class, EasyMock.anyObject(Frame.class), EasyMock.anyString(), EasyMock.anyString(), EasyMock.anyString()).andReturn(dialog);
EasyMock.replay(request);
EasyMock.replay(selectedEnv);
EasyMock.replay(connectionInfo);
EasyMock.replay(request, selectedEnv, connectionInfo);
PowerMock.replayAll();
entrance.showServiceDialog(selectedEnv);
Assert.assertTrue(true);
}catch (Exception e){
Assert.assertTrue(false);
Assert.fail();
}
}
@ -94,10 +100,44 @@ public class EnvChangeEntranceTest {
DesignerWorkspaceInfo info3 = LocalDesignerWorkspaceInfo.create("name", "path");
DesignerWorkspaceInfo info4 = null;
Assert.assertFalse((boolean) Reflect.on(entrance).call("isNotRememberPwd", info1).get());
Assert.assertTrue((boolean) Reflect.on(entrance).call("isNotRememberPwd", info2).get());
Assert.assertFalse((boolean) Reflect.on(entrance).call("isNotRememberPwd", info3).get());
Assert.assertFalse((boolean) Reflect.on(entrance).call("isNotRememberPwd", info4).get());
Assert.assertFalse(Reflect.on(entrance).call("isNotRememberPwd", info1).get());
Assert.assertTrue(Reflect.on(entrance).call("isNotRememberPwd", info2).get());
Assert.assertFalse(Reflect.on(entrance).call("isNotRememberPwd", info3).get());
Assert.assertFalse(Reflect.on(entrance).call("isNotRememberPwd", info4).get());
}
@Test
public void testPluginErrorRemind() throws Exception {
try {
DesignerWorkspaceInfo selectedEnv = EasyMock.mock(DesignerWorkspaceInfo.class);
EasyMock.expect(selectedEnv.getType()).andReturn(DesignerWorkspaceType.Remote).once();
EasyMock.expect(selectedEnv.getType()).andReturn(DesignerWorkspaceType.Local).times(2);
PowerMock.mockStatic(PluginErrorRemindHandler.class);
EasyMock.expect(PluginErrorRemindHandler.pluginErrorContent()).andReturn("").once();
EasyMock.expect(PluginErrorRemindHandler.pluginErrorContent()).andReturn("111").once();
PluginErrorRemindDialog dialog = EasyMock.mock(PluginErrorRemindDialog.class);
PowerMock.expectNew(PluginErrorRemindDialog.class, EasyMock.anyObject(Frame.class), EasyMock.anyString()).andReturn(dialog).once();
dialog.setVisible(true);
EasyMock.expectLastCall();
EasyMock.replay(selectedEnv, dialog);
PowerMock.replayAll();
EnvChangeEntrance entrance = EnvChangeEntrance.getInstance();
entrance.pluginErrorRemind(selectedEnv);
entrance.pluginErrorRemind(selectedEnv);
entrance.pluginErrorRemind(selectedEnv);
EasyMock.verify(selectedEnv, dialog);
PowerMock.verifyAll();
} catch (Exception e) {
Assert.fail();
}
}
}

155
designer-base/src/test/java/com/fr/design/extra/PluginOperateUtilsTest.java

@ -0,0 +1,155 @@
package com.fr.design.extra;
import com.fr.invoke.Reflect;
import com.fr.json.JSONObject;
import com.fr.plugin.context.PluginContext;
import com.fr.plugin.context.PluginMarker;
import com.fr.plugin.context.PluginMarkerAdapter;
import com.fr.plugin.error.PluginErrorCode;
import com.fr.plugin.manage.PluginManager;
import com.fr.plugin.manage.control.PluginTask;
import com.fr.plugin.manage.control.PluginTaskResult;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.util.ArrayList;
import java.util.List;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/12/17
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({PluginManager.class, PluginUtils.class})
public class PluginOperateUtilsTest {
@Test
public void testGetSuccessInfo() {
PluginTaskResult pluginTaskResult = EasyMock.mock(PluginTaskResult.class);
PluginTaskResult pluginTaskResult1 = EasyMock.mock(PluginTaskResult.class);
PluginTaskResult pluginTaskResult2 = EasyMock.mock(PluginTaskResult.class);
List<PluginTaskResult> pluginTaskResults1 = new ArrayList<>();
pluginTaskResults1.add(pluginTaskResult1);
List<PluginTaskResult> pluginTaskResults2 = new ArrayList<>();
pluginTaskResults2.add(pluginTaskResult1);
pluginTaskResults2.add(pluginTaskResult2);
PluginMarker pluginMarker1 = PluginMarker.create("plugin-1", "1.0");
PluginMarker pluginMarker2 = PluginMarkerAdapter.create("plugin-2", "2.0", "name-2");
PluginTask pluginTask1 = PluginTask.installTask(pluginMarker1);
PluginTask pluginTask2 = PluginTask.installTask(pluginMarker2);
EasyMock.expect(pluginTaskResult.asList()).andReturn(pluginTaskResults1).times(2);
EasyMock.expect(pluginTaskResult.asList()).andReturn(pluginTaskResults2).times(2);
EasyMock.expect(pluginTaskResult1.getCurrentTask()).andReturn(pluginTask1).anyTimes();
EasyMock.expect(pluginTaskResult2.getCurrentTask()).andReturn(pluginTask2).anyTimes();
EasyMock.expect(pluginTaskResult1.errorCode()).andReturn(PluginErrorCode.BelowSystem).anyTimes();
EasyMock.expect(pluginTaskResult2.errorCode()).andReturn(PluginErrorCode.BeyondSystem).anyTimes();
PluginContext plugin1 = EasyMock.mock(PluginContext.class);
PluginContext plugin2 = EasyMock.mock(PluginContext.class);
EasyMock.expect(plugin1.getName()).andReturn("context-1").anyTimes();
EasyMock.expect(plugin2.getName()).andReturn("context-2").anyTimes();
PowerMock.mockStatic(PluginManager.class);
EasyMock.expect(PluginManager.getContext(pluginMarker1.getPluginID()))
.andReturn(plugin1).once().andReturn(null).once().andReturn(plugin1).once().andReturn(null).once();
EasyMock.expect(PluginManager.getContext(pluginMarker2.getPluginID()))
.andReturn(plugin2).once().andReturn(null).once();
EasyMock.replay(pluginTaskResult, pluginTaskResult1, pluginTaskResult2, plugin1, plugin2);
PowerMock.replayAll();
// 1个
Assert.assertEquals(PluginOperateUtils.getSuccessInfo(pluginTaskResult), "context-1Fine-Core_Plugin_Error_BelowSystem");
Assert.assertEquals(PluginOperateUtils.getSuccessInfo(pluginTaskResult), "plugin-1Fine-Core_Plugin_Error_BelowSystem");
// 2个
Assert.assertEquals(PluginOperateUtils.getSuccessInfo(pluginTaskResult), "context-1Fine-Core_Plugin_Error_BelowSystem\ncontext-2Fine-Core_Plugin_Error_BeyondSystem");
Assert.assertEquals(PluginOperateUtils.getSuccessInfo(pluginTaskResult), "plugin-1Fine-Core_Plugin_Error_BelowSystem\nname-2Fine-Core_Plugin_Error_BeyondSystem");
EasyMock.verify(pluginTaskResult, pluginTaskResult1, pluginTaskResult2, plugin1, plugin2);
PowerMock.verifyAll();
}
@Test
public void testGetPluginName() {
PluginContext pluginContext = EasyMock.mock(PluginContext.class);
EasyMock.expect(pluginContext.getName()).andReturn("pluginContext").once();
PluginMarker pluginMarker1 = PluginMarker.create("id-1", "1");
PluginMarker pluginMarker2 = PluginMarkerAdapter.create("id-2", "2", "name-2");
EasyMock.replay(pluginContext);
Assert.assertEquals(Reflect.on(PluginOperateUtils.class).call("getPluginName", null, null).get(), "");
Assert.assertEquals(Reflect.on(PluginOperateUtils.class).call("getPluginName", pluginContext, pluginMarker1).get(), "pluginContext");
Assert.assertEquals(Reflect.on(PluginOperateUtils.class).call("getPluginName", null, pluginMarker1).get(), "id-1");
Assert.assertEquals(Reflect.on(PluginOperateUtils.class).call("getPluginName", null, pluginMarker2).get(), "name-2");
EasyMock.verify(pluginContext);
}
@Test
public void testUpdateMarker2Online() {
try {
PluginMarker pluginMarker = PluginMarker.create("plugin-1", "1.0");
String pluginJson = "{\"id\": plugin-1,\"name\": \"图表(新特性)\",\"version\": \"8.6.16\"}";
JSONObject object = new JSONObject(pluginJson);
PowerMock.mockStatic(PluginUtils.class);
EasyMock.expect(PluginUtils.getLatestPluginInfo("plugin-1")).andReturn(object).once();
EasyMock.expect(PluginUtils.getLatestPluginInfo("plugin-1")).andThrow(new NullPointerException()).once();
PowerMock.replayAll();
PluginMarker marker1 = PluginOperateUtils.updateMarker2Online(pluginMarker);
PluginMarker marker2 = PluginOperateUtils.updateMarker2Online(pluginMarker);
Assert.assertTrue(marker1 instanceof PluginMarkerAdapter);
Assert.assertEquals(marker1.getPluginID(), "plugin-1");
Assert.assertEquals(marker1.getVersion(), "1.0");
Assert.assertEquals(((PluginMarkerAdapter) marker1).getPluginName(), "图表(新特性)");
Assert.assertEquals(marker2, pluginMarker);
PowerMock.verifyAll();
} catch (Exception e) {
Assert.fail();
}
}
@Test
public void testUpdatePluginOnline() {
try {
PluginMarker pluginMarker = PluginMarker.create("plugin-1", "1.0");
String pluginJson = "{\"id\": plugin-1,\"name\": \"图表(新特性)\",\"version\": \"8.6.16\"}";
JSONObject object = new JSONObject(pluginJson);
PowerMock.mockStatic(PluginUtils.class);
EasyMock.expect(PluginUtils.getLatestPluginInfo("plugin-1")).andReturn(object).once();
EasyMock.expect(PluginUtils.getInstalledPluginMarkerByID("plugin-1")).andReturn(pluginMarker).once();
PowerMock.replayAll();
PluginOperateUtils.updatePluginOnline(pluginMarker, null);
PowerMock.verifyAll();
} catch (Exception e) {
Assert.fail();
}
}
}

23
designer-base/src/test/java/com/fr/design/extra/PluginUtilsTest.java

@ -0,0 +1,23 @@
package com.fr.design.extra;
import com.fr.invoke.Reflect;
import org.junit.Assert;
import org.junit.Test;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/12/18
*/
public class PluginUtilsTest {
@Test
public void testIsCompatibleCurrentEnv() {
Assert.assertFalse(Reflect.on(PluginUtils.class).call("isCompatibleCurrentEnv", "~9.0").get());
Assert.assertTrue(Reflect.on(PluginUtils.class).call("isCompatibleCurrentEnv", "9.0").get());
Assert.assertTrue(Reflect.on(PluginUtils.class).call("isCompatibleCurrentEnv", "9~").get());
Assert.assertTrue(Reflect.on(PluginUtils.class).call("isCompatibleCurrentEnv", "10").get());
Assert.assertFalse(Reflect.on(PluginUtils.class).call("isCompatibleCurrentEnv", "11").get());
}
}

4
designer-chart/src/main/java/com/fr/design/chartx/data/drillMap/DrillMapLayerPane.java

@ -14,7 +14,7 @@ import com.fr.plugin.chart.type.MapType;
import com.fr.plugin.chart.type.ZoomLevel;
import com.fr.van.chart.designer.TableLayout4VanChartHelper;
import com.fr.van.chart.drillmap.designer.data.comp.MapDataTree;
import com.fr.van.chart.map.designer.type.VanChartMapSourceChoosePane;
import com.fr.van.chart.map.designer.type.MapStatusPane;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
@ -154,7 +154,7 @@ public class DrillMapLayerPane extends BasicBeanPane<VanChartDrillMapPlot> {
rowSize[i + 1] = p;
int d = i + 1;
UILabel label = new UILabel(String.format("%s%d%s", Toolkit.i18nText("Fine-Design_Chart_Index_Article"), d, Toolkit.i18nText("Fine-Design_Chart_Index_Layer")));
UIComboBox level = new UIComboBox(VanChartMapSourceChoosePane.ZOOM_LEVELS);
UIComboBox level = new UIComboBox(MapStatusPane.ZOOM_LEVELS);
level.setEnabled(i != 0);
UIComboBox type = new UIComboBox(items);
detailComps[i + 1] = new Component[]{label, level, type};

6
designer-chart/src/main/java/com/fr/extended/chart/UIComboBoxWithNone.java

@ -23,7 +23,11 @@ public class UIComboBoxWithNone extends UIComboBox {
}
protected void setDefaultSelectedItem() {
setSelectedItem(StringUtils.EMPTY);
// JComboBox.setSelectedItem(o)
// if(o!=null)寻找o对应的下拉选项 如果找不到 还是选中之前选中的
// 所以空字符串 不是选中空 是选中上次选中的
// 所以这边 可以写setSelectedItem(null) or setSelectedIndex(-1)
setSelectedIndex(-1);
}
@Override

3
designer-chart/src/main/java/com/fr/van/chart/designer/PlotFactory.java

@ -35,6 +35,7 @@ import com.fr.van.chart.designer.style.VanChartRangeLegendPane;
import com.fr.van.chart.designer.style.VanChartStylePane;
import com.fr.van.chart.designer.style.VanLegendPaneWidthOutHighlight;
import com.fr.van.chart.designer.style.label.VanChartGaugePlotLabelPane;
import com.fr.van.chart.designer.style.label.VanChartPiePlotLabelPane;
import com.fr.van.chart.designer.style.label.VanChartPlotLabelDetailPane;
import com.fr.van.chart.designer.style.label.VanChartPlotLabelPane;
import com.fr.van.chart.designer.style.tooltip.VanChartPlotRefreshTooltipPane;
@ -209,6 +210,8 @@ public class PlotFactory {
public static VanChartPlotLabelPane createPlotLabelPane(Plot plot, VanChartStylePane stylePane, boolean inCondition) {
if (plot instanceof VanChartGaugePlot) {
return new VanChartGaugePlotLabelPane(plot, stylePane);
} else if (plot instanceof PiePlot4VanChart) {
return new VanChartPiePlotLabelPane(plot, stylePane, inCondition);
}
return new VanChartPlotLabelPane(plot, stylePane, inCondition);
}

6
designer-chart/src/main/java/com/fr/van/chart/designer/component/border/VanChartBorderWithShapePane.java

@ -46,6 +46,10 @@ public class VanChartBorderWithShapePane extends BasicPane {
createBorderPane();
}
public LineComboBox getLineTypeBox() {
return lineTypeBox;
}
private void initComponents() {
lineTypeBox = new LineComboBox(CoreConstants.STRIKE_LINE_STYLE_ARRAY_4_CHART);
lineColorButton = new UIButtonGroup<>(new String[]{
@ -106,7 +110,7 @@ public class VanChartBorderWithShapePane extends BasicPane {
borderRadius.setEnabled(borderShape.getSelectedIndex() == RECTANGULAR_INDEX || borderShape.getSelectedIndex() == DIALOG_INDEX);
}
private JPanel createLineTypePane() {
protected JPanel createLineTypePane() {
double p = TableLayout.PREFERRED;
double f = TableLayout.FILL;
double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH;

23
designer-chart/src/main/java/com/fr/van/chart/designer/component/format/SummaryValueFormatPaneWithCheckBox.java

@ -0,0 +1,23 @@
package com.fr.van.chart.designer.component.format;
import com.fr.design.i18n.Toolkit;
import com.fr.van.chart.designer.style.VanChartStylePane;
import javax.swing.JPanel;
/**
* @author Bjorn
* @version 10.0
* Created by Bjorn on 2020-12-10
*/
public class SummaryValueFormatPaneWithCheckBox extends VanChartFormatPaneWithCheckBox {
public SummaryValueFormatPaneWithCheckBox(VanChartStylePane parent, JPanel showOnPane) {
super(parent, showOnPane);
}
@Override
protected String getCheckBoxText() {
return Toolkit.i18nText("Fine-Design_Chart_Use_Summary_Value");
}
}

23
designer-chart/src/main/java/com/fr/van/chart/designer/component/format/SummaryValueFormatPaneWithoutCheckBox.java

@ -0,0 +1,23 @@
package com.fr.van.chart.designer.component.format;
import com.fr.design.i18n.Toolkit;
import com.fr.van.chart.designer.style.VanChartStylePane;
import javax.swing.JPanel;
/**
* @author Bjorn
* @version 10.0
* Created by Bjorn on 2020-12-10
*/
public class SummaryValueFormatPaneWithoutCheckBox extends VanChartFormatPaneWithoutCheckBox {
public SummaryValueFormatPaneWithoutCheckBox(VanChartStylePane parent, JPanel showOnPane) {
super(parent, showOnPane);
}
protected String getCheckBoxText() {
return Toolkit.i18nText("Fine-Design_Chart_Use_Summary_Value");
}
}

1
designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/gauge/VanChartGaugeDetailAxisPane.java

@ -176,6 +176,7 @@ public class VanChartGaugeDetailAxisPane extends VanChartValueAxisPane {
gaugeStyle = gaugePlot.getGaugeStyle();
reLayoutPane(false);
parent.initAllListeners();
setParentPane(parent);
}
populateBean(gaugePlot.getGaugeAxis());
}

64
designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPieCategoryLabelDetailPane.java

@ -0,0 +1,64 @@
package com.fr.van.chart.designer.style.label;
import com.fr.chart.chartattr.Plot;
import com.fr.design.gui.ibutton.UIButtonGroup;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.stable.Constants;
import com.fr.van.chart.designer.TableLayout4VanChartHelper;
import com.fr.van.chart.designer.style.VanChartStylePane;
import com.fr.van.chart.pie.style.VanChartPieCategoryLabelContentPane;
import javax.swing.JPanel;
import java.awt.Component;
/**
* @author Bjorn
* @version 10.0
* Created by Bjorn on 2020-12-09
*/
public class VanChartPieCategoryLabelDetailPane extends VanChartPlotLabelDetailPane {
public VanChartPieCategoryLabelDetailPane(Plot plot, VanChartStylePane parent, boolean inCondition) {
super(plot, parent, inCondition);
}
protected void initToolTipContentPane(Plot plot) {
setDataLabelContentPane(new VanChartPieCategoryLabelContentPane(getParentPane(), this, isInCondition()));
}
protected JPanel createLabelPositionPane(String title, Plot plot) {
String[] positionName = new String[]{
Toolkit.i18nText("Fine-Design_Chart_Axis_Bottom"),
Toolkit.i18nText("Fine-Design_Form_Center"),
Toolkit.i18nText("Fine-Design_Chart_Axis_Top")
};
Integer[] positionValue = new Integer[]{Constants.BOTTOM, Constants.CENTER, Constants.TOP};
UIButtonGroup<Integer> position = new UIButtonGroup<>(positionName, positionValue);
setPosition(position);
double p = TableLayout.PREFERRED;
double f = TableLayout.FILL;
double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH;
double[] row = {p, p};
double[] col = {f, e};
Component[][] components = new Component[][]{
new Component[]{null, null},
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Layout_Position")), position},
};
return TableLayoutHelper.createTableLayoutPane(components, row, col);
}
protected void checkPositionPane(String title) {
}
protected JPanel createBorderAndBackgroundPane() {
return null;
}
}

61
designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPiePlotLabelPane.java

@ -0,0 +1,61 @@
package com.fr.van.chart.designer.style.label;
import com.fr.chart.chartattr.Plot;
import com.fr.design.i18n.Toolkit;
import com.fr.plugin.chart.attr.plot.VanChartPlot;
import com.fr.plugin.chart.base.AttrLabel;
import com.fr.plugin.chart.base.AttrLabelDetail;
import com.fr.van.chart.designer.TableLayout4VanChartHelper;
import com.fr.van.chart.designer.style.VanChartStylePane;
import javax.swing.JPanel;
import java.awt.BorderLayout;
/**
* @author Bjorn
* @version 10.0
* Created by Bjorn on 2020-12-09
*/
public class VanChartPiePlotLabelPane extends VanChartPlotLabelPane {
private VanChartPlotLabelDetailPane pieCategoryLabelPane;
public VanChartPiePlotLabelPane(Plot plot, VanChartStylePane parent, boolean inCondition) {
super(plot, parent, inCondition);
}
protected void createLabelPane() {
setLabelPane(new JPanel(new BorderLayout(0, 4)));
setLabelDetailPane(new VanChartPieValueLabelDetailPane(getPlot(), getParentPane(), isInCondition()));
JPanel valuePane = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Value_Label"), getLabelDetailPane());
getLabelPane().add(valuePane, BorderLayout.NORTH);
if (!isInCondition()) {
pieCategoryLabelPane = new VanChartPieCategoryLabelDetailPane(getPlot(), getParentPane(), isInCondition());
JPanel categoryPane = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Category_Label"), pieCategoryLabelPane);
getLabelPane().add(categoryPane, BorderLayout.CENTER);
}
}
public void populate(AttrLabel attrLabel) {
if (attrLabel == null) {
attrLabel = ((VanChartPlot) this.getPlot()).getDefaultAttrLabel();
}
super.populate(attrLabel);
if (pieCategoryLabelPane != null) {
AttrLabelDetail labelDetail = attrLabel.getSecondLabelDetail();
pieCategoryLabelPane.populate(labelDetail);
}
}
public AttrLabel update() {
AttrLabel attrLabel = super.update();
if (pieCategoryLabelPane != null) {
AttrLabelDetail labelDetail = attrLabel.getSecondLabelDetail();
pieCategoryLabelPane.update(labelDetail);
} else {
attrLabel.setSecondLabelDetail(null);
}
return attrLabel;
}
}

72
designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPieValueLabelDetailPane.java

@ -0,0 +1,72 @@
package com.fr.van.chart.designer.style.label;
import com.fr.chart.chartattr.Plot;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.TableLayout;
import com.fr.design.utils.gui.UIComponentUtils;
import com.fr.design.widget.FRWidgetFactory;
import com.fr.van.chart.designer.TableLayout4VanChartHelper;
import com.fr.van.chart.designer.component.background.VanChartBackgroundWithOutImagePane;
import com.fr.van.chart.designer.component.border.VanChartBorderWithShapePane;
import com.fr.van.chart.designer.style.VanChartStylePane;
import com.fr.van.chart.pie.style.VanChartPieValueLabelContentPane;
import javax.swing.JPanel;
import java.awt.Component;
/**
* @author Bjorn
* @version 10.0
* Created by Bjorn on 2020-12-09
*/
public class VanChartPieValueLabelDetailPane extends VanChartPlotLabelDetailPane {
public VanChartPieValueLabelDetailPane(Plot plot, VanChartStylePane parent, boolean inCondition) {
super(plot, parent, inCondition);
}
protected void initToolTipContentPane(Plot plot) {
setDataLabelContentPane(new VanChartPieValueLabelContentPane(getParentPane(), this, isInCondition()));
}
protected JPanel getLabelLayoutPane(JPanel panel, String title) {
return panel;
}
protected JPanel createLabelBorderPane() {
VanChartBorderWithShapePane borderPane = new VanChartBorderWithShapePane() {
@Override
protected JPanel createLineTypePane() {
double p = TableLayout.PREFERRED;
double f = TableLayout.FILL;
double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH;
double[] columnSize = {f, e};
double[] rowSize = {p};
Component[][] components = new Component[][]{
new Component[]{FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Chart_Border")),
UIComponentUtils.wrapWithBorderLayoutPane(getLineTypeBox())}};
return TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize);
}
};
setBorderPane(borderPane);
return borderPane;
}
protected JPanel createLabelBackgroundPane() {
VanChartBackgroundWithOutImagePane backgroundPane = new VanChartBackgroundWithOutImagePane() {
protected Component[][] getPaneComponents() {
return new Component[][]{
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Utils_Background")), typeComboBox},
new Component[]{null, centerPane},
new Component[]{getTransparentLabel(), transparent},
};
}
};
setBackgroundPane(backgroundPane);
return backgroundPane;
}
}

28
designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java

@ -83,6 +83,19 @@ public class VanChartPlotLabelDetailPane extends BasicPane {
return parent;
}
public void setPosition(UIButtonGroup<Integer> position) {
this.position = position;
}
public void setBorderPane(VanChartBorderWithShapePane borderPane) {
this.borderPane = borderPane;
}
public void setBackgroundPane(VanChartBackgroundWithOutImagePane backgroundPane) {
this.backgroundPane = backgroundPane;
}
protected void initLabelDetailPane(Plot plot) {
this.setLayout(new BorderLayout());
initToolTipContentPane(plot);
@ -122,8 +135,7 @@ public class VanChartPlotLabelDetailPane extends BasicPane {
return new Component[][]{
new Component[]{dataLabelContentPane, null},
new Component[]{createLabelPositionPane(Toolkit.i18nText("Fine-Design_Chart_Layout_Position"), plot), null},
new Component[]{createLabelBorderPane(), null},
new Component[]{createLabelBackgroundPane(), null}
new Component[]{createBorderAndBackgroundPane(), null},
};
}
@ -138,14 +150,22 @@ public class VanChartPlotLabelDetailPane extends BasicPane {
};
}
private JPanel createLabelBorderPane() {
protected JPanel createBorderAndBackgroundPane() {
JPanel jPanel = new JPanel();
jPanel.setLayout(new BorderLayout(0, 5));
jPanel.add(createLabelBorderPane(), BorderLayout.NORTH);
jPanel.add(createLabelBackgroundPane(), BorderLayout.CENTER);
return jPanel;
}
protected JPanel createLabelBorderPane() {
borderPane = new VanChartBorderWithShapePane();
borderPaneWithTitle = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Border"), borderPane);
return borderPaneWithTitle;
}
private JPanel createLabelBackgroundPane() {
protected JPanel createLabelBackgroundPane() {
backgroundPane = new VanChartBackgroundWithOutImagePane() {
protected Component[][] getPaneComponents() {

4
designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelPane.java

@ -44,6 +44,10 @@ public class VanChartPlotLabelPane extends BasicPane {
addComponents();
}
public boolean isInCondition() {
return inCondition;
}
public VanChartPlotLabelDetailPane getLabelDetailPane() {
return labelDetailPane;
}

4
designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/data/comp/DrillMapLayerPane.java

@ -14,7 +14,7 @@ import com.fr.plugin.chart.map.server.CompatibleGeoJSONTreeHelper;
import com.fr.plugin.chart.type.MapType;
import com.fr.plugin.chart.type.ZoomLevel;
import com.fr.van.chart.designer.TableLayout4VanChartHelper;
import com.fr.van.chart.map.designer.type.VanChartMapSourceChoosePane;
import com.fr.van.chart.map.designer.type.MapStatusPane;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
@ -105,7 +105,7 @@ public class DrillMapLayerPane extends BasicScrollPane<ChartCollection> {
rowSize[i + 1] = p;
int d = i + 1;
UILabel label = new UILabel(String.format("%s%d%s", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Index_Article"), d, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Index_Layer")));
UIComboBox level = new UIComboBox(VanChartMapSourceChoosePane.ZOOM_LEVELS);
UIComboBox level = new UIComboBox(MapStatusPane.ZOOM_LEVELS);
level.setEnabled(i != 0);
UIComboBox type = new UIComboBox(TEMP.get(oldMapType));
detailComps[i + 1] = new Component[]{label, level, type};

16
designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/type/VanChartDrillMapPlotPane.java

@ -8,11 +8,14 @@ import com.fr.plugin.chart.base.VanChartTools;
import com.fr.plugin.chart.drillmap.DrillMapIndependentVanChart;
import com.fr.plugin.chart.drillmap.VanChartDrillMapPlot;
import com.fr.plugin.chart.drillmap.data.DrillMapDefinition;
import com.fr.plugin.chart.map.designer.type.GEOJSONTreeHelper;
import com.fr.plugin.chart.type.MapType;
import com.fr.plugin.chart.type.ZoomLevel;
import com.fr.van.chart.map.designer.type.GeoUrlPane;
import com.fr.van.chart.map.designer.type.VanChartMapPlotPane;
import com.fr.van.chart.map.designer.type.VanChartMapSourceChoosePane;
import javax.swing.tree.TreeNode;
import java.util.ArrayList;
/**
@ -30,10 +33,15 @@ public class VanChartDrillMapPlotPane extends VanChartMapPlotPane {
@Override
protected VanChartMapSourceChoosePane createSourceChoosePane() {
return new VanChartMapSourceChoosePane(){
return new VanChartMapSourceChoosePane() {
@Override
protected boolean supportParam(){
return false;
protected void initGeoUrlPane() {
setGeoUrlPane(new GeoUrlPane() {
@Override
protected TreeNode getRootNode() {
return GEOJSONTreeHelper.getInstance().getRootNodeWithoutPara();
}
});
}
};
}
@ -59,7 +67,7 @@ public class VanChartDrillMapPlotPane extends VanChartMapPlotPane {
protected void resetAttr(Plot plot) {
super.resetAttr(plot);
if(plot instanceof VanChartDrillMapPlot) {
if (plot instanceof VanChartDrillMapPlot) {
resetLayerTypeAndZoomLevel((VanChartDrillMapPlot) plot);
}
}

15
designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapSourceChoosePane.java

@ -1,15 +0,0 @@
package com.fr.van.chart.heatmap.designer.type;
import com.fr.design.gui.ilable.UILabel;
import com.fr.van.chart.map.designer.type.VanChartMapSourceChoosePane;
/**
* Created by Mitisky on 16/10/20.
*/
public class VanChartHeatMapSourceChoosePane extends VanChartMapSourceChoosePane {
@Override
protected UILabel createSourceTitleLabel() {
return new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Map_Area_And_Point"));
}
}

24
designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java

@ -3,6 +3,8 @@ package com.fr.van.chart.heatmap.designer.type;
import com.fr.chart.chartattr.Chart;
import com.fr.chart.chartattr.Plot;
import com.fr.chartx.data.ChartDataDefinitionProvider;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.i18n.Toolkit;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.chart.attr.plot.VanChartPlot;
@ -11,6 +13,7 @@ import com.fr.plugin.chart.heatmap.HeatMapIndependentVanChart;
import com.fr.plugin.chart.heatmap.VanChartHeatMapPlot;
import com.fr.plugin.chart.map.server.CompatibleGEOJSONHelper;
import com.fr.plugin.chart.vanchart.VanChart;
import com.fr.van.chart.map.designer.type.GeoUrlPane;
import com.fr.van.chart.map.designer.type.VanChartMapPlotPane;
import com.fr.van.chart.map.designer.type.VanChartMapSourceChoosePane;
@ -27,18 +30,27 @@ public class VanChartHeatMapTypePane extends VanChartMapPlotPane {
@Override
protected VanChartMapSourceChoosePane createSourceChoosePane() {
return new VanChartHeatMapSourceChoosePane();
return new VanChartMapSourceChoosePane() {
@Override
protected void initGeoUrlPane() {
setGeoUrlPane(new GeoUrlPane() {
@Override
protected UILabel createSourceTitleLabel() {
return new UILabel(Toolkit.i18nText("Fine-Design_Chart_Map_Area_And_Point"));
}
});
}
};
}
//适用一种图表只有一种类型的
public void populateBean(VanChart chart) {
typeDemo.get(0).isPressing = true;
VanChartHeatMapPlot plot = (VanChartHeatMapPlot)chart.getPlot();
VanChartHeatMapPlot plot = (VanChartHeatMapPlot) chart.getPlot();
populateSourcePane(plot);
boolean enabled = !CompatibleGEOJSONHelper.isDeprecated(plot.getGeoUrl());
GUICoreUtils.setEnabled(this.getTypePane(), enabled);
GUICoreUtils.setEnabled(this.getSourceChoosePane().getSourceComboBox(), enabled);
checkDemosBackground();
}
@ -53,13 +65,13 @@ public class VanChartHeatMapTypePane extends VanChartMapPlotPane {
return tools;
}
protected Plot getSelectedClonedPlot(){
protected Plot getSelectedClonedPlot() {
Chart chart = getDefaultChart();
VanChartHeatMapPlot newPlot = (VanChartHeatMapPlot)chart.getPlot();
VanChartHeatMapPlot newPlot = (VanChartHeatMapPlot) chart.getPlot();
Plot cloned = null;
try {
cloned = (Plot)newPlot.clone();
cloned = (Plot) newPlot.clone();
} catch (CloneNotSupportedException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}

170
designer-chart/src/main/java/com/fr/van/chart/map/VanChartMapSeriesPane.java

@ -37,6 +37,7 @@ import com.fr.van.chart.designer.component.marker.VanChartImageMarkerPane;
import com.fr.van.chart.designer.other.VanChartInteractivePane;
import com.fr.van.chart.designer.style.series.VanChartColorValueSeriesPane;
import com.fr.van.chart.designer.style.series.VanChartEffectPane;
import com.fr.van.chart.map.designer.style.series.VanChartMapAnchorMarkerPane;
import com.fr.van.chart.map.designer.style.series.VanChartMapScatterMarkerPane;
import com.fr.van.chart.map.line.VanChartCurvePane;
import com.fr.van.chart.map.line.VanChartLineMapEffectPane;
@ -61,16 +62,24 @@ import java.awt.event.ItemListener;
* 地图-系列界面
*/
public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
private static final String AREA_STRING = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Region");
private static final String POINT_STRING = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Point");
private static final String LINE_STRING = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Flow");
private static final String AREA_STRING = Toolkit.i18nText("Fine-Design_Chart_Region");
private static final String POINT_STRING = Toolkit.i18nText("Fine-Design_Chart_Point");
private static final String LINE_STRING = Toolkit.i18nText("Fine-Design_Chart_Flow");
private static final String[] MARKER_TYPES = new String[]{MapMarkerType.DEFAULT.toLocalString(),
private static final String[] MARKER_TYPES = new String[]{MapMarkerType.ANCHOR.toLocalString(),
MapMarkerType.COMMON.toLocalString(), MapMarkerType.BUBBLE.toLocalString(), MapMarkerType.IMAGE.toLocalString()};
private static final String[] LARGE_MARKER_TYPES = new String[]{MapMarkerType.DEFAULT.toLocalString(),
private static final String[] LARGE_MARKER_TYPES = new String[]{MapMarkerType.ANCHOR.toLocalString(),
MapMarkerType.COMMON.toLocalString(), MapMarkerType.BUBBLE.toLocalString()};
private static final String[] COMPATIBLE_MARKER_TYPES = new String[]{MapMarkerType.DEFAULT.toLocalString(),
MapMarkerType.ANCHOR.toLocalString(), MapMarkerType.COMMON.toLocalString(),
MapMarkerType.BUBBLE.toLocalString(), MapMarkerType.IMAGE.toLocalString()};
private static final String[] COMPATIBLE_LARGE_MARKER_TYPES = new String[]{MapMarkerType.DEFAULT.toLocalString(),
MapMarkerType.ANCHOR.toLocalString(), MapMarkerType.COMMON.toLocalString(),
MapMarkerType.BUBBLE.toLocalString()};
//custom
private UIButtonGroup<Integer> areaPointAndLineGroup;
@ -85,9 +94,15 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
//point
private UIComboBox markerTypeCom;
private VanChartMapAnchorMarkerPane anchorMarkerPane;
private VanChartMapScatterMarkerPane commonMarkerPane;
private VanChartBubblePane bubblePane;
private VanChartImageMarkerPane imageMarkerPane;
private CardLayout markerTypeLayout;
private JPanel markerContentPane;
private UINumberDragPane pointAlphaPane;
private VanChartEffectPane pointEffectPane;
@ -147,7 +162,7 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
checkLineMapLarge();
}
});
JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Large_Model"), lineMapLargeDataModelGroup);
JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Large_Model"), lineMapLargeDataModelGroup);
return createLargeDataModelPane(panel);
}
@ -162,14 +177,11 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
if (pointEffectPane != null) {
GUICoreUtils.setEnabled(pointEffectPane, !largeModel);
}
if (markerTypeCom != null) {
Object selectedItem = markerTypeCom.getSelectedItem();
markerTypeCom.setModel(new DefaultComboBoxModel(largeModel ? LARGE_MARKER_TYPES : MARKER_TYPES));
if (ComparatorUtils.equals(MapMarkerType.IMAGE.toLocalString(), selectedItem) && largeModel) {
markerTypeCom.setSelectedItem(MapMarkerType.COMMON.toLocalString());
} else {
markerTypeCom.setSelectedItem(selectedItem);
}
VanChartMapPlot mapPlot = (VanChartMapPlot) plot;
refreshMarkerComboboxModel(mapPlot);
if (largeModel) {
checkLargeModelPlotSelectedItem(mapPlot);
}
}
@ -182,6 +194,56 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
}
}
private void checkLargeModelPlotSelectedItem(VanChartMapPlot plot) {
String selected = plot.getMapMarkerType().toLocalString();
if (ComparatorUtils.equals(MapMarkerType.IMAGE.toLocalString(), selected)) {
markerTypeCom.setSelectedItem(MapMarkerType.COMMON.toLocalString());
} else {
markerTypeCom.setSelectedItem(selected);
}
}
private boolean shouldRefreshComboboxModel(VanChartMapPlot plot) {
if (markerTypeCom == null) {
return false;
}
MapMarkerType selectedType = plot.getMapMarkerType();
DefaultComboBoxModel model = (DefaultComboBoxModel) markerTypeCom.getModel();
if (selectedType == MapMarkerType.DEFAULT) {
return model.getIndexOf(MapMarkerType.DEFAULT.toLocalString()) < 0;
}
return model.getIndexOf(MapMarkerType.DEFAULT.toLocalString()) > -1;
}
private void refreshMarkerComboboxModel(VanChartMapPlot plot) {
if (largeModel(plot)) {
if (plot.getMapMarkerType() == MapMarkerType.DEFAULT) {
markerTypeCom.setModel(new DefaultComboBoxModel<>(COMPATIBLE_LARGE_MARKER_TYPES));
} else {
markerTypeCom.setModel(new DefaultComboBoxModel<>(LARGE_MARKER_TYPES));
}
} else {
if (plot.getMapMarkerType() == MapMarkerType.DEFAULT) {
markerTypeCom.setModel(new DefaultComboBoxModel<>(COMPATIBLE_MARKER_TYPES));
} else {
markerTypeCom.setModel(new DefaultComboBoxModel<>(MARKER_TYPES));
}
}
String selected = plot.getMapMarkerType().toLocalString();
markerTypeCom.setSelectedItem(selected);
if (markerTypeLayout != null && markerContentPane != null) {
markerTypeLayout.show(markerContentPane, selected);
}
}
@Override
protected JPanel getContentPane(boolean custom) {
JPanel panel = new JPanel(new BorderLayout());
@ -272,7 +334,7 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
Component[][] components = new Component[][]{
new Component[]{getColorPane(MapType.AREA)},
new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Border"), borderWithAlphaPane)},
new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Border"), borderWithAlphaPane)},
};
return TableLayoutHelper.createTableLayoutPane(components, row, col);
@ -357,28 +419,29 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
private Component createCurvePane() {
curvePane = new VanChartCurvePane();
return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Curve"), curvePane);
return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Curve"), curvePane);
}
private Component createAnimationPane() {
lineMapEffectPane = new VanChartLineMapEffectPane();
return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Animation"), lineMapEffectPane);
return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Animation"), lineMapEffectPane);
}
//不透明度
private JPanel createPointAlphaPane() {
pointAlphaPane = new UINumberDragPane(0, 100);
return TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Alpha"), pointAlphaPane);
return TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Report_Alpha"), pointAlphaPane);
}
private JPanel createPointEffectPane() {
pointEffectPane = new VanChartEffectPane();
return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Animation"), pointEffectPane);
return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Animation"), pointEffectPane);
}
private JPanel createMarkerComPane() {
markerTypeCom = new UIComboBox(MARKER_TYPES);
markerTypeCom = new UIComboBox(COMPATIBLE_MARKER_TYPES);
anchorMarkerPane = new VanChartMapAnchorMarkerPane();
commonMarkerPane = new VanChartMapScatterMarkerPane();
commonMarkerPane.setBorder(TableLayout4VanChartHelper.SECOND_EDIT_AREA_BORDER);
bubblePane = new VanChartBubblePane() {
@ -396,31 +459,34 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
};
imageMarkerPane = new VanChartImageMarkerPane();
final JPanel[] panes = new JPanel[]{new JPanel(), commonMarkerPane, bubblePane, imageMarkerPane};
final CardLayout cardLayout = new CardLayout();
final JPanel cardPane = new JPanel(cardLayout) {
final JPanel[] panes = new JPanel[]{new JPanel(), anchorMarkerPane, commonMarkerPane, bubblePane, imageMarkerPane};
markerTypeLayout = new CardLayout();
markerContentPane = new JPanel(markerTypeLayout) {
@Override
public Dimension getPreferredSize() {
return panes[markerTypeCom.getSelectedIndex()].getPreferredSize();
int index = MapMarkerType.parse((String) markerTypeCom.getSelectedItem()).ordinal();
return panes[index].getPreferredSize();
}
};
for (int i = 0, len = MARKER_TYPES.length; i < len; i++) {
cardPane.add(panes[i], MARKER_TYPES[i]);
for (int i = 0, len = COMPATIBLE_MARKER_TYPES.length; i < len; i++) {
markerContentPane.add(panes[i], COMPATIBLE_MARKER_TYPES[i]);
}
markerTypeCom.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
cardLayout.show(cardPane, MARKER_TYPES[markerTypeCom.getSelectedIndex()]);
markerTypeLayout.show(markerContentPane, (String) markerTypeCom.getSelectedItem());
}
});
JPanel northPane = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Point_Style"), markerTypeCom);
JPanel northPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Point_Style"), markerTypeCom);
JPanel markerPane = new JPanel(new BorderLayout(0, 6));
markerPane.add(northPane, BorderLayout.NORTH);
markerPane.add(cardPane, BorderLayout.CENTER);
return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Marker"), markerPane);
markerPane.add(markerContentPane, BorderLayout.CENTER);
return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Marker"), markerPane);
}
private JPanel createCustomPane(Plot plot) {
@ -500,9 +566,16 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
}
public void populateBean(Plot plot) {
if (plot != null && plot instanceof VanChartMapPlot) {
if (plot instanceof VanChartMapPlot) {
VanChartMapPlot mapPlot = (VanChartMapPlot) plot;
if (markerTypeCom != null) {
markerTypeCom.setSelectedItem(((VanChartMapPlot) plot).getMapMarkerType().toLocalString());
if (shouldRefreshComboboxModel(mapPlot)) {
refreshMarkerComboboxModel(mapPlot);
}
markerTypeCom.setSelectedItem(mapPlot.getMapMarkerType().toLocalString());
}
if (nullValueColorBox != null) {
//TODO Bjorn 地图空值背景自动
@ -513,29 +586,35 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
}
nullValueColorBox.setSelectObject(((VanChartMapPlot) plot).getNullValueColor());
checkNullValueButton();*/
nullValueColorBox.setSelectObject(((VanChartMapPlot) plot).getNullValueColor());
nullValueColorBox.setSelectObject(mapPlot.getNullValueColor());
}
//大数据模式 恢复用注释。下面3行删除。
if (lineMapLargeDataModelGroup != null) {
lineMapLargeDataModelGroup.setSelectedItem(((VanChartMapPlot) plot).getLineMapDataProcessor());
lineMapLargeDataModelGroup.setSelectedItem(mapPlot.getLineMapDataProcessor());
}
}
super.populateBean(plot);
}
public void updateBean(Plot plot) {
if (plot != null && plot instanceof VanChartMapPlot) {
if (plot instanceof VanChartMapPlot) {
VanChartMapPlot mapPlot = (VanChartMapPlot) plot;
if (markerTypeCom != null) {
((VanChartMapPlot) plot).setMapMarkerType(MapMarkerType.parseInt(markerTypeCom.getSelectedIndex()));
mapPlot.setMapMarkerType(MapMarkerType.parse((String) markerTypeCom.getSelectedItem()));
if (shouldRefreshComboboxModel(mapPlot)) {
refreshMarkerComboboxModel(mapPlot);
}
}
if (nullValueColorBox != null) {
//TODO Bjorn 地图空值背景自动
//((VanChartMapPlot) plot).setAutoNullValue(nullValueAuto.getSelectedIndex() == 0);
((VanChartMapPlot) plot).setNullValueColor(nullValueColorBox.getSelectObject());
mapPlot.setNullValueColor(nullValueColorBox.getSelectObject());
}
//大数据模式 恢复用注释。下面3行删除。
if (lineMapLargeDataModelGroup != null) {
((VanChartMapPlot) plot).setLineMapDataProcessor(lineMapLargeDataModelGroup.getSelectedItem());
mapPlot.setLineMapDataProcessor(lineMapLargeDataModelGroup.getSelectedItem());
}
}
super.updateBean(plot);
@ -587,6 +666,10 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
}
VanChartAttrMarker attrMarker = defaultAttr.getExisted(VanChartAttrMarker.class);
if (anchorMarkerPane != null) {
anchorMarkerPane.populateBean(attrMarker);
}
if (commonMarkerPane != null) {
commonMarkerPane.populateBean(attrMarker);
}
@ -669,11 +752,16 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
VanChartAttrBubble attrBubble = defaultAttr.getExisted(VanChartAttrBubble.class);
defaultAttr.remove(attrBubble);
if (markerTypeCom != null) {
if (markerTypeCom.getSelectedIndex() == 1) {
String selected = (String) markerTypeCom.getSelectedItem();
MapMarkerType markerType = MapMarkerType.parse(selected);
if (markerType == MapMarkerType.ANCHOR) {
defaultAttr.addDataSeriesCondition(anchorMarkerPane.updateBean());
} else if (markerType == MapMarkerType.COMMON) {
defaultAttr.addDataSeriesCondition(commonMarkerPane.updateBean());
} else if (markerTypeCom.getSelectedIndex() == 2) {
} else if (markerType == MapMarkerType.BUBBLE) {
defaultAttr.addDataSeriesCondition(bubblePane.updateBean());
} else if (markerTypeCom.getSelectedIndex() == 3) {
} else if (markerType == MapMarkerType.IMAGE) {
defaultAttr.addDataSeriesCondition(imageMarkerPane.updateBean());
}
}

3
designer-chart/src/main/java/com/fr/van/chart/map/designer/other/VanChartMapConditionAttrContentPane.java

@ -9,6 +9,7 @@ import com.fr.plugin.chart.type.MapType;
import com.fr.van.chart.designer.other.VanChartConditionAttrContentPane;
import com.fr.van.chart.map.designer.VanMapAreaAndPointGroupPane;
import com.fr.van.chart.map.designer.VanMapAreaPointAndLineGroupPane;
import com.fr.van.chart.map.designer.other.condition.pane.VanChartAnchorPointMapConditionPane;
import com.fr.van.chart.map.designer.other.condition.pane.VanChartBubblePointMapConditionPane;
import com.fr.van.chart.map.designer.other.condition.pane.VanChartCommonPointMapConditionPane;
import com.fr.van.chart.map.designer.other.condition.pane.VanChartDefaultPointMapConditionPane;
@ -99,6 +100,8 @@ public class VanChartMapConditionAttrContentPane extends VanChartConditionAttrCo
private Class<? extends ConditionAttributesPane> getPointMapConditionClassPane(VanChartMapPlot plot) {
MapMarkerType mapMarkerType = plot.getMapMarkerType();
switch (mapMarkerType){
case ANCHOR:
return VanChartAnchorPointMapConditionPane.class;
case COMMON:
return VanChartCommonPointMapConditionPane.class;
case BUBBLE:

42
designer-chart/src/main/java/com/fr/van/chart/map/designer/other/condition/item/VanChartAnchorMarkerConditionPane.java

@ -0,0 +1,42 @@
package com.fr.van.chart.map.designer.other.condition.item;
import com.fr.chart.base.DataSeriesCondition;
import com.fr.design.condition.ConditionAttributesPane;
import com.fr.design.i18n.Toolkit;
import com.fr.plugin.chart.base.VanChartAttrMarker;
import com.fr.van.chart.designer.other.condition.item.AbstractNormalMultiLineConditionPane;
import com.fr.van.chart.map.designer.style.series.VanChartMapAnchorMarkerPane;
import javax.swing.JPanel;
public class VanChartAnchorMarkerConditionPane extends AbstractNormalMultiLineConditionPane {
private VanChartMapAnchorMarkerPane anchorMarkerPane;
public VanChartAnchorMarkerConditionPane(ConditionAttributesPane conditionAttributesPane) {
super(conditionAttributesPane);
}
protected String getItemLabelString() {
return Toolkit.i18nText("Fine-Design_Chart_Marker");
}
protected JPanel initContentPane() {
anchorMarkerPane = new VanChartMapAnchorMarkerPane();
return anchorMarkerPane;
}
public String nameForPopupMenuItem() {
return Toolkit.i18nText("Fine-Design_Chart_Marker");
}
public void populate(DataSeriesCondition condition) {
if (condition instanceof VanChartAttrMarker) {
anchorMarkerPane.populateBean((VanChartAttrMarker) condition);
}
}
public DataSeriesCondition update() {
return anchorMarkerPane.updateBean();
}
}

26
designer-chart/src/main/java/com/fr/van/chart/map/designer/other/condition/pane/VanChartAnchorPointMapConditionPane.java

@ -0,0 +1,26 @@
package com.fr.van.chart.map.designer.other.condition.pane;
import com.fr.chart.chartattr.Plot;
import com.fr.plugin.chart.attr.EffectHelper;
import com.fr.plugin.chart.base.AttrEffect;
import com.fr.plugin.chart.base.AttrFloatColor;
import com.fr.plugin.chart.base.VanChartAttrMarker;
import com.fr.van.chart.designer.other.condition.item.VanChartEffectConditionPane;
import com.fr.van.chart.designer.other.condition.item.VanChartFloatColorConditionPane;
import com.fr.van.chart.map.designer.other.condition.item.VanChartAnchorMarkerConditionPane;
public class VanChartAnchorPointMapConditionPane extends VanChartMapConditionPane {
public VanChartAnchorPointMapConditionPane(Plot plot) {
super(plot);
}
protected void addDiffAction() {
classPaneMap.put(VanChartAttrMarker.class, new VanChartAnchorMarkerConditionPane(this));
if (addLabelOrEffectAction()) {
addLabelAction();
classPaneMap.put(AttrFloatColor.class, new VanChartFloatColorConditionPane(this));
classPaneMap.put(AttrEffect.class, new VanChartEffectConditionPane(this, EffectHelper.getScatterPlotDefaultEffect()));
}
}
}

64
designer-chart/src/main/java/com/fr/van/chart/map/designer/style/series/VanChartMapAnchorMarkerPane.java

@ -0,0 +1,64 @@
package com.fr.van.chart.map.designer.style.series;
import com.fr.design.beans.BasicBeanPane;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.ispinner.UISpinner;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.plugin.chart.base.VanChartAttrMarker;
import com.fr.plugin.chart.marker.type.MarkerType;
import com.fr.van.chart.designer.TableLayout4VanChartHelper;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Component;
public class VanChartMapAnchorMarkerPane extends BasicBeanPane<VanChartAttrMarker> {
private UISpinner anchorSize;
public VanChartMapAnchorMarkerPane() {
anchorSize = new UISpinner(0, Double.MAX_VALUE, 0.5, 28);
Component[][] components = new Component[][]{
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Size")), anchorSize}
};
double p = TableLayout.PREFERRED;
double f = TableLayout.FILL;
double e = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH;
double[] row = {p};
double[] col = {f, e};
JPanel content = TableLayoutHelper.createTableLayoutPane(components, row, col);
content.setBorder(TableLayout4VanChartHelper.SECOND_EDIT_AREA_BORDER);
this.setLayout(new BorderLayout());
this.add(content, BorderLayout.CENTER);
}
public void populateBean(VanChartAttrMarker marker) {
if (marker == null) {
marker = new VanChartAttrMarker();
marker.setCommon(false);
marker.setMarkerType(MarkerType.MARKER_AUTO);
}
this.anchorSize.setValue(marker.getAnchorSize());
}
public VanChartAttrMarker updateBean() {
VanChartAttrMarker marker = new VanChartAttrMarker();
marker.setCommon(false);
marker.setMarkerType(MarkerType.MARKER_AUTO);
marker.setAnchorSize(this.anchorSize.getValue());
return marker;
}
protected String title4PopupWindow() {
return "anchorMarker";
}
}

258
designer-chart/src/main/java/com/fr/van/chart/map/designer/type/GeoUrlPane.java

@ -0,0 +1,258 @@
package com.fr.van.chart.map.designer.type;
import com.fr.base.Parameter;
import com.fr.decision.webservice.v10.map.geojson.helper.GEOJSONHelper;
import com.fr.design.constants.LayoutConstants;
import com.fr.design.event.UIObserver;
import com.fr.design.event.UIObserverListener;
import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icombobox.FRTreeComboBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.JTemplate;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.ComparatorUtils;
import com.fr.general.IOUtils;
import com.fr.plugin.chart.map.VanChartMapPlot;
import com.fr.plugin.chart.map.designer.type.GEOJSONTreeHelper;
import com.fr.plugin.chart.map.server.ChartGEOJSONHelper;
import com.fr.plugin.chart.map.server.CompatibleGEOJSONHelper;
import com.fr.plugin.chart.type.MapType;
import com.fr.van.chart.designer.TableLayout4VanChartHelper;
import com.fr.van.chart.drillmap.designer.data.comp.MapDataTree;
import com.fr.workspace.WorkContext;
import javax.swing.JPanel;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* @author Bjorn
* @version 10.0
* Created by Bjorn on 2020-12-07
*/
public class GeoUrlPane extends JPanel implements UIObserver {
private UILabel sourceTitleLabel;
private FRTreeComboBox sourceComboBox;
private MapDataTree mapDataTree;
private TreePath selectTreePath;
private UIObserverListener listener;
private String[] oldParams;
public GeoUrlPane() {
initComps();
}
private void initComps() {
this.setLayout(new BorderLayout());
this.add(createMapSourcesPane(), BorderLayout.CENTER);
}
@Override
public void registerChangeListener(UIObserverListener listener) {
this.listener = listener;
}
@Override
public boolean shouldResponseChangeListener() {
return true;
}
private JPanel createMapSourcesPane() {
mapDataTree = new MapDataTree(this.getRootNode());
mapDataTree.setEditable(false);
mapDataTree.selectDefaultTreeNode();
sourceComboBox = new FRTreeComboBox(mapDataTree, mapDataTree.getCellRenderer()) {
//搜索
protected void dealSamePath(TreePath parent, TreeNode node, UITextField textField) {
String searchText = textField.getText();
GeoUrlPane.this.mapDataTree.search(searchText);
}
//选中 tree---combobox
public void setSelectedItem(Object o) {
TreePath oldPath = mapDataTree.getSelectionPath();
Object oldText = getSelectedItem();
if (o != null && o instanceof TreePath) {
selectTreePath = (TreePath) o;
this.tree.setSelectionPath(selectTreePath);
this.getModel().setSelectedItem(pathToString(selectTreePath));
if (ComparatorUtils.equals(oldText, getSelectedItem()) && !ComparatorUtils.equals(oldPath, selectTreePath)) {
//point的江苏省切换到area的江苏省
listener.doChange();
}
} else if (o instanceof String) {//list里面没有
selectTreePath = null;
this.tree.setSelectionPath(null);
this.getModel().setSelectedItem(ChartGEOJSONHelper.getPresentNameWithPath((String) o));
}
}
@Override
protected String pathToString(TreePath path) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
//不显示后缀
return ChartGEOJSONHelper.getPresentNameWithPath(node.toString());
}
@Override
protected boolean customSelectable(DefaultMutableTreeNode node) {
return GEOJSONTreeHelper.isSelectableTreeNode(node);
}
};
sourceComboBox.setEditable(true);
sourceComboBox.setOnlyLeafSelectable(false);
sourceComboBox.addPopupMenuListener(popupMenuListener);
sourceTitleLabel = createSourceTitleLabel();
boolean hasRefreshButton = !WorkContext.getCurrent().isLocal();
UIButton button = new UIButton(IOUtils.readIcon("/com/fr/design/images/control/refresh.png"));
button.setToolTipText(Toolkit.i18nText("Fine-Design_Chart_Update_Remote_Map_JSON"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
GEOJSONHelper.reset();
GEOJSONHelper.getInstance();
}
});
double p = TableLayout.PREFERRED;
double d = TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH;
double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH;
double f = TableLayout.FILL;
double[] rowSize = {p, p};
double[] columnSize = hasRefreshButton ? new double[]{d + 10, e - 20, 20} : new double[]{f, e};
Component[] comps = hasRefreshButton
? new Component[]{sourceTitleLabel, sourceComboBox, button}
: new Component[]{sourceTitleLabel, sourceComboBox};
double hGap = hasRefreshButton ? 0 : TableLayout4VanChartHelper.COMPONENT_INTERVAL;
Component[][] components = new Component[][]{
new Component[]{null, null},
comps,
};
return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, hGap, LayoutConstants.VGAP_LARGE);
}
protected UILabel createSourceTitleLabel() {
return new UILabel(Toolkit.i18nText("Fine-Design_Chart_Map_Area"));
}
protected TreeNode getRootNode() {
return GEOJSONTreeHelper.getInstance().getRootNodeWithPara();
}
private String[] getParamsName() {
JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
if (jTemplate == null) {
return new String[0];
}
Parameter[] parameters = jTemplate.getJTemplateParameters();
int len = parameters.length;
String[] names = new String[len];
for (int i = 0; i < len; i++) {
names[i] = parameters[i].getName();
}
return names;
}
private PopupMenuListener popupMenuListener = new PopupMenuListener() {
public void popupMenuCanceled(PopupMenuEvent e) {
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
}
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
GEOJSONTreeHelper.reset();
mapDataTree.changeRootNode(GeoUrlPane.this.getRootNode());
GEOJSONTreeHelper.getInstance().updateParamRootNode(GeoUrlPane.this.getParamsName());
if (selectTreePath != null) {
mapDataTree.setSelectNodePath(CompatibleGEOJSONHelper.completeJSONName(selectTreePath.getLastPathComponent().toString()));
selectTreePath = mapDataTree.getSelectionPath();
}
mapDataTree.updateUI();//因为服务器那边可能随时编辑,所以这边要重画
mapDataTree.setSelectionPath(selectTreePath);
mapDataTree.scrollPathToVisible(selectTreePath);
}
};
public void populate(VanChartMapPlot mapPlot) {
resetComponentValue(mapPlot, false);
String geoUrl = mapPlot.getGeoUrl();
mapDataTree.setSelectNodePath(geoUrl);
selectTreePath = mapDataTree.getSelectionPath();
if (selectTreePath == null) {//此url当前环境没有
sourceComboBox.setSelectedItem(geoUrl);
} else {
sourceComboBox.setSelectedItem(selectTreePath);
}
boolean enabled = !CompatibleGEOJSONHelper.isDeprecated(mapPlot.getGeoUrl());
GUICoreUtils.setEnabled(sourceComboBox, enabled);
}
public String update() {
return mapDataTree.getSelectNodeJSONPath();
}
protected void resetComponentValue(VanChartMapPlot mapPlot, boolean samePlotChange) {
MapType mapType = mapPlot.getMapType();
//获取最新的参数
String[] params = getParamsName();
if (!ComparatorUtils.equals(oldParams, params)) {
oldParams = params;
GEOJSONTreeHelper.getInstance().updateParamRootNode(params);
}
mapDataTree.changeRootNode(this.getRootNode());
if (samePlotChange) {
String nodePath = ChartGEOJSONHelper.getDefaultJSONURL();
mapPlot.setGeoUrl(nodePath);
mapDataTree.setSelectNodePath(nodePath);
selectTreePath = mapDataTree.getSelectionPath();
sourceComboBox.setSelectedItem(selectTreePath);
}
switch (mapType) {
case CUSTOM:
sourceTitleLabel.setText(Toolkit.i18nText("Fine-Design_Chart_Map_Area_And_Point"));
break;
case POINT:
sourceTitleLabel.setText(Toolkit.i18nText("Fine-Design_Chart_Map_Point"));
break;
case LINE:
sourceTitleLabel.setText(Toolkit.i18nText("Fine-Design_Chart_Map_Point"));
break;
default:
sourceTitleLabel.setText(Toolkit.i18nText("Fine-Design_Chart_Map_Area"));
}
}
}

303
designer-chart/src/main/java/com/fr/van/chart/map/designer/type/GisLayerPane.java

@ -0,0 +1,303 @@
package com.fr.van.chart.map.designer.type;
import com.fr.base.Utils;
import com.fr.design.event.UIObserver;
import com.fr.design.event.UIObserverListener;
import com.fr.design.gui.ibutton.UIButtonGroup;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.general.ComparatorUtils;
import com.fr.plugin.chart.base.GisLayer;
import com.fr.plugin.chart.map.VanChartMapPlot;
import com.fr.plugin.chart.map.server.MapLayerConfigManager;
import com.fr.plugin.chart.type.GISLayerType;
import com.fr.plugin.chart.type.GaoDeGisType;
import com.fr.plugin.chart.type.ZoomLevel;
import com.fr.van.chart.designer.TableLayout4VanChartHelper;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JPanel;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ItemEvent;
/**
* @author Bjorn
* @version 10.0
* Created by Bjorn on 2020-12-07
*/
public class GisLayerPane extends JPanel implements UIObserver {
private UIButtonGroup gisButton;
private JPanel layerPaneCheckPane;
private UIComboBox gisGaoDeLayer;
private UIComboBox gisLayer;
private JPanel layerCardPane;
private WMSLayerPane wmsLayerPane;
private TileLayerPane tileLayerPane;
private UIComboBox zoomLevel;
private String[] layers = MapLayerConfigManager.getLayerItems();
public GisLayerPane() {
initComps();
}
private void initComps() {
this.setLayout(new BorderLayout());
this.add(createGISLayerPane(), BorderLayout.CENTER);
}
@Override
public void registerChangeListener(UIObserverListener listener) {
this.wmsLayerPane.registerChangeListener(listener);
}
@Override
public boolean shouldResponseChangeListener() {
return true;
}
public void registerZoomLevel(UIComboBox zoomLevel) {
this.zoomLevel = zoomLevel;
}
private boolean isStandardGis() {
return gisButton.getSelectedIndex() == 0;
}
private JPanel createGISLayerPane() {
gisButton = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Form_Widget_Style_Standard"), Toolkit.i18nText("Fine-Design_Chart_Custom")});
gisGaoDeLayer = new UIComboBox(MapLayerConfigManager.getGaoDeLayerItems());
gisButton.addActionListener(event -> {
refreshZoomLevel();
checkLayerCardPane();
});
gisGaoDeLayer.addItemListener(event -> refreshZoomLevel());
initCustomGISLayerPane();
initLayerCardPane();
layerPaneCheckPane = new JPanel(new CardLayout()) {
@Override
public Dimension getPreferredSize() {
if (isStandardGis()) {
return gisGaoDeLayer.getPreferredSize();
} else {
return gisLayer.getPreferredSize();
}
}
};
layerPaneCheckPane.add(gisGaoDeLayer, "standard");
layerPaneCheckPane.add(gisLayer, "custom");
double p = TableLayout.PREFERRED;
double f = TableLayout.FILL;
double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH;
double[] row = {p, p, p};
double[] col = {f, e};
Component[][] components = new Component[][]{
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Gis_Layer")), gisButton},
new Component[]{null, layerPaneCheckPane},
new Component[]{layerCardPane, null},
};
JPanel panel = TableLayoutHelper.createTableLayoutPane(components, row, col);
panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
return panel;
}
private void initLayerCardPane() {
tileLayerPane = new TileLayerPane();
wmsLayerPane = new WMSLayerPane();
layerCardPane = new JPanel(new CardLayout()) {
@Override
public Dimension getPreferredSize() {
if (isStandardGis()) {
return new Dimension(0, 0);
}
String itemName = Utils.objectToString(gisLayer.getSelectedItem());
if (MapLayerConfigManager.isCustomLayer(itemName)) {
return tileLayerPane.getPreferredSize();
} else if (MapLayerConfigManager.isCustomWmsLayer(itemName)) {
return wmsLayerPane.getPreferredSize();
}
return new Dimension(0, 0);
}
};
for (String itemName : layers) {
JPanel pane = new JPanel();
if (MapLayerConfigManager.isCustomLayer(itemName)) {
pane = tileLayerPane;
} else if (MapLayerConfigManager.isCustomWmsLayer(itemName)) {
pane = wmsLayerPane;
}
layerCardPane.add(pane, itemName);
}
}
private void initCustomGISLayerPane() {
gisLayer = new UIComboBox(layers);
gisLayer.addItemListener(e ->
{
if (e.getStateChange() == ItemEvent.SELECTED) {
checkCustomLayerCardPane();
}
refreshZoomLevel();
}
);
gisLayer.addPopupMenuListener(new PopupMenuListener() {
public void popupMenuCanceled(PopupMenuEvent e) {
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
}
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
String selected = Utils.objectToString(gisLayer.getSelectedItem());
ZoomLevel zoomSelected = (ZoomLevel) zoomLevel.getSelectedItem();
gisLayer.setModel(new DefaultComboBoxModel(MapLayerConfigManager.getLayerItems()));
gisLayer.setSelectedItem(selected);
zoomLevel.setSelectedItem(zoomSelected);
}
});
}
private void refreshZoomLevel() {
//gis图层不同,对应的缩放等级不同。
ZoomLevel[] levels;
if (isStandardGis()) {
if (gisGaoDeLayer.getSelectedIndex() == gisGaoDeLayer.getItemCount() - 1) {
levels = MapStatusPane.ZOOM_LEVELS;
} else {
levels = MapStatusPane.GAODE_ZOOM_LEVELS;
}
} else {
if (ComparatorUtils.equals(gisLayer.getSelectedItem(), Toolkit.i18nText("Fine-Design_Chart_Layer_Blue"))) {
levels = MapStatusPane.BLUE_ZOOM_LEVELS;
} else if (ComparatorUtils.equals(gisLayer.getSelectedItem(), Toolkit.i18nText("Fine-Design_Chart_Layer_GaoDe"))) {
levels = MapStatusPane.GAODE_ZOOM_LEVELS;
} else {
levels = MapStatusPane.ZOOM_LEVELS;
}
}
zoomLevel.setModel(new DefaultComboBoxModel(levels));
}
private void checkLayerCardPane() {
CardLayout cardLayout = (CardLayout) layerPaneCheckPane.getLayout();
cardLayout.show(layerPaneCheckPane, isStandardGis() ? "standard" : "custom");
}
private void checkCustomLayerCardPane() {
CardLayout cardLayout = (CardLayout) layerCardPane.getLayout();
cardLayout.show(layerCardPane, Utils.objectToString(gisLayer.getSelectedItem()));
}
public void resetGisLayer(VanChartMapPlot mapPlot) {
//TODO Bjorn 地图gis图层自动逻辑
/* mapPlot.getGisLayer().setGisLayerType(GISLayerType.AUTO);
mapPlot.getGisLayer().setLayerName(GISLayerType.getLocString(GISLayerType.AUTO));*/
GaoDeGisType gaoDeGisType= mapPlot.getDefaultGisLayerType();
mapPlot.getGisLayer().setGisLayerType(GISLayerType.GAO_DE_API);
mapPlot.getGisLayer().setLayerName(gaoDeGisType.getTypeName());
mapPlot.getGisLayer().setGaoDeGisType(gaoDeGisType);
populate(mapPlot.getGisLayer());
}
public void populate(GisLayer layer) {
switch (layer.getGisLayerType()) {
case GAO_DE_API:
case LAYER_NULL:
populateStandardGis(layer);
break;
default:
populateCustomGis(layer);
}
refreshZoomLevel();
checkCustomLayerCardPane();
checkLayerCardPane();
}
private void populateStandardGis(GisLayer layer) {
gisButton.setSelectedIndex(0);
if (layer.getGisLayerType() == GISLayerType.LAYER_NULL) {
gisGaoDeLayer.setSelectedIndex(gisGaoDeLayer.getItemCount() - 1);
} else {
gisGaoDeLayer.setSelectedItem(layer.getGaoDeGisType().getTypeName());
}
}
private void populateCustomGis(GisLayer layer) {
gisButton.setSelectedIndex(1);
gisLayer.setSelectedItem(layer.getShowItemName());
switch (layer.getGisLayerType()) {
case CUSTOM_WMS_LAYER:
wmsLayerPane.populate(layer);
break;
case CUSTOM_TILE_LAYER:
tileLayerPane.populate(layer);
break;
}
}
public void update(GisLayer layer) {
if (isStandardGis()) {
updateStandardGis(layer);
} else {
updateCustomGis(layer);
}
}
private void updateStandardGis(GisLayer layer) {
String layerName = Utils.objectToString(gisGaoDeLayer.getSelectedItem());
layer.setLayerName(layerName);
if (gisGaoDeLayer.getSelectedIndex() == gisGaoDeLayer.getItemCount() - 1) {
layer.setGisLayerType(MapLayerConfigManager.getGisLayerType(layerName));
} else {
layer.setGisLayerType(GISLayerType.GAO_DE_API);
layer.setGaoDeGisType(GaoDeGisType.parseByLocaleName(layerName));
}
}
private void updateCustomGis(GisLayer layer) {
String layerName = Utils.objectToString(gisLayer.getSelectedItem());
layer.setLayerName(layerName);
layer.setGisLayerType(MapLayerConfigManager.getGisLayerType(layerName));
switch (layer.getGisLayerType()) {
case CUSTOM_WMS_LAYER:
wmsLayerPane.update(layer);
break;
case CUSTOM_TILE_LAYER:
tileLayerPane.update(layer);
break;
}
}
}

167
designer-chart/src/main/java/com/fr/van/chart/map/designer/type/MapStatusPane.java

@ -0,0 +1,167 @@
package com.fr.van.chart.map.designer.type;
import com.fr.design.gui.ibutton.UIButtonGroup;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.ispinner.UISpinner;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.TableLayout;
import com.fr.plugin.chart.base.ViewCenter;
import com.fr.plugin.chart.map.VanChartMapPlot;
import com.fr.plugin.chart.type.ZoomLevel;
import com.fr.stable.ArrayUtils;
import com.fr.van.chart.designer.TableLayout4VanChartHelper;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
/**
* @author Bjorn
* @version 10.0
* Created by Bjorn on 2020-12-07
*/
public class MapStatusPane extends JPanel {
public static final ZoomLevel[] ZOOM_LEVELS = new ZoomLevel[]{
ZoomLevel.AUTO,
ZoomLevel.ZERO, ZoomLevel.ZEROPOINTFIVE,
ZoomLevel.ONE, ZoomLevel.ONEPOINTFIVE,
ZoomLevel.TWO, ZoomLevel.TWOPOINTFIVE,
ZoomLevel.THREE, ZoomLevel.THREEPOINTFIVE,
ZoomLevel.FOUR, ZoomLevel.FOURPOINTFIVE,
ZoomLevel.FIVE, ZoomLevel.FIVEPOINTFIVE,
ZoomLevel.SIX, ZoomLevel.SIXPOINTFIVE,
ZoomLevel.SEVEN, ZoomLevel.SEVENPOINTFIVE,
ZoomLevel.EIGHT, ZoomLevel.EIGHTPOINTFIVE,
ZoomLevel.NINE, ZoomLevel.NINEPOINTFIVE,
ZoomLevel.TEN, ZoomLevel.TENPOINTFIVE,
ZoomLevel.ELEVEN, ZoomLevel.ELEVENTPOINTFIVE,
ZoomLevel.TWELVE, ZoomLevel.TWELVEPOINTFIVE,
ZoomLevel.THIRTEEN, ZoomLevel.THIRTEENPOINTFIVE,
ZoomLevel.FOURTEEN, ZoomLevel.FOURTEENPOINTFIVE,
ZoomLevel.FIFTEEN, ZoomLevel.FIFTEENPOINTFIVE,
ZoomLevel.SIXTEEN, ZoomLevel.SIXTEENPOINTFIVE,
ZoomLevel.SEVENTEEN, ZoomLevel.SEVENTEENPOINTFIVE,
ZoomLevel.EIGHTEEN
};
//深蓝和高德地图下拉框层级
public static final ZoomLevel[] BLUE_ZOOM_LEVELS = ArrayUtils.subarray(ZOOM_LEVELS, 0, 34);
public static final ZoomLevel[] GAODE_ZOOM_LEVELS = ArrayUtils.addAll(new ZoomLevel[]{ZoomLevel.AUTO}, (ZoomLevel[]) ArrayUtils.subarray(ZOOM_LEVELS, 7, 38));
private static final String AUTO_CENTER_STRING = Toolkit.i18nText("Fine-Design_Chart_Automatic");
private static final String CUSTOM_CENTER_STRING = Toolkit.i18nText("Fine-Design_Chart_Custom");
private JPanel levelAndCenterPane;
private JPanel longAndLatPane;
private UIComboBox zoomLevel;
private UIButtonGroup viewCenterCom;
private UISpinner longitude;
private UISpinner latitude;
public MapStatusPane() {
initComps();
}
public UIComboBox getZoomLevel() {
return zoomLevel;
}
private void initComps() {
zoomLevel = new UIComboBox(ZOOM_LEVELS);
viewCenterCom = new UIButtonGroup(new String[]{AUTO_CENTER_STRING, CUSTOM_CENTER_STRING});
longitude = new UISpinner(-Double.MAX_VALUE, Double.MAX_VALUE, 1, 0.0);
latitude = new UISpinner(-Double.MAX_VALUE, Double.MAX_VALUE, 1, 0.0);
double p = TableLayout.PREFERRED;
double d = TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH;
double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH;
double s = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH;
double[] rowSize = {p, p, p};
double[] columnSize = {d, e};
double[] column = {d, s};
Component[][] comps = new Component[][]{
new Component[]{null, null},
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Zoom_Layer")), zoomLevel},
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_View_Center")), viewCenterCom},
};
levelAndCenterPane = TableLayout4VanChartHelper.createGapTableLayoutPane(comps, rowSize, columnSize);
Component[][] longAndLatComps = new Component[][]{
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Longitude")), longitude},
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Latitude")), latitude}
};
longAndLatPane = TableLayout4VanChartHelper.createGapTableLayoutPane(longAndLatComps, rowSize, column);
longAndLatPane.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0));
longAndLatPane.setVisible(false);
this.setLayout(new BorderLayout(0, 6));
this.add(levelAndCenterPane, BorderLayout.NORTH);
this.add(longAndLatPane, BorderLayout.CENTER);
viewCenterCom.addActionListener(event ->
longAndLatPane.setVisible(!isAutoViewCenter()));
}
@Override
public Dimension getPreferredSize() {
if (longAndLatPane.isVisible()) {
return super.getPreferredSize();
} else {
return levelAndCenterPane.getPreferredSize();
}
}
private boolean isAutoViewCenter() {
return viewCenterCom.getSelectedIndex() == 0;
}
public void resetViewCenter(VanChartMapPlot mapPlot) {
mapPlot.setViewCenter(new ViewCenter());
viewCenterCom.setSelectedIndex(0);
longitude.setValue(0);
latitude.setValue(0);
longAndLatPane.setVisible(false);
}
public void resetZoomLevel(VanChartMapPlot mapPlot) {
mapPlot.setZoomLevel(ZoomLevel.AUTO);
zoomLevel.setSelectedItem(mapPlot.getZoomLevel());
}
public void populate(VanChartMapPlot mapPlot) {
zoomLevel.setSelectedItem(mapPlot.getZoomLevel());
ViewCenter viewCenter = mapPlot.getViewCenter();
if (viewCenter.isAuto()) {
viewCenterCom.setSelectedIndex(0);
longitude.setValue(0);
latitude.setValue(0);
} else {
viewCenterCom.setSelectedIndex(1);
longitude.setValue(viewCenter.getLongitude());
latitude.setValue(viewCenter.getLatitude());
}
longAndLatPane.setVisible(!isAutoViewCenter());
}
public void update(VanChartMapPlot mapPlot) {
mapPlot.setZoomLevel((ZoomLevel) zoomLevel.getSelectedItem());
ViewCenter viewCenter = mapPlot.getViewCenter();
if (isAutoViewCenter()) {
viewCenter.setAuto(true);
} else {
viewCenter.setAuto(false);
viewCenter.setLongitude(longitude.getValue());
viewCenter.setLatitude(latitude.getValue());
}
}
}

51
designer-chart/src/main/java/com/fr/van/chart/map/designer/type/TileLayerPane.java

@ -0,0 +1,51 @@
package com.fr.van.chart.map.designer.type;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.itextarea.UITextArea;
import com.fr.design.layout.TableLayout;
import com.fr.plugin.chart.base.GisLayer;
import com.fr.van.chart.designer.TableLayout4VanChartHelper;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Component;
/**
* @author Bjorn
* @version 10.0
* Created by Bjorn on 2020-12-07
*/
public class TileLayerPane extends JPanel {
private UITextArea customTileLayer;
private UITextArea attribution;
public TileLayerPane() {
double p = TableLayout.PREFERRED;
double[] rowSize = {p, p};
double[] COLUMN_SIZE = {TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH, TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH - 3};
customTileLayer = new UITextArea();
attribution = new UITextArea();
Component[][] comps = new Component[][]{
new Component[]{new UILabel("url"), customTileLayer},
new Component[]{new UILabel("Attribution"), attribution}
};
JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(comps, rowSize, COLUMN_SIZE);
panel.setBorder(TableLayout4VanChartHelper.SECOND_EDIT_AREA_BORDER);
this.setLayout(new BorderLayout());
this.add(panel, BorderLayout.CENTER);
}
public void populate(GisLayer layer) {
customTileLayer.setText(layer.getCustomTileLayer());
attribution.setText(layer.getAttribution());
}
public void update(GisLayer layer) {
layer.setCustomTileLayer(customTileLayer.getText());
layer.setAttribution(attribution.getText());
}
}

1
designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java

@ -78,7 +78,6 @@ public class VanChartMapPlotPane extends AbstractVanChartTypePane {
boolean enabled = !CompatibleGEOJSONHelper.isDeprecated(plot.getGeoUrl());
GUICoreUtils.setEnabled(this.getTypePane(), enabled);
GUICoreUtils.setEnabled(this.sourceChoosePane.getSourceComboBox(), enabled);
checkDemosBackground();
}

714
designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapSourceChoosePane.java

@ -1,739 +1,113 @@
package com.fr.van.chart.map.designer.type;
import com.fr.base.Parameter;
import com.fr.base.Utils;
import com.fr.decision.webservice.v10.map.WMSFactory;
import com.fr.decision.webservice.v10.map.geojson.helper.GEOJSONHelper;
import com.fr.design.constants.LayoutConstants;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.event.UIObserver;
import com.fr.design.event.UIObserverListener;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ibutton.UIButtonGroup;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.icombobox.FRTreeComboBox;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.ispinner.UISpinner;
import com.fr.design.gui.itextarea.UITextArea;
import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.JTemplate;
import com.fr.general.ComparatorUtils;
import com.fr.general.IOUtils;
import com.fr.general.http.HttpClient;
import com.fr.plugin.chart.base.GisLayer;
import com.fr.plugin.chart.base.ViewCenter;
import com.fr.plugin.chart.map.VanChartMapPlot;
import com.fr.plugin.chart.map.designer.type.GEOJSONTreeHelper;
import com.fr.plugin.chart.map.layer.WMSLayer;
import com.fr.plugin.chart.map.server.ChartGEOJSONHelper;
import com.fr.plugin.chart.map.server.CompatibleGEOJSONHelper;
import com.fr.plugin.chart.map.server.MapLayerConfigManager;
import com.fr.plugin.chart.type.GISLayerType;
import com.fr.plugin.chart.type.MapType;
import com.fr.plugin.chart.type.ZoomLevel;
import com.fr.stable.ArrayUtils;
import com.fr.van.chart.designer.TableLayout4VanChartHelper;
import com.fr.van.chart.drillmap.designer.data.comp.MapDataTree;
import com.fr.workspace.WorkContext;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingWorker;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import java.util.ArrayList;
import java.util.List;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
/**
* Created by Mitisky on 16/5/11.
* 地图类型选择面板,关于json资源路径/gis图层等设置面板
*/
public class VanChartMapSourceChoosePane extends JPanel implements UIObserver {
private static final double[] COLUMN_SIZE = {48, TableLayout.FILL, TableLayout.PREFERRED};
public static final ZoomLevel[] ZOOM_LEVELS = new ZoomLevel[]{
ZoomLevel.AUTO,
ZoomLevel.ZERO, ZoomLevel.ZEROPOINTFIVE,
ZoomLevel.ONE, ZoomLevel.ONEPOINTFIVE,
ZoomLevel.TWO, ZoomLevel.TWOPOINTFIVE,
ZoomLevel.THREE, ZoomLevel.THREEPOINTFIVE,
ZoomLevel.FOUR, ZoomLevel.FOURPOINTFIVE,
ZoomLevel.FIVE, ZoomLevel.FIVEPOINTFIVE,
ZoomLevel.SIX, ZoomLevel.SIXPOINTFIVE,
ZoomLevel.SEVEN, ZoomLevel.SEVENPOINTFIVE,
ZoomLevel.EIGHT, ZoomLevel.EIGHTPOINTFIVE,
ZoomLevel.NINE, ZoomLevel.NINEPOINTFIVE,
ZoomLevel.TEN, ZoomLevel.TENPOINTFIVE,
ZoomLevel.ELEVEN, ZoomLevel.ELEVENTPOINTFIVE,
ZoomLevel.TWELVE, ZoomLevel.TWELVEPOINTFIVE,
ZoomLevel.THIRTEEN, ZoomLevel.THIRTEENPOINTFIVE,
ZoomLevel.FOURTEEN, ZoomLevel.FOURTEENPOINTFIVE,
ZoomLevel.FIFTEEN, ZoomLevel.FIFTEENPOINTFIVE,
ZoomLevel.SIXTEEN, ZoomLevel.SIXTEENPOINTFIVE,
ZoomLevel.SEVENTEEN, ZoomLevel.SEVENTEENPOINTFIVE,
ZoomLevel.EIGHTEEN
};
//深蓝和高德地图下拉框层级
private static final ZoomLevel[] BLUE_ZOOM_LEVELS =(ZoomLevel[]) ArrayUtils.subarray(ZOOM_LEVELS, 0, 34);
private static final ZoomLevel[] GAODE_ZOOM_LEVELS =ArrayUtils.addAll(new ZoomLevel[]{ZoomLevel.AUTO}, (ZoomLevel[])ArrayUtils.subarray(ZOOM_LEVELS, 7, 38));
private static final String AUTO_CENTER_STRING = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Automatic");
private static final String CUSTOM_CENTER_STRING = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom");
private UILabel sourceTitleLabel;
private FRTreeComboBox sourceComboBox;
private MapDataTree mapDataTree;
private TreePath selectTreePath;
private GeoUrlPane geoUrlPane;
private UIComboBox gisLayer;
private JPanel layerCardPane;
private GisLayerPane gisLayerPane;
private UITextArea wmsUrl;
private UIButton connectButton;
private JPanel wmsLayerPane;
private java.util.List<UICheckBox> wmsLayerCheckBoxs = new ArrayList<UICheckBox>();
private UITextArea customTileLayer;
private UITextArea attribution;
private UIComboBox zoomLevel;
private UIButtonGroup viewCenterCom;
private JPanel longAndLatPane;
private UISpinner longitude;
private UISpinner latitude;
private String[] oldParams;
private UIObserverListener listener;
private String[] layers = MapLayerConfigManager.getLayerItems();
/**
* 给组件登记一个观察者监听事件
*
* @param listener 观察者监听事件
*/
@Override
public void registerChangeListener(UIObserverListener listener) {
this.listener = listener;
}
/**
* 组件是否需要响应添加的观察者事件
*
* @return 如果需要响应观察者事件则返回true否则返回false
*/
@Override
public boolean shouldResponseChangeListener() {
return true;
}
private MapStatusPane mapStatusPane;
public VanChartMapSourceChoosePane() {
initGeoUrlPane();
initMapStatusPane();
initGisLayerPane();
this.setLayout(new BorderLayout());
this.setBorder(BorderFactory.createEmptyBorder(10,5,0,0));
this.setBorder(BorderFactory.createEmptyBorder(10, 5, 0, 0));
double p = TableLayout.PREFERRED;
double[] columnSize = {230};
double[] rowSize = {p,p,p,p,p,p,p,p};
double[] rowSize = {p, p, p, p, p, p, p, p};
JPanel panel = new JPanel(new BorderLayout());
panel.add(createMapSourcesPane(), BorderLayout.NORTH);
panel.add(createGISLayerPane(), BorderLayout.CENTER);
JPanel BasePane = TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Basic"), panel);
panel.add(geoUrlPane, BorderLayout.NORTH);
panel.add(gisLayerPane, BorderLayout.CENTER);
JPanel basePane = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Report_Basic"), panel);
JPanel mapStatusPaneWithTitle = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Map_Init_Status"), mapStatusPane);
Component[][] comps = new Component[][]{
new Component[]{BasePane},
new Component[]{createMapInitStatusPane()}
new Component[]{basePane},
new Component[]{mapStatusPaneWithTitle}
};
JPanel contentPane = TableLayoutHelper.createTableLayoutPane(comps,rowSize,columnSize);
JPanel contentPane = TableLayoutHelper.createTableLayoutPane(comps, rowSize, columnSize);
this.add(contentPane, BorderLayout.CENTER);
}
protected boolean supportParam(){
return true;
}
protected TreeNode getRootNode() {
return supportParam() ? GEOJSONTreeHelper.getInstance().getRootNodeWithPara() : GEOJSONTreeHelper.getInstance().getRootNodeWithoutPara();
public void setGeoUrlPane(GeoUrlPane geoUrlPane) {
this.geoUrlPane = geoUrlPane;
}
protected UILabel createSourceTitleLabel() {
return new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Map_Area"));
}
private JPanel createMapSourcesPane() {
mapDataTree = new MapDataTree(this.getRootNode());
mapDataTree.setEditable(false);
mapDataTree.selectDefaultTreeNode();
sourceComboBox = new FRTreeComboBox(mapDataTree, mapDataTree.getCellRenderer()){
//搜索
protected void dealSamePath(TreePath parent, TreeNode node, UITextField textField){
String searchText = textField.getText();
VanChartMapSourceChoosePane.this.mapDataTree.search(searchText);
}
//选中 tree---combobox
public void setSelectedItem(Object o) {
TreePath oldPath = mapDataTree.getSelectionPath();
Object oldText = getSelectedItem();
if(o != null && o instanceof TreePath){
selectTreePath =(TreePath)o;
this.tree.setSelectionPath(selectTreePath);
this.getModel().setSelectedItem(pathToString(selectTreePath));
if(ComparatorUtils.equals(oldText, getSelectedItem()) && !ComparatorUtils.equals(oldPath, selectTreePath)) {
//point的江苏省切换到area的江苏省
listener.doChange();
}
} else if(o instanceof String){//list里面没有
selectTreePath = null;
this.tree.setSelectionPath(null);
this.getModel().setSelectedItem(ChartGEOJSONHelper.getPresentNameWithPath((String) o));
}
}
@Override
protected String pathToString(TreePath path) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
//不显示后缀
return ChartGEOJSONHelper.getPresentNameWithPath(node.toString());
}
@Override
protected boolean customSelectable(DefaultMutableTreeNode node){
return GEOJSONTreeHelper.isSelectableTreeNode(node);
}
};
sourceComboBox.setEditable(true);
sourceComboBox.setOnlyLeafSelectable(false);
sourceComboBox.addPopupMenuListener(popupMenuListener);
sourceTitleLabel = createSourceTitleLabel();
boolean hasRefreshButton = !WorkContext.getCurrent().isLocal();
UIButton button = new UIButton(IOUtils.readIcon("/com/fr/design/images/control/refresh.png"));
button.setToolTipText(Toolkit.i18nText("Fine-Design_Chart_Update_Remote_Map_JSON"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
GEOJSONHelper.reset();
GEOJSONHelper.getInstance();
}
});
double p = TableLayout.PREFERRED;
double d = TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH;
double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH;
double[] rowSize = {p, p};
double[] columnSize = hasRefreshButton ? new double[]{d + 10, e - 20, 20} : new double[]{d, e};
Component[] comps = hasRefreshButton ? new Component[]{sourceTitleLabel, sourceComboBox, button} : new Component[]{sourceTitleLabel, sourceComboBox};
double hGap = hasRefreshButton ? 0 : TableLayout4VanChartHelper.COMPONENT_INTERVAL;
Component[][] components = new Component[][]{
new Component[]{null,null},
comps,
};
return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, hGap, LayoutConstants.VGAP_LARGE);
}
private JPanel createGISLayerPane() {
JPanel panel = new JPanel(new BorderLayout(0, 8));
gisLayer = new UIComboBox(layers);
gisLayer.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
refreshZoomLevel();
}
});
gisLayer.addPopupMenuListener(new PopupMenuListener() {
public void popupMenuCanceled(PopupMenuEvent e) {
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
}
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
String selected = Utils.objectToString(gisLayer.getSelectedItem());
ZoomLevel zoomSelected = (ZoomLevel) zoomLevel.getSelectedItem();
gisLayer.setModel(new DefaultComboBoxModel(MapLayerConfigManager.getLayerItems()));
gisLayer.setSelectedItem(selected);
zoomLevel.setSelectedItem(zoomSelected);
}
});
gisLayer.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
checkLayerCardPane();
}
}
});
final JPanel tileLyaerPane = createCustomTileLayer();
final JPanel wmsLayerPane = createWMSPanel();
layerCardPane = new JPanel(new CardLayout()){
@Override
public Dimension getPreferredSize() {
String itemName = Utils.objectToString(gisLayer.getSelectedItem());
if (MapLayerConfigManager.isCustomLayer(itemName)) {
return tileLyaerPane.getPreferredSize();
} else if (MapLayerConfigManager.isCustomWmsLayer(itemName)) {
return wmsLayerPane.getPreferredSize();
}
return new Dimension(0,0);
}
};
for(String itemName : layers){
JPanel pane = new JPanel();
if (MapLayerConfigManager.isCustomLayer(itemName)) {
pane = tileLyaerPane;
} else if (MapLayerConfigManager.isCustomWmsLayer(itemName)) {
pane = wmsLayerPane;
}
layerCardPane.add(pane, itemName);
}
JPanel panel1 = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Gis_Layer"), gisLayer);
panel.add(panel1, BorderLayout.CENTER);
panel.add(layerCardPane, BorderLayout.SOUTH);
return panel;
}
private void refreshZoomLevel(){
//gis图层不同,对应的缩放等级不同。
ZoomLevel[] levels;
if (ComparatorUtils.equals(gisLayer.getSelectedItem(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Layer_Blue"))) {
levels = BLUE_ZOOM_LEVELS;
} else if (ComparatorUtils.equals(gisLayer.getSelectedItem(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Layer_GaoDe"))) {
levels = GAODE_ZOOM_LEVELS;
} else {
levels = ZOOM_LEVELS;
}
zoomLevel.setModel(new DefaultComboBoxModel(levels));
}
private JPanel createCustomTileLayer() {
double p = TableLayout.PREFERRED;
double[] rowSize = {p, p};
double[] COLUMN_SIZE = {TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH, TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH-3};
customTileLayer = new UITextArea();
attribution = new UITextArea();
Component[][] comps = new Component[][]{
new Component[]{new UILabel("url"), customTileLayer},
new Component[]{new UILabel("Attribution"), attribution}
};
JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(comps, rowSize, COLUMN_SIZE);
panel.setBorder(TableLayout4VanChartHelper.SECOND_EDIT_AREA_BORDER);
return panel;
}
private JPanel createWMSPanel() {
final double p = TableLayout.PREFERRED;
double[] rowSize = {p};
double[] COLUMN_SIZE = {TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH, 84,44};
wmsUrl = new UITextArea();
connectButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Connect_WMP"));
Component[][] comps = new Component[][]{
new Component[]{new UILabel("url"), wmsUrl, connectButton}
};
JPanel northPane = TableLayout4VanChartHelper.createGapTableLayoutPane(comps, rowSize, COLUMN_SIZE);
northPane.setBorder(TableLayout4VanChartHelper.SECOND_EDIT_AREA_BORDER);
JPanel wmsPanel = new JPanel(new BorderLayout(0, 4));
wmsLayerPane = new JPanel(new BorderLayout());
resetWMSLayerPane(new ArrayList<WMSLayer>());
wmsPanel.add(northPane, BorderLayout.NORTH);
wmsPanel.add(wmsLayerPane, BorderLayout.CENTER);
connectButton.addActionListener(actionListener);
addMouseListener();
return wmsPanel;
}
ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new SwingWorker<Void, Double>() {
private java.util.List<WMSLayer> list = new ArrayList<>();
@Override
protected Void doInBackground() throws Exception {
HttpClient httpClient = new HttpClient(wmsUrl.getText() + "service=WMS&request=GetCapabilities");
httpClient.asGet();
if (!httpClient.isServerAlive()) {
return null;
}
String res = httpClient.getResponseText();
List<String> layers = WMSFactory.readLayers(res);
list.clear();
for (String layer : layers) {
list.add(new WMSLayer(layer, false));
}
return null;
}
@Override
protected void done() {
connectButton.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Connect_WMP"));
if(list != null && list.size() > 0) {
resetWMSLayerPane(list);
} else {
FineJOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Invalid_WMS"));
}
}
}.execute();
}
};
private void addMouseListener() {
connectButton.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
connectButton.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Connecting_WMP"));
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
@Override
public void registerChangeListener(UIObserverListener listener) {
geoUrlPane.registerChangeListener(listener);
gisLayerPane.registerChangeListener(listener);
}
private void resetWMSLayerPane(java.util.List<WMSLayer> wmsLayers) {
int size = wmsLayers.size();
double[] rowSize = new double[size];
Component[][] comps = new Component[size][2];
wmsLayerCheckBoxs.clear();
wmsLayerPane.removeAll();
for(int i =0; i < size; i++){
rowSize[i] = TableLayout.PREFERRED;
comps[i][0] = i == 0 ? new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_WMS_Layers"), SwingConstants.RIGHT) : null;
WMSLayer layer = wmsLayers.get(i);
UICheckBox checkBox = new UICheckBox(layer.getLayer());
checkBox.registerChangeListener(listener);
checkBox.setToolTipText(layer.getLayer());
checkBox.setSelected(layer.isSelected());
comps[i][1] = checkBox;
wmsLayerCheckBoxs.add(checkBox);
}
wmsLayerPane.add(TableLayoutHelper.createCommonTableLayoutPane(comps,rowSize, COLUMN_SIZE,0), BorderLayout.CENTER);
VanChartMapSourceChoosePane.this.updateUI();
@Override
public boolean shouldResponseChangeListener() {
return true;
}
private JPanel createMapInitStatusPane() {
zoomLevel = new UIComboBox(ZOOM_LEVELS);
viewCenterCom = new UIButtonGroup(new String[]{AUTO_CENTER_STRING, CUSTOM_CENTER_STRING});
longitude = new UISpinner(-Double.MAX_VALUE,Double.MAX_VALUE,1,0.0);
latitude = new UISpinner(-Double.MAX_VALUE,Double.MAX_VALUE,1,0.0);
double p = TableLayout.PREFERRED;
double f = TableLayout.FILL;
double d = TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH;
double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH;
double s = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH;
double[] rowSize = {p,p,p};
double[] columnSize = {d, e};
double[] column = {d, s};
Component[][] comps = new Component[][]{
new Component[]{null, null},
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Zoom_Layer")), zoomLevel},
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_View_Center")), viewCenterCom},
};
final JPanel northPane = TableLayout4VanChartHelper.createGapTableLayoutPane(comps,rowSize,columnSize);
Component[][] longAndLatComps = new Component[][]{
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Longitude")), longitude},
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Latitude")), latitude}
};
longAndLatPane =TableLayout4VanChartHelper.createGapTableLayoutPane(longAndLatComps,rowSize,column);
longAndLatPane.setBorder(BorderFactory.createEmptyBorder(0,12,0,0));
longAndLatPane.setVisible(false);
JPanel contentPane = new JPanel(new BorderLayout(0, 6)){
@Override
public Dimension getPreferredSize() {
if(longAndLatPane.isVisible()) {
return super.getPreferredSize();
} else {
return northPane.getPreferredSize();
}
}
};
contentPane.add(northPane, BorderLayout.NORTH);
contentPane.add(longAndLatPane, BorderLayout.CENTER);
viewCenterCom.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
longAndLatPane.setVisible(!isAutoViewCenter());
}
});
return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Map_Init_Status"), contentPane);
protected void initGeoUrlPane() {
geoUrlPane = new GeoUrlPane();
}
private boolean isAutoViewCenter() {
return viewCenterCom.getSelectedIndex()==0;
private void initGisLayerPane() {
gisLayerPane = new GisLayerPane();
gisLayerPane.registerZoomLevel(mapStatusPane.getZoomLevel());
}
private PopupMenuListener popupMenuListener = new PopupMenuListener() {
public void popupMenuCanceled(PopupMenuEvent e) {
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
}
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
GEOJSONTreeHelper.reset();
mapDataTree.changeRootNode(VanChartMapSourceChoosePane.this.getRootNode());
GEOJSONTreeHelper.getInstance().updateParamRootNode(VanChartMapSourceChoosePane.this.getParams());
if(selectTreePath != null){
mapDataTree.setSelectNodePath(CompatibleGEOJSONHelper.completeJSONName(selectTreePath.getLastPathComponent().toString()));
selectTreePath = mapDataTree.getSelectionPath();
}
mapDataTree.updateUI();//因为服务器那边可能随时编辑,所以这边要重画
mapDataTree.setSelectionPath(selectTreePath);
mapDataTree.scrollPathToVisible(selectTreePath);
}
};
private void checkLayerCardPane() {
CardLayout cardLayout = (CardLayout) layerCardPane.getLayout();
cardLayout.show(layerCardPane, Utils.objectToString(gisLayer.getSelectedItem()));
private void initMapStatusPane() {
mapStatusPane = new MapStatusPane();
}
public void resetComponentValue(VanChartMapPlot mapPlot) {
resetComponentValue(mapPlot, true);
geoUrlPane.resetComponentValue(mapPlot, true);
//重置图层属性
resetGisLayer(mapPlot);
gisLayerPane.resetGisLayer(mapPlot);
//重置缩放等级
resetZoomLevel(mapPlot);
mapStatusPane.resetZoomLevel(mapPlot);
//重置中心点位置
resetViewCenter(mapPlot);
mapStatusPane.resetViewCenter(mapPlot);
}
protected void resetComponentValue(VanChartMapPlot mapPlot, boolean samePlotChange) {
MapType mapType = mapPlot.getMapType();
//获取最新的参数
String[] params = getParams();
if (!ComparatorUtils.equals(oldParams, params)){
oldParams = params;
GEOJSONTreeHelper.getInstance().updateParamRootNode(params);
}
mapDataTree.changeRootNode(this.getRootNode());
if(samePlotChange) {
String nodePath = ChartGEOJSONHelper.getDefaultJSONURL();
mapPlot.setGeoUrl(nodePath);
mapDataTree.setSelectNodePath(nodePath);
selectTreePath = mapDataTree.getSelectionPath();
sourceComboBox.setSelectedItem(selectTreePath);
}
switch (mapType){
case CUSTOM:
sourceTitleLabel.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Map_Area_And_Point"));
break;
case POINT:
sourceTitleLabel.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Map_Point"));
break;
case LINE:
sourceTitleLabel.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Map_Point"));
break;
default:
sourceTitleLabel.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Map_Area"));
}
}
private String[] getParams() {
JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
if (jTemplate == null){
return new String[0];
}
return getParamsName((jTemplate.getJTemplateParameters()));
}
private String[] getParamsName(Parameter[] parameters) {
String[] names = new String[parameters.length];
for (int i = 0; i < parameters.length; i++){
names[i] = parameters[i].getName();
}
return names;
}
private void resetViewCenter(VanChartMapPlot mapPlot) {
mapPlot.setViewCenter(new ViewCenter());
viewCenterCom.setSelectedIndex(0);
longitude.setValue(0);
latitude.setValue(0);
longAndLatPane.setVisible(false);
}
private void resetZoomLevel(VanChartMapPlot mapPlot) {
mapPlot.setZoomLevel(ZoomLevel.AUTO);
zoomLevel.setSelectedItem(mapPlot.getZoomLevel());
}
private void resetGisLayer(VanChartMapPlot mapPlot) {
//TODO Bjorn 地图gis图层自动逻辑
/* mapPlot.getGisLayer().setGisLayerType(GISLayerType.AUTO);
mapPlot.getGisLayer().setLayerName(GISLayerType.getLocString(GISLayerType.AUTO));*/
String layerName = mapPlot.getDefaultGisLayerName();
mapPlot.getGisLayer().setGisLayerType(GISLayerType.PREDEFINED_LAYER);
mapPlot.getGisLayer().setLayerName(layerName);
gisLayer.setSelectedItem(mapPlot.getGisLayer().getShowItemName());
}
public void populateBean(VanChartMapPlot mapPlot) {
resetComponentValue(mapPlot, false);
mapDataTree.setSelectNodePath(mapPlot.getGeoUrl());
selectTreePath = mapDataTree.getSelectionPath();
if(selectTreePath == null){//此url当前环境没有
sourceComboBox.setSelectedItem(mapPlot.getGeoUrl());
} else {
sourceComboBox.setSelectedItem(selectTreePath);
}
GisLayer layer = mapPlot.getGisLayer();
gisLayer.setSelectedItem(layer.getShowItemName());
wmsUrl.setText(layer.getWmsUrl());
resetWMSLayerPane(layer.getWmsLayers());
customTileLayer.setText(layer.getCustomTileLayer());
attribution.setText(layer.getAttribution());
refreshZoomLevel();
zoomLevel.setSelectedItem(mapPlot.getZoomLevel());
ViewCenter viewCenter = mapPlot.getViewCenter();
if(viewCenter.isAuto()){
viewCenterCom.setSelectedIndex(0);
longitude.setValue(0);
latitude.setValue(0);
} else {
viewCenterCom.setSelectedIndex(1);
longitude.setValue(viewCenter.getLongitude());
latitude.setValue(viewCenter.getLatitude());
}
longAndLatPane.setVisible(!isAutoViewCenter());
checkLayerCardPane();
geoUrlPane.populate(mapPlot);
gisLayerPane.populate(mapPlot.getGisLayer());
mapStatusPane.populate(mapPlot);
}
public void updateBean(VanChartMapPlot mapPlot) {
if(!CompatibleGEOJSONHelper.isDeprecated(mapPlot.getGeoUrl())){
mapPlot.setGeoUrl(mapDataTree.getSelectNodeJSONPath());
}
GisLayer layer = mapPlot.getGisLayer();
String layerName = Utils.objectToString(gisLayer.getSelectedItem());
layer.setLayerName(layerName);
layer.setGisLayerType(MapLayerConfigManager.getGisLayerType(layerName));
switch (layer.getGisLayerType()){
case CUSTOM_WMS_LAYER:
layer.setWmsUrl(wmsUrl.getText());
layer.setWmsLayers(new ArrayList<WMSLayer>());
for(UICheckBox checkBox : wmsLayerCheckBoxs){
layer.addWmsLayer(new WMSLayer(checkBox.getText(), checkBox.isSelected()));
}
break;
case CUSTOM_TILE_LAYER:
layer.setCustomTileLayer(customTileLayer.getText());
layer.setAttribution(attribution.getText());
break;
if (!CompatibleGEOJSONHelper.isDeprecated(mapPlot.getGeoUrl())) {
mapPlot.setGeoUrl(geoUrlPane.update());
}
mapPlot.setZoomLevel((ZoomLevel) zoomLevel.getSelectedItem());
ViewCenter viewCenter = mapPlot.getViewCenter();
if(isAutoViewCenter()){
viewCenter.setAuto(true);
} else {
viewCenter.setAuto(false);
viewCenter.setLongitude(longitude.getValue());
viewCenter.setLatitude(latitude.getValue());
}
}
public UIComboBox getSourceComboBox(){
return this.sourceComboBox;
gisLayerPane.update(mapPlot.getGisLayer());
mapStatusPane.update(mapPlot);
}
}

165
designer-chart/src/main/java/com/fr/van/chart/map/designer/type/WMSLayerPane.java

@ -0,0 +1,165 @@
package com.fr.van.chart.map.designer.type;
import com.fr.decision.webservice.v10.map.WMSFactory;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.event.UIObserver;
import com.fr.design.event.UIObserverListener;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.itextarea.UITextArea;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.general.http.HttpClient;
import com.fr.plugin.chart.base.GisLayer;
import com.fr.plugin.chart.map.layer.WMSLayer;
import com.fr.van.chart.designer.TableLayout4VanChartHelper;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingWorker;
import java.util.ArrayList;
import java.util.List;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* @author Bjorn
* @version 10.0
* Created by Bjorn on 2020-12-07
*/
public class WMSLayerPane extends JPanel implements UIObserver {
private static final double[] COLUMN_SIZE = {48, TableLayout.FILL, TableLayout.PREFERRED};
private UITextArea wmsUrl;
private UIButton connectButton;
private JPanel wmsLayerPane;
private List<UICheckBox> wmsLayerCheckBoxs = new ArrayList<>();
private UIObserverListener listener;
@Override
public void registerChangeListener(UIObserverListener listener) {
this.listener = listener;
}
@Override
public boolean shouldResponseChangeListener() {
return true;
}
public WMSLayerPane() {
final double p = TableLayout.PREFERRED;
double[] rowSize = {p};
double[] COLUMN_SIZE = {TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH, 84, 44};
wmsUrl = new UITextArea();
connectButton = new UIButton(Toolkit.i18nText("Fine-Design_Chart_Connect_WMP"));
Component[][] comps = new Component[][]{
new Component[]{new UILabel("url"), wmsUrl, connectButton}
};
JPanel northPane = TableLayout4VanChartHelper.createGapTableLayoutPane(comps, rowSize, COLUMN_SIZE);
northPane.setBorder(TableLayout4VanChartHelper.SECOND_EDIT_AREA_BORDER);
wmsLayerPane = new JPanel(new BorderLayout());
resetWMSLayerPane(new ArrayList<>());
this.setLayout(new BorderLayout(0, 6));
this.add(northPane, BorderLayout.NORTH);
this.add(wmsLayerPane, BorderLayout.CENTER);
addListener();
}
private void addListener() {
connectButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new SwingWorker<Void, Double>() {
private java.util.List<WMSLayer> list = new ArrayList<>();
@Override
protected Void doInBackground() {
HttpClient httpClient = new HttpClient(wmsUrl.getText() + "service=WMS&request=GetCapabilities");
httpClient.asGet();
if (!httpClient.isServerAlive()) {
return null;
}
String res = httpClient.getResponseText();
List<String> layers = WMSFactory.readLayers(res);
list.clear();
for (String layer : layers) {
list.add(new WMSLayer(layer, false));
}
return null;
}
@Override
protected void done() {
connectButton.setText(Toolkit.i18nText("Fine-Design_Chart_Connect_WMP"));
if (list != null && list.size() > 0) {
resetWMSLayerPane(list);
} else {
FineJOptionPane.showMessageDialog(null, Toolkit.i18nText("Fine-Design_Chart_Invalid_WMS"));
}
}
}.execute();
}
});
connectButton.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
connectButton.setText(Toolkit.i18nText("Fine-Design_Chart_Connecting_WMP"));
}
});
}
private void resetWMSLayerPane(java.util.List<WMSLayer> wmsLayers) {
int size = wmsLayers.size();
double[] rowSize = new double[size];
Component[][] comps = new Component[size][2];
wmsLayerCheckBoxs.clear();
wmsLayerPane.removeAll();
for (int i = 0; i < size; i++) {
rowSize[i] = TableLayout.PREFERRED;
comps[i][0] = i == 0 ? new UILabel(Toolkit.i18nText("Fine-Design_Chart_WMS_Layers"), SwingConstants.RIGHT) : null;
WMSLayer layer = wmsLayers.get(i);
UICheckBox checkBox = new UICheckBox(layer.getLayer());
checkBox.registerChangeListener(listener);
checkBox.setToolTipText(layer.getLayer());
checkBox.setSelected(layer.isSelected());
comps[i][1] = checkBox;
wmsLayerCheckBoxs.add(checkBox);
}
wmsLayerPane.add(TableLayoutHelper.createCommonTableLayoutPane(comps, rowSize, COLUMN_SIZE, 0), BorderLayout.CENTER);
updateUI();
}
public void populate(GisLayer layer) {
wmsUrl.setText(layer.getWmsUrl());
resetWMSLayerPane(layer.getWmsLayers());
}
public void update(GisLayer layer) {
layer.setWmsUrl(wmsUrl.getText());
layer.setWmsLayers(new ArrayList<>());
for (UICheckBox checkBox : wmsLayerCheckBoxs) {
layer.addWmsLayer(new WMSLayer(checkBox.getText(), checkBox.isSelected()));
}
}
}

130
designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieCategoryLabelContentPane.java

@ -0,0 +1,130 @@
package com.fr.van.chart.pie.style;
import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane;
import com.fr.plugin.chart.base.AttrTooltipContent;
import com.fr.plugin.chart.base.AttrTooltipRichText;
import com.fr.plugin.chart.base.format.AttrTooltipFormat;
import com.fr.plugin.chart.pie.attr.PieCategoryLabelContent;
import com.fr.van.chart.designer.component.VanChartLabelContentPane;
import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithCheckBox;
import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithoutCheckBox;
import com.fr.van.chart.designer.component.format.SummaryValueFormatPaneWithCheckBox;
import com.fr.van.chart.designer.component.format.SummaryValueFormatPaneWithoutCheckBox;
import com.fr.van.chart.designer.component.format.VanChartFormatPaneWithoutCheckBox;
import com.fr.van.chart.designer.style.VanChartStylePane;
import javax.swing.JPanel;
import java.awt.Component;
/**
* @author Bjorn
* @version 10.0
* Created by Bjorn on 2020-12-10
*/
public class VanChartPieCategoryLabelContentPane extends VanChartLabelContentPane {
private SummaryValueFormatPaneWithCheckBox summaryValueFormatPane;
private SummaryValueFormatPaneWithoutCheckBox richTextSummaryValueFormatPane;
public VanChartPieCategoryLabelContentPane(VanChartStylePane parent, JPanel showOnPane, boolean inCondition) {
super(parent, showOnPane, inCondition);
}
@Override
protected JPanel getLabelContentPane(JPanel contentPane) {
return contentPane;
}
@Override
protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) {
setCategoryNameFormatPane(new CategoryNameFormatPaneWithCheckBox(parent, showOnPane));
summaryValueFormatPane = new SummaryValueFormatPaneWithCheckBox(parent, showOnPane);
}
@Override
protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) {
setRichTextCategoryNameFormatPane(new CategoryNameFormatPaneWithoutCheckBox(parent, showOnPane));
richTextSummaryValueFormatPane = new SummaryValueFormatPaneWithoutCheckBox(parent, showOnPane);
}
@Override
protected Component[][] getPaneComponents() {
return new Component[][]{
new Component[]{getCategoryNameFormatPane(), null},
new Component[]{summaryValueFormatPane, null},
};
}
@Override
protected Component[][] getRichTextComponents() {
return new Component[][]{
new Component[]{getRichTextCategoryNameFormatPane(), null},
new Component[]{richTextSummaryValueFormatPane, null},
};
}
@Override
protected double[] getRowSize(double p) {
return new double[]{p, p};
}
public JPanel createCommonStylePane() {
setTextAttrPane(new ChartTextAttrPane());
return getTextAttrPane();
}
@Override
protected void populateFormatPane(AttrTooltipContent attrTooltipContent) {
PieCategoryLabelContent pieCategoryLabelContent = (PieCategoryLabelContent) attrTooltipContent;
super.populateFormatPane(pieCategoryLabelContent);
summaryValueFormatPane.populate(pieCategoryLabelContent.getSummaryValueFormat());
}
protected void populateRichEditor(AttrTooltipContent attrTooltipContent) {
PieCategoryLabelContent pieCategoryLabelContent = (PieCategoryLabelContent) attrTooltipContent;
VanChartFormatPaneWithoutCheckBox[] formatPaneGroup = new VanChartFormatPaneWithoutCheckBox[]{
getRichTextCategoryNameFormatPane(),
richTextSummaryValueFormatPane
};
AttrTooltipFormat[] formatGroup = new AttrTooltipFormat[]{
pieCategoryLabelContent.getRichTextCategoryFormat(),
pieCategoryLabelContent.getRichTextSummaryValueFormat()
};
setRichTextAttr(new AttrTooltipRichText());
populateRichTextFormat(formatPaneGroup, formatGroup);
populateRichText(pieCategoryLabelContent.getRichTextAttr());
checkRichEditorState(pieCategoryLabelContent);
}
@Override
protected void updateFormatPane(AttrTooltipContent attrTooltipContent) {
PieCategoryLabelContent pieCategoryLabelContent = (PieCategoryLabelContent) attrTooltipContent;
super.updateFormatPane(pieCategoryLabelContent);
summaryValueFormatPane.update(pieCategoryLabelContent.getSummaryValueFormat());
}
protected void updateRichEditor(AttrTooltipContent attrTooltipContent) {
PieCategoryLabelContent pieCategoryLabelContent = (PieCategoryLabelContent) attrTooltipContent;
super.updateRichEditor(pieCategoryLabelContent);
richTextSummaryValueFormatPane.update(pieCategoryLabelContent.getRichTextSummaryValueFormat());
}
@Override
public void setDirty(boolean isDirty) {
getCategoryNameFormatPane().setDirty(isDirty);
summaryValueFormatPane.setDirty(isDirty);
}
@Override
public boolean isDirty() {
return getCategoryNameFormatPane().isDirty() || summaryValueFormatPane.isDirty();
}
protected AttrTooltipContent createAttrTooltip() {
return new PieCategoryLabelContent();
}
}

79
designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieValueLabelContentPane.java

@ -0,0 +1,79 @@
package com.fr.van.chart.pie.style;
import com.fr.van.chart.designer.component.VanChartLabelContentPane;
import com.fr.van.chart.designer.component.format.PercentFormatPaneWithCheckBox;
import com.fr.van.chart.designer.component.format.PercentFormatPaneWithoutCheckBox;
import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithCheckBox;
import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithoutCheckBox;
import com.fr.van.chart.designer.component.format.ValueFormatPaneWithCheckBox;
import com.fr.van.chart.designer.component.format.ValueFormatPaneWithoutCheckBox;
import com.fr.van.chart.designer.style.VanChartStylePane;
import javax.swing.JPanel;
import java.awt.Component;
/**
* @author Bjorn
* @version 10.0
* Created by Bjorn on 2020-12-09
*/
public class VanChartPieValueLabelContentPane extends VanChartLabelContentPane {
public VanChartPieValueLabelContentPane(VanChartStylePane parent, JPanel showOnPane, boolean inCondition) {
super(parent, showOnPane, inCondition);
}
@Override
protected JPanel getLabelContentPane(JPanel contentPane) {
return contentPane;
}
@Override
protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) {
setSeriesNameFormatPane(new SeriesNameFormatPaneWithCheckBox(parent, showOnPane));
setValueFormatPane(new ValueFormatPaneWithCheckBox(parent, showOnPane));
setPercentFormatPane(new PercentFormatPaneWithCheckBox(parent, showOnPane));
}
@Override
protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) {
setRichTextSeriesNameFormatPane(new SeriesNameFormatPaneWithoutCheckBox(parent, showOnPane));
setRichTextValueFormatPane(new ValueFormatPaneWithoutCheckBox(parent, showOnPane));
setRichTextPercentFormatPane(new PercentFormatPaneWithoutCheckBox(parent, showOnPane));
}
@Override
protected double[] getRowSize(double p) {
return new double[]{p, p, p};
}
@Override
protected Component[][] getPaneComponents() {
return new Component[][]{
new Component[]{getSeriesNameFormatPane(), null},
new Component[]{getValueFormatPane(), null},
new Component[]{getPercentFormatPane(), null},
};
}
@Override
protected Component[][] getRichTextComponents() {
return new Component[][]{
new Component[]{getRichTextSeriesNameFormatPane(), null},
new Component[]{getRichTextValueFormatPane(), null},
new Component[]{getRichTextPercentFormatPane(), null}
};
}
@Override
public void setDirty(boolean isDirty) {
getSeriesNameFormatPane().setDirty(isDirty);
getValueFormatPane().setDirty(isDirty);
getPercentFormatPane().setDirty(isDirty);
}
@Override
public boolean isDirty() {
return getSeriesNameFormatPane().isDirty() || getValueFormatPane().isDirty() || getPercentFormatPane().isDirty();
}
}

3
designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java

@ -1,7 +1,6 @@
package com.fr.design.mainframe;
import com.fr.base.GraphHelper;
import com.fr.base.ScreenResolution;
import com.fr.base.Utils;
import com.fr.base.iofile.attr.WatermarkAttr;
import com.fr.base.vcs.DesignerMode;
@ -49,7 +48,6 @@ public class FormDesignerUI extends ComponentUI {
private FormDesigner designer;
private SelectionModel selectionModel;
private Rectangle2D.Double back_or_selection_rect = new Rectangle2D.Double(0, 0, 0, 0);
private float time;
public FormDesignerUI() {
}
@ -71,7 +69,6 @@ public class FormDesignerUI extends ComponentUI {
@Override
public void paint(final Graphics g, JComponent c) {
XCreator rootComponent = designer.getRootComponent();
this.time = (float) designer.getResolution() / ScreenResolution.getScreenResolution();
AffineTransform at = new AffineTransform();
if (rootComponent.getParent() != null) {
at.translate(designer.getPaintX(), designer.getPaintY());

45
designer-form/src/main/java/com/fr/design/mainframe/template/info/JFormProcessInfo.java

@ -10,7 +10,10 @@ import com.fr.form.main.WidgetUtil;
import com.fr.form.ui.AbstractBorderStyleWidget;
import com.fr.form.ui.BaseChartEditor;
import com.fr.form.ui.CardSwitchButton;
import com.fr.form.ui.ElementCaseEditor;
import com.fr.form.ui.ElementCaseEditorProvider;
import com.fr.form.ui.LayoutBorderStyle;
import com.fr.form.ui.PaddingMargin;
import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WAbsoluteLayout;
import com.fr.form.ui.container.WLayout;
@ -18,7 +21,6 @@ import com.fr.general.ComparatorUtils;
import com.fr.json.JSONArray;
import com.fr.json.JSONObject;
import com.fr.report.cell.DefaultTemplateCellElement;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ -94,23 +96,40 @@ public class JFormProcessInfo extends TemplateProcessInfo<Form> {
private boolean hasTestECReport() {
ElementCaseEditorProvider[] elementCaseEditorProviders = this.template.getElementCases();
for (ElementCaseEditorProvider elementCaseEditorProvider : elementCaseEditorProviders) {
FormElementCaseProvider elementCase = elementCaseEditorProvider.getElementCase();
Iterator it = elementCase.cellIterator();
if (!it.hasNext()) {
if (isTestECReport(elementCaseEditorProvider)) {
return true;
}
while (it.hasNext()) {
DefaultTemplateCellElement ce = (DefaultTemplateCellElement) it.next();
Object value = ce.getValue();
if (isTestCell(value, ce.getStyle())) {
return true;
}
}
}
return false;
}
private boolean isTestECReport(ElementCaseEditorProvider elementCaseEditorProvider) {
FormElementCaseProvider elementCase = elementCaseEditorProvider.getElementCase();
if (!isTestElementCaseEditor((ElementCaseEditor) elementCaseEditorProvider)) {
return false;
}
Iterator it = elementCase.cellIterator();
if (!it.hasNext()) {
return true;
}
while (it.hasNext()) {
DefaultTemplateCellElement ce = (DefaultTemplateCellElement) it.next();
Object value = ce.getValue();
if (!isTestCell(value, ce.getStyle())) {
return false;
}
}
return true;
}
private boolean isTestElementCaseEditor(ElementCaseEditor editor) {
return editor.getToolBars().length == 0 && editor.getListenerSize() == 0
&& ComparatorUtils.equals(editor.getBorderStyle(), new LayoutBorderStyle())
&& ComparatorUtils.equals(editor.getMargin(), new PaddingMargin())
&& editor.getBackground() == null;
}
private boolean hasTestChart() {
final boolean[] hasTestChart = {false};
Form.traversalWidget(this.template.getContainer(), new WidgetGather() {
@ -226,7 +245,7 @@ public class JFormProcessInfo extends TemplateProcessInfo<Form> {
private void addComponentRemoveInfo(JSONObject jsonObject) {
String componentID = jsonObject.getString("componentID");
if (componentID == null){
if (componentID == null) {
return;
}
JSONObject info = componentProcessInfoMap.get(componentID);

4
designer-form/src/main/java/com/fr/design/widget/ui/designer/CheckBoxGroupDefinePane.java

@ -29,9 +29,9 @@ public class CheckBoxGroupDefinePane extends ButtonGroupDefinePane<CheckBoxGroup
protected void initComponents() {
super.initComponents();
dictPane = new DictionaryPane();
dictPane = new DictionaryPane(false);
}
@Override
public String title4PopupWindow() {
return "CheckBoxGroup";

33
designer-form/src/test/java/com/fr/design/mainframe/template/info/JFormProcessInfoTest.java

@ -1,5 +1,6 @@
package com.fr.design.mainframe.template.info;
import com.fr.base.background.ColorBackground;
import com.fr.chart.chartattr.ChartCollection;
import com.fr.form.main.Form;
import com.fr.form.ui.CardSwitchButton;
@ -21,6 +22,8 @@ import com.fr.report.worksheet.FormElementCase;
import org.junit.Assert;
import org.junit.Test;
import java.awt.Color;
/**
* Created by kerry on 2020-05-08
*/
@ -35,14 +38,36 @@ public class JFormProcessInfoTest {
wFitLayout.addWidget(editor);
form.setContainer(wFitLayout);
JFormProcessInfo jFormProcessInfo = new JFormProcessInfo(form);
boolean result1 = Reflect.on(jFormProcessInfo).call("hasTestECReport").get();
Assert.assertTrue(result1);
boolean result = Reflect.on(jFormProcessInfo).call("hasTestECReport").get();
Assert.assertTrue(result);
elementCase.addCellElement(new DefaultTemplateCellElement());
boolean result2 = Reflect.on(jFormProcessInfo).call("hasTestECReport").get();
Assert.assertTrue(result2);
result = Reflect.on(jFormProcessInfo).call("hasTestECReport").get();
Assert.assertTrue(result);
DefaultTemplateCellElement templateCellElement = new DefaultTemplateCellElement();
templateCellElement.setValue(123);
elementCase.addCellElement(templateCellElement);
result = Reflect.on(jFormProcessInfo).call("hasTestECReport").get();
Assert.assertFalse(result);
elementCase.removeCellElement(templateCellElement);
result = Reflect.on(jFormProcessInfo).call("hasTestECReport").get();
Assert.assertTrue(result);
editor.setBackground(ColorBackground.getInstance(Color.WHITE));
result = Reflect.on(jFormProcessInfo).call("hasTestECReport").get();
Assert.assertFalse(result);
editor.setBackground(null);
result = Reflect.on(jFormProcessInfo).call("hasTestECReport").get();
Assert.assertTrue(result);
}
@Test
public void testHasTestChart() {
Form form = new Form();

3
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java

@ -11,15 +11,14 @@ import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvi
import com.fr.general.ComparatorUtils;
import com.fr.general.http.HttpToolbox;
import com.fr.json.JSONArray;
import com.fr.json.JSONException;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.basic.version.Version;
import com.fr.plugin.basic.version.VersionIntervalType;
import com.fr.plugin.basic.version.VersionIntervalFactory;
import com.fr.stable.ArrayUtils;
import com.fr.stable.EncodeConstants;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

4
designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java

@ -456,7 +456,7 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane {
newAdd.clear();
for (int i = 0; i < cs; i++) {
for (int j = 0; j < rs; j++) {
TemplateCellElement cellElement = ePane.getEditingElementCase().getTemplateCellElement(c + i, r + j );
TemplateCellElement cellElement = ePane.getEditingElementCase().getTemplateCellElement(c + i, r + j);
if (cellElement != null && ((i + c) != 0 || (r + j) != 0)) {
String value = cellElement.toString();
if (!newAdd.contains(value) && !allColumnRow.contains(value)) {
@ -512,7 +512,7 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane {
private SmartJTablePaneAction a = new AbstractSmartJTablePaneAction(this, SmartInsertDBManipulationPane.this) {
@Override
public void doOk() {
((KeyColumnTableModel)keyColumnValuesTable.getModel()).refreshNameValueList((KeyColumnTableModel)model);
((KeyColumnTableModel) keyColumnValuesTable.getModel()).refreshNameValueList((KeyColumnTableModel) model);
}
@Override

331
designer-realize/src/main/java/com/fr/grid/GridUI.java

@ -49,6 +49,7 @@ import com.fr.stable.script.CalculatorUtils;
import com.fr.stable.unit.FU;
import com.fr.stable.AssistUtils;
import com.fr.third.antlr.ANTLRException;
import com.fr.third.guava.collect.HashMultimap;
import javax.swing.JComponent;
import javax.swing.UIManager;
@ -73,6 +74,7 @@ import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
public class GridUI extends ComponentUI {
@ -91,6 +93,7 @@ public class GridUI extends ComponentUI {
protected List paintCellElementList = new ArrayList();
protected List paintCellElementRectangleList = new ArrayList();
protected List paginateLineList = new ArrayList(); // 分页线
protected HashMultimap<CellPosition, Integer> mergeCellElementTable = HashMultimap.create();
// 为了画白色的背景.
protected static Background WHITE_Backgorund = ColorBackground.getInstance(Color.WHITE);
// CellElementPainter
@ -247,7 +250,7 @@ public class GridUI extends ComponentUI {
- reportSettings.getFooterHeight().toPixD(resolution);
}
private void paintGridLine(Graphics g, Grid grid, double realWidth, double realHeight,
private void paintGridLine(Graphics g, Grid grid, TemplateElementCase report, double realWidth, double realHeight,
int resolution) {
Graphics2D g2d = (Graphics2D) g;
@ -257,22 +260,51 @@ public class GridUI extends ComponentUI {
// 分页线
paginateLineList.clear();
// 合并单元格
mergeCellElementTable.clear();
boolean isShowVerticalPaginateLine = grid.getPaginateLineShowType() == Grid.MULTIPLE_PAGINATE_LINE;
boolean isShowHorizontalPaginateLine = grid.getPaginateLineShowType() != Grid.NO_PAGINATE_LINE;
new DrawVerticalLineHelper(grid.getVerticalBeginValue(), verticalEndValue,
grid.isShowGridLine(), isShowVerticalPaginateLine, rowHeightList, paperPaintHeight,
paginateLineList, realWidth, resolution).iterateStart2End(g2d);
Iterator cells = report.intersect(grid.getHorizontalBeginValue(), grid.getVerticalBeginValue(),
horizontalEndValue - grid.getHorizontalBeginValue(), verticalEndValue - grid.getVerticalBeginValue());
while (cells.hasNext()) {
TemplateCellElement cellElement = (TemplateCellElement) cells.next();
if (cellElement == null) {
continue;
}
int columnSpan = cellElement.getColumnSpan();
int rowSpan = cellElement.getRowSpan();
if (columnSpan > 1 || rowSpan > 1) {
for (int c = 0; c < columnSpan - 1; c++) {
for (int r = 0; r < rowSpan; r++) {
mergeCellElementTable.put(CellPosition.value(cellElement.getRow() + r, cellElement.getColumn() + c), CellPosition.RIGHT);
}
}
for (int r = 0; r < rowSpan - 1; r++) {
for (int c = 0; c < columnSpan; c++) {
mergeCellElementTable.put(CellPosition.value(cellElement.getRow() + r, cellElement.getColumn() + c), CellPosition.BOTTOM);
}
}
}
}
GridRange gridRange = GridRange.range(grid.getHorizontalBeginValue(), horizontalEndValue, grid.getVerticalBeginValue(), verticalEndValue)
.rangeList(rowHeightList, columnWidthList)
.realSize(realWidth, realHeight);
new DrawVerticalLineHelper(gridRange, grid.isShowGridLine(),
isShowVerticalPaginateLine, paperPaintHeight,
paginateLineList, resolution).iterateStart2End(g2d);
new DrawHorizontalLineHelper(grid.getHorizontalBeginValue(), horizontalEndValue,
grid.isShowGridLine(), isShowHorizontalPaginateLine, columnWidthList, paperPaintWidth,
paginateLineList, realHeight, resolution).iterateStart2End(g2d);
new DrawHorizontalLineHelper(gridRange, grid.isShowGridLine(),
isShowHorizontalPaginateLine, paperPaintWidth,
paginateLineList, resolution).iterateStart2End(g2d);
}
/**
* 最后处理
*/
@Override
public void finalize() {
try {
super.finalize();
@ -285,80 +317,34 @@ public class GridUI extends ComponentUI {
}
private static abstract class DrawLineHelper {
private int startIndex;
private int endIndex;
protected GridRange gridRange;
private boolean showGridLine;
private boolean showPaginateLine;
protected boolean showGridLine;
protected boolean showPaginateLine;
private DynamicUnitList sizeList;
private double paperPaintSize;
protected double paperPaintSize;
private List paginateLineList;
protected List paginateLineList;
Line2D tmpLine2D = new Line2D.Double(0, 0, 0, 0);
private int resolution;
protected int resolution;
private static final double THRESHOLD = 1.0E-4D;
protected static final double THRESHOLD = 1.0E-4D;
DrawLineHelper(int startIndex, int endIndex, boolean showGridLine,
boolean showPaginateLine, DynamicUnitList sizeList, double paperPaintSize,
DrawLineHelper(GridRange gridRange, boolean showGridLine,
boolean showPaginateLine, double paperPaintSize,
List paginateLineList, int resolution) {
this.startIndex = startIndex;
this.endIndex = endIndex;
this.gridRange = gridRange;
this.showGridLine = showGridLine;
this.showPaginateLine = showPaginateLine;
this.sizeList = sizeList;
this.paperPaintSize = paperPaintSize;
this.paginateLineList = paginateLineList;
this.resolution = resolution;
}
protected void iterateStart2End(Graphics2D g2d) {
float tmpSize = 0, paperSumSize = 0, sumSize = 0;
for (int i = 0; i <= endIndex; i++) {
// denny: 开始
if (i == 0) {
i = startIndex;
// denny: 增加从0到Grid左边被hide的列宽
for (int k = 0; k < startIndex; k++) {
tmpSize = sizeList.get(k).toPixF(resolution);
paperSumSize += tmpSize;
if (paperSumSize >= paperPaintSize) {
paperSumSize = tmpSize;
}
}
}
// adjust height.
tmpSize = sizeList.get(i).toPixF(resolution);
paperSumSize += tmpSize;
if (showGridLine) {// paint line.
setLine2D((int) sumSize);
g2d.draw(tmpLine2D);
}
// paint paper margin line.
if (showPaginateLine && paperSumSize - paperPaintSize > THRESHOLD) {
paginateLineList.add(getPaginateLine2D((int) sumSize));
paperSumSize = tmpSize;
}
sumSize += tmpSize;
}
// paint 最后一个横线..
if (showGridLine) {
drawLastLine(g2d, (int) sumSize);
}
}
protected abstract void setLine2D(int sumSize);
protected abstract void iterateStart2End(Graphics2D g2d);
protected abstract Line2D.Double getPaginateLine2D(int sumSize);
@ -366,14 +352,12 @@ public class GridUI extends ComponentUI {
}
private class DrawVerticalLineHelper extends DrawLineHelper {
private double realWidth;
DrawVerticalLineHelper(int startIndex, int endIndex, boolean showGridLine,
boolean showPaginateLine, DynamicUnitList unitSizeList, double paperPaintSize,
List paginateLineList, double realWidth, int resolution) {
super(startIndex, endIndex, showGridLine, showPaginateLine, unitSizeList,
DrawVerticalLineHelper(GridRange gridRange, boolean showGridLine,
boolean showPaginateLine, double paperPaintSize,
List paginateLineList, int resolution) {
super(gridRange, showGridLine, showPaginateLine,
paperPaintSize, paginateLineList, resolution);
this.realWidth = realWidth;
}
@Override
@ -382,25 +366,58 @@ public class GridUI extends ComponentUI {
}
@Override
protected void setLine2D(int sumHeight) {
tmpLine2D.setLine(0, sumHeight, realWidth, sumHeight);
protected void drawLastLine(Graphics2D g2d, int sumHeight) {
GraphHelper.drawLine(g2d, 0, sumHeight, gridRange.realWidth, sumHeight);
}
@Override
protected void drawLastLine(Graphics2D g2d, int sumHeight) {
GraphHelper.drawLine(g2d, 0, sumHeight, realWidth, sumHeight);
protected void iterateStart2End(Graphics2D g2d) {
float rowHeight, paperYAxisSumSize = 0, yAxisSumSize = 0;
for (int i = 0; i <= gridRange.yEndIndex; i++) {
if (i == 0) {
i = gridRange.yBeginIndex;
for (int k = 0; k < gridRange.yBeginIndex; k++) {
rowHeight = gridRange.rowHeightList.get(k).toPixF(resolution);
paperYAxisSumSize += rowHeight;
if (paperYAxisSumSize >= paperPaintSize) {
paperYAxisSumSize = rowHeight;
}
}
}
rowHeight = gridRange.rowHeightList.get(i).toPixF(resolution);
paperYAxisSumSize += rowHeight;
if (showGridLine) {
float columnWidth, xAxisSumSize = 0;
for (int j = gridRange.xBeginIndex; j <= gridRange.xEndIndex; j++) {
columnWidth = gridRange.columnWidthList.get(j).toPixF(resolution);
if (!mergeCellElementTable.get(CellPosition.value(i - 1, j)).contains(CellPosition.BOTTOM)) {
tmpLine2D.setLine(xAxisSumSize, yAxisSumSize, xAxisSumSize + columnWidth, yAxisSumSize);
g2d.draw(tmpLine2D);
}
xAxisSumSize += columnWidth;
}
}
if (showPaginateLine && paperYAxisSumSize - paperPaintSize > THRESHOLD) {
paginateLineList.add(getPaginateLine2D((int) yAxisSumSize));
paperYAxisSumSize = rowHeight;
}
yAxisSumSize += rowHeight;
}
// paint 最后一个横线..
if (showGridLine) {
drawLastLine(g2d, (int) yAxisSumSize);
}
}
}
private class DrawHorizontalLineHelper extends DrawLineHelper {
private double realHeight;
DrawHorizontalLineHelper(int startIndex, int endIndex, boolean showGridLine,
boolean showPaginateLine, DynamicUnitList unitSizeList, double paperPaintSize,
List paginateLineList, double realHeight, int resolution) {
super(startIndex, endIndex, showGridLine, showPaginateLine, unitSizeList,
DrawHorizontalLineHelper(GridRange gridRange, boolean showGridLine,
boolean showPaginateLine, double paperPaintSize,
List paginateLineList, int resolution) {
super(gridRange, showGridLine, showPaginateLine,
paperPaintSize, paginateLineList, resolution);
this.realHeight = realHeight;
}
@Override
@ -409,13 +426,47 @@ public class GridUI extends ComponentUI {
}
@Override
protected void setLine2D(int sumWidth) {
tmpLine2D.setLine(sumWidth, 0, sumWidth, realHeight);
protected void drawLastLine(Graphics2D g2d, int sumWidth) {
GraphHelper.drawLine(g2d, sumWidth, 0, sumWidth, gridRange.realHeight);
}
@Override
protected void drawLastLine(Graphics2D g2d, int sumWidth) {
GraphHelper.drawLine(g2d, sumWidth, 0, sumWidth, realHeight);
protected void iterateStart2End(Graphics2D g2d) {
float columnWidth, paperXAxisSumSize = 0, xAxisSumSize = 0;
for (int i = 0; i <= gridRange.xEndIndex; i++) {
if (i == 0) {
i = gridRange.xBeginIndex;
for (int k = 0; k < gridRange.xBeginIndex; k++) {
columnWidth = gridRange.columnWidthList.get(k).toPixF(resolution);
paperXAxisSumSize += columnWidth;
if (paperXAxisSumSize >= paperPaintSize) {
paperXAxisSumSize = columnWidth;
}
}
}
columnWidth = gridRange.columnWidthList.get(i).toPixF(resolution);
paperXAxisSumSize += columnWidth;
if (showGridLine) {
float rowHeight, yAxisSumSize = 0;
for (int j = gridRange.yBeginIndex; j <= gridRange.yEndIndex; j++) {
rowHeight = gridRange.rowHeightList.get(j).toPixF(resolution);
if (!mergeCellElementTable.get(CellPosition.value(j, i - 1)).contains(CellPosition.RIGHT)) {
tmpLine2D.setLine(xAxisSumSize, yAxisSumSize, xAxisSumSize, yAxisSumSize + rowHeight);
g2d.draw(tmpLine2D);
}
yAxisSumSize += rowHeight;
}
}
if (showPaginateLine && paperXAxisSumSize - paperPaintSize > THRESHOLD) {
paginateLineList.add(getPaginateLine2D((int) xAxisSumSize));
paperXAxisSumSize = columnWidth;
}
xAxisSumSize += columnWidth;
}
// paint 最后一个横线..
if (showGridLine) {
drawLastLine(g2d, (int) xAxisSumSize);
}
}
}
@ -482,18 +533,6 @@ public class GridUI extends ComponentUI {
// peter:tmpRectangle2D_3只是一个临时的Rectangle2D,由于后面不少地方需要用到这个矩形
this.cell_back_rect.setRect(0, 0, this.tmpRectangle.getWidth() - 1,
this.tmpRectangle.getHeight() - 1.5);
// peter:对于合并的单元格,需要先白色的背景来清除背景.
if (tmpCellElement.getColumnSpan() > 1 || tmpCellElement.getRowSpan() > 1) {
// REPORT-23492 要看下是否设置了纸张背景 如果设置了按照背景来画
ReportSettingsProvider reportSettings = getReportSettings(report);
Background currentBackground = reportSettings.getBackground();
if (currentBackground != null) {
currentBackground.paint(g2d, this.cell_back_rect);
} else {
WHITE_Backgorund.paint(g2d, this.cell_back_rect);
}
//daniel:上面这里就有问题了啊....报表的背景在这个之前画的 会覆盖报表背景....不过只是设计器中看到预览浏览没问题
}
// peter:将这个元素添加到需要paint的元素列表当中去,留着画边框线..
paintCellElementList.add(tmpCellElement);
paintCellElementRectangleList.add(this.tmpRectangle.clone());
@ -1093,8 +1132,7 @@ public class GridUI extends ComponentUI {
this.paintBackground(g2d, grid, elementCase, resolution);
// 画Grid Line
this.paintGridLine(g2d, grid, realWidth, realHeight, resolution);
this.paintGridLine(g2d, grid, elementCase, realWidth, realHeight, resolution);
// peter:添上线程的支持,有时候,paint元素的时候,可能会有元素被删除了.
// 需要先清除画Border需要的元素.
paintCellElementList.clear();
@ -1277,4 +1315,101 @@ public class GridUI extends ComponentUI {
paginateLineList.add(new Line2D.Double(0, sumHeight, width, sumHeight));
}
}
/**
* 描述单元格位置的POJO
*/
private static class CellPosition {
public final static int TOP = 0;
public static final int LEFT = 1;
public final static int BOTTOM = 2;
public static final int RIGHT = 4;
public int x;
public int y;
public CellPosition(int x, int y) {
this.x = x;
this.y = y;
}
public static CellPosition value(int x, int y) {
return new CellPosition(x, y);
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
CellPosition that = (CellPosition) o;
return x == that.x && y == that.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
}
/**
* 描述表格范围的POJO
* x轴为水平方向对应的宽度表为列宽列表
* y轴为垂直方向对应的宽度表为行高列表
*/
private static class GridRange {
public int xBeginIndex;
public int xEndIndex;
public int yBeginIndex;
public int yEndIndex;
double realWidth;
double realHeight;
/**
* 行高列表对应y方向线段
*/
public DynamicUnitList rowHeightList;
/**
* 列宽列表对应x方向线段
*/
public DynamicUnitList columnWidthList;
public GridRange(int xBeginIndex, int xEndIndex, int yBeginIndex, int yEndIndex) {
this.xBeginIndex = xBeginIndex;
this.xEndIndex = xEndIndex;
this.yBeginIndex = yBeginIndex;
this.yEndIndex = yEndIndex;
}
/**
* 设置行高列宽列表
*
* @param rowHeightList 行高列表
* @param columnWidthList 列宽列表
*/
public GridRange rangeList(DynamicUnitList rowHeightList, DynamicUnitList columnWidthList) {
this.rowHeightList = rowHeightList;
this.columnWidthList = columnWidthList;
return this;
}
/**
* 设置表格真实宽高
*
* @param realWidth 宽度
* @param realHeight 高度
*/
public GridRange realSize(double realWidth, double realHeight) {
this.realWidth = realWidth;
this.realHeight = realHeight;
return this;
}
public static GridRange range(int xBeginIndex, int xEndIndex, int yBeginIndex, int yEndIndex) {
return new GridRange(xBeginIndex, xEndIndex, yBeginIndex, yEndIndex);
}
}
}

1
designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java

@ -71,6 +71,7 @@ public class DesignerWorkspaceProvider extends Activator {
} catch (Exception e) {
FineLoggerFactory.getLogger().warn("Check Service Failed");
}
EnvChangeEntrance.getInstance().pluginErrorRemind(selectEnv);
}
});
}

25
designer-realize/src/test/java/com.fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManagerTest.java

@ -0,0 +1,25 @@
package com.fr.design.mainframe.alphafine.search.manager.impl;
import com.fr.invoke.Reflect;
import org.junit.Assert;
import org.junit.Test;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2020/12/17
*/
public class PluginSearchManagerTest {
@Test
public void testIsCompatibleCurrentEnv() {
Assert.assertFalse(Reflect.on(PluginSearchManager.class).call("isCompatibleCurrentEnv", "~9.0").get());
Assert.assertTrue(Reflect.on(PluginSearchManager.class).call("isCompatibleCurrentEnv", "9.0").get());
Assert.assertTrue(Reflect.on(PluginSearchManager.class).call("isCompatibleCurrentEnv", "9~").get());
Assert.assertTrue(Reflect.on(PluginSearchManager.class).call("isCompatibleCurrentEnv", "10").get());
Assert.assertFalse(Reflect.on(PluginSearchManager.class).call("isCompatibleCurrentEnv", "11").get());
}
}
Loading…
Cancel
Save