diff --git a/designer-base/src/main/java/com/fr/design/DesignModelAdapter.java b/designer-base/src/main/java/com/fr/design/DesignModelAdapter.java
index 251ee7af8..4ebc64103 100644
--- a/designer-base/src/main/java/com/fr/design/DesignModelAdapter.java
+++ b/designer-base/src/main/java/com/fr/design/DesignModelAdapter.java
@@ -3,6 +3,8 @@ package com.fr.design;
import com.fr.base.Parameter;
import com.fr.base.io.BaseBook;
import com.fr.data.TableDataSource;
+import com.fr.design.file.HistoryTemplateListCache;
+import com.fr.design.mainframe.DesignerFrameFileDealerPane;
import com.fr.design.mainframe.JTemplate;
import com.fr.design.mainframe.JTemplateProvider;
import com.fr.form.ui.Widget;
@@ -14,68 +16,159 @@ import java.util.List;
import java.util.Map;
/**
- * 当前的设计器模式
+ * 设计器模式 FormModel or WorkBookModel
+ *
+ * 指的是编辑的模板是普通报表还是决策报表
*
* @author zhou
* @since 2012-7-26上午11:24:54
*/
-public abstract class DesignModelAdapter {
+public abstract class DesignModelAdapter> {
+ /**
+ * 当前的设计模式 FormModel or WorkBookModel
+ */
private static DesignModelAdapter, ?> currentModelAdapter;
+ /**
+ * 模板
+ */
protected S jTemplate;
+ /**
+ * 全部的参数,包括全局参数,模板参数和数据集参数
+ */
+ private Parameter[] parameters;
+
+ /**
+ * 数据集参数
+ */
+ private Parameter[] tableDataParameters;
+
+ /**
+ * 模板参数
+ */
+ private Parameter[] templateParameters;
+
+
public DesignModelAdapter(S jTemplate) {
this.jTemplate = jTemplate;
- setCurrentModelAdapter(this);
+ updateCachedParameter();
+ setCurrentModelAdapter(this);
+ }
+
+ public static void setCurrentModelAdapter(DesignModelAdapter, ?> model) {
+ currentModelAdapter = model;
+ }
+
+ public static DesignModelAdapter, ?> getCurrentModelAdapter() {
+ return currentModelAdapter;
}
+ /**
+ * 获取当前编辑的模板
+ *
+ * @return template
+ * @see DesignerFrameFileDealerPane#setCurrentEditingTemplate(JTemplate)
+ * @see HistoryTemplateListCache#getCurrentEditingTemplate()
+ * @deprecated use {@link HistoryTemplateListCache#setCurrentEditingTemplate(JTemplate)} instead
+ */
+ @Deprecated
public S getjTemplate() {
return jTemplate;
}
+ /**
+ * 设置当前编辑的模板
+ * 不要脱离上下文直接调用
+ *
+ * @param jTemplate jt
+ * @see DesignerFrameFileDealerPane#setCurrentEditingTemplate(JTemplate)
+ * @deprecated use {@link HistoryTemplateListCache#setCurrentEditingTemplate(JTemplate)} instead
+ */
+ @Deprecated
public void setjTemplate(S jTemplate) {
this.jTemplate = jTemplate;
}
public T getBook() {
- return (T) ((JTemplate) jTemplate).getTarget();
+ return jTemplate.getTarget();
}
- public static void setCurrentModelAdapter(DesignModelAdapter, ?> model) {
- currentModelAdapter = model;
- }
-
- public static DesignModelAdapter, ?> getCurrentModelAdapter() {
- return currentModelAdapter;
- }
/**
- * 响应目标改变事件.
+ * 响应正在编辑的模板改变事件.
*/
public void fireTargetModified() {
- ((JTemplate) this.jTemplate).fireTargetModified();
+ this.jTemplate.fireTargetModified();
}
+ /**
+ * 获取悬浮元素名称数组
+ *
+ * @return String[] 悬浮元素名称数组
+ */
public String[] getFloatNames() {
return new String[0];
}
+ /**
+ * 获取编辑模板的所有参数
+ *
+ * 由于在参数面板拖动过程中频繁获取
+ * 远程设计时数据集参数rpc 调用需要考虑网络等因素,因此会比较缓慢,引起参数面板拖动卡顿,
+ * 所以缓存一下,并且在参数改动时及时缓存
+ *
+ * @return Parameter[] 模板的所有参数
+ */
public Parameter[] getParameters() {
- return new Parameter[0];
+ return parameters == null ? new Parameter[0] : parameters;
}
- // 报表参数
+ /**
+ * 模板参数(报表参数)
+ *
+ * 既然全部参数都,那么这个也缓存一下,并且在参数改动时及时缓存
+ *
+ * @return Parameter[] 模板参数
+ * @deprecated use {@link DesignModelAdapter#getTemplateParameters()} instead
+ */
+ @Deprecated
public Parameter[] getReportParameters() {
- return new Parameter[0];
+ return getTableDataParameters();
+ }
+
+ /**
+ * 模板参数(报表参数)
+ *
+ * 既然全部参数都,那么这个也缓存一下,并且在参数改动时及时缓存
+ *
+ * @return Parameter[] 模板参数
+ */
+ public Parameter[] getTemplateParameters() {
+ return templateParameters == null ? new Parameter[0] : templateParameters;
}
/**
* 数据源参数
+ *
+ * 既然全部参数都,那么这个也缓存一下,并且在参数改动时及时缓存
*
- * @return
+ * @return Parameter[] 数据源参数
*/
public Parameter[] getTableDataParameters() {
- return new Parameter[0];
+ return tableDataParameters == null ? new Parameter[0] : tableDataParameters;
+ }
+
+
+ /**
+ * 重命名TableData后的一些操作
+ *
+ * @param oldName 旧名字
+ * @param newName 新名字.
+ * @return 返回是否名字一样.
+ */
+ public boolean renameTableData(String oldName, String newName) {
+ return renameTableData(oldName, newName, true);
}
/**
@@ -101,17 +194,6 @@ public abstract class DesignModelAdapter getWidgetsName();
+ /**
+ * 更新缓存的参数
+ */
+ public void updateCachedParameter() {
+ // 全部参数
+ this.parameters = getLatestParameters();
+ // 数据及参数
+ this.tableDataParameters = getLatestTableDataParameters();
+ // 模板参数
+ this.templateParameters = getLatestTemplateParameters();
+
+ }
+
/**
* 环境改变.
*/
@@ -146,4 +241,19 @@ public abstract class DesignModelAdapter());
if (WorkContext.getCurrent().isLocal()) {
//初始化一下serverTray
@@ -138,6 +151,50 @@ public class EnvChangeEntrance {
return true;
}
+ /**
+ * 切换远程环境之前,进行版本检测,当版本不一致的时候,提示。
+ * 当用户确认选择 ok 时,才继续。
+ *
+ * @param selectedEnv 选择的环境
+ * @return 是否一致
+ * 1. 非远程环境 , 返回 true
+ * 2. 远程环境
+ * 2.1 不匹配,
+ * 2.1.1 当选择 ok , 返回 true
+ * 2.1.2 当选择 no, 返回 false
+ * 2.2 匹配, 返回 true
+ * @throws Exception 异常
+ */
+ private boolean versionCheckAndConfirm(DesignerWorkspaceInfo selectedEnv) throws Exception {
+
+ if (selectedEnv.getType() == DesignerWorkspaceType.Remote) {
+
+ WorkspaceConnectionInfo info = selectedEnv.getConnection();
+ String serverVersion = new FunctionalHttpRequest(info).getServerVersion();
+
+ if (AssistUtils.equals(serverVersion, WorkContext.getVersion())) {
+ return true;
+ }
+
+ final List result = new ArrayList<>(1);
+ PopTipStrategy.NOW.showTip(new PopTip() {
+ @Override
+ public void show() {
+ String[] option = {Toolkit.i18nText("Fine-Design_Report_Yes"), Toolkit.i18nText("Fine-Design_Report_No")};
+ int choice = JOptionPane.showOptionDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Version_Inconsistency"),
+ UIManager.getString("OptionPane.messageDialogTitle"), JOptionPane.YES_NO_OPTION, QUESTION_MESSAGE, UIManager.getIcon("OptionPane.warningIcon"), option, 1);
+ result.add(choice);
+ }
+ });
+
+ // 只有选择 yes , 这里的值才为 0, 返回 true
+ // 否着返回 false, 将不进行下面的连接操作。
+ return result.size() != 0 && result.get(0) == 0;
+ }
+
+ return true;
+ }
+
/**
* 编辑items
*
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 4d9c976ce..536fc87ee 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
@@ -9,9 +9,9 @@ import com.fr.design.mainframe.JTemplate;
import com.fr.exception.RemoteDesignPermissionDeniedException;
import com.fr.file.FILE;
import com.fr.file.FILEChooserPane;
-import com.fr.io.exporter.ExporterKey;
import com.fr.file.filter.ChooseFileFilter;
import com.fr.io.exporter.DesignExportType;
+import com.fr.io.exporter.ExporterKey;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.ProductConstants;
import com.fr.stable.StringUtils;
@@ -178,7 +178,7 @@ public abstract class AbstractExportAction> extends JT
JOptionPane.showMessageDialog(
DesignerContext.getDesignerFrame(),
Toolkit.i18nText("Fine-Engine_Remote_Design_Permission_Denied"),
- null,
+ UIManager.getString("OptionPane.messageDialogTitle"),
JOptionPane.ERROR_MESSAGE,
UIManager.getIcon("OptionPane.errorIcon")
);
@@ -189,7 +189,7 @@ public abstract class AbstractExportAction> extends JT
JOptionPane.showMessageDialog(
DesignerContext.getDesignerFrame(),
Toolkit.i18nText("Fine-Design_Report_Export_Failed") + "\n" + path,
- null,
+ UIManager.getString("OptionPane.messageDialogTitle"),
JOptionPane.ERROR_MESSAGE,
UIManager.getIcon("OptionPane.errorIcon")
);
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 36fa874cc..193c35775 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
@@ -121,7 +121,7 @@ public abstract class LiteConditionPane extends BasicBeanPa
JoinCondition newJoinCondition = new JoinCondition(andRadioButton.isSelected() ? DataConstants.AND : DataConstants.OR, liteCondition);
ExpandMutableTreeNode parentTreeNode = getParentTreeNode();
- boolean result = isExistedInParentTreeNode(parentTreeNode, newJoinCondition);
+ boolean result = isExistedInParentTreeNode(parentTreeNode, liteCondition, false);
if (result) {
JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(LiteConditionPane.this),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_BindColumn_This_Condition_Has_Been_Existed"));
@@ -162,7 +162,7 @@ public abstract class LiteConditionPane extends BasicBeanPa
@Override
public void mouseExited(MouseEvent evt) {
- GUICoreUtils.setEnabled(conditionCardPane, conditionCardPane.isEnabled());
+ GUICoreUtils.setEnabled(conditionCardPane, conditionCardPane.isEnabled());
}
};
@@ -596,6 +596,8 @@ public abstract class LiteConditionPane extends BasicBeanPa
oldJoinCondition.setJoin(andRadioButton.isSelected() ? DataConstants.AND : DataConstants.OR);
Condition oldLiteCondition = oldJoinCondition.getCondition();
+ DefaultTreeModel defaultTreeModel = (DefaultTreeModel) conditionsTree.getModel();
+ ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent();
// peter:如果当前选中的是ListCondition,只要改变Join为AND或者OR,直接返回.
if (oldLiteCondition != null && !(oldLiteCondition instanceof ListCondition)) {
// peter:先获得当前的LiteCondition.
@@ -605,13 +607,18 @@ public abstract class LiteConditionPane extends BasicBeanPa
} else {
liteCondition = new FormulaCondition(formulaTextArea.getText());
}
+ //修改的时候加入判断条件重复 REPORT-13441
+ boolean result = isExistedInParentTreeNode(parentTreeNode, liteCondition, true);
+ if (result) {
+ JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(LiteConditionPane.this),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_BindColumn_This_Condition_Has_Been_Existed"));
+ return;
+ }
oldJoinCondition.setCondition(liteCondition);
}
// peter:需要reload parent
- DefaultTreeModel defaultTreeModel = (DefaultTreeModel) conditionsTree.getModel();
- ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent();
defaultTreeModel.reload(parentTreeNode);
parentTreeNode.expandCurrentTreeNode(conditionsTree);
conditionsTree.setSelectionPath(GUICoreUtils.getTreePath(selectedTreeNode));
@@ -745,22 +752,31 @@ public abstract class LiteConditionPane extends BasicBeanPa
return parentTreeNode;
}
- private boolean isExistedInParentTreeNode(ExpandMutableTreeNode parentTreeNode, JoinCondition newJoinCondition) {
+ private boolean isExistedInParentTreeNode(ExpandMutableTreeNode parentTreeNode, Condition liteCondition, boolean isModify) {
if (parentTreeNode == null) {
return false;
}
JoinCondition parentJoinCondition = (JoinCondition) parentTreeNode.getUserObject();
Condition parentLiteCondition = parentJoinCondition.getCondition();
+ Object oldJoinCondition = null;
+ //获取当前选中的条件用于修改判断
+ TreePath selectedTreePath = conditionsTree.getSelectionPath();
+ if (selectedTreePath != null) {
+ ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent();
+ oldJoinCondition = selectedTreeNode.getUserObject();
+ }
if (parentLiteCondition instanceof ListCondition) {
// peter:在添加UserObject的节点.
for (int i = 0; i < parentTreeNode.getChildCount(); i++) {
ExpandMutableTreeNode tempTreeNode = (ExpandMutableTreeNode) parentTreeNode.getChildAt(i);
Object tempObject = tempTreeNode.getUserObject();
- if (tempObject instanceof JoinCondition) {
+ //修改的时候需要排除所选条件,和其他条件比较。增加的时候全盘比较
+ if (tempObject instanceof JoinCondition && isModify ? (!tempObject.equals(oldJoinCondition)) : true) {
JoinCondition tempJoinCondition = (JoinCondition) tempObject;
- if (ComparatorUtils.equals(tempJoinCondition, newJoinCondition)) {
+ //条件内容一样就视为相同条件,join类型无关
+ if (ComparatorUtils.equals(tempJoinCondition.getCondition(), liteCondition)) {
return true;
}
}
@@ -941,7 +957,7 @@ public abstract class LiteConditionPane extends BasicBeanPa
@Override
public Condition updateBean() {
// Samuel:先按modifybutton
- modify();
+ //modify(); REPORT-13442 需要点修改按钮才能修改
// peter: 先删除所有的节点
DefaultTreeModel defaultTreeModel = (DefaultTreeModel) this.conditionsTree.getModel();
ExpandMutableTreeNode rootTreeNode = (ExpandMutableTreeNode) defaultTreeModel.getRoot();
@@ -963,9 +979,9 @@ public abstract class LiteConditionPane extends BasicBeanPa
JoinCondition joinCondition = (JoinCondition) rootTreeNode.getUserObject();
Condition newCondition = joinCondition.getCondition();
//clone(),防止多个条件分组使用同一个condition对象
- try{
- newCondition = (Condition)joinCondition.getCondition().clone();
- }catch (CloneNotSupportedException e){
+ try {
+ newCondition = (Condition) joinCondition.getCondition().clone();
+ } catch (CloneNotSupportedException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
return newCondition;
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 ec1f69d98..fc5e8b54f 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
@@ -4,6 +4,7 @@ import com.fr.base.FRContext;
import com.fr.base.StoreProcedureParameter;
import com.fr.base.TableData;
import com.fr.data.TableDataSource;
+import com.fr.data.TableDataSourceTailor;
import com.fr.data.core.DataCoreXmlUtils;
import com.fr.data.impl.EmbeddedTableData;
import com.fr.data.impl.storeproc.ProcedureDataModel;
@@ -444,7 +445,7 @@ public abstract class DesignTableDataManager {
parameter.setValue(parameterMap.get(parameter.getName()));
}
}
- return DataOperator.getInstance().previewTableData(tableDataSource, tabledata, parameterMap, rowCount);
+ return DataOperator.getInstance().previewTableData(TableDataSourceTailor.extractTableData(tableDataSource), tabledata, parameterMap, rowCount);
} catch (Exception e) {
throw new TableDataException(e.getMessage(), e);
} finally {
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java
index 0f52a4c5c..fc666f15f 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java
@@ -17,6 +17,7 @@ import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.ArrayUtils;
import com.fr.stable.EncodeConstants;
+import com.fr.stable.StringUtils;
import javax.swing.*;
import java.awt.*;
@@ -36,8 +37,8 @@ public abstract class DatabaseConnectionPane contextHashtable = jndiDatabase.getContextHashtable();
+ Map contextHashtable = jndiDatabase.getContextHashtable();
Object INITIAL_CONTEXT_FACTORY = contextHashtable.get(Context.INITIAL_CONTEXT_FACTORY);
this.JNDIFactoryComboBox.setSelectedItem(INITIAL_CONTEXT_FACTORY == null ? "" : INITIAL_CONTEXT_FACTORY);
@@ -148,7 +148,7 @@ public class JNDIDefPane extends JPanel {
populateContextAttributes(contextHashtable, this.APPLET_TF, Context.APPLET);
}
- private void populateContextAttributes(Hashtable properties, UITextField textField, String contextAttr) {
+ private void populateContextAttributes(Map properties, UITextField textField, String contextAttr) {
String PROVIDER_URL = properties.get(contextAttr);
if (PROVIDER_URL != null) {
textField.setText(PROVIDER_URL);
@@ -160,7 +160,7 @@ public class JNDIDefPane extends JPanel {
jndiDatabase.setJNDIName(this.jndiNameTextField.getText());
- Hashtable contextHashtable = jndiDatabase.getContextHashtable();
+ Map contextHashtable = jndiDatabase.getContextHashtable();
String factoryString = (String)this.JNDIFactoryComboBox.getEditor().getItem();
if (factoryString != null && factoryString.trim().length() > 0) {
@@ -186,7 +186,7 @@ public class JNDIDefPane extends JPanel {
return jndiDatabase;
}
- private void updateContextAttributes(Hashtable contextHashtable, UITextField textField, String contextAttr) {
+ private void updateContextAttributes(Map contextHashtable, UITextField textField, String contextAttr) {
String tValue = textField.getText();
if (tValue != null && tValue.trim().length() > 0) {
contextHashtable.put(contextAttr, tValue);
diff --git a/designer-base/src/main/java/com/fr/design/designer/TargetComponent.java b/designer-base/src/main/java/com/fr/design/designer/TargetComponent.java
index 5556a6605..30ed7e66e 100644
--- a/designer-base/src/main/java/com/fr/design/designer/TargetComponent.java
+++ b/designer-base/src/main/java/com/fr/design/designer/TargetComponent.java
@@ -3,6 +3,7 @@ package com.fr.design.designer;
import com.fr.design.event.TargetModifiedEvent;
import com.fr.design.event.TargetModifiedListener;
import com.fr.design.mainframe.AuthorityEditPane;
+import com.fr.design.mainframe.JTemplateProvider;
import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus;
import com.fr.design.menu.MenuDef;
import com.fr.design.menu.ShortCut;
@@ -15,7 +16,7 @@ import javax.swing.JPanel;
/**
* 模板设计界面
*/
-public abstract class TargetComponent extends JComponent {
+public abstract class TargetComponent extends JComponent implements JTemplateProvider {
private T target;
public TargetComponent(T t) {
@@ -34,6 +35,7 @@ public abstract class TargetComponent extends JComponent {
public abstract void stopEditing();
+ @Override
public T getTarget() {
return target;
}
@@ -82,6 +84,7 @@ public abstract class TargetComponent extends JComponent {
/**
* Fire template modified listeners.
*/
+ @Override
public void fireTargetModified() {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
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 903418ec9..02a51ad3f 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
@@ -104,7 +104,7 @@ public class PluginWebBridge {
for (String key : keySet) {
jsonObject.put(key, config.get(key).toString());
}
- } catch (JSONException e) {
+ } catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
return jsonObject.toString();
@@ -349,7 +349,7 @@ public class PluginWebBridge {
try {
Task task = new PluginTask<>(webEngine, callback, new GetPluginFromStoreExecutor(new JSONObject(info)));
threadPoolExecutor.submit(task);
- } catch (JSONException e) {
+ } catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginsReaderFromStore.java b/designer-base/src/main/java/com/fr/design/extra/PluginsReaderFromStore.java
index 8895e83e4..66341be1a 100644
--- a/designer-base/src/main/java/com/fr/design/extra/PluginsReaderFromStore.java
+++ b/designer-base/src/main/java/com/fr/design/extra/PluginsReaderFromStore.java
@@ -74,7 +74,7 @@ public class PluginsReaderFromStore {
plugins.add(pluginView);
}
}
- } catch (JSONException e) {
+ } catch (Exception e) {
throw new Exception(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Read_Plugin_List_Error"));
}
}
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 b73805ee6..a84442c58 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
@@ -1,10 +1,14 @@
package com.fr.design.file;
import com.fr.base.chart.chartdata.CallbackEvent;
+import com.fr.base.io.BaseBook;
+import com.fr.base.io.IOFile;
import com.fr.design.DesignerEnvManager;
+import com.fr.design.base.mode.DesignModeContext;
import com.fr.design.data.DesignTableDataManager;
import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
+import com.fr.design.mainframe.DesignerFrameFileDealerPane;
import com.fr.design.mainframe.JTemplate;
import com.fr.design.mainframe.JVirtualTemplate;
import com.fr.design.module.DesignModuleFactory;
@@ -16,10 +20,14 @@ import com.fr.stable.CoreConstants;
import com.fr.stable.StringUtils;
import com.fr.third.org.apache.commons.io.FilenameUtils;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
+import java.util.Map;
/**
* 历史模板缓存
@@ -58,6 +66,10 @@ public class HistoryTemplateListCache implements CallbackEvent {
public void closeSelectedReport(JTemplate, ?> selected) {
DesignModuleFactory.clearChartPropertyPane();
DesignTableDataManager.closeTemplate(selected);
+ //直接关闭模板的时候退出权限编辑
+ if (DesignModeContext.isAuthorityEditing()) {
+ DesignerContext.getDesignerFrame().closeAuthorityEditing();
+ }
if (contains(selected) == -1) {
return;
}
@@ -99,6 +111,10 @@ public class HistoryTemplateListCache implements CallbackEvent {
return this.editingTemplate;
}
+ /**
+ * @param jt jt
+ * @see DesignerFrameFileDealerPane#setCurrentEditingTemplate(JTemplate)
+ */
public void setCurrentEditingTemplate(JTemplate, ?> jt) {
this.editingTemplate = jt;
//如果当前历史面板中没有
@@ -178,10 +194,13 @@ public class HistoryTemplateListCache implements CallbackEvent {
/**
* 判断是否打开过该模板
+ * 由于切换环境不会关闭模板,可能存在同名的模板,所以该方法不能准确找到所选的模板,
*
* @param filename 文件名
* @return 文件位置
+ * @deprecated use HistoryTemplateListCache#contains(com.fr.design.mainframe.JTemplate) instead
*/
+ @Deprecated
public int contains(String filename) {
for (int i = 0; i < historyList.size(); i++) {
String historyPath = historyList.get(i).getPath();
@@ -292,4 +311,77 @@ public class HistoryTemplateListCache implements CallbackEvent {
}
return true;
}
+
+ /**
+ * 切换环境时暂存打开的模板内容,key 是在历史中的index,value 是模板xml 内容byte[]
+ */
+ private Map bytesMap;
+
+ /**
+ * 切换环境前将正在编辑的模板暂存起来,并且在新环境中重新读取一遍,暂存的不是模板文件的内容而是模板对象的内容
+ *
+ * 防止新环境加载到的同名 Class 和模板对象中的 Class 不一致,在新环境存储失败
+ *
+ * @see HistoryTemplateListCache#load()
+ */
+ public void stash() {
+ FineLoggerFactory.getLogger().info("Env Change Template Stashing...");
+ if (bytesMap == null) {
+ bytesMap = new HashMap();
+ } else {
+ bytesMap.clear();
+ }
+ int size = historyList.size();
+ for (int i = 0; i < size; i++) {
+ JTemplate, ?> template = historyList.get(i);
+ try {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ BaseBook target = template.getTarget();
+ if (target != null) {
+ target.export(outputStream);
+ bytesMap.put(i, outputStream.toByteArray());
+ }
+ // 如果 target == null 那么这个模板是被模板内存优化功能处理过的,不用处理
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ }
+ FineLoggerFactory.getLogger().info("Env Change Template Stashed.");
+ }
+
+ /**
+ * 切换环境前将正在编辑的模板暂存起来后,在新环境重新读取一遍
+ *
+ * 防止新环境加载到的同名 Class 和模板对象中的 Class 不一致,在新环境存储失败
+ *
+ * @see HistoryTemplateListCache#stash()
+ */
+ public void load() {
+ FineLoggerFactory.getLogger().info("Env Change Template Loading...");
+ if (bytesMap != null && bytesMap.size() != 0) {
+ int size = historyList.size();
+ for (int i = 0; i < size; i++) {
+ try {
+ byte[] bytes = bytesMap.get(i);
+ // 可能有模板 stash 失败的情况,在 load 的时候不更新它
+ if (bytes == null) {
+ continue;
+ }
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
+ BaseBook target = historyList.get(i).getTarget();
+ if (target != null) {
+ // todo readStream 这个行为应该上升到 BaseBook 上
+ ((IOFile) target).readStream(inputStream);
+ }
+ // 如果 target == null 那么这个模板是被模板内存优化功能处理过的,不用处理
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ }
+ bytesMap.clear();
+ MutilTempalteTabPane.getInstance().refreshOpenedTemplate(historyList);
+ MutilTempalteTabPane.getInstance().repaint();
+ }
+ FineLoggerFactory.getLogger().info("Env Change Template Loaded.");
+ }
}
diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListPane.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListPane.java
index a51735f64..2dc56cc9d 100644
--- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListPane.java
+++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListPane.java
@@ -1,6 +1,7 @@
package com.fr.design.file;
import com.fr.base.chart.chartdata.CallbackEvent;
+import com.fr.design.mainframe.DesignerFrameFileDealerPane;
import com.fr.design.mainframe.JTemplate;
import com.fr.file.FILE;
import com.fr.file.FileNodeFILE;
@@ -60,6 +61,10 @@ public class HistoryTemplateListPane implements CallbackEvent {
return instead().getCurrentEditingTemplate();
}
+ /**
+ * @param jt jt
+ * @see DesignerFrameFileDealerPane#setCurrentEditingTemplate(JTemplate)
+ */
public void setCurrentEditingTemplate(JTemplate, ?> jt) {
instead().setCurrentEditingTemplate(jt);
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 b6f18a188..65989dfcc 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
@@ -18,7 +18,6 @@ import com.fr.log.FineLoggerFactory;
import com.fr.stable.Constants;
import com.fr.stable.ProductConstants;
import com.fr.third.javax.annotation.Nonnull;
-import com.fr.third.org.apache.commons.io.FilenameUtils;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.lock.TplOperator;
@@ -206,8 +205,7 @@ public class MutilTempalteTabPane extends JComponent {
openedTemplate.remove(jTemplate);
closeFormat(jTemplate);
HistoryTemplateListCache.getInstance().closeSelectedReport(jTemplate);
- // release lock
- WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(jTemplate.getPath());
+ closeAndFreeLock(jTemplate);
}
}
JTemplate, ?> currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
@@ -221,7 +219,6 @@ public class MutilTempalteTabPane extends JComponent {
if (openedTemplate.size() == 1) {
closeOther.setEnabled(false);
}
-
return closeOther;
}
@@ -676,9 +673,6 @@ public class MutilTempalteTabPane extends JComponent {
return;
}
- //当前激活的模板
- String filename = openedTemplate.get(selectedIndex).getPath();
- filename = FilenameUtils.standard(filename);
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() + "\" ?",
@@ -686,21 +680,29 @@ public class MutilTempalteTabPane extends JComponent {
if (returnVal == JOptionPane.YES_OPTION) {
specifiedTemplate.saveTemplate();
FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName()));
- closeTpl(specifiedTemplate, filename);
+ closeTpl(specifiedTemplate);
} else if (returnVal == JOptionPane.NO_OPTION) {
- closeTpl(specifiedTemplate, filename);
+ closeTpl(specifiedTemplate);
}
} else {
- closeTpl(specifiedTemplate, filename);
+ closeTpl(specifiedTemplate);
}
}
- private void closeTpl(@Nonnull JTemplate, ?> specifiedTemplate, @Nonnull String fileName) {
+ private void closeTpl(@Nonnull JTemplate, ?> specifiedTemplate) {
HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate);
- // release lock
- WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(specifiedTemplate.getPath());
- activeTemplate(fileName);
+ closeAndFreeLock(specifiedTemplate);
+ activePrevTemplateAfterClose();
+ }
+
+ private void closeAndFreeLock(@Nonnull JTemplate, ?> template) {
+ FILE file = template.getEditingFILE();
+ // 只有是环境内的文件,才执行释放锁
+ if (file != null && file.isEnvFile()) {
+ // release lock
+ WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(file.getPath());
+ }
}
/**
@@ -723,11 +725,9 @@ public class MutilTempalteTabPane extends JComponent {
}
/**
- * 关闭掉一个模板之后该激活的Tab
- *
- * @param fileName 关闭掉一个模板之后该激活的Tab的文件名,绝对路径
+ * 关闭掉一个模板之后激活新的待显示模板
*/
- private void activeTemplate(String fileName) {
+ private void activePrevTemplateAfterClose() {
if (openedTemplate.isEmpty()) {
//新建并激活模板
DesignerContext.getDesignerFrame().addAndActivateJTemplate();
@@ -736,23 +736,20 @@ public class MutilTempalteTabPane extends JComponent {
temTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
} else {
- //如果关闭的模板是当前选中的模板,则重新激活
- if (closeIconIndex == selectedIndex) {
- if (closeIconIndex == maxPaintIndex) {
+ // 如果关闭的模板是当前选中的模板,则重新激活当前 selectIndex 的模板;
+ // selectIndex 没有变化,但是对应的模板已经变成了前一张模板
+ if (closeIconIndex == selectedIndex || isCloseCurrent) {
+ // 如果 closeIconIndex 是最后一个被渲染画出的,那么预览上一个,防止数组越界
+ if (closeIconIndex >= maxPaintIndex) {
+ // selectIndex 不会 <0 因为如果关闭的是打开的最后一个模板,那么关闭之后 openedTemplate.isEmpty() = true
selectedIndex--;
}
- } else if (isCloseCurrent) {
- //不是通过关闭按钮,而是通过文件关闭菜单关闭的当前模板的,也重新激活
- if (selectedIndex > openedTemplate.size() - 1) {
- selectedIndex -= 1;
- if (selectedIndex < 0) {
- selectedIndex = 0;
- }
- isCloseCurrent = false;
- }
- } else {
- //如果关闭的模板不是当前选中的模板,则激活的模板不变
- selectedIndex = HistoryTemplateListCache.getInstance().contains(fileName);
+ isCloseCurrent = false;
+ }
+ // 如果关闭的模板不是当前选中的模板,那么重新获取一下当前模板的 index,激活该 index
+ else {
+ JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
+ selectedIndex = HistoryTemplateListCache.getInstance().contains(template);
}
//如果是已后台关闭的模板,则重新打开文件
openedTemplate.get(selectedIndex).activeOldJTemplate();
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 c2c69299d..bff2080e4 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
@@ -63,19 +63,19 @@ import java.util.Locale;
*/
public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
- protected VariableTreeAndDescriptionArea variableTreeAndDescriptionArea;
- protected RSyntaxTextArea formulaTextArea;
- protected UITextField keyWordTextField = new UITextField(18);
- protected int currentPosition = 0;
- protected int beginPosition = 0;
- protected int insertPosition = 0;
- protected JList tipsList;
+ private VariableTreeAndDescriptionArea variableTreeAndDescriptionArea;
+ private RSyntaxTextArea formulaTextArea;
+ private UITextField keyWordTextField = new UITextField(18);
+ private int currentPosition = 0;
+ private int beginPosition = 0;
+ private int insertPosition = 0;
+ private JList tipsList;
protected DefaultListModel listModel = new DefaultListModel();
- protected int ifHasBeenWriten = 0;
- protected DefaultListModel functionTypeListModel = new DefaultListModel();
- protected QuickList functionTypeList;
- protected DefaultListModel functionNameModel;
- protected JList functionNameList;
+ private int ifHasBeenWriten = 0;
+ private DefaultListModel functionTypeListModel = new DefaultListModel();
+ private QuickList functionTypeList;
+ private DefaultListModel functionNameModel;
+ private JList functionNameList;
public FormulaPane() {
initComponents();
@@ -184,6 +184,18 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
protected void initComponents() {
this.setLayout(new BorderLayout(4, 4));
+
+ initTextPane();
+ initTipsPane();
+ initVariableTreeAndDescriptionArea();
+ }
+
+ private void initVariableTreeAndDescriptionArea() {
+ variableTreeAndDescriptionArea = new VariableTreeAndDescriptionArea();
+ this.add(variableTreeAndDescriptionArea, BorderLayout.SOUTH);
+ }
+
+ private void initTextPane() {
// text
JPanel textPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
this.add(textPane, BorderLayout.CENTER);
@@ -199,7 +211,6 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
textPane.add(formulaTextAreaScrollPane, BorderLayout.CENTER);
textPane.add(checkBoxandbuttonPane, BorderLayout.SOUTH);
- initTipsPane();
UIButton checkValidButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Check_Valid"));
checkValidButton.addActionListener(checkValidActionListener);
@@ -209,8 +220,6 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
checkBoxandbuttonPane.add(checkBoxPane, BorderLayout.WEST);
checkBoxandbuttonPane.add(checkValidButton, BorderLayout.EAST);
extendCheckBoxPane(checkBoxPane);
- variableTreeAndDescriptionArea = new VariableTreeAndDescriptionArea();
- this.add(variableTreeAndDescriptionArea, BorderLayout.SOUTH);
}
@@ -218,7 +227,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
}
- protected void configFormulaArea() {
+ private void configFormulaArea() {
formulaTextArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_FORMULA);
formulaTextArea.setAnimateBracketMatching(true);
formulaTextArea.setAntiAliasingEnabled(true);
@@ -313,7 +322,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
}
}
- protected void fixFunctionNameList() {
+ private void fixFunctionNameList() {
if (tipsList.getSelectedValue() != null) {
int signOfContinue = 1;
int indexOfFunction = 0;
@@ -346,7 +355,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
}
- protected int getBeginPosition() {
+ private int getBeginPosition() {
int i = currentPosition;
String textArea = formulaTextArea.getText();
for (; i > 0; i--) {
@@ -361,7 +370,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
return i;
}
- protected void firstStepToFindTips(int theBeginPosition) {
+ private void firstStepToFindTips(int theBeginPosition) {
String textArea = formulaTextArea.getText();
if (currentPosition > 0 && theBeginPosition < currentPosition) {
@@ -443,7 +452,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
/**
* Apply text.
*/
- public void applyText(String text) {
+ private void applyText(String text) {
if (text == null || text.length() <= 0) {
return;
}
@@ -541,7 +550,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
}
// check valid
- protected ActionListener checkValidActionListener = new ActionListener() {
+ private ActionListener checkValidActionListener = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// Execute Formula default cell element.
@@ -579,7 +588,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
private JTree variablesTree;
private UITextArea descriptionTextArea;
- public VariableTreeAndDescriptionArea() {
+ VariableTreeAndDescriptionArea() {
this.initComponents();
}
@@ -802,13 +811,15 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
private void initComponents() {
this.setLayout(new BorderLayout(4, 4));
- // Function
+ initVariablesTree();
+ initFunctionPane();
+ }
+
+ private void initFunctionPane() {
JPanel functionPane = new JPanel(new BorderLayout(4, 4));
this.add(functionPane, BorderLayout.WEST);
initFunctionTypeList(functionPane);
initFunctionNameList(functionPane);
- initVariablesTree();
- // 选择:
functionTypeList.setSelectedIndex(0);
}
@@ -959,7 +970,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
private Icon icon;
private String[] subNodes = new String[0];
- public TextFolderUserObject(String text, Icon icon, String[] subNodes) {
+ TextFolderUserObject(String text, Icon icon, String[] subNodes) {
this.text = text;
this.icon = icon;
this.subNodes = subNodes;
@@ -986,11 +997,11 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
public static class TextUserObject {
- public TextUserObject(String text) {
+ TextUserObject(String text) {
this(text, text);
}
- public TextUserObject(String text, String displayText) {
+ TextUserObject(String text, String displayText) {
this.text = text;
this.displayText = displayText;
}
@@ -999,7 +1010,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
return this.text;
}
- public String getDisplayText() {
+ String getDisplayText() {
return this.displayText;
}
diff --git a/designer-base/src/main/java/com/fr/design/formula/FunctionConstants.java b/designer-base/src/main/java/com/fr/design/formula/FunctionConstants.java
index 4595b04ac..6e47237d8 100644
--- a/designer-base/src/main/java/com/fr/design/formula/FunctionConstants.java
+++ b/designer-base/src/main/java/com/fr/design/formula/FunctionConstants.java
@@ -12,7 +12,8 @@ import com.fr.function.RANGE;
import com.fr.function.SUM;
import com.fr.function.TIME;
import com.fr.general.ComparatorUtils;
-
+import com.fr.general.GeneralUtils;
+import com.fr.log.FineLoggerFactory;
import com.fr.plugin.ExtraClassManager;
import com.fr.stable.EncodeConstants;
import com.fr.stable.OperatingSystem;
@@ -23,20 +24,100 @@ import com.fr.stable.fun.mark.Mutable;
import com.fr.stable.script.Function;
import com.fr.stable.script.FunctionDef;
+import javax.swing.DefaultListModel;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
-import javax.swing.DefaultListModel;
+public final class FunctionConstants {
+
+ public static FunctionGroup PLUGIN = getPluginFunctionGroup();
+ public static FunctionGroup CUSTOM = getCustomFunctionGroup();
+ public static NameAndFunctionList COMMON = getCommonFunctionList();
+ public static NameAndTypeAndFunctionList[] EMBFUNCTIONS = getEmbededFunctionListArray();
+ public static FunctionGroup ALL = getAllFunctionGroup();
+
+ static {
+ loadEmbededFunctions();
+ }
-public abstract class FunctionConstants {
-
/**
+ * Don't let anyone instantiate this class.
+ */
+ private FunctionConstants() {}
+
+ private static void loadEmbededFunctions() {
+ String pkgName = "com.fr.function";
+ Class iface = Function.class;
+ ClassLoader classloader = iface.getClassLoader();
+ Enumeration urlEnumeration = null;
+ try {
+ urlEnumeration = classloader.getResources(pkgName.replace('.', '/'));
+ } catch (IOException e) {
+ FineLoggerFactory.getLogger().error(e.getMessage());
+ return;
+ }
+ while (urlEnumeration.hasMoreElements()) {
+ URL url = urlEnumeration.nextElement();
+ String classFilePath = url.getFile();
+ /*
+ * alex:url.getFile获取的地址中,如果有空格或中文会被URLEncoder.encode处理
+ * 会变成%20这种%打头的东西,但是new File的时候%20是无法解析成空格,所以在此需要做URLDecoder.decode处理
+ */
+ try {
+ classFilePath = URLDecoder.decode(classFilePath, EncodeConstants.ENCODING_UTF_8);
+ } catch (UnsupportedEncodingException e1) {
+ FRContext.getLogger().error(e1.getMessage(), e1);
+ }
+ FRContext.getLogger().info("ClassFilePath:" + classFilePath);
+ if (isCustomFormulaPath(classFilePath)) {
+ continue;
+ }
+ for (String fileName : findClassNamesUnderFilePath(classFilePath)) {
+ try {
+ Class> cls = Class.forName(pkgName + "." + fileName.substring(0, fileName.length() - 6));
+ if (StableUtils.classInstanceOf(cls, iface)) {
+ Function inst;
+ inst = (Function)cls.newInstance();
+ for (NameAndTypeAndFunctionList EMBFUNCTION : EMBFUNCTIONS) {
+ if (EMBFUNCTION.test(inst)) {
+ break;
+ }
+ }
+ }
+ } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ignore) {
+ } catch (Throwable e) {
+ // 不要因为个别公式加载失败,而导致整个函数面板无法启动
+ FineLoggerFactory.getLogger().error(e.getMessage());
+ }
+ }
+ }
+ }
+
+ private static boolean isCustomFormulaPath(String classFilePath) {
+ return !isJarPath(classFilePath) && isNotDebugMode();
+ }
+
+ private static boolean isNotDebugMode() {
+ return GeneralUtils.readBuildNO().contains("-");
+ }
+
+ private static boolean isJarPath(String classFilePath) {
+ return classFilePath.contains("!/");
+ }
+
+ /**
* 将函数分组插件中的函数添加到对应的列表中
* @param listModel
*/
@@ -74,107 +155,15 @@ public abstract class FunctionConstants {
}
};
}
-
- public static FunctionGroup PLUGIN = new FunctionGroup() {
- @Override
- public String getGroupName() {
- return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Base_Formula_Plugin");
- }
-
- @Override
- public NameAndDescription[] getDescriptions() {
- FunctionDef[] fs = ExtraClassManager.getInstance().getFunctionDef();
- int count = fs.length;
- FunctionDefNAD[] nads = new FunctionDefNAD[count];
- for (int i = 0; i < count; i ++) {
- nads[i] = new FunctionDefNAD(fs[i]);
- }
- return nads;
- }
- };
-
- public static FunctionGroup CUSTOM = new FunctionGroup() {
- @Override
- public String getGroupName() {
- return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Custom_Function");
- }
-
- @Override
- public NameAndDescription[] getDescriptions() {
- FunctionConfig funtionManager = FunctionConfig.getInstance();
- if (funtionManager != null) {
- int functionDefCount = funtionManager.getFunctionDefCount();
-
- FunctionDefNAD[] nads = new FunctionDefNAD[functionDefCount];
- for (int i = 0; i < functionDefCount; i++) {
- nads[i] = new FunctionDefNAD(funtionManager.getFunctionDef(i));
- }
-
- return nads;
- }
-
- return new NameAndDescription[0];
- }
- };
-
- public static NameAndFunctionList COMMON = new NameAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Most_Recently_Used"), new Function[] {
- new SUM(), new COUNT(), new AVERAGE(), new CHAR(), new DATE(), new MAX(), new MIN(), new TIME(), new RANGE()
- });
-
- public static NameAndTypeAndFunctionList[] EMBFUNCTIONS = new NameAndTypeAndFunctionList[] {
- new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Math_&_Trig"), Function.MATH),
- new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Text"), Function.TEXT),
- new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Date_&_Time"), Function.DATETIME),
- new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Logical"), Function.LOGIC),
- new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Array"), Function.ARRAY),
- new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Report"), Function.REPORT),
- new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Other"), Function.OTHER),
- new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Function_Type_Hierarchy"), Function.HA)
- };
-
- public static FunctionGroup ALL = new FunctionGroup() {
- @Override
- public String getGroupName() {
- return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_All");
- }
-
- @Override
- public NameAndDescription[] getDescriptions() {
- List all = new ArrayList();
- for (int i = 0; i < EMBFUNCTIONS.length; i++) {
- all.addAll(Arrays.asList(EMBFUNCTIONS[i].getDescriptions()));
- }
- Collections.addAll(all, PLUGIN.getDescriptions());
- Collections.addAll(all, CUSTOM.getDescriptions());
- //hugh:自定义函数分组
- Set containers = ExtraClassManager.getInstance().getArray(FunctionDefContainer.MARK_STRING);
- if(!containers.isEmpty()){
- for(Mutable container : containers){
- Collections.addAll(all,createFunctionGroup(((FunctionDefContainer)container)).getDescriptions());
- }
- }
- java.util.Collections.sort(all, NameAndDescriptionComparator);
-
- return all.toArray(new NameAndDescription[all.size()]);
- }
- };
-
- private static Comparator NameAndDescriptionComparator = new Comparator() {
- @Override
- public int compare(NameAndDescription o1, NameAndDescription o2) {
- return ComparatorUtils.compare(o1.getName(), o2.getName());
- }
- };
-
private static String[] findClassNamesUnderFilePath(String filePath) {
java.util.List classNameList = new ArrayList();
/*
* alex:如果是jar包中的class文件
* file:/D:/opt/FineReport6.5/WebReport/WEB-INF/lib/fr-server-6.5.jar!/com/fr/rpt/script/function
*/
- if (filePath.indexOf("!/") >= 0) {
+ if (isJarPath(filePath)) {
String[] arr = filePath.split("!/");
String jarPath = arr[0].substring(6); // alex:substring(6)去掉前面的file:/这六个字符
String classPath = arr[1];
@@ -197,7 +186,7 @@ public abstract class FunctionConstants {
}
String entryName = entry.getName();
- if (entryName.indexOf(classPath) < 0 || !entryName.endsWith(".class")) {
+ if (!entryName.contains(classPath) || !entryName.endsWith(".class")) {
continue;
}
@@ -208,57 +197,117 @@ public abstract class FunctionConstants {
}
} else {
File dir = new File(filePath);
-
- for (File f : dir.listFiles()) {
- String fileName = f.getName();
- if (fileName.endsWith(".class")) {
- classNameList.add(fileName);
+ File[] files = dir.listFiles();
+ if (files != null) {
+ for (File f : files) {
+ String fileName = f.getName();
+ if (fileName.endsWith(".class")) {
+ classNameList.add(fileName);
+ }
}
}
}
- return classNameList.toArray(new String[classNameList.size()]);
+ return classNameList.toArray(new String[0]);
}
-
- // alex:读取com.fr.script.function包下面所有的Function类
- static {
- String pkgName = "com.fr.function";
- Class iface = Function.class;
- ClassLoader classloader = iface.getClassLoader();
- URL url = classloader.getResource(pkgName.replace('.', '/'));
- String classFilePath = url.getFile();
-
- /*
- * alex:url.getFile获取的地址中,如果有空格或中文会被URLEncoder.encode处理
- * 会变成%20这种%打头的东西,但是new File的时候%20是无法解析成空格,所以在此需要做URLDecoder.decode处理
- */
- try {
- classFilePath = URLDecoder.decode(classFilePath, EncodeConstants.ENCODING_UTF_8);
- } catch (UnsupportedEncodingException e1) {
- FRContext.getLogger().error(e1.getMessage(), e1);
- }
- FRContext.getLogger().info("ClassFilePath:" + classFilePath);
- /*
- * alex:如果是jar包中的class文件
- * file:/D:/opt/FineReport6.5/WebReport/WEB-INF/lib/fr-server-6.5.jar!/com/fr/rpt/script/function
- */
- for (String fileName : findClassNamesUnderFilePath(classFilePath)) {
- try {
- Class> cls = Class.forName(pkgName + "." + fileName.substring(0, fileName.length() - 6));
- if (StableUtils.classInstanceOf(cls, iface)) {
- Function inst;
- inst = (Function)cls.newInstance();
- for (int fi = 0; fi < EMBFUNCTIONS.length; fi++) {
- if (EMBFUNCTIONS[fi].test(inst)) {
- break;
- }
+
+ private static FunctionGroup getPluginFunctionGroup() {
+ return new FunctionGroup() {
+ @Override
+ public String getGroupName() {
+ return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Base_Formula_Plugin");
+ }
+
+ @Override
+ public NameAndDescription[] getDescriptions() {
+ FunctionDef[] fs = ExtraClassManager.getInstance().getFunctionDef();
+ int count = fs.length;
+ FunctionDefNAD[] nads = new FunctionDefNAD[count];
+ for (int i = 0; i < count; i ++) {
+ nads[i] = new FunctionDefNAD(fs[i]);
+ }
+ return nads;
+ }
+ };
+ }
+
+ private static FunctionGroup getCustomFunctionGroup() {
+ return new FunctionGroup() {
+ @Override
+ public String getGroupName() {
+ return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Custom_Function");
+ }
+
+ @Override
+ public NameAndDescription[] getDescriptions() {
+ FunctionConfig funtionManager = FunctionConfig.getInstance();
+ if (funtionManager != null) {
+ int functionDefCount = funtionManager.getFunctionDefCount();
+
+ FunctionDefNAD[] nads = new FunctionDefNAD[functionDefCount];
+ for (int i = 0; i < functionDefCount; i++) {
+ nads[i] = new FunctionDefNAD(funtionManager.getFunctionDef(i));
}
-
+
+ return nads;
}
- } catch (ClassNotFoundException e) {
- } catch (InstantiationException e) {
- } catch (IllegalAccessException e) {
+
+ return new NameAndDescription[0];
}
- }
+ };
+ }
+
+ private static NameAndFunctionList getCommonFunctionList() {
+ return new NameAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Most_Recently_Used"), new Function[] {
+ new SUM(), new COUNT(), new AVERAGE(), new CHAR(), new DATE(), new MAX(), new MIN(), new TIME(), new RANGE()
+ });
+ }
+
+ private static NameAndTypeAndFunctionList[] getEmbededFunctionListArray() {
+ return new NameAndTypeAndFunctionList[] {
+ new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Math_&_Trig"), Function.MATH),
+ new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Text"), Function.TEXT),
+ new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Date_&_Time"), Function.DATETIME),
+ new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Logical"), Function.LOGIC),
+ new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Array"), Function.ARRAY),
+ new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Report"), Function.REPORT),
+ new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Other"), Function.OTHER),
+ new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Function_Type_Hierarchy"), Function.HA)
+ };
+ }
+
+ private static FunctionGroup getAllFunctionGroup() {
+ return new FunctionGroup() {
+ @Override
+ public String getGroupName() {
+ return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_All");
+ }
+
+ @Override
+ public NameAndDescription[] getDescriptions() {
+ List all = new ArrayList();
+ for (int i = 0; i < EMBFUNCTIONS.length; i++) {
+ all.addAll(Arrays.asList(EMBFUNCTIONS[i].getDescriptions()));
+ }
+ Collections.addAll(all, PLUGIN.getDescriptions());
+ Collections.addAll(all, CUSTOM.getDescriptions());
+ //hugh:自定义函数分组
+ Set containers = ExtraClassManager.getInstance().getArray(FunctionDefContainer.MARK_STRING);
+ if(!containers.isEmpty()){
+ for(Mutable container : containers){
+ Collections.addAll(all,createFunctionGroup(((FunctionDefContainer)container)).getDescriptions());
+ }
+ }
+
+ Collections.sort(all, new Comparator() {
+ @Override
+ public int compare(NameAndDescription o1, NameAndDescription o2) {
+ return ComparatorUtils.compare(o1.getName(), o2.getName());
+ }
+ });
+
+ return all.toArray(new NameAndDescription[0]);
+ }
+ };
}
}
diff --git a/designer-base/src/main/java/com/fr/design/fun/RightSelectionHandlerProvider.java b/designer-base/src/main/java/com/fr/design/fun/RightSelectionHandlerProvider.java
new file mode 100644
index 000000000..5e7d41423
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/RightSelectionHandlerProvider.java
@@ -0,0 +1,55 @@
+package com.fr.design.fun;
+
+import com.fr.design.actions.UpdateAction;
+import com.fr.design.designer.TargetComponent;
+import com.fr.design.gui.imenu.UIPopupMenu;
+import com.fr.design.mainframe.BaseFormDesigner;
+import com.fr.design.selection.SelectableElement;
+import com.fr.stable.fun.mark.Mutable;
+
+import java.util.List;
+
+/**
+ * 设计器右键菜单接口
+ */
+public interface RightSelectionHandlerProvider extends Mutable {
+
+ int CURRENT_LEVEL = 1;
+
+ String XML_TAG = "RightSelectionHandlerProvider";
+
+
+ /**
+ * 对单元格或者悬浮元素的右键菜单项进行增删改
+ *
+ * @param ePane 选择的元素
+ * @param popupMenu 右键主菜单
+ */
+ void dmlMenu(TargetComponent ePane, UIPopupMenu popupMenu);
+
+
+ /**
+ * 当前实现是否可以作用于当前元素
+ *
+ * @param selectableElement 当前选中元素分为CellSelection和FloatSelection(单元格和悬浮元素)
+ * @return
+ */
+ boolean accept(SelectableElement selectableElement);
+
+
+ /**
+ * 对表单,参数面板内置的右键选项进行增删改处理
+ *
+ * @param actions 默认的action集合 注意:主体代码要求这边的action必须是UndoableAction 的子类而非updateAction
+ */
+ void dmlUpdateActions(BaseFormDesigner formDesigner, List actions);
+
+ /**
+ * 当前实现是否可以作用于当前元素
+ *
+ * @param formDesigner 当前选中元素分为表单编辑器和参数面板(表单组件元素以及各种控件)
+ * @return
+ */
+ boolean accept(BaseFormDesigner formDesigner);
+
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractRightSelectionHandlerProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractRightSelectionHandlerProvider.java
new file mode 100644
index 000000000..6ec8282ed
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractRightSelectionHandlerProvider.java
@@ -0,0 +1,45 @@
+package com.fr.design.fun.impl;
+
+import com.fr.design.actions.UpdateAction;
+import com.fr.design.designer.TargetComponent;
+import com.fr.design.fun.RightSelectionHandlerProvider;
+import com.fr.design.gui.imenu.UIPopupMenu;
+import com.fr.design.mainframe.BaseFormDesigner;
+import com.fr.design.selection.SelectableElement;
+import com.fr.stable.fun.impl.AbstractProvider;
+import com.fr.stable.fun.mark.API;
+
+import java.util.List;
+
+@API(level = RightSelectionHandlerProvider.CURRENT_LEVEL)
+public abstract class AbstractRightSelectionHandlerProvider extends AbstractProvider implements RightSelectionHandlerProvider {
+ @Override
+ public int currentAPILevel() {
+ return CURRENT_LEVEL;
+ }
+
+ @Override
+ public String mark4Provider() {
+ return getClass().getName();
+ }
+
+ @Override
+ public void dmlUpdateActions(BaseFormDesigner formDesigner, List actions) {
+
+ }
+
+ @Override
+ public boolean accept(BaseFormDesigner formDesigner) {
+ return false;
+ }
+
+ @Override
+ public void dmlMenu(TargetComponent ePane, UIPopupMenu popupMenu) {
+
+ }
+
+ @Override
+ public boolean accept(SelectableElement selectableElement) {
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIBasicMenuItemUI.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIBasicMenuItemUI.java
index 74c65e8ee..61587beef 100644
--- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIBasicMenuItemUI.java
+++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIBasicMenuItemUI.java
@@ -667,18 +667,10 @@ public class UIBasicMenuItemUI extends MenuItemUI {
}
private void installFont(final String prefix, final JComponent menuItem) {
- Thread thread = new Thread(new Runnable() {
- @Override
- public void run() {
- if (menuItem == null) {
- return;
- }
- LookAndFeel.installColorsAndFont(menuItem, prefix + ".background", prefix + ".foreground", prefix + ".font");
- }
- });
- thread.setName("UIBasicMenuItemUI");
- thread.setDaemon(true);
- thread.start();
+ if (menuItem == null) {
+ return;
+ }
+ LookAndFeel.installColorsAndFont(menuItem, prefix + ".background", prefix + ".foreground", prefix + ".font");
}
protected Dimension getPreferredMenuItemSize(JComponent c, Icon checkIcon,
diff --git a/designer-base/src/main/java/com/fr/design/gui/itextfield/UIAutoCompletionField.java b/designer-base/src/main/java/com/fr/design/gui/itextfield/UIAutoCompletionField.java
index de6bccd86..967aeddbb 100644
--- a/designer-base/src/main/java/com/fr/design/gui/itextfield/UIAutoCompletionField.java
+++ b/designer-base/src/main/java/com/fr/design/gui/itextfield/UIAutoCompletionField.java
@@ -1,11 +1,11 @@
package com.fr.design.gui.itextfield;
import com.fr.design.gui.imenu.UIListPopup;
-import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.ComparatorUtils;
import com.fr.stable.OperatingSystem;
-import javax.swing.*;
+import javax.swing.JList;
+import javax.swing.UIManager;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
@@ -13,10 +13,12 @@ import javax.swing.event.ListSelectionListener;
import javax.swing.text.AbstractDocument;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
-
-import java.awt.Dimension;
-import java.awt.LayoutManager;
-import java.awt.event.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
import java.util.ArrayList;
public class UIAutoCompletionField extends UITextField implements DocumentListener, MouseListener, ListSelectionListener, ActionListener, KeyListener {
diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/checkboxtree/CheckBoxTreeCellRenderer.java b/designer-base/src/main/java/com/fr/design/gui/itree/checkboxtree/CheckBoxTreeCellRenderer.java
index 769ff4a60..f205cca92 100644
--- a/designer-base/src/main/java/com/fr/design/gui/itree/checkboxtree/CheckBoxTreeCellRenderer.java
+++ b/designer-base/src/main/java/com/fr/design/gui/itree/checkboxtree/CheckBoxTreeCellRenderer.java
@@ -100,10 +100,9 @@ public class CheckBoxTreeCellRenderer extends NullPanel implements TreeCellRende
Border border = treeCellRendererComponent.getBorder();
setBorder(border);
treeCellRendererComponent.setBorder(BorderFactory.createEmptyBorder());
- //todo 可能会发生数组越界,需要处理一下
- if (getComponentCount() == 2) {
- remove(1);
- }
+
+ remove((Component) this._actualTreeRenderer);
+
add(treeCellRendererComponent);
}
diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java
index 550ba715e..d5a9044d5 100644
--- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java
+++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java
@@ -69,10 +69,8 @@ public class EnvFileTree extends RefreshableJTree {
if (treeNode.hasFullAuthority()) {
if (lock != null && !node.getUserID().equals(lock)) {
name = name + Toolkit.i18nText("Fine-Design_Basic_Template_Status_Locked", "(", ")");
- this.setIcon(FileTreeIcon.getIcon(node));
- } else {
- this.setIcon(FileTreeIcon.getIcon(node, false));
}
+ this.setIcon(FileTreeIcon.getIcon(node));
} else {
this.setIcon(FileTreeIcon.getFolderHalfImageIcon());
}
diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java
index 130240aea..b0e26cc80 100644
--- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java
+++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java
@@ -3,6 +3,7 @@ package com.fr.design.gui.itree.filetree;
import com.fr.base.BaseUtils;
import com.fr.design.icon.LockIcon;
import com.fr.file.filetree.FileNode;
+import com.fr.general.ComparatorUtils;
import com.fr.stable.StableUtils;
import com.fr.workspace.WorkContext;
@@ -125,8 +126,16 @@ public class FileTreeIcon {
return FOLDER_HALF_IMAGE_ICON;
}
+ /**
+ * 获取文件节点对应的图标
+ *
+ * @param node 文件节点
+ * @return 文件节点的图标
+ */
public static Icon getIcon(FileNode node) {
- return getIcon(node, node.getLock() != null);
+ // 如果文件节点锁不为空且不是当前用户锁定的该模板,那么模板ICON 提示用户当前文件节点被锁
+ boolean showLock = node.getLock() != null && !ComparatorUtils.equals(node.getUserID(), node.getLock());
+ return getIcon(node, showLock);
}
public static Icon getIcon(FileNode node, boolean isShowLock) {
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/BaseJForm.java b/designer-base/src/main/java/com/fr/design/mainframe/BaseJForm.java
index 559387b20..d3cff1ff9 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/BaseJForm.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/BaseJForm.java
@@ -1,16 +1,16 @@
package com.fr.design.mainframe;
-import javax.swing.JComponent;
-
import com.fr.form.FormElementCaseContainerProvider;
+import javax.swing.JComponent;
+
/**
* Author : Shockway
* Date: 13-7-15
* Time: 上午10:28
*/
-public interface BaseJForm extends JTemplateProvider {
+public interface BaseJForm extends JTemplateProvider {
String XML_TAG = "JForm";
int FORM_TAB = 0;
@@ -32,11 +32,6 @@ public interface BaseJForm extends JTemplateProvider {
*/
void refreshSelectedWidget();
- /**
- * 获取当前的Target
- */
- Object getTarget();
-
/**
* 执行撤销
*
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java
index 5c262da9d..714c561e7 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java
@@ -10,6 +10,7 @@ import com.fr.design.DesignState;
import com.fr.design.DesignerEnvManager;
import com.fr.design.ExtraDesignClassManager;
import com.fr.design.actions.core.ActionFactory;
+import com.fr.design.base.mode.DesignModeContext;
import com.fr.design.constants.UIConstants;
import com.fr.design.data.DesignTableDataManager;
import com.fr.design.data.datapane.TableDataTreePane;
@@ -17,6 +18,7 @@ import com.fr.design.env.DesignerWorkspaceInfo;
import com.fr.design.event.DesignerOpenedListener;
import com.fr.design.event.TargetModifiedEvent;
import com.fr.design.event.TargetModifiedListener;
+import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.file.MutilTempalteTabPane;
import com.fr.design.file.NewTemplatePane;
@@ -29,13 +31,13 @@ import com.fr.design.gui.imenu.UIMenuHighLight;
import com.fr.design.gui.iprogressbar.ProgressDialog;
import com.fr.design.gui.iscrollbar.UIScrollBar;
import com.fr.design.gui.itoolbar.UIToolbar;
+import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.loghandler.LogMessageBar;
import com.fr.design.mainframe.toolbar.ToolBarMenuDock;
import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus;
import com.fr.design.menu.MenuManager;
import com.fr.design.menu.ShortCut;
-import com.fr.design.utils.DesignUtils;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.exception.DecryptTemplateException;
import com.fr.file.FILE;
@@ -66,6 +68,7 @@ import javax.swing.JLayeredPane;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import javax.swing.border.MatteBorder;
@@ -76,7 +79,6 @@ import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
-import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
@@ -160,9 +162,9 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
//用于判断设计器是否打开了
private boolean designerOpened = false;
- private int contentWidth = (int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth());
+ private int contentWidth = (int) (java.awt.Toolkit.getDefaultToolkit().getScreenSize().getWidth());
- private int contentHeight = (int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight());
+ private int contentHeight = (int) (java.awt.Toolkit.getDefaultToolkit().getScreenSize().getHeight());
private WindowAdapter windowAdapter = new WindowAdapter() {
@@ -224,16 +226,8 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
}
public void mouseReleased(MouseEvent e) {
- if (DesignerMode.isAuthorityEditing()) {
- DesignerMode.setMode(DesignerMode.NORMAL);
- WestRegionContainerPane.getInstance().replaceDownPane(
- TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()));
- HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().refreshEastPropertiesPane();
- DesignerContext.getDesignerFrame().resetToolkitByPlus(
- HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().getToolBarMenuDockPlus());
- needToAddAuhtorityPaint();
- refreshDottedLine();
- fireAuthorityStateToNomal();
+ if (DesignModeContext.isAuthorityEditing()) {
+ closeAuthorityEditing();
}
}
@@ -332,6 +326,18 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
this.progressDialog = new ProgressDialog(this);
}
+ public void closeAuthorityEditing(){
+ DesignModeContext.switchTo(com.fr.design.base.mode.DesignerMode.NORMAL);
+ WestRegionContainerPane.getInstance().replaceDownPane(
+ TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()));
+ HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().refreshEastPropertiesPane();
+ DesignerContext.getDesignerFrame().resetToolkitByPlus(
+ HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getToolBarMenuDockPlus());
+ needToAddAuhtorityPaint();
+ refreshDottedLine();
+ fireAuthorityStateToNomal();
+ }
+
/**
* 注册app.
*
@@ -407,7 +413,16 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
public void on(PluginEvent event) {
refreshNorthEastPane(northEastPane, ad);
- DesignUtils.refreshDesignerFrame();
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ if (DesignerContext.getDesignerFrame() == null) {
+ return;
+ }
+ DesignerContext.getDesignerFrame().refresh();
+ DesignerContext.getDesignerFrame().repaint();
+ }
+ });
}
}, new PluginFilter() {
@@ -809,14 +824,19 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
* 报表运行环境改变时,需要刷新某些面板
*/
public void refreshEnv() {
+ refresh();
+ DesignerFrameFileDealerPane.getInstance().refreshDockingView();
+ TemplateTreePane.getInstance().refreshDockingView();
+ }
+ /**
+ * 安装设计器相关插件时的刷新
+ */
+ public void refresh() {
this.setTitle();
- DesignerFrameFileDealerPane.getInstance().refreshDockingView();
TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter());
- TemplateTreePane.getInstance().refreshDockingView();
DesignTableDataManager.clearGlobalDs();
EastRegionContainerPane.getInstance().refreshDownPane();
-
JTemplate template = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
if (template != null) {
template.refreshToolArea();
@@ -849,18 +869,18 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
editingTemplate.stopEditing();
if (!editingTemplate.getEditingFILE().exists()) {
int returnVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(),
- com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + editingTemplate.getEditingFILE()
+ Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + editingTemplate.getEditingFILE()
+ "\" ?", ProductConstants.PRODUCT_NAME, JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (returnVal == JOptionPane.YES_OPTION && editingTemplate.saveTemplate()) {
editingTemplate.saveTemplate();
- FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved",
+ FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved",
editingTemplate.getEditingFILE().getName()));
}
} else {
if (editingTemplate.saveTemplate()) {
editingTemplate.saveTemplate();
- FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved",
+ FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved",
editingTemplate.getEditingFILE().getName()));
}
}
@@ -957,8 +977,12 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
// p:判断一下,如何文件为空或者文件不存在,直接返回.
if (tplFile == null || !tplFile.exists()) {
- JOptionPane.showMessageDialog(this, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Warning_Template_Do_Not_Exsit"),
- ProductConstants.PRODUCT_NAME, JOptionPane.INFORMATION_MESSAGE);
+ JOptionPane.showMessageDialog(
+ this,
+ Toolkit.i18nText("Fine-Design_Basic_Warning_Template_Do_Not_Exsit"),
+ ProductConstants.PRODUCT_NAME,
+ JOptionPane.INFORMATION_MESSAGE
+ );
DesignerFrameFileDealerPane.getInstance().refresh();
return;
}
@@ -968,7 +992,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
} catch (DecryptTemplateException e) {
JOptionPane.showMessageDialog(
this,
- com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Encrypt_Decrypt_Exception"),
+ Toolkit.i18nText("Fine-Design_Encrypt_Decrypt_Exception"),
UIManager.getString("OptionPane.messageDialogTitle"),
JOptionPane.WARNING_MESSAGE,
UIManager.getIcon("OptionPane.errorIcon")
@@ -1027,7 +1051,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
MutilTempalteTabPane.getInstance().setTemTemplate(
HistoryTemplateListPane.getInstance().getCurrentEditingTemplate());
} else {
- activeTemplate(tplFile, jt);
+ activeTemplate(jt);
}
opened = true;
break;
@@ -1042,13 +1066,12 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
/**
* 激活指定的模板
*
- * @param tplFile 模板文件
- * @param jt 当前报表
+ * @param jt 当前报表
* @date 2014-10-14-下午6:31:23
*/
- private void activeTemplate(FILE tplFile, JTemplate jt) {
+ private void activeTemplate(JTemplate jt) {
// 如果该模板已经打开,则进行激活就可以了
- int index = HistoryTemplateListPane.getInstance().contains(tplFile.getPath());
+ int index = HistoryTemplateListPane.getInstance().contains(jt);
List> historyList = HistoryTemplateListPane.getInstance().getHistoryList();
if (index != -1) {
historyList.get(index).activeJTemplate(index, jt);
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java
index 7127c9763..cef5c86a0 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java
@@ -30,11 +30,18 @@ import com.fr.design.menu.KeySetUtils;
import com.fr.design.menu.ShortCut;
import com.fr.design.menu.ToolBarDef;
import com.fr.design.roleAuthority.RolesAlreadyEditedPane;
+import com.fr.design.utils.DesignUtils;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.file.FileNodeFILE;
import com.fr.file.filetree.FileNode;
import com.fr.general.ComparatorUtils;
+import com.fr.general.GeneralContext;
import com.fr.log.FineLoggerFactory;
+import com.fr.plugin.context.PluginContext;
+import com.fr.plugin.injectable.PluginModule;
+import com.fr.plugin.manage.PluginFilter;
+import com.fr.plugin.observer.PluginEvent;
+import com.fr.plugin.observer.PluginEventListener;
import com.fr.stable.CoreConstants;
import com.fr.stable.StringUtils;
import com.fr.third.org.apache.commons.io.FilenameUtils;
@@ -68,6 +75,22 @@ import static javax.swing.JOptionPane.WARNING_MESSAGE;
public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarStateChangeListener, ResponseDataSourceChange {
+ static {
+ GeneralContext.listenPluginRunningChanged(new PluginEventListener() {
+
+ @Override
+ public void on(PluginEvent event) {
+ DesignUtils.refreshDesignerFrame();
+ }
+ }, new PluginFilter() {
+
+ @Override
+ public boolean accept(PluginContext context) {
+ return context.contain(PluginModule.ExtraDesign, ShortCut.TEMPLATE_TREE);
+ }
+ });
+ }
+
private static final String FILE = "file";
private static volatile DesignerFrameFileDealerPane THIS;
@@ -163,7 +186,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt
* 刷新菜单
*/
public void refreshDockingView() {
-
ToolBarDef toolbarDef = new ToolBarDef();
toolbarDef.addShortCut(newFolderAction, refreshTreeAction);
if (WorkContext.getCurrent().isLocal()) {
@@ -406,8 +428,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt
String oldName = fnf.getName();
String suffix = fnf.isDirectory() ? StringUtils.EMPTY : oldName.substring(oldName.lastIndexOf(CoreConstants.DOT), oldName.length());
- oldName = oldName.replaceAll(suffix, StringUtils.EMPTY);
-
+ oldName = oldName.replace(suffix, StringUtils.EMPTY);
this.setLayout(new BorderLayout());
this.setModal(true);
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java
index a49d66791..97ce22814 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java
@@ -412,6 +412,8 @@ public class EastRegionContainerPane extends UIEastResizableContainer {
if (propertyItem.isVisible() && propertyItem.isEnabled() && !propertyItem.isPoppedOut()) {
propertyCard.show(rightPane, tabName);
propertyItem.setTabButtonSelected();
+ //从单元格菜单过来也要关闭弹出窗
+ hideCurrentPopupPane();
}
}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java
index c2557a5b9..3e7b95286 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java
@@ -32,6 +32,7 @@ import com.fr.design.gui.frpane.HyperlinkGroupPaneActionProvider;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.imenu.UIMenuItem;
import com.fr.design.gui.itree.filetree.TemplateFileTree;
+import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.templateinfo.TemplateInfoCollector;
import com.fr.design.mainframe.templateinfo.TemplateProcessInfo;
@@ -56,6 +57,8 @@ import com.fr.stable.ArrayUtils;
import com.fr.stable.ProductConstants;
import com.fr.stable.StringUtils;
import com.fr.stable.core.UUID;
+import com.fr.workspace.WorkContext;
+import com.fr.workspace.server.lock.TplOperator;
import javax.swing.BorderFactory;
import javax.swing.Icon;
@@ -72,7 +75,7 @@ import java.util.regex.Pattern;
/**
* 报表设计和表单设计的编辑区域(设计器编辑的IO文件)
*/
-public abstract class JTemplate> extends TargetComponent implements ToolBarMenuDockPlus, JTemplateProvider, DesignerProxy {
+public abstract class JTemplate> extends TargetComponent implements ToolBarMenuDockPlus, DesignerProxy {
// TODO ALEX_SEP editingFILE这个属性一定要吗?如果非要不可,有没有可能保证不为null
private static final int PREFIX_NUM = 3000;
private FILE editingFILE = null;
@@ -419,7 +422,7 @@ public abstract class JTemplate>
fireSuperTargetModified();
}
- protected boolean accept(Object o) {
+ public boolean accept(Object o) {
return true;
}
@@ -519,19 +522,6 @@ public abstract class JTemplate>
if (editingFILE == null) {
return false;
}
-// //检查一下连接是否成功
-// try {
-// if (FRContext.getCommonOperator() != null && !FRContext.getCommonOperator().testServerConnectionWithOutShowMessagePane()) {
-// //连接不成功,提示
-// JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(),
-// com.fr.design.i18n.Toolkit.i18nText(new String[]{"server_disconnected", "template_unsaved"}, new String[]{",", "!"})
-// , com.fr.design.i18n.Toolkit.i18nText("FR-Designer_Error"), JOptionPane.ERROR_MESSAGE);
-// return false;
-// }
-// } catch (Exception e) {
-// FineLoggerFactory.getLogger().error(e.getMessage(), e);
-// }
-
// 检查一下editingFILE是不是已存在的文件,如果不存在则用saveAs
if (!editingFILE.exists()) {
@@ -587,6 +577,8 @@ public abstract class JTemplate>
if (isCancelOperation(chooseResult)) {
return false;
}
+ // 源文件
+ FILE sourceFile = editingFILE;
if (isOkOperation(chooseResult)) {
boolean access = false;
@@ -596,13 +588,33 @@ public abstract class JTemplate>
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
if (!access) {
- JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Template_Permission_Denied") + "!", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Message"), JOptionPane.WARNING_MESSAGE);
+ JOptionPane.showMessageDialog(
+ DesignerContext.getDesignerFrame(),
+ Toolkit.i18nText("Fine-Design_Basic_Template_Permission_Denied") + "!",
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Message"),
+ JOptionPane.WARNING_MESSAGE);
return false;
}
+ // 目标文件
editingFILE = fileChooser.getSelectedFILE();
}
- return saveNewFile(editingFILE, oldName);
+ boolean lockedTarget = WorkContext.getCurrent().get(TplOperator.class).saveAs(editingFILE.getPath());
+ if (lockedTarget) {
+ boolean saved = saveNewFile(editingFILE, oldName);
+ // 目标文件保存成功并且源文件不一致的情况下,把源文件锁释放掉
+ if (saved && !ComparatorUtils.equals(editingFILE.getPath(), sourceFile.getPath())) {
+ WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(sourceFile.getPath());
+ }
+ return saved;
+ } else {
+ JOptionPane.showMessageDialog(
+ DesignerContext.getDesignerFrame(),
+ Toolkit.i18nText("Fine-Design_Basic_Template_Status_Locked"),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Message"),
+ JOptionPane.WARNING_MESSAGE);
+ return false;
+ }
}
protected boolean saveNewFile(FILE editingFILE, String oldName) {
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplateProvider.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplateProvider.java
index 7df132d6e..fb87f7f04 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplateProvider.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplateProvider.java
@@ -1,6 +1,8 @@
package com.fr.design.mainframe;
-public interface JTemplateProvider {
+public interface JTemplateProvider {
- public void fireTargetModified();
+ void fireTargetModified();
+
+ T getTarget();
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/backgroundpane/PatternBackgroundQuickPane.java b/designer-base/src/main/java/com/fr/design/mainframe/backgroundpane/PatternBackgroundQuickPane.java
index d965151cb..5e69d9f82 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/backgroundpane/PatternBackgroundQuickPane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/backgroundpane/PatternBackgroundQuickPane.java
@@ -30,6 +30,8 @@ public class PatternBackgroundQuickPane extends BackgroundQuickPane {
private int patternIndex = 0; // pattern setIndex.
private final static int DEFAULT_DIM_HEIGHT = 210;
+ private final static Color DEFAULT_FOREGROUND = Color.lightGray;
+ private final static Color DEFAULT_BACKGROUND = Color.black;
private ColorSelectBox foregroundColorPane;
private ColorSelectBox backgroundColorPane;
private PatternButton[] patternButtonArray;
@@ -52,7 +54,8 @@ public class PatternBackgroundQuickPane extends BackgroundQuickPane {
}
foregroundColorPane = new ColorSelectBox(60);
backgroundColorPane = new ColorSelectBox(60);
-
+ foregroundColorPane.setSelectObject(DEFAULT_FOREGROUND);
+ foregroundColorPane.setSelectObject(DEFAULT_BACKGROUND);
double f = TableLayout.FILL;
double p = TableLayout.PREFERRED;
Component[][] components = new Component[][]{
@@ -219,7 +222,7 @@ public class PatternBackgroundQuickPane extends BackgroundQuickPane {
@Override
public void reset() {
patternButtonArray[0].setSelected(true);
- foregroundColorPane.setSelectObject(null);
- backgroundColorPane.setSelectObject(null);
+ foregroundColorPane.setSelectObject(DEFAULT_FOREGROUND);
+ backgroundColorPane.setSelectObject(DEFAULT_BACKGROUND);
}
}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java
index 73f9ce9bd..3b0593708 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java
@@ -68,4 +68,14 @@ public class LogMessageBar extends JPanel {
public Dimension getPreferredSize() {
return new Dimension(width, 24);
}
+
+ /**
+ * 销毁内置的日志面板,外部插件会用到
+ */
+ public void disposeLogDialog() {
+ if (dlg != null && dlg.isShowing()) {
+ dlg.dispose();
+ }
+ THIS = null;
+ }
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileStyleDefinePane.java
index 6b2ecec66..860a0c9fb 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileStyleDefinePane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileStyleDefinePane.java
@@ -7,11 +7,15 @@ import com.fr.form.ui.container.cardlayout.WCardTagLayout;
import com.fr.general.FRFont;
import com.fr.general.cardtag.mobile.DefaultMobileTemplateStyle;
import com.fr.general.cardtag.mobile.MobileTemplateStyle;
+import com.fr.general.cardtag.mobile.TabFontConfig;
+
import java.awt.BasicStroke;
+import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
+import java.awt.RenderingHints;
public class DefaultMobileStyleDefinePane extends MobileTemplateStyleDefinePane {
@@ -40,17 +44,17 @@ public class DefaultMobileStyleDefinePane extends MobileTemplateStyleDefinePane
@Override
public MobileTemplateStyle updateBean() {
- return new DefaultMobileTemplateStyle();
+ return getDefaultTemplateStyle();
}
public MobileTemplateStyle updateConfig(){
- return new DefaultMobileTemplateStyle();
+ return getDefaultTemplateStyle();
}
@Override
protected MobileTemplateStyle getDefaultTemplateStyle() {
- return new DefaultMobileTemplateStyle();
+ return new DefaultMobileTemplateStyle(new TabFontConfig(getTagLayout().getTitleFont()));
}
@Override
@@ -73,6 +77,10 @@ public class DefaultMobileStyleDefinePane extends MobileTemplateStyleDefinePane
this.setBackground(DefaultMobileTemplateStyle.DEFAULT_INITIAL_COLOR);
}
+ public Color getInitialColor() {
+ return DefaultMobileTemplateStyle.DEFAULT_INITIAL_COLOR;
+ }
+
public void repaint() {
super.repaint();
}
@@ -84,7 +92,8 @@ public class DefaultMobileStyleDefinePane extends MobileTemplateStyleDefinePane
int panelWidth = dimension.width;
int panelHeight = dimension.height;
Graphics2D g2d = (Graphics2D) g.create();
- FRFont frFont = DefaultMobileTemplateStyle.DEFAULT_TAB_FONT.getFont();
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ FRFont frFont = this.getTabFontConfig().getFont();
FontMetrics fm = GraphHelper.getFontMetrics(frFont);
WCardTagLayout cardTagLayout = DefaultMobileStyleDefinePane.this.getTagLayout();
int eachWidth = panelWidth / cardTagLayout.getWidgetCount();
@@ -92,11 +101,13 @@ public class DefaultMobileStyleDefinePane extends MobileTemplateStyleDefinePane
int fontHeight = fm.getHeight();
int ascentHeight = fm.getAscent();
for (int i = 0; i < cardTagLayout.getWidgetCount(); i++) {
+ g2d.setColor(frFont.getForeground());
CardSwitchButton cardSwitchButton = cardTagLayout.getSwitchButton(i);
- String widgetName = cardSwitchButton.getText();
- int width = fm.stringWidth(widgetName);
- g2d.drawString(widgetName, (eachWidth - width) / 2, (panelHeight - fontHeight) / 2 + ascentHeight);
+ String displayName = calculateDisplayName(cardSwitchButton.getText(), fm, eachWidth);
+ int width = fm.stringWidth(displayName);
+ g2d.drawString(displayName, (eachWidth - width) / 2, (panelHeight - fontHeight) / 2 + ascentHeight);
if (i == 0) {
+ g2d.setColor(Color.BLACK);
g2d.setStroke(new BasicStroke(2.0f));
g2d.drawLine(0, panelHeight - 1, eachWidth, panelHeight - 1);
}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DownMenuStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DownMenuStyleDefinePane.java
index 1a0472cbb..ff76e5fed 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DownMenuStyleDefinePane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DownMenuStyleDefinePane.java
@@ -27,6 +27,7 @@ import java.awt.FlowLayout;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
+import java.awt.RenderingHints;
import java.awt.Stroke;
import java.util.ArrayList;
@@ -151,6 +152,7 @@ public class DownMenuStyleDefinePane extends StyleDefinePaneWithSelectConf {
int panelWidth = dimension.width;
int panelHeight = dimension.height;
Graphics2D g2d = (Graphics2D) g.create();
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
FRFont frFont = this.getTabFontConfig().getFont();
FontMetrics fm = GraphHelper.getFontMetrics(frFont);
WCardTagLayout cardTagLayout = DownMenuStyleDefinePane.this.getTagLayout();
@@ -161,8 +163,8 @@ public class DownMenuStyleDefinePane extends StyleDefinePaneWithSelectConf {
for (int i = 0; i < cardTagLayout.getWidgetCount(); i++) {
g2d.setColor(i == 0 ? selectFontColor : frFont.getForeground());
CardSwitchButton cardSwitchButton = cardTagLayout.getSwitchButton(i);
- String widgetName = cardSwitchButton.getText();
- int width = fm.stringWidth(widgetName);
+ String displayName = calculateDisplayName(cardSwitchButton.getText(), fm, eachWidth);
+ int width = fm.stringWidth(displayName);
if(i == 0){
Color oldColor = g2d.getColor();
g2d.setColor(this.getSelectColor());
@@ -171,7 +173,7 @@ public class DownMenuStyleDefinePane extends StyleDefinePaneWithSelectConf {
}
Icon icon = new Icon(PAINT_ICON, ICON_PATH);
g2d.drawImage(IconManager.getIconManager().getDefaultIconImage(icon), (eachWidth - ICON_OFFSET) / 2, (panelHeight - ICON_OFFSET - GAP - fontHeight) / 2, null);
- g2d.drawString(widgetName, (eachWidth - width) / 2, (panelHeight + ICON_OFFSET + GAP - fontHeight) / 2 + ascent);
+ g2d.drawString(displayName, (eachWidth - width) / 2, (panelHeight + ICON_OFFSET + GAP - fontHeight) / 2 + ascent);
Stroke oldStroke = g2d.getStroke();
if (splitLine.getLineStyle() != 0) {
g2d.setColor(splitLine.getColor());
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileTemplateStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileTemplateStyleDefinePane.java
index b499e18d7..feb19463d 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileTemplateStyleDefinePane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileTemplateStyleDefinePane.java
@@ -208,8 +208,10 @@ public abstract class MobileTemplateStyleDefinePane extends BasicBeanPane createDefinePane(String style, WCardTagLayout tagLayout) {
StyleDefinePaneUI styleDefinePaneUI = defineMap.get(style);
- Class extends BasicBeanPane> clazz = styleDefinePaneUI.getaClass();
- if (clazz == null) {
+ if(styleDefinePaneUI == null){
+ styleDefinePaneUI = defineMap.get(DefaultMobileTemplateStyle.STYLE_NAME);
}
+ Class extends BasicBeanPane> clazz = styleDefinePaneUI.getaClass();
BasicBeanPane quickPane = null;
try {
quickPane = Reflect.on(clazz).create(tagLayout).get();
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/UpMenuStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/UpMenuStyleDefinePane.java
index ea0dba659..be8ff823a 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/UpMenuStyleDefinePane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/UpMenuStyleDefinePane.java
@@ -27,6 +27,7 @@ import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
+import java.awt.RenderingHints;
import java.awt.Stroke;
public class UpMenuStyleDefinePane extends StyleDefinePaneWithSelectConf {
@@ -171,7 +172,8 @@ public class UpMenuStyleDefinePane extends StyleDefinePaneWithSelectConf {
int panelWidth = dimension.width;
int panelHeight = dimension.height;
Graphics2D g2d = (Graphics2D) g.create();
- FRFont frFont = UpMenuStyleDefinePane.this.fontConfPane.update();
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ FRFont frFont = this.getTabFontConfig().getFont();
FontMetrics fm = GraphHelper.getFontMetrics(frFont);
WCardTagLayout cardTagLayout = UpMenuStyleDefinePane.this.getTagLayout();
int eachWidth = panelWidth / cardTagLayout.getWidgetCount();
@@ -186,15 +188,15 @@ public class UpMenuStyleDefinePane extends StyleDefinePaneWithSelectConf {
for (int i = 0; i < cardTagLayout.getWidgetCount(); i++) {
g2d.setColor(i == 0 ? selectFontColor : frFont.getForeground());
CardSwitchButton cardSwitchButton = cardTagLayout.getSwitchButton(i);
- String widgetName = cardSwitchButton.getText();
- int width = fm.stringWidth(widgetName);
+ String displayName = calculateDisplayName(cardSwitchButton.getText(), fm, eachWidth);
+ int width = fm.stringWidth(displayName);
if(i == 0){
Color oldColor = g2d.getColor();
g2d.setColor(this.getSelectColor());
g2d.fillRect(0, 0 ,eachWidth, panelHeight - 2);
g2d.setColor(oldColor);
}
- g2d.drawString(widgetName, (eachWidth - width) / 2, (panelHeight - fontHeight) / 2 + ascentHeight);
+ g2d.drawString(displayName, (eachWidth - width) / 2, (panelHeight - fontHeight) / 2 + ascentHeight);
Stroke oldStroke = g2d.getStroke();
if (i == 0) {
g2d.setColor(this.underLine.getColor());
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/preview/MobileTemplatePreviewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/preview/MobileTemplatePreviewPane.java
index d5ddbb6b9..73f09f04e 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/widget/preview/MobileTemplatePreviewPane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/preview/MobileTemplatePreviewPane.java
@@ -5,6 +5,7 @@ import com.fr.general.cardtag.mobile.TabFontConfig;
import javax.swing.JPanel;
import java.awt.Color;
+import java.awt.FontMetrics;
public abstract class MobileTemplatePreviewPane extends JPanel {
private Color initialColor;
@@ -35,18 +36,32 @@ public abstract class MobileTemplatePreviewPane extends JPanel {
this.tabFontConfig = tabFontConfig;
}
- public MobileTemplatePreviewPane(){
+ public MobileTemplatePreviewPane() {
}
- public void populateConfig(MobileTemplateStyle templateStyle){
+ public void populateConfig(MobileTemplateStyle templateStyle) {
this.setInitialColor(templateStyle.getInitialColor());
this.setBackground(templateStyle.getInitialColor());
this.setSelectColor(templateStyle.getSelectColor());
this.setTabFontConfig(templateStyle.getTabFontConfig());
}
- public void repaint (){
+ protected String calculateDisplayName(String widgetName, FontMetrics fm, int eachWidth) {
+ StringBuffer buffer = new StringBuffer();
+ String result;
+ for (int i = 0; i < widgetName.length(); i++) {
+ result = buffer.toString();
+ buffer.append(widgetName.charAt(i));
+ if (fm.stringWidth(buffer.toString()) > eachWidth) {
+ return result;
+ }
+ }
+ return buffer.toString();
+
+ }
+
+ public void repaint() {
super.repaint();
}
diff --git a/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectPane.java b/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectPane.java
index 0f5e629e2..d53232416 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectPane.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectPane.java
@@ -8,11 +8,16 @@ import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
-
-import javax.swing.*;
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
-import java.awt.*;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
@@ -92,11 +97,15 @@ public class NewColorSelectPane extends BasicPane implements ColorSelectable {
centerPane.add(Box.createVerticalStrut(1));
// mod by anchore 16/11/16
- UIButton customButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_More_Color"));
+ final UIButton customButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_More_Color"));
- customButton.addActionListener(new ActionListener() {
+ // 不能使用 ActionListener,否则设计器工具栏中的"更多颜色"按钮会有问题(REPORT-13654)
+ customButton.addMouseListener(new MouseAdapter() {
@Override
- public void actionPerformed(ActionEvent e) {
+ public void mousePressed(MouseEvent e) {
+ if (!customButton.isEnabled()) {
+ return;
+ }
customButtonPressed();
}
});
diff --git a/designer-base/src/main/java/com/fr/design/style/color/PickColorButtonFactory.java b/designer-base/src/main/java/com/fr/design/style/color/PickColorButtonFactory.java
index 67d99819d..f394801c8 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/PickColorButtonFactory.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/PickColorButtonFactory.java
@@ -4,11 +4,15 @@ import com.fr.base.BaseUtils;
import com.fr.design.gui.ibutton.SpecialUIButton;
import com.fr.design.gui.ibutton.UIBasicButtonUI;
-import javax.swing.*;
-import javax.swing.plaf.ButtonUI;
-import javax.swing.plaf.basic.BasicButtonUI;
-import java.awt.*;
-import java.awt.event.*;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
/**
* Created by plough on 2016/12/22.
@@ -28,7 +32,7 @@ class PickColorButtonFactory {
* @return SpecialUIButton 屏幕取色按钮
*/
static JButton getPickColorButton(final ColorSelectable colorSelectable, IconType iconType, final boolean setColorRealTime) {
- SpecialUIButton pickColorButton = new SpecialUIButton(new WhiteButtonUI());
+ final SpecialUIButton pickColorButton = new SpecialUIButton(new WhiteButtonUI());
PickColorButtonFactory.iconType = iconType;
if (iconType == IconType.ICON16) {
@@ -42,9 +46,13 @@ class PickColorButtonFactory {
pickColorButton.setPreferredSize(new Dimension(iconSize, iconSize));
pickColorButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
- pickColorButton.addActionListener(new ActionListener() {
+ // 不能使用 ActionListener,否则设计器工具栏中的取色按钮会有问题(REPORT-13654)
+ pickColorButton.addMouseListener(new MouseAdapter() {
@Override
- public void actionPerformed(ActionEvent e) {
+ public void mousePressed(MouseEvent e) {
+ if (!pickColorButton.isEnabled()) {
+ return;
+ }
new ColorPicker(colorSelectable, setColorRealTime);
}
});
diff --git a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java
index 77173cebb..240176eef 100644
--- a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java
+++ b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java
@@ -65,12 +65,12 @@ public class DesignUtils {
* @return 启动了返回true
*/
public static boolean isStarted() {
-// try {
-// new Socket("localhost", port);
-// return true;
-// } catch (Exception exp) {
-//
-// }
+ try {
+ new Socket("localhost", port);
+ return true;
+ } catch (Exception exp) {
+
+ }
return false;
}
diff --git a/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java b/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java
index 769c843cc..b0f3e9dd4 100644
--- a/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java
+++ b/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java
@@ -511,14 +511,14 @@ public class RemoteEnvPane extends BasicBeanPane {
}
private void tryConnectRemoteEnv() {
+ final RemoteDesignerWorkspaceInfo remoteEnv = updateBean();
+ final WorkspaceConnectionInfo connection = remoteEnv.getConnection();
+
final SwingWorker worker = new SwingWorker() {
@Override
protected Boolean doInBackground() throws Exception {
- final RemoteDesignerWorkspaceInfo remoteEnv = updateBean();
-
- WorkspaceConnectionInfo connection = remoteEnv.getConnection();
DesignerEnvManager.getEnvManager().setCertificatePath(connection.getCertPath());
DesignerEnvManager.getEnvManager().setCertificatePass(connection.getCertSecretKey());
try {
@@ -532,18 +532,26 @@ public class RemoteEnvPane extends BasicBeanPane {
protected void done() {
okButton.setEnabled(true);
try {
- Boolean result = get();
- if (result == null) {
+
+ TestConnectionResult result = TestConnectionResult.parse(get(), connection);
+ if (result == TestConnectionResult.Fully_Success) {
+ message.setText(Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Successful"));
+ uiLabel.setIcon(UIManager.getIcon("OptionPane.informationIcon"));
+ }
+
+ if (result == TestConnectionResult.Partly_Sucess) {
+ message.setText(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Version_Inconsistence_Test"));
+ uiLabel.setIcon(UIManager.getIcon("OptionPane.warningIcon"));
+ }
+
+ if (result == TestConnectionResult.Fully_Failed) {
+ message.setText(Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Failed"));
+ uiLabel.setIcon(UIManager.getIcon("OptionPane.errorIcon"));
+ }
+
+ if (result == TestConnectionResult.Auth_Failed) {
message.setText(Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Auth_Failed"));
uiLabel.setIcon(UIManager.getIcon("OptionPane.errorIcon"));
- } else {
- if (result) {
- message.setText(Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Successful"));
- uiLabel.setIcon(UIManager.getIcon("OptionPane.informationIcon"));
- } else {
- message.setText(Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Failed"));
- uiLabel.setIcon(UIManager.getIcon("OptionPane.errorIcon"));
- }
}
} catch (InterruptedException | ExecutionException e) {
FineLoggerFactory.getLogger().error(e, e.getMessage());
@@ -589,7 +597,7 @@ public class RemoteEnvPane extends BasicBeanPane {
dialog = new JDialog((Dialog) SwingUtilities.getWindowAncestor(RemoteEnvPane.this), UIManager.getString("OptionPane.messageDialogTitle"), true);
- dialog.setSize(new Dimension(268, 118));
+ dialog.setSize(new Dimension(308, 132));
okButton.setEnabled(false);
JPanel jp = new JPanel();
JPanel upPane = new JPanel();
diff --git a/designer-base/src/main/java/com/fr/env/TestConnectionResult.java b/designer-base/src/main/java/com/fr/env/TestConnectionResult.java
new file mode 100644
index 000000000..357d4f38c
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/env/TestConnectionResult.java
@@ -0,0 +1,62 @@
+package com.fr.env;
+
+import com.fr.log.FineLoggerFactory;
+import com.fr.stable.AssistUtils;
+import com.fr.workspace.WorkContext;
+import com.fr.workspace.connect.WorkspaceConnectionInfo;
+import com.fr.workspace.engine.channel.http.FunctionalHttpRequest;
+
+/**
+ * 测试连接的结果。
+ * 不改变原有逻辑的情况下,加入一层转化。
+ * 根据这里的转化结果,判断需要提示哪些内容。
+ *
+ * created by Harrison on 2018/12/20
+ **/
+public enum TestConnectionResult {
+ /**
+ * 完全成功, 版本匹配,测试连接成功。
+ */
+ Fully_Success,
+
+ /**
+ * 不完全成功,版本不匹配,但测试连接成功。
+ */
+ Partly_Sucess,
+
+ /**
+ * 完全失败,直接没连上
+ */
+ Fully_Failed,
+
+ /**
+ * 验证 Token 失败
+ */
+ Auth_Failed;
+
+ public static TestConnectionResult parse(Boolean value, WorkspaceConnectionInfo info) {
+ if (value == null) {
+ return Auth_Failed;
+ }
+
+ if (!value) {
+ return Fully_Failed;
+ }
+ try {
+
+ String serverVersion = new FunctionalHttpRequest(info).getServerVersion();
+ if (AssistUtils.equals(serverVersion, WorkContext.getVersion())) {
+ return Fully_Success;
+ }
+
+ return Partly_Sucess;
+ } catch (Exception e) {
+
+ // 发生异常,说明没连接上。返回完全失败。
+ FineLoggerFactory.getLogger().error(e.getMessage());
+ return Fully_Failed;
+ }
+
+
+ }
+}
diff --git a/designer-base/src/main/resources/com/fr/design/insert/formula/variable/cn/servletURL.txt b/designer-base/src/main/resources/com/fr/design/insert/formula/variable/cn/servletURL.txt
index 2a1e5dfd4..81dc88965 100644
--- a/designer-base/src/main/resources/com/fr/design/insert/formula/variable/cn/servletURL.txt
+++ b/designer-base/src/main/resources/com/fr/design/insert/formula/variable/cn/servletURL.txt
@@ -1 +1 @@
-假如访问:http://localhost:8080/WebReport/ReportServer?reportlet=WorkBook1.cpt,servletURL指的是:/WebReport/ReportServer
\ No newline at end of file
+假如访问的是http://localhost:8075/webroot/decision/view/report?viewlet=workbook1.cpt,servletURL指的是:/webroot/decision/view/report
\ No newline at end of file
diff --git a/designer-base/src/main/resources/com/fr/design/insert/formula/variable/en/servletURL.txt b/designer-base/src/main/resources/com/fr/design/insert/formula/variable/en/servletURL.txt
index b9149deff..d8704ba82 100644
--- a/designer-base/src/main/resources/com/fr/design/insert/formula/variable/en/servletURL.txt
+++ b/designer-base/src/main/resources/com/fr/design/insert/formula/variable/en/servletURL.txt
@@ -1 +1 @@
-http://localhost:8080/WebReport/ReportServer?reportlet=WorkBook1.cpt,servletURL is /WebReport/ReportServer
\ No newline at end of file
+http://localhost:8075/webroot/decision/view/report?viewlet=workbook1.cpt,servletURL is /webroot/decision/view/report
\ No newline at end of file
diff --git a/designer-base/src/test/java/com/fr/design/formula/FunctionConstantsTest.java b/designer-base/src/test/java/com/fr/design/formula/FunctionConstantsTest.java
new file mode 100644
index 000000000..75c9c9e5b
--- /dev/null
+++ b/designer-base/src/test/java/com/fr/design/formula/FunctionConstantsTest.java
@@ -0,0 +1,76 @@
+package com.fr.design.formula;
+
+import com.fr.general.GeneralUtils;
+import com.fr.invoke.Reflect;
+import org.easymock.EasyMock;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.api.easymock.PowerMock;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import static junit.framework.Assert.fail;
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * Created by plough on 2018/12/7.
+ */
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(GeneralUtils.class)
+public class FunctionConstantsTest {
+ @Test
+ public void testNewInstanceFail() throws Exception {
+ try {
+ FunctionConstants.class.newInstance();
+ fail("Not allowed to instantiate FunctionConstants!");
+ } catch (IllegalAccessException e) {
+ assertTrue(true);
+ }
+ }
+
+ @Test
+ public void testEmbedFuntionsAfterStaticInit() {
+ NameAndTypeAndFunctionList[] embFunctionLists = FunctionConstants.EMBFUNCTIONS;
+ // 一共有 8 个分类
+ assertEquals(8, embFunctionLists.length);
+ for (NameAndTypeAndFunctionList embFunctionsList : embFunctionLists) {
+ // 每个分类下都有函数
+ NameAndDescription[] nameAndDescriptions = embFunctionsList.getDescriptions();
+ assertTrue(nameAndDescriptions.length > 0);
+ }
+ }
+
+ @Test
+ public void testCommonFuntionsAfterStaticInit() {
+ NameAndFunctionList commonFunctionList = FunctionConstants.COMMON;
+ assertEquals(9, commonFunctionList.getDescriptions().length);
+ }
+
+ @Test
+ public void testIsCustomFormulaPathRunWithCode() {
+ PowerMock.mockStatic(GeneralUtils.class);
+ EasyMock.expect(GeneralUtils.readBuildNO()).andReturn("不是安装版本").anyTimes();
+ PowerMock.replayAll();
+
+ String classFilePath = "/Users/plough/.m2/repository/com/fr/core/fine-core/10.0-RELEASE-SNAPSHOT/fine-core-10.0-RELEASE-20181211.024527-499.jar!/com/fr/function";
+ assertFalse(Reflect.on(FunctionConstants.class).call("isCustomFormulaPath", classFilePath).get());
+
+ classFilePath = "/Users/plough/work/new_10_release_finereport/engine-settings/env/webroot/WEB-INF/classes/com/fr/function";
+ assertFalse(Reflect.on(FunctionConstants.class).call("isCustomFormulaPath", classFilePath).get());
+ }
+
+ @Test
+ public void testIsCustomFormulaPathRunWithJar() {
+ PowerMock.mockStatic(GeneralUtils.class);
+ EasyMock.expect(GeneralUtils.readBuildNO()).andReturn("Build#release-2018.12.10.12.11.09.95").anyTimes();
+ PowerMock.replayAll();
+
+ String classFilePath = "file:/Applications/FineReport_10.0_12_10/webapps/webroot/WEB-INF/lib/fine-report-engine-10.0.jar!/com/fr/function";
+ assertFalse(Reflect.on(FunctionConstants.class).call("isCustomFormulaPath", classFilePath).get());
+
+ classFilePath = "/Applications/FineReport_10.0_12_10/webapps/webroot/WEB-INF/classes/com/fr/function";
+ assertTrue(Reflect.on(FunctionConstants.class).call("isCustomFormulaPath", classFilePath).get());
+ }
+}
diff --git a/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/FormHyperlinkNorthPane.java b/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/FormHyperlinkNorthPane.java
index 63d94bbb2..5159e318c 100644
--- a/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/FormHyperlinkNorthPane.java
+++ b/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/FormHyperlinkNorthPane.java
@@ -110,12 +110,14 @@ public class FormHyperlinkNorthPane extends BasicBeanPane
}
String editorName = formHyperlink.getRelateEditorName();
//防止初始的时候有空白选项
- if (editorName == null) {
- return;
+ String[] formHyperlinkEditNames = getFormHyperlinkEditNames();
+ if (editorName == null && formHyperlinkEditNames.length > 0) {
+ editorName = formHyperlinkEditNames[0];
+ formHyperlink.setRelateEditorName(editorName);
}
if (targetFrameComboBox != null) {
//noinspection unchecked
- targetFrameComboBox.setModel(new DefaultComboBoxModel(getFormHyperlinkEditNames()));
+ targetFrameComboBox.setModel(new DefaultComboBoxModel(formHyperlinkEditNames));
targetFrameComboBox.setSelectedItem(editorName);
}
}
diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ChartDatapointLabelPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ChartDatapointLabelPane.java
index 48585ae5b..8e198ea6c 100644
--- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ChartDatapointLabelPane.java
+++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ChartDatapointLabelPane.java
@@ -96,7 +96,7 @@ public class ChartDatapointLabelPane extends BasicPane{
boolean isGuidline = plot.isSupportLeadLine();
if(plot.isSupportCategoryFilter()) {
- isCategory = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Format_Category_Name"));
+ isCategory = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Category_Use_Name"));
}
isSeries = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Series_Name"));
isValue = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Value"));
diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/CustomDefaultSeriesPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/CustomDefaultSeriesPane.java
index d31aad3b3..d0507acc0 100644
--- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/CustomDefaultSeriesPane.java
+++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/CustomDefaultSeriesPane.java
@@ -240,7 +240,7 @@ public class CustomDefaultSeriesPane extends BasicPane{
isCurve = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Curve_Smooth"));
lineStyle = new LineComboBox(CoreConstants.STRIKE_LINE_STYLE_ARRAY_4_CHART);
markerPane = new MarkerComboBox(MarkerFactory.getMarkerArray());
- String[] nameArray = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Null_Value_Break"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Null_Value_Continue")};
+ String[] nameArray = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Break"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Null_Value_Continue")};
Boolean[] valueArray = {true, false};
isNullValueBreak = new UIButtonGroup(nameArray, valueArray);
double p = TableLayout.PREFERRED;
diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/CustomTypeConditionSeriesPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/CustomTypeConditionSeriesPane.java
index 7b6bb3657..3c2f52349 100644
--- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/CustomTypeConditionSeriesPane.java
+++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/CustomTypeConditionSeriesPane.java
@@ -449,7 +449,7 @@ public class CustomTypeConditionSeriesPane extends BasicBeanPane{
lineStyle.setPreferredSize(new Dimension(150,20));
markerPane.setPreferredSize(new Dimension(150,20));
- String[] nameArray = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Null_Value_Break"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Null_Value_Continue")};
+ String[] nameArray = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Break"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Null_Value_Continue")};
Boolean[] valueArray = {true, false};
isNullValueBreak = new UIButtonGroup(nameArray, valueArray);
double p = TableLayout.PREFERRED;
diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/LineSeriesPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/LineSeriesPane.java
index 9fbbb1197..612e89b48 100644
--- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/LineSeriesPane.java
+++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/LineSeriesPane.java
@@ -49,7 +49,7 @@ public class LineSeriesPane extends AbstractPlotSeriesPane{
isCurve = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Curve_Smooth"));
lineStyle = new LineComboBox(CoreConstants.STRIKE_LINE_STYLE_ARRAY_4_CHART);
markerPane = new MarkerComboBox(MarkerFactory.getMarkerArray());
- String[] nameArray = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Null_Value_Break"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Null_Value_Continue")};
+ String[] nameArray = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Break"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Null_Value_Continue")};
Boolean[] valueArray = {true, false};
isNullValueBreak = new UIButtonGroup(nameArray, valueArray);
double p = TableLayout.PREFERRED;
diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/RadarSeriesPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/RadarSeriesPane.java
index 894347327..a5a3fb4d6 100644
--- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/RadarSeriesPane.java
+++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/RadarSeriesPane.java
@@ -45,7 +45,7 @@ public class RadarSeriesPane extends AbstractPlotSeriesPane{
isCurve = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Fill"));
lineStyle = new LineComboBox(CoreConstants.STRIKE_LINE_STYLE_ARRAY_4_CHART);
markerPane = new MarkerComboBox(MarkerFactory.getMarkerArray());
- String[] nameArray = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Null_Value_Break"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Null_Value_Continue")};
+ String[] nameArray = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Break"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Null_Value_Continue")};
Boolean[] valueArray = {true, false};
isNullValueBreak = new UIButtonGroup(nameArray, valueArray);
diff --git a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java
index ff1c9db41..ceeea71c2 100644
--- a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java
+++ b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java
@@ -13,6 +13,7 @@ import com.fr.design.gui.itable.UITableEditor;
import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
+import com.fr.design.mainframe.chart.gui.ChartDataPane;
import com.fr.design.mainframe.chart.gui.data.CalculateComboBox;
import com.fr.design.mainframe.chart.gui.data.table.DataPaneHelper;
import com.fr.stable.StringUtils;
@@ -49,7 +50,7 @@ public class ExtendedCustomFieldComboBoxPane extends UIComboBoxPane {
double[] columnSize = {f, e};
double[] rowSize = {p};
Component[][] components = new Component[][]{
- new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style")), styleBox},
+ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Style")), styleBox},
} ;
JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize);
this.setLayout(new BorderLayout());
@@ -36,8 +37,8 @@ public class VanChartBeautyPane extends BasicBeanPane {
}
protected String[] getNameArray(){
- return new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Default_Name"),
- com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Top_Down_Shade")
+ return new String[]{Toolkit.i18nText("Fine-Design_Chart_Default_Name"),
+ Toolkit.i18nText("Fine-Design_Chart_Style_TopDownShade")
};
}
@Override
diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/CategoryNameFormatPaneWithCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/CategoryNameFormatPaneWithCheckBox.java
index 2e0d55a41..575143a62 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/CategoryNameFormatPaneWithCheckBox.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/CategoryNameFormatPaneWithCheckBox.java
@@ -1,6 +1,7 @@
package com.fr.van.chart.designer.component.format;
+import com.fr.design.i18n.Toolkit;
import com.fr.van.chart.designer.style.VanChartStylePane;
import javax.swing.JPanel;
@@ -18,6 +19,7 @@ public class CategoryNameFormatPaneWithCheckBox extends VanChartFormatPaneWithCh
@Override
protected String getCheckBoxText() {
- return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Format_Category_Name");
+ //"分类名" 图表(新特性)标签、提示时有用到
+ return Toolkit.i18nText("Fine-Design_Chart_Category_Use_Name");
}
}
diff --git a/designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/data/comp/MapDataTree.java b/designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/data/comp/MapDataTree.java
index 16f6af6b2..642630f14 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/data/comp/MapDataTree.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/data/comp/MapDataTree.java
@@ -4,8 +4,9 @@ import com.fr.design.constants.UIConstants;
import com.fr.design.gui.ilable.UILabel;
import com.fr.general.ComparatorUtils;
import com.fr.plugin.chart.map.designer.type.GEOJSONTreeHelper;
+import com.fr.plugin.chart.map.server.ChartGEOJSONHelper;
import com.fr.plugin.chart.map.server.CompatibleGEOJSONHelper;
-import com.fr.plugin.chart.map.server.GEOJSONHelper;
+import com.fr.geojson.helper.GEOJSONHelper;
import com.fr.stable.StringUtils;
import javax.swing.JTree;
@@ -78,7 +79,7 @@ public class MapDataTree extends JTree {
DefaultMutableTreeNode currentSel = (DefaultMutableTreeNode)this.getLastSelectedPathComponent();
- return GEOJSONHelper.getInstance().getJsonUrlByPath(currentSel.getUserObject().toString());
+ return CompatibleGEOJSONHelper.getJsonUrlByPathIncludeParam(currentSel.getUserObject().toString());
}
//根据路径精确查找
@@ -96,7 +97,7 @@ public class MapDataTree extends JTree {
return null;
}
String dirPath = el.getUserObject().toString();
- String url = GEOJSONHelper.getInstance().getJsonUrlByPath(dirPath);
+ String url = CompatibleGEOJSONHelper.getJsonUrlByPathIncludeParam(dirPath);
if (GEOJSONHelper.getInstance().isValidDirPath(dirPath) && ComparatorUtils.equals(jsonUrl, url)){
selectTreeNode(el, m_model);
return el;
@@ -133,7 +134,7 @@ public class MapDataTree extends JTree {
if(treeNode == null || treeNode.getUserObject() == null){
return StringUtils.EMPTY;
}
- return GEOJSONHelper.getPresentNameWithPath(treeNode.getUserObject().toString());
+ return ChartGEOJSONHelper.getPresentNameWithPath(treeNode.getUserObject().toString());
}
//模糊搜索 深度优先.
@@ -149,7 +150,7 @@ public class MapDataTree extends JTree {
DefaultMutableTreeNode el = els.nextElement();
String path = el.getUserObject().toString();
- String fileName = GEOJSONHelper.getPresentNameWithPath(path);
+ String fileName = ChartGEOJSONHelper.getPresentNameWithPath(path);
if (GEOJSONHelper.getInstance().isValidDirPath(path) && StringUtils.contains(fileName, text)) {
selectTreeNode(el, m_model);
return;
diff --git a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelSeriesPane.java
index a6a8dcb9a..8a02cd5f4 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelSeriesPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelSeriesPane.java
@@ -44,7 +44,7 @@ public class VanChartFunnelSeriesPane extends VanChartAbstractPlotSeriesPane {
//设置色彩面板内容
protected void setColorPaneContent (JPanel panel) {
if (stylePane != null) {
- panel.add(createStylePane(), BorderLayout.CENTER);
+ panel.add(stylePane, BorderLayout.CENTER);
}
panel.add(createAlphaPane(), BorderLayout.SOUTH);
}
diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapSourceChoosePane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapSourceChoosePane.java
index 43fcb5df0..5fa180ffe 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapSourceChoosePane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapSourceChoosePane.java
@@ -18,15 +18,15 @@ import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.JTemplate;
import com.fr.general.ComparatorUtils;
-
import com.fr.general.http.HttpClient;
import com.fr.plugin.chart.base.GisLayer;
import com.fr.plugin.chart.base.ViewCenter;
import com.fr.plugin.chart.map.VanChartMapPlot;
import com.fr.plugin.chart.map.designer.type.GEOJSONTreeHelper;
import com.fr.plugin.chart.map.layer.WMSLayer;
+import com.fr.plugin.chart.map.server.ChartGEOJSONHelper;
import com.fr.plugin.chart.map.server.CompatibleGEOJSONHelper;
-import com.fr.plugin.chart.map.server.GEOJSONHelper;
+import com.fr.geojson.helper.GEOJSONHelper;
import com.fr.plugin.chart.map.server.MapLayerConfigManager;
import com.fr.plugin.chart.service.WMSFactory;
import com.fr.plugin.chart.type.GISLayerType;
@@ -201,7 +201,7 @@ public class VanChartMapSourceChoosePane extends JPanel implements UIObserver {
} else if(o instanceof String){//list里面没有
selectTreePath = null;
this.tree.setSelectionPath(null);
- this.getModel().setSelectedItem(GEOJSONHelper.getPresentNameWithPath((String) o));
+ this.getModel().setSelectedItem(ChartGEOJSONHelper.getPresentNameWithPath((String) o));
}
}
@@ -209,7 +209,7 @@ public class VanChartMapSourceChoosePane extends JPanel implements UIObserver {
protected String pathToString(TreePath path) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
//不显示后缀
- return GEOJSONHelper.getPresentNameWithPath(node.toString());
+ return ChartGEOJSONHelper.getPresentNameWithPath(node.toString());
}
@Override
@@ -533,7 +533,7 @@ public class VanChartMapSourceChoosePane extends JPanel implements UIObserver {
GEOJSONTreeHelper.getInstance().updateParamRootNode(VanChartMapSourceChoosePane.this.getParams());
if(selectTreePath != null){
- mapDataTree.setSelectNodePath(GEOJSONHelper.completeJSONName(selectTreePath.getLastPathComponent().toString()));
+ mapDataTree.setSelectNodePath(CompatibleGEOJSONHelper.completeJSONName(selectTreePath.getLastPathComponent().toString()));
selectTreePath = mapDataTree.getSelectionPath();
}
diff --git a/designer-form/src/main/java/com/fr/design/actions/FormMobileAttrAction.java b/designer-form/src/main/java/com/fr/design/actions/FormMobileAttrAction.java
index 033ba5ea5..d77078fad 100644
--- a/designer-form/src/main/java/com/fr/design/actions/FormMobileAttrAction.java
+++ b/designer-form/src/main/java/com/fr/design/actions/FormMobileAttrAction.java
@@ -3,11 +3,15 @@ package com.fr.design.actions;
import com.fr.base.BaseUtils;
import com.fr.base.iofile.attr.MobileOnlyTemplateAttrMark;
import com.fr.design.actions.JTemplateAction;
+import com.fr.design.designer.creator.XLayoutContainer;
+import com.fr.design.designer.creator.XWAbsoluteBodyLayout;
+import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.DialogActionAdapter;
import com.fr.design.form.mobile.FormMobileAttrPane;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.FormArea;
+import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.JForm;
import com.fr.design.mainframe.WidgetPropertyPane;
import com.fr.design.menu.MenuKeySet;
@@ -73,6 +77,9 @@ public class FormMobileAttrAction extends JTemplateAction {
formTpl.setFormMobileAttr(formMobileAttr); // 会调整 body 的自适应布局,放到最后
((FormArea)jf.getFormDesign().getParent()).onMobileAttrModified();
jf.getFormDesign().getSelectionModel().setSelectedCreator(jf.getFormDesign().getRootComponent());
+ //改变布局为自适应布局,只在移动端属性设置保存后改变一次
+ doChangeBodyLayout();
+
WidgetPropertyPane.getInstance().refreshDockingView();
jf.fireTargetModified();
}
@@ -80,6 +87,15 @@ public class FormMobileAttrAction extends JTemplateAction {
dialog.setVisible(true);
}
+ private void doChangeBodyLayout(){
+ FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner();
+ XLayoutContainer rootLayout = formDesigner.getRootComponent();
+ if (rootLayout.getComponentCount() == 1 && rootLayout.getXCreator(0).acceptType(XWAbsoluteBodyLayout.class)) {
+ rootLayout = (XWAbsoluteBodyLayout) rootLayout.getXCreator(0);
+ }
+ ((XWFitLayout)formDesigner.getRootComponent()).switch2FitBodyLayout(rootLayout);
+ }
+
@Focus(id = "com.fr.mobile.mobile_template_frm", text = "Fine-Design_Function_Mobile_Template_Frm", source = Original.EMBED)
private void recordFunction() {
// do nothing
diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java b/designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java
index 5eee1aca8..1e7badb8a 100644
--- a/designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java
+++ b/designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java
@@ -7,12 +7,22 @@ import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.beans.location.Direction;
import com.fr.design.designer.beans.location.Location;
-import com.fr.design.designer.creator.*;
+import com.fr.design.designer.creator.XConnector;
+import com.fr.design.designer.creator.XCreator;
+import com.fr.design.designer.creator.XCreatorUtils;
+import com.fr.design.designer.creator.XLayoutContainer;
+import com.fr.design.designer.creator.XWAbsoluteBodyLayout;
+import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelectionUtils;
import com.fr.design.utils.ComponentUtils;
-import java.awt.*;
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
@@ -94,8 +104,11 @@ public class StateModel {
return;
}
- XCreator comp = designer.getComponentAt(e.getX(), e.getY(), selectionModel.getSelection().getSelectedCreators());
- XLayoutContainer container = XCreatorUtils.getHotspotContainer(comp);
+ XLayoutContainer container = getMouseLocationContainer(e);
+ if (container == null) {
+ return;
+ }
+
XCreator creator = selectionModel.getSelection().getSelectedCreator();
Component creatorContainer = XCreatorUtils.getParentXLayoutContainer(creator);
if (creatorContainer != null && creatorContainer != container
@@ -141,11 +154,8 @@ public class StateModel {
* @param mouseReleasedY 鼠标释放位置Y
*/
private void adding(int mouseReleasedX, int mouseReleasedY) {
- // 当前鼠标所在的组件
- XCreator hoveredComponent = designer.getComponentAt(mouseReleasedX, mouseReleasedY, selectionModel.getSelection().getSelectedCreators());
-
- // 获取该组件所在的焦点容器
- XLayoutContainer container = XCreatorUtils.getHotspotContainer(hoveredComponent);
+ // 当前鼠标所在组件的容器
+ XLayoutContainer container = getMouseLocationContainer(mouseReleasedX, mouseReleasedY);
boolean success = false;
@@ -166,6 +176,33 @@ public class StateModel {
designer.setPainter(null);
}
+ /**
+ * 获取鼠标所在位置组件的容器
+ *
+ * @param e MouseEvent
+ * @return 鼠标所在位置的组件的容器
+ */
+ private XLayoutContainer getMouseLocationContainer(MouseEvent e) {
+ return getMouseLocationContainer(e.getX(), e.getY());
+ }
+
+ /**
+ * 获取鼠标所在位置组件的容器
+ *
+ * @param x x 鼠标所在位置x
+ * @param y y 鼠标所在位置y
+ * @return 鼠标所在位置的组件的容器
+ */
+ private XLayoutContainer getMouseLocationContainer(int x, int y) {
+ // 当前鼠标所在的组件
+ XCreator hoveredComponent = designer.getComponentAt(x, y, selectionModel.getSelection().getSelectedCreators());
+ if (hoveredComponent == null) {
+ return null;
+ }
+ // 获取该组件所在的焦点容器
+ return XCreatorUtils.getHotspotContainer(hoveredComponent);
+ }
+
/**
* 是否拖拽
*
@@ -246,7 +283,7 @@ public class StateModel {
if (p != null) {
try {
designer.setCursor(XConnector.connectorCursor);
- } catch (Exception e) {
+ } catch (Exception ignored) {
}
} else {
designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
@@ -433,11 +470,11 @@ public class StateModel {
// 拖拽时画依附线用到的painter
private void setDependLinePainter(MouseEvent e) {
- XCreator comp = designer.getComponentAt(e.getX(), e.getY(), selectionModel.getSelection().getSelectedCreators());
- if (comp == null) {
+ XLayoutContainer container = getMouseLocationContainer(e);
+ if (container == null) {
return;
}
- XLayoutContainer container = XCreatorUtils.getHotspotContainer(comp);
+
XCreator creator = selectionModel.getSelection().getSelectedCreator();
HoverPainter painter = AdapterBus.getContainerPainter(designer, container);
designer.setPainter(painter);
@@ -479,9 +516,8 @@ public class StateModel {
* @return xy值
*/
public Point getMouseXY(MouseEvent e) {
- Point p1 = new Point(e.getX() + designer.getArea().getHorizontalValue(), e.getY()
+ return new Point(e.getX() + designer.getArea().getHorizontalValue(), e.getY()
+ designer.getArea().getVerticalValue());
- return p1;
}
}
\ No newline at end of file
diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/ErrorCreator.java b/designer-form/src/main/java/com/fr/design/designer/creator/ErrorCreator.java
index 54a679fe1..b9a29c041 100644
--- a/designer-form/src/main/java/com/fr/design/designer/creator/ErrorCreator.java
+++ b/designer-form/src/main/java/com/fr/design/designer/creator/ErrorCreator.java
@@ -1,7 +1,7 @@
package com.fr.design.designer.creator;
-import com.fr.form.ui.ErrorMarker;
import com.fr.form.ui.Widget;
+import com.fr.form.ui.WidgetErrorMarker;
import com.fr.stable.StringUtils;
import java.awt.*;
@@ -18,7 +18,7 @@ public class ErrorCreator extends NullCreator {
@Override
protected String showText() {
- ErrorMarker marker = (ErrorMarker)toData();
+ WidgetErrorMarker marker = (WidgetErrorMarker)toData();
String text = marker.getWidgetValue().getDisplayValue();
if (StringUtils.isEmpty(text)) {
return super.showText();
diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java b/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java
index 748c37783..f51f6710b 100644
--- a/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java
+++ b/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java
@@ -26,7 +26,6 @@ import com.fr.form.ui.ComboCheckBox;
import com.fr.form.ui.DateEditor;
import com.fr.form.ui.EditorHolder;
import com.fr.form.ui.ElementCaseEditor;
-import com.fr.form.ui.ErrorMarker;
import com.fr.form.ui.FileEditor;
import com.fr.form.ui.FreeButton;
import com.fr.form.ui.IframeEditor;
@@ -42,6 +41,7 @@ import com.fr.form.ui.TextEditor;
import com.fr.form.ui.TreeComboBoxEditor;
import com.fr.form.ui.TreeEditor;
import com.fr.form.ui.Widget;
+import com.fr.form.ui.WidgetErrorMarker;
import com.fr.form.ui.container.WAbsoluteBodyLayout;
import com.fr.form.ui.container.WAbsoluteLayout;
import com.fr.form.ui.container.WBorderLayout;
@@ -66,9 +66,11 @@ import com.fr.plugin.manage.PluginFilter;
import com.fr.plugin.observer.PluginEvent;
import com.fr.plugin.observer.PluginEventListener;
import com.fr.stable.StringUtils;
+import com.fr.third.javax.annotation.Nonnull;
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.Icon;
+import java.awt.Container;
+import java.awt.Dimension;
/**
* XCreator的相关处理
@@ -158,7 +160,7 @@ public class XCreatorUtils {
objectMap.put(NameWidget.class, XNameWidget.class);
objectMap.put(CardSwitchButton.class, XCardSwitchButton.class);
objectMap.put(CardAddButton.class, XCardAddButton.class);
- objectMap.put(ErrorMarker.class, ErrorCreator.class);
+ objectMap.put(WidgetErrorMarker.class, ErrorCreator.class);
}
private static void reInitExtra() {
@@ -284,7 +286,7 @@ public class XCreatorUtils {
* @param creator 组件
* @return 返回顶层容器
*/
- public static XLayoutContainer getHotspotContainer(XCreator creator) {
+ public static XLayoutContainer getHotspotContainer(@Nonnull XCreator creator) {
if (creator.isDedicateContainer()) {
return (XLayoutContainer) creator.getParent();
}
diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XNameWidget.java b/designer-form/src/main/java/com/fr/design/designer/creator/XNameWidget.java
index b886ad6c4..267101787 100644
--- a/designer-form/src/main/java/com/fr/design/designer/creator/XNameWidget.java
+++ b/designer-form/src/main/java/com/fr/design/designer/creator/XNameWidget.java
@@ -68,7 +68,9 @@ public class XNameWidget extends XWidgetCreator {
Widget widget;
if (wc != null && (widget= wc.toWidget()) != null) {
editor = XCreatorUtils.createXCreator(widget);
- toData().setVisible(widget.isVisible());
+ Widget currentWidget = toData();
+ currentWidget.setVisible(widget.isVisible());
+ currentWidget.setEnabled(widget.isEnabled());
this.setBorder(null);
} else {
this.setBorder(DEFALUTBORDER);
diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWScaleLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWScaleLayout.java
index 2ffe6c6eb..1db5e4045 100644
--- a/designer-form/src/main/java/com/fr/design/designer/creator/XWScaleLayout.java
+++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWScaleLayout.java
@@ -10,6 +10,7 @@ import java.awt.event.ContainerEvent;
import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.adapters.layout.FRScaleLayoutAdapter;
import com.fr.design.form.layout.FRScaleLayout;
+import com.fr.design.fun.WidgetPropertyUIProvider;
import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WScaleLayout;
import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget;
@@ -166,4 +167,16 @@ public class XWScaleLayout extends DedicateLayoutContainer {
XCreator child = getXCreator(INDEX);
child.firePropertyChange();
}
+
+ /**
+ * 获取被包装的XCreator扩展的属性tab
+ * @return
+ */
+ @Override
+ public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() {
+ if (this.getXCreatorCount() > 0) {
+ return this.getXCreator(0).getWidgetPropertyUIProviders();
+ }
+ return super.getWidgetPropertyUIProviders();
+ }
}
\ No newline at end of file
diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java
index 53a72e911..107e31ed1 100644
--- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java
+++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java
@@ -106,6 +106,16 @@ public class XWCardLayout extends XLayoutContainer {
return new Dimension(500, 300);
}
+ /**
+ * 重置组件的名称
+ * @param name 名称
+ */
+ public void resetCreatorName(String name) {
+ super.resetCreatorName(name);
+ changeRelateSwitchCardName(name);
+ }
+
+
@Override
protected void initLayoutManager() {
cardLayout = new FRCardLayout(toData().getHgap(), toData().getVgap());
diff --git a/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java b/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java
index 0895d4c1d..62cea356d 100644
--- a/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java
+++ b/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java
@@ -11,6 +11,7 @@ import java.awt.Image;
import java.awt.Insets;
import java.awt.Rectangle;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import javax.swing.BorderFactory;
@@ -324,10 +325,11 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP
*/
public UpdateAction[] getActions() {
if (designerActions == null) {
- designerActions = new UpdateAction[]{new CutAction(this), new CopyAction(this), new PasteAction(this),
- new FormDeleteAction(this)};
+ designerActions = new ArrayList(Arrays.asList(new UpdateAction[]{new CutAction(this), new CopyAction(this), new PasteAction(this),
+ new FormDeleteAction(this)}));
+ dmlActions(designerActions);
}
- return designerActions;
+ return designerActions.toArray(new UpdateAction[designerActions.size()]);
}
private boolean searchQueryCreators(XLayoutContainer rootContainer) {
diff --git a/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java b/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java
index 02abef010..a2f295f87 100644
--- a/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java
+++ b/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java
@@ -3,19 +3,28 @@ package com.fr.design.mainframe;
import com.fr.design.constants.UIConstants;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer;
-import com.fr.design.designer.creator.XWAbsoluteBodyLayout;
-import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.designer.treeview.ComponentTreeCellRenderer;
import com.fr.design.designer.treeview.ComponentTreeModel;
import com.fr.design.gui.itree.UITreeUI;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.stable.StringUtils;
-import javax.swing.*;
+import javax.swing.BorderFactory;
+import javax.swing.DropMode;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JTree;
+import javax.swing.SwingUtilities;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
-import java.awt.*;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
@@ -118,7 +127,9 @@ public class ComponentTree extends JTree {
public void setAndScrollSelectionPath(TreePath[] treepath) {
setSelectionPaths(treepath);
- scrollPathToVisible(treepath[0]);
+ if (treepath.length > 0) {
+ scrollPathToVisible(treepath[0]);
+ }
}
@Override
@@ -330,8 +341,7 @@ public class ComponentTree extends JTree {
return contentPane;
}
- private BufferedImage componentToImage(Component comp) throws IOException
- {
+ private BufferedImage componentToImage(Component comp) throws IOException {
BufferedImage im = new BufferedImage(comp.getWidth(), comp.getHeight(), BufferedImage.TYPE_INT_ARGB);
comp.paint(im.getGraphics());
return im;
@@ -341,14 +351,14 @@ public class ComponentTree extends JTree {
private void updateSize() {
int width = compImage.getWidth();
int height = compImage.getHeight();
- double aspectRatio = (double)width / height;
+ double aspectRatio = (double) width / height;
if (width > MAX_WIDTH) {
width = MAX_WIDTH;
- height = (int)(width / aspectRatio);
+ height = (int) (width / aspectRatio);
}
if (height > MAX_HEIGHT) {
height = MAX_HEIGHT;
- width = (int)(height * aspectRatio);
+ width = (int) (height * aspectRatio);
}
this.setPreferredSize(new Dimension(width, height));
}
diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java b/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java
index b313bc143..5dd42de8d 100644
--- a/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java
+++ b/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java
@@ -1,9 +1,11 @@
package com.fr.design.mainframe;
+import com.fr.base.FRContext;
import com.fr.base.Parameter;
import com.fr.base.ScreenResolution;
import com.fr.base.vcs.DesignerMode;
import com.fr.design.DesignState;
+import com.fr.design.ExtraDesignClassManager;
import com.fr.design.actions.UpdateAction;
import com.fr.design.base.mode.DesignModeContext;
import com.fr.design.designer.TargetComponent;
@@ -39,6 +41,7 @@ import com.fr.design.designer.properties.FormWidgetAuthorityEditPane;
import com.fr.design.event.DesignerOpenedListener;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.form.util.XCreatorConstants;
+import com.fr.design.fun.RightSelectionHandlerProvider;
import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus;
import com.fr.design.menu.MenuDef;
import com.fr.design.menu.ShortCut;
@@ -62,6 +65,7 @@ import com.fr.general.ComparatorUtils;
import com.fr.general.FRLogger;
import com.fr.stable.ArrayUtils;
import com.fr.stable.bridge.StableFactory;
+import com.fr.third.javax.annotation.Nullable;
import javax.swing.Action;
import javax.swing.JComponent;
@@ -89,6 +93,7 @@ import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Set;
/**
* 设计界面组件。该组件是界面设计工具的核心,主要负责的是被设计界面的显示,界面设计操作状态的 显示,编辑状态的显示等等。
@@ -132,7 +137,7 @@ public class FormDesigner extends TargetComponent