diff --git a/.gitignore b/.gitignore
index 417bed08c8..b3c7613a58 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,14 @@
.DS_Store
.classpath
.project
+.gradle
target/
+*/build
+
+designer-base/${web-inf-path}
+designer-chart/${web-inf-path}
+designer-form/${web-inf-path}
+designer-realize/${web-inf-path}
+
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000000..6446da4044
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,81 @@
+import org.gradle.plugins.ide.idea.model.IdeaLanguageLevel
+
+plugins {
+ id 'java'
+ id 'java-library'
+ id 'com.fr.common' version '1.0-SNAPSHOT'
+}
+
+// 模块参数
+ext {
+ frVersion = ""
+ outputPath = "build"
+ ignoreTestFailureSetting = true
+ languageLevelSetting = 1.8
+}
+
+applyGlobalConfigPathIfExist()
+
+if (versions.frVersion) {
+ frVersion = versions.frVersion
+}
+def frDevVersion = "DEV" + frVersion
+
+dependencies {
+ api project(':designer-base')
+ api project(':designer-chart')
+ api project(':designer-form')
+ api project(':designer-realize')
+}
+
+allprojects {
+ apply plugin: 'java'
+ apply plugin: 'java-library'
+ apply plugin: 'idea'
+
+ group 'com.fr.design'
+ version frDevVersion
+ sourceCompatibility = languageLevelSetting
+ targetCompatibility = languageLevelSetting
+
+ tasks.withType(JavaCompile) {
+ options.encoding = "UTF-8"
+ }
+
+ repositories {
+ mavenLocal()
+ }
+
+ idea {
+ module {
+ inheritOutputDirs = false
+ outputDir = file(outputPath +"/classes")
+ testOutputDir = file(outputPath +"/test-classes")
+ languageLevel = new IdeaLanguageLevel(sourceCompatibility)
+ targetBytecodeVersion = targetCompatibility
+ }
+ }
+
+ dependencies {
+ implementation 'com.fr.third:jxbrowser:6.23'
+ implementation 'com.fr.third:jxbrowser-mac:6.23'
+ implementation 'com.fr.third:jxbrowser-win64:6.23'
+ implementation 'com.fr.third.server:servlet-api:3.0'
+ implementation 'org.swingexplorer:swexpl:2.0.1'
+ implementation 'org.swingexplorer:swag:1.0'
+ implementation 'net.java.dev.jna:jna:5.4.0'
+ implementation 'org.apache.tomcat:tomcat-catalina:8.5.32'
+ implementation 'io.socket:socket.io-client:0.7.0'
+ implementation 'com.fr.third:fine-third:' + frVersion
+ implementation 'com.fr.core:fine-core:' + frDevVersion
+ implementation 'com.fr.activator:fine-activator:' + frVersion
+ implementation 'com.fr.datasource:fine-datasource:' + frVersion
+ implementation 'com.fr.decision:fine-decision:' + frVersion
+ implementation 'com.fr.schedule:fine-schedule:' + frVersion
+ implementation 'com.fr.report:fine-report-engine:' + frDevVersion
+ testImplementation 'org.easymock:easymock:3.5.1'
+ testImplementation 'org.powermock:powermock-module-junit4:1.7.1'
+ testImplementation 'org.powermock:powermock-api-easymock:1.7.1'
+ testImplementation 'junit:junit:4.12'
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/common/detect/CommonPortDetector.java b/designer-base/src/main/java/com/fr/common/detect/CommonPortDetector.java
new file mode 100644
index 0000000000..310e75dce0
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/common/detect/CommonPortDetector.java
@@ -0,0 +1,59 @@
+package com.fr.common.detect;
+
+import com.fr.concurrent.NamedThreadFactory;
+import com.fr.design.DesignerEnvManager;
+import com.fr.log.FineLoggerFactory;
+import com.fr.module.ModuleContext;
+import com.fr.web.WebSocketConfig;
+
+import java.net.Socket;
+import java.util.concurrent.ExecutorService;
+
+/**
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2020/3/10
+ */
+public class CommonPortDetector {
+
+ private static final CommonPortDetector INSTANCE = new CommonPortDetector();
+ private ExecutorService service = ModuleContext.getExecutor().newSingleThreadExecutor(new NamedThreadFactory("CommonPortDetector"));
+
+ public static CommonPortDetector getInstance() {
+ return INSTANCE;
+ }
+
+ public void execute() {
+ service.submit(new Runnable() {
+ @Override
+ public void run() {
+ detectTomcatPort();
+ detectWebSocketPort();
+ }
+ });
+ }
+
+ private void detectTomcatPort() {
+ int port = DesignerEnvManager.getEnvManager().getEmbedServerPort();
+ if (checkPort(port)) {
+ FineLoggerFactory.getLogger().error("EmbedTomcat Port: {} is not available, maybe occupied by other programs, please check it!", port);
+ }
+ }
+
+ private void detectWebSocketPort() {
+ Integer[] ports = WebSocketConfig.getInstance().getPort();
+ for (int port : ports) {
+ if (checkPort(port)) {
+ FineLoggerFactory.getLogger().error("WebSocKet Port: {} is not available, maybe occupied by other programs, please check it!", port);
+ }
+ }
+ }
+
+ private boolean checkPort(int port) {
+ try (Socket socket = new Socket("localhost", port)) {
+ return true;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/common/report/ReportState.java b/designer-base/src/main/java/com/fr/common/report/ReportState.java
new file mode 100644
index 0000000000..cc32e439cf
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/common/report/ReportState.java
@@ -0,0 +1,21 @@
+package com.fr.common.report;
+
+/**
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2020/3/27
+ */
+public enum ReportState {
+
+ STOP("stop"), ACTIVE("active");
+
+ private String value;
+
+ ReportState(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return this.value;
+ }
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java
index 6ebd349cbb..88d2625d02 100644
--- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java
+++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java
@@ -8,17 +8,22 @@ import com.fr.base.Utils;
import com.fr.design.actions.help.alphafine.AlphaFineConfigManager;
import com.fr.design.constants.UIConstants;
import com.fr.design.data.DesignTableDataManager;
+import com.fr.design.dialog.ErrorDialog;
import com.fr.design.env.DesignerWorkspaceGenerator;
import com.fr.design.env.DesignerWorkspaceInfo;
import com.fr.design.env.DesignerWorkspaceType;
import com.fr.design.env.LocalDesignerWorkspaceInfo;
import com.fr.design.env.RemoteDesignerWorkspaceInfo;
import com.fr.design.file.HistoryTemplateListPane;
+import com.fr.design.i18n.Toolkit;
import com.fr.design.locale.impl.ProductImproveMark;
import com.fr.design.mainframe.vcs.VcsConfigManager;
+import com.fr.design.notification.SnapChatConfig;
import com.fr.design.update.push.DesignerPushUpdateConfigManager;
import com.fr.design.style.color.ColorSelectConfigManager;
import com.fr.design.utils.DesignUtils;
+import com.fr.design.utils.DesignerPort;
+import com.fr.exit.DesignerExiter;
import com.fr.file.FILEFactory;
import com.fr.general.ComparatorUtils;
import com.fr.general.FRLogFormatter;
@@ -53,6 +58,7 @@ import javax.swing.SwingWorker.StateValue;
import java.awt.Color;
import java.awt.Rectangle;
import java.io.File;
+import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
@@ -81,6 +87,10 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
private static final String VERSION_80 = "80";
private static final int CACHINGTEMPLATE_LIMIT = 5;
private static final String WEB_NAME = "webapps";
+ /**
+ * 指定默认工作空间
+ */
+ public static final String DEFAULT_WORKSPACE_PATH = "fr.designer.workspace.default";
private static DesignerEnvManager designerEnvManager; // gui.
private String activationKey = null;
@@ -153,6 +163,11 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
* alphafine
*/
private AlphaFineConfigManager alphaFineConfigManager = AlphaFineConfigManager.getInstance();
+
+ /**
+ * 阅后即焚的配置项
+ */
+ private SnapChatConfig snapChatConfig = SnapChatConfig.getInstance();
private DesignerPushUpdateConfigManager designerPushUpdateConfigManager = DesignerPushUpdateConfigManager.getInstance();
@@ -192,6 +207,9 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
GeneralContext.setLocale(designerEnvManager.getLanguage());
try {
XMLTools.readFileXML(designerEnvManager, designerEnvManager.getDesignerEnvFile());
+ } catch (FileNotFoundException e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ XmlHandler.Self.handle(e);
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
@@ -340,6 +358,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
} catch (IOException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ XmlHandler.Self.handle(e);
} finally {
if (null != fileWriter) {
try {
@@ -554,6 +573,10 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
private String getDefaultenvPath(String installHome) {
+ String defaultWorkspacePath = System.getProperty(DEFAULT_WORKSPACE_PATH);
+ if (defaultWorkspacePath != null) {
+ return defaultWorkspacePath;
+ }
//这里需要转成反斜杠和生成默认路径一致
return new File(StableUtils.pathJoin(installHome, WEB_NAME, ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBINF_NAME)).getPath();
}
@@ -1396,6 +1419,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
/**
* 对国际化进行校验
* 非简繁英日韩的默认环境 设计器全部默认为英文版本
+ *
* @param locale
* @return
*/
@@ -1545,11 +1569,19 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
readDesignerPushUpdateAttr(reader);
} else if (name.equals(vcsConfigManager.XML_TAG)) {
readVcsAttr(reader);
+ } else if (DesignerPort.XML_TAG.equals(name)) {
+ readDesignerPort(reader);
+ }else if (name.equals(SnapChatConfig.XML_TAG)) {
+ readSnapChatConfig(reader);
} else {
readLayout(reader, name);
}
}
}
+
+ private void readSnapChatConfig(XMLableReader reader) {
+ reader.readXMLObject(this.snapChatConfig = SnapChatConfig.getInstance());
+ }
private void readAlphaFineAttr(XMLableReader reader) {
reader.readXMLObject(this.alphaFineConfigManager = AlphaFineConfigManager.getInstance());
@@ -1736,6 +1768,10 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
reader.readXMLObject(vcsConfigManager);
}
+ public void readDesignerPort(XMLableReader reader) {
+ reader.readXMLObject(DesignerPort.getInstance());
+ }
+
/**
* Write XML.
* The method will be invoked when save data to XML file.
@@ -1761,9 +1797,18 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
writeOpenDebug(writer);
writeDesignerPushUpdateAttr(writer);
writeVcsAttr(writer);
+ writeDesignerPort(writer);
+ writeSnapChatConfig(writer);
writer.end();
}
-
+
+ private void writeSnapChatConfig(XMLPrintWriter writer) {
+
+ if (this.snapChatConfig != null) {
+ this.snapChatConfig.writeXML(writer);
+ }
+ }
+
private void writeAlphaFineAttr(XMLPrintWriter writer) {
if (this.alphaFineConfigManager != null) {
this.alphaFineConfigManager.writeXML(writer);
@@ -2010,6 +2055,10 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
this.vcsConfigManager.writeXML(writer);
}
+ private void writeDesignerPort(XMLPrintWriter writer) {
+ DesignerPort.getInstance().writeXML(writer);
+ }
+
public VcsConfigManager getVcsConfigManager() {
return vcsConfigManager;
@@ -2018,4 +2067,28 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
public void setVcsConfigManager(VcsConfigManager vcsConfigManager) {
this.vcsConfigManager = vcsConfigManager;
}
+
+ enum XmlHandler {
+ Self;
+ public void handle(Throwable throwable) {
+ ErrorDialog dialog = new ErrorDialog(null,
+ Toolkit.i18nText("Fine-Design_Error_Start_Apology_Message"),
+ Toolkit.i18nText("Fine-Design_Error_Start_Report"),
+ throwable.getMessage()) {
+ @Override
+ protected void okEvent() {
+ dispose();
+ DesignerExiter.getInstance().execute();
+ }
+
+ @Override
+ protected void restartEvent() {
+ dispose();
+ RestartHelper.restart();
+ }
+ };
+ dialog.setVisible(true);
+ DesignerExiter.getInstance().execute();
+ }
+ };
}
diff --git a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java
index c1c11553f7..ce495cdb97 100644
--- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java
+++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java
@@ -1,45 +1,68 @@
package com.fr.design;
+import com.fr.common.report.ReportState;
import com.fr.design.data.DesignTableDataManager;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.DialogActionAdapter;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.env.DesignerWorkspaceGenerator;
import com.fr.design.env.DesignerWorkspaceInfo;
import com.fr.design.env.DesignerWorkspaceType;
+import com.fr.design.env.RemoteDesignerWorkspaceInfo;
+import com.fr.design.env.RemoteWorkspace;
import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.TemplateTreePane;
import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.JTemplate;
import com.fr.design.utils.DesignUtils;
+import com.fr.env.CheckServiceDialog;
import com.fr.env.EnvListPane;
-import com.fr.general.GeneralContext;
+import com.fr.exit.DesignerExiter;
+import com.fr.general.GeneralUtils;
+import com.fr.invoke.Reflect;
+import com.fr.json.JSONArray;
import com.fr.license.exception.RegistEditionException;
+import com.fr.locale.InterProviderFactory;
import com.fr.log.FineLoggerFactory;
+import com.fr.process.ProcessEventPipe;
+import com.fr.process.engine.core.CarryMessageEvent;
+import com.fr.process.engine.core.FineProcessContext;
+import com.fr.rpc.Result;
import com.fr.stable.AssistUtils;
-import com.fr.stable.EnvChangedListener;
+import com.fr.stable.StringUtils;
import com.fr.start.server.ServerTray;
import com.fr.workspace.WorkContext;
import com.fr.workspace.WorkContextCallback;
import com.fr.workspace.Workspace;
+import com.fr.workspace.base.WorkspaceAPI;
import com.fr.workspace.connect.WorkspaceConnectionInfo;
+import com.fr.workspace.engine.base.FineObjectPool;
import com.fr.workspace.engine.channel.http.FunctionalHttpRequest;
import com.fr.workspace.engine.exception.WorkspaceAuthException;
+import com.fr.workspace.engine.exception.WorkspaceConnectionException;
+import com.fr.workspace.engine.rpc.WorkspaceProxyPool;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
+import java.lang.reflect.Method;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
+import java.util.Set;
+import java.util.HashSet;
import static javax.swing.JOptionPane.ERROR_MESSAGE;
import static javax.swing.JOptionPane.QUESTION_MESSAGE;
public class EnvChangeEntrance {
- private String currentEnvName = "";
-
public static EnvChangeEntrance getInstance() {
return HOLDER.singleton;
}
@@ -50,13 +73,7 @@ public class EnvChangeEntrance {
private EnvChangeEntrance() {
- currentEnvName = DesignerEnvManager.getEnvManager().getCurEnvName();
- GeneralContext.addEnvChangedListener(new EnvChangedListener() {
- @Override
- public void envChanged() {
- currentEnvName = DesignerEnvManager.getEnvManager().getCurEnvName();
- }
- });
+
}
private boolean envListOkAction(EnvListPane envListPane, PopTipStrategy strategy) {
@@ -83,6 +100,7 @@ public class EnvChangeEntrance {
private boolean switch2Env(final String envName, PopTipStrategy strategy) {
DesignerEnvManager envManager = DesignerEnvManager.getEnvManager();
DesignerWorkspaceInfo selectedEnv = envManager.getWorkspaceInfo(envName);
+ WorkspaceConnectionInfo connectionInfo = selectedEnv.getConnection();
try {
Workspace workspace = DesignerWorkspaceGenerator.generate(selectedEnv);
@@ -91,18 +109,13 @@ public class EnvChangeEntrance {
strategy.showTip(new PopTip() {
@Override
public void show() {
- JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Switch_Workspace_Failed"),
- UIManager.getString("OptionPane.messageDialogTitle"), ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon"));
+ FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Switch_Workspace_Failed"),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Error"), ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon"));
}
});
return false;
}
- // 如果版本不一致,且确认 不继续 连接,这里返回 false.
- if (!versionCheckAndConfirm(selectedEnv)) {
- return false;
- }
-
WorkContext.switchTo(workspace, new WorkContextCallback() {
@Override
public void done() {
@@ -115,20 +128,25 @@ public class EnvChangeEntrance {
}
}
});
+ // REPORT-25688如果是war包部署的服务器,给与提示
+ if (WorkContext.getCurrent().isWarDeploy()) {
+ FineJOptionPane.showMessageDialog(null, Toolkit.i18nText("Fine-Design_Basic_War_Deploy_Tip"),
+ Toolkit.i18nText("Fine-Design_Basic_Message"), JOptionPane.INFORMATION_MESSAGE);
+ }
//REPORT-13810如果只是添加了工作目录,没有切换,这里ToolArea也是要显示新建的工作目录
JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
if (template != null) {
template.refreshToolArea();
}
-
+ showServiceDialog(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");
strategy.showTip(new PopTip() {
@Override
public void show() {
- JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Switch_Workspace_Failed"),
- UIManager.getString("OptionPane.messageDialogTitle"), ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon"));
+ FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Switch_Workspace_Failed"),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Error"), ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon"));
}
});
return false;
@@ -137,8 +155,8 @@ public class EnvChangeEntrance {
strategy.showTip(new PopTip() {
@Override
public void show() {
- JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Switch_Workspace_Failed"),
- UIManager.getString("OptionPane.messageDialogTitle"), ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon"));
+ FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Switch_Workspace_Failed"),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Error"), ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon"));
}
});
@@ -153,6 +171,7 @@ public class EnvChangeEntrance {
}
/**
+ * 这个功能留着,可能会加回来,先做注释处理
* 切换远程环境之前,进行版本检测,当版本不一致的时候,提示。
* 当用户确认选择 ok 时,才继续。
*
@@ -196,6 +215,148 @@ public class EnvChangeEntrance {
return true;
}
+ /**
+ * 对选择的环境做服务检测
+ * @param selectedEnv 选择的工作环境
+ */
+ public void showServiceDialog(DesignerWorkspaceInfo selectedEnv) throws Exception {
+ //是否需要做服务校验
+ if(needCheckBranch(selectedEnv)) {
+ String localBranch;
+ String remoteBranch;
+ WorkspaceConnectionInfo connectionInfo = selectedEnv.getConnection();
+ localBranch = GeneralUtils.readFullBuildNO();
+ try {
+ remoteBranch = new FunctionalHttpRequest(connectionInfo).getServerBranch();
+ } catch (WorkspaceConnectionException e) {
+ remoteBranch = Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Branch_Is_Old") + formatBranch(localBranch);
+ }
+ //通过是否包含#来避免当前版本为非安装版本(主要是内部开发版本)
+ if (localBranch.contains("#") && localBranch.equals(remoteBranch)) {
+ //说明版本一致,仅做日志记录
+ FineLoggerFactory.getLogger().info("Remote Designer version consistency");
+ } else {
+ localBranch = GeneralUtils.getVersion();
+ remoteBranch = formatBranch(remoteBranch);
+ Set noExistServiceSet = getNoExistServiceSet(connectionInfo);
+ StringBuilder textBuilder = new StringBuilder();
+ for (Class clazz : noExistServiceSet) {
+ WorkspaceAPI workspaceAPI = (WorkspaceAPI) clazz.getAnnotation(WorkspaceAPI.class);
+ if(workspaceAPI == null){
+ FineLoggerFactory.getLogger().info("workspace service {} get annotation failed", clazz);
+ continue;
+ }
+ if(workspaceAPI.ignore()){
+ continue;
+ }
+ String descriptionOfCN = InterProviderFactory.getProvider().getLocText(workspaceAPI.description());
+ textBuilder.append(descriptionOfCN).append("\n");
+ }
+ String areaText = textBuilder.toString();
+ if(StringUtils.isEmpty(areaText)){
+ return;
+ }
+ CheckServiceDialog dialog = new CheckServiceDialog(DesignerContext.getDesignerFrame(), areaText, localBranch, remoteBranch);
+ dialog.setVisible(true);
+ }
+ }
+ }
+
+ /**
+ * 判断是否需要做版本验证,判断依据为
+ * 1、选择的环境为远程环境
+ * 2、一个月内不弹出是否勾选
+ * @param selectedEnv 选择的环境
+ * @return
+ */
+ private boolean needCheckBranch(DesignerWorkspaceInfo selectedEnv){
+ if(selectedEnv.getType() == DesignerWorkspaceType.Remote){
+ try {
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+ Calendar calendar = Calendar.getInstance();
+ if(StringUtils.isEmpty(selectedEnv.getRemindTime())){
+ return true;
+ }
+ //获取记录的时间
+ Date remindTime = format.parse(selectedEnv.getRemindTime());
+ calendar.setTime(remindTime);
+ //获取一个月后的时间
+ calendar.add(Calendar.MONTH,1);
+ //与当前时间作对比,然后判断是否提示
+ if(new Date().after(calendar.getTime())){
+ return true;
+ }
+ } catch (ParseException e) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 获取不存在的服务列表
+ * @param info 环境连接信息
+ * @return 以Set形式返回不存在的服务
+ */
+ public Set getNoExistServiceSet(WorkspaceConnectionInfo info){
+ Set noExistServiceSet = new HashSet();
+ Set remoteServiceSet = new HashSet();
+ Set localServiceSet = FineObjectPool.getInstance().getServerPool().keySet();
+
+ try {
+ JSONArray serviceArray = new FunctionalHttpRequest(info).getServiceList();
+ for(int i = 0; i < serviceArray.size(); i++){
+ try{
+ Class clazz = Class.forName((String) serviceArray.get(i));
+ remoteServiceSet.add(clazz);
+ } catch (Exception e){
+ continue;
+ }
+ }
+ noExistServiceSet.addAll(localServiceSet);
+ noExistServiceSet.removeAll(remoteServiceSet);
+ return noExistServiceSet;
+ } catch (WorkspaceConnectionException e) {
+ FineLoggerFactory.getLogger().info(e.getMessage());
+ //根据本地的服务列表做逐一检测
+ for(Class clazz : localServiceSet) {
+ Method testMethod = Reflect.on(Method.class).create(clazz, "connectTest", new Class[0], String.class, new Class[0], 1025, 8, null, null, null, null).get();
+ WorkspaceProxyPool proxyPool = (WorkspaceProxyPool) (((RemoteWorkspace) WorkContext.getCurrent()).getClient()).getPool();
+ Result result = proxyPool.testInvoker(testMethod);
+ Exception invokeException = (Exception) result.getException();
+ if(invokeException != null){
+ Exception cause = (Exception) invokeException.getCause();
+ //获取被包装最底层的异常
+ while (cause != null) {
+ invokeException = cause;
+ cause = (Exception) invokeException.getCause();
+ }
+ //该异常表示服务不存在
+ if(invokeException instanceof ClassNotFoundException){
+ noExistServiceSet.add(clazz);
+ }
+ }
+ }
+ return noExistServiceSet;
+ } catch (Exception e){
+ FineLoggerFactory.getLogger().error(e.getMessage(),e);
+ return noExistServiceSet;
+ }
+ }
+
+ /**
+ * 格式化分支版本号
+ * @param branch 初始的分支版本号
+ * @return 格式化后的版本号
+ */
+ private String formatBranch(String branch){
+ if(branch.contains("#")){
+ return branch.substring(branch.lastIndexOf("-") + 1, branch.length() - 13);
+ }
+ return branch;
+ }
+
+
/**
* 编辑items
*
@@ -211,15 +372,21 @@ public class EnvChangeEntrance {
* 出现对话框,选择使用的工作环境
*/
public void chooseEnv() {
+ chooseEnv(DesignerEnvManager.getEnvManager().getCurEnvName());
+ }
+
+ public void chooseEnv(final String envName) {
final EnvListPane envListPane = new EnvListPane();
final BasicDialog envListDialog = envListPane.showWindow(SwingUtilities.getWindowAncestor(DesignerContext.getDesignerFrame()));
- envListPane.populateEnvManager(currentEnvName);
+ envListPane.populateEnvManager(envName);
envListDialog.addDialogActionListener(new DialogActionAdapter() {
@Override
public void doOk() {
envListOkAction(envListPane, PopTipStrategy.LATER);
+ // 切换完成后清理密码
+ updateNotRememberPwdEnv();
}
@Override
@@ -235,26 +402,61 @@ public class EnvChangeEntrance {
* 处理异常
*/
public void dealEvnExceptionWhenStartDesigner() {
+ ProcessEventPipe eventPipe = FineProcessContext.getParentPipe();
+ if (eventPipe != null) {
+ eventPipe.fire(new CarryMessageEvent(ReportState.STOP.getValue()));
+ }
final EnvListPane envListPane = new EnvListPane();
- envListPane.populateEnvManager(currentEnvName);
+ envListPane.populateEnvManager(DesignerEnvManager.getEnvManager().getCurEnvName());
BasicDialog envListDialog = envListPane.showWindow(SwingUtilities.getWindowAncestor(DesignerContext.getDesignerFrame()));
envListDialog.addDialogActionListener(new DialogActionAdapter() {
@Override
public void doOk() {
+ FineProcessContext.getParentPipe().fire(new CarryMessageEvent(ReportState.ACTIVE.getValue()));
if (!envListOkAction(envListPane, PopTipStrategy.NOW)) {
- System.exit(0);
+ DesignerExiter.getInstance().execute();
+ } else {
+ updateNotRememberPwdEnv();
}
}
@Override
public void doCancel() {
- System.exit(0);
+ DesignerExiter.getInstance().execute();
}
});
envListDialog.setVisible(true);
}
+ /**
+ * 切换环境后 刷新远程目录需要忘记密码的情况
+ */
+ private void updateNotRememberPwdEnv() {
+ DesignerEnvManager mgr = DesignerEnvManager.getEnvManager();
+ Iterator iterator = mgr.getEnvNameIterator();
+
+ while (iterator.hasNext()) {
+ String envName = iterator.next();
+ DesignerWorkspaceInfo info = mgr.getWorkspaceInfo(envName);
+
+ if (isNotRememberPwd(info)) {
+ WorkspaceConnectionInfo connection = info.getConnection();
+ DesignerWorkspaceInfo workspaceInfo = RemoteDesignerWorkspaceInfo.create(new WorkspaceConnectionInfo(
+ connection.getUrl(), connection.getUserName(), StringUtils.EMPTY, connection.getCertPath(), connection.getCertSecretKey(), false));
+ mgr.putEnv(envName, workspaceInfo);
+ }
+ }
+ }
+
+ private boolean isNotRememberPwd(DesignerWorkspaceInfo info) {
+ if (info != null && info.getType() == DesignerWorkspaceType.Remote) {
+ WorkspaceConnectionInfo connection = info.getConnection();
+ return connection != null && !connection.isRememberPwd();
+ }
+ return false;
+ }
+
/**
* 提示显示策略
diff --git a/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java b/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java
index bd2e50d570..4aa48591fd 100644
--- a/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java
+++ b/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java
@@ -7,7 +7,15 @@ package com.fr.design;
import com.fr.base.BaseUtils;
import com.fr.common.annotations.Open;
import com.fr.design.data.datapane.TableDataNameObjectCreator;
-import com.fr.design.fun.*;
+import com.fr.design.fun.CellWidgetOptionProvider;
+import com.fr.design.fun.ChartWidgetOptionProvider;
+import com.fr.design.fun.FormWidgetOptionProvider;
+import com.fr.design.fun.MobileWidgetStyleProvider;
+import com.fr.design.fun.ParameterWidgetOptionProvider;
+import com.fr.design.fun.PreviewProvider;
+import com.fr.design.fun.ServerTableDataDefineProvider;
+import com.fr.design.fun.TableDataDefineProvider;
+import com.fr.design.fun.ToolbarItemProvider;
import com.fr.design.gui.core.WidgetOption;
import com.fr.design.gui.core.WidgetOptionFactory;
import com.fr.design.menu.ShortCut;
@@ -24,6 +32,7 @@ import com.fr.stable.Filter;
import com.fr.stable.plugin.ExtraDesignClassManagerProvider;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -127,21 +136,25 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement
}
public WidgetOption[] getWebWidgetOptions(Set set, Filter filter) {
- if (set == null || set.isEmpty()) {
- return new WidgetOption[0];
- }
- List list = new ArrayList<>();
- for (ToolbarItemProvider provider : set) {
- if (filter != null && filter.accept(provider)) {
- WidgetOption option = WidgetOptionFactory.createByWidgetClass(
+ return new DesignExtraBridge() {
+
+ @Override
+ WidgetOption createT(ToolbarItemProvider provider) {
+ return WidgetOptionFactory.createByWidgetClass(
provider.nameForWidget(),
IOUtils.readIcon(provider.iconPathForWidget()),
provider.classForWidget()
);
- list.add(option);
}
- }
- return list.toArray(new WidgetOption[list.size()]);
+
+ @Override
+ WidgetOption[] toArray(Collection> sCollection) {
+ if (sCollection == null) {
+ return new WidgetOption[0];
+ }
+ return sCollection.toArray(new WidgetOption[sCollection.size()]);
+ }
+ }.filterSAndTransformT(set, filter);
}
@@ -181,6 +194,42 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement
return result.toArray(new WidgetOption[result.size()]);
}
+ public Map, Class>> getChartWidgetOptionsMap() {
+ Set set = getArray(ChartWidgetOptionProvider.XML_TAG);
+ Map, Class>> map = new HashMap<>();
+ for (ChartWidgetOptionProvider provider : set) {
+ map.put(provider.classForWidget(), provider.appearanceForWidget());
+ }
+ return map;
+ }
+
+ public WidgetOption[] getBeforeChartWidgetOptions() {
+ return getChartUnits(true);
+ }
+
+ public WidgetOption[] getAfterChartWidgetOptions() {
+ return getChartUnits(false);
+ }
+
+ private WidgetOption[] getChartUnits(boolean isBefore) {
+ Set set = getArray(ChartWidgetOptionProvider.XML_TAG);
+ if (set.isEmpty()) {
+ return new WidgetOption[0];
+ }
+ Set result = new HashSet<>();
+ for (ChartWidgetOptionProvider provider : set) {
+ if (provider.isBefore() == isBefore) {
+ WidgetOption option = WidgetOptionFactory.createByWidgetClass(
+ provider.nameForWidget(),
+ BaseUtils.readIcon(provider.iconPathForWidget()),
+ provider.classForWidget()
+ );
+ result.add(option);
+ }
+ }
+ return result.toArray(new WidgetOption[result.size()]);
+ }
+
public WidgetOption[] getCellWidgetOptions() {
Set set = getArray(CellWidgetOptionProvider.XML_TAG);
@@ -224,8 +273,8 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement
return new MobileWidgetStyleProvider[0];
}
List providers = new ArrayList<>();
- for (MobileWidgetStyleProvider provider: set) {
- if(ComparatorUtils.equalsIgnoreCase(provider.xTypeForWidget(), xType)) {
+ for (MobileWidgetStyleProvider provider : set) {
+ if (ComparatorUtils.equalsIgnoreCase(provider.xTypeForWidget(), xType)) {
providers.add(provider);
}
}
@@ -256,4 +305,55 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement
return Collections.unmodifiableSet(shortCuts);
}
+
+ public PreviewProvider[] getTemplatePreviews(Filter filter) {
+ Set set = ExtraDesignClassManager.getInstance().getArray(PreviewProvider.MARK_STRING);
+ return new DesignExtraBridge() {
+
+ @Override
+ PreviewProvider createT(PreviewProvider previewProvider) {
+ return previewProvider;
+ }
+
+ @Override
+ PreviewProvider[] toArray(Collection> sCollection) {
+ if (sCollection == null) {
+ return new PreviewProvider[0];
+ }
+ return sCollection.toArray(new PreviewProvider[sCollection.size()]);
+ }
+ }.filterSAndTransformT(set, filter);
+ }
+
+ /**
+ * 抽了一个可能用到的公用逻辑出来:通过filter过滤接口实现(Set)并将对外接口实例转成内部实例S转成T,比如ToolItemProvider转成WidgetOption,当然也可以不转
+ *
+ * @param 你想要得到的类型,可以跟S相同
+ * @param 待转换的目标类型
+ */
+ abstract class DesignExtraBridge {
+ T[] filterSAndTransformT(Set set, Filter filter) {
+ if (set == null || set.isEmpty()) {
+ return toArray(set);
+ }
+ List list = new ArrayList<>();
+ for (S provider : set) {
+ if (filter == null || filter.accept(provider)) {
+ list.add(createT(provider));
+ }
+ }
+
+ return toArray(list);
+ }
+
+ /**
+ * S转T
+ * @param s
+ * @return
+ */
+ abstract T createT(S s);
+
+ abstract T[] toArray(Collection> sCollection);
+
+ }
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/RestartHelper.java b/designer-base/src/main/java/com/fr/design/RestartHelper.java
index cdb4fc532e..64fdda7baa 100644
--- a/designer-base/src/main/java/com/fr/design/RestartHelper.java
+++ b/designer-base/src/main/java/com/fr/design/RestartHelper.java
@@ -2,6 +2,7 @@ package com.fr.design;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.os.impl.RestartAction;
+import com.fr.exit.DesignerExiter;
import com.fr.general.ComparatorUtils;
import com.fr.general.GeneralUtils;
import com.fr.log.FineLoggerFactory;
@@ -152,7 +153,14 @@ public class RestartHelper {
} finally {
WorkContext.getCurrent().close();
frame.dispose();
- System.exit(0);
+ try {
+ // 更新升级过渡用 供当前测试 后面可删除
+ Class.forName("com.fr.exit.DesignerExiter");
+ DesignerExiter.getInstance().execute();
+ } catch (Exception ignore) {
+ } finally {
+ System.exit(0);
+ }
}
}
@@ -194,7 +202,11 @@ public class RestartHelper {
} catch (IOException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
- DesignerContext.getDesignerFrame().exit();
+ if (DesignerContext.getDesignerFrame() != null) {
+ DesignerContext.getDesignerFrame().exit();
+ } else {
+ DesignerExiter.getInstance().execute();
+ }
}
}
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/actions/TableDataSourceAction.java b/designer-base/src/main/java/com/fr/design/actions/TableDataSourceAction.java
index 6e627434d8..a0ca4d9558 100644
--- a/designer-base/src/main/java/com/fr/design/actions/TableDataSourceAction.java
+++ b/designer-base/src/main/java/com/fr/design/actions/TableDataSourceAction.java
@@ -15,6 +15,7 @@ import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.DialogActionAdapter;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.Map;
/*
@@ -42,11 +43,19 @@ public class TableDataSourceAction extends TemplateComponentAction iterator = tds.getTableDataNameIterator();
+ while (iterator.hasNext()) {
+ DesignTableDataManager.removeSelectedColumnNames(iterator.next());
+ }
DesignModelAdapter.getCurrentModelAdapter().renameTableData(tableDataPane.getDsNameChangedMap());
tableDataPane.update(tds);
TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter());
@@ -64,6 +73,7 @@ public class TableDataSourceAction extends TemplateComponentAction localeMark = LocaleCenter.getMark(BugNeedMark.class);
+ BrowseUtils.browser(localeMark.getValue());
+ }
+
+ public static final MenuKeySet BugAndNeed = new MenuKeySet() {
+ @Override
+ public char getMnemonic() {
+ return 0;
+ }
+
+ @Override
+ public String getMenuName() {
+ return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_BugAndNeed");
+ }
+
+ @Override
+ public KeyStroke getKeyStroke() {
+ return null;
+ }
+ };
+}
diff --git a/designer-base/src/main/java/com/fr/design/actions/community/TechSupportAction.java b/designer-base/src/main/java/com/fr/design/actions/community/TechSupportAction.java
new file mode 100644
index 0000000000..9c8067138e
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/actions/community/TechSupportAction.java
@@ -0,0 +1,49 @@
+package com.fr.design.actions.community;
+
+import com.fr.base.BaseUtils;
+import com.fr.design.actions.UpdateAction;
+import com.fr.design.locale.impl.TechSupportMark;
+import com.fr.design.menu.MenuKeySet;
+import com.fr.design.utils.BrowseUtils;
+import com.fr.general.locale.LocaleCenter;
+import com.fr.general.locale.LocaleMark;
+
+import javax.swing.*;
+import java.awt.event.ActionEvent;
+
+/**
+ * @Author: Yuan.Wang
+ * @Date: 2020/7/28
+ */
+public class TechSupportAction extends UpdateAction {
+ public TechSupportAction() {
+ this.setMenuKeySet(TechSupport);
+ this.setName(getMenuKeySet().getMenuName());
+ this.setMnemonic(getMenuKeySet().getMnemonic());
+ this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/bbs/support.png"));
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ LocaleMark localeMark = LocaleCenter.getMark(TechSupportMark.class);
+ String str=localeMark.getValue();
+ BrowseUtils.browser(localeMark.getValue());
+ }
+
+ public static final MenuKeySet TechSupport = new MenuKeySet() {
+ @Override
+ public char getMnemonic() {
+ return 0;
+ }
+
+ @Override
+ public String getMenuName() {
+ return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_TechSupport");
+ }
+
+ @Override
+ public KeyStroke getKeyStroke() {
+ return null;
+ }
+ };
+}
diff --git a/designer-base/src/main/java/com/fr/design/actions/community/UpAction.java b/designer-base/src/main/java/com/fr/design/actions/community/UpAction.java
index 157f775b8c..9e550377f0 100644
--- a/designer-base/src/main/java/com/fr/design/actions/community/UpAction.java
+++ b/designer-base/src/main/java/com/fr/design/actions/community/UpAction.java
@@ -2,6 +2,7 @@ package com.fr.design.actions.community;
import com.fr.base.BaseUtils;
import com.fr.design.actions.UpdateAction;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.menu.MenuKeySet;
import com.fr.general.CloudCenter;
import com.fr.log.FineLoggerFactory;
@@ -38,7 +39,7 @@ public class UpAction extends UpdateAction
try {
Desktop.getDesktop().browse(new URI(url));
} catch (IOException exp) {
- JOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Set_Default_Browser"));
+ FineJOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Set_Default_Browser"));
FineLoggerFactory.getLogger().error(exp.getMessage(), exp);
} catch (URISyntaxException exp) {
FineLoggerFactory.getLogger().error(exp.getMessage(), exp);
diff --git a/designer-base/src/main/java/com/fr/design/actions/core/ActionFactory.java b/designer-base/src/main/java/com/fr/design/actions/core/ActionFactory.java
index 83aeaefe3d..574195470b 100644
--- a/designer-base/src/main/java/com/fr/design/actions/core/ActionFactory.java
+++ b/designer-base/src/main/java/com/fr/design/actions/core/ActionFactory.java
@@ -260,6 +260,13 @@ public class ActionFactory {
}
}
+ public static void referCellInsertActionClass(Class>[] cls) {
+ if (cls != null) {
+ actionClasses.clear();
+ Collections.addAll(actionClasses, cls);
+ }
+ }
+
/**
* 生成单元格插入相关的Action
* 表单中报表块编辑需要屏蔽掉"插入子报表"
@@ -318,6 +325,13 @@ public class ActionFactory {
}
}
+ public static void referFloatInsertActionClass(Class>[] cls) {
+ if (cls != null) {
+ floatActionClasses.clear();
+ Collections.addAll(floatActionClasses, cls);
+ }
+ }
+
/**
* 生成悬浮元素插入相关的Action
*
diff --git a/designer-base/src/main/java/com/fr/design/actions/file/OpenRecentReportMenuDef.java b/designer-base/src/main/java/com/fr/design/actions/file/OpenRecentReportMenuDef.java
index 2bb026159f..7533cb133a 100644
--- a/designer-base/src/main/java/com/fr/design/actions/file/OpenRecentReportMenuDef.java
+++ b/designer-base/src/main/java/com/fr/design/actions/file/OpenRecentReportMenuDef.java
@@ -1,6 +1,7 @@
package com.fr.design.actions.file;
import java.awt.event.ActionEvent;
+import java.io.File;
import java.util.List;
import com.fr.base.BaseUtils;
@@ -11,6 +12,7 @@ import com.fr.design.mainframe.DesignerContext;
import com.fr.design.menu.KeySetUtils;
import com.fr.design.menu.MenuDef;
import com.fr.file.FILEFactory;
+import com.fr.file.FileFILE;
/**
* Open Resent MenuDef.
@@ -68,7 +70,12 @@ public class OpenRecentReportMenuDef extends MenuDef {
* @param e 事件
*/
public void actionPerformed(ActionEvent e) {
- DesignerContext.getDesignerFrame().openTemplate(FILEFactory.createFILE(this.getPath()));
+ File file = new File(this.getPath());
+ if (file.exists()) {
+ DesignerContext.getDesignerFrame().openTemplate(new FileFILE(file));
+ } else {
+ DesignerContext.getDesignerFrame().openTemplate(FILEFactory.createFILE(this.getPath()));
+ }
}
public String getPath() {
diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java
index 11ed79a71e..0ccb5d3e7b 100644
--- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java
+++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java
@@ -1,7 +1,5 @@
package com.fr.design.actions.file;
-import com.fr.cluster.ClusterBridge;
-import com.fr.cluster.engine.base.FineClusterConfig;
import com.fr.config.Configuration;
import com.fr.config.ServerPreferenceConfig;
import com.fr.design.DesignerEnvManager;
@@ -30,6 +28,7 @@ import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.vcs.VcsConfigManager;
import com.fr.design.mainframe.vcs.common.VcsHelper;
import com.fr.design.os.impl.SupportOSImpl;
+import com.fr.design.unit.UnitConvertUtil;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.design.widget.FRWidgetFactory;
import com.fr.general.ComparatorUtils;
@@ -40,6 +39,7 @@ import com.fr.general.log.Log4jConfig;
import com.fr.locale.InterProviderFactory;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.Constants;
+import com.fr.stable.os.OperatingSystem;
import com.fr.third.apache.log4j.Level;
import com.fr.transaction.Configurations;
import com.fr.transaction.Worker;
@@ -150,9 +150,6 @@ public class PreferencePane extends BasicPane {
private UIColorButton paginationLineColorTBButton;
- private UICheckBox supportCellEditorDefCheckBox;
- private UICheckBox isDragPermitedCheckBox;
-
private UITextField logExportDirectoryField;
private UIComboBox logLevelComboBox, pageLengthComboBox, reportLengthComboBox;
@@ -200,7 +197,6 @@ public class PreferencePane extends BasicPane {
createFunctionPane(generalPane);
createEditPane(generalPane);
- createGuiOfGridPane(generalPane);
createColorSettingPane(generalPane);
createVcsSettingPane(generalPane);
@@ -220,15 +216,17 @@ public class PreferencePane extends BasicPane {
oracleSpace = new UICheckBox(i18nText("Fine-Design_Basic_Show_All_Oracle_Tables"));
oraclePane.add(oracleSpace);
- JPanel upmSelectorPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Update_Plugin_Manager"));
- useOptimizedUPMCheckbox = new UICheckBox(i18nText("Fine-Design_Basic_Use_New_Update_Plugin_Manager"));
- upmSelectorPane.add(useOptimizedUPMCheckbox);
- advancePane.add(upmSelectorPane);
+ if (!OperatingSystem.isLinux()) {
+ JPanel upmSelectorPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Update_Plugin_Manager"));
+ useOptimizedUPMCheckbox = new UICheckBox(i18nText("Fine-Design_Basic_Use_New_Update_Plugin_Manager"));
+ upmSelectorPane.add(useOptimizedUPMCheckbox);
+ advancePane.add(upmSelectorPane);
+ }
JPanel dbmSelectorPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Database_Manager"));
useUniverseDBMCheckbox = new UICheckBox(i18nText("Fine-Design_Basic_Use_Universe_Database_Manager"));
- dbmSelectorPane.add(useUniverseDBMCheckbox);
- advancePane.add(dbmSelectorPane);
+ //dbmSelectorPane.add(useUniverseDBMCheckbox);
+ //advancePane.add(dbmSelectorPane);
JPanel improvePane = FRGUIPaneFactory.createVerticalTitledBorderPane(i18nText("Fine-Design_Basic_Product_Improve"));
joinProductImproveCheckBox = new UICheckBox(i18nText("Fine-Design_Basic_Join_Product_Improve"));
@@ -258,7 +256,7 @@ public class PreferencePane extends BasicPane {
}
private void createVcsSettingPane(JPanel generalPane) {
- JPanel vcsPane = FRGUIPaneFactory.createVerticalTitledBorderPane(i18nText("Fine-Design_Vcs_Title"));
+ JPanel vcsPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane(i18nText("Fine-Design_Vcs_Title"));
generalPane.add(vcsPane);
remindVcsLabel = new UILabel(i18nText("Fine-Design_Vcs_Remind"));
remindVcsLabel.setVisible(!VcsHelper.getInstance().needInit());
@@ -446,27 +444,11 @@ public class PreferencePane extends BasicPane {
}
- private void createGuiOfGridPane(JPanel generalPane) {
- // GridPane
- JPanel guiOfGridPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Preference_Setting_Grid"));
- generalPane.add(guiOfGridPane);
-
- supportCellEditorDefCheckBox = new UICheckBox(i18nText("Fine-Design_Basic_Preference_Support_Cell_Editor_Definition"));
- guiOfGridPane.add(supportCellEditorDefCheckBox);
-
- isDragPermitedCheckBox = new UICheckBox(i18nText("Fine-Design_Basic_Preference_Is_Drag_Permited"));
- guiOfGridPane.add(isDragPermitedCheckBox);
- }
-
private void createColorSettingPane(JPanel generalPane) {
// Color Setting Pane
JPanel colorSettingPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Preference_Setting_Colors"));
generalPane.add(colorSettingPane);
- new UILabel(i18nText("Fine-Design_Basic_Preference_Grid_Line_Color"));
-
- new UILabel(i18nText("Fine-Design_Basic_Preference_Pagination_Line_Color"));
-
gridLineColorTBButton = new UIColorButton(IOUtils.readIcon("/com/fr/design/images/gui/color/foreground.png"));
gridLineColorTBButton.setEnabled(this.isEnabled());
@@ -590,7 +572,7 @@ public class PreferencePane extends BasicPane {
pageLengthComboBox = new UIComboBox(new String[]{i18nText("Fine-Design_Basic_Page_Setup_MM"), i18nText("Fine-Design_Report_Unit_CM"), i18nText("Fine-Design_Report_Unit_INCH")});
pageLengthComboBox.setPreferredSize(new Dimension(80, 20));
pageLengthComboBox.setMinimumSize(new Dimension(80, 20));
- reportLengthComboBox = new UIComboBox(new String[]{i18nText("Fine-Design_Basic_Page_Setup_MM"), i18nText("Fine-Design_Report_Unit_CM"), i18nText("Fine-Design_Report_Unit_INCH"), i18nText("Fine-Design_Report_Unit_PT_Duplicate")});
+ reportLengthComboBox = new UIComboBox(UnitConvertUtil.getUnitItems());
reportLengthComboBox.setPreferredSize(new Dimension(80, 20));
reportLengthComboBox.setMinimumSize(new Dimension(80, 20));
UILabel pagelengthLabel = new UILabel(i18nText("Fine-Design_Basic_Page_Setup_Scale_Units") + ":");
@@ -673,7 +655,7 @@ public class PreferencePane extends BasicPane {
defaultStringToFormulaBox.setSelected(false);
}
VcsConfigManager vcsConfigManager = designerEnvManager.getVcsConfigManager();
- if (ClusterBridge.isClusterMode()) {
+ if (WorkContext.getCurrent().isCluster()){
vcsEnableCheckBox.setEnabled(false);
gcEnableCheckBox.setEnabled(false);
}
@@ -695,9 +677,6 @@ public class PreferencePane extends BasicPane {
useIntervalCheckBox.setSelected(vcsConfigManager.isUseInterval());
gcEnableCheckBox.setSelected(GcConfig.getInstance().isGcEnable());
gcButton.setEnabled(gcEnableCheckBox.isSelected());
- supportCellEditorDefCheckBox.setSelected(designerEnvManager.isSupportCellEditorDef());
-
- isDragPermitedCheckBox.setSelected(designerEnvManager.isDragPermited());
gridLineColorTBButton.setColor(designerEnvManager.getGridLineColor());
paginationLineColorTBButton.setColor(designerEnvManager.getPaginationLineColor());
@@ -713,7 +692,9 @@ public class PreferencePane extends BasicPane {
this.portEditor.setValue(new Integer(designerEnvManager.getEmbedServerPort()));
- useOptimizedUPMCheckbox.setSelected(ServerPreferenceConfig.getInstance().isUseOptimizedUPM());
+ if (useOptimizedUPMCheckbox != null) {
+ useOptimizedUPMCheckbox.setSelected(ServerPreferenceConfig.getInstance().isUseOptimizedUPM());
+ }
useUniverseDBMCheckbox.setSelected(ServerPreferenceConfig.getInstance().isUseUniverseDBM());
@@ -765,12 +746,8 @@ public class PreferencePane extends BasicPane {
designerEnvManager.setDefaultStringToFormula(defaultStringToFormulaBox.isSelected());
- designerEnvManager.setSupportCellEditorDef(supportCellEditorDefCheckBox.isSelected());
-
designerEnvManager.setAutoCompleteShortcuts(shortCutKeyStore != null ? shortCutKeyStore.toString().replace(TYPE, DISPLAY_TYPE) : shortCutLabel.getText());
- designerEnvManager.setDragPermited(isDragPermitedCheckBox.isSelected());
-
designerEnvManager.setGridLineColor(gridLineColorTBButton.getColor());
designerEnvManager.setPaginationLineColor(paginationLineColorTBButton.getColor());
@@ -834,7 +811,9 @@ public class PreferencePane extends BasicPane {
Configurations.update(new Worker() {
@Override
public void run() {
- ServerPreferenceConfig.getInstance().setUseOptimizedUPM(useOptimizedUPMCheckbox.isSelected());
+ if (useOptimizedUPMCheckbox != null) {
+ ServerPreferenceConfig.getInstance().setUseOptimizedUPM(useOptimizedUPMCheckbox.isSelected());
+ }
ServerPreferenceConfig.getInstance().setUseUniverseDBM(useUniverseDBMCheckbox.isSelected());
}
diff --git a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java
index 568e713bb9..1e222dd26c 100644
--- a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java
+++ b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java
@@ -59,7 +59,14 @@ public class SwitchExistEnv extends MenuDef {
*/
public void actionPerformed(ActionEvent e) {
final String envName = getName();
- EnvChangeEntrance.getInstance().switch2Env(envName);
+ DesignerEnvManager envManager = DesignerEnvManager.getEnvManager();
+ DesignerWorkspaceInfo selectedEnv = envManager.getWorkspaceInfo(envName);
+ if (selectedEnv.getConnection() != null && !selectedEnv.getConnection().isRememberPwd()) {
+ // 打开配置目录面板
+ EnvChangeEntrance.getInstance().chooseEnv(envName);
+ } else {
+ EnvChangeEntrance.getInstance().switch2Env(envName);
+ }
}
}
}
diff --git a/designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java b/designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java
index f3bfe5622e..f3c5236b52 100644
--- a/designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java
+++ b/designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java
@@ -21,7 +21,7 @@ import java.util.Map;
import static javax.swing.JOptionPane.OK_CANCEL_OPTION;
import static javax.swing.JOptionPane.OK_OPTION;
import static javax.swing.JOptionPane.WARNING_MESSAGE;
-import static javax.swing.JOptionPane.showConfirmDialog;
+import static com.fr.design.dialog.FineJOptionPane.showConfirmDialog;
public final class WebPreviewUtils {
diff --git a/designer-base/src/main/java/com/fr/design/actions/file/export/AbstractExportAction.java b/designer-base/src/main/java/com/fr/design/actions/file/export/AbstractExportAction.java
index 17d19aab71..5277d2ebf1 100644
--- a/designer-base/src/main/java/com/fr/design/actions/file/export/AbstractExportAction.java
+++ b/designer-base/src/main/java/com/fr/design/actions/file/export/AbstractExportAction.java
@@ -2,6 +2,7 @@ package com.fr.design.actions.file.export;
import com.fr.design.actions.JTemplateAction;
import com.fr.design.base.mode.DesignModeContext;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.iprogressbar.FRProgressBar;
import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
@@ -132,10 +133,10 @@ public abstract class AbstractExportAction> extends JT
E e = getEditingComponent();
if (!e.isALLSaved() && !DesignModeContext.isVcsMode()) {
e.stopEditing();
- int returnVal = JOptionPane.showConfirmDialog(
+ int returnVal = FineJOptionPane.showConfirmDialog(
DesignerContext.getDesignerFrame(),
Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + e.getEditingFILE() + "\" ?",
- ProductConstants.PRODUCT_NAME,
+ Toolkit.i18nText("Fine-Design_Basic_Confirm"),
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE
);
@@ -171,7 +172,7 @@ public abstract class AbstractExportAction> extends JT
this.setProgress(100);
FineLoggerFactory.getLogger().info("\"" + name + "\"" + Toolkit.i18nText("Fine-Design_Report_Finish_Export") + "!");
- JOptionPane.showMessageDialog(
+ FineJOptionPane.showMessageDialog(
DesignerContext.getDesignerFrame(),
Toolkit.i18nText("Fine-Design_Report_Exported_Successfully") + "\n" + name);
@@ -180,10 +181,10 @@ public abstract class AbstractExportAction> extends JT
this.setProgress(100);
target.closeTemplate();
FineLoggerFactory.getLogger().error(exp.getMessage(), exp);
- JOptionPane.showMessageDialog(
+ FineJOptionPane.showMessageDialog(
DesignerContext.getDesignerFrame(),
Toolkit.i18nText("Fine-Engine_Remote_Design_Permission_Denied"),
- UIManager.getString("OptionPane.messageDialogTitle"),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Error"),
JOptionPane.ERROR_MESSAGE,
UIManager.getIcon("OptionPane.errorIcon")
);
@@ -191,10 +192,10 @@ public abstract class AbstractExportAction> extends JT
this.setProgress(100);
target.closeTemplate();
FineLoggerFactory.getLogger().error(exp.getMessage(), exp);
- JOptionPane.showMessageDialog(
+ FineJOptionPane.showMessageDialog(
DesignerContext.getDesignerFrame(),
Toolkit.i18nText("Fine-Design_Report_Export_Failed") + "\n" + path,
- UIManager.getString("OptionPane.messageDialogTitle"),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Error"),
JOptionPane.ERROR_MESSAGE,
UIManager.getIcon("OptionPane.errorIcon")
);
diff --git a/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java b/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java
index b4b6d53c6f..d94e8ea5c3 100644
--- a/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java
+++ b/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java
@@ -76,7 +76,7 @@ public class AboutDialog extends JDialog implements ActionListener {
this.getRootPane().setDefaultButton(okButton);
- this.setSize(new Dimension(660, 600));
+ this.setSize(defaultPane.getPreferredSize().width, 600);
GUICoreUtils.centerWindow(this);
}
diff --git a/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java b/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java
index b8acba9fe2..6158540888 100644
--- a/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java
+++ b/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java
@@ -4,14 +4,17 @@
package com.fr.design.actions.help;
import com.fr.base.FRContext;
+import com.fr.base.GraphHelper;
import com.fr.design.DesignerEnvManager;
import com.fr.design.gui.ilable.ActionLabel;
import com.fr.design.gui.ilable.BoldFontTextLabel;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.general.CloudCenter;
+import com.fr.general.ComparatorUtils;
import com.fr.general.GeneralContext;
import com.fr.general.GeneralUtils;
+import com.fr.locale.InterProviderFactory;
import com.fr.stable.ProductConstants;
import com.fr.stable.StringUtils;
import com.fr.stable.bridge.StableFactory;
@@ -35,10 +38,16 @@ public class AboutPane extends JPanel {
private static final String BUILD_PREFIX = " ";
private static final String COMPANY_TELEPHONE = CloudCenter.getInstance().acquireUrlByKind("help.compNo");
private static final String PRESIDENT_PHONE = CloudCenter.getInstance().acquireUrlByKind("help.PNo");
+ private static final String LEFT_BRACKET = "(";
+ private static final String RIGHT_BRACKET = ")";
+
+ private int maxWidth;
public AboutPane() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
-
+ this.maxWidth = GraphHelper.getWidth(getBuildTitle() + getVersionBuildNO() +
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Copy_Build_NO") +
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Copy_Build_NO_OK"));
//center panel
JPanel centerPane = FRGUIPaneFactory.createBorderLayout_L_Pane();
this.add(centerPane, BorderLayout.CENTER);
@@ -46,9 +55,10 @@ public class AboutPane extends JPanel {
JPanel contentPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane();
centerPane.add(contentPane, BorderLayout.NORTH);
+ contentPane.add(new BoxCenterAligmentPane(getBuildTitle()));
BoxCenterAlignmentCopyablePane buildCopyPane = new BoxCenterAlignmentCopyablePane(
- getBuildTitle(),
- GeneralUtils.readFullBuildNO(),
+ StringUtils.EMPTY,
+ getVersionBuildNO(),
new String[]{
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Copy_Build_NO"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Copy_Build_NO_OK")
@@ -72,11 +82,11 @@ public class AboutPane extends JPanel {
addPhoneAndQQPane(contentPane);
// 官网
- JPanel urlActionPane = getURLActionPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Official_Website"), CloudCenter.getInstance().acquireUrlByKind("website." + GeneralContext.getLocale(), ProductConstants.WEBSITE_URL));
+ JPanel urlActionPane = getURLActionPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Official_Website"), CloudCenter.getInstance().acquireConf("website." + GeneralContext.getLocale(), ProductConstants.WEBSITE_URL));
// 支持邮箱
- String defaultEmail = CloudCenter.getInstance().acquireUrlByKind("support.email", ProductConstants.SUPPORT_EMAIL);
- JPanel emailPane = getEmailActionPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Support_Email"), CloudCenter.getInstance().acquireUrlByKind("support.email." + GeneralContext.getLocale(), defaultEmail));
+ String defaultEmail = CloudCenter.getInstance().acquireConf("support.email", ProductConstants.SUPPORT_EMAIL);
+ JPanel emailPane = getEmailActionPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Support_Email"), CloudCenter.getInstance().acquireConf("support.email." + GeneralContext.getLocale(), defaultEmail));
contentPane.add(urlActionPane);
contentPane.add(emailPane);
@@ -90,13 +100,27 @@ public class AboutPane extends JPanel {
}
}
+ public String getVersionBuildNO() {
+ String version = GeneralUtils.getVersion();
+ String build = GeneralUtils.readFullBuildNO();
+ String notInstalledVersion = InterProviderFactory.getProvider().getLocText("Fine-Core_Basic_About_No_Build");
+ if (ComparatorUtils.equals(notInstalledVersion, build))
+ return notInstalledVersion;
+ return version + LEFT_BRACKET + build + RIGHT_BRACKET;
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ return new Dimension(this.maxWidth, super.getPreferredSize().height);
+ }
+
private void addPhoneAndQQPane(JPanel contentPane) {
BoxCenterAligmentPane boxCenterAlignmentPane;
// 英文版不显示服务电话和QQ
if (GeneralContext.getLocale().equals(Locale.US)) {
return;
}
- boxCenterAlignmentPane = new BoxCenterAligmentPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Service_Phone") + CloudCenter.getInstance().acquireUrlByKind("service.phone." + FRContext.getLocale(), COMPANY_TELEPHONE));
+ boxCenterAlignmentPane = new BoxCenterAligmentPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Service_Phone") + CloudCenter.getInstance().acquireConf("service.phone." + FRContext.getLocale(), COMPANY_TELEPHONE));
contentPane.add(boxCenterAlignmentPane);
// 繁体版不显示QQ
if (GeneralContext.getLocale().equals(Locale.TAIWAN)) {
@@ -176,12 +200,12 @@ public class AboutPane extends JPanel {
private String getCopyRight() {
return append(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_About_CopyRight"), COPYRIGHT_LABEL,
- ProductConstants.HISTORY, StringUtils.BLANK, CloudCenter.getInstance().acquireUrlByKind("company.name", ProductConstants.COMPANY_NAME));
+ ProductConstants.HISTORY, StringUtils.BLANK, CloudCenter.getInstance().acquireConf("company.name", ProductConstants.COMPANY_NAME));
}
private String getBuildTitle() {
return append(ProductConstants.APP_NAME, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_About_Version"),
- StringUtils.BLANK, ProductConstants.RELEASE_VERSION, BUILD_PREFIX);
+ StringUtils.BLANK, ProductConstants.VERSION, BUILD_PREFIX);
}
private JPanel getEmailActionPane(final String desc, final String mailTo) {
@@ -279,12 +303,13 @@ public class AboutPane extends JPanel {
public BoxCenterAlignmentCopyablePane(String title, String copyText, final String[] descriptions) {
setLayout(FRGUIPaneFactory.createBorderLayout());
JPanel centerPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane();
- this.label = new UILabel(title);
+ if (StringUtils.isNotEmpty(title)) {
+ this.label = new UILabel(title);
+ centerPane.add(label);
+ }
this.textField = new UILabel(copyText);
textField.setBackground(null);
textField.setBorder(null);
-
- centerPane.add(label);
centerPane.add(textField);
textField.addMouseListener(new MouseAdapter() {
@Override
diff --git a/designer-base/src/main/java/com/fr/design/actions/help/ForumAction.java b/designer-base/src/main/java/com/fr/design/actions/help/ForumAction.java
index 2d4814d2ed..0f3c5e9cc1 100644
--- a/designer-base/src/main/java/com/fr/design/actions/help/ForumAction.java
+++ b/designer-base/src/main/java/com/fr/design/actions/help/ForumAction.java
@@ -6,6 +6,7 @@ package com.fr.design.actions.help;
import com.fr.base.BaseUtils;
import com.fr.design.actions.UpdateAction;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.menu.MenuKeySet;
import com.fr.general.CloudCenter;
import com.fr.log.FineLoggerFactory;
@@ -47,7 +48,7 @@ public class ForumAction extends UpdateAction {
try {
Desktop.getDesktop().browse(new URI(url));
} catch (IOException exp) {
- JOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Set_Default_Browser"));
+ FineJOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Set_Default_Browser"));
FineLoggerFactory.getLogger().error(exp.getMessage(), exp);
} catch (URISyntaxException exp) {
FineLoggerFactory.getLogger().error(exp.getMessage(), exp);
diff --git a/designer-base/src/main/java/com/fr/design/actions/help/SupportQQAction.java b/designer-base/src/main/java/com/fr/design/actions/help/SupportQQAction.java
index a118f9d878..16b8b19eba 100644
--- a/designer-base/src/main/java/com/fr/design/actions/help/SupportQQAction.java
+++ b/designer-base/src/main/java/com/fr/design/actions/help/SupportQQAction.java
@@ -6,6 +6,7 @@ package com.fr.design.actions.help;
import com.fr.base.BaseUtils;
import com.fr.design.actions.UpdateAction;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.menu.MenuKeySet;
import com.fr.log.FineLoggerFactory;
@@ -37,7 +38,7 @@ public class SupportQQAction extends UpdateAction {
try {
Desktop.getDesktop().browse(new URI(ProductConstants.SUPPORT_QQ));
} catch (IOException exp) {
- JOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Set_Default_Browser"));
+ FineJOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Set_Default_Browser"));
FineLoggerFactory.getLogger().error(exp.getMessage(), exp);
} catch (URISyntaxException exp) {
FineLoggerFactory.getLogger().error(exp.getMessage(), exp);
diff --git a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java
index d261de57c3..5bf0214e02 100644
--- a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java
+++ b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java
@@ -189,34 +189,34 @@ public class AlphaFineConfigPane extends BasicPane {
}
public void populate(AlphaFineConfigManager alphaFineConfigManager) {
-
+
this.enabledCheckbox.setSelected(alphaFineConfigManager.isEnabled());
-
- boolean enabled4Locale = FRContext.isChineseEnv();
-
- this.searchOnlineCheckbox.setEnabled(enabled4Locale);
- this.searchOnlineCheckbox.setSelected(alphaFineConfigManager.isSearchOnLine());
-
+
+ boolean enabled4Locale = FRContext.isChineseEnv() && alphaFineConfigManager.isSearchOnLine();
+
+ this.searchOnlineCheckbox.setEnabled(FRContext.isChineseEnv());
+ this.searchOnlineCheckbox.setSelected(enabled4Locale);
+
this.containActionCheckbox.setSelected(alphaFineConfigManager.isContainAction());
this.containTemplateCheckbox.setSelected(alphaFineConfigManager.isContainTemplate());
this.containFileContentCheckbox.setSelected(alphaFineConfigManager.isContainFileContent());
-
- this.containDocumentCheckbox.setSelected(alphaFineConfigManager.isContainDocument() && alphaFineConfigManager.isSearchOnLine());
+
+ this.containDocumentCheckbox.setSelected(alphaFineConfigManager.isContainDocument() && enabled4Locale);
this.containDocumentCheckbox.setEnabled(enabled4Locale);
-
- this.containPluginCheckbox.setSelected(alphaFineConfigManager.isContainPlugin() && alphaFineConfigManager.isSearchOnLine());
+
+ this.containPluginCheckbox.setSelected(alphaFineConfigManager.isContainPlugin() && enabled4Locale);
this.containPluginCheckbox.setEnabled(enabled4Locale);
-
- this.containRecommendCheckbox.setSelected(alphaFineConfigManager.isContainRecommend() && alphaFineConfigManager.isSearchOnLine());
+
+ this.containRecommendCheckbox.setSelected(alphaFineConfigManager.isContainRecommend() && enabled4Locale);
this.containRecommendCheckbox.setEnabled(enabled4Locale);
-
+
this.shortcutsField.setText(getDisplayShortCut(alphaFineConfigManager.getShortcuts()));
this.needSegmentationCheckbox.setSelected(alphaFineConfigManager.isNeedSegmentationCheckbox());
-
- this.needIntelligentCustomerService.setSelected(alphaFineConfigManager.isNeedIntelligentCustomerService() && alphaFineConfigManager.isSearchOnLine());
+
+ this.needIntelligentCustomerService.setSelected(alphaFineConfigManager.isNeedIntelligentCustomerService() && enabled4Locale);
this.needIntelligentCustomerService.setEnabled(enabled4Locale);
-
+
shortCutKeyStore = convert2KeyStroke(alphaFineConfigManager.getShortcuts());
}
diff --git a/designer-base/src/main/java/com/fr/design/actions/server/GlobalTableDataAction.java b/designer-base/src/main/java/com/fr/design/actions/server/GlobalTableDataAction.java
index deef91f0c7..627a862fb6 100644
--- a/designer-base/src/main/java/com/fr/design/actions/server/GlobalTableDataAction.java
+++ b/designer-base/src/main/java/com/fr/design/actions/server/GlobalTableDataAction.java
@@ -5,7 +5,6 @@ package com.fr.design.actions.server;
import com.fr.base.BaseUtils;
import com.fr.base.TableData;
-import com.fr.config.Configuration;
import com.fr.design.DesignModelAdapter;
import com.fr.design.actions.UpdateAction;
import com.fr.design.data.DesignTableDataManager;
@@ -18,15 +17,14 @@ import com.fr.design.gui.NameInspector;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.DesignerFrame;
import com.fr.design.menu.MenuKeySet;
-import com.fr.file.ProcedureConfig;
import com.fr.file.TableDataConfig;
import com.fr.transaction.CallBackAdaptor;
import com.fr.transaction.Configurations;
-import com.fr.transaction.Worker;
import com.fr.transaction.WorkerFacade;
import javax.swing.KeyStroke;
+import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.HashMap;
import java.util.Map;
@@ -35,7 +33,8 @@ import java.util.Map;
* Global TableData.
*/
public class GlobalTableDataAction extends UpdateAction implements ResponseDataSourceChange {
- //private static TableDataManagerPane globalTableDataPane = new TableDataManagerPane();
+
+ private static final Dimension DEFAULT_DIMENSION = new Dimension(1000, 600);
public GlobalTableDataAction() {
this.setMenuKeySet(SERVER_TABLEDATA);
@@ -77,20 +76,10 @@ public class GlobalTableDataAction extends UpdateAction implements ResponseDataS
}
protected void renameConnection(final String oldName, final String newName) {
- Configurations.update(new Worker() {
- @Override
- public void run() {
- tableDataConfig.renameTableData(oldName, newName);
- }
-
- @Override
- public Class extends Configuration>[] targets() {
- return new Class[]{TableDataConfig.class, ProcedureConfig.class};
- }
- });
+ tableDataConfig.renameTableData(oldName, newName);
}
};
- final BasicDialog globalTableDataDialog = globalTableDataPane.showLargeWindow(designerFrame, null);
+ final BasicDialog globalTableDataDialog = globalTableDataPane.showWindowWithCustomSize(designerFrame, null, DEFAULT_DIMENSION);
globalTableDataDialog.addDialogActionListener(new DialogActionAdapter() {
@@ -103,6 +92,10 @@ public class GlobalTableDataAction extends UpdateAction implements ResponseDataS
}
DesignTableDataManager.clearGlobalDs();
+ // 保存时 移除服务器数据集列名缓存
+ for (String name : tableDataConfig.getTableDatas().keySet()) {
+ DesignTableDataManager.removeSelectedColumnNames(name);
+ }
Configurations.modify(new WorkerFacade(TableDataConfig.class) {
@Override
diff --git a/designer-base/src/main/java/com/fr/design/base/clipboard/ClipboardFilter.java b/designer-base/src/main/java/com/fr/design/base/clipboard/ClipboardFilter.java
new file mode 100644
index 0000000000..e9b6b3e0f3
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/base/clipboard/ClipboardFilter.java
@@ -0,0 +1,50 @@
+package com.fr.design.base.clipboard;
+
+import com.fr.design.ExtraDesignClassManager;
+import com.fr.design.fun.ClipboardHandlerProvider;
+import com.fr.plugin.injectable.PluginModule;
+
+import java.util.Set;
+
+/**
+ * created by Harrison on 2020/05/14
+ **/
+@SuppressWarnings({"rawtypes", "unchecked"})
+public abstract class ClipboardFilter {
+
+ public static T cut(T selection) {
+
+ ExtraDesignClassManager manager = PluginModule.getAgent(PluginModule.ExtraDesign);
+ Set providers = manager.getArray(ClipboardHandlerProvider.XML_TAG);
+ for (ClipboardHandlerProvider provider : providers) {
+ if (provider.support(selection)) {
+ selection = ((ClipboardHandlerProvider) provider).cut(selection);
+ }
+ }
+ return selection;
+ }
+
+ public static T copy(T selection) {
+
+ ExtraDesignClassManager manager = PluginModule.getAgent(PluginModule.ExtraDesign);
+ Set providers = manager.getArray(ClipboardHandlerProvider.XML_TAG);
+ for (ClipboardHandlerProvider provider : providers) {
+ if (provider.support(selection)) {
+ selection = ((ClipboardHandlerProvider) provider).copy(selection);
+ }
+ }
+ return selection;
+ }
+
+ public static T paste(T selection) {
+
+ ExtraDesignClassManager manager = PluginModule.getAgent(PluginModule.ExtraDesign);
+ Set providers = manager.getArray(ClipboardHandlerProvider.XML_TAG);
+ for (ClipboardHandlerProvider provider : providers) {
+ if (provider.support(selection)) {
+ selection = ((ClipboardHandlerProvider) provider).paste(selection);
+ }
+ }
+ return selection;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/base/clipboard/DesignerClipboard.java b/designer-base/src/main/java/com/fr/design/base/clipboard/DesignerClipboard.java
new file mode 100644
index 0000000000..76ae081d7b
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/base/clipboard/DesignerClipboard.java
@@ -0,0 +1,68 @@
+package com.fr.design.base.clipboard;
+
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.ClipboardOwner;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.FlavorListener;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.IOException;
+
+/**
+ * created by Harrison on 2020/05/11
+ **/
+public class DesignerClipboard extends Clipboard {
+
+ private Clipboard clipboard;
+
+ public DesignerClipboard(Clipboard clipboard) {
+ super(clipboard.getName());
+ this.clipboard = clipboard;
+ }
+
+ @Override
+ public synchronized void setContents(Transferable contents, ClipboardOwner owner) {
+ //处理 contents/owner
+ Transferable filtered = ClipboardFilter.copy(contents);
+ clipboard.setContents(filtered, owner);
+ }
+
+ @Override
+ public synchronized Transferable getContents(Object requestor) {
+ Transferable contents = clipboard.getContents(requestor);
+ //处理 contents
+ Transferable filtered = ClipboardFilter.paste(contents);
+ return filtered;
+ }
+
+ @Override
+ public DataFlavor[] getAvailableDataFlavors() {
+ return clipboard.getAvailableDataFlavors();
+ }
+
+ @Override
+ public boolean isDataFlavorAvailable(DataFlavor flavor) {
+ return clipboard.isDataFlavorAvailable(flavor);
+ }
+
+ @Override
+ public Object getData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
+ return clipboard.getData(flavor);
+ }
+
+ @Override
+ public synchronized void addFlavorListener(FlavorListener listener) {
+ clipboard.addFlavorListener(listener);
+ }
+
+ @Override
+ public synchronized void removeFlavorListener(FlavorListener listener) {
+ clipboard.removeFlavorListener(listener);
+ }
+
+ @Override
+ public synchronized FlavorListener[] getFlavorListeners() {
+ return clipboard.getFlavorListeners();
+ }
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/bridge/exec/JSExecutor.java b/designer-base/src/main/java/com/fr/design/bridge/exec/JSExecutor.java
index 9ded472eb3..1efa613abc 100644
--- a/designer-base/src/main/java/com/fr/design/bridge/exec/JSExecutor.java
+++ b/designer-base/src/main/java/com/fr/design/bridge/exec/JSExecutor.java
@@ -4,5 +4,8 @@ package com.fr.design.bridge.exec;
* Created by ibm on 2017/6/21.
*/
public interface JSExecutor {
+
+ String CALLBACK_FUNCTION_NAME = "action";
+
void executor(String newValue);
}
diff --git a/designer-base/src/main/java/com/fr/design/cell/AbstractCellElementPropertyPane.java b/designer-base/src/main/java/com/fr/design/cell/AbstractCellElementPropertyPane.java
new file mode 100644
index 0000000000..3e4e001a8f
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/cell/AbstractCellElementPropertyPane.java
@@ -0,0 +1,23 @@
+package com.fr.design.cell;
+
+import com.fr.design.designer.TargetComponent;
+import com.fr.design.dialog.BasicPane;
+
+import javax.swing.JPanel;
+
+/**
+ * @author zack
+ * @version 10.0
+ * Created by zack on 2020/7/14
+ */
+public abstract class AbstractCellElementPropertyPane extends BasicPane implements CellElementPropertyComponent {
+ @Override
+ public JPanel toPanel() {
+ return this;
+ }
+
+ @Override
+ public boolean accept(TargetComponent tc) {
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/cell/CellElementPropertyComponent.java b/designer-base/src/main/java/com/fr/design/cell/CellElementPropertyComponent.java
new file mode 100644
index 0000000000..b3e6f41674
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/cell/CellElementPropertyComponent.java
@@ -0,0 +1,34 @@
+package com.fr.design.cell;
+
+import com.fr.design.designer.TargetComponent;
+
+import javax.swing.JPanel;
+
+/**
+ * 单元格属性配置面板接口
+ * @author zack
+ * @version 10.0
+ * Created by zack on 2020/7/14
+ */
+public interface CellElementPropertyComponent {
+
+ /**
+ * 判断当前编辑的对象是否显示当前实现
+ * @param tc
+ * @return
+ */
+ boolean accept(TargetComponent tc);
+
+ /**
+ * 加载数据
+ * @param tc
+ */
+ void populate(TargetComponent tc);
+
+ /**
+ * 返回当前属性面板,默认返回this
+ * @return
+ */
+ JPanel toPanel();
+
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/condition/ConditionAttributesPane.java b/designer-base/src/main/java/com/fr/design/condition/ConditionAttributesPane.java
index 781c57b052..6ca4ed6808 100644
--- a/designer-base/src/main/java/com/fr/design/condition/ConditionAttributesPane.java
+++ b/designer-base/src/main/java/com/fr/design/condition/ConditionAttributesPane.java
@@ -15,8 +15,9 @@ import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import java.awt.Dimension;
-import java.util.HashMap;
import java.util.Iterator;
+import java.util.Map;
+import java.util.LinkedHashMap;
@Open
public abstract class ConditionAttributesPane extends BasicBeanPane {
@@ -27,7 +28,7 @@ public abstract class ConditionAttributesPane extends BasicBeanPane {
protected LiteConditionPane liteConditionPane;
- protected java.util.Map classPaneMap = new HashMap();
+ protected Map classPaneMap = new LinkedHashMap<>();
//可用的Actions.
protected java.util.List useAbleActionList = new java.util.ArrayList();
@@ -70,7 +71,7 @@ public abstract class ConditionAttributesPane extends BasicBeanPane {
selectedItemScrollPane.setMinimumSize(new Dimension((int) selectedItemScrollPane.getPreferredSize().getWidth(), MIN_HEIGHT));
propertyChangePane.add(selectedItemScrollPane);
}
-
+
public void updateBean(T ob) {
updateMenuDef();
}
diff --git a/designer-base/src/main/java/com/fr/design/condition/LiteConditionPane.java b/designer-base/src/main/java/com/fr/design/condition/LiteConditionPane.java
index 193c35775a..98f5f36530 100644
--- a/designer-base/src/main/java/com/fr/design/condition/LiteConditionPane.java
+++ b/designer-base/src/main/java/com/fr/design/condition/LiteConditionPane.java
@@ -10,6 +10,7 @@ import com.fr.data.condition.ListCondition;
import com.fr.data.condition.ObjectCondition;
import com.fr.design.beans.BasicBeanPane;
import com.fr.design.dialog.DialogActionAdapter;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.formula.FormulaFactory;
import com.fr.design.formula.UIFormula;
import com.fr.design.formula.VariableResolver;
@@ -123,7 +124,7 @@ public abstract class LiteConditionPane extends BasicBeanPa
ExpandMutableTreeNode parentTreeNode = getParentTreeNode();
boolean result = isExistedInParentTreeNode(parentTreeNode, liteCondition, false);
if (result) {
- JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(LiteConditionPane.this),
+ FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(LiteConditionPane.this),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_BindColumn_This_Condition_Has_Been_Existed"));
return;
}
@@ -222,7 +223,7 @@ public abstract class LiteConditionPane extends BasicBeanPa
return;
}
- int returnVal = JOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(LiteConditionPane.this),
+ int returnVal = FineJOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(LiteConditionPane.this),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + "?", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"),
JOptionPane.OK_CANCEL_OPTION);
if (returnVal == JOptionPane.OK_OPTION) {
@@ -610,7 +611,7 @@ public abstract class LiteConditionPane extends BasicBeanPa
//修改的时候加入判断条件重复 REPORT-13441
boolean result = isExistedInParentTreeNode(parentTreeNode, liteCondition, true);
if (result) {
- JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(LiteConditionPane.this),
+ FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(LiteConditionPane.this),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_BindColumn_This_Condition_Has_Been_Existed"));
return;
}
diff --git a/designer-base/src/main/java/com/fr/design/constants/UIConstants.java b/designer-base/src/main/java/com/fr/design/constants/UIConstants.java
index 1e119d27ed..15a7c87c08 100644
--- a/designer-base/src/main/java/com/fr/design/constants/UIConstants.java
+++ b/designer-base/src/main/java/com/fr/design/constants/UIConstants.java
@@ -145,7 +145,6 @@ public interface UIConstants {
public static final Color LIST_ITEM_SPLIT_LINE = new Color(0xf0f0f3);
-
public static final BufferedImage DRAG_BAR = IOUtils.readImage("com/fr/design/images/control/bar.png");
public static final BufferedImage DRAG_BAR_LIGHT = IOUtils.readImage("com/fr/design/images/control/bar-light.png");
public static final BufferedImage ARROW_NORTH = IOUtils.readImage("com/fr/design/images/control/up_arrow.png");
@@ -196,6 +195,7 @@ public interface UIConstants {
public static final Icon ANA_SMALL_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/anas.png");
public static final Icon REFRESH_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/refresh.png");
public static final Icon FONT_ICON = IOUtils.readIcon("/com/fr/design/images/gui/color/foreground.png");
+ public static final Icon AUTO_FONT_ICON = IOUtils.readIcon("/com/fr/design/images/gui/color/autoForeground.png");
public static final Icon HISTORY_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/history.png");
public static final Icon DELETE_ICON = IOUtils.readIcon("com/fr/design/images/m_file/close.png");
public static final Icon EDIT_ICON = IOUtils.readIcon("com/fr/design/images/m_file/edit.png");
diff --git a/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java
index 45b3ac6a2a..5ba801ca89 100644
--- a/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java
+++ b/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java
@@ -137,6 +137,8 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp
nPanel.setShowText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Stored_Procedure_Name_Tips"));
dg.setButtonEnabled(false);
}
+ } else if (!BasicTableDataUtils.checkName(tempName)) {
+ dg.setButtonEnabled(false);
} else {
nPanel.setShowText(StringUtils.BLANK);
dg.setButtonEnabled(true);
@@ -444,7 +446,16 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp
* @param srcName 数据集来源(比如报表块,就是报表块的名称)
* @param tableDataSource 数据集
*/
+ public Map addTableData(String srcName, TableDataSource tableDataSource, boolean isCover) {
+ return new HashMap<>(0);
+ }
+
public Map addTableData(String srcName, TableDataSource tableDataSource) {
- return new HashMap<>(0);
+ return addTableData(srcName, tableDataSource, false);
}
+
+ public void removeTableData(String sourceName) {
+
+ }
+
}
diff --git a/designer-base/src/main/java/com/fr/design/data/BasicTableDataUtils.java b/designer-base/src/main/java/com/fr/design/data/BasicTableDataUtils.java
new file mode 100644
index 0000000000..57c7e23a13
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/data/BasicTableDataUtils.java
@@ -0,0 +1,53 @@
+package com.fr.design.data;
+
+import com.fr.data.TableDataSource;
+import com.fr.design.dialog.FineJOptionPane;
+import com.fr.design.i18n.Toolkit;
+import com.fr.stable.StringUtils;
+
+/**
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2020/4/27
+ */
+public abstract class BasicTableDataUtils {
+ private static final String SEPARATOR = "-";
+
+ private static final int LEN = 2;
+
+
+ public static boolean checkName(String name) {
+ if (isInValidName(name)) {
+ FineJOptionPane.showMessageDialog(null,
+ Toolkit.i18nText("Fine-Design_Basic_DataSet_Rename_Warning", name),
+ Toolkit.i18nText("Fine-Design_Basic_Alert"),
+ FineJOptionPane.WARNING_MESSAGE);
+ return false;
+ }
+ return true;
+ }
+
+ public static boolean isInValidName(String name) {
+ String[] values = name.split("\\.");
+ if (values.length == LEN) {
+ return (StringUtils.isNotEmpty(values[0]) && StringUtils.isNotEmpty(values[1]))
+ || (StringUtils.isEmpty(values[0]) && StringUtils.isNotEmpty(values[1]));
+ }
+ return false;
+ }
+
+ public static String getTableDataName(boolean isCover, TableDataSource tds, String tdName, String srcName, boolean isDsNameRepeaded) {
+ if (isCover) {
+ return srcName + SEPARATOR + tdName;
+ }
+ if (tds.getTableData(tdName) != null || isDsNameRepeaded) {//如果有同名的就拼上来源名称
+ tdName = srcName + SEPARATOR + tdName;
+ }
+ int i = 0;
+ while (tds.getTableData(tdName) != null) {
+ i++;//如果拼上名字后依然已经存在就加编号
+ tdName += i;
+ }
+ return tdName;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java
index 0018d5333b..f2b1e8e5b3 100644
--- a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java
+++ b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java
@@ -20,9 +20,8 @@ import com.fr.design.data.tabledata.wrapper.TableDataFactory;
import com.fr.design.data.tabledata.wrapper.TableDataWrapper;
import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper;
import com.fr.design.dialog.DialogActionAdapter;
-import com.fr.design.file.HistoryTemplateListPane;
+import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.gui.iprogressbar.AutoProgressBar;
-import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.JTemplate;
import com.fr.design.parameter.ParameterInputPane;
import com.fr.file.ProcedureConfig;
@@ -73,7 +72,7 @@ public abstract class DesignTableDataManager {
*/
private static java.util.Map globalDsCache = new java.util.HashMap();
private static java.util.Map dsNameChangedMap = new HashMap();
-// private static List dsListeners = new ArrayList();
+ private static List globalDsListeners = new ArrayList<>();
private static Map> dsListenersMap = new HashMap>();
@@ -83,6 +82,7 @@ public abstract class DesignTableDataManager {
//用于记录是否要弹出参数框
private static ThreadLocal threadLocal = new ThreadLocal();
+ private static Map> columnCache = new HashMap<>();
/**
* 清除全局 数据集缓存.
@@ -95,25 +95,32 @@ public abstract class DesignTableDataManager {
* 响应数据集改变.
*/
private static void fireDsChanged() {
+ fireDsChanged(globalDsListeners);
for (Entry> listenerEntry : dsListenersMap.entrySet()) {
List dsListeners = listenerEntry.getValue();
- for (int i = 0; i < dsListeners.size(); i++) {
- //增强for循环用的iterator实现的, 如果中间哪个listener修改或删除了(如ChartEditPane.dsChangeListener),
- // 由于dsListeners是arraylist, 此时会ConcurrentModifyException
-// for (ChangeListener l : dsListeners) {
- ChangeEvent e = null;
- dsListeners.get(i).stateChanged(e);
- }
+ fireDsChanged(dsListeners);
+ }
+ }
+
+ private static void fireDsChanged(List dsListeners) {
+ for (int i = 0; i < dsListeners.size(); i++) {
+ //增强for循环用的iterator实现的, 如果中间哪个listener修改或删除了(如ChartEditPane.dsChangeListener),
+ // 由于dsListeners是arraylist, 此时会ConcurrentModifyException
+ ChangeEvent e = null;
+ dsListeners.get(i).stateChanged(e);
}
}
public static void closeTemplate(JTemplate, ?> template) {
if (template != null) {
+ template.whenClose();
+ columnCache.remove(getEditingTableDataSource());
dsListenersMap.remove(template.getPath());
}
}
public static void envChange() {
+ columnCache.clear();
dsListenersMap.clear();
dsNameChangedMap.clear();
clearGlobalDs();
@@ -160,13 +167,17 @@ public abstract class DesignTableDataManager {
}
}
+ public static void addGlobalDsChangeListener(ChangeListener l) {
+ globalDsListeners.add(l);
+ }
+
/**
* 添加模板数据集改变 监听事件.
*
* @param l ChangeListener监听器
*/
public static void addDsChangeListener(ChangeListener l) {
- JTemplate, ?> template = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
+ JTemplate, ?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
String key = StringUtils.EMPTY;
if (template != null) {
key = template.getPath();
@@ -178,7 +189,6 @@ public abstract class DesignTableDataManager {
}
dsListeners.add(l);
}
-
/**
* 获取数据源source中dsName的所有字段
*
@@ -190,7 +200,60 @@ public abstract class DesignTableDataManager {
java.util.Map resMap = getAllEditingDataSet(source);
java.util.Map dsMap = getAllDataSetIncludingProcedure(resMap);
TableDataWrapper tabledataWrapper = dsMap.get(dsName);
- return tabledataWrapper == null ? new String[0] : tabledataWrapper.calculateColumnNameList().toArray(new String[0]);
+ if (tabledataWrapper == null) {
+ return new String[0];
+ } else {
+ return getSelectedColumnNamesFromCache(source, dsName, tabledataWrapper);
+ }
+ }
+
+ private static String[] getSelectedColumnNamesFromCache(TableDataSource dataSource, String dsName, TableDataWrapper tableDataWrapper) {
+ Map map = columnCache.get(dataSource);
+ if (map == null) {
+ map = new HashMap<>();
+ String[] columnNames = tableDataWrapper.calculateColumnNameList().toArray(new String[0]);
+ map.put(dsName, columnNames);
+ columnCache.put(dataSource, map);
+ return columnNames;
+ } else {
+ String[] columnNames = map.get(dsName);
+ if (columnNames == null) {
+ columnNames = tableDataWrapper.calculateColumnNameList().toArray(new String[0]);
+ map.put(dsName, columnNames);
+ return columnNames;
+ } else {
+ return columnNames;
+ }
+ }
+ }
+
+ public static void removeSelectedColumnNames(String dsName) {
+ Map map = columnCache.get(getEditingTableDataSource());
+ if (map == null) {
+ return;
+ }
+ map.remove(dsName);
+ }
+
+ public static void addDsColumnNames(String dsName, String[] columnNames) {
+ TableDataSource dataSource = getEditingTableDataSource();
+ Map map = columnCache.get(dataSource);
+ if (map == null) {
+ map = new HashMap<>();
+ map.put(dsName, columnNames);
+ columnCache.put(dataSource, map);
+ } else {
+ map.put(dsName, columnNames);
+ }
+ }
+
+ public static String[] getDsColumnNames(String dsName) {
+ TableDataSource dataSource = getEditingTableDataSource();
+ Map map = columnCache.get(dataSource);
+ if (map == null) {
+ return new String[0];
+ }
+ return map.get(dsName);
}
/**
@@ -376,9 +439,14 @@ public abstract class DesignTableDataManager {
* @throws Exception 异常
*/
public static EmbeddedTableData previewTableDataNeedInputParameters(TableDataSource tableDataSource, TableData tabledata, int rowCount, boolean needLoadingBar) throws Exception {
- return previewTableData(tableDataSource, tabledata, rowCount, true, needLoadingBar);
+ return previewTableDataNeedInputParameters(tableDataSource, tabledata, rowCount, needLoadingBar, null);
}
+ public static EmbeddedTableData previewTableDataNeedInputParameters(TableDataSource tableDataSource, TableData tabledata, int rowCount, boolean needLoadingBar, AutoProgressBar progressBar) throws Exception {
+ return previewTableData(tableDataSource, tabledata, rowCount, true, needLoadingBar, progressBar);
+ }
+
+
/**
* 预览不需要参数的数据集
*
@@ -415,20 +483,23 @@ public abstract class DesignTableDataManager {
* @return
*/
private static EmbeddedTableData previewTableData(TableDataSource tableDataSource, TableData tabledata, int rowCount, boolean isMustInputParameters, boolean needLoadingBar) throws Exception {
- final AutoProgressBar loadingBar = PreviewTablePane.getInstance().getProgressBar();
+ return previewTableData(tableDataSource, tabledata, rowCount, isMustInputParameters, needLoadingBar, null);
+ }
+
+ private static EmbeddedTableData previewTableData(TableDataSource tableDataSource, TableData tabledata, int rowCount, boolean isMustInputParameters, boolean needLoadingBar, AutoProgressBar progressBar) throws Exception {
+ final AutoProgressBar loadingBar;
+ if (progressBar == null) {
+ loadingBar = PreviewTablePane.getInstance().getProgressBar();
+ } else {
+ loadingBar = progressBar;
+ }
ParameterProvider[] parameters = DataOperator.getInstance().getTableDataParameters(tabledata);
if (ArrayUtils.isEmpty(parameters)) {
parameters = tabledata.getParameters(Calculator.createCalculator());
}
- final Map parameterMap = new HashMap<>();
+ Map parameterMap = new HashMap<>();
if (needInputParams(isMustInputParameters, parameters)) {
- final ParameterInputPane pPane = new ParameterInputPane(parameters);
- pPane.showSmallWindow(new JFrame(), new DialogActionAdapter() {
- @Override
- public void doOk() {
- parameterMap.putAll(pPane.update());
- }
- }).setVisible(true);
+ showParaWindow(parameterMap, parameters);
} else {
for (ParameterProvider parameter : parameters) {
parameterMap.put(parameter.getName(), parameter.getValue());
@@ -519,15 +590,10 @@ public abstract class DesignTableDataManager {
return storeProcedure.creatLazyDataModel();
}
ParameterProvider[] inParameters = DataOperator.getInstance().getStoreProcedureParameters(storeProcedure);
- final Map parameterMap = new HashMap();
+ Map parameterMap = new HashMap<>();
if (inParameters.length > 0 && !ComparatorUtils.equals(threadLocal.get(), NO_PARAMETER)) {// 检查Parameter.
- final ParameterInputPane pPane = new ParameterInputPane(inParameters);
- pPane.showSmallWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() {
- @Override
- public void doOk() {
- parameterMap.putAll(pPane.update());
- }
- }).setVisible(true);
+
+ showParaWindow(parameterMap, inParameters);
}
storeProcedure.setFirstExpand(false);
@@ -537,6 +603,16 @@ public abstract class DesignTableDataManager {
return DataOperator.getInstance().previewProcedureDataModel(storeProcedure, parameterMap, 0);
}
+ private static void showParaWindow(final Map parameterMap, ParameterProvider[] inParameters) {
+ final ParameterInputPane pPane = new ParameterInputPane(inParameters);
+ pPane.showSmallWindow(new JFrame(), new DialogActionAdapter() {
+ @Override
+ public void doOk() {
+ parameterMap.putAll(pPane.update());
+ }
+ }).setVisible(true);
+ }
+
public static void setThreadLocal(String value) {
threadLocal.set(value);
}
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java
index 28ac24e712..fce7832ac0 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java
@@ -1,12 +1,11 @@
package com.fr.design.data.datapane;
-import com.fr.base.BaseUtils;
import com.fr.base.TableData;
import com.fr.data.core.DataCoreUtils;
import com.fr.data.core.db.DBUtils;
import com.fr.data.core.db.TableProcedure;
+import com.fr.data.core.db.dialect.Dialect;
import com.fr.data.core.db.dialect.DialectFactory;
-import com.fr.data.impl.Connection;
import com.fr.data.impl.DBTableData;
import com.fr.data.operator.DataOperator;
import com.fr.design.DesignerEnvManager;
@@ -17,6 +16,7 @@ import com.fr.design.data.datapane.preview.PreviewLabel;
import com.fr.design.data.datapane.preview.PreviewLabel.Previewable;
import com.fr.design.data.datapane.preview.PreviewTablePane;
import com.fr.design.data.tabledata.Prepare4DataSourceChange;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.icombobox.FRTreeComboBox;
import com.fr.design.gui.icombobox.FilterableComboBoxModel;
import com.fr.design.gui.icombobox.UIComboBox;
@@ -36,12 +36,9 @@ import com.fr.general.IOUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.StringUtils;
import com.fr.workspace.WorkContext;
+import com.fr.workspace.server.connection.DBConnectAuth;
-import javax.swing.JList;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JTree;
-import javax.swing.SwingWorker;
+import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.PopupMenuEvent;
@@ -52,17 +49,16 @@ import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Dimension;
+import java.awt.*;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Enumeration;
import java.util.List;
-import java.util.Map;
+import java.util.Set;
/**
* @author zhou
@@ -209,10 +205,7 @@ public class ChoosePane extends BasicBeanPane implements Refresha
@SuppressWarnings("unchecked")
protected void initDsNameComboBox() {
dsNameComboBox.setRefreshingModel(true);
- ConnectionConfig connectionConfig = ConnectionConfig.getInstance();
- List dsList = new ArrayList<>();
- dsList.addAll(connectionConfig.getConnections().keySet());
- FilterableComboBoxModel dsNameComboBoxModel = new FilterableComboBoxModel(dsList);
+ FilterableComboBoxModel dsNameComboBoxModel = new FilterableComboBoxModel(getHasAuthConnections());
dsNameComboBox.setModel(dsNameComboBoxModel);
dsNameComboBox.setRefreshingModel(false);
}
@@ -321,14 +314,31 @@ public class ChoosePane extends BasicBeanPane implements Refresha
return null; // peter:选中了当前的零长度的节点,直接返回.
}
ConnectionConfig connectionConfig = ConnectionConfig.getInstance();
- for (Map.Entry entry : connectionConfig.getConnections().entrySet()) {
- if (ComparatorUtils.equals(selectedDSName, entry.getKey())) {
- return entry.getValue();
+ List authConnections = getHasAuthConnections();
+ for (String name : authConnections) {
+ if (ComparatorUtils.equals(selectedDSName, name)) {
+ return connectionConfig.getConnection(name);
}
}
return null;
}
+ private List getHasAuthConnections() {
+ List authConnections = new ArrayList<>();
+ Set allConnections = ConnectionConfig.getInstance().getConnections().keySet();
+ Collection noAuthConnections = WorkContext.getCurrent().get(DBConnectAuth.class).getNoAuthConnections();
+ if (noAuthConnections == null) {
+ return authConnections;
+ }
+
+ for (String name : allConnections) {
+ if (!noAuthConnections.contains(name)) {
+ authConnections.add(name);
+ }
+ }
+ return authConnections;
+ }
+
/**
* 刷新没多大用。而且要刷新也不是这儿刷新。
*/
@@ -337,7 +347,7 @@ public class ChoosePane extends BasicBeanPane implements Refresha
DBUtils.refreshDatabase();
String schema = StringUtils.isEmpty(schemaBox.getSelectedItem()) ? null : schemaBox.getSelectedItem();
DataCoreUtils.refreshTables(getConnection(), TableProcedure.TABLE, schema);
- JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Refresh_Successfully") + "!", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Refresh_Database"),
+ FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Refresh_Successfully") + "!", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Refresh_Database"),
JOptionPane.INFORMATION_MESSAGE);
}
@@ -443,7 +453,7 @@ public class ChoosePane extends BasicBeanPane implements Refresha
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
- JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database_Connection_Failed"),
+ FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database_Connection_Failed"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Failed"), JOptionPane.ERROR_MESSAGE);
}
}
@@ -454,6 +464,15 @@ public class ChoosePane extends BasicBeanPane implements Refresha
* @return 数据集数据
*/
public TableData createSelectTableData() {
+ return createSelectTableData(new SelectSqlProcessor() {
+ @Override
+ public String createSelectSql(String schema, String tableName, Dialect dialect) {
+ return DataCoreUtils.createSelectSQL(schema, tableName, dialect);
+ }
+ });
+ }
+
+ public TableData createSelectTableData(SelectSqlProcessor sqlProcessor) {
DataBaseItems paras = this.updateBean();
boolean connect = false;
com.fr.data.impl.Connection database = DBUtils.checkDBConnection(paras.getDatabaseName());
@@ -467,7 +486,7 @@ public class ChoosePane extends BasicBeanPane implements Refresha
}
if (!connect) {
DesignerFrame designerFrame = DesignerContext.getDesignerFrame();
- JOptionPane.showMessageDialog(designerFrame, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database_Connection_Failed"),
+ FineJOptionPane.showMessageDialog(designerFrame, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database_Connection_Failed"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Failed"), JOptionPane.ERROR_MESSAGE);
failedToFindTable();
return null;
@@ -476,11 +495,11 @@ public class ChoosePane extends BasicBeanPane implements Refresha
TableData tableData = null;
if (WorkContext.getCurrent().isLocal()) {
- tableData = new DBTableData(database, DataCoreUtils.createSelectSQL(paras.getSchemaName(), paras.getTableName(),
+ tableData = new DBTableData(database, sqlProcessor.createSelectSql(paras.getSchemaName(), paras.getTableName(),
DialectFactory.getDialectByName(paras.getDatabaseName())));
} else {
try {
- TableData tableDataLocal = new DBTableData(database, DataCoreUtils.createSelectSQL(paras.getSchemaName(), paras.getTableName(), DialectFactory.getDialectByName(paras.getDatabaseName())));
+ TableData tableDataLocal = new DBTableData(database, sqlProcessor.createSelectSql(paras.getSchemaName(), paras.getTableName(), DialectFactory.getDialectByName(paras.getDatabaseName())));
tableData = DataOperator.getInstance().previewTableData(tableDataLocal, java.util.Collections.EMPTY_MAP,
DesignerEnvManager.getEnvManager().getMaxNumberOrPreviewRow());
} catch (Exception e) {
@@ -590,6 +609,13 @@ public class ChoosePane extends BasicBeanPane implements Refresha
});
}
+ /**
+ * 数据集选择面板里的生成sql语句的接口
+ */
+ public interface SelectSqlProcessor {
+ String createSelectSql(String schema, String tableName, Dialect dialect);
+ }
+
protected class StringUIComboBox extends UIComboBox {
private boolean refreshingModel = false;
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/ReportTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/ReportTableDataPane.java
index b480e168c4..79c160489b 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/ReportTableDataPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/ReportTableDataPane.java
@@ -59,4 +59,8 @@ public class ReportTableDataPane extends LoadingBasicPane {
public Map getDsNameChangedMap() {
return tdPane.getDsNameChangedMap();
}
+
+ public boolean isNamePermitted() {
+ return tdPane.isNamePermitted();
+ }
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataComboBox.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataComboBox.java
index dddb269bc8..ebbdbf0f35 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataComboBox.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataComboBox.java
@@ -34,6 +34,7 @@ public class TableDataComboBox extends UIComboBox implements Prepare4DataSourceC
private static final long serialVersionUID = 1L;
private boolean refresModel = false;
private String treeName; //树数据集本身的名字
+ private ChangeListener changeListener;
public TableDataComboBox(TableDataSource source){
this(source,StringUtils.EMPTY);
@@ -136,15 +137,22 @@ public class TableDataComboBox extends UIComboBox implements Prepare4DataSourceC
}
}
- /**
- *注册listener,相应数据集改变
- */
- public void registerDSChangeListener() {
- DesignTableDataManager.addDsChangeListener(new ChangeListener() {
- public void stateChanged(ChangeEvent e) {
- TableDataComboBox.this.refresh(DesignTableDataManager.getEditingTableDataSource());
- }
- });
- }
+ /**
+ *注册listener,相应数据集改变
+ */
+ @Override
+ public void registerDSChangeListener() {
+ changeListener = new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ TableDataComboBox.this.refresh(DesignTableDataManager.getEditingTableDataSource());
+ }
+ };
+ DesignTableDataManager.addDsChangeListener(changeListener);
+ }
+
+ public void registerGlobalDSChangeListener() {
+ DesignTableDataManager.addGlobalDsChangeListener(changeListener);
+ }
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataCreatorProducer.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataCreatorProducer.java
index 533139b376..bebcd14e25 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataCreatorProducer.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataCreatorProducer.java
@@ -35,6 +35,7 @@ public class TableDataCreatorProducer {
"ds",
"/com/fr/design/images/data/database.png", DBTableData.class, DBTableDataPane.class);
TableDataNameObjectCreator ds_Class = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Class"),
+ "Class",
"/com/fr/design/images/data/source/classTableData.png", ClassTableData.class, ClassTableDataPane.class);
TableDataNameObjectCreator table = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Embedded"),
"Embedded",
@@ -60,6 +61,7 @@ public class TableDataCreatorProducer {
"Proc",
"/com/fr/design/images/data/store_procedure.png",
StoreProcedure.class, ProcedureDataPane.class) {
+ @Override
public boolean shouldInsertSeparator() {
return true;
}
@@ -69,29 +71,44 @@ public class TableDataCreatorProducer {
}
public TableDataNameObjectCreator[] createServerTableDataCreator() {
- TableDataNameObjectCreator dataBase = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DS_Database_Query"), "/com/fr/design/images/data/dock/serverdatabase.png", DBTableData.class,
+ TableDataNameObjectCreator dataBase = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DS_Database_Query"),
+ "ds",
+ "/com/fr/design/images/data/dock/serverdatabase.png", DBTableData.class,
DBTableDataPane.class);
- TableDataNameObjectCreator ds_Class = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Class"), "/com/fr/design/images/data/dock/serverclasstabledata.png", ClassTableData.class,
+ TableDataNameObjectCreator ds_Class = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Class"),
+ "Class",
+ "/com/fr/design/images/data/dock/serverclasstabledata.png", ClassTableData.class,
ClassTableDataPane.class);
- TableDataNameObjectCreator table = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Embedded"), "/com/fr/design/images/data/dock/serverdatatable.png", EmbeddedTableData.class,
+ TableDataNameObjectCreator table = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Embedded"),
+ "Embedded",
+ "/com/fr/design/images/data/dock/serverdatatable.png", EmbeddedTableData.class,
EmbeddedTableDataPane.class);
- TableDataNameObjectCreator fileTable = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_File"), "/com/fr/design/images/data/file.png", FileTableData.class,
+ TableDataNameObjectCreator fileTable = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_File"),
+ "File",
+ "/com/fr/design/images/data/file.png", FileTableData.class,
FileTableDataSmallPane.class);
- TableDataNameObjectCreator treeTable = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Tree"), "/com/fr/design/images/data/tree.png",
+ TableDataNameObjectCreator treeTable = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Tree"),
+ "Tree",
+ "/com/fr/design/images/data/tree.png",
RecursionTableData.class, GlobalTreeTableDataPane.class) {
public boolean isNeedParameterWhenPopulateJControlPane() {
return true;
}
};
- TableDataNameObjectCreator multiTable = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Relation"), "/com/fr/design/images/data/multi.png",
+ TableDataNameObjectCreator multiTable = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Relation"),
+ "Multi",
+ "/com/fr/design/images/data/multi.png",
ConditionTableData.class, GlobalMultiTDTableDataPane.class) {
public boolean isNeedParameterWhenPopulateJControlPane() {
return true;
}
};
- TableDataNameObjectCreator storeProcedure = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Stored_Procedure"), "/com/fr/design/images/data/store_procedure.png",
+ TableDataNameObjectCreator storeProcedure = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Stored_Procedure"),
+ "Proc",
+ "/com/fr/design/images/data/store_procedure.png",
StoreProcedure.class, ProcedureDataPane.class) {
+ @Override
public boolean shouldInsertSeparator() {
return true;
}
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataNameObjectCreator.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataNameObjectCreator.java
index a90f7a1263..3f0f08f35c 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataNameObjectCreator.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataNameObjectCreator.java
@@ -5,10 +5,13 @@ import com.fr.data.impl.DBTableData;
import com.fr.design.actions.tabledata.TableDataAction;
import com.fr.design.beans.BasicBeanPane;
import com.fr.design.gui.controlpane.NameObjectCreator;
+import com.fr.design.gui.controlpane.UnrepeatedNameHelper;
import com.fr.design.icon.WarningIcon;
import com.fr.general.ComparatorUtils;
+import com.fr.general.NameObject;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.ArrayUtils;
+import com.fr.stable.Nameable;
import com.fr.stable.StringUtils;
import javax.swing.Icon;
@@ -95,6 +98,7 @@ public class TableDataNameObjectCreator extends NameObjectCreator {
*
* @return 图片
*/
+ @Override
public Icon menuIcon() {
return createMenuIcon();
}
@@ -112,6 +116,7 @@ public class TableDataNameObjectCreator extends NameObjectCreator {
*
* @return 提示
*/
+ @Override
public String createTooltip() {
return b ? com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connect_SQL_Cannot_Null") : null;
}
@@ -166,11 +171,21 @@ public class TableDataNameObjectCreator extends NameObjectCreator {
return false;
}
+ @Override
public boolean equals(Object obj) {
return obj instanceof TableDataNameObjectCreator
&& ComparatorUtils.equals(menuName, ((TableDataNameObjectCreator) obj).menuName);
}
+ @Override
+ public Nameable createNameable(UnrepeatedNameHelper helper) {
+ try {
+ return new NameObject(helper.createUnrepeatedName(this.getPrefix()), clazzOfInitCase.newInstance());
+ } catch (InstantiationException | IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
@Override
public int hashCode() {
return menuName == null ? 0 : menuName.hashCode();
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java
index 4d656a76e7..8c09eb3035 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java
@@ -4,7 +4,9 @@ import com.fr.base.TableData;
import com.fr.data.TableDataSource;
import com.fr.data.api.StoreProcedureAssist;
import com.fr.data.impl.storeproc.StoreProcedure;
+import com.fr.design.data.BasicTableDataUtils;
import com.fr.design.data.DesignTableDataManager;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.controlpane.JListControlPane;
import com.fr.design.gui.controlpane.NameableCreator;
import com.fr.design.gui.ilist.ListModelElement;
@@ -13,6 +15,7 @@ import com.fr.file.ProcedureConfig;
import com.fr.file.TableDataConfig;
import com.fr.general.ComparatorUtils;
import com.fr.general.NameObject;
+import com.fr.stable.ArrayUtils;
import com.fr.stable.Nameable;
import com.fr.stable.StringUtils;
import com.fr.stable.core.PropertyChangeAdapter;
@@ -46,10 +49,21 @@ public class TableDataPaneListPane extends JListControlPane implements TableData
allListNames[nameableList.getSelectedIndex()] = StringUtils.EMPTY;
String tempName = getEditingName();
Object editingType = getEditingType();
+
+ if (!BasicTableDataUtils.checkName(tempName)) {
+ isNamePermitted = false;
+ nameableList.stopEditing();
+ setIllegalIndex(editingIndex);
+ return;
+ }
+
if (StringUtils.isEmpty(tempName)) {
isNamePermitted = false;
nameableList.stopEditing();
- JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TableDataPaneListPane.this), Toolkit.i18nText("Fine-Design_Basic_Table_Data_Empty_Name_Tips"));
+ FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TableDataPaneListPane.this),
+ Toolkit.i18nText("Fine-Design_Basic_Table_Data_Empty_Name_Tips"),
+ Toolkit.i18nText("Fine-Design_Report_Alert"),
+ JOptionPane.WARNING_MESSAGE);
setIllegalIndex(editingIndex);
return;
}
@@ -58,17 +72,17 @@ public class TableDataPaneListPane extends JListControlPane implements TableData
&& isNameRepeated(new List[]{Arrays.asList(allDSNames), Arrays.asList(allListNames)}, tempName)) {
isNamePermitted = false;
nameableList.stopEditing();
- JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TableDataPaneListPane.this), Toolkit.i18nText("Fine-Design_Basic_Table_Data_Duplicate_Name_Tips", tempName));
+ FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TableDataPaneListPane.this), Toolkit.i18nText("Fine-Design_Basic_Table_Data_Duplicate_Name_Tips", tempName));
setIllegalIndex(editingIndex);
} else if (editingType instanceof StoreProcedure && isIncludeUnderline(tempName)) {
isNamePermitted = false;
nameableList.stopEditing();
- JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TableDataPaneListPane.this), Toolkit.i18nText("Fine-Design_Basic_Stored_Procedure_Name_Tips"));
+ FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TableDataPaneListPane.this), Toolkit.i18nText("Fine-Design_Basic_Stored_Procedure_Name_Tips"));
setIllegalIndex(editingIndex);
}
if (nameableList.getSelectedValue() instanceof ListModelElement) {
Nameable selected = ((ListModelElement) nameableList.getSelectedValue()).wrapper;
- if (!ComparatorUtils.equals(tempName, selected.getName())) {
+ if (!ComparatorUtils.equals(tempName, selected.getName()) && !isNameRepeated(new List[]{Arrays.asList(allDSNames), Arrays.asList(allListNames)}, tempName)) {
rename(selected.getName(), tempName);
}
@@ -132,36 +146,28 @@ public class TableDataPaneListPane extends JListControlPane implements TableData
return super.createUnrepeatedName(prefix);
}
String[] allDsNames = DesignTableDataManager.getAllDSNames(source);
+
+ // richer:生成的名字从1开始. kunsnat: 添加属性从0开始.
+ int count = 1;
+ while (isDsNameRepeated(prefix + count, allDsNames)) {
+ count++;
+ }
+ return prefix + count;
+ }
+
+ private boolean isDsNameRepeated(String name, String[] allDsNames) {
DefaultListModel model = this.getModel();
Nameable[] all = new Nameable[model.getSize()];
for (int i = 0; i < model.size(); i++) {
all[i] = ((ListModelElement) model.get(i)).wrapper;
}
- // richer:生成的名字从1开始. kunsnat: 添加属性从0开始.
- int count = all.length + 1;
- while (true) {
- String name_test = prefix + count;
- boolean repeated = false;
- for (int i = 0, len = model.size(); i < len; i++) {
- Nameable nameable = all[i];
- if (ComparatorUtils.equals(nameable.getName(), name_test)) {
- repeated = true;
- break;
- }
- }
- for (String dsname : allDsNames) {
- if (ComparatorUtils.equals(dsname, name_test)) {
- repeated = true;
- break;
- }
- }
-
- if (!repeated) {
- return name_test;
+ for (int i = 0, len = model.size(); i < len; i++) {
+ Nameable nameable = all[i];
+ if (ComparatorUtils.equals(nameable.getName(), name)) {
+ return true;
}
-
- count++;
}
+ return ArrayUtils.contains(allDsNames, name);
}
@Override
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java
index 56f81e9a5b..a2cc5b7d28 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java
@@ -9,6 +9,7 @@ import com.fr.design.ExtraDesignClassManager;
import com.fr.design.actions.UpdateAction;
import com.fr.design.constants.UIConstants;
import com.fr.design.data.BasicTableDataTreePane;
+import com.fr.design.data.BasicTableDataUtils;
import com.fr.design.data.DesignTableDataManager;
import com.fr.design.data.tabledata.StoreProcedureWorkerListener;
import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane;
@@ -16,6 +17,9 @@ import com.fr.design.data.tabledata.wrapper.AbstractTableDataWrapper;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.BasicPane;
import com.fr.design.dialog.DialogActionAdapter;
+import com.fr.design.dialog.FineJOptionPane;
+import com.fr.design.file.HistoryTemplateListCache;
+import com.fr.design.fun.TableDataDefineProvider;
import com.fr.design.fun.TableDataPaneProcessor;
import com.fr.design.gui.ibutton.UIHeadGroup;
import com.fr.design.gui.icontainer.UIScrollPane;
@@ -24,12 +28,12 @@ import com.fr.design.gui.itoolbar.UIToolbar;
import com.fr.design.icon.IconPathConstants;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
+import com.fr.design.mainframe.JTemplate;
import com.fr.design.menu.MenuDef;
import com.fr.design.menu.SeparatorDef;
import com.fr.design.menu.ToolBarDef;
import com.fr.general.ComparatorUtils;
import com.fr.general.GeneralContext;
-
import com.fr.general.NameObject;
import com.fr.plugin.context.PluginContext;
import com.fr.plugin.injectable.PluginModule;
@@ -38,8 +42,13 @@ import com.fr.plugin.observer.PluginEvent;
import com.fr.plugin.observer.PluginEventListener;
import com.fr.stable.core.PropertyChangeAdapter;
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.BorderFactory;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import javax.swing.ToolTipManager;
+import java.awt.BorderLayout;
+import java.awt.GridLayout;
import java.awt.dnd.DnDConstants;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
@@ -51,7 +60,7 @@ import java.util.Map;
public class TableDataTreePane extends BasicTableDataTreePane {
private static TableDataTreePane singleton = new TableDataTreePane();
-
+
public static final int PLUGIN_LISTENER_PRIORITY = 1;
public synchronized static BasicTableDataTreePane getInstance(DesignModelAdapter, ?> tc) {
@@ -88,23 +97,9 @@ public class TableDataTreePane extends BasicTableDataTreePane {
addMenuDef.setIconPath(IconPathConstants.ADD_POPMENU_ICON_PATH);
createAddMenuDef();
-
- GeneralContext.listenPluginRunningChanged(new PluginEventListener(PLUGIN_LISTENER_PRIORITY) {
-
- @Override
- public void on(PluginEvent event) {
-
- addMenuDef.clearShortCuts();
- createAddMenuDef();
- }
- }, new PluginFilter() {
-
- @Override
- public boolean accept(PluginContext context) {
-
- return context.contain(PluginModule.ExtraDesign);
- }
- });
+
+ // 创建插件监听
+ createPluginListener();
editAction = new EditAction();
removeAction = new RemoveAction();
@@ -146,6 +141,55 @@ public class TableDataTreePane extends BasicTableDataTreePane {
checkButtonEnabled();
}
+ private void createPluginListener() {
+
+ //菜单栏监听
+ GeneralContext.listenPluginRunningChanged(new PluginEventListener(PLUGIN_LISTENER_PRIORITY) {
+
+ @Override
+ public void on(PluginEvent event) {
+
+ addMenuDef.clearShortCuts();
+ createAddMenuDef();
+ }
+ }, new PluginFilter() {
+
+ @Override
+ public boolean accept(PluginContext context) {
+
+ return context.contain(PluginModule.ExtraDesign);
+ }
+ });
+
+ //监听数据集插件
+ GeneralContext.listenPluginRunningChanged(new PluginEventListener() {
+ @Override
+ public void on(PluginEvent event) {
+ //REPORT-25577
+ //如果数据集插件禁用或启用。需要清空当前模板中的缓存
+ reloadCurrTemplate();
+ }
+
+ private void reloadCurrTemplate() {
+ JTemplate, ?> jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
+ if (accept(jt)) {
+ jt.refreshResource();
+ }
+ }
+
+ private boolean accept(JTemplate, ?> jt) {
+
+ return jt != null && jt.getEditingFILE() != null && jt.getEditingFILE().exists();
+ }
+ }, new PluginFilter() {
+ @Override
+ public boolean accept(PluginContext pluginContext) {
+
+ return pluginContext.contain(TableDataDefineProvider.XML_TAG);
+ }
+ });
+ }
+
protected void checkButtonEnabled() {
super.checkButtonEnabled(editAction, previewTableDataAction, removeAction, op, dataTree);
@@ -243,6 +287,7 @@ public class TableDataTreePane extends BasicTableDataTreePane {
if (selectedNO == null) {
return;
}
+ DesignTableDataManager.removeSelectedColumnNames(selectedNO.getName());
dgEdit(((AbstractTableDataWrapper) selectedNO.getObject()).creatTableDataPane(), selectedNO.getName(), false);
}
}
@@ -263,7 +308,7 @@ public class TableDataTreePane extends BasicTableDataTreePane {
return;
}
- int returnVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + ":" + selectedNO.getName() + "?",
+ int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + ":" + selectedNO.getName() + "?",
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if (returnVal == JOptionPane.OK_OPTION) {
// richer:这个地方为什么要在DataSourceTree里面去remove呢?多此一举吧
@@ -274,6 +319,7 @@ public class TableDataTreePane extends BasicTableDataTreePane {
dataTree.setSelectionRow(dataTree.getRowCount() - 1);
fireDSChanged();
checkButtonEnabled();
+ DesignTableDataManager.removeSelectedColumnNames(selectedNO.getName());
}
}
}
@@ -294,10 +340,11 @@ public class TableDataTreePane extends BasicTableDataTreePane {
/**
* 合并数据集
- * @param srcName 数据集来源(比如报表块,就是报表块的名称)
+ *
+ * @param srcName 数据集来源(比如报表块,就是报表块的名称)
* @param tableDataSource 数据集
*/
- public Map addTableData(String srcName, TableDataSource tableDataSource) {
+ public Map addTableData(String srcName, TableDataSource tableDataSource, boolean isCover) {
Map tdNameMap = new HashMap<>();
allDSNames = DesignTableDataManager.getAllDSNames(tc.getBook());
DesignTableDataManager.setThreadLocal(DesignTableDataManager.NO_PARAMETER);
@@ -307,14 +354,8 @@ public class TableDataTreePane extends BasicTableDataTreePane {
String tdName = (String) tdIterator.next();
String oldName = tdName;
TableData td = tableDataSource.getTableData(tdName);
- if (tds.getTableData(tdName) != null || isDsNameRepeaded(tdName)) {//如果有同名的就拼上来源名称
- tdName = srcName + tdName;
- }
- int i = 0;
- while (tds.getTableData(tdName) != null) {
- i++;//如果拼上名字后依然已经存在就加编号
- tdName += i;
- }
+ boolean isDsNameRepeaded = isDsNameRepeaded(tdName);
+ tdName = BasicTableDataUtils.getTableDataName(isCover, tds, tdName, srcName, isDsNameRepeaded);
tds.putTableData(tdName, td);
if (!ComparatorUtils.equals(oldName, tdName)) {
tdNameMap.put(oldName, tdName);
@@ -322,8 +363,19 @@ public class TableDataTreePane extends BasicTableDataTreePane {
}
tc.parameterChanged();
dataTree.refresh();
- return Collections.unmodifiableMap(tdNameMap);
+ return Collections.unmodifiableMap(tdNameMap);
}
+
+ @Override
+ public void removeTableData(String sourceName) {
+ TableDataSource tds = tc.getBook();
+ tds.removeTableData(sourceName);
+ dataTree.refresh();
+ }
+
+
+
+
public void addDataPane(final AbstractTableDataPane> uPanel, String paneName) {
final NamePane nPanel = uPanel.asNamePane();
nPanel.setObjectName(paneName);
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataComboBox.java b/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataComboBox.java
index 1e0d2c77e4..8b5c626571 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataComboBox.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataComboBox.java
@@ -2,6 +2,7 @@ package com.fr.design.data.datapane;
import com.fr.data.TableDataSource;
import com.fr.data.impl.RecursionTableData;
+import com.fr.design.data.DesignTableDataManager;
import com.fr.design.data.tabledata.wrapper.ServerTableDataWrapper;
import com.fr.design.data.tabledata.wrapper.TableDataWrapper;
import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper;
@@ -70,8 +71,14 @@ public class TreeTableDataComboBox extends UIComboBox {
}
public void setSelectedTableDataByName(String name) {
- TableDataWrapper tableDataWrappe = res_map.get(name);
- this.getModel().setSelectedItem(tableDataWrappe);
+ TableDataWrapper tableDataWrapper;
+ if (res_map.get(name) != null) {
+ tableDataWrapper = res_map.get(name);
+ } else {
+ String changeName = DesignTableDataManager.getChangedDsNameByOldDsName(name);
+ tableDataWrapper = res_map.get(changeName);
+ }
+ this.getModel().setSelectedItem(tableDataWrapper);
}
@Override
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java
index a14944d5e6..1e3f96a986 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java
@@ -4,6 +4,7 @@ import com.fr.data.impl.Connection;
import com.fr.data.impl.JDBCDatabaseConnection;
import com.fr.data.impl.JNDIDatabaseConnection;
import com.fr.design.ExtraDesignClassManager;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.fun.ConnectionProvider;
import com.fr.design.gui.controlpane.JListControlPane;
import com.fr.design.gui.controlpane.NameObjectCreator;
@@ -43,7 +44,7 @@ public class ConnectionListPane extends JListControlPane implements ConnectionSh
String tempName = getEditingName();
if (StringUtils.isEmpty(tempName)) {
nameableList.stopEditing();
- JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(ConnectionListPane.this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Empty_Name"));
+ FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(ConnectionListPane.this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Empty_Name"));
setIllegalIndex(editingIndex);
isNamePermitted = false;
return;
@@ -53,7 +54,7 @@ public class ConnectionListPane extends JListControlPane implements ConnectionSh
isNamePermitted = false;
nameableList.stopEditing();
String message = Toolkit.i18nText("Fine-Design_Basic_Connection_Duplicate_Name", tempName);
- JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(ConnectionListPane.this), message);
+ FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(ConnectionListPane.this), message);
setIllegalIndex(editingIndex);
}
if (isNamePermitted && !ComparatorUtils.equals(tempName, selectedName)) {
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java
index 7bbcda825f..5e8199d953 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java
@@ -1,5 +1,6 @@
package com.fr.design.data.datapane.connect;
+import com.fr.base.GraphHelper;
import com.fr.design.constants.UIConstants;
import com.fr.data.impl.JDBCDatabaseConnection;
import com.fr.data.pool.DBCPConnectionPoolAttr;
@@ -16,7 +17,9 @@ import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.dialog.BasicPane;
import com.fr.design.editor.editor.IntegerEditor;
+import com.fr.design.utils.BrowseUtils;
import com.fr.file.filter.ChooseFileFilter;
+import com.fr.general.CloudCenter;
import com.fr.general.ComparatorUtils;
import com.fr.stable.StringUtils;
@@ -32,351 +35,375 @@ import java.util.Map;
import java.util.Map.Entry;
public class JDBCDefPane extends JPanel {
- public static final String DRIVER_TYPE = "driver_type";
- public static final String USER_NAME = "user_name";
+ public static final String DRIVER_TYPE = "driver_type";
+ public static final String USER_NAME = "user_name";
public static final int TIME_MULTIPLE = 1000;
- private static final String OTHER_DB = "Others";
-
- private static Map jdbcMap = new HashMap();
-
- static {
- jdbcMap.put(OTHER_DB, new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:"),
- new DriverURLName("org.hsqldb.jdbcDriver", "jdbc:hsqldb:file:[PATH_TO_DB_FILES]"), new DriverURLName("com.inet.tds.TdsDriver", "jdbc:inetdae7:localhost:1433/"),
- new DriverURLName("COM.cloudscape.JDBCDriver", "jdbc:cloudscape:/cloudscape/"),
- new DriverURLName("com.internetcds.jdbc.tds.Driver", "jdbc:freetds:sqlserver://localhost/"),
- new DriverURLName("com.fr.swift.jdbc.Driver", "jdbc:swift:emb://default")});
- jdbcMap.put("Inceptor",new DriverURLName[]{new DriverURLName("org.apache.hive.jdbc.HiveDriver","jdbc:inceptor2://localhost:10000/default"),
- new DriverURLName("org.apache.hadoop.hive.jdbc.HiveDriver","jdbc:inceptor://localhost:10000/default")});
- jdbcMap.put("Oracle", new DriverURLName[]{new DriverURLName("oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@localhost:1521:databaseName")});
- jdbcMap.put("DB2", new DriverURLName[]{new DriverURLName("com.ibm.db2.jcc.DB2Driver", "jdbc:db2://localhost:50000/")});
- jdbcMap.put("SQL Server", new DriverURLName[]{new DriverURLName("com.microsoft.sqlserver.jdbc.SQLServerDriver", "jdbc:sqlserver://localhost:1433;" + "databaseName=")});
- jdbcMap.put("MySQL", new DriverURLName[]{new DriverURLName("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/"),
- new DriverURLName("org.gjt.mm.mysql.Driver", "jdbc:mysql://localhost/")});
- jdbcMap.put("Sybase", new DriverURLName[]{new DriverURLName("com.sybase.jdbc2.jdbc.SybDriver", "jdbc:sybase:Tds:localhost:5000/")});
- jdbcMap.put("Access", new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=")});
- jdbcMap.put("Derby", new DriverURLName[]{new DriverURLName("org.apache.derby.jdbc.ClientDriver", "jdbc:derby://localhost:1527/")});
- jdbcMap.put("Postgre", new DriverURLName[]{new DriverURLName("org.postgresql.Driver", "jdbc:postgresql://localhost:5432/")});
- jdbcMap.put("SQLite", new DriverURLName[]{new DriverURLName("org.sqlite.JDBC", "jdbc:sqlite://${ENV_HOME}/../help/FRDemo.db")});
- }
-
- private UIButton dbtypeButton;
- private UIComboBox dbtypeComboBox;
- private UIComboBox driverComboBox;
- private UITextField urlTextField;
- private UITextField userNameTextField;
- private JPasswordField passwordTextField;
- // 请不要改动dbtype,只应该最后添加
- private final String[] dbtype = {"Oracle", "DB2", "SQL Server", "MySQL", "Sybase", "Access", "Derby", "Postgre","SQLite","Inceptor", OTHER_DB};
-
- // carl:DBCP的一些属性
- private IntegerEditor DBCP_INITIAL_SIZE = new IntegerEditor();
- private IntegerEditor DBCP_MAX_ACTIVE = new IntegerEditor();
- private IntegerEditor DBCP_MAX_IDLE = new IntegerEditor();
- private IntegerEditor DBCP_MIN_IDLE = new IntegerEditor();
- private IntegerEditor DBCP_MAX_WAIT = new IntegerEditor();
- private UITextField DBCP_VALIDATION_QUERY = new UITextField();
-
- private UIComboBox DBCP_TESTONBORROW = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")});
- private UIComboBox DBCP_TESTONRETURN = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")});
- private UIComboBox DBCP_TESTWHILEIDLE = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")});
-
- private IntegerEditor DBCP_TIMEBETWEENEVICTIONRUNSMILLS = new IntegerEditor();
- private IntegerEditor DBCP_NUMTESTSPEREVICTIONRUN = new IntegerEditor();
- private IntegerEditor DBCP_MINEVICTABLEIDLETIMEMILLIS = new IntegerEditor();
-
- public JDBCDefPane() {
- this.setBorder(UITitledBorder.createBorderWithTitle("JDBC" + ":"));
- this.setLayout(FRGUIPaneFactory.createLabelFlowLayout());
- JPanel innerthis = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane();
- innerthis.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
- this.add(innerthis);
- dbtypeComboBox = new UIComboBox();
- dbtypeComboBox.setName(DRIVER_TYPE);
- for (int i = 0; i < dbtype.length; i++) {
- dbtypeComboBox.addItem(dbtype[i]);
- }
- dbtypeComboBox.addActionListener(dbtypeActionListener);
- dbtypeComboBox.setMaximumRowCount(10);
-
- driverComboBox = new UIComboBox();
- driverComboBox.setEditable(true);
- driverComboBox.addActionListener(driverListener);
- urlTextField = new UITextField(15);
- userNameTextField = new UITextField(15);
- userNameTextField.setName(USER_NAME);
- passwordTextField = new UIPassWordField(15);
- dbtypeButton = new UIButton(".");
- dbtypeButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Click_Get_Default_URL"));
- dbtypeButton.addActionListener(dbtypeButtonActionListener);
-
- double p = TableLayout.PREFERRED;
- double f = TableLayout.FILL;
- JPanel dbtypePane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane();
- dbtypePane.add(new UILabel((com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database") + ":")));
- JPanel dbtypeComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane();
- Component[][] dbtypeComComponents = {{dbtypeComboBox}};
- double[] dbtypeRowSize = {p};
- double[] dbtypeColumnSize = {p};
- dbtypeComPane = TableLayoutHelper.createTableLayoutPane(dbtypeComComponents, dbtypeRowSize, dbtypeColumnSize);
-
- JPanel driverPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane();
- driverPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Driver") + ":"));
-
- JPanel urlPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane();
- urlPane.add(new UILabel("URL:"));
- JPanel urlComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane();
- Component[][] urlComComponents = {{urlTextField, dbtypeButton}};
- double[] urlRowSize = {p};
- double[] urlColumnSize = {f, 21};
- urlComPane = TableLayoutHelper.createCommonTableLayoutPane(urlComComponents, urlRowSize, urlColumnSize, 4);
-
- JPanel userPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane();
- userPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_UserName") + ":"));
- JPanel userComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane();
- Component[][] userComComponents = {{userNameTextField, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Password") + ":"), passwordTextField}};
- double[] userRowSize = {p};
- double[] userColumnSize = {f, p, f};
- userComPane = TableLayoutHelper.createCommonTableLayoutPane(userComComponents, userRowSize, userColumnSize, 4);
-
- JPanel passwordPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane();
- passwordPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Password") + ":"));
-
- Component[][] components = {{dbtypePane, dbtypeComPane}, {driverPane, driverComboBox}, {urlPane, urlComPane}, {userPane, userComPane},};
-
- double[] rowSize = {p, p, p, p};
- double[] columnSize = {p, f, 22};
- JPanel centerPanel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 6);
- innerthis.add(centerPanel);
- JPanel southPanel = FRGUIPaneFactory.createBorderLayout_S_Pane();
- innerthis.add(southPanel);
- southPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 4, 20));
- ActionLabel actionLabel = new ActionLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr"));
- southPanel.add(actionLabel, BorderLayout.EAST);
- actionLabel.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent evt) {
- JDialog wDialog = createJDialog();
- wDialog.setVisible(true);
- }
- });
- }
-
- public void populate(JDBCDatabaseConnection jdbcDatabase) {
- if (jdbcDatabase == null) {
- jdbcDatabase = new JDBCDatabaseConnection();
- }
- if (ComparatorUtils.equals(jdbcDatabase.getDriver(), "sun.jdbc.odbc.JdbcOdbcDriver")
- && jdbcDatabase.getURL().startsWith("jdbc:odbc:Driver={Microsoft")) {
- this.dbtypeComboBox.setSelectedItem("Access");
- } else {
- Iterator> jdbc = jdbcMap.entrySet().iterator();
- boolean out = false;
- while (jdbc.hasNext()) {
- Entry entry = jdbc.next();
- DriverURLName[] dus = entry.getValue();
- for (int i = 0, len = dus.length; i < len; i++) {
- if (ComparatorUtils.equals(dus[i].getDriver(), jdbcDatabase.getDriver())) {
- this.dbtypeComboBox.setSelectedItem(entry.getKey());
- out = true;
- break;
- }
- }
- if (out) {
- break;
- }
- }
- if (!out) {
- this.dbtypeComboBox.setSelectedItem(OTHER_DB);
- }
- }
- this.driverComboBox.setSelectedItem(jdbcDatabase.getDriver());
- this.urlTextField.setText(jdbcDatabase.getURL());
- this.userNameTextField.setText(jdbcDatabase.getUser());
- this.passwordTextField.setText(jdbcDatabase.getPassword());
-
- DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr();
- if (dbcpAttr == null) {
- dbcpAttr = new DBCPConnectionPoolAttr();
- jdbcDatabase.setDbcpAttr(dbcpAttr);
- }
- this.DBCP_INITIAL_SIZE.setValue(dbcpAttr.getInitialSize());
- this.DBCP_MAX_ACTIVE.setValue(dbcpAttr.getMaxActive());
- this.DBCP_MAX_IDLE.setValue(dbcpAttr.getMaxIdle());
- this.DBCP_MAX_WAIT.setValue(dbcpAttr.getMaxWait());
- this.DBCP_MIN_IDLE.setValue(dbcpAttr.getMinIdle());
- this.DBCP_VALIDATION_QUERY.setText(dbcpAttr.getValidationQuery());
- this.DBCP_TESTONBORROW.setSelectedIndex(dbcpAttr.isTestOnBorrow() ? 1 : 0);
- this.DBCP_TESTONRETURN.setSelectedIndex(dbcpAttr.isTestOnReturn() ? 1 : 0);
- this.DBCP_TESTWHILEIDLE.setSelectedIndex(dbcpAttr.isTestWhileIdle() ? 1 : 0);
- this.DBCP_MINEVICTABLEIDLETIMEMILLIS.setValue(dbcpAttr.getMinEvictableIdleTimeMillis() / TIME_MULTIPLE);
- this.DBCP_NUMTESTSPEREVICTIONRUN.setValue(dbcpAttr.getNumTestsPerEvictionRun());
- this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.setValue(dbcpAttr.getTimeBetweenEvictionRunsMillis());
- }
-
- public JDBCDatabaseConnection update() {
- JDBCDatabaseConnection jdbcDatabase = new JDBCDatabaseConnection();
- Object driveItem = this.driverComboBox.getSelectedItem();
- jdbcDatabase.setDriver(driveItem == null ? null : driveItem.toString());
- jdbcDatabase.setURL(this.urlTextField.getText().trim());
- jdbcDatabase.setUser(this.userNameTextField.getText().trim());
- jdbcDatabase.setPassword(new String(this.passwordTextField.getPassword()).trim());
-
- DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr();
- if (dbcpAttr == null) {
- dbcpAttr = new DBCPConnectionPoolAttr();
- jdbcDatabase.setDbcpAttr(dbcpAttr);
- }
- dbcpAttr.setInitialSize(this.DBCP_INITIAL_SIZE.getValue().intValue());
- dbcpAttr.setMaxActive(this.DBCP_MAX_ACTIVE.getValue().intValue());
- dbcpAttr.setMaxIdle(this.DBCP_MAX_IDLE.getValue().intValue());
- dbcpAttr.setMaxWait(this.DBCP_MAX_WAIT.getValue().intValue());
- dbcpAttr.setMinIdle(this.DBCP_MIN_IDLE.getValue().intValue());
- dbcpAttr.setValidationQuery(this.DBCP_VALIDATION_QUERY.getText());
- dbcpAttr.setTestOnBorrow(this.DBCP_TESTONBORROW.getSelectedIndex() == 0 ? false : true);
- dbcpAttr.setTestOnReturn(this.DBCP_TESTONRETURN.getSelectedIndex() == 0 ? false : true);
- dbcpAttr.setTestWhileIdle(this.DBCP_TESTWHILEIDLE.getSelectedIndex() == 0 ? false : true);
- dbcpAttr.setMinEvictableIdleTimeMillis(((Number) this.DBCP_MINEVICTABLEIDLETIMEMILLIS.getValue()).intValue() * TIME_MULTIPLE);
- dbcpAttr.setNumTestsPerEvictionRun(((Number) this.DBCP_NUMTESTSPEREVICTIONRUN.getValue()).intValue());
- dbcpAttr.setTimeBetweenEvictionRunsMillis(((Number) this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.getValue()).intValue());
-
- return jdbcDatabase;
- }
-
- ActionListener dbtypeActionListener = new ActionListener() {
- public void actionPerformed(ActionEvent evt) {
-
- urlTextField.setText(StringUtils.EMPTY);
- driverComboBox.removeAllItems();
- if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) {
- driverComboBox.setSelectedItem(StringUtils.EMPTY);
- return;
- }
-
- DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem());
- for (int i = 0, len = dus.length; i < len; i++) {
- driverComboBox.addItem(dus[i].getDriver());
- if (i == 0) {
- driverComboBox.setSelectedItem(dus[i].getDriver());
- urlTextField.setText(dus[i].getURL());
- }
- }
- }
- };
-
- ActionListener driverListener = new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- if (driverComboBox.getSelectedItem() == null ||ComparatorUtils.equals(driverComboBox.getSelectedItem(), StringUtils.EMPTY)) {
- return;
- }
- Iterator> jdbc = jdbcMap.entrySet().iterator();
- while (jdbc.hasNext()) {
- Entry entry = jdbc.next();
- DriverURLName[] dus = entry.getValue();
- for (int i = 0, len = dus.length; i < len; i++) {
- if (ComparatorUtils.equals(dus[i].getDriver(), (driverComboBox.getSelectedItem()))) {
- urlTextField.setText(dus[i].getURL());
- return;
- }
- }
- }
- }
-
- };
-
- ActionListener dbtypeButtonActionListener = new ActionListener() {
- public void actionPerformed(ActionEvent evt) {
- if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) {
- return;
- }
- DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem());
- for (int i = 0, len = dus.length; i < len; i++) {
- if (ComparatorUtils.equals(driverComboBox.getSelectedItem(), (dus[i].getDriver()))) {
- urlTextField.setText(dus[i].getURL());
- if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), ("Access"))) {
- // ben:这个能不能换种处理方案- -
- JFileChooser filechooser = new JFileChooser();
- filechooser.setDialogTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Open"));
- filechooser.setMultiSelectionEnabled(false);
- filechooser.addChoosableFileFilter(new ChooseFileFilter(new String[]{"accdb", "mdb"}, "Microsoft Office Access"));
- int result = filechooser.showOpenDialog(DesignerContext.getDesignerFrame());
- File selectedfile = null;
-
- if (result == JFileChooser.APPROVE_OPTION) {
- selectedfile = filechooser.getSelectedFile();
- if (selectedfile != null) {
- String selectedName = selectedfile.getPath().substring(selectedfile.getPath().lastIndexOf('.') + 1);
- if (selectedName.equalsIgnoreCase("mdb") || selectedName.equalsIgnoreCase("accdb")) {
- urlTextField.setText(urlTextField.getText() + selectedfile.getPath());
- }
- }
- }
- }
- break;
- }
- }
- }
- };
-
- private JDialog createJDialog() {
- return new DBCPAttrPane().showWindow(SwingUtilities.getWindowAncestor(JDBCDefPane.this));
- }
-
- class DBCPAttrPane extends BasicPane {
- public DBCPAttrPane() {
- JPanel defaultPane = this;
-
- // JPanel northFlowPane
- JPanel northFlowPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane();
- defaultPane.add(northFlowPane, BorderLayout.NORTH);
-
- DBCP_VALIDATION_QUERY.setColumns(15);
- // ContextPane
-
- double f = TableLayout.FILL;
- // double p = TableLayout.PREFERRED;
- double[] rowSize = {f, f, f, f, f, f, f, f, f, f, f, f};
- double[] columnSize = {f, f};
- Component[][] comps = {
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Initial_Size") + ":", SwingConstants.RIGHT), DBCP_INITIAL_SIZE},
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Active") + ":", SwingConstants.RIGHT), DBCP_MAX_ACTIVE},
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Idle") + ":", SwingConstants.RIGHT), DBCP_MAX_IDLE},
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Min_Idle") + ":", SwingConstants.RIGHT), DBCP_MIN_IDLE},
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Max_Wait_Time") + ":" , SwingConstants.RIGHT), DBCP_MAX_WAIT},
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Validation_Query") + ":", SwingConstants.RIGHT), DBCP_VALIDATION_QUERY},
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Borrow") + ":", SwingConstants.RIGHT), DBCP_TESTONBORROW},
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Return") + ":", SwingConstants.RIGHT), DBCP_TESTONRETURN},
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_While_Idle") + ":", SwingConstants.RIGHT), DBCP_TESTWHILEIDLE},
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Evictionruns_millis") + ":", SwingConstants.RIGHT),
- DBCP_TIMEBETWEENEVICTIONRUNSMILLS},
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Num_Test_Per_Evction_Run") + ":", SwingConstants.RIGHT), DBCP_NUMTESTSPEREVICTIONRUN},
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Mix_Evictable_Idle_Time_Millis") + ":" , SwingConstants.RIGHT),
- DBCP_MINEVICTABLEIDLETIMEMILLIS}};
-
- JPanel contextPane = TableLayoutHelper.createGapTableLayoutPane(comps, rowSize, columnSize, 10, 4);
- contextPane.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, UIConstants.LINE_COLOR));
- northFlowPane.add(contextPane);
- }
-
- @Override
- protected String title4PopupWindow() {
- return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr");
- }
- }
-
- private static class DriverURLName {
- public DriverURLName(String driver, String url) {
- this.driver = driver;
- this.url = url;
- }
-
- public String getDriver() {
- return this.driver;
- }
-
- public String getURL() {
- return this.url;
- }
-
- private String driver;
- private String url;
- }
+ private static final String OTHER_DB = "Others";
+
+ private static Map jdbcMap = new HashMap();
+
+ static {
+ jdbcMap.put(OTHER_DB, new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:"),
+ new DriverURLName("org.hsqldb.jdbcDriver", "jdbc:hsqldb:file:[PATH_TO_DB_FILES]"), new DriverURLName("com.inet.tds.TdsDriver", "jdbc:inetdae7:localhost:1433/"),
+ new DriverURLName("COM.cloudscape.JDBCDriver", "jdbc:cloudscape:/cloudscape/"),
+ new DriverURLName("com.internetcds.jdbc.tds.Driver", "jdbc:freetds:sqlserver://localhost/"),
+ new DriverURLName("com.fr.swift.jdbc.Driver", "jdbc:swift:emb://default")});
+ jdbcMap.put("Inceptor", new DriverURLName[]{new DriverURLName("org.apache.hive.jdbc.HiveDriver", "jdbc:inceptor2://localhost:10000/default"),
+ new DriverURLName("org.apache.hadoop.hive.jdbc.HiveDriver", "jdbc:inceptor://localhost:10000/default")});
+ jdbcMap.put("Oracle", new DriverURLName[]{new DriverURLName("oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@localhost:1521:databaseName")});
+ jdbcMap.put("DB2", new DriverURLName[]{new DriverURLName("com.ibm.db2.jcc.DB2Driver", "jdbc:db2://localhost:50000/")});
+ jdbcMap.put("SQL Server", new DriverURLName[]{new DriverURLName("com.microsoft.sqlserver.jdbc.SQLServerDriver", "jdbc:sqlserver://localhost:1433;" + "databaseName=")});
+ jdbcMap.put("MySQL", new DriverURLName[]{new DriverURLName("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/"),
+ new DriverURLName("org.gjt.mm.mysql.Driver", "jdbc:mysql://localhost/")});
+ jdbcMap.put("Sybase", new DriverURLName[]{new DriverURLName("com.sybase.jdbc2.jdbc.SybDriver", "jdbc:sybase:Tds:localhost:5000/")});
+ jdbcMap.put("Access", new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=")});
+ jdbcMap.put("Derby", new DriverURLName[]{new DriverURLName("org.apache.derby.jdbc.ClientDriver", "jdbc:derby://localhost:1527/")});
+ jdbcMap.put("Postgre", new DriverURLName[]{new DriverURLName("org.postgresql.Driver", "jdbc:postgresql://localhost:5432/")});
+ jdbcMap.put("SQLite", new DriverURLName[]{new DriverURLName("org.sqlite.JDBC", "jdbc:sqlite://${ENV_HOME}/../help/FRDemo.db")});
+ }
+
+ private UIButton dbtypeButton;
+ private UIComboBox dbtypeComboBox;
+ private UIComboBox driverComboBox;
+ private UITextField urlTextField;
+ private UITextField userNameTextField;
+ private JPasswordField passwordTextField;
+ private ActionLabel odbcTipsLink;
+ // 请不要改动dbtype,只应该最后添加
+ private final String[] dbtype = {"Oracle", "DB2", "SQL Server", "MySQL", "Sybase", "Access", "Derby", "Postgre", "SQLite", "Inceptor", OTHER_DB};
+
+ // carl:DBCP的一些属性
+ private IntegerEditor DBCP_INITIAL_SIZE = new IntegerEditor();
+ private IntegerEditor DBCP_MAX_ACTIVE = new IntegerEditor();
+ private IntegerEditor DBCP_MAX_IDLE = new IntegerEditor();
+ private IntegerEditor DBCP_MIN_IDLE = new IntegerEditor();
+ private IntegerEditor DBCP_MAX_WAIT = new IntegerEditor();
+ private UITextField DBCP_VALIDATION_QUERY = new UITextField();
+
+ private UIComboBox DBCP_TESTONBORROW = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")});
+ private UIComboBox DBCP_TESTONRETURN = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")});
+ private UIComboBox DBCP_TESTWHILEIDLE = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")});
+
+ private IntegerEditor DBCP_TIMEBETWEENEVICTIONRUNSMILLS = new IntegerEditor();
+ private IntegerEditor DBCP_NUMTESTSPEREVICTIONRUN = new IntegerEditor();
+ private IntegerEditor DBCP_MINEVICTABLEIDLETIMEMILLIS = new IntegerEditor();
+
+ public JDBCDefPane() {
+ this.setBorder(UITitledBorder.createBorderWithTitle("JDBC" + ":"));
+ this.setLayout(FRGUIPaneFactory.createLabelFlowLayout());
+ JPanel innerthis = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane();
+ innerthis.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ this.add(innerthis);
+ dbtypeComboBox = new UIComboBox();
+ dbtypeComboBox.setName(DRIVER_TYPE);
+ for (int i = 0; i < dbtype.length; i++) {
+ dbtypeComboBox.addItem(dbtype[i]);
+ }
+ dbtypeComboBox.addActionListener(dbtypeActionListener);
+ dbtypeComboBox.setMaximumRowCount(10);
+
+ driverComboBox = new UIComboBox();
+ driverComboBox.setEditable(true);
+ driverComboBox.addActionListener(driverListener);
+ urlTextField = new UITextField(15);
+ userNameTextField = new UITextField(15);
+ userNameTextField.setName(USER_NAME);
+ passwordTextField = new UIPassWordField(15);
+ dbtypeButton = new UIButton(".");
+ dbtypeButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Click_Get_Default_URL"));
+ dbtypeButton.addActionListener(dbtypeButtonActionListener);
+
+ double p = TableLayout.PREFERRED;
+ double f = TableLayout.FILL;
+ JPanel dbtypePane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane();
+ dbtypePane.add(new UILabel((com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database") + ":")));
+ JPanel dbtypeComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane();
+ Component[][] dbtypeComComponents = {{dbtypeComboBox}};
+ double[] dbtypeRowSize = {p};
+ double[] dbtypeColumnSize = {p};
+ dbtypeComPane = TableLayoutHelper.createTableLayoutPane(dbtypeComComponents, dbtypeRowSize, dbtypeColumnSize);
+
+ JPanel driverPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane();
+ driverPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Driver") + ":"));
+ // 选择ODBC数据源的时候的提示链接
+ JPanel odbcTipsPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane();
+ odbcTipsLink = new ActionLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Odbc_Tips")) {
+ @Override
+ public void paintComponent(Graphics _gfx) {
+ super.paintComponent(_gfx);
+ _gfx.setColor(Color.blue);
+ _gfx.drawLine(0, this.getHeight() - 1, GraphHelper.getWidth(this.getText()), this.getHeight() - 1);
+ }
+ };
+ odbcTipsPane.add(odbcTipsLink);
+ odbcTipsLink.setPreferredSize(new Dimension(GraphHelper.getWidth(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Odbc_Tips")), odbcTipsLink.getPreferredSize().height));
+ odbcTipsLink.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent evt) {
+ String url = CloudCenter.getInstance().acquireUrlByKind("odbc.help");
+ BrowseUtils.browser(url);
+ }
+ });
+
+ JPanel driverComboBoxAndTips = new JPanel(new BorderLayout());
+ driverComboBoxAndTips.add(driverComboBox, BorderLayout.WEST);
+ driverComboBoxAndTips.add(odbcTipsPane, BorderLayout.CENTER);
+
+ JPanel urlPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane();
+ urlPane.add(new UILabel("URL:"));
+ JPanel urlComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane();
+ Component[][] urlComComponents = {{urlTextField, dbtypeButton}};
+ double[] urlRowSize = {p};
+ double[] urlColumnSize = {f, 21};
+ urlComPane = TableLayoutHelper.createCommonTableLayoutPane(urlComComponents, urlRowSize, urlColumnSize, 4);
+
+ JPanel userPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane();
+ userPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_UserName") + ":"));
+ JPanel userComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane();
+ Component[][] userComComponents = {{userNameTextField, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Password") + ":"), passwordTextField}};
+ double[] userRowSize = {p};
+ double[] userColumnSize = {f, p, f};
+ userComPane = TableLayoutHelper.createCommonTableLayoutPane(userComComponents, userRowSize, userColumnSize, 4);
+
+ JPanel passwordPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane();
+ passwordPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Password") + ":"));
+
+ Component[][] components = {{dbtypePane, dbtypeComPane}, {driverPane, driverComboBoxAndTips}, {urlPane, urlComPane}, {userPane, userComPane},};
+
+ double[] rowSize = {p, p, p, p};
+ double[] columnSize = {p, f, 22};
+ JPanel centerPanel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 6);
+ innerthis.add(centerPanel);
+ JPanel southPanel = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ innerthis.add(southPanel);
+ southPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 4, 20));
+ ActionLabel actionLabel = new ActionLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr"));
+ southPanel.add(actionLabel, BorderLayout.EAST);
+ actionLabel.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent evt) {
+ JDialog wDialog = createJDialog();
+ wDialog.setVisible(true);
+ }
+ });
+ }
+
+ public void populate(JDBCDatabaseConnection jdbcDatabase) {
+ if (jdbcDatabase == null) {
+ jdbcDatabase = new JDBCDatabaseConnection();
+ }
+ if (ComparatorUtils.equals(jdbcDatabase.getDriver(), "sun.jdbc.odbc.JdbcOdbcDriver")
+ && jdbcDatabase.getURL().startsWith("jdbc:odbc:Driver={Microsoft")) {
+ this.dbtypeComboBox.setSelectedItem("Access");
+ } else {
+ Iterator> jdbc = jdbcMap.entrySet().iterator();
+ boolean out = false;
+ while (jdbc.hasNext()) {
+ Entry entry = jdbc.next();
+ DriverURLName[] dus = entry.getValue();
+ for (int i = 0, len = dus.length; i < len; i++) {
+ if (ComparatorUtils.equals(dus[i].getDriver(), jdbcDatabase.getDriver())) {
+ this.dbtypeComboBox.setSelectedItem(entry.getKey());
+ out = true;
+ break;
+ }
+ }
+ if (out) {
+ break;
+ }
+ }
+ if (!out) {
+ this.dbtypeComboBox.setSelectedItem(OTHER_DB);
+ }
+ }
+ this.driverComboBox.setSelectedItem(jdbcDatabase.getDriver());
+ this.urlTextField.setText(jdbcDatabase.getURL());
+ this.userNameTextField.setText(jdbcDatabase.getUser());
+ this.passwordTextField.setText(jdbcDatabase.getPassword());
+
+ DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr();
+ if (dbcpAttr == null) {
+ dbcpAttr = new DBCPConnectionPoolAttr();
+ jdbcDatabase.setDbcpAttr(dbcpAttr);
+ }
+ this.DBCP_INITIAL_SIZE.setValue(dbcpAttr.getInitialSize());
+ this.DBCP_MAX_ACTIVE.setValue(dbcpAttr.getMaxActive());
+ this.DBCP_MAX_IDLE.setValue(dbcpAttr.getMaxIdle());
+ this.DBCP_MAX_WAIT.setValue(dbcpAttr.getMaxWait());
+ this.DBCP_MIN_IDLE.setValue(dbcpAttr.getMinIdle());
+ this.DBCP_VALIDATION_QUERY.setText(dbcpAttr.getValidationQuery());
+ this.DBCP_TESTONBORROW.setSelectedIndex(dbcpAttr.isTestOnBorrow() ? 1 : 0);
+ this.DBCP_TESTONRETURN.setSelectedIndex(dbcpAttr.isTestOnReturn() ? 1 : 0);
+ this.DBCP_TESTWHILEIDLE.setSelectedIndex(dbcpAttr.isTestWhileIdle() ? 1 : 0);
+ this.DBCP_MINEVICTABLEIDLETIMEMILLIS.setValue(dbcpAttr.getMinEvictableIdleTimeMillis() / TIME_MULTIPLE);
+ this.DBCP_NUMTESTSPEREVICTIONRUN.setValue(dbcpAttr.getNumTestsPerEvictionRun());
+ this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.setValue(dbcpAttr.getTimeBetweenEvictionRunsMillis());
+ }
+
+ public JDBCDatabaseConnection update() {
+ JDBCDatabaseConnection jdbcDatabase = new JDBCDatabaseConnection();
+ Object driveItem = this.driverComboBox.getSelectedItem();
+ jdbcDatabase.setDriver(driveItem == null ? null : driveItem.toString());
+ jdbcDatabase.setURL(this.urlTextField.getText().trim());
+ jdbcDatabase.setUser(this.userNameTextField.getText().trim());
+ jdbcDatabase.setPassword(new String(this.passwordTextField.getPassword()).trim());
+
+ DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr();
+ if (dbcpAttr == null) {
+ dbcpAttr = new DBCPConnectionPoolAttr();
+ jdbcDatabase.setDbcpAttr(dbcpAttr);
+ }
+ dbcpAttr.setInitialSize(this.DBCP_INITIAL_SIZE.getValue().intValue());
+ dbcpAttr.setMaxActive(this.DBCP_MAX_ACTIVE.getValue().intValue());
+ dbcpAttr.setMaxIdle(this.DBCP_MAX_IDLE.getValue().intValue());
+ dbcpAttr.setMaxWait(this.DBCP_MAX_WAIT.getValue().intValue());
+ dbcpAttr.setMinIdle(this.DBCP_MIN_IDLE.getValue().intValue());
+ dbcpAttr.setValidationQuery(this.DBCP_VALIDATION_QUERY.getText());
+ dbcpAttr.setTestOnBorrow(this.DBCP_TESTONBORROW.getSelectedIndex() == 0 ? false : true);
+ dbcpAttr.setTestOnReturn(this.DBCP_TESTONRETURN.getSelectedIndex() == 0 ? false : true);
+ dbcpAttr.setTestWhileIdle(this.DBCP_TESTWHILEIDLE.getSelectedIndex() == 0 ? false : true);
+ dbcpAttr.setMinEvictableIdleTimeMillis(((Number) this.DBCP_MINEVICTABLEIDLETIMEMILLIS.getValue()).intValue() * TIME_MULTIPLE);
+ dbcpAttr.setNumTestsPerEvictionRun(((Number) this.DBCP_NUMTESTSPEREVICTIONRUN.getValue()).intValue());
+ dbcpAttr.setTimeBetweenEvictionRunsMillis(((Number) this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.getValue()).intValue());
+
+ return jdbcDatabase;
+ }
+
+ ActionListener dbtypeActionListener = new ActionListener() {
+ public void actionPerformed(ActionEvent evt) {
+
+ urlTextField.setText(StringUtils.EMPTY);
+ driverComboBox.removeAllItems();
+ if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) {
+ driverComboBox.setSelectedItem(StringUtils.EMPTY);
+ return;
+ }
+
+ DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem());
+ for (int i = 0, len = dus.length; i < len; i++) {
+ driverComboBox.addItem(dus[i].getDriver());
+ if (i == 0) {
+ driverComboBox.setSelectedItem(dus[i].getDriver());
+ urlTextField.setText(dus[i].getURL());
+ }
+ }
+ }
+ };
+
+ ActionListener driverListener = new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ if (driverComboBox.getSelectedItem() == null || ComparatorUtils.equals(driverComboBox.getSelectedItem(), StringUtils.EMPTY)) {
+ return;
+ }
+ odbcTipsLink.setVisible(ComparatorUtils.equals("sun.jdbc.odbc.JdbcOdbcDriver", driverComboBox.getSelectedItem())); // 选择的如果是ODBC就显示提示
+ Iterator> jdbc = jdbcMap.entrySet().iterator();
+ while (jdbc.hasNext()) {
+ Entry entry = jdbc.next();
+ DriverURLName[] dus = entry.getValue();
+ for (int i = 0, len = dus.length; i < len; i++) {
+ if (ComparatorUtils.equals(dus[i].getDriver(), (driverComboBox.getSelectedItem()))) {
+ urlTextField.setText(dus[i].getURL());
+ return;
+ }
+ }
+ }
+ }
+
+ };
+
+ ActionListener dbtypeButtonActionListener = new ActionListener() {
+ public void actionPerformed(ActionEvent evt) {
+ if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) {
+ return;
+ }
+ DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem());
+ for (int i = 0, len = dus.length; i < len; i++) {
+ if (ComparatorUtils.equals(driverComboBox.getSelectedItem(), (dus[i].getDriver()))) {
+ urlTextField.setText(dus[i].getURL());
+ if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), ("Access"))) {
+ // ben:这个能不能换种处理方案- -
+ JFileChooser filechooser = new JFileChooser();
+ filechooser.setDialogTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Open"));
+ filechooser.setMultiSelectionEnabled(false);
+ filechooser.addChoosableFileFilter(new ChooseFileFilter(new String[]{"accdb", "mdb"}, "Microsoft Office Access"));
+ int result = filechooser.showOpenDialog(DesignerContext.getDesignerFrame());
+ File selectedfile = null;
+
+ if (result == JFileChooser.APPROVE_OPTION) {
+ selectedfile = filechooser.getSelectedFile();
+ if (selectedfile != null) {
+ String selectedName = selectedfile.getPath().substring(selectedfile.getPath().lastIndexOf('.') + 1);
+ if (selectedName.equalsIgnoreCase("mdb") || selectedName.equalsIgnoreCase("accdb")) {
+ urlTextField.setText(urlTextField.getText() + selectedfile.getPath());
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ };
+
+ private JDialog createJDialog() {
+ return new DBCPAttrPane().showWindow(SwingUtilities.getWindowAncestor(JDBCDefPane.this));
+ }
+
+ class DBCPAttrPane extends BasicPane {
+ public DBCPAttrPane() {
+ JPanel defaultPane = this;
+
+ // JPanel northFlowPane
+ JPanel northFlowPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane();
+ defaultPane.add(northFlowPane, BorderLayout.NORTH);
+
+ DBCP_VALIDATION_QUERY.setColumns(15);
+ // ContextPane
+
+ double f = TableLayout.FILL;
+ // double p = TableLayout.PREFERRED;
+ double[] rowSize = {f, f, f, f, f, f, f, f, f, f, f, f};
+ double[] columnSize = {f, f};
+ Component[][] comps = {
+ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Initial_Size") + ":", SwingConstants.RIGHT), DBCP_INITIAL_SIZE},
+ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Active") + ":", SwingConstants.RIGHT), DBCP_MAX_ACTIVE},
+ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Idle") + ":", SwingConstants.RIGHT), DBCP_MAX_IDLE},
+ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Min_Idle") + ":", SwingConstants.RIGHT), DBCP_MIN_IDLE},
+ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Max_Wait_Time") + ":", SwingConstants.RIGHT), DBCP_MAX_WAIT},
+ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Validation_Query") + ":", SwingConstants.RIGHT), DBCP_VALIDATION_QUERY},
+ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Borrow") + ":", SwingConstants.RIGHT), DBCP_TESTONBORROW},
+ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Return") + ":", SwingConstants.RIGHT), DBCP_TESTONRETURN},
+ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_While_Idle") + ":", SwingConstants.RIGHT), DBCP_TESTWHILEIDLE},
+ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Evictionruns_millis") + ":", SwingConstants.RIGHT),
+ DBCP_TIMEBETWEENEVICTIONRUNSMILLS},
+ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Num_Test_Per_Evction_Run") + ":", SwingConstants.RIGHT), DBCP_NUMTESTSPEREVICTIONRUN},
+ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Mix_Evictable_Idle_Time_Millis") + ":", SwingConstants.RIGHT),
+ DBCP_MINEVICTABLEIDLETIMEMILLIS}};
+
+ JPanel contextPane = TableLayoutHelper.createGapTableLayoutPane(comps, rowSize, columnSize, 10, 4);
+ contextPane.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, UIConstants.LINE_COLOR));
+ northFlowPane.add(contextPane);
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr");
+ }
+ }
+
+ private static class DriverURLName {
+ public DriverURLName(String driver, String url) {
+ this.driver = driver;
+ this.url = url;
+ }
+
+ public String getDriver() {
+ return this.driver;
+ }
+
+ public String getURL() {
+ return this.url;
+ }
+
+ private String driver;
+ private String url;
+ }
}
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTableModel.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTableModel.java
index 575ba43f5b..46706cf591 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTableModel.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTableModel.java
@@ -17,6 +17,10 @@ import javax.swing.table.AbstractTableModel;
* 这个TableModel主要是预览数据的. 字段TableData必须转化为内置的
*/
public class PreviewTableModel extends AbstractTableModel {
+
+ private static final int LEN_LIMIT = 1000;
+ private static final String THREE_DOT = "...";
+
private DataModel dataModel;
private String erroMessage = null;
@@ -127,11 +131,21 @@ public class PreviewTableModel extends AbstractTableModel {
public Object getValueAt(int row, int column) {
try {
- return dataModel.getValueAt(row, column);
+ Object value = dataModel.getValueAt(row, column);
+ if (value != null) {
+ String strValue = value.toString();
+ // 字符长度过长 swing会卡住一会
+ // 同时设计器内预览展示也不需要展示太长的字符
+ if (strValue.length() > LEN_LIMIT) {
+ strValue = strValue.substring(0, LEN_LIMIT) + THREE_DOT;
+ return strValue;
+ }
+ }
+ return value;
} catch (TableDataException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
DesignUtils.errorMessage(e.getMessage());
- return "";
+ return StringUtils.EMPTY;
}
}
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java
index 01d7c9a6ff..8d8e3a48c6 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java
@@ -14,6 +14,7 @@ import com.fr.design.DesignerEnvManager;
import com.fr.design.data.DesignTableDataManager;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.BasicPane;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.gui.frpane.UITabbedPane;
import com.fr.design.gui.ilable.UILabel;
@@ -303,7 +304,7 @@ public class PreviewTablePane extends BasicPane {
return;
}
FineLoggerFactory.getLogger().error(exp.getMessage(), exp);
- JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), columnErrMessage, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE);
+ FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), columnErrMessage, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE);
}
private void populate(TableData tableData) throws Exception {
@@ -371,7 +372,7 @@ public class PreviewTablePane extends BasicPane {
connectionBar.close();
}
TableDataSource dataSource = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().getTarget();
- previewTableData = DesignTableDataManager.previewTableDataNeedInputParameters(dataSource, tableData, (int) maxPreviewNumberField.getValue(), true);
+ previewTableData = DesignTableDataManager.previewTableDataNeedInputParameters(dataSource, tableData, (int) maxPreviewNumberField.getValue(), true, progressBar);
// parameterInputDialog
// update之后的parameters,转成一个parameterMap,用于预览TableData
PreviewTableModel previewModel = new PreviewTableModel(previewTableData.createDataModel(null), (int) maxPreviewNumberField.getValue());
@@ -394,8 +395,8 @@ public class PreviewTablePane extends BasicPane {
} catch (Exception e) {
if (!(e instanceof CancellationException)) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
- JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), e.getMessage(),
- null, 0, UIManager.getIcon("OptionPane.errorIcon"));
+ FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), e.getMessage(),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon"));
}
dialog.setVisible(false);
} finally {
diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java
index 871b762b98..b454ddd89f 100644
--- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java
@@ -57,8 +57,10 @@ public class ClassTableDataPane extends AbstractTableDataPane {
(Dialog) SwingUtilities.getWindowAncestor(ClassTableDataPane.this),
new DialogActionAdapter() {
public void doOk() {
- classNameTextField.setText(bPane.getClassPath());
- }
+ String classPath = bPane.getClassPath();
+ ClassTableData tableData = new ClassTableData(classPath);
+ populateBean(tableData);
+ }
});
dlg.setVisible(true);
}
diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java
index e7be5bf338..23e6f46136 100644
--- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java
@@ -29,10 +29,10 @@ import com.fr.design.gui.itableeditorpane.UITableEditorPane;
import com.fr.design.gui.itoolbar.UIToolbar;
import com.fr.design.gui.syntax.ui.rsyntaxtextarea.SyntaxConstants;
import com.fr.design.gui.syntax.ui.rtextarea.RTextScrollPane;
-import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.menu.SeparatorDef;
import com.fr.design.menu.ToolBarDef;
+import com.fr.design.utils.ParameterUtils;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.ComparatorUtils;
import com.fr.general.sql.SqlUtils;
@@ -219,8 +219,7 @@ public class DBTableDataPane extends AbstractTableDataPane {
paramTexts[1] = SqlUtils.tryPureSqlText(pageQuery);
List existParameterList = editorPane.update();
Parameter[] ps = existParameterList == null ? new Parameter[0] : existParameterList.toArray(new Parameter[existParameterList.size()]);
-
- editorPane.populate(ParameterHelper.analyzeAndUnionSameParameters(paramTexts, ps));
+ editorPane.populate(ParameterUtils.analyzeAndUnionParameters(paramTexts, ps));
}
private JToolBar createToolBar() {
@@ -238,13 +237,10 @@ public class DBTableDataPane extends AbstractTableDataPane {
isShareCheckBox.setBackground(Color.WHITE);
maxPanel = new MaxMemRowCountPanel();
maxPanel.setBorder(null);
- JPanel wrapMaxPanel = FRGUIPaneFactory.createBorderLayout_S_Pane();
- wrapMaxPanel.add(maxPanel);
- wrapMaxPanel.setPreferredSize(new Dimension(250, 20));
UIToolbar editToolBar = ToolBarDef.createJToolBar();
toolBarDef.updateToolBar(editToolBar);
editToolBar.add(isShareCheckBox);
- editToolBar.add(wrapMaxPanel);
+ editToolBar.add(maxPanel);
return editToolBar;
}
@@ -319,7 +315,8 @@ public class DBTableDataPane extends AbstractTableDataPane {
// com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connect_SQL_Cannot_Null") + ".");
}
}
-
+ // 保存前 刷新下参数列表 保证获取到最新的参数
+ refresh();
List parameterList = editorPane.update();
Parameter[] parameters = parameterList.toArray(new Parameter[parameterList.size()]);
diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataDefinedPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataDefinedPane.java
index 48d36e247b..ba5d42bd88 100644
--- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataDefinedPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataDefinedPane.java
@@ -25,7 +25,7 @@ import java.util.Date;
public class EmbeddedTableDataDefinedPane extends BasicPane{
-
+ private static final int MIN_CELL_WIDTH = 30;
private EmbeddedTableData tableData;
private JTable dataJTable;
private UIButton add;
@@ -64,7 +64,7 @@ public class EmbeddedTableDataDefinedPane extends BasicPane{
// 行号显示
TableColumn tableColumn = dataJTable.getColumnModel().getColumn(0);
tableColumn.setCellRenderer(new CellRenderer());
- tableColumn.setMaxWidth(30);
+ tableColumn.setMaxWidth(Math.max(dataJTable.getColumnCount(), MIN_CELL_WIDTH));
// 控制按钮
add = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add"));
diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java
index cb6c63a365..8b47b222d6 100644
--- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java
@@ -34,6 +34,7 @@ import java.util.Date;
public class EmbeddedTableDataPane extends AbstractTableDataPane {
+ private static final int MIN_CELL_WIDTH = 30;
private JTable dataJTable ;
private JScrollPane scrollPane;
private UILabel coordinatelabel;
@@ -220,7 +221,7 @@ public class EmbeddedTableDataPane extends AbstractTableDataPane {
public void actionPerformed(ActionEvent arg0) {
String uri = ParameterHelper.analyze4Templatee(urlText.getText(), params);
if (!checkURL(uri)) {
- JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(FileTableDataPane.this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add_JS_warning"));
+ FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(FileTableDataPane.this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add_JS_warning"));
return;
}
params = getEditorPaneParameter();
@@ -234,10 +235,10 @@ public class FileTableDataPane extends AbstractTableDataPane {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
if (in == null) {
- JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database_Connection_Failed"),
- null, 0, UIManager.getIcon("OptionPane.errorIcon"));
+ FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database_Connection_Failed"),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon"));
} else {
- JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Connection_Successfully"));
+ FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Connection_Successfully"));
try {
in.close();
} catch (IOException e) {
diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java
index dc37d14bea..d43e6bdee4 100644
--- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java
+++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java
@@ -1,20 +1,38 @@
package com.fr.design.data.tabledata.tabledatapane;
+
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import com.fr.base.GraphHelper;
import com.fr.design.constants.UIConstants;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ispinner.UISpinner;
import com.fr.design.gui.itoolbar.UIToolbar;
+import com.fr.design.i18n.Toolkit;
+import com.fr.stable.StringUtils;
public class MaxMemRowCountPanel extends UIToolbar {
private static final int ALL_IN_MEMORY = 0;
private static final int MAX_IN_MEMORY = 1;
+ private static final String[] CACHE_LIST = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Save_All_Records_In_Memory"),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Max_Mem_Row_Count") };
+ private static final int MAX_WIDTH = getMaxComBoBoxWidth() > 200 ? 350 : 250;
+ private static final int MAX_COMPONENT_COUNT_OF_MAX_MEMORY = 4;
+ private static int getMaxComBoBoxWidth() {
+ int maxWidth = GraphHelper.getWidth(CACHE_LIST[0]);
+ for (int i = 1; i < CACHE_LIST.length; i++) {
+ int width = GraphHelper.getWidth(CACHE_LIST[i]);
+ if (width > maxWidth) {
+ maxWidth = width;
+ }
+ }
+ return maxWidth;
+ }
private UISpinner numberSpinner;
private UIComboBox switchCache;
@@ -44,7 +62,7 @@ public class MaxMemRowCountPanel extends UIToolbar {
@Override
public Dimension getPreferredSize() {
Dimension dim = super.getPreferredSize();
- dim.width = 340;
+ dim.width = MAX_WIDTH;
return dim;
};
@@ -52,8 +70,7 @@ public class MaxMemRowCountPanel extends UIToolbar {
this.setFloatable(false);
this.setRollover(true);
this.setBackground(UIConstants.NORMAL_BACKGROUND);
- String[] cacheList = { com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Save_All_Records_In_Memory"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Max_Mem_Row_Count") };
- switchCache = new UIComboBox(cacheList);
+ switchCache = new UIComboBox(CACHE_LIST);
switchCache.addActionListener(switchStateL);
numberSpinner = new UISpinner(0, Integer.MAX_VALUE, 1);
}
@@ -72,9 +89,13 @@ public class MaxMemRowCountPanel extends UIToolbar {
this.removeAll();
this.add(switchCache);
switchCache.setSelectedIndex(MAX_IN_MEMORY);
- this.add(new UILabel(" "));
+ if (this.getComponentCount() == MAX_COMPONENT_COUNT_OF_MAX_MEMORY) {
+ //此处因为switchCache的setSelectedIndex可能会造成双层调用,然后因为重复添加组件产生bug,故而定义这个工具栏的正常最大组件数,做个判断
+ return;
+ }
+ this.add(new UILabel(StringUtils.BLANK));
this.add(numberSpinner);
- this.add(new UILabel(" " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Row")));
+ this.add(new UILabel(StringUtils.BLANK + Toolkit.i18nText("Fine-Design_Basic_Row")));
this.validate();
this.repaint();
}
diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java
index 2cf170c55e..571e13d447 100644
--- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java
@@ -19,6 +19,7 @@ import com.fr.design.gui.itableeditorpane.UITableEditorPane;
import com.fr.design.gui.itextfield.UITextField;
import com.fr.general.ComparatorUtils;
+import com.fr.log.FineLoggerFactory;
import com.fr.script.Calculator;
import com.fr.stable.ParameterProvider;
import com.fr.stable.StringUtils;
@@ -95,9 +96,8 @@ public class MultiTDTableDataPane extends AbstractTableDataPane> entryIt = resMap.entrySet().iterator();
- while (entryIt.hasNext()) {
- TableDataWrapper tableDataWrappe = entryIt.next().getValue();
+ for (Entry stringTableDataWrapperEntry : resMap.entrySet()) {
+ TableDataWrapper tableDataWrappe = stringTableDataWrapperEntry.getValue();
String tmp = tableDataWrappe.getTableDataName();
if (!ComparatorUtils.equals(tableDataWrappe.getTableDataName(), multiName)) {
centerPanel.add(new BarPanel(tmp, tableDataWrappe.getIcon()));
@@ -111,13 +111,10 @@ public class MultiTDTableDataPane extends AbstractTableDataPane {
+ MultiTDTableData td = MultiTDTableDataPane.this.updateBean();
+ td.setTableDataSource(DesignTableDataManager.getEditingTableDataSource());
+ new TemplateTableDataWrapper(td).previewData();
};
}
@@ -126,12 +123,12 @@ public class MultiTDTableDataPane extends AbstractTableDataPane(new ParameterTableModel() {
+ editorPane = new UITableEditorPane<>(new ParameterTableModel() {
@Override
public UITableEditAction[] createAction() {
return new UITableEditAction[]{new RefreshAction()};
}
- }, " " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Default_Parameter"));
+ }, StringUtils.BLANK + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Default_Parameter"));
jpanel.add(editorPane, BorderLayout.CENTER);
@@ -162,29 +159,32 @@ public class MultiTDTableDataPane extends AbstractTableDataPane existParameterList = new ArrayList();
- Iterator> dataItera = choosenTableData.entrySet().iterator();
- List parameterName = new ArrayList();
- while (dataItera.hasNext()) {
- Entry entry = dataItera.next();
- TableData td = resMap.get(entry.getKey()).getTableData();
- ParameterProvider[] currentparameters = td.getParameters(Calculator.createCalculator());
- for (int i=0; i existParameterList = new ArrayList<>();
+ List parameterName = new ArrayList<>();
+ for (Entry entry : choosenTableData.entrySet()) {
+ TableData td = resMap.get(entry.getKey()).getTableData();
+ ParameterProvider[] currentParameters = td.getParameters(Calculator.createCalculator());
+ for (ParameterProvider currentParameter : currentParameters) {
+ if (parameterName.contains(currentParameter.getName())) {
+ continue;
+ }
+ parameterName.add(currentParameter.getName());
+ try {
+ //采用给新的界面刷新参数时,clone一个值过去,不然会出现联动修改
+ existParameterList.add((ParameterProvider) currentParameter.clone());
+ } catch (CloneNotSupportedException e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ }
}
ParameterProvider[] texts = ParameterHelper.analyze4Parameters(paramTexts, true);
- for (int i=0; i> it = choosenTableData.entrySet().iterator();
- while (it.hasNext()) {
- Entry entry = it.next();
+ for (Entry entry : choosenTableData.entrySet()) {
td.addTableData(entry.getKey(), entry.getValue());
}
List paramList = editorPane.update();
if (paramList != null) {
- td.setDefineParameters(paramList.toArray(new Parameter[paramList.size()]));
+ td.setDefineParameters(paramList.toArray(new Parameter[0]));
}
return td;
@@ -348,9 +346,7 @@ public class MultiTDTableDataPane extends AbstractTableDataPane {
+ final UIFormula formulaPane = FormulaFactory.createFormulaPane();
+ formulaPane.populate(BaseFormula.createFormulaBuilder().build(formulaContentTextField.getText()));
+ formulaPane.showLargeWindow(SwingUtilities.getWindowAncestor(MultiTDTableDataPane.this), new DialogActionAdapter() {
+ public void doOk() {
+ BaseFormula formula = formulaPane.update();
+ if (formula == null) {
+ formulaContentTextField.setText(StringUtils.EMPTY);
+ } else {
+ formulaContentTextField.setText(formula.getContent().substring(1));
}
- }).setVisible(true);
- }
+ MultiTDTableDataPane.this.refresh();
+ }
+ }).setVisible(true);
};
}
}
diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ProcedureDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ProcedureDataPane.java
index 1d5b874b8a..b138f4e58c 100644
--- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ProcedureDataPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ProcedureDataPane.java
@@ -17,6 +17,7 @@ import com.fr.design.data.datapane.sqlpane.SQLEditPane;
import com.fr.design.data.tabledata.ResponseDataSourceChange;
import com.fr.design.data.tabledata.StoreProcedureWorkerListener;
import com.fr.design.data.tabledata.wrapper.StoreProcedureDataWrapper;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.gui.ilable.UILabel;
@@ -243,7 +244,7 @@ public class ProcedureDataPane extends AbstractTableDataPane imp
try {
throw new Exception(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connect_SQL_Cannot_Null") + ".");
} catch (Exception e) {
- JOptionPane.showMessageDialog(ProcedureDataPane.this, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connect_SQL_Cannot_Null") + ".");
+ FineJOptionPane.showMessageDialog(ProcedureDataPane.this, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connect_SQL_Cannot_Null") + ".");
}
}
diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/TableDataManagerPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/TableDataManagerPane.java
index 7c484c7b29..c55e5871ee 100644
--- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/TableDataManagerPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/TableDataManagerPane.java
@@ -33,9 +33,16 @@ public class TableDataManagerPane extends LoadingBasicPane {
);
}
tableDataPane = pane == null ? new TableDataPaneListPane() {
- public void rename(String oldName, String newName) {
+ @Override
+ public void rename(final String oldName, final String newName) {
super.rename(oldName, newName);
- renameConnection(oldName, newName);
+ new SwingWorker() {
+ @Override
+ protected Void doInBackground() {
+ renameConnection(oldName, newName);
+ return null;
+ }
+ }.execute();
}
} : pane;
container.add(tableDataPane.getPanel(), BorderLayout.CENTER);
diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java
index fc94a0618e..82022bea60 100644
--- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java
+++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java
@@ -50,10 +50,11 @@ public abstract class AbstractTableDataWrapper implements TableDataWrapper {
DesignModelAdapter adapter = DesignModelAdapter.getCurrentModelAdapter();
TableDataSource tds = adapter == null ? null : adapter.getBook();
String[] colNames = tabledata.getColumnNames(tds);
+ String[] colNamesInCache = DesignTableDataManager.getDsColumnNames(name);
if(ArrayUtils.isNotEmpty(colNames)){
- columnNameList = new ArrayList();
- columnNameList.addAll(Arrays.asList(colNames));
- return columnNameList;
+ return toColumnNameList(colNames);
+ } else if (ArrayUtils.isNotEmpty(colNamesInCache)) {
+ return toColumnNameList(colNamesInCache);
}
EmbeddedTableData embeddedTableData = null;
@@ -65,6 +66,13 @@ public abstract class AbstractTableDataWrapper implements TableDataWrapper {
}
}
columnNameList = DesignTableDataManager.getColumnNamesByTableData(embeddedTableData);
+ DesignTableDataManager.addDsColumnNames(name, columnNameList.toArray(new String[0]));
+ return columnNameList;
+ }
+
+ private List toColumnNameList(String[] colNames) {
+ columnNameList = new ArrayList<>();
+ columnNameList.addAll(Arrays.asList(colNames));
return columnNameList;
}
diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java
index 49c7dcd119..cefc0e1128 100644
--- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java
+++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java
@@ -9,6 +9,7 @@ import com.fr.design.data.DesignTableDataManager;
import com.fr.design.data.datapane.preview.PreviewTablePane;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.DialogActionAdapter;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.iprogressbar.AutoProgressBar;
import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode;
import com.fr.design.mainframe.DesignerContext;
@@ -102,7 +103,7 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper {
return columnNameList;
}
if (!createStore(false)) {
- JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Engine_No_TableData"));
+ FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Engine_No_TableData"));
return new ArrayList();
}
columnNameList = Arrays.asList(procedureDataModel.getColumnName());
@@ -219,7 +220,7 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper {
} catch (Exception e) {
if (!(e instanceof CancellationException)) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
- JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), e.getMessage());
+ FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), e.getMessage());
}
loadingBar.close();
}
diff --git a/designer-base/src/main/java/com/fr/design/designer/creator/CRPropertyDescriptor.java b/designer-base/src/main/java/com/fr/design/designer/creator/CRPropertyDescriptor.java
index e2470875d4..2a42fabd28 100644
--- a/designer-base/src/main/java/com/fr/design/designer/creator/CRPropertyDescriptor.java
+++ b/designer-base/src/main/java/com/fr/design/designer/creator/CRPropertyDescriptor.java
@@ -4,6 +4,7 @@
package com.fr.design.designer.creator;
import com.fr.stable.StringUtils;
+import com.fr.stable.core.PropertyChangeAdapter;
import com.fr.stable.core.PropertyChangeListener;
import java.beans.IntrospectionException;
@@ -40,6 +41,12 @@ public final class CRPropertyDescriptor extends PropertyDescriptor {
return this;
}
+ @Deprecated
+ public CRPropertyDescriptor setPropertyChangeListener(PropertyChangeAdapter l) {
+ this.l = l;
+ return this;
+ }
+
public void firePropertyChanged() {
if (l != null) {
l.propertyChange();
diff --git a/designer-base/src/main/java/com/fr/design/dialog/ErrorDialog.java b/designer-base/src/main/java/com/fr/design/dialog/ErrorDialog.java
new file mode 100644
index 0000000000..21042a57a9
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/dialog/ErrorDialog.java
@@ -0,0 +1,94 @@
+package com.fr.design.dialog;
+
+import com.fr.design.gui.ibutton.UIButton;
+import com.fr.design.gui.ilable.UILabel;
+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 javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+/**
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2020/1/8
+ */
+public abstract class ErrorDialog extends JDialog implements ActionListener {
+
+ private UIButton okButton;
+ private UIButton restartButton;
+
+
+ public ErrorDialog(Frame parent, String message, String title, String detail) {
+ super(parent, true);
+ JPanel northPane = FRGUIPaneFactory.createBorderLayout_L_Pane();
+ JPanel messagePane = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true);
+ UILabel boldFontLabel = new UILabel(message);
+ UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Send_Report_To_Us"));
+ Font font = FRFont.getInstance("Dialog", Font.BOLD, 20);
+ boldFontLabel.setFont(font);
+ messagePane.add(boldFontLabel);
+ messagePane.add(label);
+ northPane.add(messagePane);
+
+ JTextArea area = new JTextArea(detail);
+ area.setPreferredSize(new Dimension(400, 100));
+ area.setEnabled(true);
+ area.setEditable(false);
+ JPanel centerPane = FRGUIPaneFactory.createBorderLayout_L_Pane();
+ UILabel detailLabel = new UILabel(Toolkit.i18nText("Fine-Design_Problem_Detail_Message"));
+ centerPane.add(detailLabel, BorderLayout.NORTH);
+ centerPane.add(area, BorderLayout.CENTER);
+
+ JPanel southPane = FRGUIPaneFactory.createBorderLayout_L_Pane();
+ JPanel controlPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ JPanel buttonPane = new JPanel(new FlowLayout(FlowLayout.RIGHT, 10, 0));
+ okButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Ok"));
+ okButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ okEvent();
+ }
+ });
+ buttonPane.add(okButton);
+ restartButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Restart"));
+ restartButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ restartEvent();
+ }
+ });
+ buttonPane.add(restartButton);
+ controlPane.add(buttonPane, BorderLayout.EAST);
+ southPane.add(controlPane);
+
+ this.setTitle(title);
+ this.setResizable(false);
+ this.add(northPane, BorderLayout.NORTH);
+ this.add(centerPane, BorderLayout.CENTER);
+ this.add(southPane, BorderLayout.SOUTH);
+ this.setSize(new Dimension(600, 500));
+ GUICoreUtils.centerWindow(this);
+
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ dispose();
+ }
+
+ protected abstract void okEvent();
+
+ protected abstract void restartEvent();
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/dialog/FineJOptionPane.java b/designer-base/src/main/java/com/fr/design/dialog/FineJOptionPane.java
new file mode 100644
index 0000000000..c644550795
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/dialog/FineJOptionPane.java
@@ -0,0 +1,294 @@
+package com.fr.design.dialog;
+
+import com.fr.invoke.Reflect;
+import com.fr.stable.StringUtils;
+
+import javax.swing.Icon;
+import javax.swing.JDialog;
+import javax.swing.JOptionPane;
+import java.awt.Component;
+import java.awt.HeadlessException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Joe
+ * @version 10.0
+ * Created by Joe on 12/5/2019
+ */
+public class FineJOptionPane extends JOptionPane {
+
+ public final static String[] OPTION_DEFAULT = { com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Button_OK") };
+ public final static String[] OPTION_YES_NO = { com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes"),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No") };
+ public final static String[] OPTION_YES_NO_CANCEL = { com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes"),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Button_Cancel") };
+ public final static String[] OPTION_OK_CANCEL = { com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Button_OK"),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Button_Cancel") };
+
+ //选项类型optionType 和 选项字符串数组 一一对应
+ private final static Map OPTION_MAP = new HashMap<>();
+
+ static {
+ OPTION_MAP.put(DEFAULT_OPTION, OPTION_DEFAULT);
+ OPTION_MAP.put(YES_NO_OPTION, OPTION_YES_NO);
+ OPTION_MAP.put(YES_NO_CANCEL_OPTION, OPTION_YES_NO_CANCEL);
+ OPTION_MAP.put(OK_CANCEL_OPTION, OPTION_OK_CANCEL);
+ }
+
+ private final static String MESSAGE_DIALOG_TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Message");
+ private final static String CONFIRM_DIALOG_TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Confirm");
+ private final static String INPUT_DIALOG_TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips");
+
+ /**
+ * 使用默认 标题 和 消息类型 的消息提示弹出框
+ * @param parentComponent 父容器
+ * @param message 具体的提示消息
+ * @throws HeadlessException
+ */
+ public static void showMessageDialog(Component parentComponent, Object message)
+ throws HeadlessException {
+ showMessageDialog(parentComponent, message, MESSAGE_DIALOG_TITLE,
+ INFORMATION_MESSAGE);
+ }
+
+ /**
+ * 使用默认 Icon 的消息提示弹出框
+ * @param parentComponent 父容器
+ * @param message 具体的提示消息
+ * @param title 标题
+ * @param messageType 消息类型
+ * @throws HeadlessException
+ */
+ public static void showMessageDialog(Component parentComponent, Object message,
+ String title, int messageType)
+ throws HeadlessException {
+ showMessageDialog(parentComponent, message, title, messageType, null);
+ }
+
+ /**
+ * 使用默认 选项类型、选项 和 初始选项 的消息提示弹出框
+ * @param parentComponent 父容器
+ * @param message 具体的提示消息
+ * @param title 标题
+ * @param messageType 消息类型
+ * @param icon 图标
+ * @throws HeadlessException
+ */
+ public static void showMessageDialog(Component parentComponent, Object message,
+ String title, int messageType, Icon icon)
+ throws HeadlessException {
+ showMessageDialog(parentComponent, message, title, DEFAULT_OPTION,
+ messageType, icon, OPTION_DEFAULT, null);
+ }
+
+ /**
+ * 自定义的消息提示弹出框
+ * @param parentComponent 父容器
+ * @param message 具体的提示消息
+ * @param title 标题
+ * @param optionType 选项类型
+ * @param messageType 消息类型
+ * @param icon 图标
+ * @param options 选项
+ * @param initialValue 初始选项
+ * @throws HeadlessException
+ */
+ public static void showMessageDialog(Component parentComponent, Object message,
+ String title, int optionType, int messageType,
+ Icon icon, Object[] options, Object initialValue)
+ throws HeadlessException {
+ showOptionDialog(parentComponent, message, title, optionType,
+ messageType, icon, options, initialValue);
+ }
+
+ /**
+ * 使用默认 标题 和 选项类型 的确认弹出框
+ * @param parentComponent 父容器
+ * @param message 具体的提示消息
+ * @throws HeadlessException
+ */
+ public static int showConfirmDialog(Component parentComponent, Object message)
+ throws HeadlessException {
+ return showConfirmDialog(parentComponent, message,
+ CONFIRM_DIALOG_TITLE,
+ YES_NO_CANCEL_OPTION);
+ }
+
+ /**
+ * 使用默认 消息类型 的确认弹出框
+ * @param parentComponent 父容器
+ * @param message 具体的提示消息
+ * @param title 标题
+ * @param optionType 选项类型
+ * @throws HeadlessException
+ */
+ public static int showConfirmDialog(Component parentComponent, Object message,
+ String title, int optionType) throws HeadlessException {
+ return showConfirmDialog(parentComponent, message, title, optionType,
+ QUESTION_MESSAGE);
+ }
+
+ /**
+ * 使用默认 Icon 的确认弹出框
+ * @param parentComponent 父容器
+ * @param message 具体的提示消息
+ * @param title 标题
+ * @param optionType 选项类型
+ * @param messageType 消息类型
+ * @throws HeadlessException
+ */
+ public static int showConfirmDialog(Component parentComponent, Object message,
+ String title, int optionType, int messageType)
+ throws HeadlessException {
+ return showConfirmDialog(parentComponent, message, title, optionType,
+ messageType, null);
+ }
+
+ /**
+ * 根据 选项类型 获取对应 选项 ,且使用默认 初始选项 的确认弹出框
+ * @param parentComponent 父容器
+ * @param message 具体的提示消息
+ * @param title 标题
+ * @param optionType 选项类型
+ * @param messageType 消息类型
+ * @param icon 图标
+ * @throws HeadlessException
+ */
+ public static int showConfirmDialog(Component parentComponent, Object message,
+ String title, int optionType, int messageType, Icon icon)
+ throws HeadlessException {
+ String[] options = OPTION_MAP.get(optionType);
+ return showConfirmDialog(parentComponent, message, title, optionType,
+ messageType, icon, options, options[0]);
+ }
+
+ /**
+ * 自定义的确认弹出框
+ * @param parentComponent 父容器
+ * @param message 具体的提示消息
+ * @param title 标题
+ * @param optionType 选项类型
+ * @param messageType 消息类型
+ * @param icon 图标
+ * @param options 选项
+ * @param initialValue 初始选项
+ * @throws HeadlessException
+ */
+ public static int showConfirmDialog(Component parentComponent, Object message,
+ String title, int optionType, int messageType, Icon icon,
+ Object[] options, Object initialValue)
+ throws HeadlessException {
+ return showOptionDialog(parentComponent, message, title, optionType,
+ messageType, icon, options, initialValue);
+ }
+
+ /**
+ * 指定消息内容的输入弹出框
+ * @param message 消息内容
+ * @return
+ * @throws HeadlessException
+ */
+ public static String showInputDialog(Object message)
+ throws HeadlessException {
+ return showInputDialog(null, message);
+ }
+
+ /**
+ * 使用默认 标题 和 消息类型 的输入弹出框
+ * @param parentComponent 父容器
+ * @param message 消息内容
+ * @return
+ * @throws HeadlessException
+ */
+ public static String showInputDialog(Component parentComponent,
+ Object message) throws HeadlessException {
+ return showInputDialog(parentComponent, message, INPUT_DIALOG_TITLE, QUESTION_MESSAGE);
+ }
+
+ /**
+ * 使用默认 标题、消息类型、Icon 和 选项 的输入弹出框
+ * @param parentComponent 父容器
+ * @param message 消息类型
+ * @param initialSelectionValue 初始选项
+ * @return
+ */
+ public static String showInputDialog(Component parentComponent, Object message,
+ Object initialSelectionValue) {
+ return (String)showInputDialog(parentComponent, message,
+ INPUT_DIALOG_TITLE, QUESTION_MESSAGE, null, null,
+ initialSelectionValue);
+ }
+
+ /**
+ * 使用默认 父容器、消息内容 和 初始选项 的输入弹出框
+ * @param message 消息内容
+ * @param initialSelectionValue 初始选项
+ * @return
+ */
+ public static String showInputDialog(Object message, Object initialSelectionValue) {
+ return showInputDialog(null, message, initialSelectionValue);
+ }
+
+ /**
+ * 使用默认 Icon、选项 和 初始选项 的输入弹出框
+ * @param parentComponent 父容器
+ * @param message 消息内容
+ * @param title 标题
+ * @param messageType 消息类型
+ * @return
+ * @throws HeadlessException
+ */
+ public static String showInputDialog(Component parentComponent,
+ Object message, String title, int messageType)
+ throws HeadlessException {
+ return (String)showInputDialog(parentComponent, message, title,
+ messageType, null, null, null);
+ }
+
+ /**
+ * 自定义的输入弹出框
+ * @param parentComponent 父容器
+ * @param message 消息内容
+ * @param title 标题
+ * @param messageType 消息类型
+ * @param icon 图标
+ * @param selectionValues 选项
+ * @param initialSelectionValue 初始选项
+ * @return
+ * @throws HeadlessException
+ */
+ public static Object showInputDialog(Component parentComponent,
+ Object message, String title, int messageType, Icon icon,
+ Object[] selectionValues, Object initialSelectionValue)
+ throws HeadlessException {
+ JOptionPane pane = new JOptionPane(message, messageType,
+ OK_CANCEL_OPTION, icon,
+ OPTION_OK_CANCEL, null);
+
+ pane.setWantsInput(true);
+ pane.setSelectionValues(selectionValues);
+ pane.setInitialSelectionValue(initialSelectionValue);
+ pane.setComponentOrientation(((parentComponent == null) ?
+ getRootFrame() : parentComponent).getComponentOrientation());
+
+ int style = Reflect.on(JOptionPane.class).call("styleFromMessageType", messageType).get();
+ JDialog dialog = Reflect.on(pane).call("createDialog", parentComponent, title, style).get();
+
+ pane.selectInitialValue();
+ dialog.show();
+ dialog.dispose();
+
+ //点击取消按钮,返回null
+ if (StringUtils.equals((String) pane.getValue(), OPTION_OK_CANCEL[1]))
+ return null;
+
+ Object value = pane.getInputValue();
+ if (value == UNINITIALIZED_VALUE) {
+ return null;
+ }
+ return value;
+ }
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/dialog/TipDialog.java b/designer-base/src/main/java/com/fr/design/dialog/TipDialog.java
new file mode 100644
index 0000000000..35f9c3c0fb
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/dialog/TipDialog.java
@@ -0,0 +1,98 @@
+package com.fr.design.dialog;
+
+import com.fr.design.gui.ibutton.UIButton;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.utils.gui.GUICoreUtils;
+import com.fr.general.IOUtils;
+import com.fr.stable.StringUtils;
+
+import javax.swing.*;
+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;
+
+/**
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2020/1/8
+ */
+public abstract class TipDialog extends JDialog implements ActionListener {
+
+ private UIButton endButton;
+ private UIButton cancelButton;
+
+ public TipDialog(Frame parent, String type, String tip, String endText, String cancelText) {
+ super(parent, true);
+ JPanel northPane = FRGUIPaneFactory.createBorderLayout_L_Pane();
+ JPanel iconPane = new JPanel();
+ UILabel iconLabel = new UILabel();
+ iconLabel.setIcon(IOUtils.readIcon("com/fr/design/images/error/error2.png"));
+ iconPane.add(iconLabel);
+ iconPane.setPreferredSize(new Dimension(50, 50));
+ JPanel tipPane = FRGUIPaneFactory.createBorderLayout_L_Pane();
+ UILabel tipLabel = new UILabel(tip);
+ tipPane.add(tipLabel);
+ northPane.add(iconPane, BorderLayout.WEST);
+ northPane.add(tipPane, BorderLayout.CENTER);
+
+ JTextPane area = new JTextPane();
+ UILabel typeLabel = new UILabel(type);
+ area.insertComponent(typeLabel);
+ if (StringUtils.isNotEmpty(type)) {
+ UILabel logoIconLabel = new UILabel();
+ logoIconLabel.setIcon(IOUtils.readIcon("com/fr/base/images/oem/logo.png"));
+ area.insertComponent(logoIconLabel);
+ }
+ area.setPreferredSize(new Dimension(400, 100));
+ area.setEnabled(true);
+ area.setEditable(false);
+ JPanel centerPane = FRGUIPaneFactory.createBorderLayout_L_Pane();
+ centerPane.add(area);
+
+ JPanel southPane = FRGUIPaneFactory.createBorderLayout_L_Pane();
+ JPanel controlPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ JPanel buttonPane = new JPanel(new FlowLayout(FlowLayout.RIGHT, 10, 0));
+ endButton = new UIButton(endText);
+ endButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ endEvent();
+ }
+ });
+ buttonPane.add(endButton);
+ cancelButton = new UIButton(cancelText);
+ cancelButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ cancelEvent();
+ }
+ });
+ buttonPane.add(cancelButton);
+ controlPane.add(buttonPane, BorderLayout.EAST);
+ southPane.add(controlPane);
+
+ this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Error_Tittle"));
+ this.setResizable(false);
+ this.add(northPane, BorderLayout.NORTH);
+ this.add(centerPane, BorderLayout.CENTER);
+ this.add(southPane, BorderLayout.SOUTH);
+ this.setSize(new Dimension(600, 500));
+ GUICoreUtils.centerWindow(this);
+
+ }
+
+ protected abstract void endEvent();
+
+ protected abstract void cancelEvent();
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ dispose();
+ }
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java b/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java
index c4e07e9676..8f2021c696 100644
--- a/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java
+++ b/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java
@@ -123,8 +123,11 @@ public abstract class UIDialog extends JDialog {
// transfer focus to CurrentEditor
inputMapAncestor.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "dialogOK");
actionMap.put("dialogOK", new AbstractAction() {
-
+ @Override
public void actionPerformed(ActionEvent evt) {
+ if (!okButton.isEnabled()) {
+ return;
+ }
doOK();
}
});
@@ -167,7 +170,7 @@ public abstract class UIDialog extends JDialog {
try {
checkValid();
} catch (Exception exp) {
- JOptionPane.showMessageDialog(this, exp.getMessage());
+ FineJOptionPane.showMessageDialog(this, exp.getMessage());
return;
}
diff --git a/designer-base/src/main/java/com/fr/design/editor/DoubleDeckValueEditorPane.java b/designer-base/src/main/java/com/fr/design/editor/DoubleDeckValueEditorPane.java
index de8df9a718..6e6c3d8b9b 100644
--- a/designer-base/src/main/java/com/fr/design/editor/DoubleDeckValueEditorPane.java
+++ b/designer-base/src/main/java/com/fr/design/editor/DoubleDeckValueEditorPane.java
@@ -3,6 +3,7 @@ package com.fr.design.editor;
import com.fr.base.BaseFormula;
import com.fr.design.DesignerEnvManager;
import com.fr.design.dialog.BasicPane;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.editor.editor.ColumnIndexEditor;
import com.fr.design.editor.editor.ColumnNameEditor;
import com.fr.design.editor.editor.Editor;
@@ -302,8 +303,8 @@ public class DoubleDeckValueEditorPane extends BasicPane implements UIObserver,
DesignerEnvManager designerEnvManager = DesignerEnvManager.getEnvManager();
if (designerEnvManager.isSupportStringToFormula()) {
if (!designerEnvManager.isDefaultStringToFormula()) {
- int returnValue = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit_String_To_Formula")
- + "?", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), JOptionPane.YES_NO_OPTION);
+ int returnValue = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit_String_To_Formula")
+ + "?", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_OPTION);
if (returnValue == JOptionPane.OK_OPTION) {
setCurrentEditor(j);
diff --git a/designer-base/src/main/java/com/fr/design/editor/ValueEditorPane.java b/designer-base/src/main/java/com/fr/design/editor/ValueEditorPane.java
index 588fc1218a..503929e228 100644
--- a/designer-base/src/main/java/com/fr/design/editor/ValueEditorPane.java
+++ b/designer-base/src/main/java/com/fr/design/editor/ValueEditorPane.java
@@ -3,6 +3,7 @@ package com.fr.design.editor;
import com.fr.base.BaseFormula;
import com.fr.design.DesignerEnvManager;
import com.fr.design.dialog.BasicPane;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.editor.editor.ColumnNameEditor;
import com.fr.design.editor.editor.Editor;
import com.fr.design.editor.editor.FormulaEditor;
@@ -283,8 +284,8 @@ public class ValueEditorPane extends BasicPane implements UIObserver, GlobalName
DesignerEnvManager designerEnvManager = DesignerEnvManager.getEnvManager();
if (designerEnvManager.isSupportStringToFormula()) {
if (!designerEnvManager.isDefaultStringToFormula()) {
- int returnValue = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit_String_To_Formula")
- + "?", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), JOptionPane.YES_NO_OPTION);
+ int returnValue = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit_String_To_Formula")
+ + "?", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_OPTION);
if (returnValue == JOptionPane.OK_OPTION) {
setCurrentEditor(j);
diff --git a/designer-base/src/main/java/com/fr/design/editor/editor/WidgetNameEditor.java b/designer-base/src/main/java/com/fr/design/editor/editor/WidgetNameEditor.java
index 80c545e922..bb5353f133 100644
--- a/designer-base/src/main/java/com/fr/design/editor/editor/WidgetNameEditor.java
+++ b/designer-base/src/main/java/com/fr/design/editor/editor/WidgetNameEditor.java
@@ -4,6 +4,7 @@ import com.fr.design.DesignModelAdapter;
import com.fr.design.gui.icombobox.FilterComboBox;
import com.fr.design.gui.icombobox.UIComboBoxRenderer;
import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.stable.StringUtils;
import com.fr.stable.js.WidgetName;
import javax.swing.JList;
@@ -19,6 +20,8 @@ import java.awt.Component;
* @since 2012-3-29下午6:04:37
*/
public class WidgetNameEditor extends Editor {
+ static final WidgetName EMPTY_WIDGET_NAME = new WidgetName(StringUtils.EMPTY);
+
private FilterComboBox comb;
@@ -79,7 +82,8 @@ public class WidgetNameEditor extends Editor {
@Override
public WidgetName getValue() {
- return (WidgetName) comb.getSelectedItem();
+ WidgetName widgetName = (WidgetName) comb.getSelectedItem();
+ return widgetName == null ? EMPTY_WIDGET_NAME : widgetName;
}
@Override
diff --git a/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java
index 1174a8a73b..15b0e191e0 100644
--- a/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java
+++ b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java
@@ -1,15 +1,40 @@
package com.fr.design.env;
+import com.fr.common.report.ReportState;
+import com.fr.concurrent.NamedThreadFactory;
+import com.fr.design.EnvChangeEntrance;
+import com.fr.design.dialog.FineJOptionPane;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.mainframe.messagecollect.StartErrorMessageCollector;
+import com.fr.design.mainframe.messagecollect.entity.DesignerErrorMessage;
+import com.fr.general.IOUtils;
+import com.fr.log.FineLoggerFactory;
+import com.fr.process.ProcessEventPipe;
+import com.fr.process.engine.core.CarryMessageEvent;
+import com.fr.process.engine.core.FineProcessContext;
+import com.fr.stable.StringUtils;
import com.fr.workspace.WorkContext;
import com.fr.workspace.Workspace;
import com.fr.workspace.connect.WorkspaceClient;
+import javax.swing.*;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
/**
* 根据配置生成运行环境
*/
public class DesignerWorkspaceGenerator {
- public static Workspace generate(DesignerWorkspaceInfo config) throws Exception {
+ private static final int WAIT_FREQ = 60;
+ private static ExecutorService service = Executors.newCachedThreadPool(
+ new NamedThreadFactory("DesignerWorkspaceGenerator"));
+
+ public static Workspace generate(final DesignerWorkspaceInfo config) throws Exception {
if (config == null || config.getType() == null) {
return null;
@@ -22,7 +47,19 @@ public class DesignerWorkspaceGenerator {
break;
}
case Remote: {
- WorkspaceClient client = WorkContext.getConnector().connect(config.getConnection());
+ Future future = service.submit(new Callable() {
+ @Override
+ public WorkspaceClient call() throws Exception {
+ return WorkContext.getConnector().connect(config.getConnection());
+ }
+ });
+ WorkspaceClient client = null;
+ try {
+ client = future.get(WAIT_FREQ, TimeUnit.SECONDS);
+ } catch (TimeoutException e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ RemoteHandler.handle(config);
+ }
if (client != null) {
workspace = new RemoteWorkspace(client, config.getConnection());
}
@@ -31,4 +68,33 @@ public class DesignerWorkspaceGenerator {
}
return workspace;
}
+
+ enum RemoteHandler {
+ SELF;
+ public static void handle(DesignerWorkspaceInfo config) {
+ FineProcessContext.getParentPipe().fire(new CarryMessageEvent(ReportState.STOP.getValue()));
+ StartErrorMessageCollector.getInstance().record(DesignerErrorMessage.REMOTE_DESIGN_NO_RESPONSE.getId(),
+ DesignerErrorMessage.REMOTE_DESIGN_NO_RESPONSE.getMessage(),
+ StringUtils.EMPTY);
+ int result = FineJOptionPane.showOptionDialog(null,
+ Toolkit.i18nText("Fine-Design_Error_Remote_No_Response_Tip"),
+ Toolkit.i18nText("Fine-Design_Basic_Error_Tittle"),
+ JOptionPane.YES_NO_OPTION,
+ JOptionPane.ERROR_MESSAGE,
+ IOUtils.readIcon("com/fr/design/images/error/error2.png"),
+ new Object[] {Toolkit.i18nText("Fine-Design_Error_Remote_No_Response_Wait"), Toolkit.i18nText("Fine-Design_Error_Remote_No_Response_Switch")},
+ null);
+ if (result == JOptionPane.YES_OPTION) {
+ try {
+ generate(config);
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ }
+ }
+ }
+
+ public static void stop() {
+ service.shutdown();
+ }
}
diff --git a/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceInfo.java b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceInfo.java
index 2e5cc9f8c0..ccc98bfe37 100644
--- a/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceInfo.java
+++ b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceInfo.java
@@ -10,6 +10,9 @@ public interface DesignerWorkspaceInfo extends XMLable {
String getPath();
+ //获取提醒时间,用于判断是否做服务检测
+ String getRemindTime();
+
WorkspaceConnectionInfo getConnection();
boolean checkValid();
diff --git a/designer-base/src/main/java/com/fr/design/env/LocalDesignerWorkspaceInfo.java b/designer-base/src/main/java/com/fr/design/env/LocalDesignerWorkspaceInfo.java
index 19b0857818..ef1f420d62 100644
--- a/designer-base/src/main/java/com/fr/design/env/LocalDesignerWorkspaceInfo.java
+++ b/designer-base/src/main/java/com/fr/design/env/LocalDesignerWorkspaceInfo.java
@@ -43,6 +43,11 @@ public class LocalDesignerWorkspaceInfo implements DesignerWorkspaceInfo {
return path;
}
+ @Override
+ public String getRemindTime() {
+ return null;
+ }
+
@Override
public WorkspaceConnectionInfo getConnection() {
return null;
diff --git a/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java b/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java
index 08477c6005..2f30f70b97 100644
--- a/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java
+++ b/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java
@@ -1,16 +1,43 @@
package com.fr.design.env;
+import com.fr.design.DesignerEnvManager;
+import com.fr.general.ComparatorUtils;
+import com.fr.log.FineLoggerFactory;
import com.fr.security.SecurityToolbox;
import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
+import com.fr.stable.project.ProjectConstants;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLableReader;
+import com.fr.workspace.WorkContext;
import com.fr.workspace.connect.WorkspaceConnectionInfo;
+import java.util.HashSet;
+import java.util.Set;
+
public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo {
+ private static final Set FILTER_SET = new HashSet<>();
+ private static final String HTTPS = "https://";
+ private static final String HTTP = "http://";
+ private static final String DEFAULT_SERVLET_NAME = "decision";
+ private static final String PATH = ProjectConstants.FORWARD_SLASH + ProjectConstants.WEBAPP_NAME + ProjectConstants.FORWARD_SLASH + DEFAULT_SERVLET_NAME;
+ private static final String HOST_NAME = "127.0.0.1";
+ private static final String LOCAL_HOTS_NAME = "localhost";
+ private static final String QUOTATION = ":";
+ private static final String PORT = Integer.toString(DesignerEnvManager.getEnvManager().getEmbedServerPort());
+
+ static {
+ FILTER_SET.add(HTTP + HOST_NAME + QUOTATION + PORT + PATH);
+ FILTER_SET.add(HTTPS + HOST_NAME + QUOTATION + PORT + PATH);
+ FILTER_SET.add(HTTP + LOCAL_HOTS_NAME + QUOTATION + PORT + PATH);
+ FILTER_SET.add(HTTPS + LOCAL_HOTS_NAME + QUOTATION + PORT + PATH);
+ }
+
private String name;
+ private String remindTime;
+
private WorkspaceConnectionInfo connection;
public static RemoteDesignerWorkspaceInfo create(WorkspaceConnectionInfo connection) {
@@ -43,11 +70,21 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo {
return connection;
}
+ public void setRemindTime(String remindTime){
+ this.remindTime = remindTime;
+ }
+
+ @Override
+ public String getRemindTime(){
+ return remindTime;
+ }
+
@Override
public void readXML(XMLableReader reader) {
if (reader.isAttr()) {
this.name = reader.getAttrAsString("name", StringUtils.EMPTY);
+ this.remindTime = reader.getAttrAsString("remindTime", StringUtils.EMPTY);
}
if (reader.isChildNode()) {
String tagName = reader.getTagName();
@@ -58,7 +95,8 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo {
String password = SecurityToolbox.defaultDecrypt(reader.getAttrAsString("password", StringUtils.EMPTY).replaceAll(" ", "\r\n"));
String certPath = reader.getAttrAsString("certPath", StringUtils.EMPTY);
String certSecretKey = reader.getAttrAsString("certSecretKey", StringUtils.EMPTY);
- this.connection = new WorkspaceConnectionInfo(url, username, password, certPath, certSecretKey);
+ boolean rememberPwd = reader.getAttrAsBoolean("rememberPwd", true);
+ this.connection = new WorkspaceConnectionInfo(url, username, password, certPath, certSecretKey, rememberPwd);
}
}
}
@@ -67,6 +105,7 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo {
public void writeXML(XMLPrintWriter writer) {
writer.attr("name", name);
+ writer.attr("remindTime", remindTime);
if (this.connection != null) {
writer.startTAG("Connection");
writer.attr("url", connection.getUrl());
@@ -74,6 +113,7 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo {
writer.attr("password", SecurityToolbox.defaultEncrypt(connection.getPassword()));
writer.attr("certPath", connection.getCertPath());
writer.attr("certSecretKey", connection.getCertSecretKey());
+ writer.attr("rememberPwd", connection.isRememberPwd());
writer.end();
}
}
@@ -90,8 +130,18 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo {
@Override
- public boolean checkValid(){
-
- return true;
+ public boolean checkValid() {
+ boolean result = false;
+ if (FILTER_SET.contains(connection.getUrl())) {
+ FineLoggerFactory.getLogger().error("url is same with local designer");
+ return result;
+ }
+ try {
+ result = WorkContext.getConnector().testConnection(connection);
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ return result;
+ }
+ return result;
}
}
diff --git a/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java b/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java
index 36d8e7f7a5..6d1685e74f 100644
--- a/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java
+++ b/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java
@@ -1,6 +1,10 @@
package com.fr.design.env;
+import com.fr.cluster.engine.rpc.remote.ClusterOperator;
import com.fr.design.i18n.Toolkit;
+import com.fr.base.operator.common.CommonOperator;
+import com.fr.rpc.ExceptionHandler;
+import com.fr.rpc.RPCInvokerExceptionInfo;
import com.fr.stable.AssistUtils;
import com.fr.workspace.WorkContext;
import com.fr.workspace.Workspace;
@@ -8,6 +12,8 @@ import com.fr.workspace.connect.WorkspaceClient;
import com.fr.workspace.connect.WorkspaceConnection;
import com.fr.workspace.connect.WorkspaceConnectionInfo;
import com.fr.workspace.server.authority.decision.DecisionOperator;
+import com.fr.workspace.engine.rpc.WorkspaceProxyPool;
+import com.fr.workspace.pool.WorkObjectPool;
/**
* Created by juhaoyu on 2018/6/14.
@@ -18,11 +24,11 @@ public class RemoteWorkspace implements Workspace {
private final WorkspaceClient client;
private final String address;
-
+
private final WorkspaceConnectionInfo connection;
-
+
private volatile Boolean isRoot = null;
-
+
RemoteWorkspace(WorkspaceClient client, WorkspaceConnectionInfo connection) {
this.client = client;
@@ -35,17 +41,21 @@ public class RemoteWorkspace implements Workspace {
return address;
}
-
+
@Override
public String getDescription() {
-
+
return Toolkit.i18nText("Fine-Design_Basic_Remote_Env");
}
-
+
@Override
public boolean isWarDeploy() {
-
- return false;
+ return WorkContext.getCurrent().get(CommonOperator.class, new ExceptionHandler() {
+ @Override
+ public Boolean callHandler(RPCInvokerExceptionInfo rpcInvokerExceptionInfo) {
+ return false;
+ }
+ }).isWarDeploy();
}
@Override
@@ -56,7 +66,7 @@ public class RemoteWorkspace implements Workspace {
@Override
public boolean isRoot() {
-
+
if (isRoot == null) {
synchronized (this) {
if (isRoot == null) {
@@ -66,34 +76,61 @@ public class RemoteWorkspace implements Workspace {
}
return isRoot;
}
-
+
+ @Override
+ public boolean isCluster() {
+ return WorkContext.getCurrent().get(ClusterOperator.class, new ExceptionHandler() {
+ @Override
+ public Boolean callHandler(RPCInvokerExceptionInfo rpcInvokerExceptionInfo) {
+ return false;
+ }
+ }).isCluster();
+ }
+
@Override
public WorkspaceConnection getConnection() {
-
+
return client.getConnection();
}
-
+
@Override
public T get(Class type) {
return client.getPool().get(type);
}
-
+
+ @Override
+ public T get(Class type, ExceptionHandler exceptionHandler){
+ if(exceptionHandler != null) {
+ WorkObjectPool objectPool = client.getPool();
+ if (objectPool instanceof WorkspaceProxyPool) {
+ return ((WorkspaceProxyPool) objectPool).get(type, exceptionHandler);
+ }else {
+ return client.getPool().get(type);
+ }
+ }
+ return client.getPool().get(type);
+ }
+
@Override
public void close() {
-
+
client.close();
}
-
+
@Override
public int hashCode() {
-
+
return connection.hashCode();
}
-
+
@Override
public boolean equals(Object obj) {
-
+
return obj instanceof RemoteWorkspace && AssistUtils.equals(((RemoteWorkspace) obj).connection, this.connection);
}
+
+ public WorkspaceClient getClient(){
+ return client;
+ }
}
diff --git a/designer-base/src/main/java/com/fr/design/event/RemoveListener.java b/designer-base/src/main/java/com/fr/design/event/RemoveListener.java
new file mode 100644
index 0000000000..ff3eae3055
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/event/RemoveListener.java
@@ -0,0 +1,11 @@
+package com.fr.design.event;
+
+/**
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2020/3/19
+ */
+public interface RemoveListener {
+
+ void doRemoveAction();
+}
diff --git a/designer-base/src/main/java/com/fr/design/event/StateChangeListener.java b/designer-base/src/main/java/com/fr/design/event/StateChangeListener.java
new file mode 100644
index 0000000000..9e4e655f31
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/event/StateChangeListener.java
@@ -0,0 +1,9 @@
+package com.fr.design.event;
+
+/**
+ * @Author: Yuan.Wang
+ * @Date: 2020/7/29
+ */
+public interface StateChangeListener {
+ public void stateChange();
+}
diff --git a/designer-base/src/main/java/com/fr/design/extra/LoginWebBridge.java b/designer-base/src/main/java/com/fr/design/extra/LoginWebBridge.java
index 471e25109a..0862c74472 100644
--- a/designer-base/src/main/java/com/fr/design/extra/LoginWebBridge.java
+++ b/designer-base/src/main/java/com/fr/design/extra/LoginWebBridge.java
@@ -196,18 +196,6 @@ public class LoginWebBridge {
uiLabel.setBackground(LOGIN_BACKGROUND);
}
- /**
- * 弹出QQ授权页面
- */
- public void showQQ() {
- SwingUtilities.invokeLater(new Runnable() {
- @Override
- public void run() {
- WebViewDlgHelper.createQQLoginDialog();
- }
- });
- }
-
/**
* 关闭QQ授权窗口
*/
diff --git a/designer-base/src/main/java/com/fr/design/extra/LoginWebPane.java b/designer-base/src/main/java/com/fr/design/extra/LoginWebPane.java
index a6b60b605e..d0a155a582 100644
--- a/designer-base/src/main/java/com/fr/design/extra/LoginWebPane.java
+++ b/designer-base/src/main/java/com/fr/design/extra/LoginWebPane.java
@@ -1,5 +1,6 @@
package com.fr.design.extra;
+import com.fr.design.dialog.FineJOptionPane;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.event.EventHandler;
@@ -46,7 +47,7 @@ public class LoginWebPane extends JFXPanel {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
- JOptionPane.showMessageDialog(LoginWebPane.this, message);
+ FineJOptionPane.showMessageDialog(LoginWebPane.this, message);
}
});
}
diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginFromStorePane.java b/designer-base/src/main/java/com/fr/design/extra/PluginFromStorePane.java
index 83ee0a16fb..5f76dbafca 100644
--- a/designer-base/src/main/java/com/fr/design/extra/PluginFromStorePane.java
+++ b/designer-base/src/main/java/com/fr/design/extra/PluginFromStorePane.java
@@ -1,6 +1,7 @@
package com.fr.design.extra;
import com.fr.config.MarketConfig;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.extra.tradition.callback.UpdateOnlineCallback;
import com.fr.design.gui.frpane.UITabbedPane;
import com.fr.design.gui.ilable.UILabel;
@@ -177,14 +178,14 @@ public class PluginFromStorePane extends PluginAbstractLoadingViewPane map = new HashMap();
- map.put("id", id);
- HttpClient httpClient = new HttpClient(CloudCenter.getInstance().acquireUrlByKind("shop.script.download")+ "?" + FR_VERSION + "=" + ProductConstants.VERSION);
+ private static String getDownloadPath(String id) {
+ String url = CloudCenter.getInstance().acquireUrlByKind("shop.script.download");
+ if (StringUtils.isBlank(url)) {
+ return StringUtils.EMPTY;
+ }
+ HttpClient httpClient = new HttpClient(url + "?" + FR_VERSION + "=" + ProductConstants.VERSION);
httpClient.asGet();
- String resText = httpClient.getResponseText();
- JSONObject resultJSONObject = new JSONObject(resText);
- String scriptUrl = resultJSONObject.optString("result");
- String charSet = EncodeConstants.ENCODING_UTF_8;
- scriptUrl = URLDecoder.decode(URLDecoder.decode(scriptUrl, charSet), charSet);
-
- return scriptUrl;
+ if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) {
+ String resText = httpClient.getResponseText();
+ JSONObject resultJSONObject = new JSONObject(resText);
+ String scriptUrl = resultJSONObject.optString("result");
+ String charSet = EncodeConstants.ENCODING_UTF_8;
+ try {
+ scriptUrl = URLDecoder.decode(URLDecoder.decode(scriptUrl, charSet), charSet);
+ } catch (UnsupportedEncodingException e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ return scriptUrl;
+ }
+ return StringUtils.EMPTY;
}
public static boolean isPluginMatch(PluginView pluginView, String text) {
@@ -192,22 +207,22 @@ public class PluginUtils {
return StringUtils.EMPTY;
}
}
-
- public static String getMessageByErrorCode(PluginErrorCode errorCode) {
- if(errorCode == PluginErrorCode.None){
+
+ public static String getMessageByErrorCode(PluginBaseErrorCode errorCode) {
+ if (errorCode == PluginErrorCode.None) {
return "";
}
-
+
return com.fr.design.i18n.Toolkit.i18nCompatibleServerText(getInterKeyByErrorCode(errorCode));
}
-
- private static String getInterKeyByErrorCode(PluginErrorCode errorCode) {
-
- return errorCode.getDescription();
+
+ private static String getInterKeyByErrorCode(PluginBaseErrorCode errorCode) {
+
+ return errorCode.getDescription();
}
-
+
public static PluginMarker getInstalledPluginMarkerByID(String pluginID) {
-
+
PluginContext context = PluginManager.getContext(pluginID);
if (context != null) {
return context.getMarker();
@@ -217,29 +232,30 @@ public class PluginUtils {
/**
* 在不同设计器版本下展示不同插件
+ *
* @return 插件
*/
- public static JSONArray filterPluginsFromVersion(JSONArray oriJSONArray) throws Exception{
- JSONArray resultJSONArray = JSONArray.create();
- for(int i = 0; i < oriJSONArray.length(); i++){
+ public static JSONArray filterPluginsFromVersion(JSONArray oriJSONArray) {
+ JSONArray resultJSONArray = JSONArray.create();
+ for (int i = 0; i < oriJSONArray.length(); i++) {
JSONObject jo = oriJSONArray.getJSONObject(i);
String envVersion = jo.optString("envversion");
- if(isCompatibleCurrentEnv(envVersion)){
+ if (isCompatibleCurrentEnv(envVersion)) {
resultJSONArray.put(jo);
}
}
return resultJSONArray;
}
- private static boolean isCompatibleCurrentEnv(String envVersion){
+ private static boolean isCompatibleCurrentEnv(String envVersion) {
return VersionIntervalFactory.create(envVersion).contain(Version.currentEnvVersion());
}
- public static JSONArray transferStorePluginToJson(PluginContext [] pluginContexts){
+ public static JSONArray transferStorePluginToJson(PluginContext[] pluginContexts) {
JSONArray ja = JSONArray.create();
try {
- for(PluginContext pluginContext : pluginContexts){
+ for (PluginContext pluginContext : pluginContexts) {
JSONObject jo = JSONObject.create();
jo.put("id", pluginContext.getID());
jo.put("name", pluginContext.getName());
@@ -263,7 +279,7 @@ public class PluginUtils {
jo.put("switchedReason", pluginContext.getSwitchedReason());
ja.put(jo);
}
- }catch (Exception e){
+ } catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
return ja;
diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginWebBridge.java b/designer-base/src/main/java/com/fr/design/extra/PluginWebBridge.java
index 10f65fa2b7..159e6d6d9c 100644
--- a/designer-base/src/main/java/com/fr/design/extra/PluginWebBridge.java
+++ b/designer-base/src/main/java/com/fr/design/extra/PluginWebBridge.java
@@ -533,13 +533,6 @@ public class PluginWebBridge {
threadPoolExecutor.submit(task);
}
- /**
- * 弹出QQ授权页面
- */
- public void showQQ() {
- LoginWebBridge.getHelper().showQQ();
- }
-
/**
* 通过QQ登录后通知登录
*/
diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginWebPane.java b/designer-base/src/main/java/com/fr/design/extra/PluginWebPane.java
index 627d16855e..002ac88bf1 100644
--- a/designer-base/src/main/java/com/fr/design/extra/PluginWebPane.java
+++ b/designer-base/src/main/java/com/fr/design/extra/PluginWebPane.java
@@ -1,6 +1,7 @@
package com.fr.design.extra;
import com.fr.base.TemplateUtils;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.general.GeneralContext;
import com.fr.general.IOUtils;
import com.fr.log.FineLoggerFactory;
@@ -104,7 +105,7 @@ public class PluginWebPane extends JFXPanel {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
- JOptionPane.showMessageDialog(PluginWebPane.this, message);
+ FineJOptionPane.showMessageDialog(PluginWebPane.this, message);
}
});
}
diff --git a/designer-base/src/main/java/com/fr/design/extra/QQLoginWebPane.java b/designer-base/src/main/java/com/fr/design/extra/QQLoginWebPane.java
deleted file mode 100644
index 9928d9ae0e..0000000000
--- a/designer-base/src/main/java/com/fr/design/extra/QQLoginWebPane.java
+++ /dev/null
@@ -1,233 +0,0 @@
-package com.fr.design.extra;
-
-import com.fr.general.CloudCenter;
-import com.fr.general.ComparatorUtils;
-import com.fr.general.IOUtils;
-import com.fr.log.FineLoggerFactory;
-import javafx.application.Platform;
-import javafx.beans.property.BooleanProperty;
-import javafx.beans.property.SimpleBooleanProperty;
-import javafx.beans.value.ChangeListener;
-import javafx.beans.value.ObservableValue;
-import javafx.concurrent.Worker;
-import javafx.embed.swing.JFXPanel;
-import javafx.event.ActionEvent;
-import javafx.event.EventHandler;
-import javafx.scene.Group;
-import javafx.scene.Node;
-import javafx.scene.Scene;
-import javafx.scene.control.ButtonBuilder;
-import javafx.scene.control.LabelBuilder;
-import javafx.scene.input.MouseEvent;
-import javafx.scene.layout.BorderPane;
-import javafx.scene.layout.HBox;
-import javafx.scene.layout.HBoxBuilder;
-import javafx.scene.paint.Color;
-import javafx.scene.web.WebEngine;
-import javafx.scene.web.WebEvent;
-import javafx.scene.web.WebView;
-import javafx.stage.Modality;
-import javafx.stage.Screen;
-import javafx.stage.Stage;
-import javafx.stage.StageStyle;
-import javafx.stage.WindowEvent;
-import javafx.util.Callback;
-import netscape.javascript.JSObject;
-
-import javax.swing.JOptionPane;
-import javax.swing.SwingUtilities;
-import java.awt.Toolkit;
-
-/**
- * Created by zhaohehe on 16/7/28.
- */
-public class QQLoginWebPane extends JFXPanel {
-
- private WebEngine webEngine;
- private String url;
-
- private static JSObject window;
-
- private static int DEFAULT_PRIMARYSTAGE_WIDTH = 100;
- private static int DEFAULT_PRIMARYSTAGE_HEIGHT = 100;
-
- private static int DEFAULT_CONFIRM_WIDTH = 450;
- private static int DEFAULT_CONFIRM_HEIGHT = 160;
- private static int DEFAULT_OFFEST = 20;
-
- class Delta {
- double x, y;
- }
-
- public QQLoginWebPane(final String installHome) {
- Platform.setImplicitExit(false);
- Platform.runLater(new Runnable() {
- @Override
- public void run() {
- BorderPane root = new BorderPane();
- Scene scene = new Scene(root);
- QQLoginWebPane.this.setScene(scene);
- final WebView webView = new WebView();
- webEngine = webView.getEngine();
- url = "file:///" + installHome + "/scripts/qqLogin.html";
- webEngine.load(url);
-
- final Stage primaryStage = new Stage();
-
- HBox layout = new HBox();
- try {
- primaryStage.initStyle(StageStyle.TRANSPARENT);
- primaryStage.setScene(new Scene(layout));
- webView.getScene().getStylesheets().add(IOUtils.getResource("modal-dialog.css", getClass()).toExternalForm());
- primaryStage.initStyle(StageStyle.UTILITY);
- primaryStage.setScene(new Scene(new Group(), DEFAULT_PRIMARYSTAGE_WIDTH, DEFAULT_PRIMARYSTAGE_HEIGHT));
- primaryStage.setX(0);
- primaryStage.setY(Screen.getPrimary().getBounds().getHeight() + DEFAULT_PRIMARYSTAGE_HEIGHT);
- primaryStage.show();
- } catch (Exception e) {
- FineLoggerFactory.getLogger().info(e.getMessage());
- }
- webEngine.setConfirmHandler(new Callback() {
- @Override
- public Boolean call(String msg) {
- Boolean confirmed = confirm(primaryStage, msg, webView);
- return confirmed;
- }
- });
- configWebEngine();
- webView.setContextMenuEnabled(false);//屏蔽右键
- root.setCenter(webView);
- }
- });
- }
-
- private void configWebEngine() {
-
- webEngine.locationProperty().addListener(new ChangeListener() {
- @Override
- public void changed(ObservableValue extends String> observable, final String oldValue, String newValue) {
- disableLink(webEngine);
- // webView好像默认以手机版显示网页,浏览器里过滤掉这个跳转
- if (ComparatorUtils.equals(newValue, url) || ComparatorUtils.equals(newValue, CloudCenter.getInstance().acquireUrlByKind("bbs.mobile"))) {
- return;
- }
- LoginWebBridge.getHelper().openUrlAtLocalWebBrowser(webEngine, newValue);
- }
- });
-
- webEngine.setOnAlert(new EventHandler>() {
- @Override
- public void handle(WebEvent event) {
- showAlert(event.getData());
- }
- });
-
- webEngine.getLoadWorker().stateProperty().addListener(
- new ChangeListener() {
- public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState) {
- if (newState == Worker.State.SUCCEEDED) {
- window = (JSObject) webEngine.executeScript("window");
- window.setMember("QQLoginHelper", LoginWebBridge.getHelper());
- }
- }
- }
- );
- }
-
- private void showAlert(final String message) {
- SwingUtilities.invokeLater(new Runnable() {
- @Override
- public void run() {
- JOptionPane.showMessageDialog(QQLoginWebPane.this, message);
- }
- });
- }
-
- private void disableLink(final WebEngine eng) {
- try {
- // webView端不跳转 虽然webView可以指定本地浏览器打开某个链接,但是当本地浏览器跳转到指定链接的同时,webView也做了跳转,
- // 为了避免出现在一个600*400的资讯框里加载整个网页的情况,webView不跳转到新网页
- Platform.runLater(new Runnable() {
- @Override
- public void run() {
- eng.executeScript("location.reload()");
- LoginWebBridge.getHelper().closeQQWindow();
- }
- });
- } catch (Exception e) {
- FineLoggerFactory.getLogger().error(e.getMessage(), e);
- }
- }
-
- private Boolean confirm(final Stage parent, String msg, final WebView webView) {
- final BooleanProperty confirmationResult = new SimpleBooleanProperty();
- // initialize the confirmation dialog
- final Stage dialog = new Stage(StageStyle.UTILITY);
- dialog.setX(Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2 - DEFAULT_CONFIRM_WIDTH / 2.0D + DEFAULT_OFFEST);
- dialog.setY(Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2 + DEFAULT_OFFEST);
- dialog.setHeight(DEFAULT_CONFIRM_HEIGHT);
- dialog.setWidth(DEFAULT_CONFIRM_WIDTH);
- dialog.setIconified(false);
- dialog.initOwner(parent);
- dialog.initModality(Modality.WINDOW_MODAL);
- dialog.setScene(
- new Scene(
- HBoxBuilder.create().styleClass("modal-dialog").children(
- LabelBuilder.create().text(msg).build(),
- ButtonBuilder.create().text(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_BBSLogin_Switch_Account")).defaultButton(true).onAction(new EventHandler() {
- @Override
- public void handle(ActionEvent actionEvent) {
- // take action and close the dialog.
- confirmationResult.set(true);
- webView.getEngine().reload();
- dialog.close();
- }
- }).build(),
- ButtonBuilder.create().text(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Engine_Cancel")).cancelButton(true).onAction(new EventHandler() {
- @Override
- public void handle(ActionEvent actionEvent) {
- // abort action and close the dialog.
- confirmationResult.set(false);
- dialog.close();
- }
- }).build()
- ).build()
- , Color.TRANSPARENT
- )
- );
- configDrag(dialog);
- // style and show the dialog.
- dialog.getScene().getStylesheets().add(IOUtils.getResource("modal-dialog.css", getClass()).toExternalForm());
- dialog.setOnCloseRequest(new EventHandler() {
- @Override
- public void handle(WindowEvent event) {
- event.consume();
- dialog.close();
- }
- });
- dialog.showAndWait();
- return confirmationResult.get();
- }
-
- private void configDrag(final Stage dialog) {
- // allow the dialog to be dragged around.
- final Node root = dialog.getScene().getRoot();
- final Delta dragDelta = new Delta();
-
- root.setOnMousePressed(new EventHandler() {
- @Override
- public void handle(MouseEvent mouseEvent) {
- // record a delta distance for the drag and drop operation.
- dragDelta.x = dialog.getX() - mouseEvent.getScreenX();
- dragDelta.y = dialog.getY() - mouseEvent.getScreenY();
- }
- });
- root.setOnMouseDragged(new EventHandler() {
- @Override
- public void handle(MouseEvent mouseEvent) {
- dialog.setX(mouseEvent.getScreenX() + dragDelta.x);
- dialog.setY(mouseEvent.getScreenY() + dragDelta.y);
- }
- });
- }
-}
diff --git a/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java b/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java
index bbb10c6d65..d7f858b65f 100644
--- a/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java
+++ b/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java
@@ -2,6 +2,7 @@ package com.fr.design.extra;
import com.fr.base.FRContext;
import com.fr.design.dialog.BasicPane;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.dialog.UIDialog;
import com.fr.design.gui.frpane.UITabbedPane;
import com.fr.design.mainframe.DesignerContext;
@@ -10,7 +11,6 @@ import com.fr.general.CommonIOUtils;
import com.fr.general.ComparatorUtils;
import com.fr.general.GeneralContext;
import com.fr.general.IOUtils;
-import com.fr.general.http.HttpClient;
import com.fr.general.http.HttpToolbox;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
@@ -31,7 +31,6 @@ import java.awt.Window;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
-import java.net.HttpURLConnection;
import java.util.concurrent.ExecutionException;
/**
@@ -62,7 +61,7 @@ public class WebViewDlgHelper {
String mainJsPath = StableUtils.pathJoin(installHome, MAIN_JS_PATH);
File file = new File(mainJsPath);
if (!file.exists()) {
- int rv = JOptionPane.showConfirmDialog(
+ int rv = FineJOptionPane.showConfirmDialog(
null,
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Need_Install"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"),
@@ -74,12 +73,12 @@ public class WebViewDlgHelper {
}
return;
}
- String jar_version = PluginStoreConstants.getInstance().getProps(ENV_VERSION, StringUtils.EMPTY);
+ String jar_version = PluginStoreConstants.getProps(ENV_VERSION, StringUtils.EMPTY);
if (ComparatorUtils.equals(jar_version, ProductConstants.VERSION)) {
updateShopScripts(SHOP_SCRIPTS);
showPluginDlg();
} else {
- int rv = JOptionPane.showConfirmDialog(
+ int rv = FineJOptionPane.showConfirmDialog(
null,
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Need_Install_Version"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"),
@@ -153,6 +152,7 @@ public class WebViewDlgHelper {
* @param keyword
* @param data
*/
+ @Deprecated
public static void showPluginInStore(String keyword, String data) {
PluginWebBridge.getHelper().showResultInStore(keyword, data);
createPluginDialog();
@@ -183,23 +183,8 @@ public class WebViewDlgHelper {
}
}
- public static void createQQLoginDialog() {
- try {
- Class> clazz = Class.forName("com.fr.design.extra.QQLoginWebPane");
- Constructor constructor = clazz.getConstructor(String.class);
- Component webPane = (Component) constructor.newInstance(new File(installHome).getAbsolutePath());
-
- UIDialog qqLoginDialog = new QQLoginDialog(DesignerContext.getDesignerFrame(), webPane);
- LoginWebBridge.getHelper().setQQDialog(qqLoginDialog);
- qqLoginDialog.setVisible(true);
- } catch (Throwable ignored) {
- // ignored
- }
- }
-
-
private static void confirmDownLoadShopJS() {
- int rv = JOptionPane.showConfirmDialog(
+ int rv = FineJOptionPane.showConfirmDialog(
null,
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Need_Install"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"),
@@ -277,7 +262,7 @@ public class WebViewDlgHelper {
CommonUtils.deleteFile(scriptZip);
}
PluginStoreConstants.refreshProps(); // 下载完刷新一下版本号等
- JOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Installed"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), JOptionPane.INFORMATION_MESSAGE);
+ FineJOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Installed"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), JOptionPane.INFORMATION_MESSAGE);
}
} catch (InterruptedException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
@@ -296,11 +281,11 @@ public class WebViewDlgHelper {
protected Void doInBackground() throws Exception {
String url = CloudCenter.getInstance().acquireUrlByKind("shop.plugin.update");
if (url != null) {
- String text = HttpToolbox.get(url + "?" + PluginUtils.FR_VERSION + "=" + ProductConstants.VERSION + "&version=" + PluginStoreConstants.getInstance().getProps("VERSION"));
+ String text = HttpToolbox.get(url + "?" + PluginUtils.FR_VERSION + "=" + ProductConstants.VERSION + "&version=" + PluginStoreConstants.getProps("VERSION"));
JSONObject resultJSONObject = new JSONObject(text);
String isLatest = resultJSONObject.optString("result");
if (!ComparatorUtils.equals(isLatest, LATEST)) {
- int rv = JOptionPane.showConfirmDialog(
+ int rv = FineJOptionPane.showConfirmDialog(
null,
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Need_Update"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"),
diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java b/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java
index 0a3b76211d..1f8db99a00 100644
--- a/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java
+++ b/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java
@@ -1,9 +1,13 @@
package com.fr.design.extra.exe;
+import com.fr.design.DesignerEnvManager;
import com.fr.design.extra.PluginConstants;
import com.fr.design.extra.Process;
import com.fr.general.CloudCenter;
-import com.fr.general.http.HttpClient;
+import com.fr.general.http.HttpToolbox;
+import com.fr.log.FineLoggerFactory;
+import com.fr.stable.StringUtils;
+import java.util.Locale;
/**
* Created by vito on 16/5/16.
@@ -27,14 +31,17 @@ public class GetPluginCategoriesExecutor implements Executor {
@Override
public void run(Process process) {
- String url = CloudCenter.getInstance().acquireUrlByKind("shop.plugin.category");
- if (url != null) {
- HttpClient httpClient = new HttpClient(url);
- result = httpClient.getResponseText();
- } else {
- result = PluginConstants.CONNECTION_404;
+ Locale locale = DesignerEnvManager.getEnvManager().getLanguage();
+ String url = CloudCenter.getInstance().acquireUrlByKind("shop.plugin.category") + "&locale=" + locale.toString();
+ if (StringUtils.isNotEmpty(url)) {
+ try {
+ result = HttpToolbox.get(url);
+ return;
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
}
-
+ result = PluginConstants.CONNECTION_404;
}
}
};
diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java b/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java
index 4a1168734e..3bf7b2cb32 100644
--- a/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java
+++ b/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java
@@ -52,7 +52,7 @@ public class GetPluginFromStoreExecutor implements Executor {
@Override
public void run(Process process) {
- String plistUrl = CloudCenter.getInstance().acquireUrlByKind("shop.plugin.plist") + "?";
+ String plistUrl = CloudCenter.getInstance().acquireUrlByKind("shop.plugin.plist");
boolean getRecommend = StringUtils.isEmpty(category) && StringUtils.isEmpty(seller) && StringUtils.isEmpty(fee) && StringUtils.isEmpty(scope);
if (getRecommend) {
result = PluginOperateUtils.getRecommendPlugins();
@@ -61,7 +61,7 @@ public class GetPluginFromStoreExecutor implements Executor {
if (StringUtils.isNotBlank(plistUrl)) {
StringBuilder url = new StringBuilder();
- url.append(plistUrl);
+ url.append(plistUrl).append("?");
PluginOperateUtils.dealParams(url, category, seller, fee, scope);
try {
HttpClient httpClient = new HttpClient(url.toString());
diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/SearchOnlineExecutor.java b/designer-base/src/main/java/com/fr/design/extra/exe/SearchOnlineExecutor.java
index fdbd8562f4..1a84519eee 100644
--- a/designer-base/src/main/java/com/fr/design/extra/exe/SearchOnlineExecutor.java
+++ b/designer-base/src/main/java/com/fr/design/extra/exe/SearchOnlineExecutor.java
@@ -14,8 +14,8 @@ import com.fr.stable.StringUtils;
* Created by vito on 16/4/18.
*/
public class SearchOnlineExecutor implements Executor {
- private String result = StringUtils.EMPTY;
- private String keyword;
+ private String result = JSONArray.create().toString();
+ private final String keyword;
public SearchOnlineExecutor(String keyword) {
this.keyword = keyword;
@@ -42,7 +42,11 @@ public class SearchOnlineExecutor implements Executor {
result = PluginOperateUtils.getRecommendPlugins();
return;
}
- HttpClient httpClient = new HttpClient(CloudCenter.getInstance().acquireUrlByKind("shop.plugin.store") + "&keyword=" + keyword);
+ String url = CloudCenter.getInstance().acquireUrlByKind("shop.plugin.store");
+ if (StringUtils.isEmpty(url)) {
+ return;
+ }
+ HttpClient httpClient = new HttpClient(url + "&keyword=" + keyword);
httpClient.asGet();
String responseText = httpClient.getResponseText();
JSONObject jsonObject = new JSONObject(responseText);
diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java b/designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java
index 4cbd063284..19bd89ef10 100644
--- a/designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java
+++ b/designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java
@@ -1,6 +1,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;
@@ -41,7 +42,7 @@ public class InstallFromDiskCallback extends AbstractPluginTaskCallback {
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);
- JOptionPane.showMessageDialog(null, 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);
} else if (result.errorCode() == PluginErrorCode.NeedDealWithPluginDependency) {
int rv = JOptionPane.showOptionDialog(
null,
@@ -50,7 +51,7 @@ public class InstallFromDiskCallback extends AbstractPluginTaskCallback {
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE,
null,
- null,
+ FineJOptionPane.OPTION_YES_NO_CANCEL,
null
);
if (rv == JOptionPane.NO_OPTION || rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) {
@@ -70,7 +71,7 @@ public class InstallFromDiskCallback extends AbstractPluginTaskCallback {
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE,
null,
- null,
+ FineJOptionPane.OPTION_YES_NO_CANCEL,
null
);
if (rv == JOptionPane.NO_OPTION || rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) {
@@ -80,7 +81,7 @@ public class InstallFromDiskCallback extends AbstractPluginTaskCallback {
}else {
jsCallback.execute("failed");
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Failed"));
- JOptionPane.showMessageDialog(null, PluginUtils.getMessageByErrorCode(result.errorCode()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Failed"), JOptionPane.ERROR_MESSAGE);
+ FineJOptionPane.showMessageDialog(null, PluginUtils.getMessageByErrorCode(result.errorCode()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Failed"), JOptionPane.ERROR_MESSAGE);
}
}
}
diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallOnlineCallback.java b/designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallOnlineCallback.java
index 6e72c0478d..f597180e87 100644
--- a/designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallOnlineCallback.java
+++ b/designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallOnlineCallback.java
@@ -1,6 +1,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.log.FineLoggerFactory;
@@ -38,7 +39,7 @@ public class InstallOnlineCallback extends AbstractDealPreTaskCallback {
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);
- JOptionPane.showMessageDialog(null, 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);
} else if(result.errorCode() == PluginErrorCode.HasLowerPluginWhenInstall){
int rv = JOptionPane.showOptionDialog(
null,
@@ -47,7 +48,7 @@ public class InstallOnlineCallback extends AbstractDealPreTaskCallback {
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE,
null,
- null,
+ FineJOptionPane.OPTION_YES_NO_CANCEL,
null
);
if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) {
@@ -58,7 +59,7 @@ public class InstallOnlineCallback extends AbstractDealPreTaskCallback {
}else {
jsCallback.execute("failed");
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Failed"));
- JOptionPane.showMessageDialog(null, pluginInfo, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
+ FineJOptionPane.showMessageDialog(null, pluginInfo, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
}
}
diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/callback/ModifyStatusCallback.java b/designer-base/src/main/java/com/fr/design/extra/exe/callback/ModifyStatusCallback.java
index b7b817ef4c..c48a47faeb 100644
--- a/designer-base/src/main/java/com/fr/design/extra/exe/callback/ModifyStatusCallback.java
+++ b/designer-base/src/main/java/com/fr/design/extra/exe/callback/ModifyStatusCallback.java
@@ -1,6 +1,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.PluginUtils;
import com.fr.plugin.manage.control.PluginTaskCallback;
@@ -24,9 +25,9 @@ public class ModifyStatusCallback implements PluginTaskCallback{
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");
- JOptionPane.showMessageDialog(null, modifyMessage);
+ FineJOptionPane.showMessageDialog(null, modifyMessage);
} else {
- JOptionPane.showMessageDialog(null, PluginUtils.getMessageByErrorCode(result.errorCode()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
+ FineJOptionPane.showMessageDialog(null, PluginUtils.getMessageByErrorCode(result.errorCode()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
}
}
diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/callback/UninstallPluginCallback.java b/designer-base/src/main/java/com/fr/design/extra/exe/callback/UninstallPluginCallback.java
index db8a69188a..b3773ef6f9 100644
--- a/designer-base/src/main/java/com/fr/design/extra/exe/callback/UninstallPluginCallback.java
+++ b/designer-base/src/main/java/com/fr/design/extra/exe/callback/UninstallPluginCallback.java
@@ -1,6 +1,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.PluginUtils;
import com.fr.log.FineLoggerFactory;
@@ -27,7 +28,7 @@ public class UninstallPluginCallback extends AbstractPluginTaskCallback {
if (result.isSuccess()) {
jsCallback.execute("success");
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Success"));
- JOptionPane.showMessageDialog(null, 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"));
}else if (result.errorCode() == PluginErrorCode.NeedUninstallDependingPluginFirst) {
int rv = JOptionPane.showOptionDialog(
null,
@@ -36,7 +37,7 @@ public class UninstallPluginCallback extends AbstractPluginTaskCallback {
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE,
null,
- null,
+ FineJOptionPane.OPTION_YES_NO_CANCEL,
null
);
if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) {
@@ -46,7 +47,7 @@ public class UninstallPluginCallback extends AbstractPluginTaskCallback {
} else {
jsCallback.execute("failed");
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Failed"));
- JOptionPane.showMessageDialog(null, PluginUtils.getMessageByErrorCode(result.errorCode()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
+ FineJOptionPane.showMessageDialog(null, PluginUtils.getMessageByErrorCode(result.errorCode()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
}
}
}
diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java b/designer-base/src/main/java/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java
index 392d8074e9..7cced40f0b 100644
--- a/designer-base/src/main/java/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java
+++ b/designer-base/src/main/java/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java
@@ -1,6 +1,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;
@@ -39,7 +40,7 @@ public class UpdateFromDiskCallback extends AbstractPluginTaskCallback {
if (result.isSuccess()) {
jsCallback.execute("success");
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Update_Success"));
- JOptionPane.showMessageDialog(null, 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"));
} else if (result.errorCode() == PluginErrorCode.NeedDealWithPluginDependency) {
int rv = JOptionPane.showOptionDialog(
null,
@@ -48,7 +49,7 @@ public class UpdateFromDiskCallback extends AbstractPluginTaskCallback {
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE,
null,
- null,
+ FineJOptionPane.OPTION_YES_NO_CANCEL,
null
);
if (rv == JOptionPane.NO_OPTION || rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) {
@@ -68,7 +69,7 @@ public class UpdateFromDiskCallback extends AbstractPluginTaskCallback {
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE,
null,
- null,
+ FineJOptionPane.OPTION_YES_NO_CANCEL,
null
);
if (rv == JOptionPane.NO_OPTION || rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) {
@@ -78,7 +79,7 @@ public class UpdateFromDiskCallback extends AbstractPluginTaskCallback {
}else {
jsCallback.execute("failed");
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Update_Failed"));
- JOptionPane.showMessageDialog(null, PluginUtils.getMessageByErrorCode(result.errorCode()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
+ FineJOptionPane.showMessageDialog(null, PluginUtils.getMessageByErrorCode(result.errorCode()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
}
}
}
diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java b/designer-base/src/main/java/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java
index 28f4f6a31f..69998a3169 100644
--- a/designer-base/src/main/java/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java
+++ b/designer-base/src/main/java/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java
@@ -1,6 +1,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.log.FineLoggerFactory;
@@ -33,11 +34,11 @@ public class UpdateOnlineCallback extends AbstractDealPreTaskCallback {
if (result.isSuccess()) {
jsCallback.execute("success");
FineLoggerFactory.getLogger().info(pluginInfo + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Update_Success"));
- JOptionPane.showMessageDialog(null,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"));
} else {
jsCallback.execute("failed");
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Update_Failed"));
- JOptionPane.showMessageDialog(null, pluginInfo, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
+ FineJOptionPane.showMessageDialog(null, pluginInfo, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
}
}
}
diff --git a/designer-base/src/main/java/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java b/designer-base/src/main/java/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java
index 468e923166..97a2ae0063 100644
--- a/designer-base/src/main/java/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java
+++ b/designer-base/src/main/java/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java
@@ -1,5 +1,6 @@
package com.fr.design.extra.tradition.callback;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.extra.PluginStatusCheckCompletePane;
import com.fr.design.extra.PluginUtils;
@@ -32,7 +33,7 @@ public class UpdateOnlineCallback implements ProgressCallback {
public void done(PluginTaskResult result){
if (result.isSuccess()) {
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("FR-Designer-Plugin_Update_Success"));
- JOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Successful"));
+ FineJOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Install_Successful"));
} else if (result.errorCode() == PluginErrorCode.OperationNotSupport) {
int rv = JOptionPane.showOptionDialog(
null,
@@ -41,7 +42,7 @@ public class UpdateOnlineCallback implements ProgressCallback {
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE,
null,
- null,
+ FineJOptionPane.OPTION_YES_NO_CANCEL,
null
);
if (rv == JOptionPane.CANCEL_OPTION || rv == JOptionPane.CLOSED_OPTION) {
@@ -50,7 +51,7 @@ public class UpdateOnlineCallback implements ProgressCallback {
PluginManager.getController().update(pluginMarker, toPluginMarker, new UpdateOnlineCallback(pluginMarker, toPluginMarker, pane));
} else {
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("FR-Designer-Plugin_Delete_Failed"));
- JOptionPane.showMessageDialog(null, PluginUtils.getMessageByErrorCode(result.errorCode()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
+ FineJOptionPane.showMessageDialog(null, PluginUtils.getMessageByErrorCode(result.errorCode()), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
}
}
}
diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java
index 8e75fae0bc..ba1cce5563 100644
--- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java
+++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java
@@ -2,6 +2,7 @@ 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;
@@ -178,15 +179,28 @@ public class HistoryTemplateListCache implements CallbackEvent {
* @return 位置
*/
public int contains(JTemplate, ?> jt) {
+ return contains(jt, null);
+ }
+
+ public int contains(FILE file) {
+ return contains(null, file);
+ }
+
+ private int contains(JTemplate jt, FILE file) {
+ FILE item = null;
+ if (jt != null) {
+ item = jt.getEditingFILE();
+ } else {
+ item = file;
+ }
for (int i = 0; i < historyList.size(); i++) {
- if (ComparatorUtils.equals(historyList.get(i).getEditingFILE(), jt.getEditingFILE())) {
+ if (ComparatorUtils.equals(historyList.get(i).getEditingFILE(), item)) {
return i;
}
}
return -1;
}
-
/**
* 判断是否打开过该模板
* 由于切换环境不会关闭模板,可能存在同名的模板,所以该方法不能准确找到所选的模板,
@@ -356,6 +370,7 @@ public class HistoryTemplateListCache implements CallbackEvent {
*/
public void load() {
FineLoggerFactory.getLogger().info("Env Change Template Loading...");
+ JTemplate currentTemplate = null;
if (stashFILEMap != null && stashFILEMap.size() != 0) {
int size = historyList.size();
for (int i = 0; i < size; i++) {
@@ -371,19 +386,45 @@ public class HistoryTemplateListCache implements CallbackEvent {
historyList.set(i, template);
// 替换当前正在编辑的模板,使用添加并激活的方式,以便使用统一的入口来处理监听事件
if (isCurrentEditingFile(template.getPath())) {
- DesignerContext.getDesignerFrame().addAndActivateJTemplate(template);
- setCurrentEditingTemplate(template);
- FineLoggerFactory.getLogger().info("Env Change Current Editing Template.");
+ currentTemplate = template;
+ }
+ } else {
+ // 当模板为空时 说明是一个新建的未保存模板 但是内存中保存了该模板 可以从中获取
+ JTemplate jt = historyList.get(i);
+ // 另外如果该模板是正在编辑的模板,需要要激活
+ if (jt != null && isCurrentEditingFile(jt.getPath())) {
+ currentTemplate = jt;
}
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
+ // 最后加载当前正在编辑的模板 以保证数据集刷新正常
+ if (currentTemplate != null) {
+ loadCurrentTemplate(currentTemplate);
+ }
stashFILEMap.clear();
MutilTempalteTabPane.getInstance().refreshOpenedTemplate(historyList);
MutilTempalteTabPane.getInstance().repaint();
}
FineLoggerFactory.getLogger().info("Env Change Template Loaded.");
}
+
+ private void loadCurrentTemplate(JTemplate, ?> template) {
+ DesignerContext.getDesignerFrame().addAndActivateJTemplate(template);
+ setCurrentEditingTemplate(template);
+ FineLoggerFactory.getLogger().info("Env Change Current Editing Template " + template.getTemplateName());
+ }
+
+ /**
+ * 重新载入当前模板,刷新数据/对象
+ */
+ public void reloadCurrentTemplate() {
+ JTemplate, ?> jt = getCurrentEditingTemplate();
+ boolean access = jt != null && jt.getEditingFILE() != null && jt.getEditingFILE().exists();
+ if (access) {
+ jt.refreshResource();
+ }
+ }
}
diff --git a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java
index e0a3dd5479..e4ab990337 100644
--- a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java
+++ b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java
@@ -5,6 +5,7 @@ import com.fr.base.BaseUtils;
import com.fr.base.GraphHelper;
import com.fr.base.vcs.DesignerMode;
import com.fr.design.constants.UIConstants;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.imenu.UIMenuItem;
import com.fr.design.gui.imenu.UIScrollPopUpMenu;
import com.fr.design.i18n.Toolkit;
@@ -240,7 +241,7 @@ public class MutilTempalteTabPane extends JComponent {
private String tempalteShowName(JTemplate, ?> template) {
- String name = template.getEditingFILE().getName();
+ String name = template.getTemplateName();
if (!template.isSaved() && !name.endsWith(" *")) {
name += " *";
}
@@ -661,8 +662,8 @@ public class MutilTempalteTabPane extends JComponent {
if (!specifiedTemplate.isALLSaved() && !DesignerMode.isVcsMode()) {
specifiedTemplate.stopEditing();
- int returnVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?",
- ProductConstants.PRODUCT_NAME, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
+ int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?",
+ Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if (returnVal == JOptionPane.YES_OPTION) {
specifiedTemplate.saveTemplate();
FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName()));
@@ -916,7 +917,7 @@ public class MutilTempalteTabPane extends JComponent {
//如果在权限编辑情况下,不允许切换到表单类型的工作簿
if (DesignerMode.isAuthorityEditing() && !openedTemplate.get(selectedIndex).isJWorkBook()) {
DesignerContext.getDesignerFrame().addAndActivateJTemplate(openedTemplate.get(tempSelectedIndex));
- JOptionPane.showMessageDialog(MutilTempalteTabPane.this, Toolkit.i18nText("Fine-Design_Basic_Form_Authority_Edited_Cannot_Be_Supported")
+ FineJOptionPane.showMessageDialog(MutilTempalteTabPane.this, Toolkit.i18nText("Fine-Design_Basic_Form_Authority_Edited_Cannot_Be_Supported")
+ "!", Toolkit.i18nText("Fine-Design_Basic_Alert"), JOptionPane.WARNING_MESSAGE);
MutilTempalteTabPane.this.repaint();
return;
diff --git a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java
index 295b63385b..e331d296ef 100644
--- a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java
+++ b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java
@@ -1 +1,244 @@
-package com.fr.design.file;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.BasicPane;
import com.fr.design.dialog.DialogActionAdapter;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.ilist.UIList;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.JTemplate;
import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.ProductConstants;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
/**
* Author : daisy
* Date: 13-8-9
* Time: 下午3:41
*/
public class SaveSomeTemplatePane extends BasicPane {
private UICheckBox[] templateCheckBoxes = null;
private BasicDialog dialog;
private JPanel templatesChoosePane;
private UIScrollPane scrollPane;
private java.util.List> unSavedTemplate = new ArrayList>();
private boolean isAllSaved = false;
//该变量用来判断是在关闭其他模板或是关闭设计器的时候,是否需要判断当前模板有没有保存
private boolean isJudgeCurrentEditingTemplate = true;
public SaveSomeTemplatePane(boolean isNeedTojudgeCurrent) {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
if (this.dialog == null) {
this.dialog = this.showSmallWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() {
@Override
public void doOk() {
for (int i = 0; i < templateCheckBoxes.length; i++) {
if (templateCheckBoxes[i].isSelected()) {
saveSelectedTemplate(unSavedTemplate.get(i));
}
}
isAllSaved = true;
}
public void doCancel() {
isAllSaved = false;
}
});
}
UILabel tip = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Select_The_Source_To_Save"));
this.add(tip, BorderLayout.NORTH);
templatesChoosePane = FRGUIPaneFactory.createBorderLayout_S_Pane();
UIScrollPane scrollPane = new UIScrollPane(templatesChoosePane);
this.add(scrollPane, BorderLayout.CENTER);
this.isJudgeCurrentEditingTemplate = isNeedTojudgeCurrent;
}
private void initTemplatesChoosePane() {
templatesChoosePane.setBorder(BorderFactory.createTitledBorder(""));
for (int i = 0; i < unSavedTemplate.size(); i++) {
templateCheckBoxes[i] = new UICheckBox(unSavedTemplate.get(i).getEditingFILE().getName());
templateCheckBoxes[i].setSelected(true);
}
final UIList templatesList = new UIList(templateCheckBoxes);
templatesList.setModel(new UnSeletedTemplateListDataMode());
templatesList.setCellRenderer(new UnSelectedListCellRender());
templatesList.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
int index = templatesList.getSelectedIndex();
if (index < 0) {
return;
}
UICheckBox checkBox = (UICheckBox) templatesList.getModel().getElementAt(index);
checkBox.setSelected(!checkBox.isSelected());
templatesList.repaint();
}
});
final UICheckBox filenameCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Choose_All"));
filenameCheckBox.setSelected(true);
filenameCheckBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
boolean isSelected = filenameCheckBox.isSelected();
for (int i = 0; i < templatesList.getModel().getSize(); i++) {
UICheckBox checkBox = (UICheckBox) templatesList.getModel().getElementAt(i);
checkBox.setSelected(isSelected);
}
templatesList.repaint();
}
});
templatesChoosePane.add(filenameCheckBox, BorderLayout.NORTH);
templatesChoosePane.add(templatesList, BorderLayout.CENTER);
}
public boolean showSavePane() {
populate();
//如果有未保存的文件 ,则跳出保存对话框,选择要存储的项目
if (!unSavedTemplate.isEmpty()) {
dialog.setVisible(true);
} else {
isAllSaved = true;
}
return isAllSaved;
}
public void populate() {
java.util.List> opendedTemplate = HistoryTemplateListPane.getInstance().getHistoryList();
JTemplate, ?> currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
for (int i = 0; i < opendedTemplate.size(); i++) {
if (isneedToAdd(opendedTemplate.get(i), currentTemplate)) {
unSavedTemplate.add(opendedTemplate.get(i));
}
}
templateCheckBoxes = new UICheckBox[unSavedTemplate.size()];
initTemplatesChoosePane();
}
private boolean isneedToAdd(JTemplate, ?> template, JTemplate, ?> currentTemplate) {
//所有模板都判断是不是保存
if (isJudgeCurrentEditingTemplate) {
return !template.isALLSaved();
}
//当前编辑的模板不判断是否已经保存
if (ComparatorUtils.equals(template, currentTemplate)) {
return false;
} else {
return !template.isALLSaved();
}
}
private void saveSelectedTemplate(JTemplate, ?> specifiedTemplate) {
if (!specifiedTemplate.isSaved()) {
specifiedTemplate.stopEditing();
specifiedTemplate.saveTemplate();
}
FineLoggerFactory.getLogger().info( com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName()));
}
public int saveLastOneTemplate() {
JTemplate, ?> specifiedTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
if (!specifiedTemplate.isALLSaved()) {
specifiedTemplate.stopEditing();
int returnVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?",
ProductConstants.PRODUCT_NAME, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if (returnVal == JOptionPane.YES_OPTION && specifiedTemplate.saveTemplate()) {
specifiedTemplate.saveTemplate();
FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName()));
}
return returnVal;
}
return JOptionPane.YES_OPTION;
}
protected String title4PopupWindow() {
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Save");
}
private class UnSelectedListCellRender extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, final boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
templateCheckBoxes[index] = (UICheckBox) value;
templateCheckBoxes[index].setBackground(list.getBackground());
return templateCheckBoxes[index];
}
}
private class UnSeletedTemplateListDataMode extends AbstractListModel {
@Override
public int getSize() {
return templateCheckBoxes.length;
}
@Override
public UICheckBox getElementAt(int index) {
if (index > getSize() - 1 || index < 0) {
return null;
}
return templateCheckBoxes[index];
}
}
}
\ No newline at end of file
+package com.fr.design.file;
+
+import com.fr.design.dialog.BasicDialog;
+import com.fr.design.dialog.BasicPane;
+import com.fr.design.dialog.DialogActionAdapter;
+import com.fr.design.dialog.FineJOptionPane;
+import com.fr.design.event.StateChangeListener;
+import com.fr.design.gui.icheckbox.UICheckBox;
+import com.fr.design.gui.icontainer.UIScrollPane;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.gui.ilist.UIList;
+import com.fr.design.gui.itree.checkboxtree.NullTristateCheckBox;
+import com.fr.design.gui.itree.checkboxtree.TristateCheckBox;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.mainframe.DesignerContext;
+import com.fr.design.mainframe.JTemplate;
+import com.fr.general.ComparatorUtils;
+
+import com.fr.log.FineLoggerFactory;
+import com.fr.stable.ProductConstants;
+
+import javax.swing.*;
+import javax.swing.border.EmptyBorder;
+import java.awt.*;
+import java.awt.event.*;
+import java.util.ArrayList;
+
+/**
+ * Author : daisy
+ * Date: 13-8-9
+ * Time: 下午3:41
+ */
+public class SaveSomeTemplatePane extends BasicPane {
+
+ private UICheckBox[] templateCheckBoxes = null;
+ private BasicDialog dialog;
+ private JPanel templatesChoosePane;
+ private UIScrollPane scrollPane;
+ private java.util.List> unSavedTemplate = new ArrayList>();
+ private boolean isAllSaved = false;
+
+ //该变量用来判断是在关闭其他模板或是关闭设计器的时候,是否需要判断当前模板有没有保存
+ private boolean isJudgeCurrentEditingTemplate = true;
+
+ public SaveSomeTemplatePane(boolean isNeedTojudgeCurrent) {
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ if (this.dialog == null) {
+ this.dialog = this.showSmallWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() {
+ @Override
+ public void doOk() {
+ for (int i = 0; i < templateCheckBoxes.length; i++) {
+ if (templateCheckBoxes[i].isSelected()) {
+ saveSelectedTemplate(unSavedTemplate.get(i));
+ }
+ }
+ isAllSaved = true;
+ }
+
+ public void doCancel() {
+ isAllSaved = false;
+ }
+
+ });
+ }
+ UILabel tip = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Select_The_Source_To_Save"));
+ this.add(tip, BorderLayout.NORTH);
+ templatesChoosePane = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ UIScrollPane scrollPane = new UIScrollPane(templatesChoosePane);
+ this.add(scrollPane, BorderLayout.CENTER);
+ this.isJudgeCurrentEditingTemplate = isNeedTojudgeCurrent;
+ }
+
+ private void initTemplatesChoosePane() {
+ templatesChoosePane.setBorder(BorderFactory.createTitledBorder(""));
+ for (int i = 0; i < unSavedTemplate.size(); i++) {
+ templateCheckBoxes[i] = new UICheckBox(unSavedTemplate.get(i).getEditingFILE().getName());
+ templateCheckBoxes[i].setSelected(true);
+ }
+
+ final UIList templatesList = new UIList(templateCheckBoxes);
+ templatesList.setModel(new UnSeletedTemplateListDataMode());
+ templatesList.setCellRenderer(new UnSelectedListCellRender());
+
+ final TristateCheckBox chooseAllCheckBox = new NullTristateCheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Choose_All"));
+ chooseAllCheckBox.setState(TristateCheckBox.SELECTED);
+ //取消chooseAllCheckBox的焦点事件监听,因为默认的焦点事件监听中失焦时会改变chooseAllCheckBox的状态
+ chooseAllCheckBox.setFocusable(false);
+ chooseAllCheckBox.addStateChangeListener(new StateChangeListener() {
+ @Override
+ public void stateChange() {
+ if (chooseAllCheckBox.getState() == TristateCheckBox.DO_NOT_CARE) {
+ return;
+ }
+ boolean isSelected = chooseAllCheckBox.isSelected();
+ for (int i = 0; i < templatesList.getModel().getSize(); i++) {
+ UICheckBox checkBox = (UICheckBox) templatesList.getModel().getElementAt(i);
+ checkBox.setSelected(isSelected);
+ }
+ templatesList.repaint();
+ }
+ });
+
+ templatesList.addMouseListener(new MouseAdapter() {
+ public void mousePressed(MouseEvent e) {
+ super.mousePressed(e);
+ int index = templatesList.getSelectedIndex();
+ if (index < 0) {
+ return;
+ }
+ UICheckBox checkBox = (UICheckBox) templatesList.getModel().getElementAt(index);
+ checkBox.setSelected(!checkBox.isSelected());
+
+ //根据templateCheckBoxes中的选择情况来更新全选框的状态
+ int selectedCount = calculateSelectedNum();
+ if (selectedCount == 0) {
+ chooseAllCheckBox.setState(TristateCheckBox.NOT_SELECTED);
+ } else if (selectedCount == templateCheckBoxes.length) {
+ chooseAllCheckBox.setState(TristateCheckBox.SELECTED);
+ } else {
+ chooseAllCheckBox.setState(TristateCheckBox.DO_NOT_CARE);
+ }
+ templatesList.repaint();
+ }
+ });
+
+ templatesChoosePane.add(chooseAllCheckBox, BorderLayout.NORTH);
+ templatesChoosePane.add(templatesList, BorderLayout.CENTER);
+
+ }
+
+ /**
+ * 获取templateCheckBoxes中状态为选中状态的CheckBox数量
+ * */
+ private int calculateSelectedNum() {
+ int count = 0;
+ for (UICheckBox checkBox : templateCheckBoxes) {
+ if (checkBox.isSelected()) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+
+ public boolean showSavePane() {
+ populate();
+ //如果有未保存的文件 ,则跳出保存对话框,选择要存储的项目
+ if (!unSavedTemplate.isEmpty()) {
+ dialog.setVisible(true);
+ } else {
+ isAllSaved = true;
+ }
+ return isAllSaved;
+ }
+
+ public void populate() {
+ java.util.List> opendedTemplate = HistoryTemplateListPane.getInstance().getHistoryList();
+ JTemplate, ?> currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
+ for (int i = 0; i < opendedTemplate.size(); i++) {
+ if (isneedToAdd(opendedTemplate.get(i), currentTemplate)) {
+ unSavedTemplate.add(opendedTemplate.get(i));
+ }
+ }
+ templateCheckBoxes = new UICheckBox[unSavedTemplate.size()];
+ initTemplatesChoosePane();
+ }
+
+ private boolean isneedToAdd(JTemplate, ?> template, JTemplate, ?> currentTemplate) {
+ //所有模板都判断是不是保存
+ if (isJudgeCurrentEditingTemplate) {
+ return !template.isALLSaved();
+ }
+
+ //当前编辑的模板不判断是否已经保存
+ if (ComparatorUtils.equals(template, currentTemplate)) {
+ return false;
+ } else {
+ return !template.isALLSaved();
+ }
+ }
+
+
+ private void saveSelectedTemplate(JTemplate, ?> specifiedTemplate) {
+ if (!specifiedTemplate.isSaved()) {
+ specifiedTemplate.stopEditing();
+ specifiedTemplate.saveTemplate();
+ }
+ FineLoggerFactory.getLogger().info( com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName()));
+ }
+
+
+ public int saveLastOneTemplate() {
+ JTemplate, ?> specifiedTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
+ if (!specifiedTemplate.isALLSaved()) {
+ specifiedTemplate.stopEditing();
+ int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?",
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
+ if (returnVal == JOptionPane.YES_OPTION && specifiedTemplate.saveTemplate()) {
+ specifiedTemplate.saveTemplate();
+ FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName()));
+ }
+ return returnVal;
+ }
+ return JOptionPane.YES_OPTION;
+ }
+
+
+ protected String title4PopupWindow() {
+ return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Save");
+ }
+
+
+ private class UnSelectedListCellRender extends DefaultListCellRenderer {
+
+ @Override
+ public Component getListCellRendererComponent(JList list, Object value, int index, final boolean isSelected, boolean cellHasFocus) {
+ super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+ templateCheckBoxes[index] = (UICheckBox) value;
+ templateCheckBoxes[index].setBackground(list.getBackground());
+ return templateCheckBoxes[index];
+ }
+
+ }
+
+
+ private class UnSeletedTemplateListDataMode extends AbstractListModel {
+
+ @Override
+ public int getSize() {
+ return templateCheckBoxes.length;
+ }
+
+ @Override
+ public UICheckBox getElementAt(int index) {
+ if (index > getSize() - 1 || index < 0) {
+ return null;
+ }
+ return templateCheckBoxes[index];
+ }
+
+ }
+
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java
index ed63b06cef..5041cc34a3 100644
--- a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java
+++ b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java
@@ -4,6 +4,7 @@
package com.fr.design.file;
import com.fr.base.FRContext;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.gui.itree.filetree.TemplateFileTree;
import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode;
@@ -44,6 +45,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Enumeration;
+import java.util.Objects;
import static javax.swing.JOptionPane.WARNING_MESSAGE;
import static javax.swing.JOptionPane.YES_NO_OPTION;
@@ -224,6 +226,8 @@ public class TemplateTreePane extends JPanel implements FileOperations {
*/
@Override
public void refresh() {
+ // 刷新远程文件夹权限
+ NodeAuthProcessor.getInstance().refresh();
reportletsTree.refresh();
FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_File_Tree_Refresh_Successfully") + "!");
}
@@ -253,16 +257,16 @@ public class TemplateTreePane extends JPanel implements FileOperations {
? Toolkit.i18nText("Fine-Design_Basic_Confirm_Delete_Folder")
: Toolkit.i18nText("Fine-Design_Basic_Confirm_Delete_File");
- if (JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(),
+ if (FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(),
tipContent,
- UIManager.getString("OptionPane.messageDialogTitle"),
+ Toolkit.i18nText("Fine-Design_Basic_Confirm"),
YES_NO_OPTION)
== JOptionPane.YES_OPTION) {
// 删除所有选中的即可
if (!deleteNodes(Arrays.asList(treeNodes))) {
- JOptionPane.showConfirmDialog(null,
+ FineJOptionPane.showConfirmDialog(null,
Toolkit.i18nText("Fine-Design_Basic_Delete_Failure"),
- UIManager.getString("OptionPane.messageDialogTitle"),
+ Toolkit.i18nText("Fine-Design_Basic_Error"),
JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE);
}
@@ -276,30 +280,41 @@ public class TemplateTreePane extends JPanel implements FileOperations {
if (deletableNodes.isEmpty()) {
// 提醒被锁定模板无法删除
- JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(),
+ FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(),
Toolkit.i18nText("Fine-Design_Basic_Unable_Delete_Locked_File"),
- Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"),
+ Toolkit.i18nText("Fine-Design_Basic_Alert"),
WARNING_MESSAGE);
return;
}
- if (JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(),
+ if (FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(),
tipContent,
- UIManager.getString("OptionPane.messageDialogTitle"),
+ Toolkit.i18nText("Fine-Design_Basic_Confirm"),
YES_NO_OPTION)
== JOptionPane.YES_OPTION) {
// 删除其他
if (!deleteNodes(deletableNodes)) {
- JOptionPane.showConfirmDialog(null,
+ FineJOptionPane.showConfirmDialog(null,
Toolkit.i18nText("Fine-Design_Basic_Delete_Failure"),
- UIManager.getString("OptionPane.messageDialogTitle"),
+ Toolkit.i18nText("Fine-Design_Basic_Error"),
JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE);
}
}
}
- reportletsTree.refresh();
+ refreshAfterDelete();
+ }
+
+ private void refreshAfterDelete() {
+ TreePath[] paths = reportletsTree.getSelectionPaths();
+ if (paths == null) {
+ reportletsTree.refresh();
+ } else {
+ for (TreePath path : Objects.requireNonNull(reportletsTree.getSelectionPaths())) {
+ reportletsTree.refreshParent(path);
+ }
+ }
}
private boolean deleteNodes(Collection nodes) {
@@ -403,9 +418,9 @@ public class TemplateTreePane extends JPanel implements FileOperations {
}
if (!lockedNodes.isEmpty()) {
- JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(),
+ FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(),
Toolkit.i18nText("Fine-Design_Basic_Warn_Rename_Lock_File"),
- UIManager.getString("OptionPane.messageDialogTitle"),
+ Toolkit.i18nText("Fine-Design_Basic_Alert"),
JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE);
return true;
}
diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaConstants.java b/designer-base/src/main/java/com/fr/design/formula/FormulaConstants.java
new file mode 100644
index 0000000000..4dfcb4bb47
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/formula/FormulaConstants.java
@@ -0,0 +1,57 @@
+package com.fr.design.formula;
+
+import com.fr.stable.StringUtils;
+
+/**
+ * @author Joe
+ * @version 10.0
+ * Created by Joe on 10/30/2019
+ */
+public enum FormulaConstants {
+
+ PAGE_NUMBER("$$page_number", "Page_Number"),
+ TOTAL_PAGE_NUMBER("$$totalPage_number", "Total_Page_Number"),
+ FINE_USERNAME("$fine_username", "Fine_Username"),
+ FINE_ROLE("$fine_role", "Fine_Role"),
+ FINE_POSITION("$fine_position", "Fine_Position"),
+ NULL("NULL", "Null"),
+ NOFILTER("NOFILTER", "No_Filter"),
+ REPORT_NAME("reportName", "Report_Name"),
+ FORMLET_NAME("formletName", "Formlet_Name"),
+ SERVLET_URL("servletURL", "Servlet_URL"),
+ SERVER_SCHEMA("serverSchema", "Server_Schema"),
+ SERVER_NAME("serverName", "Server_Name"),
+ SERVER_PORT("serverPort", "Server_Port"),
+ SERVER_URL("serverURL", "Server_URL"),
+ CONTEXT_PATH("contextPath", "Context_Path"),
+ SESSION_ID("sessionID", "SessionID");
+
+ private String key;
+ private String value;
+ private static final String KEY_PREFIX = "Fine-Design_CurReport_Variable_";
+
+ private FormulaConstants(String key, String value) {
+ this.key = key;
+ this.value = KEY_PREFIX + value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static String getValueByKey(String key) {
+ for (FormulaConstants formulaConstant : values()) {
+ if (formulaConstant.getKey().equals(key)) {
+ return formulaConstant.getValue();
+ }
+ }
+ return StringUtils.EMPTY;
+ }
+
+
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java
index c4433ab804..8b68dcdbe4 100644
--- a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java
+++ b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java
@@ -2,12 +2,12 @@ package com.fr.design.formula;
import com.fr.base.BaseFormula;
import com.fr.base.BaseUtils;
-import com.fr.base.FRContext;
import com.fr.design.actions.UpdateAction;
import com.fr.design.border.UIRoundedBorder;
import com.fr.design.constants.UIConstants;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.BasicPane;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.gui.ilable.UILabel;
@@ -19,11 +19,11 @@ import com.fr.design.gui.syntax.ui.rsyntaxtextarea.SyntaxConstants;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.utils.gui.GUICoreUtils;
+import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.parser.FRLexer;
import com.fr.parser.FRParser;
import com.fr.stable.EncodeConstants;
-import com.fr.stable.ProductConstants;
import com.fr.stable.StringUtils;
import com.fr.stable.script.Expression;
@@ -52,7 +52,10 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
-import java.util.Locale;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
/**
* 公式编辑面板
@@ -243,44 +246,69 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
}
public class DoubleClick extends MouseAdapter {
+ String singlePressContent;
+
+ String doublePressContent;
@Override
- public void mouseClicked(MouseEvent e) {
+ public void mousePressed(MouseEvent e) {
int index = tipsList.getSelectedIndex();
if (index != -1) {
- String currentLineContent = (String) listModel.getElementAt(index);
- if (e.getClickCount() == 2) {
- if (ifHasBeenWriten == 0) {
- formulaTextArea.setForeground(Color.black);
- formulaTextArea.setText("");
+ if (e.getClickCount() == 1) {
+ singlePressContent = (String) listModel.getElementAt(index);
+ } else if (e.getClickCount() == 2) {
+ doublePressContent = (String) listModel.getElementAt(index);
+ }
+ }
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent e) {
+ int index = tipsList.getSelectedIndex();
+ if (index != -1) {
+ if (e.getClickCount() == 1) {
+ if (ComparatorUtils.equals((String) listModel.getElementAt(index), singlePressContent)) {
+ singleClickActuator(singlePressContent);
}
- formulaTextArea.setForeground(Color.black);
- currentPosition = formulaTextArea.getCaretPosition();
- String output = currentLineContent + "()";
- String textAll = formulaTextArea.getText();
- String textReplaced;
- int position = 0;
- if (insertPosition <= currentPosition) {
- textReplaced = textAll.substring(0, insertPosition) + output + textAll.substring(currentPosition);
- position = insertPosition + output.length() - 1;
- } else {
- textReplaced = textAll.substring(0, currentPosition) + output + textAll.substring(insertPosition);
- position = currentPosition + output.length() - 1;
+ } else if (e.getClickCount() == 2) {
+ if (ComparatorUtils.equals((String) listModel.getElementAt(index), doublePressContent)) {
+ doubleClickActuator(doublePressContent);
}
- formulaTextArea.setText(textReplaced);
- formulaTextArea.requestFocusInWindow();
- formulaTextArea.setCaretPosition(position);
- insertPosition = position;
- ifHasBeenWriten = 1;
- listModel.removeAllElements();
- } else if (e.getClickCount() == 1) {
- refreshDescriptionTextArea(currentLineContent);
-
- formulaTextArea.requestFocusInWindow();
- fixFunctionNameList();
}
}
}
+
+ private void singleClickActuator(String currentLineContent) {
+ refreshDescriptionTextArea(currentLineContent);
+ formulaTextArea.requestFocusInWindow();
+ fixFunctionNameList();
+ }
+
+ private void doubleClickActuator(String currentLineContent) {
+ if (ifHasBeenWriten == 0) {
+ formulaTextArea.setForeground(Color.black);
+ formulaTextArea.setText("");
+ }
+ formulaTextArea.setForeground(Color.black);
+ currentPosition = formulaTextArea.getCaretPosition();
+ String output = currentLineContent + "()";
+ String textAll = formulaTextArea.getText();
+ String textReplaced;
+ int position = 0;
+ if (insertPosition <= currentPosition) {
+ textReplaced = textAll.substring(0, insertPosition) + output + textAll.substring(currentPosition);
+ position = insertPosition + output.length() - 1;
+ } else {
+ textReplaced = textAll.substring(0, currentPosition) + output + textAll.substring(insertPosition);
+ position = currentPosition + output.length() - 1;
+ }
+ formulaTextArea.setText(textReplaced);
+ formulaTextArea.requestFocusInWindow();
+ formulaTextArea.setCaretPosition(position);
+ insertPosition = position;
+ ifHasBeenWriten = 1;
+ listModel.removeAllElements();
+ }
}
@Override
@@ -411,14 +439,19 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
if (keyWord.length() != 0) {
NameAndDescription[] descriptions = FunctionConstants.ALL.getDescriptions();
int lengthOfDes = descriptions.length;
+ List list = new ArrayList<>();
for (int i = 0; i < lengthOfDes; i++) {
NameAndDescription and = descriptions[i];
String functionName = and.searchResult(keyWord, findDescription);
if (StringUtils.isNotBlank(functionName)) {
- listModel.addElement(functionName);
+ list.add(functionName);
}
}
+ Collections.sort(list, new SimilarComparator(keyWord));
+ for (String name : list) {
+ listModel.addElement(name);
+ }
if (!listModel.isEmpty()) {
tipsList.setSelectedIndex(0);
@@ -572,14 +605,15 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
// alex:继续往下面走,expression为null时告知不合法公式
}
- JOptionPane.showMessageDialog(
+ FineJOptionPane.showMessageDialog(
FormulaPane.this,
/*
* alex:仅仅只需要根据expression是否为null作合法性判断
* 不需要eval
* TODO 但有个问题,有些函数的参数个数是有规定的,何以判别之
*/
- (expression != null ? com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Valid_Formula") : com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Invalid_Formula")) + ".", ProductConstants.PRODUCT_NAME,
+ (expression != null ? com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Valid_Formula") : com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Invalid_Formula")) + ".",
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"),
JOptionPane.INFORMATION_MESSAGE);
}
}
@@ -769,31 +803,31 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
private void initVariablesTreeSelectionListener() {
variablesTree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
- Object selectedValue = ((DefaultMutableTreeNode) variablesTree.getLastSelectedPathComponent()).getUserObject();
+ DefaultMutableTreeNode selectedTreeNode = (DefaultMutableTreeNode) variablesTree.getLastSelectedPathComponent();
+ Object selectedValue = selectedTreeNode.getUserObject();
+ Object selectedParentValue = ((DefaultMutableTreeNode)selectedTreeNode.getParent()).getUserObject();
+
if (selectedValue == null) {
return;
}
- StringBuilder desBuf = new StringBuilder();
- try {
- String path;
- Locale locale = FRContext.getLocale();
- if (locale.equals(Locale.CHINA)) {
- path = "/com/fr/design/insert/formula/variable/cn/";
+
+ if (selectedValue instanceof TextUserObject) {
+ //有公式说明的条件:1.属于TextUserObject 2.parent是系统参数
+ if (ComparatorUtils.equals(((TextFolderUserObject) selectedParentValue).getText(),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaPane_Variables"))) {
+ descriptionTextArea.setText(com.fr.design.i18n.Toolkit.i18nText(FormulaConstants.getValueByKey(((TextUserObject) selectedValue).getText())));
} else {
- path = "/com/fr/design/insert/formula/variable/en/";
- }
- if (selectedValue instanceof TextUserObject) {
- desBuf = getText((TextUserObject) selectedValue, path);
+ descriptionTextArea.setText(StringUtils.EMPTY);
}
- } catch (IOException exp) {
- FineLoggerFactory.getLogger().error(exp.getMessage(), exp);
+ } else if (selectedValue instanceof TextFolderUserObject) {
+ descriptionTextArea.setText(StringUtils.EMPTY);
}
- descriptionTextArea.setText(desBuf.toString());
descriptionTextArea.moveCaretPosition(0);
}
});
}
+
private void initVariablesTree() {
// vairable.
variablesTree = new JTree();
@@ -966,6 +1000,34 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
}
}
+ public static class SimilarComparator implements Comparator {
+
+ private String searchKey;
+
+ public SimilarComparator(String searchKey) {
+ this.searchKey = searchKey.toLowerCase();
+ }
+
+ /**
+ * 把以关键词开头的和不以关键词开头的分别按照字母表顺序排序
+ * @param o1 待比较对象1
+ * @param o2 待比较对象2
+ * @return 比较结果,1表示 o1 > o2, -1表示 o1 < o2, 0表示 o1 = o2
+ */
+ @Override
+ public int compare(String o1, String o2) {
+ int result;
+ boolean o1StartWith = o1.toLowerCase().startsWith(searchKey);
+ boolean o2StartWith = o2.toLowerCase().startsWith(searchKey);
+ if (o1StartWith) {
+ result = o2StartWith ? o1.compareTo(o2) : -1;
+ } else {
+ result = o2StartWith ? 1 : o1.compareTo(o2);
+ }
+ return result;
+ }
+ }
+
public static class TextFolderUserObject {
private String text;
diff --git a/designer-base/src/main/java/com/fr/design/formula/FunctionManagerPane.java b/designer-base/src/main/java/com/fr/design/formula/FunctionManagerPane.java
index 3d56dd925e..c40a917e39 100644
--- a/designer-base/src/main/java/com/fr/design/formula/FunctionManagerPane.java
+++ b/designer-base/src/main/java/com/fr/design/formula/FunctionManagerPane.java
@@ -142,8 +142,10 @@ public class FunctionManagerPane extends BasicPane {
editorButton.setPreferredSize(new Dimension(editorButton.getPreferredSize().width, classNameTextField.getPreferredSize().height));
reportletNamePane.add(editorButton);
editorButton.addActionListener(createEditorButtonActionListener());
- northPane.add(GUICoreUtils.createFlowPane(new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DS_Class_Name") + ":"),
- reportletNamePane}, FlowLayout.LEFT));
+ JPanel classNamePane = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ classNamePane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DS_Class_Name") + ":"), BorderLayout.NORTH);
+ classNamePane.add(reportletNamePane, BorderLayout.CENTER);
+ northPane.add(classNamePane);
DescriptionTextArea descriptionArea = new DescriptionTextArea();
descriptionArea.setWrapStyleWord(true);
descriptionArea.setLineWrap(true);
diff --git a/designer-base/src/main/java/com/fr/design/formula/JavaEditorPane.java b/designer-base/src/main/java/com/fr/design/formula/JavaEditorPane.java
index a3bdbae216..a34762a1fd 100644
--- a/designer-base/src/main/java/com/fr/design/formula/JavaEditorPane.java
+++ b/designer-base/src/main/java/com/fr/design/formula/JavaEditorPane.java
@@ -2,6 +2,7 @@ package com.fr.design.formula;
import com.fr.base.FRContext;
import com.fr.design.dialog.BasicPane;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.gui.ilable.UILabel;
@@ -161,11 +162,11 @@ public class JavaEditorPane extends BasicPane {
}
try {
WorkContext.getWorkResource().write(StableUtils.pathJoin(ProjectConstants.CLASSES_NAME, getJavaPath()), text.getBytes(EncodeConstants.ENCODING_UTF_8));
- JOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Common_Save_Successfully") + "!");
+ FineJOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Common_Save_Successfully") + "!");
fireSaveActionListener();
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
- JOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Common_Save_Failed") + "!");
+ FineJOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Common_Save_Failed") + "!");
}
}
@@ -191,7 +192,7 @@ public class JavaEditorPane extends BasicPane {
if (StringUtils.isEmpty(message)) {
message = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Compile_Success") + "!";
}
- JOptionPane.showMessageDialog(null, message);
+ FineJOptionPane.showMessageDialog(null, message);
} catch (InterruptedException e1) {
FineLoggerFactory.getLogger().error(e1.getMessage(), e1);
Thread.currentThread().interrupt();
@@ -219,8 +220,8 @@ public class JavaEditorPane extends BasicPane {
" }\n" +
"\n" +
" /**\n" +
- " * 获取数据集的列数\n" +
- " * @return 数据集的列\n" +
+ " * Get the number of columns in a dataset\n" +
+ " * @return Dataset columns\n" +
" * @throws TableDataException\n" +
" */\n" +
" public int getColumnCount() throws TableDataException {\n" +
@@ -228,9 +229,9 @@ public class JavaEditorPane extends BasicPane {
" }\n" +
"\n" +
" /**\n" +
- " * 获取数据集指定列的列名\n" +
- " * @param columnIndex 指定列的索引\n" +
- " * @return 指定列的列名\n" +
+ " * Get the column name of the specified column of the dataset\n" +
+ " * @param columnIndex The index of the specified column\n" +
+ " * @return The column name of the specified column\n" +
" * @throws TableDataException\n" +
" */\n" +
" public String getColumnName(int columnIndex) throws TableDataException {\n" +
@@ -238,8 +239,8 @@ public class JavaEditorPane extends BasicPane {
" }\n" +
"\n" +
" /**\n" +
- " * 获取数据集的行数\n" +
- " * @return 数据集数据行数\n" +
+ " * Get the number of rows in the dataset\n" +
+ " * @return Dataset rows\n" +
" * @throws TableDataException\n" +
" */\n" +
" public int getRowCount() throws TableDataException {\n" +
@@ -247,10 +248,10 @@ public class JavaEditorPane extends BasicPane {
" }\n" +
"\n" +
" /**\n" +
- " * 获取数据集指定位置上的值\n" +
- " * @param rowIndex 指定的行索引\n" +
- " * @param columnIndex 指定的列索引\n" +
- " * @return 指定位置的值\n" +
+ " * Get the value at the specified position in the dataset\n" +
+ " * @param rowIndex The specified row index\n" +
+ " * @param columnIndex The specified column index\n" +
+ " * @return The value of the specified location\n" +
" */\n" +
" public Object getValueAt(int rowIndex, int columnIndex) {\n" +
" return null;\n" +
@@ -262,12 +263,12 @@ public class JavaEditorPane extends BasicPane {
"import com.fr.script.AbstractFunction;\n" +
"\n" +
"/**\n" +
- " * 自定义函数\n" +
+ " * Custom function\n" +
" */\n" +
"public class CustomFun extends AbstractFunction {\n" +
" /**\n" +
- " * @param args 函数的参数,是经过了算子处理了其中特殊参数的\n" +
- " * @return 经过函数处理的值,用于参与最终计算\n" +
+ " * @param args The parameters of the function are processed by calculator with special parameters\n" +
+ " * @return The value processed by the function is used to participate in the final calculation\n" +
" */\n" +
" public Object run(Object[] args) {\n" +
" return null;\n" +
diff --git a/designer-base/src/main/java/com/fr/design/fun/CellAttributeProvider.java b/designer-base/src/main/java/com/fr/design/fun/CellAttributeProvider.java
index 227333cd08..82f7a81445 100644
--- a/designer-base/src/main/java/com/fr/design/fun/CellAttributeProvider.java
+++ b/designer-base/src/main/java/com/fr/design/fun/CellAttributeProvider.java
@@ -4,8 +4,10 @@ import com.fr.design.gui.frpane.AbstractAttrNoScrollPane;
import com.fr.stable.fun.mark.Immutable;
/**
+ * 单元格属性面板扩展接口,接口基本逻辑不通且不符合接口设计规范,单元格属性扩展可以使用CellPropertyPaneProvider
* Created by zhouping on 2015/11/11.
*/
+@Deprecated
public interface CellAttributeProvider extends Immutable{
String MARK_STRING = "CellAttributeProvider";
diff --git a/designer-base/src/main/java/com/fr/design/fun/CellExpandAttrPanelProvider.java b/designer-base/src/main/java/com/fr/design/fun/CellExpandAttrPanelProvider.java
new file mode 100644
index 0000000000..fd3953564f
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/CellExpandAttrPanelProvider.java
@@ -0,0 +1,28 @@
+package com.fr.design.fun;
+
+import com.fr.design.beans.BasicBeanPane;
+import com.fr.report.cell.TemplateCellElement;
+import com.fr.stable.fun.mark.Mutable;
+
+/**
+ * @author yaohwu
+ * created by yaohwu at 2020/4/26 15:50
+ */
+public interface CellExpandAttrPanelProvider extends Mutable {
+
+ String MARK_STRING = "CellExpandAttrPanelProvider";
+
+ int CURRENT_LEVEL = 1;
+
+ /**
+ * @return 创建单元格属性-扩展设置中的额外面板
+ */
+ BasicBeanPane createPanel();
+
+ /**
+ * 是否应该展示
+ *
+ * @return return {@code true} if extra panel is displayable
+ */
+ boolean isDisplayable();
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/CellPropertyPaneProvider.java b/designer-base/src/main/java/com/fr/design/fun/CellPropertyPaneProvider.java
new file mode 100644
index 0000000000..0100f4b2cf
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/CellPropertyPaneProvider.java
@@ -0,0 +1,18 @@
+package com.fr.design.fun;
+
+import com.fr.design.cell.CellElementPropertyComponent;
+
+/**
+ * 单元格设置(属性)扩展接口
+ * @author zack
+ * @version 10.0
+ * Created by zack on 2020/7/14
+ */
+public interface CellPropertyPaneProvider extends PropertyItemPaneProvider {
+
+ /**
+ * 构造单元格属性面板,面板实现需要使用单例模式实现
+ * @return 面板类
+ */
+ CellElementPropertyComponent getSingletonCelPropertyPane();
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/fun/ChartWidgetOptionProvider.java b/designer-base/src/main/java/com/fr/design/fun/ChartWidgetOptionProvider.java
new file mode 100644
index 0000000000..3deb9947b6
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/ChartWidgetOptionProvider.java
@@ -0,0 +1,14 @@
+package com.fr.design.fun;
+
+/**
+ * @author Bjorn
+ * @version 10.0
+ * Created by Bjorn on 2020-06-12
+ */
+public interface ChartWidgetOptionProvider extends ParameterWidgetOptionProvider {
+
+ String XML_TAG = "ChartWidgetOptionProvider";
+
+ //在图表区域的开头还是结尾插入
+ boolean isBefore();
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/ClipboardHandlerProvider.java b/designer-base/src/main/java/com/fr/design/fun/ClipboardHandlerProvider.java
new file mode 100644
index 0000000000..fbbdacaad8
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/ClipboardHandlerProvider.java
@@ -0,0 +1,45 @@
+package com.fr.design.fun;
+
+import com.fr.stable.fun.mark.Mutable;
+
+/**
+ * created by Harrison on 2020/05/14
+ **/
+public interface ClipboardHandlerProvider extends Mutable {
+
+ String XML_TAG = "ClipboardHandlerProvider";
+
+ int CURRENT_LEVEL = 1;
+
+ /**
+ * 剪切
+ *
+ * @param selection 选中
+ * @return 处理后的内容
+ */
+ T cut(T selection);
+
+ /**
+ * 复制
+ *
+ * @param selection 选中
+ * @return 处理后的内容
+ */
+ T copy(T selection);
+
+ /**
+ * 粘贴
+ *
+ * @param selection 选中
+ * @return 处理后的内容
+ */
+ T paste(T selection);
+
+ /**
+ * 支持的类型
+ *
+ * @param selection 内容
+ * @return 是否
+ */
+ boolean support(Object selection);
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/ComponentLibraryPaneProcessor.java b/designer-base/src/main/java/com/fr/design/fun/ComponentLibraryPaneProcessor.java
new file mode 100644
index 0000000000..7b484b156d
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/ComponentLibraryPaneProcessor.java
@@ -0,0 +1,57 @@
+package com.fr.design.fun;
+
+import com.fr.design.gui.icombobox.UIComboBox;
+import com.fr.design.gui.icontainer.UIScrollPane;
+import com.fr.design.mainframe.DockingView;
+import com.fr.stable.fun.mark.Immutable;
+
+import javax.swing.JPanel;
+
+/**
+ * 组件库面板处理器
+ *
+ * created by Harrison on 2020/03/16
+ **/
+public interface ComponentLibraryPaneProcessor extends Immutable {
+
+ String XML_TAG = "ComponentLibraryPaneProcessor";
+
+ int CURRENT_LEVEL = 1;
+
+ /**
+ * 创建展示面板
+ *
+ * @param isEdit 是否可以编辑
+ * @return 展示面板
+ */
+ UIScrollPane createShowPanel(boolean isEdit);
+
+ /**
+ * 创建菜单的上部面板
+ *
+ * @return 面板
+ */
+ JPanel createMenuNorthPane();
+
+ /**
+ * 创建复选框
+ *
+ * @return 复选框
+ */
+ UIComboBox createMenuComBox();
+
+ void parentView(DockingView dockingView);
+
+ /**
+ * 父面板
+ *
+ * @param panel 面板
+ */
+ void parentPane(JPanel panel);
+
+ /**
+ * 创建完成
+ */
+ void complete();
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/DesignerStartClassProcessor.java b/designer-base/src/main/java/com/fr/design/fun/DesignerStartClassProcessor.java
new file mode 100644
index 0000000000..4874be8029
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/DesignerStartClassProcessor.java
@@ -0,0 +1,23 @@
+package com.fr.design.fun;
+
+import com.fr.stable.fun.mark.Mutable;
+import com.fr.start.BaseDesigner;
+
+/**
+ * 设计器启动类替换接口
+ *
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2020/5/7
+ */
+
+public interface DesignerStartClassProcessor extends Mutable {
+
+ String MARK_STRING = "DesignerStartClassProcessor";
+
+ int CURRENT_LEVEL = 1;
+
+
+ Class extends BaseDesigner> transform();
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/FormAdaptiveConfigUIProcessor.java b/designer-base/src/main/java/com/fr/design/fun/FormAdaptiveConfigUIProcessor.java
new file mode 100644
index 0000000000..abd4b6808a
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/FormAdaptiveConfigUIProcessor.java
@@ -0,0 +1,40 @@
+package com.fr.design.fun;
+
+import com.fr.design.mainframe.JTemplate;
+import com.fr.design.menu.ShortCut;
+import com.fr.stable.fun.mark.Immutable;
+
+import javax.swing.JComponent;
+import java.awt.Dimension;
+import java.awt.image.BufferedImage;
+
+
+/**
+ * Created by kerry on 2020-04-09
+ * 临时接口,后续自适应内置后删除
+ */
+public interface FormAdaptiveConfigUIProcessor extends Immutable {
+
+ String MARK_STRING = "FormAdaptiveConfigUIProcessor";
+ int CURRENT_LEVEL = 1;
+
+ /**
+ * 获取表单自适应配置菜单
+ * @return 表单自适应配置菜单
+ */
+ ShortCut getConfigShortCut(JTemplate jTemplate);
+
+ /**
+ * 是否开启表单滑块缩放功能
+ * @return 是否开启表单滑块缩放
+ */
+ boolean openFormSliderZoom();
+
+ /**
+ * 获取新自适应下字体显示的dpi
+ * @return dpi
+ */
+ int fontResolution();
+
+}
+
diff --git a/designer-base/src/main/java/com/fr/design/fun/FormWidgetOptionProvider.java b/designer-base/src/main/java/com/fr/design/fun/FormWidgetOptionProvider.java
index bfc32f4e9e..9f033d6dc6 100644
--- a/designer-base/src/main/java/com/fr/design/fun/FormWidgetOptionProvider.java
+++ b/designer-base/src/main/java/com/fr/design/fun/FormWidgetOptionProvider.java
@@ -16,4 +16,11 @@ public interface FormWidgetOptionProvider extends ParameterWidgetOptionProvider
*/
boolean isContainer();
+ /**
+ * 如果是布局容器要实现粘贴到容器中的操作
+ * @param t
+ * @param 泛型参数 表示选中的组件 一般为FormSelection
+ */
+ void paste2Container(T t);
+
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/fun/MobileBookMarkStyleProvider.java b/designer-base/src/main/java/com/fr/design/fun/MobileBookMarkStyleProvider.java
new file mode 100644
index 0000000000..d376dd9ac7
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/MobileBookMarkStyleProvider.java
@@ -0,0 +1,34 @@
+package com.fr.design.fun;
+
+import com.fr.design.beans.BasicBeanPane;
+import com.fr.form.ui.mobile.MobileBookMarkStyle;
+import com.fr.stable.fun.mark.Mutable;
+
+/**
+ * 移动端书签样式扩展接口
+ *
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2019/12/23
+ */
+public interface MobileBookMarkStyleProvider extends Mutable {
+
+ String XML_TAG = "MobileBookMarkStyleProvider";
+
+ int CURRENT_LEVEL = 1;
+
+ /**
+ * 书签样式
+ * @return
+ */
+ Class extends MobileBookMarkStyle> classForMobileBookMarkStyle();
+
+ /**
+ * 书签样式面板
+ * @return
+ */
+ Class extends BasicBeanPane> classForMobileBookMarkStyleAppearance();
+
+ String displayName();
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/MobileTemplateStyleProvider.java b/designer-base/src/main/java/com/fr/design/fun/MobileTemplateStyleProvider.java
new file mode 100644
index 0000000000..770e65a9ee
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/MobileTemplateStyleProvider.java
@@ -0,0 +1,25 @@
+package com.fr.design.fun;
+
+import com.fr.design.beans.BasicBeanPane;
+import com.fr.general.cardtag.mobile.MobileTemplateStyle;
+import com.fr.stable.fun.mark.Mutable;
+
+/**
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2020/3/31
+ */
+public interface MobileTemplateStyleProvider extends Mutable {
+
+ String XML_TAG = "MobileTemplateStyleProvider";
+
+ int CURRENT_LEVEL = 1;
+
+ Class extends MobileTemplateStyle> classFroMobileTemplateStyle();
+
+
+ Class extends BasicBeanPane> classFroMobileTemplateStyleAppearance();
+
+ String displayName();
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/PreviewProvider.java b/designer-base/src/main/java/com/fr/design/fun/PreviewProvider.java
index f6e8cb2192..c07a4efe03 100644
--- a/designer-base/src/main/java/com/fr/design/fun/PreviewProvider.java
+++ b/designer-base/src/main/java/com/fr/design/fun/PreviewProvider.java
@@ -1,6 +1,7 @@
package com.fr.design.fun;
import com.fr.design.mainframe.JTemplate;
+import com.fr.stable.Filter;
import com.fr.stable.fun.mark.Mutable;
import java.util.Map;
@@ -11,7 +12,7 @@ import java.util.Map;
* @since 8.0
* 自定义预览方式接口
*/
-public interface PreviewProvider extends Mutable {
+public interface PreviewProvider extends Mutable, Filter {
String MARK_STRING = "PreviewProvider";
diff --git a/designer-base/src/main/java/com/fr/design/fun/PropertyItemPaneProvider.java b/designer-base/src/main/java/com/fr/design/fun/PropertyItemPaneProvider.java
new file mode 100644
index 0000000000..4e5112d8cc
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/PropertyItemPaneProvider.java
@@ -0,0 +1,50 @@
+package com.fr.design.fun;
+
+import com.fr.design.mainframe.PaneHolder;
+import com.fr.design.mainframe.PropertyItemBean;
+import com.fr.stable.fun.mark.Mutable;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * created by Harrison on 2020/03/23
+ **/
+public interface PropertyItemPaneProvider extends Mutable {
+
+ int CURRENT_LEVEL = 1;
+
+ String XML_TAG = "PropertyItemPaneProvider";
+
+ int FIRST = 100;
+
+ int LAST = -100;
+
+ /**
+ * 独一无二的标志
+ *
+ * @return 标志
+ */
+ String key();
+
+ /**
+ * 配置属性
+ *
+ * @return 熟悉
+ */
+ PropertyItemBean getItem();
+
+ /**
+ * 面板持有者
+ *
+ * @param clazz 类型
+ * @return 持有者
+ */
+ @Nullable
+ PaneHolder getPaneHolder(Class> clazz);
+
+ /**
+ * 想要替代的类型
+ *
+ * @return 替代类型
+ */
+ String replaceKey();
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/ReportLengthUNITProvider.java b/designer-base/src/main/java/com/fr/design/fun/ReportLengthUNITProvider.java
new file mode 100644
index 0000000000..af97950cf8
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/ReportLengthUNITProvider.java
@@ -0,0 +1,39 @@
+package com.fr.design.fun;
+
+import com.fr.stable.fun.mark.Mutable;
+import com.fr.stable.unit.UNIT;
+
+/**
+ * Created by kerry on 2020-04-09
+ */
+public interface ReportLengthUNITProvider extends Mutable {
+ String MARK_STRING = "ReportLengthUNITProvider";
+
+ int CURRENT_LEVEL = 1;
+
+ /**
+ * 标尺单位显示字符
+ * @return 标尺单位字符
+ */
+ String unitText();
+
+ /**
+ * 标尺单位类型(之前是将int类型的值直接保存在数据库里面的)
+ * @return 返回标尺单位类型
+ */
+ int unitType();
+
+ /**
+ * UNIT转标尺单位值
+ * @param value UNIT
+ * @return 标尺单位值
+ */
+ float unit2Value4Scale(UNIT value);
+
+ /**
+ * 标尺单位值转UNIT
+ * @param value 标尺单位值
+ * @return UNIT
+ */
+ UNIT float2UNIT(float value);
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractCellExpandAttrPanelProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractCellExpandAttrPanelProvider.java
new file mode 100644
index 0000000000..d0b1eca5c7
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractCellExpandAttrPanelProvider.java
@@ -0,0 +1,43 @@
+package com.fr.design.fun.impl;
+
+import com.fr.design.beans.BasicBeanPane;
+import com.fr.design.fun.CellExpandAttrPanelProvider;
+import com.fr.report.cell.TemplateCellElement;
+import com.fr.stable.fun.mark.API;
+
+/**
+ * @author yaohwu
+ * created by yaohwu at 2020/4/26 16:08
+ */
+@API(level = CellExpandAttrPanelProvider.CURRENT_LEVEL)
+public class AbstractCellExpandAttrPanelProvider implements CellExpandAttrPanelProvider {
+
+ /**
+ * 当前接口的API等级,用于判断是否需要升级插件
+ *
+ * @return API等级
+ */
+ @Override
+ public int currentAPILevel() {
+ return CellExpandAttrPanelProvider.CURRENT_LEVEL;
+ }
+
+ /**
+ * 获取当前provider的标记(可以使用类路径保证唯一)以避免provider的重复加载
+ *
+ * @return 当前provider的标记
+ */
+ @Override
+ public String mark4Provider() {
+ return null;
+ }
+
+ @Override
+ public BasicBeanPane createPanel() {
+ return null;
+ }
+
+ public boolean isDisplayable() {
+ return true;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractCellPropertyPaneProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractCellPropertyPaneProvider.java
new file mode 100644
index 0000000000..ba1c71d5f3
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractCellPropertyPaneProvider.java
@@ -0,0 +1,15 @@
+package com.fr.design.fun.impl;
+
+import com.fr.design.fun.CellPropertyPaneProvider;
+import com.fr.stable.fun.mark.API;
+
+/**
+ * Created by zhouping on 2015/11/11.
+ */
+@API(level = CellPropertyPaneProvider.CURRENT_LEVEL)
+public abstract class AbstractCellPropertyPaneProvider extends AbstractPropertyItemPaneProvider implements CellPropertyPaneProvider {
+
+ public int currentAPILevel() {
+ return CellPropertyPaneProvider.CURRENT_LEVEL;
+ }
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractChartWidgetOptionProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractChartWidgetOptionProvider.java
new file mode 100644
index 0000000000..af93c586f0
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractChartWidgetOptionProvider.java
@@ -0,0 +1,29 @@
+package com.fr.design.fun.impl;
+
+import com.fr.design.fun.ChartWidgetOptionProvider;
+import com.fr.stable.fun.impl.AbstractProvider;
+import com.fr.stable.fun.mark.API;
+
+/**
+ * @author Bjorn
+ * @version 10.0
+ * Created by Bjorn on 2020-06-12
+ */
+@API(level = ChartWidgetOptionProvider.CURRENT_LEVEL)
+public abstract class AbstractChartWidgetOptionProvider extends AbstractProvider implements ChartWidgetOptionProvider {
+
+ public int currentAPILevel() {
+ return CURRENT_LEVEL;
+ }
+
+ @Override
+ public String mark4Provider() {
+ return getClass().getName();
+ }
+
+ @Override
+ public boolean isBefore() {
+ return false;
+ }
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractClipboardHandlerProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractClipboardHandlerProvider.java
new file mode 100644
index 0000000000..da1861916f
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractClipboardHandlerProvider.java
@@ -0,0 +1,17 @@
+package com.fr.design.fun.impl;
+
+import com.fr.design.fun.ClipboardHandlerProvider;
+import com.fr.stable.fun.impl.AbstractProvider;
+import com.fr.stable.fun.mark.API;
+
+/**
+ * created by Harrison on 2020/05/14
+ **/
+@API(level = ClipboardHandlerProvider.CURRENT_LEVEL)
+public abstract class AbstractClipboardHandlerProvider extends AbstractProvider implements ClipboardHandlerProvider {
+
+ @Override
+ public int currentAPILevel() {
+ return ClipboardHandlerProvider.CURRENT_LEVEL;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractDesignerStartClassProcessorProcessor.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractDesignerStartClassProcessorProcessor.java
new file mode 100644
index 0000000000..7c94ffe37a
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractDesignerStartClassProcessorProcessor.java
@@ -0,0 +1,23 @@
+package com.fr.design.fun.impl;
+
+import com.fr.design.fun.DesignerStartClassProcessor;
+import com.fr.stable.fun.mark.API;
+
+/**
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2020/5/7
+ */
+@API(level = DesignerStartClassProcessor.CURRENT_LEVEL)
+public abstract class AbstractDesignerStartClassProcessorProcessor implements DesignerStartClassProcessor {
+
+ @Override
+ public String mark4Provider() {
+ return getClass().getName();
+ }
+
+ @Override
+ public int currentAPILevel() {
+ return CURRENT_LEVEL;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractFormAdaptiveConfigUIProcessor.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractFormAdaptiveConfigUIProcessor.java
new file mode 100644
index 0000000000..1fc76077c1
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractFormAdaptiveConfigUIProcessor.java
@@ -0,0 +1,23 @@
+package com.fr.design.fun.impl;
+
+
+import com.fr.design.fun.FormAdaptiveConfigUIProcessor;
+import com.fr.stable.fun.mark.API;
+
+/**
+ * Created by kerry on 2020-04-09
+ */
+@API(level = FormAdaptiveConfigUIProcessor.CURRENT_LEVEL)
+public abstract class AbstractFormAdaptiveConfigUIProcessor implements FormAdaptiveConfigUIProcessor {
+
+ @Override
+ public int currentAPILevel() {
+ return CURRENT_LEVEL;
+ }
+
+ @Override
+ public int layerIndex() {
+ return DEFAULT_LAYER_INDEX;
+ }
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractFormWidgetOptionProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractFormWidgetOptionProvider.java
index 43cab95143..537a49d018 100644
--- a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractFormWidgetOptionProvider.java
+++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractFormWidgetOptionProvider.java
@@ -25,4 +25,9 @@ public abstract class AbstractFormWidgetOptionProvider extends AbstractProvider
public boolean isContainer() {
return false;
}
+
+ @Override
+ public void paste2Container(T t) {
+ // do nothing
+ }
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractMobileBookMarkStyleProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractMobileBookMarkStyleProvider.java
new file mode 100644
index 0000000000..21ed6722b6
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractMobileBookMarkStyleProvider.java
@@ -0,0 +1,24 @@
+package com.fr.design.fun.impl;
+
+import com.fr.design.fun.MobileBookMarkStyleProvider;
+import com.fr.stable.fun.impl.AbstractProvider;
+import com.fr.stable.fun.mark.API;
+
+/**
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2019/12/24
+ */
+@API(level = MobileBookMarkStyleProvider.CURRENT_LEVEL)
+public abstract class AbstractMobileBookMarkStyleProvider extends AbstractProvider implements MobileBookMarkStyleProvider {
+
+ @Override
+ public int currentAPILevel() {
+ return CURRENT_LEVEL;
+ }
+
+ @Override
+ public String mark4Provider() {
+ return getClass().getName();
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractMobileTemplateStyleProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractMobileTemplateStyleProvider.java
new file mode 100644
index 0000000000..54c947c57a
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractMobileTemplateStyleProvider.java
@@ -0,0 +1,25 @@
+package com.fr.design.fun.impl;
+
+import com.fr.design.fun.MobileTemplateStyleProvider;
+import com.fr.design.fun.MobileWidgetStyleProvider;
+import com.fr.stable.fun.impl.AbstractProvider;
+import com.fr.stable.fun.mark.API;
+
+/**
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2020/3/31
+ */
+@API(level = MobileWidgetStyleProvider.CURRENT_LEVEL)
+public abstract class AbstractMobileTemplateStyleProvider extends AbstractProvider implements MobileTemplateStyleProvider {
+
+ @Override
+ public int currentAPILevel() {
+ return CURRENT_LEVEL;
+ }
+
+ @Override
+ public String mark4Provider() {
+ return getClass().getName();
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPreviewProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPreviewProvider.java
index f0b7809039..3cdac80350 100644
--- a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPreviewProvider.java
+++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPreviewProvider.java
@@ -1,7 +1,9 @@
package com.fr.design.fun.impl;
+import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.fun.PreviewProvider;
import com.fr.design.mainframe.JTemplate;
+import com.fr.design.mainframe.JVirtualTemplate;
import com.fr.general.ComparatorUtils;
import com.fr.general.web.ParameterConstants;
import com.fr.stable.fun.impl.AbstractProvider;
@@ -52,4 +54,12 @@ public abstract class AbstractPreviewProvider extends AbstractProvider implement
public String getActionType() {
return ParameterConstants.VIEWLET;
}
+
+ @Override
+ public boolean accept(JTemplate jTemplate) {
+ if (jTemplate == null) {
+ jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
+ }
+ return jTemplate == null || jTemplate.isJWorkBook() || jTemplate instanceof JVirtualTemplate;
+ }
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPropertyItemPaneProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPropertyItemPaneProvider.java
new file mode 100644
index 0000000000..44e4abd4d1
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPropertyItemPaneProvider.java
@@ -0,0 +1,31 @@
+package com.fr.design.fun.impl;
+
+import com.fr.design.fun.PropertyItemPaneProvider;
+import com.fr.design.mainframe.PaneHolder;
+import com.fr.stable.fun.impl.AbstractProvider;
+import com.fr.stable.fun.mark.API;
+
+/**
+ * created by Harrison on 2020/03/23
+ **/
+@API(level = PropertyItemPaneProvider.CURRENT_LEVEL)
+public abstract class AbstractPropertyItemPaneProvider extends AbstractProvider implements PropertyItemPaneProvider {
+
+ @Override
+ public PaneHolder getPaneHolder(Class> clazz) {
+
+ if (sign().equals(clazz)) {
+ return getPathHolder0();
+ }
+ return null;
+ }
+
+ protected abstract PaneHolder getPathHolder0();
+
+ protected abstract Class sign();
+
+ @Override
+ public int currentAPILevel() {
+ return PropertyItemPaneProvider.CURRENT_LEVEL;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractReportLengthUNITProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractReportLengthUNITProvider.java
new file mode 100644
index 0000000000..da77c947f9
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractReportLengthUNITProvider.java
@@ -0,0 +1,42 @@
+package com.fr.design.fun.impl;
+
+
+import com.fr.design.fun.ReportLengthUNITProvider;
+import com.fr.stable.StringUtils;
+import com.fr.stable.fun.impl.AbstractProvider;
+import com.fr.stable.fun.mark.API;
+import com.fr.stable.unit.UNIT;
+
+/**
+ * Created by kerry on 2020-04-09
+ */
+@API(level = ReportLengthUNITProvider.CURRENT_LEVEL)
+public abstract class AbstractReportLengthUNITProvider extends AbstractProvider implements ReportLengthUNITProvider {
+
+
+ @Override
+ public int currentAPILevel() {
+ return CURRENT_LEVEL;
+ }
+
+ @Override
+ public String unitText() {
+ return StringUtils.EMPTY;
+ }
+
+ @Override
+ public int unitType() {
+ return 0;
+ }
+
+ @Override
+ public float unit2Value4Scale(UNIT value) {
+ return 0;
+ }
+
+ @Override
+ public UNIT float2UNIT(float value) {
+ return UNIT.ZERO;
+ }
+}
+
diff --git a/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java b/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java
index f027157169..dc9cea2bdc 100644
--- a/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java
+++ b/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java
@@ -29,11 +29,11 @@ import com.fr.design.gui.itoolbar.UIToolBarBorder;
import com.fr.design.gui.itoolbar.UIToolBarSeparatorUI;
import com.fr.design.gui.itooltip.UIToolTipBorder;
import com.fr.design.gui.itree.UITreeUI;
+import com.fr.design.i18n.Toolkit;
import com.fr.log.FineLoggerFactory;
import com.fr.general.IOUtils;
-import javax.swing.ImageIcon;
-import javax.swing.UIDefaults;
+import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.BorderUIResource;
@@ -52,6 +52,12 @@ import java.net.URL;
*/
public class UILookAndFeel extends MetalLookAndFeel {
+
+ static {
+ UIManager.put("ProgressMonitor.progressText", Toolkit.i18nText("Fine-Design_Basic_ProgressBar_Title"));
+ UIManager.put("OptionPane.cancelButtonText", Toolkit.i18nText("Fine-Design_Basic_Cancel"));
+ }
+
public static boolean CONTROL_PANEL_INSTANTIATED = false;
diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/JControlUpdatePane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/JControlUpdatePane.java
index 4bb286dbc0..ebe41b2bc7 100644
--- a/designer-base/src/main/java/com/fr/design/gui/controlpane/JControlUpdatePane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/JControlUpdatePane.java
@@ -1,10 +1,13 @@
package com.fr.design.gui.controlpane;
+import com.fr.design.DesignerEnvManager;
import com.fr.design.beans.BasicBeanPane;
import com.fr.design.data.tabledata.tabledatapane.GlobalMultiTDTableDataPane;
import com.fr.design.data.tabledata.tabledatapane.GlobalTreeTableDataPane;
import com.fr.design.data.tabledata.tabledatapane.MultiTDTableDataPane;
import com.fr.design.data.tabledata.tabledatapane.TreeTableDataPane;
+import com.fr.design.env.DesignerWorkspaceInfo;
+import com.fr.design.env.RemoteDesignerWorkspaceInfo;
import com.fr.design.gui.ilist.ListModelElement;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.general.ComparatorUtils;
@@ -99,6 +102,15 @@ class JControlUpdatePane extends JPanel {
if (pane != null && pane.isVisible()) {
Object bean = pane.updateBean();
+ try {
+ if (bean instanceof RemoteDesignerWorkspaceInfo) {
+ DesignerWorkspaceInfo info = DesignerEnvManager.getEnvManager().getWorkspaceInfo(elEditing.wrapper.getName());
+ String remindTime = info.getRemindTime();
+ ((RemoteDesignerWorkspaceInfo) bean).setRemindTime(remindTime);
+ }
+ }catch (Exception e){
+ FineLoggerFactory.getLogger().info("remindTime is not exist");
+ }
if (i < creators.length) {
creators[i].saveUpdatedBean(elEditing, bean);
}
diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/ListControlPaneHelper.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/ListControlPaneHelper.java
index 5618c407c0..0d12772d33 100644
--- a/designer-base/src/main/java/com/fr/design/gui/controlpane/ListControlPaneHelper.java
+++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/ListControlPaneHelper.java
@@ -1,6 +1,7 @@
package com.fr.design.gui.controlpane;
import com.fr.design.beans.BasicBeanPane;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.ilist.JNameEdList;
import com.fr.design.gui.ilist.ListModelElement;
import com.fr.stable.Nameable;
@@ -32,7 +33,7 @@ class ListControlPaneHelper {
try {
listControlPane.checkValid();
} catch (Exception exp) {
- JOptionPane.showMessageDialog((Component) listControlPane, exp.getMessage());
+ FineJOptionPane.showMessageDialog((Component) listControlPane, exp.getMessage());
listControlPane.setSelectedIndex(idx);
return true;
}
diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java
index d47805de96..04427b3378 100644
--- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java
@@ -1,6 +1,7 @@
package com.fr.design.gui.controlpane;
import com.fr.design.constants.UIConstants;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.controlpane.shortcutfactory.ShortCutFactory;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.itoolbar.UIToolBarUI;
@@ -8,18 +9,21 @@ import com.fr.design.gui.itoolbar.UIToolbar;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.menu.ShortCut;
+import com.fr.design.os.impl.PopupDialogSaveAction;
import com.fr.design.utils.gui.GUICoreUtils;
-import com.fr.design.utils.gui.UIComponentUtils;
import com.fr.design.widget.FRWidgetFactory;
+import com.fr.invoke.Reflect;
import com.fr.stable.ArrayUtils;
import com.fr.stable.StringUtils;
+import com.fr.stable.os.OperatingSystem;
+import com.fr.stable.os.support.OSSupportCenter;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JDialog;
-import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
+import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import java.awt.BorderLayout;
import java.awt.Color;
@@ -27,6 +31,7 @@ import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
+import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
@@ -72,7 +77,6 @@ abstract class UIControlPane extends JControlPane {
this.creators = this.createNameableCreators();
initCardPane();
-
if (isNewStyle()) {
getPopupEditDialog(cardPane);
this.add(getLeftPane(), BorderLayout.CENTER);
@@ -148,9 +152,7 @@ abstract class UIControlPane extends JControlPane {
topToolBar.setLayout(new BorderLayout());
ShortCut addItem = shortCutFactory.addItemShortCut().getShortCut();
addItem.intoJToolBar(topToolBar);
-
JPanel leftTopPane = getLeftTopPane(topToolBar);
-
leftTopPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 6, 0));
leftPane.add(leftTopPane, BorderLayout.NORTH);
@@ -171,7 +173,6 @@ abstract class UIControlPane extends JControlPane {
JPanel leftTopPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
leftTopPane.add(toolBarPane, BorderLayout.EAST);
leftTopPane.add(addItemLabel, BorderLayout.CENTER);
-
return leftTopPane;
}
@@ -202,7 +203,6 @@ abstract class UIControlPane extends JControlPane {
topToolBar.validate();
this.controlUpdatePane = createControlUpdatePane();//REPORT-4841 刷新一下编辑面板
cardPane.add(controlUpdatePane, "EDIT");
-
this.repaint();
}
@@ -249,6 +249,19 @@ abstract class UIControlPane extends JControlPane {
}
}
+ try {
+ //没有指定owner的弹出框用的是SwingUtilities.getSharedOwnerFrame()
+ Frame sharedOwnerFrame = Reflect.on(SwingUtilities.class).call("getSharedOwnerFrame").get();
+ for (Window window : sharedOwnerFrame.getOwnedWindows()) {
+ if (window instanceof JDialog && window.isVisible() && ((JDialog) window).isModal()) {
+ // 如果有可见模态对话框,则不隐藏
+ return;
+ }
+ }
+ } catch (Exception ignore) {
+ //do nothing
+ }
+
// 要隐藏 先检查有没有非法输入
// 非法输入检查放在最后,因为可能出现面板弹出新弹框而失去焦点的情况,比如 输入公式时,弹出公式编辑对话框
try {
@@ -256,18 +269,24 @@ abstract class UIControlPane extends JControlPane {
} catch (Exception exp) {
// 存在非法输入 拒绝隐藏
this.setAlwaysOnTop(true);
- JOptionPane.showMessageDialog(this, exp.getMessage());
+ FineJOptionPane.showMessageDialog(this, exp.getMessage());
this.requestFocus();
return;
}
saveSettings();
setVisible(false);
+ PopupDialogSaveAction saveAction = OSSupportCenter.getAction(PopupDialogSaveAction.class);
+ saveAction.unregister();
}
private void initListener() {
addWindowFocusListener(new WindowAdapter() {
@Override
public void windowLostFocus(WindowEvent e) {
+ //在Linux上拉回焦点,不然导致一些面板关不掉
+ if(OperatingSystem.isLinux()) {
+ requestFocus();
+ }
hideDialog();
}
});
diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java
index 0dec124219..100daf511b 100644
--- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java
@@ -7,9 +7,11 @@ import com.fr.design.gui.ilist.JNameEdList;
import com.fr.design.gui.ilist.ListModelElement;
import com.fr.design.gui.ilist.UINameEdList;
import com.fr.design.mainframe.DesignerContext;
+import com.fr.design.os.impl.PopupDialogSaveAction;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.stable.ArrayUtils;
import com.fr.stable.Nameable;
+import com.fr.stable.os.support.OSSupportCenter;
import javax.swing.DefaultListModel;
import javax.swing.JList;
@@ -216,6 +218,8 @@ public abstract class UIListControlPane extends UIControlPane implements ListCon
((PopupEditDialog)popupEditDialog).setTitle(getSelectedName());
}
popupEditDialog.setVisible(true);
+ PopupDialogSaveAction osBasedAction = OSSupportCenter.getAction(PopupDialogSaveAction.class);
+ osBasedAction.register(this, popupEditDialog);
}
}
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java
index 1366b46b3c..6af1194265 100644
--- a/designer-base/src/main/java/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java
@@ -65,7 +65,7 @@ public abstract class AbstractAttrNoScrollPane extends BasicPane {
}
- protected void initListener(Container parentComponent) {
+ public void initListener(Container parentComponent) {
for (int i = 0; i < parentComponent.getComponentCount(); i++) {
Component tmpComp = parentComponent.getComponent(i);
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/CommitTabbedPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/CommitTabbedPane.java
index afbf43c305..66b057d0ca 100644
--- a/designer-base/src/main/java/com/fr/design/gui/frpane/CommitTabbedPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/CommitTabbedPane.java
@@ -3,6 +3,7 @@ package com.fr.design.gui.frpane;
import com.fr.base.BaseUtils;
import com.fr.design.constants.UIConstants;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.write.submit.DBManipulationPane;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.javascript.Commit2DBJavaScriptPane;
@@ -408,7 +409,7 @@ public class CommitTabbedPane extends JComponent implements MouseListener, Mous
selectedIndex = dbManipulationPaneList.size()-1;
commit2DBJavaScriptPane.updateCardPane();
} else if (isOverCloseIcon(x)){
- int re = JOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_CommitTab_Sure_To_Delete")+ "?", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_CommitTab_Remove")
+ int re = FineJOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_CommitTab_Sure_To_Delete")+ "?", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_CommitTab_Remove")
, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if (re == JOptionPane.OK_OPTION) {
dbManipulationPaneList.remove(getTabIndex(x));
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/EditingStringListPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/EditingStringListPane.java
index d3370a7c07..7168db0b5c 100644
--- a/designer-base/src/main/java/com/fr/design/gui/frpane/EditingStringListPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/EditingStringListPane.java
@@ -1,7 +1,9 @@
package com.fr.design.gui.frpane;
import com.fr.design.beans.BasicBeanPane;
+import com.fr.design.dialog.FineJOptionPane;
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.design.utils.gui.JListUtils;
@@ -127,7 +129,7 @@ public abstract class EditingStringListPane extends BasicBeanPane>
setAddEnabled(false);
}
} else {
- JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(EditingStringListPane.this), newvalue + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Already_Exists_Not_Add_Repeat")+"!");
+ FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(EditingStringListPane.this), newvalue + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Already_Exists_Not_Add_Repeat")+"!");
}
}
});
@@ -149,7 +151,10 @@ public abstract class EditingStringListPane extends BasicBeanPane>
public void actionPerformed(ActionEvent e) {
Object selected = jlist.getSelectedValue();
if (selected != null) {
- int re = JOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(EditingStringListPane.this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Sure_To_Delete") + selected.toString() + "?");
+ int re = FineJOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(EditingStringListPane.this),
+ Toolkit.i18nText("Fine-Design_Basic_Sure_To_Delete") + selected.toString() + "?",
+ Toolkit.i18nText("Fine-Design_Basic_Confirm"),
+ JOptionPane.OK_CANCEL_OPTION);
if (re == JOptionPane.OK_OPTION) {
JListUtils.removeSelectedListItems(jlist);
}
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/HyperlinkGroupPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/HyperlinkGroupPane.java
index 3f4ae9b2a5..8405ce09ea 100644
--- a/designer-base/src/main/java/com/fr/design/gui/frpane/HyperlinkGroupPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/HyperlinkGroupPane.java
@@ -2,6 +2,7 @@ package com.fr.design.gui.frpane;
import com.fr.design.ExtraDesignClassManager;
import com.fr.design.designer.TargetComponent;
+import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.fun.HyperlinkProvider;
import com.fr.design.gui.controlpane.NameableCreator;
import com.fr.design.gui.controlpane.UIListControlPane;
@@ -45,6 +46,7 @@ public abstract class HyperlinkGroupPane extends UIListControlPane {
@Override
public void on(PluginEvent event) {
refreshNameableCreator(createNameableCreators());
+ HistoryTemplateListCache.getInstance().reloadCurrentTemplate();
}
}, new PluginFilter() {
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/JTreeControlPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/JTreeControlPane.java
index 0c266b81ac..04e3626a4a 100644
--- a/designer-base/src/main/java/com/fr/design/gui/frpane/JTreeControlPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/JTreeControlPane.java
@@ -5,6 +5,7 @@ import com.fr.data.impl.TreeNodeAttr;
import com.fr.data.impl.TreeNodeWrapper;
import com.fr.design.actions.UpdateAction;
import com.fr.design.beans.BasicBeanPane;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.controlpane.ControlPane;
import com.fr.design.gui.controlpane.NameableCreator;
import com.fr.design.gui.controlpane.UnrepeatedNameHelper;
@@ -231,7 +232,7 @@ public class JTreeControlPane extends ControlPane {
public void actionPerformed(ActionEvent e) {
// TODO remove tree node
- int val = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + "?",
+ int val = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + "?",
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if (val != JOptionPane.OK_OPTION) {
return;
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/UIBubbleFloatPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/UIBubbleFloatPane.java
index c41cc9f7ac..03927ca468 100644
--- a/designer-base/src/main/java/com/fr/design/gui/frpane/UIBubbleFloatPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/UIBubbleFloatPane.java
@@ -2,21 +2,24 @@ package com.fr.design.gui.frpane;
import com.fr.design.beans.BasicBeanPane;
import com.fr.design.dialog.UIDialog;
+import com.fr.design.utils.AWTUtilities;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.Constants;
-import com.sun.awt.AWTUtilities;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
+import javax.swing.border.Border;
import java.awt.AWTEvent;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
+import java.awt.Component;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
+import java.awt.Insets;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.Rectangle;
@@ -29,303 +32,312 @@ import java.awt.event.MouseEvent;
/**
* @author Jerry
- * 非模态悬浮对话框,气泡形状
+ * 非模态悬浮对话框,气泡形状
*/
public abstract class UIBubbleFloatPane extends BasicBeanPane {
- private static final long serialVersionUID = -6386018511442190959L;
- private static int OFF_LEFT = 10;
+ private static final long serialVersionUID = -6386018511442190959L;
+ private static int OFF_LEFT = 10;
private static final int ARROR_PARALLEL = 30;
private static final int ARROR_VERTICAL = 20;
private static final int TITLE_HEIGHT = 60;
private static final double TIME_DEFAULT = 0.5;
private static final double TIME_GAP = 0.1;
- private BasicBeanPane contentPane;
- private Rectangle bounds;
- private int arrowPosition;
- private double time = 0.5;
-
- private UIDialog showDialog;
-
- /**
- * @param arrowPosition 箭头的位置,上下左右,暂时只处理了左边,后面用到了再说 TODO
- * @param arrowPoint 箭头的坐标点
- * @param contentPane 对话框中的Panel
- */
- public UIBubbleFloatPane(int arrowPosition, Point arrowPoint, BasicBeanPane contentPane) {
- this(arrowPosition, arrowPoint, contentPane, contentPane.getPreferredSize().width, contentPane.getPreferredSize().height);
- }
-
- /**
- * 这个方法主要用于那些宽度和高度有变化的面板,因为显然外面的气泡要固定大小,不然忽大忽小,体验太差了
- *
- * @param arrowPosition 箭头的位置,上下左右,暂时只处理了左边,后面用到了再说 TODO
- * @param arrowPoint 箭头的坐标点
- * @param contentPane 对话框中的Panel
- * @param width 对话框中的Panel的宽度,写死了
- * @param height 对话框中的Panel的高度,写死了
- */
- public UIBubbleFloatPane(int arrowPosition, Point arrowPoint, BasicBeanPane contentPane, int width, int height) {
- this.contentPane = contentPane;
- this.arrowPosition = arrowPosition;
- this.time = initBoundsTime(arrowPosition, arrowPoint, width, height);
- if (arrowPosition == Constants.LEFT) {
- this.bounds = new Rectangle(arrowPoint.x - width, (int) (arrowPoint.y - height * time), width, height);
- } else if (arrowPosition == Constants.TOP) {
- this.bounds = new Rectangle((int) (arrowPoint.x - width * time), arrowPoint.y , width, height);
- } else if (arrowPosition == Constants.RIGHT) {
- this.bounds = new Rectangle(arrowPoint.x - OFF_LEFT * 2 - width, (int) (arrowPoint.y - height * time), width, height);
- }
-
- initComponents();
- }
+ private BasicBeanPane contentPane;
+ private Rectangle bounds;
+ private int arrowPosition;
+ private double time = 0.5;
+
+ private UIDialog showDialog;
+
+ /**
+ * @param arrowPosition 箭头的位置,上下左右,暂时只处理了左边,后面用到了再说 TODO
+ * @param arrowPoint 箭头的坐标点
+ * @param contentPane 对话框中的Panel
+ */
+ public UIBubbleFloatPane(int arrowPosition, Point arrowPoint, BasicBeanPane contentPane) {
+ this(arrowPosition, arrowPoint, contentPane, contentPane.getPreferredSize().width, contentPane.getPreferredSize().height);
+ }
+
+ /**
+ * 这个方法主要用于那些宽度和高度有变化的面板,因为显然外面的气泡要固定大小,不然忽大忽小,体验太差了
+ *
+ * @param arrowPosition 箭头的位置,上下左右,暂时只处理了左边,后面用到了再说 TODO
+ * @param arrowPoint 箭头的坐标点
+ * @param contentPane 对话框中的Panel
+ * @param width 对话框中的Panel的宽度,写死了
+ * @param height 对话框中的Panel的高度,写死了
+ */
+ public UIBubbleFloatPane(int arrowPosition, Point arrowPoint, BasicBeanPane contentPane, int width, int height) {
+ this.contentPane = contentPane;
+ this.arrowPosition = arrowPosition;
+ this.time = initBoundsTime(arrowPosition, arrowPoint, width, height);
+ if (arrowPosition == Constants.LEFT) {
+ this.bounds = new Rectangle(arrowPoint.x - width, (int) (arrowPoint.y - height * time), width, height);
+ } else if (arrowPosition == Constants.TOP) {
+ this.bounds = new Rectangle((int) (arrowPoint.x - width * time), arrowPoint.y, width, height);
+ } else if (arrowPosition == Constants.RIGHT) {
+ this.bounds = new Rectangle(arrowPoint.x - OFF_LEFT * 2 - width, (int) (arrowPoint.y - height * time), width, height);
+ }
+
+ initComponents();
+ }
/**
* show对话框
+ *
* @param fatherPane 上一层界面 parentPane
- * @param ob 传入的内容,在show之前populate
+ * @param ob 传入的内容,在show之前populate
*/
- public void show(JComponent fatherPane, T ob) {
- populateBean(ob);
- UIDialog dialog = showUnsizedWindow(SwingUtilities.getWindowAncestor(fatherPane));
- showDialog = dialog;
- Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK);
- dialog.setVisible(true);
- }
-
- /**
- * 数据展现
- */
- public void populateBean(T ob) {
- contentPane.populateBean(ob);
- }
-
- /**
- * 停止编辑, 更新至最新的面板到属性保存
- */
- public T updateBean() {
- updateContentPane();
- return contentPane.updateBean();
- }
-
- /**
- * 需要实现更新内容,将updateBean传值给对象即可,在窗口消失的时候会被调用
- */
- protected abstract void updateContentPane();
-
- /**
- * 以对话框的形式弹出
- *
- * @param window 窗口
- * @return 对话框
- */
- public UIDialog showUnsizedWindow(Window window) {
- CustomShapedDialog dg = null;
- if (window instanceof Frame) {
- dg = new CustomShapedDialog((Frame) window);
- } else {
- dg = new CustomShapedDialog((Dialog) window);
- }
- if (arrowPosition == Constants.LEFT || arrowPosition == Constants.RIGHT) {
- dg.setSize(bounds.width + ARROR_PARALLEL, bounds.height + ARROR_VERTICAL);
- } else {
- dg.setSize(bounds.width + ARROR_VERTICAL, bounds.height + ARROR_PARALLEL);
- }
-
- dg.setLocation(bounds.x, bounds.y);
- dg.setBackground(Color.blue);
- dg.setResizable(false);
- return dg;
- }
-
- @Override
- protected String title4PopupWindow() {
- return null;
- }
-
- private double initBoundsTime(int arrowPosition, Point arrowPoint, int width, int height) {
- int x = arrowPoint.x;
- int y = arrowPoint.y;
- int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width;
- int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height - TITLE_HEIGHT;
- double time = TIME_DEFAULT;
-
- if (arrowPosition == Constants.LEFT || arrowPosition == Constants.RIGHT) {
- while (y + time * height > screenHeight && time > 0) {
- time -= TIME_GAP;
- }
-
- while (y - (1 - time) * height < 0 && time < 1) {
- time += TIME_GAP;
- }
- } else if (arrowPosition == Constants.TOP) {
- while (x + time * width > screenWidth && time > 0) {
- time -= TIME_GAP;
- }
-
- while (x - (1 - time) * width < 0 && time < 1) {
- time += TIME_GAP;
- }
- }
- return 1 - time;
- }
-
- private AWTEventListener awt = new AWTEventListener() {
- public void eventDispatched(AWTEvent event) {
- doSomeInAll(event);
- }
- };
-
- private void doSomeInAll(AWTEvent event) {
- if (event instanceof MouseEvent) {
- MouseEvent mv = (MouseEvent) event;
- if (mv.getClickCount() > 0) {
- Point point = new Point((int) (mv.getLocationOnScreen().getX()) - 2 * OFF_LEFT, (int) mv.getLocationOnScreen().getY());
- // 判断鼠标点击是否在边界内
- if (!containsPoint(point) && showDialog != null) {
- updateContentPane();
- showDialog.setVisible(false);
- Toolkit.getDefaultToolkit().removeAWTEventListener(awt);
- }
- }
- }
- }
+ public void show(JComponent fatherPane, T ob) {
+ populateBean(ob);
+ if (showDialog == null) {
+ showDialog = showUnsizedWindow(SwingUtilities.getWindowAncestor(fatherPane));
+ }
+ Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK);
+ showDialog.setVisible(true);
+ }
+
+ /**
+ * 数据展现
+ */
+ public void populateBean(T ob) {
+ contentPane.populateBean(ob);
+ }
+
+ /**
+ * 停止编辑, 更新至最新的面板到属性保存
+ */
+ public T updateBean() {
+ updateContentPane();
+ return contentPane.updateBean();
+ }
+
+ /**
+ * 需要实现更新内容,将updateBean传值给对象即可,在窗口消失的时候会被调用
+ */
+ protected abstract void updateContentPane();
+
+ /**
+ * 以对话框的形式弹出
+ *
+ * @param window 窗口
+ * @return 对话框
+ */
+ public UIDialog showUnsizedWindow(Window window) {
+ CustomShapedDialog dg = null;
+ if (window instanceof Frame) {
+ dg = new CustomShapedDialog((Frame) window);
+ } else {
+ dg = new CustomShapedDialog((Dialog) window);
+ }
+ if (arrowPosition == Constants.LEFT || arrowPosition == Constants.RIGHT) {
+ dg.setSize(bounds.width + ARROR_PARALLEL, bounds.height + ARROR_VERTICAL);
+ } else {
+ dg.setSize(bounds.width + ARROR_VERTICAL, bounds.height + ARROR_PARALLEL);
+ }
+
+ dg.setLocation(bounds.x, bounds.y);
+ dg.setBackground(Color.blue);
+ dg.setResizable(false);
+ return dg;
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return null;
+ }
+
+ private double initBoundsTime(int arrowPosition, Point arrowPoint, int width, int height) {
+ int x = arrowPoint.x;
+ int y = arrowPoint.y;
+ int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width;
+ int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height - TITLE_HEIGHT;
+ double time = TIME_DEFAULT;
+
+ if (arrowPosition == Constants.LEFT || arrowPosition == Constants.RIGHT) {
+ while (y + time * height > screenHeight && time > 0) {
+ time -= TIME_GAP;
+ }
+
+ while (y - (1 - time) * height < 0 && time < 1) {
+ time += TIME_GAP;
+ }
+ } else if (arrowPosition == Constants.TOP) {
+ while (x + time * width > screenWidth && time > 0) {
+ time -= TIME_GAP;
+ }
+
+ while (x - (1 - time) * width < 0 && time < 1) {
+ time += TIME_GAP;
+ }
+ }
+ return 1 - time;
+ }
+
+ private AWTEventListener awt = new AWTEventListener() {
+ public void eventDispatched(AWTEvent event) {
+ doSomeInAll(event);
+ }
+ };
+
+ private void doSomeInAll(AWTEvent event) {
+ if (event instanceof MouseEvent) {
+ MouseEvent mv = (MouseEvent) event;
+ if (mv.getClickCount() > 0) {
+ Point point = new Point((int) (mv.getLocationOnScreen().getX()) - 2 * OFF_LEFT, (int) mv.getLocationOnScreen().getY());
+ // 判断鼠标点击是否在边界内
+ if (!containsPoint(point) && showDialog != null) {
+ updateContentPane();
+ showDialog.setVisible(false);
+ Toolkit.getDefaultToolkit().removeAWTEventListener(awt);
+ }
+ }
+ }
+ }
private boolean containsPoint(Point point) {
- if(arrowPosition == Constants.TOP){
+ if (arrowPosition == Constants.TOP) {
//箭头和按钮也算在pane内
Rectangle judgedBounds = new Rectangle(bounds.x, bounds.y - OFF_LEFT * 2, bounds.width, bounds.height + OFF_LEFT * 2 + OFF_LEFT);
- return judgedBounds.contains(point);
+ return judgedBounds.contains(point);
}
return bounds.contains(point);
}
- private void initComponents() {
- if(arrowPosition == Constants.LEFT || arrowPosition == Constants.RIGHT) {
- this.setBounds(20, 10, bounds.width, bounds.height);
- } else {
- this.setBounds(10, 10, bounds.width, bounds.height);
- }
-
- this.setLayout(new BorderLayout());
- this.add(contentPane, BorderLayout.CENTER);
- }
+ private void initComponents() {
+ if (arrowPosition == Constants.LEFT || arrowPosition == Constants.RIGHT) {
+ this.setBounds(20, 10, bounds.width, bounds.height);
+ } else {
+ this.setBounds(10, 10, bounds.width, bounds.height);
+ }
+
+ this.setLayout(new BorderLayout());
+ this.add(contentPane, BorderLayout.CENTER);
+ }
- private class CustomShapedDialog extends UIDialog {
+ private class CustomShapedDialog extends UIDialog {
private static final int GAP_SMALL = 10;
private static final int GAP = 20;
private static final int GAP_BIG = 30;
- public CustomShapedDialog(Frame parent) {
- super(parent);
- this.initComponents();
- }
-
- public CustomShapedDialog(Dialog parent) {
- super(parent);
- this.initComponents();
- }
-
-
- private Shape getCustomShap() {
- Polygon polygon = new Polygon();
- if (arrowPosition == Constants.LEFT) {
- polygon.addPoint(GAP_SMALL, 0);
- polygon.addPoint(bounds.width + GAP_BIG, 0);
- polygon.addPoint(bounds.width + GAP_BIG, bounds.height + GAP);
- polygon.addPoint(GAP_SMALL, bounds.height + GAP);
- polygon.addPoint(GAP_SMALL, (int) ((bounds.height + GAP) * time) - GAP_SMALL);
- polygon.addPoint(0, (int) ((bounds.height + GAP) * time - GAP));
- polygon.addPoint(GAP_SMALL, (int) ((bounds.height + GAP) * time - GAP_BIG));
- polygon.addPoint(GAP_SMALL, 0);
- } else if (arrowPosition == Constants.TOP) {
- polygon.addPoint(0, GAP_SMALL);
- polygon.addPoint((int) (bounds.width * time + GAP_SMALL), GAP_SMALL);
- polygon.addPoint((int) (bounds.width * time + GAP), 0);
- polygon.addPoint((int) (bounds.getWidth() * time + GAP_BIG), GAP_SMALL);
- polygon.addPoint(bounds.width + GAP, GAP_SMALL);
- polygon.addPoint(bounds.width + GAP, bounds.height + GAP_BIG);
- polygon.addPoint(0, bounds.height + GAP_BIG);
- polygon.addPoint(0, GAP_SMALL);
- } else if (arrowPosition == Constants.RIGHT) {
- polygon.addPoint(0, 0);
- polygon.addPoint(bounds.width + GAP, 0);
- polygon.addPoint(bounds.width + GAP, (int) ((bounds.height + GAP) * time) - GAP_BIG);
- polygon.addPoint(bounds.width + GAP_BIG, (int) ((bounds.height + GAP) * time) - GAP);
- polygon.addPoint(bounds.width + GAP, (int) ((bounds.height + GAP) * time) - GAP_SMALL);
- polygon.addPoint(bounds.width + GAP, bounds.height + GAP);
- polygon.addPoint(0, bounds.height + GAP);
- polygon.addPoint(0, 0);
- }
-
- return polygon;
- }
-
- private Shape getShape4Board() {
- Polygon polygon = new Polygon();
- if (arrowPosition == Constants.LEFT) {
- polygon.addPoint(GAP_SMALL, 1);
- polygon.addPoint(bounds.width + GAP_BIG - 1, 1);
- polygon.addPoint(bounds.width + GAP_BIG - 1, bounds.height + GAP - 1);
- polygon.addPoint(GAP_SMALL + 1, bounds.height + GAP - 1);
- polygon.addPoint(GAP_SMALL + 1, (int) ((bounds.height + GAP) * time) - GAP_SMALL);
- polygon.addPoint(1, (int) ((bounds.height + GAP) * time - GAP));
- polygon.addPoint(GAP_SMALL + 1, (int) ((bounds.height + GAP) * time - GAP_BIG));
- polygon.addPoint(GAP_SMALL + 1, 1);
- } else if (arrowPosition == Constants.TOP) {
- polygon.addPoint(1, GAP_SMALL + 1);
- polygon.addPoint((int) (bounds.width * time + GAP_SMALL), GAP_SMALL + 1);
- polygon.addPoint((int) (bounds.width * time + GAP), 1);
- polygon.addPoint((int) (bounds.getWidth() * time + GAP_BIG), GAP_SMALL + 1);
- polygon.addPoint(bounds.width + GAP - 1, GAP_SMALL + 1);
- polygon.addPoint(bounds.width + GAP - 1, bounds.height + GAP_BIG - 1);
- polygon.addPoint(1, bounds.height + GAP_BIG - 1);
- polygon.addPoint(1, GAP_SMALL + 1);
- } else if(arrowPosition == Constants.RIGHT) {
- polygon.addPoint(1, 1);
- polygon.addPoint(bounds.width + GAP - 1, 1);
- polygon.addPoint(bounds.width + GAP - 1, (int) ((bounds.height + GAP) * time) - GAP_BIG);
- polygon.addPoint(bounds.width + GAP_BIG - 1, (int) ((bounds.height + GAP) * time) - GAP);
- polygon.addPoint(bounds.width + GAP - 1, (int) ((bounds.height + GAP) * time) - GAP_SMALL);
- polygon.addPoint(bounds.width + GAP - 1, bounds.height + GAP - 1);
- polygon.addPoint(1, bounds.height + GAP - 1);
- polygon.addPoint(1, 0);
- }
- return polygon;
- }
-
- /**
- * 画出界面的样式, 边框等.
- */
- public void paint(Graphics g) {
- super.paint(g);
- Graphics2D g2d = (Graphics2D) g;
- Stroke oldStroke = g2d.getStroke();
- g2d.setStroke(new BasicStroke(2, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND));
- g2d.setColor(new Color(51, 51, 51));
- g2d.drawPolygon((Polygon) getShape4Board());
- g2d.setStroke(oldStroke);
- }
-
- protected void initComponents() {
- setUndecorated(true);
- try {
- AWTUtilities.setWindowShape(CustomShapedDialog.this, this.getCustomShap());
- } catch (UnsupportedOperationException e) {
+ public CustomShapedDialog(Frame parent) {
+ super(parent);
+ this.initComponents();
+ }
+
+ public CustomShapedDialog(Dialog parent) {
+ super(parent);
+ this.initComponents();
+ }
+
+
+ private Shape getCustomShap() {
+ Polygon polygon = new Polygon();
+ if (arrowPosition == Constants.LEFT) {
+ polygon.addPoint(GAP_SMALL, 0);
+ polygon.addPoint(bounds.width + GAP_BIG, 0);
+ polygon.addPoint(bounds.width + GAP_BIG, bounds.height + GAP);
+ polygon.addPoint(GAP_SMALL, bounds.height + GAP);
+ polygon.addPoint(GAP_SMALL, (int) ((bounds.height + GAP) * time) - GAP_SMALL);
+ polygon.addPoint(0, (int) ((bounds.height + GAP) * time - GAP));
+ polygon.addPoint(GAP_SMALL, (int) ((bounds.height + GAP) * time - GAP_BIG));
+ polygon.addPoint(GAP_SMALL, 0);
+ } else if (arrowPosition == Constants.TOP) {
+ polygon.addPoint(0, GAP_SMALL - 2);
+ polygon.addPoint((int) (bounds.width * time + GAP_SMALL), GAP_SMALL - 2);
+ polygon.addPoint((int) (bounds.width * time + GAP), 0);
+ polygon.addPoint((int) (bounds.getWidth() * time + GAP_BIG), GAP_SMALL - 2);
+ polygon.addPoint(bounds.width + GAP, GAP_SMALL - 2);
+ polygon.addPoint(bounds.width + GAP, bounds.height + GAP_BIG);
+ polygon.addPoint(0, bounds.height + GAP_BIG);
+ polygon.addPoint(0, GAP_SMALL - 2);
+ } else if (arrowPosition == Constants.RIGHT) {
+ polygon.addPoint(0, 0);
+ polygon.addPoint(bounds.width + GAP, 0);
+ polygon.addPoint(bounds.width + GAP, (int) ((bounds.height + GAP) * time) - GAP_BIG);
+ polygon.addPoint(bounds.width + GAP_BIG, (int) ((bounds.height + GAP) * time) - GAP);
+ polygon.addPoint(bounds.width + GAP, (int) ((bounds.height + GAP) * time) - GAP_SMALL);
+ polygon.addPoint(bounds.width + GAP, bounds.height + GAP);
+ polygon.addPoint(0, bounds.height + GAP);
+ polygon.addPoint(0, 0);
+ }
+
+ return polygon;
+ }
+
+ private Shape getShape4Board() {
+ Polygon polygon = new Polygon();
+ if (arrowPosition == Constants.LEFT) {
+ polygon.addPoint(GAP_SMALL, 1);
+ polygon.addPoint(bounds.width + GAP_BIG - 1, 1);
+ polygon.addPoint(bounds.width + GAP_BIG - 1, bounds.height + GAP - 1);
+ polygon.addPoint(GAP_SMALL + 1, bounds.height + GAP - 1);
+ polygon.addPoint(GAP_SMALL + 1, (int) ((bounds.height + GAP) * time) - GAP_SMALL);
+ polygon.addPoint(1, (int) ((bounds.height + GAP) * time - GAP));
+ polygon.addPoint(GAP_SMALL + 1, (int) ((bounds.height + GAP) * time - GAP_BIG));
+ polygon.addPoint(GAP_SMALL + 1, 1);
+ } else if (arrowPosition == Constants.TOP) {
+ polygon.addPoint(1, GAP_SMALL - 1);
+ polygon.addPoint((int) (bounds.width * time + GAP_SMALL), GAP_SMALL - 1);
+ polygon.addPoint((int) (bounds.width * time + GAP), 1);
+ polygon.addPoint((int) (bounds.getWidth() * time + GAP_BIG), GAP_SMALL - 1);
+ polygon.addPoint(bounds.width + GAP - 1, GAP_SMALL - 1);
+ polygon.addPoint(bounds.width + GAP - 1, bounds.height + GAP_BIG - 1);
+ polygon.addPoint(1, bounds.height + GAP_BIG - 1);
+ polygon.addPoint(1, GAP_SMALL - 1);
+ } else if (arrowPosition == Constants.RIGHT) {
+ polygon.addPoint(1, 1);
+ polygon.addPoint(bounds.width + GAP - 1, 1);
+ polygon.addPoint(bounds.width + GAP - 1, (int) ((bounds.height + GAP) * time) - GAP_BIG);
+ polygon.addPoint(bounds.width + GAP_BIG - 1, (int) ((bounds.height + GAP) * time) - GAP);
+ polygon.addPoint(bounds.width + GAP - 1, (int) ((bounds.height + GAP) * time) - GAP_SMALL);
+ polygon.addPoint(bounds.width + GAP - 1, bounds.height + GAP - 1);
+ polygon.addPoint(1, bounds.height + GAP - 1);
+ polygon.addPoint(1, 0);
+ }
+ return polygon;
+ }
+
+ protected void initComponents() {
+ setUndecorated(true);
+ try {
+ AWTUtilities.setWindowShape(CustomShapedDialog.this, this.getCustomShap());
+ } catch (UnsupportedOperationException e) {
FineLoggerFactory.getLogger().info("Not support");
- }
- final JPanel contentPane = (JPanel) this.getContentPane();
- this.setLayout(null);
- contentPane.add(UIBubbleFloatPane.this);
- setVisible(true);
- }
-
- /**
- * 检查
- */
- public void checkValid() throws Exception {
-
- }
- }
+ }
+ final JPanel contentPane = (JPanel) this.getContentPane();
+ this.setLayout(null);
+ contentPane.add(UIBubbleFloatPane.this);
+ contentPane.setBorder(new Border() {
+ @Override
+ public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
+ Graphics2D g2d = (Graphics2D) g;
+ Stroke oldStroke = g2d.getStroke();
+ g2d.setStroke(new BasicStroke(2, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND));
+ g2d.setColor(new Color(51, 51, 51));
+ g2d.drawPolygon((Polygon) getShape4Board());
+ g2d.setStroke(oldStroke);
+ }
+
+ @Override
+ public Insets getBorderInsets(Component c) {
+ return null;
+ }
+
+ @Override
+ public boolean isBorderOpaque() {
+ return false;
+ }
+ });
+ }
+
+ /**
+ * 检查
+ */
+ public void checkValid() throws Exception {
+
+ }
+ }
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPane.java
index 92ad39559e..c1021321b9 100644
--- a/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPane.java
@@ -1,5 +1,6 @@
package com.fr.design.gui.frpane;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.general.ComparatorUtils;
@@ -113,7 +114,7 @@ public class UITabbedPane extends JTabbedPane{
* @param i tab索引
*/
public void doRemoveTab(int i){
- int re = JOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(UITabbedPane.this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Sure_To_Delete")+ "?", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove")
+ int re = FineJOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(UITabbedPane.this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Sure_To_Delete")+ "?", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove")
, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if (re == JOptionPane.OK_OPTION) {
super.removeTabAt(i);
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPaneUI.java b/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPaneUI.java
index d95740798b..5798a864b0 100644
--- a/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPaneUI.java
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPaneUI.java
@@ -330,7 +330,9 @@ public class UITabbedPaneUI extends BasicTabbedPaneUI {
g.drawLine(x + 1, y + h - 2, x + w - 3, y + h - 2); // bottom
}
+ @Override
protected void paintContentBorder(Graphics g, int tabPlacement, int selectedIndex) {
+ // do nothing
}
/**
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/tree/layer/config/LayerDataConfigPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/tree/layer/config/LayerDataConfigPane.java
index c67dd08d9e..3ba2e025fe 100644
--- a/designer-base/src/main/java/com/fr/design/gui/frpane/tree/layer/config/LayerDataConfigPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/tree/layer/config/LayerDataConfigPane.java
@@ -7,6 +7,7 @@ import com.fr.design.data.tabledata.wrapper.TableDataWrapper;
import com.fr.design.present.dict.TableDataDictPane;
import com.fr.form.ui.tree.LayerConfig;
import com.fr.form.ui.tree.LayerDependence;
+import com.fr.stable.StringUtils;
import java.awt.*;
import java.util.*;
@@ -73,13 +74,19 @@ public class LayerDataConfigPane extends BasicBeanPane {
if (wrapper != null) {
columnNames = wrapper.calculateColumnNameList();
} else {
- columnNames = new ArrayList();
+ columnNames = new ArrayList<>();
}
- String viewColStr = tableDataDictPane.updateBean().getValueColumnName();
- String modelColStr = tableDataDictPane.updateBean().getKeyColumnName();
TableDataDictionary dictionary = tableDataDictPane.updateBean();
+ String viewColStr = dictionary.getValueColumnName();
+ String modelColStr = dictionary.getKeyColumnName();
int viewCol = columnNames.indexOf(viewColStr);
int modelCol = columnNames.indexOf(modelColStr);
+ if (StringUtils.EMPTY.equals(viewColStr)) {
+ viewCol = dictionary.getValueColumnIndex();
+ }
+ if (StringUtils.EMPTY.equals(modelColStr)) {
+ modelCol = dictionary.getKeyColumnIndex();
+ }
//将数据设置到当前正在修改的layerData中
this.layerConfig.setDictionary(dictionary);
this.layerConfig.setModelColumn(modelCol);
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java
index 128adca1f1..6d74e48015 100644
--- a/designer-base/src/main/java/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java
@@ -2,6 +2,7 @@ package com.fr.design.gui.frpane.tree.layer.config;
import com.fr.base.BaseUtils;
import com.fr.design.actions.UpdateAction;
+import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.controlpane.ControlPane;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.gui.itoolbar.UIToolbar;
@@ -177,7 +178,7 @@ public class LayerDataControlPane extends ControlPane {
public void actionPerformed(ActionEvent e) {
// TODO remove tree node
- int val = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + "?",
+ int val = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + "?",
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if (val != JOptionPane.OK_OPTION) {
return;
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/ModeButtonGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/ModeButtonGroup.java
new file mode 100644
index 0000000000..c13498705a
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/ModeButtonGroup.java
@@ -0,0 +1,36 @@
+package com.fr.design.gui.ibutton;
+
+
+import javax.swing.*;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * 互斥的按钮
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2019/11/12
+ */
+public class ModeButtonGroup extends ButtonGroup {
+
+ private Map buttonMap = new LinkedHashMap<>();
+
+ public void put(T t, AbstractButton button) {
+ add(button);
+ buttonMap.put(t, button);
+ }
+
+ public void setSelectButton(T t) {
+ buttonMap.get(t).setSelected(true);
+ }
+
+ public T getCurrentSelected() {
+ for (Map.Entry entry : buttonMap.entrySet()) {
+ if (entry.getValue().isSelected()) {
+ return entry.getKey();
+ }
+ }
+ return buttonMap.entrySet().iterator().next().getKey();
+ }
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/SpecialUIButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/SpecialUIButton.java
index 338cbac7ef..c423ac582b 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ibutton/SpecialUIButton.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/SpecialUIButton.java
@@ -25,6 +25,8 @@ public class SpecialUIButton extends JButton {
*
* @see javax.swing.AbstractButton#setUI(ButtonUI)
*/
+ @Override
public void setUI(ButtonUI ui) {
+ // do nothing
}
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIBasicButtonUI.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIBasicButtonUI.java
index 64db1e91da..87aae662bd 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIBasicButtonUI.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIBasicButtonUI.java
@@ -43,6 +43,7 @@ public class UIBasicButtonUI extends MetalButtonUI {
private boolean isDefault;
public UIBasicButtonUI() {
+ // do nothing
}
/**
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButton.java
index c1dc9b0581..28f5830619 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButton.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButton.java
@@ -1,19 +1,5 @@
package com.fr.design.gui.ibutton;
-import java.awt.*;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-
-import javax.swing.AbstractButton;
-import javax.swing.ButtonModel;
-import javax.swing.Icon;
-import javax.swing.JComponent;
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import javax.swing.event.EventListenerList;
-
import com.fr.base.Utils;
import com.fr.design.constants.UIConstants;
import com.fr.design.event.GlobalNameListener;
@@ -21,231 +7,235 @@ import com.fr.design.event.GlobalNameObserver;
import com.fr.design.event.UIObserver;
import com.fr.design.event.UIObserverListener;
import com.fr.design.gui.ipoppane.PopupHider;
-import com.fr.general.ComparatorUtils;
import com.fr.design.style.color.ColorControlWindow;
import com.fr.design.utils.gui.GUICoreUtils;
+import com.fr.general.ComparatorUtils;
+
+import javax.swing.AbstractButton;
+import javax.swing.ButtonModel;
+import javax.swing.Icon;
+import javax.swing.JComponent;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.EventListenerList;
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
public class UIColorButton extends UIButton implements PopupHider, UIObserver, GlobalNameObserver {
- private static final int SIZE = 16;
- private static final int SIZE_2 = 2;
- private static final int SIZE_4 = 4;
- private static final int SIZE_6 = 6;
- private static final int POPUP_MENU_SHIFT = -70;
- private Color color = Color.BLACK;
- private ColorControlWindow popupWin;
- private EventListenerList colorChangeListenerList = new EventListenerList();
- private boolean isEventBanned = false;
- private String colorButtonName = "";
- private UIObserverListener uiObserverListener;
- private GlobalNameListener globalNameListener = null;
-
- public UIColorButton() {
- this(UIConstants.FONT_ICON);
- }
-
- public UIColorButton(Icon icon) {
- super(icon);
- setUI(getButtonUI());
- addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- showPopupMenu();
- }
- });
- iniListener();
- }
-
- private void iniListener() {
- if (shouldResponseChangeListener()) {
- this.addColorChangeListener(new ChangeListener() {
- @Override
- public void stateChanged(ChangeEvent e) {
- if (uiObserverListener == null) {
- return;
- }
- if (globalNameListener != null && shouldResponseNameListener()) {
- globalNameListener.setGlobalName(colorButtonName);
- }
- uiObserverListener.doChange();
- }
- });
- }
- }
-
- private UIButtonUI getButtonUI() {
- return new UIButtonUI() {
- @Override
- protected void paintIcon(Graphics g, JComponent c) {
- super.paintIcon(g, c);
- AbstractButton b = (AbstractButton) c;
- ButtonModel model = b.getModel();
- if (model.isEnabled()) {
- g.setColor(UIColorButton.this.getColor());
- } else {
- g.setColor(new Color(Utils.filterRGB(UIColorButton.this.getColor().getRGB(), 50)));
- }
- g.fillRect((b.getWidth() - SIZE) / SIZE_2, b.getHeight() - SIZE_6, SIZE, SIZE_4);
- }
- };
- }
-
- public void setEventBanned(boolean isEventBanned) {
- this.isEventBanned = isEventBanned;
- }
-
- public void setGlobalName(String name) {
- colorButtonName = name;
- }
-
- public Color getColor() {
- return color;
- }
-
- public void setColor(Color color) {
- if (ComparatorUtils.equals(this.color, color)) {
- return;
- }
-
- this.color = color;
- hidePopupMenu();
- fireColorStateChanged();
- }
-
- private void showPopupMenu() {
- if (isEventBanned) {
- return;
- }
-
- if (popupWin != null && popupWin.isVisible()) {
- hidePopupMenu();
- return;
- }
-
- if (!this.isEnabled()) {
- return;
- }
-
- popupWin = this.getColorControlWindow();
-
- GUICoreUtils.showPopupMenu(popupWin, this, POPUP_MENU_SHIFT, this.getSize().height);
- }
-
- /**
- * 隐藏popupmenu
- */
- public void hidePopupMenu() {
- if (popupWin != null) {
- popupWin.setVisible(false);
- repaint();
- }
-
- popupWin = null;
- }
-
- private ColorControlWindow getColorControlWindow() {
- //find parant.
- if (this.popupWin == null) {
- this.popupWin = new ColorControlWindow(UIColorButton.this) {
- @Override
- protected void colorChanged() {
- UIColorButton.this.setColor(this.getColor());
- }
-
- };
- }
-
- return popupWin;
- }
-
- /**
- * 添加监听
- *
- * @param changeListener 监听列表
- */
- public void addColorChangeListener(ChangeListener changeListener) {
- colorChangeListenerList.add(ChangeListener.class, changeListener);
- }
-
- /**
- * 移除监听
- * Removes an old ColorChangeListener.
- * @param changeListener 监听列表
- */
- public void removeColorChangeListener(ChangeListener changeListener) {
- colorChangeListenerList.remove(ChangeListener.class, changeListener);
- }
-
- /**
- * 颜色状态改变
- */
- public void fireColorStateChanged() {
- Object[] listeners = colorChangeListenerList.getListenerList();
- ChangeEvent e = null;
-
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == ChangeListener.class) {
- if (e == null) {
- e = new ChangeEvent(this);
- }
- ((ChangeListener) listeners[i + 1]).stateChanged(e);
- }
- }
- }
-
-
- /**
- * 注册状态改变监听
- *
- * @param listener 观察者监听事件
- */
- public void registerChangeListener(UIObserverListener listener) {
- uiObserverListener = listener;
- }
-
- /**
- * 是否需要响应监听
- *
- * @return 是否响应
- */
- public boolean shouldResponseChangeListener() {
- return true;
- }
-
- /**
- * 注册监听
- *
- * @param listener 观察者监听事件
- */
- public void registerNameListener(GlobalNameListener listener) {
- globalNameListener = listener;
- }
-
- /**
- * 是否需要相应
- *
- * @return 是否响应
- */
- public boolean shouldResponseNameListener() {
- return true;
- }
-
- /**
- * 主函数
- *
- * @param args 参数
- */
- public static void main(String... args) {
- LayoutManager layoutManager = null;
- JFrame jf = new JFrame("test");
- jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- JPanel content = (JPanel) jf.getContentPane();
- content.setLayout(layoutManager);
-
- UIColorButton bb = new UIColorButton(UIConstants.FONT_ICON);
- bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height);
- content.add(bb);
- GUICoreUtils.centerWindow(jf);
- jf.setSize(400, 400);
- jf.setVisible(true);
- }
+ public static final int SIZE = 16;
+ public static final int SIZE_2 = 2;
+ public static final int SIZE_4 = 4;
+ public static final int SIZE_6 = 6;
+ private static final int POPUP_MENU_SHIFT = -70;
+ private Color color = Color.BLACK;
+ private ColorControlWindow popupWin;
+ private EventListenerList colorChangeListenerList = new EventListenerList();
+ private boolean isEventBanned = false;
+ private String colorButtonName = "";
+ private UIObserverListener uiObserverListener;
+ private GlobalNameListener globalNameListener = null;
+
+ public UIColorButton() {
+ this(UIConstants.FONT_ICON);
+ }
+
+ public UIColorButton(Icon icon) {
+ super(icon);
+ setUI(getButtonUI());
+ addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ showPopupMenu();
+ }
+ });
+ iniListener();
+ }
+
+ public ColorControlWindow getPopupWin() {
+ return popupWin;
+ }
+
+ public void setPopupWin(ColorControlWindow popupWin) {
+ this.popupWin = popupWin;
+ }
+
+ private void iniListener() {
+ if (shouldResponseChangeListener()) {
+ this.addColorChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ if (uiObserverListener == null) {
+ return;
+ }
+ if (globalNameListener != null && shouldResponseNameListener()) {
+ globalNameListener.setGlobalName(colorButtonName);
+ }
+ uiObserverListener.doChange();
+ }
+ });
+ }
+ }
+
+ private UIButtonUI getButtonUI() {
+ return new UIButtonUI() {
+ @Override
+ protected void paintIcon(Graphics g, JComponent c) {
+ super.paintIcon(g, c);
+ AbstractButton b = (AbstractButton) c;
+ ButtonModel model = b.getModel();
+ if (model.isEnabled()) {
+ g.setColor(UIColorButton.this.getColor());
+ } else {
+ g.setColor(new Color(Utils.filterRGB(UIColorButton.this.getColor().getRGB(), 50)));
+ }
+ g.fillRect((b.getWidth() - SIZE) / SIZE_2, b.getHeight() - SIZE_6, SIZE, SIZE_4);
+ }
+ };
+ }
+
+ public void setEventBanned(boolean isEventBanned) {
+ this.isEventBanned = isEventBanned;
+ }
+
+ public void setGlobalName(String name) {
+ colorButtonName = name;
+ }
+
+ public Color getColor() {
+ return color;
+ }
+
+ public void setColor(Color color) {
+ if (ComparatorUtils.equals(this.color, color)) {
+ return;
+ }
+ Color oldColor = this.color;
+ this.color = color;
+ checkColorChange(oldColor, this.color);
+ }
+
+ protected void checkColorChange(Color oldColor, Color newColor) {
+ hidePopupMenu();
+ fireColorStateChanged();
+ }
+
+ private void showPopupMenu() {
+ if (isEventBanned) {
+ return;
+ }
+
+ if (popupWin != null && popupWin.isVisible()) {
+ hidePopupMenu();
+ return;
+ }
+
+ if (!this.isEnabled()) {
+ return;
+ }
+
+ popupWin = this.getColorControlWindow();
+
+ GUICoreUtils.showPopupMenu(popupWin, this, POPUP_MENU_SHIFT, this.getSize().height);
+ }
+
+ /**
+ * 隐藏popupmenu
+ */
+ public void hidePopupMenu() {
+ if (popupWin != null) {
+ popupWin.setVisible(false);
+ }
+ popupWin = null;
+ repaint();
+ }
+
+ protected ColorControlWindow getColorControlWindow() {
+ //find parant.
+ if (this.popupWin == null) {
+ this.popupWin = new ColorControlWindow(UIColorButton.this) {
+ @Override
+ protected void colorChanged() {
+ UIColorButton.this.setColor(this.getColor());
+ }
+
+ };
+ }
+
+ return popupWin;
+ }
+
+ /**
+ * 添加监听
+ *
+ * @param changeListener 监听列表
+ */
+ public void addColorChangeListener(ChangeListener changeListener) {
+ colorChangeListenerList.add(ChangeListener.class, changeListener);
+ }
+
+ /**
+ * 移除监听
+ * Removes an old ColorChangeListener.
+ *
+ * @param changeListener 监听列表
+ */
+ public void removeColorChangeListener(ChangeListener changeListener) {
+ colorChangeListenerList.remove(ChangeListener.class, changeListener);
+ }
+
+ /**
+ * 颜色状态改变
+ */
+ public void fireColorStateChanged() {
+ Object[] listeners = colorChangeListenerList.getListenerList();
+ ChangeEvent e = null;
+
+ for (int i = listeners.length - 2; i >= 0; i -= 2) {
+ if (listeners[i] == ChangeListener.class) {
+ if (e == null) {
+ e = new ChangeEvent(this);
+ }
+ ((ChangeListener) listeners[i + 1]).stateChanged(e);
+ }
+ }
+ }
+
+
+ /**
+ * 注册状态改变监听
+ *
+ * @param listener 观察者监听事件
+ */
+ public void registerChangeListener(UIObserverListener listener) {
+ uiObserverListener = listener;
+ }
+
+ /**
+ * 是否需要响应监听
+ *
+ * @return 是否响应
+ */
+ public boolean shouldResponseChangeListener() {
+ return true;
+ }
+
+ /**
+ * 注册监听
+ *
+ * @param listener 观察者监听事件
+ */
+ public void registerNameListener(GlobalNameListener listener) {
+ globalNameListener = listener;
+ }
+
+ /**
+ * 是否需要相应
+ *
+ * @return 是否响应
+ */
+ public boolean shouldResponseNameListener() {
+ return true;
+ }
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButtonWithAuto.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButtonWithAuto.java
new file mode 100644
index 0000000000..a7dcad008a
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButtonWithAuto.java
@@ -0,0 +1,38 @@
+package com.fr.design.gui.ibutton;
+
+import com.fr.chart.base.ChartConstants;
+import com.fr.design.constants.UIConstants;
+import com.fr.design.style.color.ColorControlWindow;
+import com.fr.design.style.color.ColorControlWindowWithAuto;
+import com.fr.general.ComparatorUtils;
+
+import java.awt.Color;
+
+public class UIColorButtonWithAuto extends UIColorButton {
+
+ protected void checkColorChange(Color oldColor, Color newColor) {
+ if (ComparatorUtils.equals(oldColor, ChartConstants.AUTO_FONT_COLOR) && !ComparatorUtils.equals(newColor, ChartConstants.AUTO_FONT_COLOR)) {
+ setIcon(UIConstants.FONT_ICON);
+ }
+
+ if (!ComparatorUtils.equals(oldColor, ChartConstants.AUTO_FONT_COLOR) && ComparatorUtils.equals(newColor, ChartConstants.AUTO_FONT_COLOR)) {
+ setIcon(UIConstants.AUTO_FONT_ICON);
+ }
+
+ super.checkColorChange(oldColor, newColor);
+ }
+
+ protected ColorControlWindow getColorControlWindow() {
+ if (getPopupWin() == null) {
+ ColorControlWindowWithAuto colorControlWindowWithAuto = new ColorControlWindowWithAuto(UIColorButtonWithAuto.this) {
+ protected void colorChanged() {
+ UIColorButtonWithAuto.this.setColor(this.getColor());
+ }
+ };
+
+ setPopupWin(colorControlWindowWithAuto);
+ }
+
+ return getPopupWin();
+ }
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java
index edbc013405..e21f4c2170 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java
@@ -25,7 +25,7 @@ public class UIHeadGroup extends JPanel {
protected int selectedIndex = -1;
protected void tabChanged(int newSelectedIndex) {
-
+ // do nothing
}
public UIHeadGroup(String[] textArray) {
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIPasswordField.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIPasswordField.java
index 8d26b5e875..8963119a04 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIPasswordField.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIPasswordField.java
@@ -1 +1 @@
-package com.fr.design.gui.ibutton;
import com.fr.design.event.UIObserver;
import com.fr.design.event.UIObserverListener;
import javax.swing.*;
/**
* Author : Shockway
* Date: 13-10-21
* Time: 下午3:23
*/
public class UIPasswordField extends JPasswordField implements UIObserver {
public void registerChangeListener(UIObserverListener listener) {
}
public boolean shouldResponseChangeListener() {
return false;
}
}
\ No newline at end of file
+package com.fr.design.gui.ibutton;
import com.fr.design.event.UIObserver;
import com.fr.design.event.UIObserverListener;
import javax.swing.*;
/**
* Author : Shockway
* Date: 13-10-21
* Time: 下午3:23
*/
public class UIPasswordField extends JPasswordField implements UIObserver {
public void registerChangeListener(UIObserverListener listener) {
// do nothing
}
public boolean shouldResponseChangeListener() {
return false;
}
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIPreviewButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIPreviewButton.java
index a5f9de9b70..50bbc1440d 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIPreviewButton.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIPreviewButton.java
@@ -1 +1 @@
-package com.fr.design.gui.ibutton;
import com.fr.design.constants.UIConstants;
import com.fr.stable.Constants;
import com.fr.design.utils.gui.GUICoreUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* Author : daisy
* Date: 13-8-1
* Time: 下午3:41
*/
public class UIPreviewButton extends JPanel {
private static final int START_X = -7;
protected UIButton upButton;
protected UIButton downButton;
protected void upButtonClickEvent() {
}
protected void downButtonClickEvent() {
}
public UIPreviewButton() {
this(new UIButton(), new UIButton());
}
public UIPreviewButton(UIButton up, UIButton down) {
upButton = up;
downButton = down;
upButton.setRoundBorder(true, Constants.CENTER);
downButton.setRoundBorder(true, Constants.CENTER);
upButton.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
downButton.getModel().setPressed(true);
downButton.getModel().setSelected(true);
downButton.repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
downButton.getModel().setPressed(false);
downButton.getModel().setSelected(false);
downButton.repaint();
}
@Override
public void mouseClicked(MouseEvent e) {
upButtonClickEvent();
}
});
downButton.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
upButton.getModel().setPressed(true);
upButton.getModel().setSelected(true);
upButton.repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
upButton.getModel().setPressed(false);
upButton.getModel().setSelected(false);
upButton.repaint();
}
@Override
public void mouseClicked(MouseEvent e) {
downButtonClickEvent();
}
});
this.setLayout(new FlowLayout(FlowLayout.CENTER,5,0));
this.add(upButton);
this.add(downButton);
}
public UIPreviewButton(Icon left, Icon right) {
this();
upButton.setIcon(left);
downButton.setIcon(right);
}
public UIButton getUpButton() {
return upButton;
}
public void setExtraPainted(boolean isExtraPainted) {
if (!isExtraPainted) {
upButton.setBackground(null);
downButton.setBackground(null);
upButton.setOpaque(false);
downButton.setOpaque(false);
}
}
public UIButton getDownButton() {
return downButton;
}
public void set4Toolbar() {
upButton.setNormalPainted(false);
downButton.setNormalPainted(false);
upButton.setBorderPaintedOnlyWhenPressed(true);
downButton.setBorderPaintedOnlyWhenPressed(true);
}
protected void showPopWindow(JPopupMenu menu) {
GUICoreUtils.showPopupMenu(menu, this, START_X, getY() + getHeight() - 3);
}
public static void main(String... args) {
JFrame jf = new JFrame("test");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel content = (JPanel) jf.getContentPane();
content.setLayout(null);
UIPreviewButton bb = new UIPreviewButton(UIConstants.PAGE_BIG_ICON, UIConstants.PREVIEW_DOWN);
bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height);
content.add(bb);
GUICoreUtils.centerWindow(jf);
jf.setSize(100, 100);
jf.setVisible(true);
}
}
\ No newline at end of file
+package com.fr.design.gui.ibutton;
import com.fr.design.constants.UIConstants;
import com.fr.stable.Constants;
import com.fr.design.utils.gui.GUICoreUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* Author : daisy
* Date: 13-8-1
* Time: 下午3:41
*/
public class UIPreviewButton extends JPanel {
private static final int START_X = -7;
protected UIButton upButton;
protected UIButton downButton;
protected void upButtonClickEvent() {
// do nothing
}
protected void downButtonClickEvent() {
// do nothing
}
public UIPreviewButton() {
this(new UIButton(), new UIButton());
}
public UIPreviewButton(UIButton up, UIButton down) {
upButton = up;
downButton = down;
upButton.setRoundBorder(true, Constants.CENTER);
downButton.setRoundBorder(true, Constants.CENTER);
upButton.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
downButton.getModel().setPressed(true);
downButton.getModel().setSelected(true);
downButton.repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
downButton.getModel().setPressed(false);
downButton.getModel().setSelected(false);
downButton.repaint();
}
@Override
public void mouseClicked(MouseEvent e) {
upButtonClickEvent();
}
});
downButton.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
upButton.getModel().setPressed(true);
upButton.getModel().setSelected(true);
upButton.repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
upButton.getModel().setPressed(false);
upButton.getModel().setSelected(false);
upButton.repaint();
}
@Override
public void mouseClicked(MouseEvent e) {
downButtonClickEvent();
}
});
this.setLayout(new FlowLayout(FlowLayout.CENTER,5,0));
this.add(upButton);
this.add(downButton);
}
public UIPreviewButton(Icon left, Icon right) {
this();
upButton.setIcon(left);
downButton.setIcon(right);
}
public UIButton getUpButton() {
return upButton;
}
public void setExtraPainted(boolean isExtraPainted) {
if (!isExtraPainted) {
upButton.setBackground(null);
downButton.setBackground(null);
upButton.setOpaque(false);
downButton.setOpaque(false);
}
}
public UIButton getDownButton() {
return downButton;
}
public void set4Toolbar() {
upButton.setNormalPainted(false);
downButton.setNormalPainted(false);
upButton.setBorderPaintedOnlyWhenPressed(true);
downButton.setBorderPaintedOnlyWhenPressed(true);
}
protected void showPopWindow(JPopupMenu menu) {
GUICoreUtils.showPopupMenu(menu, this, START_X, getY() + getHeight() - 3);
}
public static void main(String... args) {
JFrame jf = new JFrame("test");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel content = (JPanel) jf.getContentPane();
content.setLayout(null);
UIPreviewButton bb = new UIPreviewButton(UIConstants.PAGE_BIG_ICON, UIConstants.PREVIEW_DOWN);
bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height);
content.add(bb);
GUICoreUtils.centerWindow(jf);
jf.setSize(100, 100);
jf.setVisible(true);
}
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIRadioButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIRadioButton.java
index 0752eef4d2..7112e5d657 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIRadioButton.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIRadioButton.java
@@ -22,39 +22,55 @@ public class UIRadioButton extends JRadioButton implements UIObserver, GlobalNam
private GlobalNameListener globalNameListener = null;
private String radioButtonName = StringUtils.EMPTY;
+ private boolean markMnemonic = true;
+
public UIRadioButton() {
super();
initListener();
+ initComponent();
}
public UIRadioButton(Icon icon) {
super(icon);
initListener();
+ initComponent();
}
public UIRadioButton(Action a) {
super(a);
initListener();
+ initComponent();
}
public UIRadioButton(Icon icon, boolean selected) {
super(icon, selected);
initListener();
+ initComponent();
}
public UIRadioButton(String text) {
super(text);
initListener();
+ initComponent();
}
public UIRadioButton(String text, boolean selected) {
super(text, selected);
initListener();
+ initComponent();
+ }
+
+ public UIRadioButton(String text, boolean selected, boolean markMnemonic) {
+ super(text, selected);
+ initListener();
+ initComponent();
+ this.markMnemonic = markMnemonic;
}
public UIRadioButton(String text, Icon icon) {
super(text, icon);
initListener();
+ initComponent();
}
@@ -63,6 +79,13 @@ public class UIRadioButton extends JRadioButton implements UIObserver, GlobalNam
initListener();
}
+ public void setMnemonic(char mnemonic) {
+ super.setMnemonic(mnemonic);
+ if (!markMnemonic) {
+ setDisplayedMnemonicIndex(-1);
+ }
+ }
+
private void initListener() {
if (shouldResponseChangeListener()) {
this.addItemListener(new ItemListener() {
@@ -81,6 +104,10 @@ public class UIRadioButton extends JRadioButton implements UIObserver, GlobalNam
}
}
+ private void initComponent() {
+ this.setFocusPainted(false);
+ }
+
/**
* 给组件登记一个观察者监听事件
*
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIRadioButtonUI.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIRadioButtonUI.java
index 0e054b6938..811c1c2bdf 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIRadioButtonUI.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIRadioButtonUI.java
@@ -5,9 +5,12 @@ import com.fr.design.utils.ThemeUtils;
import javax.swing.*;
import javax.swing.plaf.ComponentUI;
+import javax.swing.plaf.basic.BasicHTML;
import javax.swing.plaf.metal.MetalRadioButtonUI;
import java.awt.*;
import java.awt.event.KeyEvent;
+import javax.swing.text.View;
+import sun.swing.SwingUtilities2;
/**
* Created by IntelliJ IDEA.
@@ -84,6 +87,124 @@ public class UIRadioButtonUI extends MetalRadioButtonUI {
return radioButton;
}
+ // ********************************
+ // Paint Methods
+ // ********************************
+ public synchronized void paint(Graphics g, JComponent c) {
+
+ AbstractButton b = (AbstractButton) c;
+ ButtonModel model = b.getModel();
+
+ Dimension size = c.getSize();
+
+ int w = size.width;
+ int h = size.height;
+
+ Font f = c.getFont();
+ g.setFont(f);
+ FontMetrics fm = SwingUtilities2.getFontMetrics(c, g, f);
+
+ Rectangle viewRect = new Rectangle(size);
+ Rectangle iconRect = new Rectangle();
+ Rectangle textRect = new Rectangle();
+
+ Insets i = c.getInsets();
+ viewRect.x += i.left;
+ viewRect.y += i.top;
+ viewRect.width -= (i.right + viewRect.x);
+ viewRect.height -= (i.bottom + viewRect.y);
+
+ Icon altIcon = b.getIcon();
+ Icon selectedIcon = null;
+ Icon disabledIcon = null;
+
+ String text = SwingUtilities.layoutCompoundLabel(
+ c, fm, b.getText(), altIcon != null ? altIcon : getDefaultIcon(),
+ b.getVerticalAlignment(), b.getHorizontalAlignment(),
+ b.getVerticalTextPosition(), b.getHorizontalTextPosition(),
+ viewRect, iconRect, textRect, b.getIconTextGap());
+
+ // fill background
+ if (c.isOpaque()) {
+ g.setColor(b.getBackground());
+ g.fillRect(0, 0, size.width, size.height);
+ }
+
+
+ // Paint the radio button
+ if (altIcon != null) {
+
+ if (!model.isEnabled()) {
+ if (model.isSelected()) {
+ altIcon = b.getDisabledSelectedIcon();
+ } else {
+ altIcon = b.getDisabledIcon();
+ }
+ } else if (model.isPressed() && model.isArmed()) {
+ altIcon = b.getPressedIcon();
+ if (altIcon == null) {
+ // Use selected icon
+ altIcon = b.getSelectedIcon();
+ }
+ } else if (model.isSelected()) {
+ if (b.isRolloverEnabled() && model.isRollover()) {
+ altIcon = b.getRolloverSelectedIcon();
+ if (altIcon == null) {
+ altIcon = b.getSelectedIcon();
+ }
+ } else {
+ altIcon = b.getSelectedIcon();
+ }
+ } else if (b.isRolloverEnabled() && model.isRollover()) {
+ altIcon = b.getRolloverIcon();
+ }
+
+ if (altIcon == null) {
+ altIcon = b.getIcon();
+ }
+
+ altIcon.paintIcon(c, g, iconRect.x, iconRect.y);
+
+ } else {
+ getDefaultIcon().paintIcon(c, g, iconRect.x, iconRect.y);
+ }
+
+ // Draw the Text
+ if (text != null) {
+ View v = (View) c.getClientProperty(BasicHTML.propertyKey);
+ if (v != null) {
+ v.paint(g, textRect);
+ } else {
+ int mnemIndex = b.getDisplayedMnemonicIndex();
+ if (model.isEnabled()) {
+ // *** paint the text normally
+ g.setColor(b.getForeground());
+ } else {
+ // *** paint the text disabled
+ g.setColor(getDisabledTextColor());
+ }
+ if (markMnemonic(text, mnemIndex)) {
+ SwingUtilities2.drawStringUnderlineCharAt(c, g, text,
+ mnemIndex, textRect.x, textRect.y + fm.getAscent());
+ } else {
+ SwingUtilities2.drawString(c, g, text, textRect.x, textRect.y + fm.getAscent());
+ }
+ }
+ if (b.hasFocus() && b.isFocusPainted() &&
+ textRect.width > 0 && textRect.height > 0) {
+ paintFocus(g, textRect, size);
+ }
+ }
+ }
+
+ /**
+ * @param text
+ * @param mnemIndex 助记符在text中的索引
+ * @return true:需要给助记符画一个下划线
+ */
+ private boolean markMnemonic(String text, int mnemIndex) {
+ return mnemIndex > 0 && text != null && text.length() > 0 && text.length() > mnemIndex;
+ }
/**
* Paints the focus for the radiobutton
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UITabButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UITabButton.java
index ce609cde88..aa5c34f60b 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UITabButton.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UITabButton.java
@@ -175,7 +175,7 @@ public class UITabButton extends UILabel implements UISelectedComponent {
}
protected void paintOther(Graphics2D g2d, int w, int h) {
-
+ // do nothing
}
}
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java
index 2ba4f02439..dc380c0c94 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java
@@ -187,7 +187,7 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{
@Override
protected void fireStateChanged() {
-
+ // do nothing
}
diff --git a/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBox.java b/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBox.java
index 10ea06a8ce..e294d80220 100644
--- a/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBox.java
+++ b/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBox.java
@@ -34,6 +34,7 @@ public class UICheckBox extends JCheckBox implements UIObserver, GlobalNameObser
private UIObserverListener uiObserverListener;
private GlobalNameListener globalNameListener = null;
private String checkboxName = "";
+ private boolean markMnemonic = true;
public UICheckBox(String string) {
super(string);
@@ -53,30 +54,41 @@ public class UICheckBox extends JCheckBox implements UIObserver, GlobalNameObser
initListener();
}
+ public UICheckBox(String locText, boolean b, boolean markMnemonic) {
+ super(locText, b);
+ setUI(new UICheckBoxUI());
+ initListener();
+ this.markMnemonic=markMnemonic;
+ }
+
public UICheckBox(String text, Icon icon) {
super(text, icon);
setUI(new UICheckBoxUI());
initListener();
}
- private void initListener() {
+ protected void initListener() {
if (shouldResponseChangeListener()) {
this.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
- if (uiObserverListener == null) {
- return;
- }
- if (globalNameListener != null && shouldResponseNameListener()) {
- globalNameListener.setGlobalName(checkboxName);
- }
- uiObserverListener.doChange();
+ attributeChange();
}
});
}
}
+ protected void attributeChange() {
+ if (uiObserverListener == null) {
+ return;
+ }
+ if (globalNameListener != null && shouldResponseNameListener()) {
+ globalNameListener.setGlobalName(checkboxName);
+ }
+ uiObserverListener.doChange();
+ }
+
/**
* 给组件登记一个观察者监听事件
*
@@ -185,14 +197,18 @@ public class UICheckBox extends JCheckBox implements UIObserver, GlobalNameObser
if (v != null) {
v.paint(g, textRect);
} else {
- int mnemIndex = b.getDisplayedMnemonicIndex();
+
if (model.isEnabled()) {
g.setColor(b.getForeground());
} else {
g.setColor(getDisabledTextColor());
}
- SwingUtilities2.drawStringUnderlineCharAt(c, g, text,
- mnemIndex, textRect.x, textRect.y + fm.getAscent());
+ if (markMnemonic) {
+ SwingUtilities2.drawStringUnderlineCharAt(c, g, text,
+ b.getDisplayedMnemonicIndex(), textRect.x, textRect.y + fm.getAscent());
+ } else {
+ SwingUtilities2.drawString(c, g, text, textRect.x, textRect.y + fm.getAscent());
+ }
}
}
}
diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/ComboCheckBox.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/ComboCheckBox.java
index 31290d6b05..3a0be4a8ff 100644
--- a/designer-base/src/main/java/com/fr/design/gui/icombobox/ComboCheckBox.java
+++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/ComboCheckBox.java
@@ -77,8 +77,8 @@ public class ComboCheckBox extends UIComboBox {
protected ComboCheckBox comboBox;
protected JScrollPane scrollPane;
- protected MouseListener mouseListener;
- protected MouseMotionListener mouseMotionListener;
+ protected MouseListener checkListMouseListener;
+ protected MouseMotionListener checkListMouseMotionListener;
public CheckListPopup(JComboBox comboBox) {
this.comboBox = (ComboCheckBox) comboBox;
@@ -157,22 +157,22 @@ public class ComboCheckBox extends UIComboBox {
@Override
public MouseListener getMouseListener() {
- if (mouseListener == null) {
- mouseListener = new InvocationMouseHandler();
+ if (checkListMouseListener == null) {
+ checkListMouseListener = new InvocationMouseHandler();
}
- return mouseListener;
+ return checkListMouseListener;
}
public MouseMotionListener getMouseMotionListener() {
- if (mouseMotionListener == null) {
- mouseMotionListener = new MouseMotionAdapter() {
+ if (checkListMouseMotionListener == null) {
+ checkListMouseMotionListener = new MouseMotionAdapter() {
};
}
- return mouseMotionListener;
+ return checkListMouseMotionListener;
}
public void uninstallingUI() {
-
+ // do nothing
}
protected class InvocationMouseHandler extends MouseAdapter {
diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/FRTreeComboBox.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/FRTreeComboBox.java
index ae2e6b52d8..a7a9133351 100644
--- a/designer-base/src/main/java/com/fr/design/gui/icombobox/FRTreeComboBox.java
+++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/FRTreeComboBox.java
@@ -1,22 +1,14 @@
package com.fr.design.gui.icombobox;
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.IllegalComponentStateException;
-import java.awt.RenderingHints;
-import java.awt.event.KeyAdapter;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionAdapter;
-import java.awt.event.MouseMotionListener;
-import java.util.Enumeration;
+import com.fr.design.constants.UIConstants;
+import com.fr.design.gui.ibutton.UIButton;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.gui.itextfield.UITextField;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.general.ComparatorUtils;
+import com.fr.general.NameObject;
+import com.fr.stable.Constants;
+import com.fr.stable.StringUtils;
import javax.swing.BorderFactory;
import javax.swing.DefaultListCellRenderer;
@@ -38,16 +30,23 @@ import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
-
-import com.fr.design.constants.UIConstants;
-import com.fr.design.gui.ibutton.UIButton;
-import com.fr.design.gui.ilable.UILabel;
-import com.fr.design.gui.itextfield.UITextField;
-import com.fr.design.layout.FRGUIPaneFactory;
-import com.fr.general.ComparatorUtils;
-import com.fr.general.NameObject;
-import com.fr.stable.Constants;
-import com.fr.stable.StringUtils;
+import java.util.Enumeration;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.IllegalComponentStateException;
+import java.awt.RenderingHints;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionAdapter;
+import java.awt.event.MouseMotionListener;
public class FRTreeComboBox extends UIComboBox {
@@ -79,7 +78,7 @@ public class FRTreeComboBox extends UIComboBox {
boolean showRoot, boolean editable) {
this.setTree(tree);
this.tree.setCellRenderer(renderer);
- this.setEditor(new FrTreeSearchComboBoxEditor(this));
+ this.setEditor(createEditor());
if (!showRoot) {
tree.expandPath(new TreePath(tree.getModel().getRoot()));
tree.setRootVisible(false);
@@ -101,6 +100,10 @@ public class FRTreeComboBox extends UIComboBox {
return true;
}
+ protected UIComboBoxEditor createEditor() {
+ return new FrTreeSearchComboBoxEditor(this);
+ }
+
public void setTree(JTree tree) {
this.tree = tree;
if (tree != null) {
@@ -318,6 +321,7 @@ public class FRTreeComboBox extends UIComboBox {
@Override
public void mouseClicked(MouseEvent e) {
+ // do nothing
}
@Override
@@ -528,7 +532,7 @@ public class FRTreeComboBox extends UIComboBox {
}
}
- class FrTreeSearchComboBoxEditor extends UIComboBoxEditor implements DocumentListener {
+ public class FrTreeSearchComboBoxEditor extends UIComboBoxEditor implements DocumentListener {
private volatile boolean setting = false;
private FRTreeComboBox comboBox;
private Object item;
diff --git a/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UICheckListPopup.java b/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UICheckListPopup.java
index b0b57f29c3..3eed2d799d 100644
--- a/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UICheckListPopup.java
+++ b/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UICheckListPopup.java
@@ -11,6 +11,10 @@ import com.fr.general.IOUtils;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
@@ -22,10 +26,6 @@ import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
public class UICheckListPopup extends UIPopupMenu {
private List listeners = new ArrayList();
@@ -36,14 +36,20 @@ public class UICheckListPopup extends UIPopupMenu {
private UIScrollPane jScrollPane;
private Color mouseEnteredColor = UIConstants.CHECKBOX_HOVER_SELECTED;
private int maxDisplayNumber = 8;
+ private boolean supportSelectAll = true;
public static final String COMMIT_EVENT = "commit";
- public static final String SELECT_ALL = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Choose_All");
+ private static final String SELECT_ALL = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Choose_All");
private static final int CHECKBOX_HEIGHT = 25;
- public UICheckListPopup(Object[] value) {
+ public UICheckListPopup(Object[] values) {
+ this(values, true);
+ }
+
+ public UICheckListPopup(Object[] value, boolean supportSelectAll) {
super();
values = value;
+ this.supportSelectAll = supportSelectAll;
initComponent();
}
@@ -53,7 +59,7 @@ public class UICheckListPopup extends UIPopupMenu {
public void setMaxDisplayNumber(int maxDisplayNumber) {
this.maxDisplayNumber = maxDisplayNumber;
- addCheckboxValues(values);
+ addCheckboxValues();
}
private void initComponent() {
@@ -65,16 +71,23 @@ public class UICheckListPopup extends UIPopupMenu {
this.setLayout(new BorderLayout());
this.add(jScrollPane, BorderLayout.CENTER);
- addCheckboxValues(values);
+ addCheckboxValues();
+ }
+
+ public void refreshCheckboxValues(Object[] values){
+ this.values = values;
+ addCheckboxValues();
}
- public void addCheckboxValues(Object[] value) {
+ private void addCheckboxValues() {
checkboxPane.removeAll();
checkBoxList.clear();
//全选加在第一个位置
- addOneCheckValue(SELECT_ALL);
- for (Object checkValue : value) {
+ if (supportSelectAll) {
+ addOneCheckValue(SELECT_ALL);
+ }
+ for (Object checkValue : values) {
addOneCheckValue(checkValue);
}
addSelectListener();
@@ -146,7 +159,7 @@ public class UICheckListPopup extends UIPopupMenu {
private void addSelectListener() {
for (int i = 0; i < checkBoxList.size(); i++) {
JCheckBox checkBox = checkBoxList.get(i);
- if (i == 0) {
+ if (supportSelectAll && i == 0) {
checkBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
@@ -184,7 +197,8 @@ public class UICheckListPopup extends UIPopupMenu {
List