diff --git a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java
index f00e1a8558..48f05f7e2c 100644
--- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java
+++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java
@@ -91,6 +91,8 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
private static final String VERSION100 = "100";
private static final int CACHINGTEMPLATE_LIMIT = 5;
private static final String WEB_NAME = "webapps";
+ public static final int LAYOUT_TEMPLATE_SIMPLE_STYLE = 0;
+ public static final int LAYOUT_TEMPLATE_REAL_STYLE = 1;
/**
* 指定默认工作空间
*/
@@ -205,6 +207,8 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
private boolean showTemplateMissingPlugin = true;
+ private int layoutTemplateStyle = LAYOUT_TEMPLATE_SIMPLE_STYLE;
+
/**
* DesignerEnvManager.
*/
@@ -1691,6 +1695,14 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
this.openDebug = openDebug;
}
+ public int getLayoutTemplateStyle() {
+ return layoutTemplateStyle;
+ }
+
+ public void setLayoutTemplateStyle(int layoutTemplateStyle) {
+ this.layoutTemplateStyle = layoutTemplateStyle;
+ }
+
/**
* Read XML.
* The method will be invoked when read data from XML file.
@@ -1861,6 +1873,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
this.setEmbedServerLazyStartup(reader.getAttrAsBoolean("embedServerLazyStartup", false));
this.setShowTemplateMissingPlugin(reader.getAttrAsBoolean("showTemplateMissingPlugin", true));
this.setShowServerDatasetAuthTip(reader.getAttrAsBoolean("showServerDatasetAuthTip", true));
+ this.setLayoutTemplateStyle(reader.getAttrAsInt("layoutTemplateStyle", LAYOUT_TEMPLATE_SIMPLE_STYLE));
}
private void readReportPaneAttributions(XMLableReader reader) {
@@ -2134,6 +2147,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
if (!this.isShowTemplateMissingPlugin()) {
writer.attr("showTemplateMissingPlugin", this.isShowTemplateMissingPlugin());
}
+ writer.attr("layoutTemplateStyle", this.getLayoutTemplateStyle());
writer.attr("showServerDatasetAuthTip", this.isShowServerDatasetAuthTip());
writer.end();
}
diff --git a/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java b/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java
index 6158540888..eaff26ba5a 100644
--- a/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java
+++ b/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java
@@ -14,6 +14,7 @@ import com.fr.general.CloudCenter;
import com.fr.general.ComparatorUtils;
import com.fr.general.GeneralContext;
import com.fr.general.GeneralUtils;
+import com.fr.i18n.UrlI18nManager;
import com.fr.locale.InterProviderFactory;
import com.fr.stable.ProductConstants;
import com.fr.stable.StringUtils;
@@ -82,7 +83,7 @@ public class AboutPane extends JPanel {
addPhoneAndQQPane(contentPane);
// 官网
- JPanel urlActionPane = getURLActionPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Official_Website"), CloudCenter.getInstance().acquireConf("website." + GeneralContext.getLocale(), ProductConstants.WEBSITE_URL));
+ JPanel urlActionPane = getURLActionPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Official_Website"), UrlI18nManager.getInstance().getI18nUrl("website"));
// 支持邮箱
String defaultEmail = CloudCenter.getInstance().acquireConf("support.email", ProductConstants.SUPPORT_EMAIL);
diff --git a/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java b/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java
index 51a390c82d..5a14391149 100644
--- a/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java
+++ b/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java
@@ -3,9 +3,9 @@ package com.fr.design.actions.help;
import com.fr.design.i18n.Toolkit;
import com.fr.design.login.AbstractDesignerSSO;
import com.fr.design.menu.MenuKeySet;
-import com.fr.general.CloudCenter;
import com.fr.general.GeneralContext;
import com.fr.general.http.HttpToolbox;
+import com.fr.i18n.UrlI18nManager;
import com.fr.stable.CommonUtils;
import com.fr.stable.ProductConstants;
import com.fr.stable.StringUtils;
@@ -28,7 +28,7 @@ public class TutorialAction extends AbstractDesignerSSO {
@Override
public String getJumpUrl() {
- return CloudCenter.getInstance().acquireUrlByKind(createDocKey(), "http://help.finereport.com");
+ return UrlI18nManager.getInstance().getI18nUrl("help");
}
// 生成帮助文档 sitecenter key, help.zh_CN.10
diff --git a/designer-base/src/main/java/com/fr/design/actions/server/GlobalTableDataAction.java b/designer-base/src/main/java/com/fr/design/actions/server/GlobalTableDataAction.java
index fdfdc31b5b..1457f0d111 100644
--- a/designer-base/src/main/java/com/fr/design/actions/server/GlobalTableDataAction.java
+++ b/designer-base/src/main/java/com/fr/design/actions/server/GlobalTableDataAction.java
@@ -88,7 +88,6 @@ public class GlobalTableDataAction extends UpdateAction implements ResponseDataS
}
protected void renameConnection(final String oldName, final String newName) {
- tableDataConfig.renameTableData(oldName, newName);
StrategyEventsNotifier.modifyDataSet(DSMapping.ofServerDS(new DsNameTarget(oldName)));
}
};
diff --git a/designer-base/src/main/java/com/fr/design/beans/ErrorMsgTextFieldAdapter.java b/designer-base/src/main/java/com/fr/design/beans/ErrorMsgTextFieldAdapter.java
new file mode 100644
index 0000000000..e2444a4eca
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/beans/ErrorMsgTextFieldAdapter.java
@@ -0,0 +1,11 @@
+package com.fr.design.beans;
+
+import javax.swing.JComponent;
+
+public interface ErrorMsgTextFieldAdapter {
+ void setText(String str);
+
+ String getText();
+
+ JComponent getErrorMsgTextField();
+}
diff --git a/designer-base/src/main/java/com/fr/design/beans/UITextFieldAdapter.java b/designer-base/src/main/java/com/fr/design/beans/UITextFieldAdapter.java
new file mode 100644
index 0000000000..48fa6944fc
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/beans/UITextFieldAdapter.java
@@ -0,0 +1,46 @@
+package com.fr.design.beans;
+
+import com.fr.design.gui.itextfield.UITextField;
+
+import javax.swing.JComponent;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+
+public class UITextFieldAdapter implements ErrorMsgTextFieldAdapter {
+ private final UITextField uiTextField = new UITextField();
+
+ public UITextFieldAdapter(){
+ addDocumentListener();
+ }
+ @Override
+ public void setText(String str) {
+ uiTextField.setText(str);
+ }
+
+ @Override
+ public String getText() {
+ return uiTextField.getText();
+ }
+
+ public void addDocumentListener() {
+ uiTextField.getDocument().addDocumentListener(new DocumentListener() {
+
+ public void changedUpdate(DocumentEvent e) {
+ uiTextField.setToolTipText(uiTextField.getText());
+ }
+
+ public void insertUpdate(DocumentEvent e) {
+ uiTextField.setToolTipText(uiTextField.getText());
+ }
+
+ public void removeUpdate(DocumentEvent e) {
+ uiTextField.setToolTipText(uiTextField.getText());
+ }
+ });
+ }
+
+ @Override
+ public JComponent getErrorMsgTextField() {
+ return uiTextField;
+ }
+}
\ No newline at end of file
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 ab86a0d6f2..f7eb9bacc4 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
@@ -47,9 +47,11 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -71,8 +73,8 @@ public abstract class DesignTableDataManager {
* 其实globalDsCache没有绝对的必要,只是为了操作方便。如果没有它,那么每次清空服务器数据集或者存储过程的时候,还要去遍历找一下,
* 这个操作可能比较复杂 。 从减少代码复杂度的角度看,还是很有必要的
*/
- private static java.util.Map globalDsCache = new java.util.HashMap();
- private static java.util.Map dsNameChangedMap = new HashMap();
+ private static Map globalDsCache = new java.util.HashMap();
+ private static Set dsNameChangedSet = new LinkedHashSet<>();
private static List globalDsListeners = new ArrayList<>();
private static Map> dsListenersMap = new ConcurrentHashMap<>();
@@ -123,7 +125,7 @@ public abstract class DesignTableDataManager {
public static void envChange() {
columnCache.clear();
dsListenersMap.clear();
- dsNameChangedMap.clear();
+ dsNameChangedSet.clear();
clearGlobalDs();
}
@@ -136,17 +138,17 @@ public abstract class DesignTableDataManager {
public static void fireDSChanged(Map dsNameChangedMap) {
clearGlobalDs();
if (!dsNameChangedMap.isEmpty()) {
- setDsNameChangedMap(dsNameChangedMap);
+ setDsNameChangedSet(dsNameChangedMap);
}
fireDsChanged();
dsNameChangedMap.clear();
}
- private static void setDsNameChangedMap(Map map) {
+ private static void setDsNameChangedSet(Map map) {
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = (String) iterator.next();
- dsNameChangedMap.put(key, map.get(key));
+ dsNameChangedSet.add(new NameChangeBean(key, map.get(key)));
}
}
@@ -157,23 +159,21 @@ public abstract class DesignTableDataManager {
* @return 是则返回true
*/
public static boolean isDsNameChanged(String oldDsName) {
- return dsNameChangedMap.containsKey(oldDsName);
- }
-
- public static String getChangedDsNameByOldDsName(String oldDsName) {
- String changeName;
-
- if (isDsNameChanged(oldDsName)) {
- changeName = dsNameChangedMap.get(oldDsName);
- } else {
- changeName = StringUtils.EMPTY;
+ for (NameChangeBean bean : dsNameChangedSet) {
+ if (ComparatorUtils.equals(oldDsName, bean.getOldName())) {
+ return true;
+ }
}
+ return false;
+ }
- if (StringUtils.isNotEmpty(changeName)) {
- return getChangedDsNameByOldDsName(changeName);
- } else {
- return oldDsName;
+ public static String getChangedDsNameByOldDsName(String dsName) {
+ for (NameChangeBean bean : dsNameChangedSet) {
+ if (ComparatorUtils.equals(dsName, bean.getOldName())) {
+ dsName = bean.getChangedName();
+ }
}
+ return dsName;
}
public static void addGlobalDsChangeListener(ChangeListener l) {
diff --git a/designer-base/src/main/java/com/fr/design/data/NameChangeBean.java b/designer-base/src/main/java/com/fr/design/data/NameChangeBean.java
new file mode 100644
index 0000000000..2d4caf44e3
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/data/NameChangeBean.java
@@ -0,0 +1,27 @@
+package com.fr.design.data;
+
+public class NameChangeBean {
+ private String oldName;
+ private String changedName;
+
+ public NameChangeBean(String oldName, String changedName) {
+ this.oldName = oldName;
+ this.changedName = changedName;
+ }
+
+ public String getOldName() {
+ return oldName;
+ }
+
+ public void setOldName(String oldName) {
+ this.oldName = oldName;
+ }
+
+ public String getChangedName() {
+ return changedName;
+ }
+
+ public void setChangedName(String changedName) {
+ this.changedName = changedName;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java
index 32bd070d95..a16c16e24d 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java
@@ -251,7 +251,7 @@ public class TableDataPaneListPane extends JListControlPane implements TableData
try {
WorkContext.getCurrent().get(TableDataOperator.class).saveTableData(tableDataBeans);
if (!WorkContext.getCurrent().isLocal()) {
- EventDispatcher.fire(RemoteConfigEvent.EDIT, TableDataConfig.class.getSimpleName());
+ EventDispatcher.fire(RemoteConfigEvent.EDIT, TableDataConfig.getInstance().getNameSpace());
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java
index 0850cf05a1..6a9c2d1edb 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java
@@ -186,10 +186,12 @@ public class TableDataTreePane extends BasicTableDataTreePane {
for (int i = 0; i < lineTips.length; i++) {
String lineTip = lineTips[i];
List jLabels = new ArrayList<>();
- jLabels.add(new JLabel(lineTip));
+ JLabel lineJLabel = new JLabel(lineTip);
+ lineJLabel.setForeground(Color.lightGray);
+ jLabels.add(lineJLabel);
if (i == (lineTips.length - 1)) {
JLabel jLabel = new JLabel(Toolkit.i18nText("Fine-Design_Basic_Alphafine_No_Remind"));
- jLabel.setForeground(Color.lightGray);
+ jLabel.setForeground(Color.blue);
jLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java
index 018aa8f4c8..8c49a915d4 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java
@@ -12,6 +12,7 @@ import com.fr.design.fun.ConnectionProvider;
import com.fr.design.gui.controlpane.JListControlPane;
import com.fr.design.gui.controlpane.NameObjectCreator;
import com.fr.design.gui.controlpane.NameableCreator;
+import com.fr.design.gui.ilist.ListModelElement;
import com.fr.design.i18n.Toolkit;
import com.fr.event.EventDispatcher;
import com.fr.file.ConnectionConfig;
@@ -27,13 +28,14 @@ import com.fr.third.org.apache.commons.collections4.MapUtils;
import com.fr.workspace.WorkContext;
import com.fr.file.ConnectionOperator;
import java.awt.Window;
-import javax.swing.*;
+import javax.swing.SwingUtilities;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.UUID;
/**
* Connection List Pane.
@@ -182,7 +184,7 @@ public class ConnectionListPane extends JListControlPane implements ConnectionSh
try {
WorkContext.getCurrent().get(ConnectionOperator.class).saveConnection(connectionBeans);
if (!WorkContext.getCurrent().isLocal()) {
- EventDispatcher.fire(RemoteConfigEvent.EDIT, ConnectionConfig.class.getSimpleName());
+ EventDispatcher.fire(RemoteConfigEvent.EDIT, ConnectionConfig.getInstance().getNameSpace());
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
@@ -197,14 +199,23 @@ public class ConnectionListPane extends JListControlPane implements ConnectionSh
ConnectionConfig cloned = connectionConfig.mirror();
populate(cloned);
}
-
- @Override
- protected void renameConnection(String oldName, String newName) {
- connectionConfig.renameConnection(oldName, newName);
- }
};
final BasicDialog connectionListDialog = connectionManagerPane.showLargeWindow(parent, null);
connectionListDialog.addDialogActionListener(new ConnectionListDialogActionAdapter(connectionManagerPane, connectionListDialog, connectionConfig));
connectionListDialog.setVisible(true);
}
+
+ @Override
+ public void onCopyItem() {
+ super.onCopyItem();
+ ListModelElement selectedValue = getSelectedValue();
+ // identity 需要重置
+ if (selectedValue != null && selectedValue.wrapper != null) {
+ Object temp = ((NameObject) selectedValue.wrapper).getObject();
+ if (temp instanceof JDBCDatabaseConnection) {
+ JDBCDatabaseConnection object = (JDBCDatabaseConnection) temp;
+ object.setIdentity(UUID.randomUUID().toString());
+ }
+ }
+ }
}
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java
index 0da46965b1..1f9b90dbbb 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java
@@ -16,8 +16,8 @@ import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.utils.BrowseUtils;
import com.fr.file.filter.ChooseFileFilter;
-import com.fr.general.CloudCenter;
import com.fr.general.ComparatorUtils;
+import com.fr.i18n.UrlI18nManager;
import com.fr.stable.ArrayUtils;
import com.fr.stable.EncodeConstants;
import com.fr.stable.StringUtils;
@@ -159,7 +159,7 @@ public class JDBCDefPane extends JPanel {
odbcTipsLink.setPreferredSize(new Dimension(GraphHelper.getWidth(Toolkit.i18nText("Fine-Design_Basic_Odbc_Tips")), odbcTipsLink.getPreferredSize().height));
odbcTipsLink.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
- String url = CloudCenter.getInstance().acquireUrlByKind("odbc.help");
+ String url = UrlI18nManager.getInstance().getI18nUrl("odbc.help");
BrowseUtils.browser(url);
}
});
diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaChecker.java b/designer-base/src/main/java/com/fr/design/formula/FormulaChecker.java
index 093f26edf8..59446169d3 100644
--- a/designer-base/src/main/java/com/fr/design/formula/FormulaChecker.java
+++ b/designer-base/src/main/java/com/fr/design/formula/FormulaChecker.java
@@ -25,7 +25,7 @@ public class FormulaChecker {
private static final String INVALID_FORMULA = Toolkit.i18nText("Fine-Design_Basic_FormulaD_Invalid_Formula");
public static final String COLON = ":";
- public static String check(String formulaText) {
+ public static String check(String formulaText) throws FormulaCheckerException {
StringReader in = new StringReader(formulaText);
FRLexer lexer = new FRLexer(in);
@@ -34,12 +34,15 @@ public class FormulaChecker {
try {
Expression expression = parser.parse();
Node node = expression.getConditionalExpression();
- return FunctionCheckerDispatcher.getInstance()
- .getFunctionChecker(node)
- .checkFunction(node) ? VALID_FORMULA : INVALID_FORMULA;
+ boolean valid = FunctionCheckerDispatcher.getInstance().getFunctionChecker(node).checkFunction(node);
+ if (valid) {
+ return VALID_FORMULA;
+ } else {
+ throw new FormulaCheckerException(INVALID_FORMULA);
+ }
} catch (ConditionCheckWrongException cce) {
String functionName = cce.getFunctionName();
- return functionName + Toolkit.i18nText("Fine-Design_Basic_Formula_Check_Condition_Tips") + COLON;
+ throw new FormulaCheckerException(functionName + Toolkit.i18nText("Fine-Design_Basic_Formula_Check_Condition_Tips") + COLON);
} catch (FunctionCheckWrongException ce) {
List rules = ce.getRules();
String functionName = ce.getFunctionName();
@@ -60,10 +63,10 @@ public class FormulaChecker {
errorMsg.append(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula_Check_Or"));
}
}
- return errorMsg.toString();
+ throw new FormulaCheckerException(errorMsg.toString());
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
- return INVALID_FORMULA;
+ throw new FormulaCheckerException(INVALID_FORMULA);
// alex:继续往下面走,expression为null时告知不合法公式
}
}
diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaCheckerException.java b/designer-base/src/main/java/com/fr/design/formula/FormulaCheckerException.java
new file mode 100644
index 0000000000..42fc585cbb
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/formula/FormulaCheckerException.java
@@ -0,0 +1,11 @@
+package com.fr.design.formula;
+
+public class FormulaCheckerException extends Exception {
+ public FormulaCheckerException() {
+
+ }
+
+ public FormulaCheckerException(String message) {
+ super(message);
+ }
+}
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 447421a415..6012bba195 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
@@ -650,12 +650,14 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
public void actionPerformed(ActionEvent evt) {
// Execute Formula default cell element.
String formulaText = formulaTextArea.getText().trim();
- String formulaValidMessage = FormulaChecker.check(formulaText);
- FineJOptionPane.showMessageDialog(
- FormulaPane.this,
- formulaValidMessage + ".",
- com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"),
- JOptionPane.WARNING_MESSAGE);
+ String formulaValidMessage;
+ try {
+ formulaValidMessage = FormulaChecker.check(formulaText);
+ showMessageDialog(formulaValidMessage + ".");
+ } catch (FormulaCheckerException e) {
+ formulaValidMessage = e.getMessage();
+ showMessageDialog(formulaValidMessage + ".", false);
+ }
}
};
@@ -663,22 +665,26 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
@Override
public void actionPerformed(ActionEvent e) {
String formulaText = formulaTextArea.getText().trim();
- String formulaValidMessage = FormulaChecker.check(formulaText);
- ;
String unSupportFormula = containsUnsupportedSimulationFormulas(formulaText);
if (unSupportFormula != null) {
- FineJOptionPane.showMessageDialog(
- FormulaPane.this,
- com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula_Unsupported_Formulas") + ":" + unSupportFormula,
- com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"),
- JOptionPane.INFORMATION_MESSAGE);
+ showMessageDialog(Toolkit.i18nText("Fine-Design_Basic_Formula_Unsupported_Formulas") + ":" + unSupportFormula, false);
return;
}
+
+ String formulaValidMessage;
+ boolean formulaValid;
+ try {
+ formulaValidMessage = FormulaChecker.check(formulaText);
+ formulaValid = true;
+ } catch (FormulaCheckerException formulaCheckerException) {
+ formulaValidMessage = formulaCheckerException.getMessage();
+ formulaValid = false;
+ }
String messageTips;
- if (formulaValidMessage.equals(INVALID_FORMULA)) {
+ if (ComparatorUtils.equals(formulaValidMessage, INVALID_FORMULA)) {
messageTips = INVALID_FORMULA;
} else {
- messageTips = formulaValidMessage.equals(VALID_FORMULA) ? "" : formulaValidMessage + "\n";
+ messageTips = ComparatorUtils.equals(formulaValidMessage, VALID_FORMULA) ? "" : formulaValidMessage + "\n";
Map paramsMap = setParamsIfExist(formulaText);
Calculator calculator = Calculator.createCalculator();
ParameterMapNameSpace parameterMapNameSpace = ParameterMapNameSpace.create(paramsMap);
@@ -699,19 +705,33 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
String result = objectToString.length() > DEFUAL_FOMULA_LENGTH ?
objectToString.substring(0, DEFUAL_FOMULA_LENGTH - ELLIPSIS.length()) + ELLIPSIS : objectToString;
messageTips = messageTips +
- com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula_Cal_Result") + ":" + result;
+ Toolkit.i18nText("Fine-Design_Basic_Formula_Cal_Result") + ":" + result;
FineLoggerFactory.getLogger().info("value:{}", value);
} catch (UtilEvalError utilEvalError) {
FineLoggerFactory.getLogger().error("", utilEvalError);
}
}
+ showMessageDialog(messageTips, formulaValid);
+ }
+ };
+
+ private void showMessageDialog(String message) {
+ showMessageDialog(message, true);
+ }
+
+ private void showMessageDialog(String message, boolean formulaValid) {
+ if (formulaValid) {
+ FineJOptionPane.showMessageDialog(
+ FormulaPane.this,
+ message);
+ } else {
FineJOptionPane.showMessageDialog(
FormulaPane.this,
- messageTips,
- com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"),
- JOptionPane.INFORMATION_MESSAGE);
+ message,
+ Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"),
+ JOptionPane.WARNING_MESSAGE);
}
- };
+ }
private String containsUnsupportedSimulationFormulas(String formulaText) {
try {
diff --git a/designer-base/src/main/java/com/fr/design/fun/RegPaneProvider.java b/designer-base/src/main/java/com/fr/design/fun/RegPaneProvider.java
new file mode 100644
index 0000000000..26fe62b5e6
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/RegPaneProvider.java
@@ -0,0 +1,11 @@
+package com.fr.design.fun;
+
+import com.fr.design.gui.frpane.RegFieldPane;
+import com.fr.stable.fun.mark.Immutable;
+
+public interface RegPaneProvider extends Immutable {
+ int CURRENT_LEVEL = 1;
+ String XML_TAG = "RegPaneProvider";
+
+ RegFieldPane createRegPane();
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/TextFieldAdapterProvider.java b/designer-base/src/main/java/com/fr/design/fun/TextFieldAdapterProvider.java
new file mode 100644
index 0000000000..7ab8c782b4
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/TextFieldAdapterProvider.java
@@ -0,0 +1,11 @@
+package com.fr.design.fun;
+
+import com.fr.design.beans.ErrorMsgTextFieldAdapter;
+import com.fr.stable.fun.mark.Immutable;
+
+public interface TextFieldAdapterProvider extends Immutable {
+ String XML_TAG = "TextFieldAdapterProvider";
+ int CURRENT_LEVEL = 1;
+
+ ErrorMsgTextFieldAdapter createTextFieldAdapter();
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractRegPaneProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractRegPaneProvider.java
new file mode 100644
index 0000000000..98185f2a5a
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractRegPaneProvider.java
@@ -0,0 +1,22 @@
+package com.fr.design.fun.impl;
+
+import com.fr.design.fun.RegPaneProvider;
+import com.fr.stable.fun.mark.API;
+
+/**
+ * @author Joe
+ * 2021/10/8 15:19
+ */
+@API(level = RegPaneProvider.CURRENT_LEVEL)
+public abstract class AbstractRegPaneProvider implements RegPaneProvider {
+
+ @Override
+ public int currentAPILevel() {
+ return CURRENT_LEVEL;
+ }
+
+ @Override
+ public int layerIndex() {
+ return DEFAULT_LAYER_INDEX;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractTextFieldAdapterProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractTextFieldAdapterProvider.java
new file mode 100644
index 0000000000..bc0836eb40
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractTextFieldAdapterProvider.java
@@ -0,0 +1,22 @@
+package com.fr.design.fun.impl;
+
+import com.fr.design.fun.TextFieldAdapterProvider;
+import com.fr.stable.fun.mark.API;
+
+/**
+ * @author Joe
+ * 2021/10/8 15:17
+ */
+@API(level = TextFieldAdapterProvider.CURRENT_LEVEL)
+public abstract class AbstractTextFieldAdapterProvider implements TextFieldAdapterProvider {
+
+ @Override
+ public int currentAPILevel() {
+ return CURRENT_LEVEL;
+ }
+
+ @Override
+ public int layerIndex() {
+ return DEFAULT_LAYER_INDEX;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java
index 381a9cd761..a9321879c8 100644
--- a/designer-base/src/main/java/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java
@@ -24,6 +24,16 @@ public abstract class AbstractAttrNoScrollPane extends BasicPane {
private AttributeChangeListener listener;
private String globalName = "";
+ private boolean autoFireAttributesChanged = true;
+
+ public boolean isAutoFireAttributesChanged() {
+ return this.autoFireAttributesChanged;
+ }
+
+ public void setAutoFireAttributesChanged(boolean autoFireAttributesChanged) {
+ this.autoFireAttributesChanged = autoFireAttributesChanged;
+ }
+
protected AbstractAttrNoScrollPane() {
initAll();
}
@@ -127,7 +137,9 @@ public abstract class AbstractAttrNoScrollPane extends BasicPane {
public void attributeChanged() {
synchronized (this) {
if (listener != null) {
- listener.attributeChange();
+ if (autoFireAttributesChanged) {
+ listener.attributeChange();
+ }
}
}
}
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/AttributeChangeUtils.java b/designer-base/src/main/java/com/fr/design/gui/frpane/AttributeChangeUtils.java
new file mode 100644
index 0000000000..bfc1ff9d45
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/AttributeChangeUtils.java
@@ -0,0 +1,47 @@
+package com.fr.design.gui.frpane;
+
+import java.awt.Component;
+import java.awt.Container;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/9/17
+ */
+public class AttributeChangeUtils {
+ private static AbstractAttrNoScrollPane findNearestAttrNoScrollPaneAncestor(Component c) {
+ for(Container p = c.getParent(); p != null; p = p.getParent()) {
+ if (p instanceof AbstractAttrNoScrollPane) {
+ return (AbstractAttrNoScrollPane) p;
+ }
+ }
+ return null;
+ }
+
+ public static void changeComposedUI(Component composedComponent, boolean fireMiddleStateChanged, UIChangeAction action) {
+ AbstractAttrNoScrollPane attrPane = findNearestAttrNoScrollPaneAncestor(composedComponent);
+ boolean oldAutoFire = true;
+
+ if (!fireMiddleStateChanged) {
+ // 禁止属性面板自动处理属性更新
+ if (attrPane != null) {
+ oldAutoFire = attrPane.isAutoFireAttributesChanged();
+ attrPane.setAutoFireAttributesChanged(false);
+ }
+ }
+
+ // 更新UI
+ action.changeComposedUI();
+
+ if (!fireMiddleStateChanged) {
+ // 恢复属性面板自动处理属性更新
+ if (attrPane != null) {
+ attrPane.setAutoFireAttributesChanged(oldAutoFire);
+ }
+ }
+ }
+
+ public interface UIChangeAction {
+ void changeComposedUI();
+ }
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/RegFieldPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/RegFieldPane.java
index 5d37fb4a96..38e33514bc 100644
--- a/designer-base/src/main/java/com/fr/design/gui/frpane/RegFieldPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/RegFieldPane.java
@@ -1,21 +1,25 @@
package com.fr.design.gui.frpane;
+import com.fr.design.ExtraDesignClassManager;
+import com.fr.design.beans.ErrorMsgTextFieldAdapter;
+import com.fr.design.beans.UITextFieldAdapter;
import com.fr.design.constants.LayoutConstants;
import com.fr.design.designer.IntervalConstants;
import com.fr.design.dialog.BasicPane;
+import com.fr.design.fun.TextFieldAdapterProvider;
import com.fr.design.gui.ilable.UILabel;
-import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.form.ui.TextEditor;
import com.fr.form.ui.reg.NoneReg;
import com.fr.form.ui.reg.RegExp;
+import com.fr.log.FineLoggerFactory;
-
-import javax.swing.*;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-import java.awt.*;
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
/**
* Created by kerry on 2017/9/4.
@@ -23,7 +27,7 @@ import java.awt.*;
public class RegFieldPane extends RegPane {
protected RegErrorMsgPane regErrorMsgPane;
- public RegFieldPane(){
+ public RegFieldPane() {
this(ALL_REG_TYPE);
}
@@ -39,8 +43,8 @@ public class RegFieldPane extends RegPane {
@Override
public void regChangeAction() {
- RegExp regExp = (RegExp)getRegComboBox().getSelectedItem();
- if(regExp instanceof NoneReg){
+ RegExp regExp = (RegExp) getRegComboBox().getSelectedItem();
+ if (regExp instanceof NoneReg) {
regErrorMsgPane.setVisible(false);
return;
}
@@ -67,33 +71,35 @@ public class RegFieldPane extends RegPane {
}
private static class RegErrorMsgPane extends BasicPane {
- private UITextField regErrorMsgField;
+ private ErrorMsgTextFieldAdapter errorMsgTextFieldAdapter;
public RegErrorMsgPane() {
+ initRegErrorMsgField();
+ setStyle();
+ }
+
+ private void setStyle() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
this.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L6, IntervalConstants.INTERVAL_L5, 0, 0));
- initRegErrorMsgField();
UILabel tipLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Error_Tip"));
tipLabel.setPreferredSize(new Dimension(60, 20));
- JPanel panel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{tipLabel, regErrorMsgField}}, TableLayoutHelper.FILL_LASTCOLUMN, 10, LayoutConstants.VGAP_MEDIUM);
+ JPanel panel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{tipLabel, errorMsgTextFieldAdapter.getErrorMsgTextField()}}, TableLayoutHelper.FILL_LASTCOLUMN, 10, LayoutConstants.VGAP_MEDIUM);
this.add(panel);
}
private void initRegErrorMsgField() {
- regErrorMsgField = new UITextField();
- regErrorMsgField.getDocument().addDocumentListener(new DocumentListener() {
- public void changedUpdate(DocumentEvent e) {
- regErrorMsgField.setToolTipText(regErrorMsgField.getText());
- }
-
- public void insertUpdate(DocumentEvent e) {
- regErrorMsgField.setToolTipText(regErrorMsgField.getText());
- }
+ TextFieldAdapterProvider provider = ExtraDesignClassManager.getInstance().getSingle(TextFieldAdapterProvider.XML_TAG);
+ if (provider == null) {
+ errorMsgTextFieldAdapter = new UITextFieldAdapter();
+ return;
+ }
+ try {
+ errorMsgTextFieldAdapter = provider.createTextFieldAdapter();
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ errorMsgTextFieldAdapter = new UITextFieldAdapter();
- public void removeUpdate(DocumentEvent e) {
- regErrorMsgField.setToolTipText(regErrorMsgField.getText());
- }
- });
+ }
}
@Override
@@ -102,11 +108,11 @@ public class RegFieldPane extends RegPane {
}
public void populate(TextEditor textEditor) {
- regErrorMsgField.setText(textEditor.getRegErrorMessage());
+ errorMsgTextFieldAdapter.setText(textEditor.getRegErrorMessage());
}
public void update(TextEditor textEditor) {
- textEditor.setRegErrorMessage(regErrorMsgField.getText());
+ textEditor.setRegErrorMessage(errorMsgTextFieldAdapter.getText());
}
}
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPane.java
index c1021321b9..fd2fcc3755 100644
--- a/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPane.java
@@ -21,6 +21,8 @@ public class UITabbedPane extends JTabbedPane{
private String classPath; //panel对象的类名
private String tabName; //Tab名称
private int tabSize = 0;
+ private Color tabBorderColor;
+
public UITabbedPane() {
super();
}
@@ -93,6 +95,16 @@ public class UITabbedPane extends JTabbedPane{
public int getTabSize(){
return tabSize;
}
+
+ public Color getTabBorderColor() {
+ return tabBorderColor;
+ }
+
+ public void setTabBorderColor(Color tabBorderColor) {
+ this.tabBorderColor = tabBorderColor;
+ repaint();
+ }
+
@Override
/**
* 获取UI对象
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPaneUI.java b/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPaneUI.java
index 5798a864b0..d31107c2ce 100644
--- a/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPaneUI.java
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/UITabbedPaneUI.java
@@ -31,9 +31,20 @@ public class UITabbedPaneUI extends BasicTabbedPaneUI {
private int addX = -1;
private int addY = -1;
private int rollover = -1;
- private Color tabBorderColor = new Color(143, 160, 183);
+ private final Color DEFAULT_TAB_BORDER_COLOR = new Color(143, 160, 183);
private Color[] tabSelectedColor = {UIConstants.NORMAL_BLUE, UIConstants.NORMAL_BLUE, UIConstants.NORMAL_BLUE};
+ public Color getTabBorderColor() {
+ Color color = null;
+ if (tabPane instanceof UITabbedPane) {
+ color = ((UITabbedPane) tabPane).getTabBorderColor();
+ }
+ if (color == null) {
+ color = DEFAULT_TAB_BORDER_COLOR;
+ }
+ return color;
+ }
+
/**
* 创建UI对象
*
@@ -252,9 +263,9 @@ public class UITabbedPaneUI extends BasicTabbedPaneUI {
private void drawUITabBorder(Graphics g, int tabPlacement, int x, int y, int w, int h,
boolean isSelected, boolean isEnabled, boolean isRollover) {
if (!isEnabled) {
- drawUITabBorder(g, tabBorderColor, x, y, w, h, tabPlacement);
+ drawUITabBorder(g, getTabBorderColor(), x, y, w, h, tabPlacement);
} else if (isSelected || isRollover) {
- drawSelectedUITabBorder(g, tabBorderColor, x, y, w, h, tabPlacement);
+ drawSelectedUITabBorder(g, getTabBorderColor(), x, y, w, h, tabPlacement);
if (isRollover && canClose()) {
closeX = x + w - closeIcon.getIconWidth() - 3;
closeY = 0;
@@ -269,7 +280,7 @@ public class UITabbedPaneUI extends BasicTabbedPaneUI {
closeIcon.paintIcon(tabPane, g, closeX, closeY);
}
} else {
- drawUITabBorder(g, tabBorderColor, x, y, w, h, tabPlacement);
+ drawUITabBorder(g, getTabBorderColor(), x, y, w, h, tabPlacement);
}
}
@@ -322,7 +333,7 @@ public class UITabbedPaneUI extends BasicTabbedPaneUI {
}
private void drawUIContentBorder(Graphics g, int x, int y, int w, int h) {
- g.setColor(tabBorderColor);
+ g.setColor(getTabBorderColor());
g.drawRect(x, y, w - 3, h - 3);
// Shadow
g.setColor(new Color(204, 204, 204));
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java
index 624e2e8ee8..cbebaf9d8f 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButtonGroup.java
@@ -3,6 +3,8 @@ package com.fr.design.gui.ibutton;
import com.fr.design.constants.UIConstants;
import com.fr.design.event.GlobalNameListener;
import com.fr.design.event.GlobalNameObserver;
+import com.fr.design.event.UIObserver;
+import com.fr.design.event.UIObserverListener;
import com.fr.design.utils.gui.UIComponentUtils;
import com.fr.stable.ArrayUtils;
import com.fr.stable.StringUtils;
@@ -24,7 +26,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-public class UIButtonGroup extends JPanel implements GlobalNameObserver {
+public class UIButtonGroup extends JPanel implements GlobalNameObserver, UIObserver {
private static final long serialVersionUID = 1L;
private static final int TEXT_LENGTH = 3;
private static final int BUTTON_SIZE = 2;
@@ -37,6 +39,9 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver {
private boolean isToolBarComponent = false;
private boolean isClick;
+ private UIObserverListener uiObserverListener;
+ private boolean autoFireStateChanged = true;
+
public UIButtonGroup(String[] textArray) {
this(textArray, null);
}
@@ -72,7 +77,7 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver {
if (globalNameListener != null) {
globalNameListener.setGlobalName(buttonGroupName);
}
- setSelectedWithFireChanged(index);
+ setSelectedIndex(index, autoFireStateChanged);
}
};
}
@@ -108,7 +113,7 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver {
if (globalNameListener != null) {
globalNameListener.setGlobalName(buttonGroupName);
}
- setSelectedWithFireChanged(index);
+ setSelectedIndex(index, autoFireStateChanged);
}
};
}
@@ -175,7 +180,7 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver {
if (globalNameListener != null) {
globalNameListener.setGlobalName(buttonGroupName);
}
- setSelectedWithFireChanged(index);
+ setSelectedIndex(index, autoFireStateChanged);
}
};
}
@@ -253,6 +258,10 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver {
g2d.setClip(oldClip);
}
+ public void setAutoFireStateChanged(boolean autoFireStateChanged) {
+ this.autoFireStateChanged = autoFireStateChanged;
+ }
+
/**
* setSelectedItem
*
@@ -287,13 +296,14 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver {
return selectedIndex;
}
- protected void setSelectedWithFireChanged(int newSelectedIndex) {
- selectedIndex = newSelectedIndex;
- for (int i = 0; i < labelButtonList.size(); i++) {
- if (i == selectedIndex) {
- labelButtonList.get(i).setSelectedWithFireListener(true);
- } else {
- labelButtonList.get(i).setSelected(false);
+ protected void setSelectedIndex(int newSelectedIndex, boolean fireChanged) {
+ if (selectedIndex != newSelectedIndex) {
+ selectedIndex = newSelectedIndex;
+ for (int i = 0; i < labelButtonList.size(); i++) {
+ labelButtonList.get(i).setSelected(i == selectedIndex, false);
+ }
+ if (fireChanged) {
+ fireStateChanged();
}
}
}
@@ -304,10 +314,7 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver {
* @param newSelectedIndex
*/
public void setSelectedIndex(int newSelectedIndex) {
- selectedIndex = newSelectedIndex;
- for (int i = 0; i < labelButtonList.size(); i++) {
- labelButtonList.get(i).setSelected(i == selectedIndex);
- }
+ setSelectedIndex(newSelectedIndex, true);
}
private void fireStateChanged() {
@@ -322,6 +329,9 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver {
((ChangeListener) listeners[i + 1]).stateChanged(e);
}
}
+ if (uiObserverListener != null) {
+ uiObserverListener.doChange();
+ }
}
/**
@@ -364,6 +374,16 @@ public class UIButtonGroup extends JPanel implements GlobalNameObserver {
return true;
}
+ @Override
+ public void registerChangeListener(UIObserverListener listener) {
+ this.uiObserverListener = listener;
+ }
+
+ @Override
+ public boolean shouldResponseChangeListener() {
+ return true;
+ }
+
/**
* @param l
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UITabGroup.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UITabGroup.java
index 69f5845f1d..1d74d2e1d3 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UITabGroup.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UITabGroup.java
@@ -63,13 +63,8 @@ public class UITabGroup extends UIButtonGroup {
}
@Override
- protected void setSelectedWithFireChanged(int newSelectedIndex) {
- if (selectedIndex != newSelectedIndex) {
- selectedIndex = newSelectedIndex;
- for (int i = 0; i < labelButtonList.size(); i++) {
- labelButtonList.get(i).setSelected(i == selectedIndex);
- }
- }
+ protected void setSelectedIndex(int newSelectedIndex, boolean fireChanged) {
+ super.setSelectedIndex(newSelectedIndex, fireChanged);
tabChanged(newSelectedIndex);
}
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java
index dc380c0c94..18764e9119 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java
@@ -142,10 +142,12 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{
}
}
- public void setSelectedWithFireListener(boolean isSelected) {
+ public void setSelected(boolean isSelected, boolean fireChanged) {
if (this.isSelected != isSelected) {
this.isSelected = isSelected;
- fireSelectedChanged();
+ if (fireChanged) {
+ fireSelectedChanged();
+ }
refresh(isSelected);
}
}
@@ -175,7 +177,7 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{
@Override
public void mouseClicked(MouseEvent e) {
if (isEnabled() && !isEventBannded) {
- setSelectedWithFireListener(!isSelected());
+ setSelected(!isSelected(), true);
}
}
};
diff --git a/designer-base/src/main/java/com/fr/design/gui/style/FollowingThemePane.java b/designer-base/src/main/java/com/fr/design/gui/style/FollowingThemePane.java
index f9f556b3d3..bf06aa2fd7 100644
--- a/designer-base/src/main/java/com/fr/design/gui/style/FollowingThemePane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/style/FollowingThemePane.java
@@ -5,6 +5,7 @@ import com.fr.design.dialog.BasicPane;
import com.fr.design.event.UIObserver;
import com.fr.design.event.UIObserverListener;
import com.fr.design.file.HistoryTemplateListCache;
+import com.fr.design.gui.frpane.AttributeChangeUtils;
import com.fr.design.gui.ibutton.UIButtonGroup;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.i18n.Toolkit;
@@ -47,16 +48,20 @@ public class FollowingThemePane extends BasicPane implements UIObserver {
this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
followingThemeButtonGroup = new UIButtonGroup<>(FOLLOWING_THEME_STRING_ARRAYS);
+ followingThemeButtonGroup.setAutoFireStateChanged(false);
followingThemeButtonGroup.setSelectedIndex(1);
followingThemeButtonGroup.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
- for (FollowingThemeActionChangeListener changeListener : changeListeners) {
- changeListener.onFollowingTheme(isFollowingTheme());
- }
- invalidate();
-
- // 与主题相关的属性面板更新完毕后,再通知外层更新数据
+ AttributeChangeUtils.changeComposedUI(FollowingThemePane.this, false, new AttributeChangeUtils.UIChangeAction() {
+ @Override
+ public void changeComposedUI() {
+ for (FollowingThemeActionChangeListener changeListener : changeListeners) {
+ changeListener.onFollowingTheme(isFollowingTheme());
+ }
+ invalidate();
+ }
+ });
if (uiObserverListener != null) {
uiObserverListener.doChange();
}
diff --git a/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java b/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java
index bb3ccf38bc..20e47f556c 100644
--- a/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java
@@ -26,6 +26,7 @@ import com.fr.design.style.color.NewColorSelectBox;
import com.fr.env.utils.DesignerInteractionHistory;
import com.fr.general.Background;
import com.fr.general.IOUtils;
+import com.fr.i18n.UrlI18nManager;
import com.fr.general.act.BorderPacker;
import com.fr.stable.Constants;
import com.fr.stable.GraphDrawHelper;
@@ -117,7 +118,7 @@ public class TranslucentBorderSpecialPane extends AbstractBorderPackerPane imple
public void actionPerformed(ActionEvent e) {
Desktop desktop = Desktop.getDesktop();
try {
- desktop.browse(new URI(TWEAK_NINE_POINT_HELP_URL));
+ desktop.browse(new URI(UrlI18nManager.getInstance().getI18nUrl("nine.point.help")));
} catch (IOException | URISyntaxException ioException) {
ioException.printStackTrace();
}
diff --git a/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java b/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java
index a0a8e6b11d..48c18eb699 100644
--- a/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java
+++ b/designer-base/src/main/java/com/fr/design/javascript/ExportJavaScriptPane.java
@@ -50,9 +50,9 @@ import javax.swing.event.ChangeEvent;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableCellRenderer;
import java.awt.BorderLayout;
import java.awt.CardLayout;
-import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@@ -86,6 +86,7 @@ public class ExportJavaScriptPane extends AbstractHyperLinkPane {
+ if (e.getStateChange() == ItemEvent.SELECTED) {
+ final int row = table.getSelectedRow();
+ if (row == -1) {
+ return;
+ }
+ SingleJavaScript js = getList().get(row);
+ Object ob = fileNameComboBox.getSelectedItem();
+ if (ob != null) {
+ String value = ob.toString();
+ js.setDefaultFileName(StringUtils.equals(value, DEFAULT));
+ if (js.isDefaultFileName()) {
+ js.setFileName(StringUtils.EMPTY);
+ }
+ }
+ table.repaint();
+ }
+ });
this.addCellEditorListener(new CellEditorListener() {
@Override
@@ -450,15 +482,6 @@ public class ExportJavaScriptPane extends AbstractHyperLinkPane {
+ if (e.getStateChange() == ItemEvent.SELECTED) {
+ final int row = table.getSelectedRow();
+ if (row == -1) {
+ return;
+ }
+ SingleJavaScript js = getList().get(row);
+ Object ob = parameterSetting.getSelectedItem();
+ if (ob != null) {
+ String value = ob.toString();
+ js.setExtendParameters(StringUtils.equals(value, DEFAULT));
+ }
+ // 单纯为了刷新表格,使某些联动生效
+ table.repaint();
+ }
+ });
this.addCellEditorListener(new CellEditorListener() {
@Override
@@ -537,15 +580,7 @@ public class ExportJavaScriptPane extends AbstractHyperLinkPane(Arrays.asList((ParameterProvider[]) value)));
+ if (getList().get(row) == null || getList().get(row).isExtendParameters()) {
+ return EMPTY_LABEL;
+ }
+ ParameterProvider[] providers = (ParameterProvider[]) value;
+ if (providers != null) {
+ paraSettingPane.refresh(new ArrayList<>(Arrays.asList(providers)));
+ }
return paraButton;
}
@@ -621,6 +661,14 @@ public class ExportJavaScriptPane extends AbstractHyperLinkPane parameterList = this.parameterViewPane.update();
- parameterList.clear();
- ParameterProvider[] parameters = js.getParameters();
- this.parameterViewPane.populate(parameters);
+ if (this.parameterViewPane != null) {
+ List parameterList = this.parameterViewPane.update();
+ parameterList.clear();
+ ParameterProvider[] parameters = js.getParameters();
+ this.parameterViewPane.populate(parameters);
+ }
}
} else {
OtherTemplatePane pane = (OtherTemplatePane) this.templatePanel.getComponent(1);
@@ -777,11 +828,13 @@ public class ExportJavaScriptPane extends AbstractHyperLinkPane parameterList = parameterViewPane.update();
- if (!parameterList.isEmpty()) {
- Parameter[] parameters = new Parameter[parameterList.size()];
- parameterList.toArray(parameters);
- js.setParameters(parameters);
+ if (parameterViewPane != null) {
+ List parameterList = parameterViewPane.update();
+ if (!parameterList.isEmpty()) {
+ Parameter[] parameters = new Parameter[parameterList.size()];
+ parameterList.toArray(parameters);
+ js.setParameters(parameters);
+ }
}
}
exportJavaScript.addJS(js);
diff --git a/designer-base/src/main/java/com/fr/design/locale/impl/OnlineWidgetsMark.java b/designer-base/src/main/java/com/fr/design/locale/impl/ShowOnlineWidgetMark.java
similarity index 85%
rename from designer-base/src/main/java/com/fr/design/locale/impl/OnlineWidgetsMark.java
rename to designer-base/src/main/java/com/fr/design/locale/impl/ShowOnlineWidgetMark.java
index f5614fed9e..024f991ae5 100644
--- a/designer-base/src/main/java/com/fr/design/locale/impl/OnlineWidgetsMark.java
+++ b/designer-base/src/main/java/com/fr/design/locale/impl/ShowOnlineWidgetMark.java
@@ -7,10 +7,10 @@ import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
-public class OnlineWidgetsMark implements LocaleMark {
+public class ShowOnlineWidgetMark implements LocaleMark {
private Map map = new HashMap<>();
- public OnlineWidgetsMark() {
+ public ShowOnlineWidgetMark() {
map.put(Locale.CHINA, true);
map.put(Locale.TAIWAN, true);
map.put(Locale.US, false);
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java
index 0671ed1b63..a8c19c6976 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java
@@ -7,8 +7,8 @@ import com.fr.design.i18n.DesignSizeI18nManager;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.utils.gui.GUICoreUtils;
-import com.fr.general.CloudCenter;
import com.fr.general.IOUtils;
+import com.fr.i18n.UrlI18nManager;
import javax.swing.BorderFactory;
import javax.swing.JDialog;
@@ -49,7 +49,8 @@ public class CheckFontInfoDialog extends JDialog implements ActionListener {
JPanel messagePanel = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true);
MessageWithLink linkMessage = new MessageWithLink(Toolkit.i18nText("Fine_Designer_Check_Font_Message"),
Toolkit.i18nText("Fine_Designer_Check_Font_Install_Font"),
- CloudCenter.getInstance().acquireUrlByKind("help.install.font", "https://help.fanruan.com/finereport/doc-view-3999.html"));
+ UrlI18nManager.getInstance().getI18nUrl("help.install.font")
+ );
linkMessage.setPreferredSize(DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.mainframe.check.CheckFontInfoDialog.messageWithLink"));
messagePanel.add(linkMessage);
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/base/GuideView.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/base/GuideView.java
index aa277adbbf..f8b93e34c3 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/guide/base/GuideView.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/base/GuideView.java
@@ -40,7 +40,6 @@ public class GuideView extends JDialog {
this.setSize(window.getSize());
this.setLayout(FRGUIPaneFactory.createBorderLayout());
setBg();
- this.setGlassPane(new GuideLoadingGlassPane());
DesignerContext.getDesignerFrame().addWindowListener(new WindowAdapter() {
@Override
@@ -106,12 +105,16 @@ public class GuideView extends JDialog {
}
public void showLoading() {
+ this.setGlassPane(GuideLoadingGlassPane.getInstance());
+ GuideLoadingGlassPane.getInstance().startLoading();
updateGuideViewLocation();
this.setVisible(true);
+ this.invalidate();
this.getGlassPane().setVisible(true);
}
public void hideLoading() {
+ GuideLoadingGlassPane.getInstance().stopLoading();
this.getGlassPane().setVisible(false);
repaint();
SwingUtilities.invokeLater(new Runnable() {
@@ -124,6 +127,6 @@ public class GuideView extends JDialog {
private void updateGuideViewLocation() {
GUICoreUtils.centerWindow(window, this);
- this.setSize(getSize());
+ this.setBounds(window.getBounds());
}
}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java
index f0d74789d2..95c7c24a4a 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/AbstractGuideScene.java
@@ -9,6 +9,7 @@ import com.fr.design.mainframe.guide.tip.BubbleTip;
import com.fr.design.mainframe.guide.tip.GuideTip;
import com.fr.stable.StringUtils;
+import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JPanel;
@@ -21,6 +22,7 @@ import java.awt.Composite;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
+import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Window;
@@ -33,6 +35,7 @@ import java.util.List;
public abstract class AbstractGuideScene extends JPanel implements GuideScene {
private static final int DEFAULT_ARROW_HEIGHT = 12;
private static final int DEFAULT_ARROW_WIDTH = 18;
+ public static final Insets DEFAULT_HIGHLIGHT_INSETS = new Insets(5, 5, 5, 5);
private GuideScene nextScene;
private SceneFilter sceneFilter;
@@ -169,9 +172,22 @@ public abstract class AbstractGuideScene extends JPanel implements GuideScene {
private UILabel getTargetComponentWithImage(BufferedImage image, Rectangle rectangle) {
ImageIcon ic = new ImageIcon(image);
- UILabel label = new UILabel(ic);
+ UILabel label = new UILabel(ic){
+ @Override
+ public Insets getInsets() {
+ return DEFAULT_HIGHLIGHT_INSETS;
+ }
+ };
+
+ label.setBorder(BorderFactory.createMatteBorder(DEFAULT_HIGHLIGHT_INSETS.top, DEFAULT_HIGHLIGHT_INSETS.left, DEFAULT_HIGHLIGHT_INSETS.bottom, DEFAULT_HIGHLIGHT_INSETS.right, Color.WHITE));
+
label.setOpaque(true);
- label.setBounds(rectangle);
+ label.setBounds(new Rectangle(
+ rectangle.x - DEFAULT_HIGHLIGHT_INSETS.left,
+ rectangle.y - DEFAULT_HIGHLIGHT_INSETS.top,
+ rectangle.width + DEFAULT_HIGHLIGHT_INSETS.left + DEFAULT_HIGHLIGHT_INSETS.right,
+ rectangle.height + DEFAULT_HIGHLIGHT_INSETS.top + DEFAULT_HIGHLIGHT_INSETS.bottom
+ ));
return label;
}
@@ -307,9 +323,6 @@ public abstract class AbstractGuideScene extends JPanel implements GuideScene {
nextButton.setBounds((getSceneWidth() - 60) / 2, getSceneHeight() - 100, 60, 30);
add(nextButton);
}
-
- container.revalidate();
- container.repaint();
}
showContainer();
if (lifecycle != null) {
@@ -319,9 +332,7 @@ public abstract class AbstractGuideScene extends JPanel implements GuideScene {
@Override
public void complete() {
- container.getLayeredPane().remove(this);
- container.repaint();
-
+ clear();
if (lifecycle != null && !lifecycle.onComplete()) {
return;
}
@@ -386,13 +397,15 @@ public abstract class AbstractGuideScene extends JPanel implements GuideScene {
return container.getLayeredPane().getHeight();
}
- private void clear() {
+ public void clear() {
targetList = new ArrayList<>();
highlightList = new ArrayList<>();
this.nextButton = null;
- this.removeAll();
- invalidate();
- repaint();
+ if (this.getComponentCount() > 0) {
+ this.removeAll();
+ invalidate();
+ repaint();
+ }
}
@Override
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/ClickScene.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/ClickScene.java
index 6217f41e7b..0d8b5711b0 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/ClickScene.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/scene/ClickScene.java
@@ -1,13 +1,15 @@
package com.fr.design.mainframe.guide.scene;
+import com.fr.design.gui.ibutton.UIButtonGroup;
import com.fr.design.mainframe.guide.base.GuideManager;
import javax.swing.AbstractButton;
-import javax.swing.ButtonModel;
import javax.swing.SwingUtilities;
import java.awt.Component;
import java.awt.Point;
import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
@@ -58,49 +60,60 @@ public class ClickScene extends AbstractGuideScene{
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
if ((e.getClickCount() == 1 && clickType == ClickType.LEFT) || (e.getClickCount() == 2 && clickType == ClickType.LEFT_DOUBLE)) {
- if (isDispatch) {
- redispatchMouseEvent(e, target);
- }
- complete();
+ dealWithDispatchLeftClick(target, e, isDispatch);
}
} else if (e.getButton() == MouseEvent.BUTTON3 && clickType == ClickType.RIGHT) {
- if (isDispatch) {
- redispatchMouseEvent(e, target);
- }
- complete();
+ clear();
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ if (isDispatch) {
+ redispatchMouseEvent(e, target);
+ }
+ complete();
+ }
+ });
}
+
}
+
@Override
public void mousePressed(MouseEvent e) {
- if (isDispatch) {
- if (target instanceof AbstractButton) {
- AbstractButton b = (AbstractButton) target;
- b.setFocusable(false);
+ if ((target instanceof AbstractButton) && (target.getParent() instanceof UIButtonGroup)) {
+ if (isDispatch) {
+ redispatchMouseEvent(e, target);
}
- redispatchMouseEvent(e, target);
- }
- }
-
- @Override
- public void mouseReleased(MouseEvent e) {
- if (isDispatch) {
- redispatchMouseEvent(e, target);
}
- }
- @Override
- public void mouseEntered(MouseEvent e) {
- if (isDispatch) {
- redispatchMouseEvent(e, target);
- }
}
+ });
+ }
+ private void dealWithDispatchLeftClick(Component target, MouseEvent e, boolean isDispatch) {
+ clear();
+ SwingUtilities.invokeLater(new Runnable() {
@Override
- public void mouseExited(MouseEvent e) {
+ public void run() {
if (isDispatch) {
- redispatchMouseEvent(e, target);
+ if (target instanceof AbstractButton) {
+ AbstractButton button = (AbstractButton) target;
+ ActionListener[] actionListeners= button.getActionListeners();
+ for(int i = 0; i < actionListeners.length; i++) {
+ ActionListener actionListener = actionListeners[i];
+ actionListener.actionPerformed(new ActionEvent(
+ button,
+ ActionEvent.ACTION_PERFORMED,
+ button.getActionCommand(),
+ e.getWhen(),
+ e.getModifiers()
+ ));
+ }
+ } else {
+ redispatchMouseEvent(e, target);
+ }
}
+ complete();
}
});
}
@@ -114,7 +127,7 @@ public class ClickScene extends AbstractGuideScene{
@Override
public void showScene() {
// 交互类的 scene 如果没有高亮内容块载,需要及时终止Guide,否则就没法去掉模态框影响到设计器主功能的使用了
- if (this.getComponentCount() == 0) {
+ if (this.getComponentCount() == 0 && getHighlightList().isEmpty()) {
GuideManager.getInstance().getCurrentGuide().terminate();
} else {
super.showScene();
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/tip/BubbleTip.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/tip/BubbleTip.java
index d3d1c040df..13e5dc28f0 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/guide/tip/BubbleTip.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/tip/BubbleTip.java
@@ -2,8 +2,6 @@ package com.fr.design.mainframe.guide.tip;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.i18n.Toolkit;
-import com.fr.design.mainframe.DesignerContext;
-import com.fr.design.mainframe.DesignerFrame;
import com.fr.design.mainframe.guide.base.Guide;
import com.fr.design.mainframe.guide.base.GuideManager;
import com.fr.design.mainframe.guide.ui.bubble.Bubble;
@@ -16,9 +14,11 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class BubbleTip implements GuideTip {
+ private static final int GAP = 5;
private BubbleWithClose bubbleBox;
private Point anchor;
+
/**
*
* @param title 标题
@@ -70,12 +70,12 @@ public class BubbleTip implements GuideTip {
int bubbleW = bubbleBox.getPreferredSize().width;
int bubbleH = bubbleBox.getPreferredSize().height;
if (bubbleBox.isTailHorizontal()) {
- int x = bubbleBox.isTailLeft() ? anchor.x : anchor.x - bubbleW;
+ int x = bubbleBox.isTailLeft() ? anchor.x + GAP : anchor.x - bubbleW - GAP;
int y = anchor.y - (int) (bubbleH * bubbleBox.getTailStart());
bubbleBox.setBounds(x, y, bubbleW, bubbleH);
} else if (bubbleBox.isTailVertical()) {
int x = anchor.x - (int) (bubbleW * bubbleBox.getTailStart());
- int y = bubbleBox.isTailTop() ? anchor.y : anchor.y - bubbleH;
+ int y = bubbleBox.isTailTop() ? anchor.y + GAP : anchor.y - bubbleH - GAP;
bubbleBox.setBounds(x, y, bubbleW, bubbleH);
}
}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/BubbleHint.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/BubbleHint.java
index 56f978731b..79d49d1925 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/BubbleHint.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/BubbleHint.java
@@ -17,6 +17,7 @@ import java.awt.event.ActionListener;
public class BubbleHint extends Bubble {
private UIButton confirmButton;
+ private static final Color CONTENT_TEXT_COLOR = new Color(51, 51, 52);
public BubbleHint() {
super(TailDirection.TOP, 0.9f);
@@ -38,21 +39,21 @@ public class BubbleHint extends Bubble {
title.setHorizontalAlignment(SwingConstants.CENTER);
title.setBorder(BorderFactory.createEmptyBorder(0,0,5,0));
- UILabel content1 = new UILabel(Toolkit.i18nText("Fine-Design_Guide_Tips_Content1"));
- content1.setPreferredSize(new Dimension(190,20));
- content1.setHorizontalAlignment(SwingConstants.CENTER);
+ UILabel content1 = createContentLabel(Toolkit.i18nText("Fine-Design_Guide_Tips_Content1"));
- UILabel content2 = new UILabel(Toolkit.i18nText("Fine-Design_Guide_Tips_Content2"));
- content2.setPreferredSize(new Dimension(190,20));
- content2.setHorizontalAlignment(SwingConstants.CENTER);
+ UILabel content2 = createContentLabel(Toolkit.i18nText("Fine-Design_Guide_Tips_Content2"));
JPanel buttonContainer= FRGUIPaneFactory.createCenterFlowZeroGapBorderPane();
- buttonContainer.setBorder(BorderFactory.createEmptyBorder(20, 0, 0, 0));
+ buttonContainer.setBorder(BorderFactory.createEmptyBorder(15, 0, 0, 0));
buttonContainer.setPreferredSize(new Dimension(190,40));
buttonContainer.setOpaque(false);
- confirmButton = new UIButton(Toolkit.i18nText("Fine-Design_Guide_Tips_Know"));
- confirmButton.setPreferredSize(new Dimension(78, 24));
+ confirmButton = new UIButton(Toolkit.i18nText("Fine-Design_Guide_Tips_Know")) {
+ public Dimension getPreferredSize() {
+ return new Dimension(78, 24);
+ }
+ };
+
buttonContainer.add(confirmButton);
contentPane.add(title);
@@ -71,4 +72,13 @@ public class BubbleHint extends Bubble {
confirmButton.removeActionListener(listener);
}
+ private UILabel createContentLabel(String text) {
+ UILabel content = new UILabel(text);
+ content.setPreferredSize(new Dimension(190,20));
+ content.setHorizontalAlignment(SwingConstants.CENTER);
+ content.setFont(content.getFont().deriveFont(14.0f));
+ content.setForeground(CONTENT_TEXT_COLOR);
+ return content;
+ }
+
}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/ExpandPane.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/ExpandPane.java
index c71a15ea7d..c4e6e01601 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/ExpandPane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/ExpandPane.java
@@ -30,7 +30,7 @@ public class ExpandPane extends JPanel {
}
private void initComponent() {
- VerticalFlowLayout layout = new VerticalFlowLayout(VerticalFlowLayout.TOP, 10, 5);
+ VerticalFlowLayout layout = new VerticalFlowLayout(VerticalFlowLayout.TOP, 10, 0);
layout.setAlignLeft(true);
this.setLayout(layout);
@@ -47,7 +47,7 @@ public class ExpandPane extends JPanel {
private JPanel createHeader() {
headerPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
- headerPane.setPreferredSize(new Dimension(200, 24));
+ headerPane.setPreferredSize(new Dimension(200, 16));
UILabel headerTitle = new UILabel(this.title);
headerTitle.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
arrow = new UILabel(downIcon);
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideCompleteDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideCompleteDialog.java
index 29316652da..b90c5718c6 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideCompleteDialog.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideCompleteDialog.java
@@ -14,7 +14,9 @@ import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JDialog;
import javax.swing.JPanel;
+import javax.swing.JTextPane;
import javax.swing.SwingConstants;
+import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
@@ -22,6 +24,7 @@ import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
+import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Window;
import java.awt.event.ActionEvent;
@@ -34,12 +37,16 @@ public class GuideCompleteDialog extends JDialog {
private static final int ICON_HEIGHT = 182;
private static final Color FONT_COLOR = new Color(51, 51, 52);
private static final Color BUTTON_BG_COLOR = new Color(65, 155,249);
+ private static final Font TITLE_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 22);
+ private static final Font CONTENT_FONT = new Font(Font.SANS_SERIF, Font.PLAIN, 18);
+ private static final Font BUTTON_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 14);
private static GuideCompleteDialog dialog;
public static GuideCompleteDialog getInstance() {
if (dialog == null) {
dialog = new GuideCompleteDialog(DesignerContext.getDesignerFrame());
}
+ dialog = new GuideCompleteDialog(DesignerContext.getDesignerFrame());
return dialog;
}
@@ -65,15 +72,16 @@ public class GuideCompleteDialog extends JDialog {
container.setBorder(BorderFactory.createEmptyBorder(15, 52, 25, 52));
UILabel title = new UILabel(Toolkit.i18nText("Fine-Design_Guide_Complete_Confirm"));
- title.setFont(title.getFont().deriveFont(22.0f));
+ title.setFont(TITLE_FONT);
title.setPreferredSize(new Dimension(190, 30));
title.setHorizontalAlignment(SwingConstants.CENTER);
title.setForeground(FONT_COLOR);
textArea = new UITextPane();
+ changeLineSpacing(textArea, 0.15f,false);
textArea.setEnabled(false);
textArea.setOpaque(false);
- textArea.setFont(textArea.getFont().deriveFont(18.0f));
+ textArea.setFont(CONTENT_FONT);
textArea.setPreferredSize(new Dimension(236, 52));
textArea.setBorder(null);
textArea.setDisabledTextColor(FONT_COLOR);
@@ -83,7 +91,8 @@ public class GuideCompleteDialog extends JDialog {
doc.setParagraphAttributes(0, doc.getLength(), center, false);
JPanel buttonContainer= FRGUIPaneFactory.createCenterFlowZeroGapBorderPane();
- buttonContainer.setPreferredSize(new Dimension(190,38));
+ buttonContainer.setPreferredSize(new Dimension(190,43));
+ buttonContainer.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0));
buttonContainer.setOpaque(false);
UIButton button = new UIButton(Toolkit.i18nText("Fine-Design_Guide_Complete_End")){
@@ -92,6 +101,7 @@ public class GuideCompleteDialog extends JDialog {
return new Dimension(122, 38);
}
};
+ button.setFont(BUTTON_FONT);
button.setUI(confirmButtonUI);
button.setRoundBorder(true);
button.setForeground(Color.WHITE);
@@ -131,4 +141,11 @@ public class GuideCompleteDialog extends JDialog {
}
}
};
+
+ private void changeLineSpacing(JTextPane pane, float factor, boolean replace) {
+ pane.selectAll();
+ MutableAttributeSet set = new SimpleAttributeSet(pane.getParagraphAttributes());
+ StyleConstants.setLineSpacing(set, factor);
+ pane.setParagraphAttributes(set, replace);
+ }
}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideLoadingGlassPane.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideLoadingGlassPane.java
index 64017dfb70..47a10d0be8 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideLoadingGlassPane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideLoadingGlassPane.java
@@ -9,11 +9,11 @@ import javax.swing.SwingConstants;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
+import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
public class GuideLoadingGlassPane extends JPanel {
- private static final String loadingImagePath = "/com/fr/design/mainframe/guide/loading.gif";
private static GuideLoadingGlassPane loadingPane;
public static GuideLoadingGlassPane getInstance() {
@@ -32,16 +32,15 @@ public class GuideLoadingGlassPane extends JPanel {
public void initComponent() {
JPanel loadingView = FRGUIPaneFactory.createBorderLayout_S_Pane();
loadingView.setOpaque(false);
- loadingView.setPreferredSize(new Dimension(130, 120));
+ loadingView.setPreferredSize(new Dimension(150, 90));
JPanel imageContainer = FRGUIPaneFactory.createCenterFlowInnerContainer_S_Pane();
imageContainer.setOpaque(false);
- ImagePanel imagePanel = new ImagePanel(loadingImagePath);
- imagePanel.setOpaque(false);
- imagePanel.setPreferredSize(new Dimension(84, 84));
- imageContainer.add(imagePanel);
+
+ imageContainer.add(GuideLoadingPane.getInstance());
UILabel hintLabel = new UILabel(Toolkit.i18nText("Fine-Design_Guide_Loading_Wait"));
+ hintLabel.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 14));
hintLabel.setHorizontalAlignment(SwingConstants.CENTER);
hintLabel.setForeground(Color.WHITE);
@@ -50,4 +49,12 @@ public class GuideLoadingGlassPane extends JPanel {
this.add(loadingView, new GridBagConstraints());
}
+
+ public void startLoading() {
+ GuideLoadingPane.getInstance().start();
+ }
+
+ public void stopLoading() {
+ GuideLoadingPane.getInstance().stop();
+ }
}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideLoadingPane.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideLoadingPane.java
new file mode 100644
index 0000000000..0a290c784c
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideLoadingPane.java
@@ -0,0 +1,98 @@
+package com.fr.design.mainframe.guide.ui;
+
+import javax.swing.JPanel;
+import javax.swing.Timer;
+import java.awt.AlphaComposite;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Composite;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Point;
+import java.awt.RenderingHints;
+import java.awt.Stroke;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+/**
+ * Created by kerry on 2020-10-23
+ */
+public class GuideLoadingPane extends JPanel {
+ private static final BasicStroke STROKE = new BasicStroke(4);
+ private static final int FPS = 30;
+ private static final int START_ANGLE = 90;
+ private static GuideLoadingPane imagePanel;
+ private Image image;
+ private int angle;
+ private Timer timer;
+
+ public static GuideLoadingPane getInstance() {
+ if (imagePanel == null) {
+ imagePanel = new GuideLoadingPane();
+ }
+ return imagePanel;
+ }
+
+ public GuideLoadingPane() {
+ this.setOpaque(false);
+ this.setPreferredSize(new Dimension(50, 50));
+ timer = new Timer(1000 / FPS, new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ repaint();
+ angle -= 180 / FPS; // 5 degrees per 100 ms = 50 degrees/second
+ if (angle > -270) {
+ angle += 2 * 360;
+ }
+ }
+ });
+ }
+
+ public void start() {
+ angle = START_ANGLE;
+ timer.start();
+ }
+
+ public void stop() {
+ timer.stop();
+ }
+
+ @Override
+ public void paintComponent(Graphics g) {
+ super.paintComponent(g);
+ Graphics2D g2 = (Graphics2D) g;
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+ Composite oldComposite = g2.getComposite();
+ Stroke oldStroke = g2.getStroke();
+
+ g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
+
+ int d = Math.min(getWidth(), getHeight());
+ int r = d / 2;
+ Point circlePoint = new Point(getWidth() / 2, getHeight() / 2);
+
+ g2.setColor(Color.WHITE);
+ g2.fillOval(circlePoint.x - r, circlePoint.y - r, d, d);
+
+ g2.setColor(Color.BLACK);
+ int waitCircleD = d / 10;
+ int waitCircleR = waitCircleD / 2;
+
+ g2.fillOval(circlePoint.x - r / 3 - waitCircleR, circlePoint.y - waitCircleR, waitCircleD, waitCircleD);
+ g2.fillOval(circlePoint.x - waitCircleR, circlePoint.y - waitCircleR, waitCircleD, waitCircleD);
+ g2.fillOval(circlePoint.x + r / 3 - waitCircleR, circlePoint.y - waitCircleR, waitCircleD, waitCircleD);
+
+
+ g2.setStroke(STROKE);
+ g2.setColor(Color.decode("#419BF9"));
+
+ int lineWidth = (int) STROKE.getLineWidth();
+ g2.drawArc(circlePoint.x - r + lineWidth / 2 , circlePoint.y - r + lineWidth / 2, d - lineWidth, d - lineWidth, angle, -90);
+
+ g2.setStroke(oldStroke);
+ g2.setComposite(oldComposite);
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideManageDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideManageDialog.java
index 07059ad052..ca53613c46 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideManageDialog.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/GuideManageDialog.java
@@ -1,6 +1,7 @@
package com.fr.design.mainframe.guide.ui;
+import com.fr.base.svg.IconUtils;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.gui.ilable.UILabel;
@@ -14,7 +15,6 @@ import com.fr.design.mainframe.guide.base.GuideManager;
import com.fr.design.mainframe.guide.base.GuideVersion;
import com.fr.design.mainframe.guide.collect.GuideCollector;
import com.fr.design.utils.gui.GUICoreUtils;
-import com.fr.general.IOUtils;
import javax.swing.BorderFactory;
import javax.swing.Icon;
@@ -31,9 +31,9 @@ import java.awt.event.ActionListener;
public class GuideManageDialog extends JDialog {
private static final int DEFAULT_HEIGHT = 400;
private static final int DEFAULT_WIDTH = 600;
- private static final Icon GROUP_COMPLETE_NONE = IOUtils.readIcon("/com/fr/design/mainframe/guide/complete_none.png");
- private static final Icon GROUP_COMPLETE_SOME = IOUtils.readIcon("/com/fr/design/mainframe/guide/complete_some.png");
- private static final Icon GROUP_COMPLETE_ALL = IOUtils.readIcon("/com/fr/design/mainframe/guide/complete_all.png");
+ private static final Icon GROUP_COMPLETE_NONE = IconUtils.readIcon("/com/fr/design/mainframe/guide/complete_none.svg");
+ private static final Icon GROUP_COMPLETE_SOME = IconUtils.readIcon("/com/fr/design/mainframe/guide/complete_some.svg");
+ private static final Icon GROUP_COMPLETE_ALL = IconUtils.readIcon("/com/fr/design/mainframe/guide/complete_all.svg");
private static final Color BORDER_COLOR = new Color(224, 224, 225);
private static final Color UNCOMPLETE_FONT_COLOR = new Color(51, 51, 52);
private static final Color COMPLETE_FONT_COLOR = new Color(51,51,52,128);
@@ -74,7 +74,7 @@ public class GuideManageDialog extends JDialog {
}
private JPanel createGuideVersionPane(GuideVersion guideVersion) {
- JPanel expandContent = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, VerticalFlowLayout.TOP, 0, 5);
+ JPanel expandContent = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, VerticalFlowLayout.TOP, 0, 10);
for (GuideGroup guideGroup : guideVersion.getGuideGroupList()) {
JPanel guideGroupCard = createGuideGroupCard(guideGroup);
expandContent.add(guideGroupCard);
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/ImagePanel.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/ImagePanel.java
deleted file mode 100644
index deaf974176..0000000000
--- a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/ImagePanel.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.fr.design.mainframe.guide.ui;
-
-import javax.swing.JPanel;
-import java.awt.Graphics;
-import java.awt.Image;
-import java.awt.Toolkit;
-
-/**
- * Created by kerry on 2020-10-23
- */
-public class ImagePanel extends JPanel {
-
-
- private Image image;
-
- public ImagePanel(String imagePath) {
- image = Toolkit.getDefaultToolkit().createImage(ImagePanel.class
- .getResource(imagePath));
- }
-
- @Override
- public void paintComponent(Graphics g) {
- super.paintComponent(g);
- if (image != null) {
- g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
- }
- }
-}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/bubble/BubbleWithClose.java b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/bubble/BubbleWithClose.java
index ba8f3da05d..62e0ed65d0 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/bubble/BubbleWithClose.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/guide/ui/bubble/BubbleWithClose.java
@@ -9,6 +9,7 @@ import com.fr.stable.StringUtils;
import javax.swing.Icon;
import javax.swing.JTextPane;
+import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
@@ -18,7 +19,6 @@ import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
-import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.Rectangle;
@@ -32,13 +32,21 @@ import java.text.AttributedCharacterIterator;
import java.text.AttributedString;
public class BubbleWithClose extends Bubble {
- private static final Font FONT = new Font(Font.SANS_SERIF, Font.PLAIN, 14);
+ private static final Font TITLE_FONT = new Font(Font.SANS_SERIF, Font.PLAIN, 14);
+ private static final Font CONTENT_FONT = new Font(Font.SANS_SERIF, Font.PLAIN, 12);
+ private static final int TITLE_LINE_HEIGHT = 22;
+ private static final int CONTENT_LINE_HEIGHT = 18;
+
private static final Icon ICON = IOUtils.readIcon("/com/fr/design/mainframe/guide/close.png");
- private static final int HEADER_HEIGHT = 24;
- private static final Color HEADER_COLOR = new Color(245, 245, 246);
private static final Color TITLE_COLOR = new Color(51, 51, 52);
private static final Color CONTENT_COLOR = new Color(51,51,52,128);
- private static final Insets DEFAULT_INSET = new Insets(10, 15, 10, 15);
+ private static final Color HIGHLIGHT_COLOR = new Color(65, 155, 249);
+ private static final Insets DEFAULT_INSET = new Insets(15, 15, 15, 15);
+ private static final int MIN_WIDTH = 140;
+ private static final int MAX_WIDTH = 275;
+ private static final int ICON_GAP = 10;
+ private static final int ICON_SIZE = 10;
+ private static final int TEXT_GAP = 5;
private String title;
@@ -46,6 +54,8 @@ public class BubbleWithClose extends Bubble {
private UITextPane titleTextArea;
private UITextPane contentTextArea;
private UIButton closeButton;
+ private Dimension titleSize;
+ private Dimension contentSize;
public BubbleWithClose(String title, String content) {
this(title, content, TailDirection.LEFT, 0.5f);
@@ -87,23 +97,17 @@ public class BubbleWithClose extends Bubble {
@Override
public void componentResized(ComponentEvent e) {
Rectangle rectBounds = getRectBounds();
- Dimension buttonSize = closeButton.getPreferredSize();
-
- closeButton.setBounds(getWidth() - 10 - buttonSize.width, rectBounds.y + (HEADER_HEIGHT - buttonSize.height) / 2, buttonSize.width, buttonSize.height);
- Dimension titleSize = new Dimension(0,0);
- Dimension contentSize = new Dimension(0, 0);
+ closeButton.setBounds(rectBounds.x + rectBounds.width - DEFAULT_INSET.right - ICON_SIZE, rectBounds.y + 21, ICON_SIZE, ICON_SIZE);
if (titleTextArea != null) {
- titleSize = calTextSize(titleTextArea, getTextAreaMaxWidth());
- int x = rectBounds.x + (rectBounds.width - getHorizontalInsets() - titleSize.width) / 2 + DEFAULT_INSET.left;
- int y = rectBounds.y + HEADER_HEIGHT + DEFAULT_INSET.top;
+ int x = rectBounds.x + DEFAULT_INSET.left;
+ int y = rectBounds.y + DEFAULT_INSET.top;
titleTextArea.setBounds(x, y, titleSize.width, titleSize.height);
}
if (contentTextArea != null) {
- contentSize = calTextSize(contentTextArea, getTextAreaMaxWidth());
- int x = rectBounds.x + (rectBounds.width - getHorizontalInsets() - contentSize.width) / 2 + DEFAULT_INSET.left;
- int y = rectBounds.y = HEADER_HEIGHT + DEFAULT_INSET.top + (titleSize.height == 0 ? 0 : titleSize.height + 10);
+ int x = rectBounds.x + DEFAULT_INSET.left;
+ int y = rectBounds.y + DEFAULT_INSET.top + (titleSize.height == 0 ? 0 : titleSize.height + getTextGap());
contentTextArea.setBounds(x,y, contentSize.width, contentSize.height);
}
setSize(getPreferredSize().width, getPreferredSize().height);
@@ -116,7 +120,7 @@ public class BubbleWithClose extends Bubble {
closeButton = new UIButton();
closeButton.setIcon(ICON);
closeButton.set4ToolbarButton();
- closeButton.setPreferredSize(new Dimension(12, 12));
+ closeButton.setPreferredSize(new Dimension(ICON_SIZE, ICON_SIZE));
closeButton.setRolloverEnabled(false);
closeButton.setPressedPainted(false);
this.add(closeButton);
@@ -138,44 +142,84 @@ public class BubbleWithClose extends Bubble {
private void createTitleTextArea() {
if (StringUtils.isNotEmpty(title)) {
- titleTextArea = createTextArea(title, FONT, TITLE_COLOR);
+ titleTextArea = createTextArea(title, TITLE_FONT, TITLE_LINE_HEIGHT, TITLE_COLOR);
this.add(titleTextArea);
}
-
+ titleSize = calTextSize(titleTextArea, TITLE_LINE_HEIGHT, getTextAreaWidth(MAX_WIDTH), getTextAreaWidth(MIN_WIDTH));
}
private void createContentTextArea() {
if (StringUtils.isNotEmpty(content)) {
- contentTextArea = createTextArea(content, FONT, CONTENT_COLOR);
+ contentTextArea = createTextArea(content, CONTENT_FONT, CONTENT_LINE_HEIGHT, CONTENT_COLOR);
this.add(contentTextArea);
}
+ contentSize = calTextSize(contentTextArea, CONTENT_LINE_HEIGHT, getTextAreaWidth(MAX_WIDTH), getTextAreaWidth(MIN_WIDTH));
}
- private UITextPane createTextArea(String str, Font font, Color foreground) {
+ private UITextPane createTextArea(String str, Font font, int lineHeight, Color foreground) {
+ int lineSpace = lineHeight - font.getSize();
UITextPane textArea= new UITextPane(){
@Override
public Insets getInsets() {
- return new Insets(0, 0, 0, 0);
+ return new Insets(lineSpace / 2 - 1, 0, lineSpace / 2, 0);
}
};
- textArea.setText(str);
- textArea.setEnabled(false);
+ textArea.setFont(font);
+ changeLineSpacing(textArea, lineHeight, true);
+ textArea.setEditable(false);
+ textArea.setForeground(foreground);
textArea.setDisabledTextColor(foreground);
textArea.setBorder(null);
- textArea.setFont(font);
textArea.setOpaque(false);
- textArea.setForeground(foreground);
- StyledDocument doc = textArea.getStyledDocument();
- SimpleAttributeSet center = new SimpleAttributeSet();
- StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
- doc.setParagraphAttributes(0, doc.getLength(), center, false);
+ textArea.setText(str);
+ highlightText(textArea);
return textArea;
}
+ private void changeLineSpacing(JTextPane pane, int lineHeight, boolean replace) {
+ pane.selectAll();
+ MutableAttributeSet set = new SimpleAttributeSet(pane.getParagraphAttributes());
+ FontMetrics fontMetrics = GraphHelper.getFontMetrics(pane.getFont());
+ StyleConstants.setLineSpacing(set, (float)(lineHeight - fontMetrics.getHeight()) / fontMetrics.getHeight());
+ pane.setParagraphAttributes(set, replace);
+ }
+
+ private void highlightText(JTextPane textArea) {
+ SimpleAttributeSet sas = new SimpleAttributeSet();
+ StyleConstants.setForeground(sas, HIGHLIGHT_COLOR);
+ StyledDocument doc = textArea.getStyledDocument();
+ String text = textArea.getText();
+ int startPos = -1;
+ for (int i = 0; i < text.length(); i ++) {
+ char ch = text.charAt(i);
+ if (ch == '【') {
+ startPos = i;
+ }
+ if (ch == '】') {
+ if (startPos > 0) {
+ try {
+ doc.setCharacterAttributes(startPos, (i - startPos + 1), sas, false);
+ startPos = -1;
+ } catch (Exception e) {
+ }
+ }
+ }
+ }
+
+ }
+
+ @Override
+ protected int getDefaultWidth() {
+ return Math.max(titleSize.width, contentSize.width) + getHorizontalInsets() + ICON_GAP + ICON_SIZE + (isTailHorizontal() ? TAIL_HEIGHT : 0) ;
+ }
+
+ @Override
protected int getDefaultHeight() {
- Dimension titleSize = calTextSize(titleTextArea, getDefaultTextAreaMaxWidth());
- Dimension contentSize = calTextSize(contentTextArea, getDefaultTextAreaMaxWidth());
- return (isTailVertical() ? TAIL_HEIGHT : 0) + HEADER_HEIGHT + titleSize.height + (titleSize.height == 0 ? 0 : 5) + contentSize.height + getVerticalInsets();
+ return titleSize.height + contentSize.height + getTextGap() + getVerticalInsets() + (isTailVertical() ? TAIL_HEIGHT : 0);
+ }
+
+ private int getTextGap() {
+ return (titleSize.height != 0 && contentSize.height != 0) ? TEXT_GAP : 0;
}
private LayoutManager getLayoutManager() {
@@ -206,18 +250,6 @@ public class BubbleWithClose extends Bubble {
};
}
- @Override
- protected void paintBubbleBg(Graphics2D g2) {
- super.paintBubbleBg(g2);
- paintHeaderBg(g2);
- }
-
- private void paintHeaderBg(Graphics2D g2) {
- g2.setColor(HEADER_COLOR);
- Rectangle bounds = getRectBounds();
- g2.fillRoundRect(bounds.x, bounds.y, bounds.width, HEADER_HEIGHT, 10, 10);
- }
-
private int countLines(JTextPane textArea, int max_width) {
AttributedString text = new AttributedString(textArea.getText());
text.addAttribute(TextAttribute.FONT, textArea.getFont());
@@ -234,28 +266,26 @@ public class BubbleWithClose extends Bubble {
return lines;
}
- private Dimension calTextSize(JTextPane textArea, int maxWidth) {
+ private Dimension calTextSize(JTextPane textArea, int lineHeight, int maxWidth, int minWidth) {
if (textArea == null) {
- return new Dimension(0, 0);
+ return new Dimension(minWidth, 0);
}
FontMetrics fontMetrics = GraphHelper.getFontMetrics(textArea.getFont());
int line = countLines(textArea, maxWidth);
int width = maxWidth;
if (line == 1) {
- width = fontMetrics.stringWidth(textArea.getText());
+ width = Math.max(fontMetrics.stringWidth(textArea.getText()), minWidth);
}
- int height = fontMetrics.getHeight() * line;
+ int height = lineHeight * line;
return new Dimension(width, height);
}
- private int getTextAreaMaxWidth() {
- return getWidth() - (isTailHorizontal() ? TAIL_HEIGHT : 0) -getHorizontalInsets();
- }
- private int getDefaultTextAreaMaxWidth() {
- return BUBBLE_WIDTH - getHorizontalInsets();
+ private int getTextAreaWidth(int bubbleWidth) {
+ return bubbleWidth - getHorizontalInsets() - ICON_SIZE - ICON_GAP;
}
+
private int getHorizontalInsets() {
return DEFAULT_INSET.left + DEFAULT_INSET.right;
}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/share/collect/ComponentCollector.java b/designer-base/src/main/java/com/fr/design/mainframe/share/collect/ComponentCollector.java
index 3ea805deb0..47b7dc7ef0 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/share/collect/ComponentCollector.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/share/collect/ComponentCollector.java
@@ -288,12 +288,17 @@ public class ComponentCollector implements XMLable {
private JSONArray getGroupingDetail() {
JSONArray ja = JSONFactory.createJSON(JSON.ARRAY);
- Group[] groups = DefaultShareGroupManager.getInstance().getAllGroup();
- for(Group group : groups) {
- JSONObject jo = JSONFactory.createJSON(JSON.OBJECT);
- jo.put(GROUP_NAME, group.getGroupName());
- jo.put(CONTAIN_AMOUNT, group.getAllBindInfoList().length);
- ja.add(jo);
+ try {
+ DefaultShareGroupManager.getInstance().refresh();
+ Group[] groups = DefaultShareGroupManager.getInstance().getAllGroup();
+ for(Group group : groups) {
+ JSONObject jo = JSONFactory.createJSON(JSON.OBJECT);
+ jo.put(GROUP_NAME, group.getGroupName());
+ jo.put(CONTAIN_AMOUNT, group.getAllBindInfoList().length);
+ ja.add(jo);
+ }
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage());
}
return ja;
}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeEditorPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeEditorPane.java
index c2e28332d3..e924080ef6 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeEditorPane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeEditorPane.java
@@ -267,6 +267,10 @@ public abstract class TemplateThemeEditorPane extends J
return nameTextField.checkValid();
}
+ public String getThemeName() {
+ return nameTextField.getText();
+ }
+
public List getCurrentColorScheme() {
return colorListPane.update();
}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridControlPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridControlPane.java
index 6e04cb06f8..f721923e94 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridControlPane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridControlPane.java
@@ -52,7 +52,7 @@ import static com.fr.design.i18n.Toolkit.i18nText;
* Created by Starryi on 2021/8/13
*/
public class TemplateThemeGridControlPane extends BasicPane {
- public static final int CONTENT_WIDTH = TemplateThemeGridPane.CONTENT_WIDTH + 10;
+ public static final int CONTENT_WIDTH = TemplateThemeGridPane.CONTENT_WIDTH + 20;
public static final int CONTENT_HEIGHT = TemplateThemeGridPane.CONTENT_HEIGHT + 37;
private final RemoveThemeAction removeAction;
private final UIButton setTheme4NewTemplateButton;
@@ -92,7 +92,7 @@ public class TemplateThemeGridControlPane extends Basic
private void initializePane() {
setLayout(FRGUIPaneFactory.createBorderLayout());
- setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5));
+ setBorder(BorderFactory.createEmptyBorder(5, 10, 0, 10));
setPreferredSize(new Dimension(CONTENT_WIDTH, CONTENT_HEIGHT));
add(createActionsContainer(), BorderLayout.NORTH);
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPagesPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPagesPane.java
index 855e2bf785..40838dbd83 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPagesPane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPagesPane.java
@@ -34,7 +34,6 @@ import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
-import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
@@ -286,18 +285,15 @@ public class TemplateThemeGridPagesPane extends JPanel {
}
public static class TemplateThemeManagingPane extends TemplateThemeGridPagePane {
- public static final int CONTENT_WIDTH = TemplateThemeGridControlPane.CONTENT_WIDTH + 4;
- public static final int CONTENT_HEIGHT = TemplateThemeGridControlPane.CONTENT_HEIGHT + 10;
-
private final UITabbedPane tabbedPane;
private final TemplateThemeGridControlPane formThemesManagerPane;
private final TemplateThemeGridControlPane reportThemesManagerPane;
public TemplateThemeManagingPane() {
setLayout(FRGUIPaneFactory.createBorderLayout());
- setPreferredSize(new Dimension(CONTENT_WIDTH, CONTENT_HEIGHT));
tabbedPane = new UITabbedPane();
+ tabbedPane.setTabBorderColor(new Color(0xE0E0E1));
add(tabbedPane, BorderLayout.CENTER);
formThemesManagerPane = TemplateThemeGridControlPane.createFormThemesManagerPane();
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPane.java
index 3b9cb7bdc9..2af4950f53 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridPane.java
@@ -8,6 +8,8 @@ import com.fr.design.event.ChangeEvent;
import com.fr.design.event.ChangeListener;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.widget.FRWidgetFactory;
+import com.fr.design.widget.WidgetBoundsPaneFactory;
import com.fr.stable.StringUtils;
import javax.swing.BorderFactory;
@@ -68,7 +70,12 @@ public class TemplateThemeGridPane extends BasicPane {
contentListPane.setLayout(new GridLayout(0, BLOCK_COUNT_ROW_LINE, BLOCK_GAP, BLOCK_GAP));
fillContentListPane();
- UIScrollPane scrollPane = new UIScrollPane(contentListPane);
+ JPanel wrapper1 = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ wrapper1.add(contentListPane, BorderLayout.NORTH);
+ JPanel wrapper2 = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ wrapper2.add(wrapper1, BorderLayout.WEST);
+
+ UIScrollPane scrollPane = new UIScrollPane(wrapper2);
scrollPane.setPreferredSize(new Dimension(CONTENT_WIDTH, CONTENT_HEIGHT));
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeProfilePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeProfilePane.java
index f3187acaab..bc787bb18b 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeProfilePane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeProfilePane.java
@@ -60,6 +60,8 @@ public abstract class TemplateThemeProfilePane extends
private UIButton saveButton = new UIButton();
private UIButton saveAsButton = new UIButton();
+ private TemplateThemeProfileActionListener actionListener = new TemplateThemeProfileActionAdapter();
+
public TemplateThemeProfilePane(TemplateThemeConfig config) {
super();
this.config = config;
@@ -112,6 +114,7 @@ public abstract class TemplateThemeProfilePane extends
return;
}
saveButton.setEnabled(valid && isMutable);
+ actionListener.onThemeNameChecked(themeEditorPane.getThemeName(), valid);
}
});
@@ -138,6 +141,8 @@ public abstract class TemplateThemeProfilePane extends
if (saveAsButton != null) {
saveAsButton.setEnabled(StringUtils.isNotEmpty(name));
}
+ actionListener.onInitialize(theme);
+
isPopulating = false;
}
@@ -214,6 +219,7 @@ public abstract class TemplateThemeProfilePane extends
super.afterCommit();
saveButton.setEnabled(false);
saveAsButton.setEnabled(true);
+ actionListener.onSaved(config.cachedFetch(getName()));
DesignerToastMsgUtil.toastPrompt(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Profile_Pane_Save_Successfully"));
}
});
@@ -330,4 +336,29 @@ public abstract class TemplateThemeProfilePane extends
this.dispose();
}
}
+
+ public void addProfileActionListener(TemplateThemeProfileActionListener actionListener) {
+ if (actionListener != null) {
+ this.actionListener = actionListener;
+ }
+ }
+ public interface TemplateThemeProfileActionListener {
+
+ void onInitialize(TemplateTheme theme);
+
+ void onThemeNameChecked(String name, boolean valid);
+
+ void onSaved(TemplateTheme theme);
+ }
+ public static class TemplateThemeProfileActionAdapter implements TemplateThemeProfileActionListener {
+
+ @Override
+ public void onInitialize(TemplateTheme theme) {}
+
+ @Override
+ public void onThemeNameChecked(String name, boolean valid) { }
+
+ @Override
+ public void onSaved(TemplateTheme theme) {}
+ }
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeGridPagesDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeGridPagesDialog.java
index 9711e8e8ad..917f078d52 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeGridPagesDialog.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeGridPagesDialog.java
@@ -1,7 +1,5 @@
package com.fr.design.mainframe.theme.dialog;
-import com.fr.base.theme.TemplateTheme;
-import com.fr.base.theme.TemplateThemeConfig;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
@@ -16,7 +14,7 @@ import javax.swing.JPanel;
* Created by Starryi on 2021/8/13
*/
public class TemplateThemeGridPagesDialog extends TemplateThemeDialog implements TemplateThemeGridPagesPane.PageChangeListener {
- public static final int CONTENT_WIDTH = TemplateThemeGridPane.CONTENT_WIDTH + 40;
+ public static final int CONTENT_WIDTH = TemplateThemeGridPane.CONTENT_WIDTH + 48;
public static final int CONTENT_HEIGHT = TemplateThemeGridPane.CONTENT_HEIGHT + 37;
protected TemplateThemeGridPagesPane overallPane;
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ComponentPreviewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ComponentPreviewPane.java
index 20e418960c..cfd2781aa8 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ComponentPreviewPane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ComponentPreviewPane.java
@@ -90,6 +90,37 @@ public abstract class ComponentPreviewPane extends UINoOpaquePanel implements Th
}
+ @Override
+ protected void paintBorder(Graphics g) {
+ super.paintBorder(g);
+
+ paintSeparator((Graphics2D) g);
+ }
+
+ private void paintSeparator(Graphics2D g2d) {
+ Border border = getBorder();
+ if (border instanceof LineBorder && titlePane != null) {
+ Border containerBorder = container.getBorder();
+ Insets insets = containerBorder.getBorderInsets(container);
+ int y = titlePane.getHeight() + insets.top;
+
+ Color oldColor = g2d.getColor();
+ Stroke oldStroke = g2d.getStroke();
+
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+ Color lineColor = ((LineBorder) border).getLineColor();
+ int thickness = ((LineBorder) border).getThickness();
+ g2d.setColor(lineColor);
+ g2d.setStroke(new BasicStroke(thickness * 2));
+ g2d.drawLine(0, y, getWidth(), y);
+
+ g2d.setStroke(oldStroke);
+ g2d.setColor(oldColor);
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
+ }
+ }
+
@Override
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
@@ -144,7 +175,6 @@ public abstract class ComponentPreviewPane extends UINoOpaquePanel implements Th
data.setInsetImagePadding(titlePacker.getInsetImagePadding());
data.setInsetRelativeTextLeft(titlePacker.isInsetRelativeTextLeft());
data.setInsetRelativeTextRight(titlePacker.isInsetRelativeTextRight());
- this.setBorder(new BottomLineBorder(componentStyle.getStyle().getColor(), componentStyle.getStyle().getBorder()));
}
public Label getData(){
@@ -172,31 +202,6 @@ public abstract class ComponentPreviewPane extends UINoOpaquePanel implements Th
}
- public static class BottomLineBorder extends LineBorder {
-
- private BottomLineBorder(Color color, int thickness) {
- super(color, thickness);
- }
-
- @Override
- public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
- Graphics2D g2d = (Graphics2D) g;
-
- Color oldColor = g2d.getColor();
- Stroke oldStroke = g2d.getStroke();
-
- g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-
- g2d.setColor(getLineColor());
- g2d.setStroke(new BasicStroke(getThickness() * 2));
- g2d.drawLine(0, height, width, height);
-
- g2d.setStroke(oldStroke);
- g2d.setColor(oldColor);
- g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
- }
- }
-
private static class Utils {
private static void paintBackground(Graphics2D g2d, Background background, Shape shape, float opacity) {
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/ECReportPreviewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/ECReportPreviewPane.java
index a933f39489..63d75449dc 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/ECReportPreviewPane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/ECReportPreviewPane.java
@@ -49,7 +49,7 @@ public class ECReportPreviewPane extends UINoOpaquePanel implements ThemePreview
public PreviewPane() {
this.setPreferredSize(new Dimension(517, 270));
- this.setBorder(BorderFactory.createEmptyBorder(7, 10, 5, 10));
+ this.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
this.setLayout(FRGUIPaneFactory.createBorderLayout());
JPanel northPane = createNorthPane();
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AbstractTemplateStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AbstractTemplateStylePane.java
index 482b2cebcd..399047a853 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AbstractTemplateStylePane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AbstractTemplateStylePane.java
@@ -7,4 +7,8 @@ public abstract class AbstractTemplateStylePane extends BasicPane {
public abstract void populate(T ob);
public abstract T update();
+
+ public AbstractTemplateStylePane generateCleanPane() {
+ return this;
+ }
}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleTemplateStyleEditor.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleTemplateStyleEditor.java
index 195a92e8a9..4f863e28b8 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleTemplateStyleEditor.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleTemplateStyleEditor.java
@@ -32,6 +32,11 @@ public class AccessibleTemplateStyleEditor extends UneditableAccessibleEditor {
setValue(stylePane.update());
fireStateChanged();
}
+
+ @Override
+ public void doCancel() {
+ stylePane = stylePane.generateCleanPane();
+ }
});
stylePane.populate(getValue());
dlg.setVisible(true);
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/MobileTemplateStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/MobileTemplateStylePane.java
index 38f70de814..55c543b8f8 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/MobileTemplateStylePane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/MobileTemplateStylePane.java
@@ -44,12 +44,14 @@ public class MobileTemplateStylePane extends AbstractTemplateStylePane> extraStyle = new HashSet<>();
+ private WCardTagLayout tagLayout;
public MobileTemplateStylePane(WCardTagLayout tagLayout){
init(tagLayout);
}
public void init(WCardTagLayout tagLayout){
this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ this.tagLayout = tagLayout;
listModel = new DefaultListModel();
card = new CardLayout();
right = FRGUIPaneFactory.createCardLayout_S_Pane();
@@ -147,4 +149,9 @@ public class MobileTemplateStylePane extends AbstractTemplateStylePane generateCleanPane() {
+ return new MobileTemplateStylePane(this.tagLayout);
+ }
}
diff --git a/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java b/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java
index 9abd21c5a3..2c38d597c4 100644
--- a/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java
+++ b/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java
@@ -5,6 +5,7 @@ import com.fr.design.beans.BasicBeanPane;
import com.fr.design.gui.ibutton.UIRadioButton;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.DesignSizeI18nManager;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.report.fit.menupane.FitPreviewPane;
@@ -15,9 +16,7 @@ import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.ComparatorUtils;
import com.fr.report.fit.ReportFitAttr;
-
import javax.swing.*;
-import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@@ -33,6 +32,7 @@ import static com.fr.design.i18n.Toolkit.i18nText;
public abstract class BaseFitAttrPane extends BasicBeanPane {
protected JPanel contentJPanel;
+ protected UILabel belowSetLabel;
protected UIComboBox itemChoose;
protected java.util.List fitAttrModelList = new ArrayList<>();
@@ -41,6 +41,7 @@ public abstract class BaseFitAttrPane extends BasicBeanPane {
public JPanel attrJPanel;
public FitPreviewPane previewJPanel;
public FitAttrModel fitAttrModel;
+ private static final int BELOW_SET_COMPONENT_HSPACE = 8;
protected BaseFitAttrPane() {
@@ -90,14 +91,14 @@ public abstract class BaseFitAttrPane extends BasicBeanPane {
}
for (int i = 0; i < columnSize.length; i++) {
if (i == 0) {
- columnSize[i] = 80;
+ columnSize[i] = DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.fit.firstColumn").getWidth();
} else {
- columnSize[i] = 100;
+ columnSize[i] = DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.fit.column").getWidth();
}
}
attrJPanel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
- attrJPanel.setBorder(new EmptyBorder(0, 100, 10, 100));
+ attrJPanel.setBorder(BorderFactory.createEmptyBorder(5, 0, 10, 0));
contentJPanel.add(attrJPanel);
}
@@ -136,9 +137,18 @@ public abstract class BaseFitAttrPane extends BasicBeanPane {
protected void initPreviewJPanel() {
previewJPanel = new FitPreviewPane();
+ previewJPanel.setBorder(BorderFactory.createEmptyBorder(0, getPreviewJPanelLeft(), 0, 0));
contentJPanel.add(previewJPanel);
}
+ private int getPreviewJPanelLeft() {
+ int left = 0;
+ if (belowSetLabel.getPreferredSize() != null) {
+ left = belowSetLabel.getPreferredSize().width + BELOW_SET_COMPONENT_HSPACE;
+ }
+ return left;
+ }
+
protected int getStateInPC(int index) {
FitType[] fitTypes = fitAttrModel.getFitTypes();
return fitTypes[index].getState();
@@ -180,7 +190,7 @@ public abstract class BaseFitAttrPane extends BasicBeanPane {
@Override
protected String title4PopupWindow() {
- return i18nText("Fine-Designer_PC_Element_Case_Fit_Attr");
+ return i18nText("Fine-Designer_PC_Fit_Attr");
}
protected abstract String[] getItemNames();
@@ -188,29 +198,26 @@ public abstract class BaseFitAttrPane extends BasicBeanPane {
protected void initComponents() {
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
- contentJPanel = new JPanel();
- contentJPanel.setLayout(FRGUIPaneFactory.createCenterFlowLayout());
+ contentJPanel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(false, FlowLayout.LEFT, 0, 0);
this.add(contentJPanel);
initItemChoose();
+ initPrompt();
}
private void initItemChoose() {
- JPanel chooseJPanel = new JPanel();
- chooseJPanel.setLayout(FRGUIPaneFactory.createLabelFlowLayout());
+ JPanel chooseJPanel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane();
ItemListener itemListener = getItemListener();
itemChoose = new UIComboBox(getItemNames());
itemChoose.addItemListener(itemListener);
- UILabel belowSetLabel = new UILabel(i18nText("Fine-Design_Report_Blow_Set"));
+ belowSetLabel = new UILabel(i18nText("Fine-Design_Report_Blow_Set"));
+ JPanel hSpaceLabel = new JPanel();
+ hSpaceLabel.setSize(BELOW_SET_COMPONENT_HSPACE, 0);
JPanel buttonPane = GUICoreUtils.createFlowPane(new Component[]{
- belowSetLabel, itemChoose}, FlowLayout.LEFT, 0, 0);
+ belowSetLabel, hSpaceLabel, itemChoose}, FlowLayout.LEFT);
chooseJPanel.add(buttonPane);
- chooseJPanel.setPreferredSize(new Dimension(500, 50));
- JPanel jPanel = new JPanel();
- jPanel.setLayout(FRGUIPaneFactory.createBorderLayout());
- jPanel.add(chooseJPanel, BorderLayout.WEST);
-
- contentJPanel.add(jPanel);
+ chooseJPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0));
+ contentJPanel.add(chooseJPanel);
}
@@ -221,6 +228,9 @@ public abstract class BaseFitAttrPane extends BasicBeanPane {
}
+ protected void initPrompt() {
+ }
+
protected void refresh() {
validate();
repaint();
diff --git a/designer-base/src/main/java/com/fr/design/report/fit/menupane/ReportFitAttrAction.java b/designer-base/src/main/java/com/fr/design/report/fit/menupane/ReportFitAttrAction.java
index c0e257739a..c1dd3afd6e 100644
--- a/designer-base/src/main/java/com/fr/design/report/fit/menupane/ReportFitAttrAction.java
+++ b/designer-base/src/main/java/com/fr/design/report/fit/menupane/ReportFitAttrAction.java
@@ -4,6 +4,7 @@ import com.fr.design.actions.JTemplateAction;
import com.fr.design.beans.BasicBeanPane;
import com.fr.design.dialog.DialogActionAdapter;
import com.fr.design.dialog.UIDialog;
+import com.fr.design.i18n.DesignSizeI18nManager;
import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.JTemplate;
@@ -34,22 +35,6 @@ public class ReportFitAttrAction extends JTemplateAction {
return null;
}
};
- private static final MenuKeySet REPORT_FIT_ATTR_ELEMENTCASE = new MenuKeySet() {
- @Override
- public char getMnemonic() {
- return 'T';
- }
-
- @Override
- public String getMenuName() {
- return Toolkit.i18nText("Fine-Designer_PC_Element_Case_Fit_Attr");
- }
-
- @Override
- public KeyStroke getKeyStroke() {
- return null;
- }
- };
public ReportFitAttrAction(JTemplate jTemplate) {
super(jTemplate);
@@ -57,12 +42,7 @@ public class ReportFitAttrAction extends JTemplateAction {
}
private void initMenuStyle() {
- JTemplate jTemplate = getEditingComponent();
- if (jTemplate.isJWorkBook()) {
- this.setMenuKeySet(REPORT_FIT_ATTR);
- } else {
- this.setMenuKeySet(REPORT_FIT_ATTR_ELEMENTCASE);
- }
+ this.setMenuKeySet(REPORT_FIT_ATTR);
this.setName(getMenuKeySet().getMenuKeySetName() + "...");
this.setMnemonic(getMenuKeySet().getMnemonic());
this.setSmallIcon("/com/fr/design/images/reportfit/fit");
@@ -87,13 +67,13 @@ public class ReportFitAttrAction extends JTemplateAction {
private void showReportFitDialog(ReportFitAttr fitAttr, final JTemplate jwb, final FitProvider wbTpl, final BasicBeanPane attrPane) {
attrPane.populateBean(fitAttr);
- UIDialog dialog = attrPane.showMediumWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() {
+ UIDialog dialog = attrPane.showWindowWithCustomSize(DesignerContext.getDesignerFrame(), new DialogActionAdapter() {
@Override
public void doOk() {
wbTpl.setReportFitAttr(attrPane.updateBean());
jwb.fireTargetModified();
}
- });
+ }, DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.fit.templatePane.dialog"));
dialog.setVisible(true);
}
diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorFactory.java b/designer-base/src/main/java/com/fr/design/style/color/ColorFactory.java
index b643752b39..0ab0d8f381 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/ColorFactory.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/ColorFactory.java
@@ -3,7 +3,7 @@ package com.fr.design.style.color;
import java.awt.Color;
public interface ColorFactory {
-
+
public static final Color MenuColors[] = {
Color.black,
new Color(153, 51, 0),
@@ -72,17 +72,17 @@ public interface ColorFactory {
};
public static final Color STANDARD_COLORS[] = {
- new Color(166, 89, 66),
- new Color(166, 123, 66),
- new Color(166, 66, 66),
- new Color(103, 166, 66),
- new Color(66, 121, 166),
- new Color(68, 66, 166),
- new Color(98, 66, 166),
- new Color(146, 66, 166),
- new Color(75, 18, 89),
- new Color(89, 18, 51)
+ new Color(234, 68, 49),
+ new Color(179, 96, 36),
+ new Color(232, 147, 37),
+ new Color(109, 214, 50),
+ new Color(51, 147, 219),
+ new Color(56, 54, 179),
+ new Color(93, 54, 179),
+ new Color(154, 54, 179),
+ new Color(127, 76, 217),
+ new Color(179, 36, 102)
};
-
-}
\ No newline at end of file
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java
index 1c03c67594..40e6683eb5 100644
--- a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java
+++ b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java
@@ -53,7 +53,6 @@ public class OpenWorker extends SwingWorker {
@Override
protected T doInBackground() throws Exception {
- TimeUnit.SECONDS.sleep(5);
return this.callable.call();
}
@@ -134,7 +133,7 @@ public class OpenWorker extends SwingWorker {
this.template.setOpening(false);
JTemplate, ?> currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
// 需要判断当前打开的模板是不是异步执行后失败的模板 是的话立即展示失败后的提示内容 否则只设置下失败的提示内容
- if (ComparatorUtils.equals(currentTemplate.getEditingFILE().getName(), this.template.getName())) {
+ if (ComparatorUtils.equals(currentTemplate.getEditingFILE().getName(), this.template.getEditingFILE().getName())) {
DesignerContext.getDesignerFrame().getCenterTemplateCardPane().showOpenFailedCover(text);
DesignerFrameFileDealerPane.getInstance().stateChange();
} else {
diff --git a/designer-base/src/main/java/com/fr/env/ErrorDialog.java b/designer-base/src/main/java/com/fr/env/ErrorDialog.java
index be91955f2f..a26c673a45 100644
--- a/designer-base/src/main/java/com/fr/env/ErrorDialog.java
+++ b/designer-base/src/main/java/com/fr/env/ErrorDialog.java
@@ -39,7 +39,7 @@ public class ErrorDialog extends JDialog implements ActionListener {
messagePanel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
MessageWithLink messageWithLink = new MessageWithLink(message + ",", Toolkit.i18nText("Fine-Design_Basic_Sync_Help"), CloudCenter.getInstance().acquireUrlByKind("help.replacejars", "https://help.fanruan.com/finereport/doc-view-3268.html"));
- messageWithLink.setPreferredSize(new Dimension(108, 20));
+ messageWithLink.setPreferredSize(new Dimension(150, 20));
JPanel messageLinkPane = FRGUIPaneFactory.createBorderLayout_L_Pane();
messageLinkPane.setBorder(BorderFactory.createEmptyBorder(5, 8, 5, 0));
messageLinkPane.add(messageWithLink);
diff --git a/designer-base/src/main/java/com/fr/env/HelpLink.java b/designer-base/src/main/java/com/fr/env/HelpLink.java
index c717ce6ea6..133a234900 100644
--- a/designer-base/src/main/java/com/fr/env/HelpLink.java
+++ b/designer-base/src/main/java/com/fr/env/HelpLink.java
@@ -1,7 +1,7 @@
package com.fr.env;
-import com.fr.general.locale.LocaleCenter;
-import com.fr.general.locale.LocaleMark;
+
+import com.fr.i18n.UrlI18nManager;
import com.fr.locale.InterProviderFactory;
import com.fr.stable.StringUtils;
import java.util.HashMap;
@@ -18,8 +18,7 @@ public class HelpLink {
public static String getLink(String solution) {
Map map = new HashMap<>();
- LocaleMark linkMark = LocaleCenter.getMark(RemoteDesignLocaleMark.class);
- String link = linkMark.getValue();
+ String link = UrlI18nManager.getInstance().getI18nUrl("help.remote.design");
map.put(InterProviderFactory.getProvider().getLocText("Fine-Core_Remote_Design_Change_PassWord"), StringUtils.EMPTY);
map.put(InterProviderFactory.getProvider().getLocText("Fine-Core_Remote_Design_Cert_Error_Solution"), link);
map.put(InterProviderFactory.getProvider().getLocText("Fine-Core_Remote_Design_Connection_Unknown_Error_Solution"), link);
diff --git a/designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java b/designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java
index 8117f87395..fd4b98e33e 100644
--- a/designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java
+++ b/designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java
@@ -5,6 +5,7 @@ import com.fr.design.dialog.link.MessageWithLink;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.itextarea.UITextArea;
+import com.fr.design.i18n.DesignSizeI18nManager;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
@@ -62,7 +63,7 @@ public class SyncFailedPluginsDialog extends JDialog {
JPanel messagePane = FRGUIPaneFactory.createBorderLayout_S_Pane();
MessageWithLink messageWithLink = new MessageWithLink(Toolkit.i18nText("Fine-Design_Basic_Sync_Plugin_Fail_Suggestion"),Toolkit.i18nText("Fine-Design_Basic_Sync_Deal_Immediately"),
CloudCenter.getInstance().acquireUrlByKind("help.installplugins", "https://help.fanruan.com/finereport/doc-view-2198.html"));
- messageWithLink.setPreferredSize(new Dimension(316, 20));
+ messageWithLink.setPreferredSize(DesignSizeI18nManager.getInstance().i18nDimension("com.fr.env.SyncFailedPluginsDialog.messageWithLink"));
messagePane.add(messageWithLink);
messagePane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 0));
diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties
index ef851ffe3f..686c3da8a8 100644
--- a/designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties
+++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties
@@ -7,4 +7,9 @@ com.fr.env.RemoteEnvPane.dialog=458*132
com.fr.design.version.check.dialog=490*95
com.fr.design.version.detail.label=750*30
com.fr.design.version.detail.dialog=900*500
-com.fr.design.web.pane.text.field=450*20
\ No newline at end of file
+com.fr.env.SyncFailedPluginsDialog.messageWithLink=316*36
+com.fr.design.web.pane.text.field=450*20
+com.fr.design.actions.server.dialog=800*630
+com.fr.design.report.fit.templatePane.dialog=800*400
+com.fr.design.report.fit.firstColumn=120*20
+com.fr.design.report.fit.column=160*20
\ No newline at end of file
diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_ja_JP.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_ja_JP.properties
index 379c257449..5937b272ae 100644
--- a/designer-base/src/main/resources/com/fr/design/i18n/dimension_ja_JP.properties
+++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_ja_JP.properties
@@ -6,4 +6,9 @@ com.fr.env.RemoteEnvPane.dialog=458*132
com.fr.design.version.check.dialog=430*95
com.fr.design.version.detail.label=650*30
com.fr.design.version.detail.dialog=800*500
-com.fr.design.web.pane.text.field=400*20
\ No newline at end of file
+com.fr.env.SyncFailedPluginsDialog.messageWithLink=316*36
+com.fr.design.web.pane.text.field=400*20
+com.fr.design.actions.server.dialog=700*630
+com.fr.design.report.fit.templatePane.dialog=600*400
+com.fr.design.report.fit.firstColumn=170*20
+com.fr.design.report.fit.column=100*20
\ No newline at end of file
diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_ko_KR.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_ko_KR.properties
index 62ee87a7c4..5615b35556 100644
--- a/designer-base/src/main/resources/com/fr/design/i18n/dimension_ko_KR.properties
+++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_ko_KR.properties
@@ -6,4 +6,9 @@ com.fr.env.RemoteEnvPane.dialog=458*132
com.fr.design.version.check.dialog=450*95
com.fr.design.version.detail.label=700*30
com.fr.design.version.detail.dialog=850*500
-com.fr.design.web.pane.text.field=450*20
\ No newline at end of file
+com.fr.env.SyncFailedPluginsDialog.messageWithLink=316*36
+com.fr.design.web.pane.text.field=450*20
+com.fr.design.actions.server.dialog=700*630
+com.fr.design.report.fit.templatePane.dialog=600*400
+com.fr.design.report.fit.firstColumn=130*20
+com.fr.design.report.fit.column=100*20
\ No newline at end of file
diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties
index fff64947d9..c507fcc083 100644
--- a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties
+++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties
@@ -7,4 +7,9 @@ com.fr.env.RemoteEnvPane.dialog=308*132
com.fr.design.version.check.dialog=230*95
com.fr.design.version.detail.label=450*30
com.fr.design.version.detail.dialog=600*500
-com.fr.design.web.pane.text.field=450*20
\ No newline at end of file
+com.fr.env.SyncFailedPluginsDialog.messageWithLink=316*20
+com.fr.design.web.pane.text.field=450*20
+com.fr.design.actions.server.dialog=700*630
+com.fr.design.report.fit.templatePane.dialog=600*400
+com.fr.design.report.fit.firstColumn=80*20
+com.fr.design.report.fit.column=100*20
\ No newline at end of file
diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh_TW.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh_TW.properties
index 4b2de3f02c..8a383a4387 100644
--- a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh_TW.properties
+++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh_TW.properties
@@ -6,4 +6,9 @@ com.fr.env.RemoteEnvPane.dialog=308*132
com.fr.design.version.check.dialog=230*95
com.fr.design.version.detail.label=450*30
com.fr.design.version.detail.dialog=600*500
-com.fr.design.web.pane.text.field=450*20
\ No newline at end of file
+com.fr.env.SyncFailedPluginsDialog.messageWithLink=316*20
+com.fr.design.web.pane.text.field=450*20
+com.fr.design.actions.server.dialog=700*630
+com.fr.design.report.fit.templatePane.dialog=600*400
+com.fr.design.report.fit.firstColumn=80*20
+com.fr.design.report.fit.column=100*20
\ No newline at end of file
diff --git a/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_all.png b/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_all.png
deleted file mode 100644
index c696cba4d3..0000000000
Binary files a/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_all.png and /dev/null differ
diff --git a/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_all.svg b/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_all.svg
new file mode 100644
index 0000000000..f18c158027
--- /dev/null
+++ b/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_all.svg
@@ -0,0 +1,13 @@
+
+
\ No newline at end of file
diff --git a/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_none.png b/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_none.png
deleted file mode 100644
index 4c6c6f2bba..0000000000
Binary files a/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_none.png and /dev/null differ
diff --git a/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_none.svg b/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_none.svg
new file mode 100644
index 0000000000..ec078243bf
--- /dev/null
+++ b/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_none.svg
@@ -0,0 +1,13 @@
+
+
\ No newline at end of file
diff --git a/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_some.png b/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_some.png
deleted file mode 100644
index b3443318bd..0000000000
Binary files a/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_some.png and /dev/null differ
diff --git a/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_some.svg b/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_some.svg
new file mode 100644
index 0000000000..e6151ea038
--- /dev/null
+++ b/designer-base/src/main/resources/com/fr/design/mainframe/guide/complete_some.svg
@@ -0,0 +1,23 @@
+
+
\ No newline at end of file
diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java
index 1fdd6e9fd8..7260fe581c 100644
--- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java
+++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java
@@ -660,7 +660,7 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen
//记录改变前的plotID
String lastPlotID = editingCollection == null ? StringUtils.EMPTY : editingCollection.getSelectedChartProvider(ChartProvider.class).getID();
changeCollectionSelected(getButtonName());
- setSelectedWithFireListener(true);
+ setSelected(true, true);
fireSelectedChanged();
//需要先更新,最后重构面板
diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartHtmlLabelPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartHtmlLabelPane.java
index 0e9cc416f9..ebff936c1c 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartHtmlLabelPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartHtmlLabelPane.java
@@ -5,6 +5,7 @@ import com.fr.design.constants.KeyWords;
import com.fr.design.gui.autocomplete.AutoCompletion;
import com.fr.design.gui.autocomplete.BasicCompletion;
import com.fr.design.gui.autocomplete.DefaultCompletionProvider;
+import com.fr.design.gui.frpane.AbstractAttrNoScrollPane;
import com.fr.design.gui.ibutton.UIToggleButton;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.icontainer.UIScrollPane;
@@ -45,7 +46,7 @@ public class VanChartHtmlLabelPane extends JPanel {
private UICheckBox isCustomHeight;
private UITextField customHeight;
- private VanChartStylePane parent;
+ private AbstractAttrNoScrollPane parent;
private JPanel widthAndHeightPane;
@@ -53,7 +54,7 @@ public class VanChartHtmlLabelPane extends JPanel {
contentTextArea.setText(text);
}
- public void setParent(VanChartStylePane parent) {
+ public void setParent(AbstractAttrNoScrollPane parent) {
this.parent = parent;
}
@@ -126,7 +127,7 @@ public class VanChartHtmlLabelPane extends JPanel {
};
}
- private void fireJSChange() {
+ protected void fireJSChange() {
if (parent != null) {
parent.attributeChanged();
}
diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java
index d5f866c818..3020093278 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java
@@ -356,7 +356,7 @@ public class VanChartAxisButtonPane extends BasicBeanPane {
if (isEnabled()) {
noSelected();
changeAxisSelected(getButtonName());
- setSelectedWithFireListener(true);
+ setSelected(true, true);
fireSelectedChanged();
}
}
diff --git a/designer-form/src/main/java/com/fr/design/actions/FormFitAttrAction.java b/designer-form/src/main/java/com/fr/design/actions/FormFitAttrAction.java
deleted file mode 100644
index 21b7bfdcb6..0000000000
--- a/designer-form/src/main/java/com/fr/design/actions/FormFitAttrAction.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package com.fr.design.actions;
-
-import com.fr.design.beans.BasicBeanPane;
-import com.fr.design.dialog.DialogActionAdapter;
-import com.fr.design.dialog.UIDialog;
-import com.fr.design.fit.DesignerUIModeConfig;
-import com.fr.design.mainframe.DesignerContext;
-import com.fr.design.mainframe.JTemplate;
-import com.fr.design.menu.MenuKeySet;
-import com.fr.design.report.fit.menupane.TemplateFitAttrPane;
-import com.fr.report.fit.FitProvider;
-import com.fr.report.fit.ReportFitAttr;
-
-import javax.swing.KeyStroke;
-import java.awt.event.ActionEvent;
-
-/**
- * Created by Administrator on 2015/7/6 0006.
- */
-public class FormFitAttrAction extends JTemplateAction {
- private static final MenuKeySet REPORT_FIT_ATTR_ELEMENTCASE = new MenuKeySet() {
- @Override
- public char getMnemonic() {
- return 'T';
- }
-
- @Override
- public String getMenuName() {
- return DesignerUIModeConfig.getInstance().newUIMode() ?
- com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit_PC_Adaptive_Attr") :
- com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_PC_Element_Case_Fit_Attr");
- }
-
- @Override
- public KeyStroke getKeyStroke() {
- return null;
- }
- };
-
- public FormFitAttrAction(JTemplate jTemplate) {
- super(jTemplate);
- initMenuStyle();
- }
-
- private void initMenuStyle() {
- this.setMenuKeySet(REPORT_FIT_ATTR_ELEMENTCASE);
- this.setName(getMenuKeySet().getMenuKeySetName() + "...");
- this.setMnemonic(getMenuKeySet().getMnemonic());
- this.setSmallIcon(DesignerUIModeConfig.getInstance().newUIMode() ?
- "/com/fr/design/images/reportfit/fit.png" :
- "/com/fr/design/images/reportfit/fit");
- }
-
- @Override
- public void actionPerformed(ActionEvent e) {
- final JTemplate jwb = getEditingComponent();
- if (jwb == null) {
- return;
- }
- final FitProvider wbTpl = (FitProvider) jwb.getTarget();
- ReportFitAttr fitAttr = wbTpl.getReportFitAttr();
- TemplateFitAttrPane templateFitAttrPane = new TemplateFitAttrPane(jwb);
- showFitDialog(fitAttr, jwb, wbTpl, templateFitAttrPane);
- }
-
- private void showFitDialog(ReportFitAttr fitAttr, final JTemplate jwb, final FitProvider wbTpl, final BasicBeanPane attrPane) {
- attrPane.populateBean(fitAttr);
- UIDialog dialog = attrPane.showMediumWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() {
- @Override
- public void doOk() {
- wbTpl.setReportFitAttr(attrPane.updateBean());
- jwb.fireTargetModified();
- }
- });
- dialog.setVisible(true);
- }
-}
diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/actions/FormDeleteAction.java b/designer-form/src/main/java/com/fr/design/designer/beans/actions/FormDeleteAction.java
index c2fec8f392..75a7442514 100644
--- a/designer-form/src/main/java/com/fr/design/designer/beans/actions/FormDeleteAction.java
+++ b/designer-form/src/main/java/com/fr/design/designer/beans/actions/FormDeleteAction.java
@@ -41,6 +41,14 @@ public class FormDeleteAction extends FormWidgetEditAction {
return comp;
}
+ @Override
+ public JComponent createToolBarComponentByName(String componentName) {
+ JComponent comp = super.createToolBarComponentByName(componentName);
+ // 除了 BACKSPACE 之外,DELETE 键也要能删除(直接在此处添加绑定,没有按钮提示)
+ comp.registerKeyboardAction(this, KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);
+ return comp;
+ }
+
/**
* 删除
*
diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRCardMainBorderLayoutAdapter.java b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRCardMainBorderLayoutAdapter.java
index 742d6b8f41..726c397060 100644
--- a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRCardMainBorderLayoutAdapter.java
+++ b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRCardMainBorderLayoutAdapter.java
@@ -4,7 +4,10 @@ import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.cardlayout.XWCardTagLayout;
import com.fr.design.dialog.FineJOptionPane;
+import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.form.layout.FRBorderLayout;
+import com.fr.design.mainframe.JTemplate;
+import com.fr.design.ui.util.UIUtil;
import com.fr.general.ComparatorUtils;
import java.awt.BorderLayout;
@@ -61,7 +64,22 @@ public class FRCardMainBorderLayoutAdapter extends FRBorderLayoutAdapter {
private boolean isBeyondMinConstraint(int minConstraint, int value) {
if (minConstraint > value) {
FineJOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Beyond_Tablayout_Bounds"));
- container.setSize(container.getBackupBound().getSize());
+ if (container.getBackupBound() != null) {
+ // 手动拖动导致变矮的场景
+ container.setSize(container.getBackupBound().getSize());
+ } else {
+ // 自适应布局平分高度导致变矮的场景
+ UIUtil.invokeLaterIfNeeded(new Runnable() {
+ @Override
+ public void run() {
+ JTemplate, ?> jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
+ if (jt != null) {
+ jt.undo();
+ }
+ }
+ });
+
+ }
return true;
} else {
return false;
diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java
index 84013aadfa..d17e9689e6 100644
--- a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java
+++ b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java
@@ -68,7 +68,7 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter {
public FRFitLayoutAdapter(XLayoutContainer container) {
super(container);
initMinSize();
- this.frLayoutState = new FRNoFixLayoutAdapter(this, container, minHeight);
+ this.frLayoutState = new FRNoFixLayoutAdapter(this, container, minWidth, minHeight, actualVal);
painter = this.frLayoutState.getPainter();
}
@@ -151,13 +151,6 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter {
//如果当前处于边缘地带, 那么就把他贴到父容器上
boolean isMatchEdge = matchEdge(x, y);
- int componentHeight = comp.getHeight();
- int componentWidth = comp.getWidth();
- //上半部分高度
- int upHeight = (int) (componentHeight * TOP_HALF) + comp.getY();
- //下半部分高度
- int downHeight = (int) (componentHeight * BOTTOM_HALF) + comp.getY();
-
//布局控件要先判断是不是可编辑
XLayoutContainer topLayout = XCreatorUtils.getHotspotContainer((XCreator) comp).getTopLayout();
boolean access = topLayout != null && !isMatchEdge && !topLayout.acceptType(XWAbsoluteLayout.class) && !isExtraContainer(comp) && !topLayout.isDragInAble();
@@ -167,17 +160,7 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter {
return false;
}
- if (isCrossPointArea(comp, x, y)) {
- return canAcceptWhileCrossPoint(comp, x, y);
- }
-
- if (isTrisectionArea(comp, x, y)) {
- return canAcceptWhileTrisection(comp, x, y);
- }
-
- boolean horizonValid = componentWidth >= minWidth * 2 + actualVal;
- boolean verticalValid = componentHeight >= minHeight * 2 + actualVal;
- return y > upHeight && y < downHeight ? horizonValid : verticalValid;
+ return this.frLayoutState.accept(creator, x, y);
}
private boolean isExtraContainer(Component comp) {
diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFixLayoutAdapter.java b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFixLayoutAdapter.java
index d649c5e30b..7fe0f5d7a6 100644
--- a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFixLayoutAdapter.java
+++ b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFixLayoutAdapter.java
@@ -110,7 +110,8 @@ public class FRFixLayoutAdapter extends AbstractLayoutAdapter {
@Override
public boolean accept(XCreator creator, int x, int y) {
- return true;
+ Component component = container.getComponentAt(x, y);
+ return component != container;
}
diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRNoFixLayoutAdapter.java b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRNoFixLayoutAdapter.java
index bdf67e00ea..aaeedfc8da 100644
--- a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRNoFixLayoutAdapter.java
+++ b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRNoFixLayoutAdapter.java
@@ -12,13 +12,20 @@ import java.awt.Component;
import java.util.ArrayList;
public class FRNoFixLayoutAdapter extends AbstractLayoutAdapter {
- private int minHeight;
- private FRBodyLayoutAdapter parentLayoutAdapter;
+ private static final double TOP_HALF = 0.25;
+ private static final double BOTTOM_HALF = 0.75;
+ private final int minWidth;
+ private final int minHeight;
+ private final int actualVal;
+ private final FRBodyLayoutAdapter parentLayoutAdapter;
- public FRNoFixLayoutAdapter(FRBodyLayoutAdapter parentLayoutAdapter, XLayoutContainer container, int minHeight) {
+
+ public FRNoFixLayoutAdapter(FRBodyLayoutAdapter parentLayoutAdapter, XLayoutContainer container, int minWidth, int minHeight, int actualVal) {
super(container);
this.parentLayoutAdapter = parentLayoutAdapter;
+ this.minWidth = minWidth;
this.minHeight = minHeight;
+ this.actualVal = actualVal;
}
@Override
@@ -79,7 +86,7 @@ public class FRNoFixLayoutAdapter extends AbstractLayoutAdapter {
public void delete(XCreator creator, int creatorWidth, int creatorHeight) {
int x = creator.getX();
int y = creator.getY();
- ((FRFitLayoutAdapter)parentLayoutAdapter).recalculateChildrenSize(x, y, creatorWidth, creatorHeight, true);
+ ((FRFitLayoutAdapter) parentLayoutAdapter).recalculateChildrenSize(x, y, creatorWidth, creatorHeight, true);
}
@@ -100,7 +107,33 @@ public class FRNoFixLayoutAdapter extends AbstractLayoutAdapter {
@Override
public boolean accept(XCreator creator, int x, int y) {
- return true;
+ Component comp = container.getComponentAt(x, y);
+ if (comp == null || checkInterval(comp)) {
+ return false;
+ }
+ int componentHeight = comp.getHeight();
+ int componentWidth = comp.getWidth();
+ //上半部分高度
+ int upHeight = (int) (componentHeight * TOP_HALF) + comp.getY();
+ //下半部分高度
+ int downHeight = (int) (componentHeight * BOTTOM_HALF) + comp.getY();
+
+ if (parentLayoutAdapter.isCrossPointArea(comp, x, y)) {
+ return parentLayoutAdapter.canAcceptWhileCrossPoint(comp, x, y);
+ }
+
+ if (parentLayoutAdapter.isTrisectionArea(comp, x, y)) {
+ return parentLayoutAdapter.canAcceptWhileTrisection(comp, x, y);
+ }
+
+ boolean horizonValid = componentWidth >= minWidth * 2 + actualVal;
+ boolean verticalValid = componentHeight >= minHeight * 2 + actualVal;
+ return y > upHeight && y < downHeight ? horizonValid : verticalValid;
+ }
+
+ // 间隔区域
+ private boolean checkInterval(Component comp) {
+ return container.getComponentCount() > 0 && comp == container;
}
@Override
diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/painters/FRFixLayoutPainter.java b/designer-form/src/main/java/com/fr/design/designer/beans/painters/FRFixLayoutPainter.java
index f450a437a2..0f0aa2a6d2 100644
--- a/designer-form/src/main/java/com/fr/design/designer/beans/painters/FRFixLayoutPainter.java
+++ b/designer-form/src/main/java/com/fr/design/designer/beans/painters/FRFixLayoutPainter.java
@@ -1,6 +1,5 @@
package com.fr.design.designer.beans.painters;
-import com.fr.design.designer.beans.painters.AbstractPainter;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XOccupiedLayout;
@@ -36,8 +35,8 @@ public class FRFixLayoutPainter extends AbstractPainter {
@Override
public void paint(Graphics g, int startX, int startY) {
super.paint(g, startX, startY);
- int x = hotspot.x - hotspot_bounds.x;
- int y = hotspot.y - hotspot_bounds.y;
+ int x = hotspot.x - hotspot_bounds.x ;
+ int y = hotspot.y - hotspot_bounds.y ;
Component currentComp = container.getComponentAt(x, y);
if (currentComp == null) {
return;
@@ -50,7 +49,8 @@ public class FRFixLayoutPainter extends AbstractPainter {
} else if (!((XCreator) currentComp).acceptType(XOccupiedLayout.class)) {
state = OperateState.COMPONENT_REPLACE;
}
- state.paint(g, creator.getBackupRectangle(), currentComp.getBounds(), new Rectangle(x, y, creator.initEditorSize().width, ((XCreator) currentComp).initEditorSize().height));
+ Rectangle currentCompRec = new Rectangle(currentComp.getX() - startX, currentComp.getY() - startY, currentComp.getWidth(), currentComp.getHeight());
+ state.paint(g, creator.getBackupRectangle(), currentCompRec, new Rectangle(x, y, creator.initEditorSize().width, ((XCreator) currentComp).initEditorSize().height));
} else {
Color bColor = XCreatorConstants.LAYOUT_FORBIDDEN_COLOR;
int[] hot_rec = new int[]{x, y, 0, 0};
diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/painters/FROccupiedLayoutPainter.java b/designer-form/src/main/java/com/fr/design/designer/beans/painters/FROccupiedLayoutPainter.java
index 33a809a895..3a973b116f 100644
--- a/designer-form/src/main/java/com/fr/design/designer/beans/painters/FROccupiedLayoutPainter.java
+++ b/designer-form/src/main/java/com/fr/design/designer/beans/painters/FROccupiedLayoutPainter.java
@@ -40,11 +40,11 @@ public class FROccupiedLayoutPainter extends AbstractPainter {
Composite backupComposite = g2d.getComposite();
g2d.setColor(XCreatorConstants.DRAG_IN_OCCUPIED_LAYOUT_COLOR);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.05f));
- g2d.fillRect(container.getX(), container.getY(), container.getWidth(), container.getHeight());
+ g2d.fillRect(container.getX() - startX, container.getY() - startY, container.getWidth(), container.getHeight());
g2d.setStroke(XCreatorConstants.DASH_STROKE);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f));
- g2d.drawRect(container.getX() + 1, container.getY() + 1, container.getWidth() - 2, container.getHeight() - 2);
+ g2d.drawRect(container.getX() - startX + 1, container.getY() - startY + 1, container.getWidth() - 2, container.getHeight() - 2);
g2d.setStroke(backupStroke);
g2d.setComposite(backupComposite);
g2d.setColor(backupColor);
@@ -53,4 +53,4 @@ public class FROccupiedLayoutPainter extends AbstractPainter {
}
-}
\ No newline at end of file
+}
diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java b/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java
index 60434f2cb8..f99864c629 100644
--- a/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java
+++ b/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java
@@ -273,12 +273,7 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{
parentCreator.setBorder(border); // 容器绘制完整边框
bodyCreator.setBorder(BorderFactory.createEmptyBorder()); // body不绘制边框
- titleCreator.setBorder(BorderFactory.createEmptyBorder()); // title绘制底部边框
- if (border instanceof LineBorder) {
- Color color = ((LineBorder) border).getLineColor();
- int thickness = ((LineBorder) border).getThickness();
- titleCreator.setBorder(new BottomLineBorder(color, thickness));
- }
+ titleCreator.setBorder(BorderFactory.createEmptyBorder()); // title不绘制边框
if (bodyCreator instanceof XBorderStyleWidgetCreator) {
XBorderStyleWidgetCreator styledBodyXCreator = (XBorderStyleWidgetCreator) bodyCreator;
@@ -407,32 +402,6 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{
}
- // 适用于标题栏的底部边框
- public static class BottomLineBorder extends LineBorder {
-
- private BottomLineBorder(Color color, int thickness) {
- super(color, thickness);
- }
-
- @Override
- public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
- Graphics2D g2d = (Graphics2D)g;
-
- Color oldColor = g2d.getColor();
- Stroke oldStroke = g2d.getStroke();
-
- g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-
- g2d.setColor(getLineColor());
- g2d.setStroke(new BasicStroke(getThickness() * 2));
- g2d.drawLine(0, height, width, height);
-
- g2d.setStroke(oldStroke);
- g2d.setColor(oldColor);
- g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
- }
- }
-
public static class NoBackgroundPaneUI extends BasicPanelUI {
@Override
public void update(Graphics g, JComponent c) {
diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java
index 71aa6f9908..da4d235f07 100644
--- a/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java
+++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java
@@ -886,6 +886,7 @@ public class XWFitLayout extends XLayoutContainer {
isRefreshing = true;
this.remove(oldCreator);
this.add(newCreator);
+ dealDirections(newCreator, false);
//对于新增的绝对布局的组件,需要更新下内部组件的大小
if (newCreator.acceptType(XWAbsoluteLayout.class)){
((XWAbsoluteLayout) newCreator).updateBoundsWidget();
diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java
index 7655095b18..d4757c184a 100644
--- a/designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java
+++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java
@@ -15,6 +15,8 @@ import com.fr.form.ui.container.WTitleLayout;
import com.fr.general.Background;
import com.fr.general.ComparatorUtils;
+import javax.swing.border.Border;
+import javax.swing.border.LineBorder;
import java.awt.*;
import java.awt.event.ContainerEvent;
import java.awt.geom.Rectangle2D;
@@ -187,6 +189,37 @@ public class XWTitleLayout extends DedicateLayoutContainer {
}
+ @Override
+ protected void paintBorder(Graphics g) {
+ super.paintBorder(g);
+ paintSeparator((Graphics2D) g);
+ }
+
+ private void paintSeparator(Graphics2D g2d) {
+ Border border = getBorder();
+ XCreator titleCreator = getTitleCreator();
+ if (border instanceof LineBorder && titleCreator != null) {
+ int height = titleCreator.getHeight();
+ Insets paddingInsets = getInsets();
+ int y = height + paddingInsets.top;
+
+ Color oldColor = g2d.getColor();
+ Stroke oldStroke = g2d.getStroke();
+
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+ Color lineColor = ((LineBorder) border).getLineColor();
+ int thickness = ((LineBorder) border).getThickness();
+ g2d.setColor(lineColor);
+ g2d.setStroke(new BasicStroke(thickness * 2));
+ g2d.drawLine(0, y, getWidth(), y);
+
+ g2d.setStroke(oldStroke);
+ g2d.setColor(oldColor);
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
+ }
+ }
+
@Override
public void paintBackground(Graphics2D g2d) {
if (getComponentCount() > 1) {
diff --git a/designer-form/src/main/java/com/fr/design/fit/NewJForm.java b/designer-form/src/main/java/com/fr/design/fit/NewJForm.java
index 8f52fbaf00..6859c12310 100644
--- a/designer-form/src/main/java/com/fr/design/fit/NewJForm.java
+++ b/designer-form/src/main/java/com/fr/design/fit/NewJForm.java
@@ -13,7 +13,6 @@ import com.fr.design.fit.common.AdaptiveSwitchUtil;
import com.fr.design.fit.common.LayoutTool;
import com.fr.form.fit.NewFormMarkAttr;
import com.fr.design.fit.common.TemplateTool;
-import com.fr.design.actions.FormFitAttrAction;
import com.fr.design.actions.NewFormMobileAttrAction;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.preview.DeveloperPreview;
@@ -92,7 +91,7 @@ public class NewJForm extends JForm {
Rectangle rectangle = LayoutTool.getAbsoluteBodySize(this);
if (!isNewJFrom() && (rectangle.width != bodyWidth || rectangle.height != bodyHeight)) {
TemplateTool.onlyChangeAbsoluteBodySize(bodyHeight, bodyWidth, this);
- } else if(isNewJFrom()){
+ } else if (isNewJFrom()) {
if (rectangle.width > bodyWidth && rectangle.height > bodyHeight) {
TemplateTool.onlyChangeAbsoluteBodySize(rectangle.height, rectangle.width, this);
} else if (rectangle.width > bodyWidth) {
@@ -129,9 +128,9 @@ public class NewJForm extends JForm {
@Override
public ShortCut[] shortcut4TemplateMenu() {
if (this.index == FORM_TAB) {
- return ArrayUtils.addAll(new ShortCut[]{new TemplateParameterAction(this), new NewFormMobileAttrAction(this), new FormFitAttrAction(this)}, new ShortCut[0]);
+ return ArrayUtils.addAll(new ShortCut[]{new TemplateParameterAction(this), new NewFormMobileAttrAction(this), getReportFitAttrAction()}, new ShortCut[0]);
} else {
- return ArrayUtils.addAll(new ShortCut[]{new TemplateParameterAction(this), new NewFormMobileAttrAction(this), new FormFitAttrAction(this)}, this.getElementCaseDesign().shortcut4TemplateMenu());
+ return ArrayUtils.addAll(new ShortCut[]{new TemplateParameterAction(this), new NewFormMobileAttrAction(this), getReportFitAttrAction()}, this.getElementCaseDesign().shortcut4TemplateMenu());
}
}
@@ -183,7 +182,7 @@ public class NewJForm extends JForm {
private void processColumnAbsorbingEffect(XWTitleLayout xwTitleLayout, DynamicUnitList columnUnitList, Dimension bound) {
int temp = 0;
- int resolution = DesignerUIModeConfig.getInstance().getScreenResolution();;
+ int resolution = DesignerUIModeConfig.getInstance().getScreenResolution();
int difference = 0;
int i = 0;
while (true) {
@@ -207,7 +206,7 @@ public class NewJForm extends JForm {
private void processRowAbsorbingEffect(XWTitleLayout xwTitleLayout, DynamicUnitList rowUnitList, Dimension bound) {
int temp = hasTitle(xwTitleLayout) ? TITLE_HEIGHT : 0;
- int resolution =DesignerUIModeConfig.getInstance().getScreenResolution();
+ int resolution = DesignerUIModeConfig.getInstance().getScreenResolution();
int difference = 0;
int i = 0;
while (true) {
diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java b/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java
index db5367ee9a..9284554dcb 100644
--- a/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java
+++ b/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java
@@ -25,7 +25,6 @@ import com.fr.stable.Constants;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
-import javax.swing.SwingWorker;
import javax.swing.plaf.ComponentUI;
import java.awt.AlphaComposite;
import java.awt.Color;
@@ -114,14 +113,8 @@ public class FormDesignerUI extends ComponentUI {
if (designer.getPainter() != null) {
// ComponentAdapter和LayoutAdapter提供的额外的Painter,该Painter一般用于提示作用,
// 相当于一个浮动层, 要考虑参数面板的高度
- new SwingWorker() {
- @Override
- protected Void doInBackground() throws Exception {
- designer.getPainter().paint(g, designer.getArea().getHorizontalValue(),
- designer.getArea().getVerticalValue() + designer.getParaHeight());
- return null;
- }
- }.execute();
+ designer.getPainter().paint(g, designer.getArea().getHorizontalValue(),
+ designer.getArea().getVerticalValue() + designer.getParaHeight());
}
AddingModel addingModel = designer.getAddingModel();
diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormWidgetDetailPane.java b/designer-form/src/main/java/com/fr/design/mainframe/FormWidgetDetailPane.java
index 75f4b2692d..f44b9ca722 100644
--- a/designer-form/src/main/java/com/fr/design/mainframe/FormWidgetDetailPane.java
+++ b/designer-form/src/main/java/com/fr/design/mainframe/FormWidgetDetailPane.java
@@ -6,7 +6,7 @@ import com.fr.design.gui.ibutton.UIHeadGroup;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
-import com.fr.design.locale.impl.OnlineWidgetsMark;
+import com.fr.design.locale.impl.ShowOnlineWidgetMark;
import com.fr.design.mainframe.reuse.ComponentReuseNotificationInfo;
import com.fr.design.mainframe.share.collect.ComponentCollector;
import com.fr.design.mainframe.share.ui.local.LocalWidgetRepoPane;
@@ -100,7 +100,8 @@ public class FormWidgetDetailPane extends FormDockView{
}
headGroup = new UIHeadGroup(paneNames) {
protected void tabChanged(int newSelectedIndex) {
- if (newSelectedIndex == 1) {
+ //初始化还未展示的时候不需要收集其 marketClick
+ if (this.isShowing() && newSelectedIndex == 1) {
ComponentCollector.getInstance().collectMarkerClick();
}
cardLayout.show(centerPane, paneList.get(newSelectedIndex).getTitle());
@@ -182,7 +183,7 @@ public class FormWidgetDetailPane extends FormDockView{
}
private boolean isShowOnlineWidgetRepoPane() {
- LocaleMark mark = LocaleCenter.getMark(OnlineWidgetsMark.class);
- return mark.getValue();
+ LocaleMark localeMark = LocaleCenter.getMark(ShowOnlineWidgetMark.class);
+ return localeMark.getValue();
}
}
diff --git a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java
index a3ea4583ff..bc0c75b30d 100644
--- a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java
+++ b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java
@@ -597,7 +597,7 @@ public class JForm extends JTemplate