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 251ee7af86..4ebc64103d 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 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/designer/TargetComponent.java b/designer-base/src/main/java/com/fr/design/designer/TargetComponent.java
index 5556a66055..30ed7e66e9 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/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java
index b73805ee66..e4bd1db952 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
@@ -5,6 +5,7 @@ import com.fr.design.DesignerEnvManager;
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;
@@ -99,6 +100,10 @@ public class HistoryTemplateListCache implements CallbackEvent {
return this.editingTemplate;
}
+ /**
+ * @param jt jt
+ * @see DesignerFrameFileDealerPane#setCurrentEditingTemplate(JTemplate)
+ */
public void setCurrentEditingTemplate(JTemplate, ?> jt) {
this.editingTemplate = jt;
//如果当前历史面板中没有
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 a51735f641..2dc56cc9da 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/formula/FunctionConstants.java b/designer-base/src/main/java/com/fr/design/formula/FunctionConstants.java
index 750df1bad1..eee75a2220 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
@@ -13,6 +13,7 @@ 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;
@@ -66,7 +67,6 @@ public final class FunctionConstants {
while (urlEnumeration.hasMoreElements()) {
URL url = urlEnumeration.nextElement();
String classFilePath = url.getFile();
-
/*
* alex:url.getFile获取的地址中,如果有空格或中文会被URLEncoder.encode处理
* 会变成%20这种%打头的东西,但是new File的时候%20是无法解析成空格,所以在此需要做URLDecoder.decode处理
@@ -77,10 +77,9 @@ public final class FunctionConstants {
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
- */
+ if (isCustomFormulaPath(classFilePath)) {
+ continue;
+ }
for (String fileName : findClassNamesUnderFilePath(classFilePath)) {
try {
Class> cls = Class.forName(pkgName + "." + fileName.substring(0, fileName.length() - 6));
@@ -94,12 +93,27 @@ public final class FunctionConstants {
}
}
} 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
*/
@@ -145,7 +159,7 @@ public final class FunctionConstants {
* alex:如果是jar包中的class文件
* file:/D:/opt/FineReport6.5/WebReport/WEB-INF/lib/fr-server-6.5.jar!/com/fr/rpt/script/function
*/
- if (filePath.contains("!/")) {
+ if (isJarPath(filePath)) {
String[] arr = filePath.split("!/");
String jarPath = arr[0].substring(6); // alex:substring(6)去掉前面的file:/这六个字符
String classPath = arr[1];
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 de6bccd865..5672a8502d 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,9 @@
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 +11,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 {
@@ -82,9 +82,6 @@ public class UIAutoCompletionField extends UITextField implements DocumentListen
}
private void textChanged() {
- if (OperatingSystem.isMacOS()) {
- return;
- }
if (!popup.isVisible()) {
showPopup();
requestFocus();
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 559387b208..d3cff1ff95 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/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java
index 7b80c3fd74..7f5cab7448 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
@@ -75,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;
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 7df132d6e9..fb87f7f049 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/mobile/ui/DefaultMobileStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileStyleDefinePane.java
index 7ffd0abe21..10fc42e8f1 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
@@ -95,9 +95,9 @@ public class DefaultMobileStyleDefinePane extends MobileTemplateStyleDefinePane
int ascentHeight = fm.getAscent();
for (int i = 0; i < cardTagLayout.getWidgetCount(); i++) {
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.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 70499f3028..ff76e5fed5 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
@@ -163,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());
@@ -173,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/UpMenuStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/UpMenuStyleDefinePane.java
index ddd4c202d0..be8ff823a9 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
@@ -188,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 d5ddbb6b9f..73f09f04e0 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/test/java/com/fr/design/formula/FunctionConstantsTest.java b/designer-base/src/test/java/com/fr/design/formula/FunctionConstantsTest.java
index 33cfd577da..75c9c9e5ba 100644
--- a/designer-base/src/test/java/com/fr/design/formula/FunctionConstantsTest.java
+++ b/designer-base/src/test/java/com/fr/design/formula/FunctionConstantsTest.java
@@ -1,14 +1,24 @@
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 {
@@ -37,4 +47,30 @@ public class FunctionConstantsTest {
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-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 5eee1aca8d..1e7badb8a3 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/XCreatorUtils.java b/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java
index 748c377836..774010136c 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
@@ -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的相关处理
@@ -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/cardlayout/XWCardLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java
index 53a72e9112..107e31ed12 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/mainframe/ComponentTree.java b/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java
index 02abef0105..a2f295f87d 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 fd0de4b257..5dd42de8d9 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
@@ -65,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;
@@ -918,7 +919,7 @@ public class FormDesigner extends TargetComponent