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 fcf0091c6..effd32b14 100644
--- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java
+++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java
@@ -87,6 +87,8 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
private static final int MAX_SHOW_NUM = 10;
private static final String VERSION_80 = "80";
+ private static final String VERSION_90 = "90";
+ private static final String VERSION100 = "100";
private static final int CACHINGTEMPLATE_LIMIT = 5;
private static final String WEB_NAME = "webapps";
/**
@@ -354,14 +356,21 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
try {
fileWriter = new FileWriter(envFile);
File oldEnvFile = new File(ProductConstants.getEnvHome() + File.separator + ProductConstants.APP_NAME + "6-1" + "Env.xml");
- File envFile80 = new File(getEnvHome(VERSION_80) + File.separator + getEnvFile().getName());
- if (oldEnvFile.exists()) {
+ File envFile80 = getOldEnvFile(VERSION_80);
+ File envFile90 = getOldEnvFile(VERSION_90);
+ File envFile100 = getOldEnvFile(VERSION100);
+ // 从10.0往前递进是否存在更老版本的配置文件
+ if (envFile100.exists()) {
+ compatibilityPrevVersion(envFile100);
+ } else if (envFile90.exists()) {
+ compatibilityPrevVersion(envFile90);
+ } else if (envFile80.exists()) {
+ compatibilityPrevVersion(envFile80);
+ } else if (oldEnvFile.exists()) {
// marks:兼容DesignerEnv6-1.xml
FileReader fileReader = new FileReader(oldEnvFile);
Utils.copyCharTo(fileReader, fileWriter);
fileReader.close();
- } else if (envFile80.exists()) {
- compatibilityPrevVersion(envFile80);
} else {
// marks:生成一个新的xml文件
StringReader stringReader = new StringReader("");
@@ -383,6 +392,10 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
}
}
+ private File getOldEnvFile(String version) {
+ return new File(getEnvHome(version) + File.separator + getEnvFile().getName());
+ }
+
private static String getEnvHome(String version) {
String userHome = System.getProperty("user.home");
if (userHome == null) {
diff --git a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java
index 98c079ee2..cd9c835f3 100644
--- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java
+++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java
@@ -8,6 +8,7 @@ import com.fr.design.dialog.DialogActionAdapter;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.env.DesignerWorkspaceGenerator;
import com.fr.design.env.DesignerWorkspaceInfo;
+import com.fr.design.env.DesignerWorkspaceInfoContext;
import com.fr.design.env.DesignerWorkspaceType;
import com.fr.design.env.RemoteDesignerWorkspaceInfo;
import com.fr.design.env.RemoteWorkspace;
@@ -20,7 +21,7 @@ import com.fr.design.notification.NotificationCenter;
import com.fr.design.utils.DesignUtils;
import com.fr.design.versioncheck.VersionCheckUtils;
import com.fr.env.EnvListPane;
-import com.fr.env.handler.RemoteDesignExceptionHandler;
+import com.fr.env.handler.WorkspaceExceptionHandler;
import com.fr.exit.DesignerExiter;
import com.fr.general.GeneralUtils;
import com.fr.invoke.Reflect;
@@ -105,6 +106,7 @@ public class EnvChangeEntrance {
private boolean switch2Env(final String envName, PopTipStrategy strategy) {
DesignerEnvManager envManager = DesignerEnvManager.getEnvManager();
DesignerWorkspaceInfo selectedEnv = envManager.getWorkspaceInfo(envName);
+ DesignerWorkspaceInfoContext.setWorkspaceInfo(selectedEnv);
WorkspaceConnectionInfo connectionInfo = selectedEnv.getConnection();
try {
@@ -139,7 +141,7 @@ public class EnvChangeEntrance {
pluginErrorRemind();
} catch (Exception exception) {
// 失败的处理
- RemoteDesignExceptionHandler.getInstance().handleInSwitch(exception, selectedEnv);
+ WorkspaceExceptionHandler.getInstance().handleInSwitch(exception, selectedEnv);
return false;
}
TemplateTreePane.getInstance().refreshDockingView();
@@ -436,7 +438,7 @@ public class EnvChangeEntrance {
}
});
if (e != null) {
- RemoteDesignExceptionHandler.getInstance().handleInStart(e, workspaceInfo);
+ WorkspaceExceptionHandler.getInstance().handleInStart(e, workspaceInfo);
}
envListDialog.setVisible(true);
}
diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java
index 779f7123c..2e32eb88c 100644
--- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java
+++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java
@@ -12,6 +12,7 @@ import com.fr.design.editor.editor.IntegerEditor;
import com.fr.design.gui.frpane.UITabbedPane;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ibutton.UIColorButton;
+import com.fr.design.gui.ibutton.UINoThemeColorButton;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.icombobox.UIDictionaryComboBox;
@@ -474,10 +475,10 @@ public class PreferencePane extends BasicPane {
JPanel colorSettingPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Preference_Setting_Colors"));
generalPane.add(colorSettingPane);
- gridLineColorTBButton = new UIColorButton(IOUtils.readIcon("/com/fr/design/images/gui/color/foreground.png"));
+ gridLineColorTBButton = new UINoThemeColorButton(IOUtils.readIcon("/com/fr/design/images/gui/color/foreground.png"));
gridLineColorTBButton.setEnabled(this.isEnabled());
- paginationLineColorTBButton = new UIColorButton(IOUtils.readIcon("/com/fr/design/images/gui/color/foreground.png"));
+ paginationLineColorTBButton = new UINoThemeColorButton(IOUtils.readIcon("/com/fr/design/images/gui/color/foreground.png"));
paginationLineColorTBButton.setEnabled(this.isEnabled());
JPanel leftPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane();
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 f1758f068..ab86a0d6f 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
@@ -161,10 +161,18 @@ public abstract class DesignTableDataManager {
}
public static String getChangedDsNameByOldDsName(String oldDsName) {
+ String changeName;
+
if (isDsNameChanged(oldDsName)) {
- return dsNameChangedMap.get(oldDsName);
+ changeName = dsNameChangedMap.get(oldDsName);
+ } else {
+ changeName = StringUtils.EMPTY;
+ }
+
+ if (StringUtils.isNotEmpty(changeName)) {
+ return getChangedDsNameByOldDsName(changeName);
} else {
- return StringUtils.EMPTY;
+ return oldDsName;
}
}
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataComboBox.java b/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataComboBox.java
index 8964ff8de..422a3a49a 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataComboBox.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataComboBox.java
@@ -9,6 +9,7 @@ import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.icombobox.UIComboBoxRenderer;
import com.fr.file.TableDataConfig;
+import com.fr.stable.StringUtils;
import javax.swing.*;
import java.awt.*;
@@ -80,12 +81,13 @@ public class TreeTableDataComboBox extends UIComboBox {
}
public void setSelectedTableDataByName(String name) {
+ refresh();
TableDataWrapper tableDataWrapper;
- if (res_map.get(name) != null) {
- tableDataWrapper = res_map.get(name);
- } else {
- String changeName = DesignTableDataManager.getChangedDsNameByOldDsName(name);
+ String changeName = DesignTableDataManager.getChangedDsNameByOldDsName(name);
+ if (StringUtils.isNotEmpty(changeName)) {
tableDataWrapper = res_map.get(changeName);
+ } else {
+ tableDataWrapper = res_map.get(name);
}
this.getModel().setSelectedItem(tableDataWrapper);
}
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataDictPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataDictPane.java
index f1f1c6c75..175ddbfda 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataDictPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataDictPane.java
@@ -64,7 +64,7 @@ public class TreeTableDataDictPane extends BasicPane implements Previewable {
tableFlowPane.add(tableDataNameComboBox);
tableDataNameComboBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
- tdChange();
+ tdChange(true);
}
});
tableFlowPane.add(new PreviewLabel(this));
@@ -73,19 +73,21 @@ public class TreeTableDataDictPane extends BasicPane implements Previewable {
this.add(centerPane, BorderLayout.CENTER);
parentMarkRadio = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Build_Tree_Accord_Parent_Marked_Filed"), true);
lengthMarkRadio = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Build_Tree_Accord_Marked_Filed_Length"));
- parentMarkRadio.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
+ parentMarkRadio.addItemListener(new ItemListener() {
+ @Override
+ public void itemStateChanged(ItemEvent e) {
if (isBuildByParentFiled()) {
makeParentEnable();
- tdChange();
+ tdChange(false);
}
}
});
- lengthMarkRadio.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
+ lengthMarkRadio.addItemListener(new ItemListener() {
+ @Override
+ public void itemStateChanged(ItemEvent e) {
if (!isBuildByParentFiled()) {
makeLengthEnable();
- tdChange();
+ tdChange(false);
}
}
});
@@ -169,7 +171,7 @@ public class TreeTableDataDictPane extends BasicPane implements Previewable {
}
- private void tdChange() {
+ private void tdChange(boolean isChangeDS) {
TableDataWrapper tableDataWrappe = this.tableDataNameComboBox.getSelectedItem();
if (tableDataWrappe == null) {
return;
@@ -186,7 +188,9 @@ public class TreeTableDataDictPane extends BasicPane implements Previewable {
String[] columnNames = new String[len];
namelist.toArray(columnNames);
for (int i = 0; i < valueEditorPanes.length; i++) {
- valueEditorPanes[i].setEditors(new Editor[]{new ColumnNameEditor(columnNames), new ColumnIndexEditor(len)}, columnNames[0]);
+ if (isChangeDS || isNoSelectedColumnName(valueEditorPanes[i])) {
+ valueEditorPanes[i].setEditors(new Editor[]{new ColumnNameEditor(columnNames), new ColumnIndexEditor(len)}, columnNames[0]);
+ }
}
} catch (Exception e) {
for (int i = 0; i < valueEditorPanes.length; i++) {
@@ -197,6 +201,10 @@ public class TreeTableDataDictPane extends BasicPane implements Previewable {
}
}
+ private boolean isNoSelectedColumnName(ValueEditorPane valueEditorPane) {
+ return (Integer) valueEditorPane.update() == -1;
+ }
+
@Override
protected String title4PopupWindow() {
return "TreeTableDataDictionay";
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 334958124..0da46965b 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java
@@ -1,8 +1,6 @@
package com.fr.design.data.datapane.connect;
import com.fr.base.GraphHelper;
-import com.fr.data.driver.DriverLoader;
-import com.fr.data.driver.config.DriverLoaderConfig;
import com.fr.data.impl.JDBCDatabaseConnection;
import com.fr.design.border.UITitledBorder;
import com.fr.design.gui.ibutton.UIButton;
@@ -23,8 +21,6 @@ import com.fr.general.ComparatorUtils;
import com.fr.stable.ArrayUtils;
import com.fr.stable.EncodeConstants;
import com.fr.stable.StringUtils;
-import com.fr.third.guava.collect.HashBiMap;
-import com.fr.workspace.WorkContext;
import javax.swing.BorderFactory;
import javax.swing.JFileChooser;
@@ -49,7 +45,6 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
-import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -102,167 +97,12 @@ public class JDBCDefPane extends JPanel {
private Component[][] partComponents;
// 请不要改动dbtype,只应该最后添加
private final String[] dbtype = {"Oracle", "DB2", "SQL Server", "MySQL", "Sybase", "Access", "Derby", "Postgre", "SQLite", "Inceptor", OTHER_DB};
- private JDBCDatabaseConnection jdbcDatabase;
- private boolean needRefresh = true;
- private UIComboBox driverManageBox;
- private ActionLabel driverManageLabel;
- private UIComboBox driverLoaderBox;
- private HashBiMap nameAndRepresent;
- ActionListener driverListener = new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- if (driverComboBox.getSelectedItem() == null || ComparatorUtils.equals(driverComboBox.getSelectedItem(), StringUtils.EMPTY)) {
- return;
- }
- odbcTipsLink.setVisible(ComparatorUtils.equals("sun.jdbc.odbc.JdbcOdbcDriver", driverComboBox.getSelectedItem())); // 选择的如果是ODBC就显示提示
- Iterator> jdbc = jdbcMap.entrySet().iterator();
- while (jdbc.hasNext()) {
- Entry entry = jdbc.next();
- DriverURLName[] dus = entry.getValue();
- for (int i = 0, len = dus.length; i < len; i++) {
- if (ComparatorUtils.equals(dus[i].getDriver(), (driverComboBox.getSelectedItem()))) {
- urlTextField.setText(dus[i].getURL());
- return;
- }
- }
- }
- }
- };
- ActionListener dbtypeButtonActionListener = new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent evt) {
- if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) {
- return;
- }
- DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem());
- for (int i = 0, len = dus.length; i < len; i++) {
- if (ComparatorUtils.equals(driverComboBox.getSelectedItem(), (dus[i].getDriver()))) {
- urlTextField.setText(dus[i].getURL());
- if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), ("Access"))) {
- // ben:这个能不能换种处理方案- -
- JFileChooser filechooser = new JFileChooser();
- filechooser.setDialogTitle(Toolkit.i18nText("Fine-Design_Basic_Open"));
- filechooser.setMultiSelectionEnabled(false);
- filechooser.addChoosableFileFilter(new ChooseFileFilter(new String[]{"accdb", "mdb"}, "Microsoft Office Access"));
- int result = filechooser.showOpenDialog(DesignerContext.getDesignerFrame());
- File selectedfile = null;
- if (result == JFileChooser.APPROVE_OPTION) {
- selectedfile = filechooser.getSelectedFile();
- if (selectedfile != null) {
- String selectedName = selectedfile.getPath().substring(selectedfile.getPath().lastIndexOf('.') + 1);
- if (selectedName.equalsIgnoreCase("mdb") || selectedName.equalsIgnoreCase("accdb")) {
- urlTextField.setText(urlTextField.getText() + selectedfile.getPath());
- }
- }
- }
- }
- break;
- }
- }
- }
- };
- KeyListener portKeyListener = new KeyAdapter() {
- @Override
- public void keyReleased(KeyEvent e) {
- String port = portTextField.getText();
- if (isPortValid(port)) {
- updateURL();
- } else {
- portTextField.setText(port.replaceAll(getCharNeedReplace(e.getKeyChar()), ""));
- if (!isPortValid(portTextField.getText())) {
- portTextField.setText(StringUtils.EMPTY);
- updateURL();
- }
- }
- }
- };
- ActionListener driverManageListener = new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- boolean selectSelfDefine = isSelfDefine();
- driverManageLabel.setVisible(selectSelfDefine);
- driverLoaderBox.setVisible(selectSelfDefine);
- driverComboBox.setVisible(!selectSelfDefine);
- // 选中自定义的话,将odbc的屏蔽,选中默认的话,重新触发一次driverComboBox的事件
- if (selectSelfDefine) {
- odbcTipsLink.setVisible(false);
- } else {
- driverComboBox.setSelectedItem(driverComboBox.getSelectedItem());
- }
- }
- };
- ActionListener dbtypeActionListener = new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent evt) {
-
- urlTextField.setText(StringUtils.EMPTY);
- driverComboBox.removeAllItems();
- driverManageBox.setSelectedItem(Toolkit.i18nText("Fine-Design_Driver_Manage_Default"));
- if (driverLoaderBox.getItemCount() > 0) {
- driverLoaderBox.setSelectedIndex(0);
- }
- if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) {
- driverComboBox.setSelectedItem(StringUtils.EMPTY);
- return;
- }
-
- DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem());
- for (int i = 0, len = dus.length; i < len; i++) {
- driverComboBox.addItem(dus[i].getDriver());
- if (i == 0) {
- driverComboBox.setSelectedItem(dus[i].getDriver());
- urlTextField.setText(dus[i].getURL());
- }
- }
- // 更改数据库类型后 数据库名称置空和之前逻辑保持一致
- if (needRefresh) {
- jdbcDatabase.setDatabase(StringUtils.EMPTY);
- }
- changePane(dbtypeComboBox.getSelectedItem());
- JDBCConnectionDef.getInstance().setConnection((String) dbtypeComboBox.getSelectedItem(), jdbcDatabase);
- DatabaseConnectionPane.JDBC.getAdvancedAttrPane().populate(jdbcDatabase);
- }
- };
-
- InputMethodListener portInputMethodListener = new InputMethodListener() {
- @Override
- public void inputMethodTextChanged(InputMethodEvent event) {
- if (null == event.getText()) {
- return;
- }
- char ch = event.getText().current();
- if (!(ch >= '0' && ch <= '9')) {
- event.consume();
- }
- }
-
- @Override
- public void caretPositionChanged(InputMethodEvent event) {
-
- }
- };
-
- DocumentListener updateParaListener = new DocumentListener() {
- @Override
- public void insertUpdate(DocumentEvent e) {
- updatePara();
- }
-
- @Override
- public void removeUpdate(DocumentEvent e) {
- updatePara();
- }
-
- @Override
- public void changedUpdate(DocumentEvent e) {
- updatePara();
- }
- };
+ private JDBCDatabaseConnection jdbcDatabase;
+ private boolean needRefresh = true;
public JDBCDefPane() {
- initMap();
this.setBorder(UITitledBorder.createBorderWithTitle("JDBC" + ":"));
this.setLayout(FRGUIPaneFactory.createLabelFlowLayout());
JPanel innerthis = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane();
@@ -275,14 +115,7 @@ public class JDBCDefPane extends JPanel {
}
dbtypeComboBox.addActionListener(dbtypeActionListener);
dbtypeComboBox.setMaximumRowCount(10);
- driverLoaderBox = new UIComboBox();
- refreshDriverLoader();
- driverLoaderBox.setEditable(false);
- driverManageBox = new UIComboBox();
- refreshDriverManage(true);
- driverManageBox.setEditable(false);
- driverManageBox.addActionListener(driverManageListener);
- driverLoaderBox.setVisible(isSelfDefine());
+
driverComboBox = new UIComboBox();
driverComboBox.setEditable(true);
driverComboBox.addActionListener(driverListener);
@@ -322,39 +155,17 @@ public class JDBCDefPane extends JPanel {
_gfx.drawLine(0, this.getHeight() - 1, GraphHelper.getWidth(this.getText()), this.getHeight() - 1);
}
};
+ odbcTipsPane.add(odbcTipsLink);
odbcTipsLink.setPreferredSize(new Dimension(GraphHelper.getWidth(Toolkit.i18nText("Fine-Design_Basic_Odbc_Tips")), odbcTipsLink.getPreferredSize().height));
odbcTipsLink.addActionListener(new ActionListener() {
- @Override
public void actionPerformed(ActionEvent evt) {
String url = CloudCenter.getInstance().acquireUrlByKind("odbc.help");
BrowseUtils.browser(url);
}
});
- driverManageLabel = new ActionLabel(Toolkit.i18nText("Fine-Design_Driver_Manage_Add_Driver")) {
- @Override
- public void paintComponent(Graphics _gfx) {
- super.paintComponent(_gfx);
- _gfx.setColor(Color.blue);
- _gfx.drawLine(0, this.getHeight() - 1, GraphHelper.getWidth(this.getText()), this.getHeight() - 1);
- }
- };
- driverManageLabel.setPreferredSize(new Dimension(GraphHelper.getWidth(Toolkit.i18nText("Fine-Design_Driver_Manage_Add_Driver")), driverManageLabel.getPreferredSize().height));
- driverManageLabel.setVisible(isSelfDefine());
- driverManageLabel.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent evt) {
- String url = CloudCenter.getInstance().acquireUrlByKind("driver.add.help");
- BrowseUtils.browser(url);
- }
- });
- odbcTipsPane.add(driverManageLabel);
- odbcTipsPane.add(odbcTipsLink);
+
JPanel driverComboBoxAndTips = new JPanel(new BorderLayout());
- JPanel normalFlowInnerContainer_s_pane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane();
- normalFlowInnerContainer_s_pane.add(driverManageBox);
- normalFlowInnerContainer_s_pane.add(driverComboBox);
- normalFlowInnerContainer_s_pane.add(driverLoaderBox);
- driverComboBoxAndTips.add(normalFlowInnerContainer_s_pane, BorderLayout.WEST);
+ driverComboBoxAndTips.add(driverComboBox, BorderLayout.WEST);
driverComboBoxAndTips.add(odbcTipsPane, BorderLayout.CENTER);
JPanel hostPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane();
@@ -414,70 +225,7 @@ public class JDBCDefPane extends JPanel {
innerthis.add(centerPanel);
}
- private void initMap() {
- Map driverLoaders = DriverLoaderConfig.getInstance().getDriverLoaders();
- nameAndRepresent = getDriverLoaderAndRepresent(driverLoaders);
- }
-
- private HashBiMap getDriverLoaderAndRepresent(Map driverLoaders) {
- HashBiMap driverHashBiMap = HashBiMap.create();
- if (WorkContext.getCurrent().isWarDeploy()) {
- return driverHashBiMap;
- }
- // name 是唯一的,name+driver自然也是唯一的
- for (DriverLoader driverLoader : driverLoaders.values()) {
- driverHashBiMap.put(driverLoader.getName(), getRepresent(driverLoader.getDriverClass(), driverLoader.getName()));
- }
- return driverHashBiMap;
- }
-
- protected JDBCDatabaseConnection getJDBCDatabase() {
- return this.jdbcDatabase;
- }
-
- private void changePane(Object dbType) {
- double p = TableLayout.PREFERRED;
- double f = TableLayout.FILL;
- double[] columnSize = {p, f, 22};
- if (ComparatorUtils.equals(dbType, OTHER_DB) || ComparatorUtils.equals(dbType, "Access") || ComparatorUtils.equals(dbType, "SQLite")) {
- if (this.centerPanel.getComponentCount() != partComponents.length * 2) {
- centerPanel.removeAll();
- TableLayoutHelper.addComponent2ResultPane(partComponents, new double[]{p, p, p, p, p}, columnSize, centerPanel);
- }
- } else if (this.centerPanel.getComponentCount() != allComponents.length * 2) {
- centerPanel.removeAll();
- TableLayoutHelper.addComponent2ResultPane(allComponents, new double[]{p, p, p, p, p, p, p, p}, columnSize, centerPanel);
- }
- }
-
- private String getRepresent(String driverClass, String driverName) {
- return driverClass + "(" + driverName + ")";
- }
-
- private boolean isSelfDefine() {
- return ComparatorUtils.equals(Toolkit.i18nText("Fine-Design_Driver_Manage_Self_Define"), driverManageBox.getSelectedItem());
- }
-
- private void refreshDriverLoader() {
- Set representSet = nameAndRepresent.values();
- driverLoaderBox.clearBoxItems();
- for (String represent : representSet) {
- driverLoaderBox.addItem(represent);
- }
- }
-
- private void refreshDriverManage(boolean addSelfDefine) {
- driverManageBox.clearBoxItems();
- driverManageBox.addItem(Toolkit.i18nText("Fine-Design_Driver_Manage_Default"));
- if (addSelfDefine) {
- driverManageBox.addItem(Toolkit.i18nText("Fine-Design_Driver_Manage_Self_Define"));
- }
- }
-
public void populate(JDBCDatabaseConnection jdbcDatabase) {
- // 单例对象,重新打开的时候并不会新建,但是由于driverloaderbox里面需要是动态内容,因此需要进行刷新动作
- initMap();
- refreshDriverLoader();
needRefresh = false;
if (jdbcDatabase == null) {
jdbcDatabase = new JDBCDatabaseConnection();
@@ -507,25 +255,7 @@ public class JDBCDefPane extends JPanel {
this.dbtypeComboBox.setSelectedItem(OTHER_DB);
}
}
- this.jdbcDatabase.setIdentity(jdbcDatabase.getIdentity());
- // jdbcDatabase.getDriverSource() 只会是空或者是有值,但是为了保险起见,还是应该做个处理
- String driverSource = jdbcDatabase.getDriverSource();
- if (driverSource == null) {
- driverSource = StringUtils.EMPTY;
- }
- if (driverSource.isEmpty()) {
- refreshDriverManage(!nameAndRepresent.isEmpty());
- this.driverManageBox.setSelectedItem(Toolkit.i18nText("Fine-Design_Driver_Manage_Default"));
- this.driverComboBox.setSelectedItem(jdbcDatabase.getDriver());
- } else {
- refreshDriverManage(true);
- this.driverManageBox.setSelectedItem(Toolkit.i18nText("Fine-Design_Driver_Manage_Self_Define"));
- String represent = getRepresent(jdbcDatabase.getDriver(), jdbcDatabase.getDriverSource());
- if (!nameAndRepresent.containsValue(represent)) {
- this.driverLoaderBox.addItem(represent);
- }
- this.driverLoaderBox.setSelectedItem(represent);
- }
+ this.driverComboBox.setSelectedItem(jdbcDatabase.getDriver());
this.urlTextField.setText(jdbcDatabase.getURL());
this.userNameTextField.setText(jdbcDatabase.getUser());
this.passwordTextField.setText(jdbcDatabase.getPassword());
@@ -538,10 +268,31 @@ public class JDBCDefPane extends JPanel {
needRefresh = false;
}
+ protected JDBCDatabaseConnection getJDBCDatabase() {
+ return this.jdbcDatabase;
+ }
+
+ private void changePane(Object dbType) {
+ double p = TableLayout.PREFERRED;
+ double f = TableLayout.FILL;
+ double[] columnSize = {p, f, 22};
+ if (ComparatorUtils.equals(dbType, OTHER_DB) || ComparatorUtils.equals(dbType, "Access") || ComparatorUtils.equals(dbType, "SQLite")) {
+ if (this.centerPanel.getComponentCount() != partComponents.length * 2) {
+ centerPanel.removeAll();
+ TableLayoutHelper.addComponent2ResultPane(partComponents, new double[]{p, p, p, p, p}, columnSize, centerPanel);
+ }
+ } else if (this.centerPanel.getComponentCount() != allComponents.length * 2) {
+ centerPanel.removeAll();
+ TableLayoutHelper.addComponent2ResultPane(allComponents, new double[]{p, p, p, p, p, p, p, p}, columnSize, centerPanel);
+ }
+ }
+
public JDBCDatabaseConnection update() {
if (jdbcDatabase == null) {
jdbcDatabase = new JDBCDatabaseConnection();
}
+ Object driveItem = this.driverComboBox.getSelectedItem();
+ jdbcDatabase.setDriver(driveItem == null ? null : driveItem.toString().trim());
jdbcDatabase.setURL(this.urlTextField.getText().trim());
jdbcDatabase.setUser(this.userNameTextField.getText().trim());
jdbcDatabase.setPassword(new String(this.passwordTextField.getPassword()).trim());
@@ -553,30 +304,126 @@ public class JDBCDefPane extends JPanel {
jdbcDatabase.setNewCharsetName(EncodeConstants.ENCODING_GBK);
jdbcDatabase.setOriginalCharsetName(((String) this.charSetComboBox.getSelectedItem()));
}
- String driverLoader = (String) this.driverLoaderBox.getSelectedItem();
- if (driverLoader == null) {
- driverLoader = StringUtils.EMPTY;
+ return jdbcDatabase;
+ }
+
+ ActionListener dbtypeActionListener = new ActionListener() {
+ public void actionPerformed(ActionEvent evt) {
+
+ urlTextField.setText(StringUtils.EMPTY);
+ driverComboBox.removeAllItems();
+ if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) {
+ driverComboBox.setSelectedItem(StringUtils.EMPTY);
+ return;
+ }
+
+ DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem());
+ for (int i = 0, len = dus.length; i < len; i++) {
+ driverComboBox.addItem(dus[i].getDriver());
+ if (i == 0) {
+ driverComboBox.setSelectedItem(dus[i].getDriver());
+ urlTextField.setText(dus[i].getURL());
+ }
+ }
+ // 更改数据库类型后 数据库名称置空和之前逻辑保持一致
+ if (needRefresh) {
+ jdbcDatabase.setDatabase(StringUtils.EMPTY);
+ }
+ changePane(dbtypeComboBox.getSelectedItem());
+ JDBCConnectionDef.getInstance().setConnection((String) dbtypeComboBox.getSelectedItem(), jdbcDatabase);
+ DatabaseConnectionPane.JDBC.getAdvancedAttrPane().populate(jdbcDatabase);
}
- if (isSelfDefine()) {
- String[] split = driverLoader.split("\\(");
- if (split.length > 1) {
- String name = split[1];
- if (name.length() > 0) {
- jdbcDatabase.setDriverSource(name.substring(0, name.length() - 1));
- } else {
- jdbcDatabase.setDriverSource(StringUtils.EMPTY);
+ };
+
+ ActionListener driverListener = new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ if (driverComboBox.getSelectedItem() == null || ComparatorUtils.equals(driverComboBox.getSelectedItem(), StringUtils.EMPTY)) {
+ return;
+ }
+ odbcTipsLink.setVisible(ComparatorUtils.equals("sun.jdbc.odbc.JdbcOdbcDriver", driverComboBox.getSelectedItem())); // 选择的如果是ODBC就显示提示
+ Iterator> jdbc = jdbcMap.entrySet().iterator();
+ while (jdbc.hasNext()) {
+ Entry entry = jdbc.next();
+ DriverURLName[] dus = entry.getValue();
+ for (int i = 0, len = dus.length; i < len; i++) {
+ if (ComparatorUtils.equals(dus[i].getDriver(), (driverComboBox.getSelectedItem()))) {
+ urlTextField.setText(dus[i].getURL());
+ return;
+ }
}
- } else {
- jdbcDatabase.setDriverSource(StringUtils.EMPTY);
}
- jdbcDatabase.setDriver(split[0]);
- } else {
- Object driveItem = this.driverComboBox.getSelectedItem();
- jdbcDatabase.setDriver(driveItem == null ? null : driveItem.toString().trim());
- jdbcDatabase.setDriverSource(StringUtils.EMPTY);
}
- return jdbcDatabase;
- }
+
+ };
+
+ ActionListener dbtypeButtonActionListener = new ActionListener() {
+ public void actionPerformed(ActionEvent evt) {
+ if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) {
+ return;
+ }
+ DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem());
+ for (int i = 0, len = dus.length; i < len; i++) {
+ if (ComparatorUtils.equals(driverComboBox.getSelectedItem(), (dus[i].getDriver()))) {
+ urlTextField.setText(dus[i].getURL());
+ if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), ("Access"))) {
+ // ben:这个能不能换种处理方案- -
+ JFileChooser filechooser = new JFileChooser();
+ filechooser.setDialogTitle(Toolkit.i18nText("Fine-Design_Basic_Open"));
+ filechooser.setMultiSelectionEnabled(false);
+ filechooser.addChoosableFileFilter(new ChooseFileFilter(new String[]{"accdb", "mdb"}, "Microsoft Office Access"));
+ int result = filechooser.showOpenDialog(DesignerContext.getDesignerFrame());
+ File selectedfile = null;
+
+ if (result == JFileChooser.APPROVE_OPTION) {
+ selectedfile = filechooser.getSelectedFile();
+ if (selectedfile != null) {
+ String selectedName = selectedfile.getPath().substring(selectedfile.getPath().lastIndexOf('.') + 1);
+ if (selectedName.equalsIgnoreCase("mdb") || selectedName.equalsIgnoreCase("accdb")) {
+ urlTextField.setText(urlTextField.getText() + selectedfile.getPath());
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ };
+
+ InputMethodListener portInputMethodListener = new InputMethodListener() {
+ @Override
+ public void inputMethodTextChanged(InputMethodEvent event) {
+ if (null == event.getText()) {
+ return;
+ }
+ char ch = event.getText().current();
+ if (!(ch >= '0' && ch <= '9')) {
+ event.consume();
+ }
+ }
+
+ @Override
+ public void caretPositionChanged(InputMethodEvent event) {
+
+ }
+ };
+
+ DocumentListener updateParaListener = new DocumentListener() {
+ @Override
+ public void insertUpdate(DocumentEvent e) {
+ updatePara();
+ }
+
+ @Override
+ public void removeUpdate(DocumentEvent e) {
+ updatePara();
+ }
+
+ @Override
+ public void changedUpdate(DocumentEvent e) {
+ updatePara();
+ }
+ };
private void updatePara() {
String dbType = dbtypeComboBox.getSelectedItem().toString();
@@ -641,6 +488,21 @@ public class JDBCDefPane extends JPanel {
this.hostTextField.getDocument().removeDocumentListener(updateURLListener);
}
+ KeyListener portKeyListener = new KeyAdapter() {
+ @Override
+ public void keyReleased(KeyEvent e) {
+ String port = portTextField.getText();
+ if (isPortValid(port)) {
+ updateURL();
+ } else {
+ portTextField.setText(port.replaceAll(getCharNeedReplace(e.getKeyChar()), ""));
+ if (!isPortValid(portTextField.getText())) {
+ portTextField.setText(StringUtils.EMPTY);
+ updateURL();
+ }
+ }
+ }
+ };
private boolean isPortValid(String port) {
return PORT.matcher(port).find();
diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/CopyableJTable.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/CopyableJTable.java
index 7baf51ddd..eb8d188a1 100644
--- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/CopyableJTable.java
+++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/CopyableJTable.java
@@ -48,9 +48,17 @@ public class CopyableJTable extends SortableJTable {
boolean mouseDrag = false;
boolean headerSelect = false;
- DefaultTableCellRenderer tableHeaderCellRenderer = new DefaultTableCellRenderer() {
+
+ class CopyableTableHeaderCellRenderer implements TableCellRenderer {
+ TableCellRenderer tableCellRenderer;
+
+ CopyableTableHeaderCellRenderer(TableCellRenderer tableCellRenderer) {
+ this.tableCellRenderer = tableCellRenderer;
+ }
+
+ @Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
- JComponent comp = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+ JComponent comp = (JComponent) this.tableCellRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (isChoose(row, column)) {
comp.setBackground(selectBackGround);
} else {
@@ -58,13 +66,13 @@ public class CopyableJTable extends SortableJTable {
}
return comp;
}
- };
+ }
public CopyableJTable(TableSorter tableModel) {
super(tableModel);
initListener();
- this.getTableHeader().setDefaultRenderer(tableHeaderCellRenderer);
+ this.getTableHeader().setDefaultRenderer(new CopyableTableHeaderCellRenderer(this.getTableHeader().getDefaultRenderer()));
}
private void initListener() {
diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java
index 8b8099ab4..453e4bc94 100644
--- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java
+++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java
@@ -19,7 +19,6 @@ import com.fr.design.data.datapane.preview.PreviewTablePane;
import com.fr.design.data.datapane.preview.sql.PreviewPerformedSqlPane;
import com.fr.design.data.datapane.sqlpane.SQLEditPane;
import com.fr.design.data.tabledata.strategy.StrategyConfigHandler;
-import com.fr.design.data.tabledata.tabledatapane.db.DBTableDataSavedHook;
import com.fr.design.data.tabledata.tabledatapane.db.StrategyConfigFrom;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.BasicPane;
@@ -45,6 +44,7 @@ import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.esd.core.strategy.config.StrategyConfig;
import com.fr.esd.core.strategy.config.StrategyConfigHelper;
import com.fr.esd.core.strategy.config.service.StrategyConfigService;
+import com.fr.esd.data.db.DBTableDataSavedHook;
import com.fr.esd.event.DSMapping;
import com.fr.esd.event.DsNameTarget;
import com.fr.esd.event.StrategyEventsNotifier;
diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/db/DBTableDataSavedHook.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/db/DBTableDataSavedHook.java
deleted file mode 100644
index 8d9a51249..000000000
--- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/db/DBTableDataSavedHook.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.fr.design.data.tabledata.tabledatapane.db;
-
-import com.fr.data.impl.DBTableData;
-import com.fr.esd.event.DSMapping;
-import com.fr.esd.event.DsNameTarget;
-import com.fr.esd.event.StrategyEventsNotifier;
-import com.fr.esd.event.xml.XMLSavedHook;
-import com.fr.stable.StringUtils;
-
-public class DBTableDataSavedHook implements XMLSavedHook {
-
- private static final long serialVersionUID = 4925391747683335372L;
-
- private final String tplPath;
- private String origName;
-
- private String origConnection;
-
- private String origQuery;
-
- public DBTableDataSavedHook(String tplPath, DBTableData origDBTableData) {
- this.tplPath = tplPath;
- this.origName = origDBTableData.getDsName();
- this.origConnection = origDBTableData.getDatabase().toString();
- this.origQuery = origDBTableData.getQuery();
- }
-
- @Override
- public void doAfterSaved(DBTableData saved) {
- String dsName = saved.getDsName();
- String conn = saved.getDatabase().toString();
- String query = saved.getQuery();
-
-
- //检查数据集名称、数据链接和sql是否修改,如果修改需要触发缓存监听事件
- if (!dsName.equals(origName) || !conn.equals(origConnection) || !query.equals(origQuery)) {
- if (StringUtils.isNotEmpty(tplPath) && StringUtils.isNotEmpty(origName)) {
- //新建数据集的origName为null,不用触发
- StrategyEventsNotifier.modifyDataSet(new DSMapping(tplPath, new DsNameTarget(origName)));
- }
- }
-
- this.origName = dsName;
- this.origConnection = conn;
- this.origQuery = query;
- }
-}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceInfoContext.java b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceInfoContext.java
new file mode 100644
index 000000000..ba8a5b09f
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceInfoContext.java
@@ -0,0 +1,20 @@
+package com.fr.design.env;
+
+/**
+ *
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2021/8/24
+ */
+public class DesignerWorkspaceInfoContext {
+
+ private static DesignerWorkspaceInfo workspaceInfo;
+
+ public static DesignerWorkspaceInfo getWorkspaceInfo() {
+ return workspaceInfo;
+ }
+
+ public static void setWorkspaceInfo(DesignerWorkspaceInfo workspaceInfo) {
+ DesignerWorkspaceInfoContext.workspaceInfo = workspaceInfo;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/env/LocalDesignerWorkspaceInfo.java b/designer-base/src/main/java/com/fr/design/env/LocalDesignerWorkspaceInfo.java
index ef1f420d6..a7d6eb6c1 100644
--- a/designer-base/src/main/java/com/fr/design/env/LocalDesignerWorkspaceInfo.java
+++ b/designer-base/src/main/java/com/fr/design/env/LocalDesignerWorkspaceInfo.java
@@ -1,18 +1,38 @@
package com.fr.design.env;
import com.fr.general.ComparatorUtils;
+import com.fr.general.GeneralUtils;
+import com.fr.locale.InterProviderFactory;
+import com.fr.stable.CoreConstants;
+import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
+import com.fr.stable.project.ProjectConstants;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLableReader;
import com.fr.workspace.connect.WorkspaceConnectionInfo;
+import com.fr.workspace.engine.exception.MainVersionNotMatchException;
import java.io.File;
+import java.util.Properties;
/**
* Created by juhaoyu on 2018/6/15.
*/
public class LocalDesignerWorkspaceInfo implements DesignerWorkspaceInfo {
-
+
+ private static final String REPORT_ENGINE_KEY = "report-engine-key";
+ private static final String REPORT_ENGINE_JAR;
+ private static final String PROP_PATH = "/com/fr/env/jarVersion.properties";
+
+ static {
+ Properties properties = new Properties();
+ try {
+ properties.load(LocalDesignerWorkspaceInfo.class.getResourceAsStream(PROP_PATH));
+ } catch (Exception ignored) {
+ }
+ REPORT_ENGINE_JAR = properties.getProperty(REPORT_ENGINE_KEY, "default.jar");
+ }
+
private String name;
private String path;
@@ -86,6 +106,14 @@ public class LocalDesignerWorkspaceInfo implements DesignerWorkspaceInfo {
return false;
}
+ File engineLib = new File(StableUtils.pathJoin(this.path, ProjectConstants.LIB_NAME, REPORT_ENGINE_JAR));
+ // 非安装版本允许自由切换
+ boolean notExistLib = !CoreConstants.DOT.equals(StableUtils.getInstallHome())
+ && !engineLib.exists();
+ if (notExistLib) {
+ throw new MainVersionNotMatchException();
+ }
+
return true;
}
}
diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java
index f3c85f6fb..363eb1ab0 100644
--- a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java
+++ b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java
@@ -93,7 +93,7 @@ public class TemplateTreePane extends JPanel implements FileOperations {
@Override
public void mousePressed(MouseEvent evt) {
- if (evt.getClickCount() == 2) {
+ if (reportletsTree.getPathForLocation(evt.getX(), evt.getY()) != null && evt.getClickCount() == 2) {
openFile();
}
}
diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java
index b15b9eab9..648cb03f3 100644
--- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java
@@ -3,6 +3,7 @@ package com.fr.design.gui.controlpane;
import com.fr.design.constants.UIConstants;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.controlpane.shortcutfactory.ShortCutFactory;
+import com.fr.design.gui.ifilechooser.JavaFxNativeFileChooser;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.itoolbar.UIToolBarUI;
import com.fr.design.gui.itoolbar.UIToolbar;
@@ -277,6 +278,10 @@ public abstract class UIControlPane extends JControlPane {
this.requestFocus();
return;
}
+ if (JavaFxNativeFileChooser.isShowDialogState()) {
+ JavaFxNativeFileChooser.setShowDialogState(false);
+ return;
+ }
saveSettings();
setVisible(false);
PopupDialogSaveAction saveAction = OSSupportCenter.getAction(PopupDialogSaveAction.class);
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/JTreeAutoBuildPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/JTreeAutoBuildPane.java
index 6103e6800..83c52ac78 100644
--- a/designer-base/src/main/java/com/fr/design/gui/frpane/JTreeAutoBuildPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/JTreeAutoBuildPane.java
@@ -27,13 +27,16 @@ import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.stable.StringUtils;
-import java.awt.*;
+
+import javax.swing.JPanel;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.List;
-import javax.swing.*;
-import javax.swing.event.PopupMenuEvent;
-import javax.swing.event.PopupMenuListener;
public class JTreeAutoBuildPane extends BasicPane implements PreviewLabel.Previewable, EditOrNewLabel.Editable {
private TreeTableDataComboBox treeTableDataComboBox;
diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/UnitInputPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/UnitInputPane.java
index bab3e8851..5769fdacf 100644
--- a/designer-base/src/main/java/com/fr/design/gui/frpane/UnitInputPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/frpane/UnitInputPane.java
@@ -10,6 +10,7 @@ import com.fr.design.gui.ispinner.UIBasicSpinner;
import com.fr.design.gui.itextfield.UINumberField;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.utils.gui.GUICoreUtils;
+import com.fr.general.GeneralUtils;
import com.fr.stable.AssistUtils;
import com.fr.stable.StringUtils;
@@ -27,7 +28,8 @@ import java.math.BigDecimal;
* For input Number.
*/
public abstract class UnitInputPane extends BasicPane {
- private static final double NUM_POINT = 0.000001;
+ private static final double MAX_NUM = 3000.0D;
+ private static final double NUM_POINT = 0.000001;
private int scale = -1;
String title;
@@ -46,7 +48,7 @@ public abstract class UnitInputPane extends BasicPane {
centerPane.add(titleLabel);
// Denny:在对话框中加入JSpinner对象
- numberFieldSpinner = new UIBasicSpinner(new SpinnerNumberModel(0, 0, 999, 1));
+ numberFieldSpinner = new UIBasicSpinner(new SpinnerNumberModel(0, 0, MAX_NUM, 1));
GUICoreUtils.setColumnForSpinner(numberFieldSpinner, 24);
numberFieldSpinner.setPreferredSize(new Dimension(60, 20));
numberFieldSpinner.setMinimumSize(new Dimension(60, 20));
@@ -71,17 +73,17 @@ public abstract class UnitInputPane extends BasicPane {
public void populate(float floatValue) {
popValue = floatValue;
- numberFieldSpinner.setModel(new SpinnerNumberModel(0.00, 0.00, 999.00, 0.01));
+ numberFieldSpinner.setModel(new SpinnerNumberModel(0.00, 0.00, MAX_NUM, 0.01));
JFormattedTextField temp = GUICoreUtils.getSpinnerTextField(numberFieldSpinner);
addChangeListener(temp);
- BigDecimal de = new BigDecimal(floatValue + "");
+ BigDecimal de = new BigDecimal(GeneralUtils.objectToString(floatValue));
if (scale > 0) {
floatValue = de.setScale(scale, BigDecimal.ROUND_DOWN).floatValue();
} else {
floatValue = de.floatValue();
}
- //选中多列, 并且列宽不完全一致的话, 就不显示值了.
+ //选中多列, 并且列宽不完全一致的话, 就不显示值了.
temp.setText(AssistUtils.equals(floatValue, 0) ? StringUtils.EMPTY : Utils.convertNumberStringToString(new Float(floatValue)));
// denny:默认应该为选中,方便用户修改
@@ -99,8 +101,8 @@ public abstract class UnitInputPane extends BasicPane {
public double update() throws ValueNotChangeException {
// 值没变就不改
if (!changed) {
- throw vncExp;
- }
+ throw vncExp;
+ }
// Denny: get numberFieldSpinner 的 TextField
JFormattedTextField temp = GUICoreUtils.getSpinnerTextField(numberFieldSpinner);
@@ -108,7 +110,8 @@ public abstract class UnitInputPane extends BasicPane {
if (temp.getText().length() == 0) {
return 0;
}
- BigDecimal de = new BigDecimal(temp.getText());
+
+ BigDecimal de = new BigDecimal(GeneralUtils.objectToString(temp.getValue()));
if (scale > 0) {
return de.setScale(scale, BigDecimal.ROUND_DOWN).floatValue();
} else {
@@ -176,4 +179,4 @@ public abstract class UnitInputPane extends BasicPane {
// 鼠标按键在组件上单击时
}
};
-}
\ No newline at end of file
+}
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButton.java
index 28f583061..8171f31cb 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButton.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIColorButton.java
@@ -154,18 +154,22 @@ public class UIColorButton extends UIButton implements PopupHider, UIObserver, G
protected ColorControlWindow getColorControlWindow() {
//find parant.
if (this.popupWin == null) {
- this.popupWin = new ColorControlWindow(UIColorButton.this) {
- @Override
- protected void colorChanged() {
- UIColorButton.this.setColor(this.getColor());
- }
-
- };
+ this.popupWin = initColorControlWindow();
}
return popupWin;
}
+ protected ColorControlWindow initColorControlWindow(){
+ return new ColorControlWindow(UIColorButton.this) {
+ @Override
+ protected void colorChanged() {
+ UIColorButton.this.setColor(this.getColor());
+ }
+
+ };
+ }
+
/**
* 添加监听
*
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UINoThemeColorButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UINoThemeColorButton.java
new file mode 100644
index 000000000..da071458a
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UINoThemeColorButton.java
@@ -0,0 +1,36 @@
+package com.fr.design.gui.ibutton;
+
+import com.fr.design.gui.ipoppane.PopupHider;
+import com.fr.design.style.color.ColorControlWindow;
+
+import javax.swing.Icon;
+
+
+public class UINoThemeColorButton extends UIColorButton{
+
+ public UINoThemeColorButton(Icon icon) {
+ super(icon);
+ }
+
+ protected ColorControlWindow initColorControlWindow(){
+ return new NoThemeColorControlWindow(this);
+ }
+
+ private class NoThemeColorControlWindow extends ColorControlWindow{
+
+
+ public NoThemeColorControlWindow(PopupHider popupHider) {
+ super(popupHider);
+ }
+
+ protected boolean supportThemeColor(){
+ return false;
+ }
+
+
+ @Override
+ protected void colorChanged() {
+ UINoThemeColorButton.this.setColor(this.getColor());
+ }
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/ColorSchemeComboBox.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/ColorSchemeComboBox.java
index 044bb6518..f8816a184 100644
--- a/designer-base/src/main/java/com/fr/design/gui/icombobox/ColorSchemeComboBox.java
+++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/ColorSchemeComboBox.java
@@ -2,14 +2,18 @@ package com.fr.design.gui.icombobox;
import com.fr.base.ChartColorMatching;
import com.fr.base.ChartPreStyleConfig;
+import com.fr.base.theme.TemplateTheme;
+import com.fr.base.theme.settings.chart.ThemedChartSeriesColor;
import com.fr.cert.token.lang.Collections;
import com.fr.chart.base.ChartConstants;
+import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.i18n.Toolkit;
import com.fr.general.GeneralUtils;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JLabel;
import javax.swing.JList;
+import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
@@ -65,7 +69,21 @@ public class ColorSchemeComboBox extends UIComboBox {
Iterator names = config.names();
if (preDefined) {
- colorSchemes.put(Toolkit.i18nText("Fine-Design_Chart_Predefined"), null);
+ ColorInfo colorInfo = new ColorInfo();
+ List list = new ArrayList<>();
+ colorInfo.setColors(list);
+ TemplateTheme templateTheme = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getTemplateTheme();
+ ThemedChartSeriesColor themedChartSeriesColor = templateTheme.getChartStyle().getThemedChartSeriesColor();
+ if (themedChartSeriesColor.isCombineColor()) {
+ colorInfo.setGradient(false);
+ list.addAll(templateTheme.getColorScheme().getColors());
+ } else {
+ colorInfo.setGradient(true);
+ list.add(themedChartSeriesColor.getBeginColor());
+ list.add(themedChartSeriesColor.getEndColor());
+ }
+ colorSchemes.put(Toolkit.i18nText("Fine-Design_Chart_Follow_Theme"), colorInfo);
+
} else {
//添加默认的方案和第一个方案
String defaultName = config.getCurrentStyle();
diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBoxUI.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBoxUI.java
index f15bbc52a..d4de4e850 100644
--- a/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBoxUI.java
+++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBoxUI.java
@@ -10,12 +10,26 @@ import com.fr.stable.Constants;
import com.fr.stable.StringUtils;
import sun.swing.DefaultLookup;
-import javax.swing.*;
+import javax.swing.AbstractButton;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.ListCellRenderer;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.UIManager;
import javax.swing.plaf.ButtonUI;
import javax.swing.plaf.basic.BasicComboBoxUI;
import javax.swing.plaf.basic.BasicComboPopup;
import javax.swing.plaf.basic.ComboPopup;
-import java.awt.*;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
@@ -159,6 +173,10 @@ public class UIComboBoxUI extends BasicComboBoxUI implements MouseListener {
return new UIComboPopup(comboBox);
}
+ protected ComboPopup createHorizontalNeverUIComboPopUp() {
+ return new HorizontalNeverUIComboPopup(comboBox);
+ }
+
private void setRollover(boolean isRollover) {
if (this.isRollover != isRollover) {
this.isRollover = isRollover;
@@ -270,4 +288,16 @@ public class UIComboBoxUI extends BasicComboBoxUI implements MouseListener {
}
}
+
+ private class HorizontalNeverUIComboPopup extends UIComboPopup {
+
+ public HorizontalNeverUIComboPopup(JComboBox comboBox) {
+ super(comboBox);
+ }
+
+ @Override
+ protected JScrollPane createScroller() {
+ return new UIScrollPane(list, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
+ }
+ }
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIScrollPane.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIScrollPane.java
index a14c10f3c..55ba64b0e 100644
--- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIScrollPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIScrollPane.java
@@ -3,8 +3,11 @@ package com.fr.design.gui.icontainer;
import com.fr.design.constants.UIConstants;
import com.fr.design.gui.iscrollbar.UIScrollBar;
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.JScrollBar;
+import javax.swing.JScrollPane;
+import javax.swing.ScrollPaneConstants;
+import java.awt.Color;
+import java.awt.Component;
/**
* @author zhou
@@ -16,7 +19,11 @@ public class UIScrollPane extends JScrollPane {
private static final int INCREAMENT = 30;
public UIScrollPane(Component c) {
- super(c, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+ this(c, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+ }
+
+ public UIScrollPane(Component c, int vertical, int horizontal) {
+ super(c, vertical, horizontal);
this.setHorizontalScrollBar(createHorizontalScrollBar());
this.getVerticalScrollBar().setUnitIncrement(INCREAMENT);
this.getVerticalScrollBar().setBlockIncrement(INCREAMENT);
diff --git a/designer-base/src/main/java/com/fr/design/gui/ifilechooser/AbstractFileChooser.java b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/AbstractFileChooser.java
new file mode 100644
index 000000000..b9a70557d
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/AbstractFileChooser.java
@@ -0,0 +1,104 @@
+package com.fr.design.gui.ifilechooser;
+
+import javax.swing.filechooser.FileFilter;
+import java.awt.*;
+import java.io.File;
+
+/**
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2020/3/31
+ */
+@Deprecated
+public abstract class AbstractFileChooser {
+
+ /**
+ * 返回当前目录
+ *
+ */
+ public abstract File getCurrentDirectory();
+
+ /**
+ * 返回当前的文件选择过滤器
+ *
+ */
+ public abstract FileFilter getFileFilter();
+
+ /**
+ * 返回选择的文件
+ *
+ */
+ public abstract File getSelectedFile();
+
+ /**
+ * 多文件选择模式下 返回选择的多个文件
+ *
+ */
+ public abstract File[] getSelectedFiles();
+
+ /**
+ * 是否可以选择多个文件
+ *
+ */
+ public abstract boolean isMultiSelectionEnabled();
+
+ /**
+ * 设置当前选择的目录
+ *
+ */
+ public abstract void setCurrentDirectory(File dir);
+
+ /**
+ * 设置左上角标题
+ *
+ */
+ public abstract void setDialogTitle(String title);
+
+ /**
+ * 设置当前的文件过滤器
+ *
+ */
+ public abstract void setFileFilter(final T filter);
+
+ /**
+ * 设置文件选择器模式
+ *
+ * JFileChooser.FILES_ONLY
+ * JFileChooser.DIRECTORIES_ONLY
+ * JFileChooser.FILES_AND_DIRECTORIES
+ */
+ public abstract void setFileSelectionMode(E selectionMode);
+
+ /**
+ * 设置是否允许选择多个文件
+ *
+ */
+ public abstract void setMultiSelectionEnabled(boolean multiple);
+
+ /**
+ * 设置选择的文件 用于showSaveDialog
+ *
+ */
+ public abstract void setSelectedFile(File file);
+
+ /**
+ * 弹出文件选择器 打开文件
+ *
+ */
+ public abstract int showOpenDialog(Component parent);
+
+ /**
+ * 弹出文件选择器 保存文件
+ *
+ */
+ public abstract int showSaveDialog(Component parent);
+
+
+ /**
+ * https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4031440
+ *
+ * 设置文件名后缀 起到文件过滤的作用 形如 "*.jpg;*.jpeg"
+ *
+ */
+ public abstract void setExtensionFilter(String file);
+}
diff --git a/designer-base/src/main/java/com/fr/design/gui/ifilechooser/JavaFxNativeFileChooser.java b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/JavaFxNativeFileChooser.java
index 038212bfd..8be467810 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ifilechooser/JavaFxNativeFileChooser.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/JavaFxNativeFileChooser.java
@@ -24,6 +24,7 @@ import java.util.List;
import java.util.concurrent.CountDownLatch;
public class JavaFxNativeFileChooser implements FileChooserProvider {
+ private static boolean showDialogState = false;
private File[] selectedFiles = new File[0];
private FileSelectionMode fileSelectionMode = FileSelectionMode.FILE;
private String title = Toolkit.i18nText("Fine-Design_Basic_Open");
@@ -43,8 +44,17 @@ public class JavaFxNativeFileChooser implements FileChooserProvider {
return null;
}
+ public static boolean isShowDialogState() {
+ return showDialogState;
+ }
+
+ public static void setShowDialogState(boolean showDialogState) {
+ JavaFxNativeFileChooser.showDialogState = showDialogState;
+ }
+
@Override
public int showDialog(Component parent) {
+ setShowDialogState(true);
final CountDownLatch latch = new CountDownLatch(1);
PlatformImpl.startup(() -> {
});
diff --git a/designer-base/src/main/java/com/fr/design/gui/ifilechooser/UINativeFileChooser.java b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/UINativeFileChooser.java
new file mode 100644
index 000000000..025edcf08
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/UINativeFileChooser.java
@@ -0,0 +1,155 @@
+package com.fr.design.gui.ifilechooser;
+
+import com.fr.design.gui.ifilechooser.AbstractFileChooser;
+import com.fr.design.mainframe.DesignerContext;
+import com.fr.stable.os.OperatingSystem;
+
+import javax.swing.*;
+import javax.swing.filechooser.FileFilter;
+import java.awt.*;
+import java.io.File;
+import java.io.FilenameFilter;
+
+
+/**
+ * 系统原生风格的文件选择器
+ *
+ * jdk问题:
+ * https://bugs.openjdk.java.net/browse/JDK-4811090 不支持文件扩展选择
+ * https://stackoverflow.com/questions/40713398/filter-not-working-in-filedialog windows下 setFilenameFilter不work
+ *
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2020/3/31
+ */
+@Deprecated
+public class UINativeFileChooser extends AbstractFileChooser {
+
+ private final FileDialog fileDialog;
+ private FileFilter fileFilter;
+ private int selectionMode;
+
+ public UINativeFileChooser(File file) {
+ fileDialog = new FileDialog(DesignerContext.getDesignerFrame());
+ if (file != null) {
+ fileDialog.setDirectory(file.getAbsolutePath());
+ fileDialog.setFile(file.toString());
+ }
+ }
+
+ public UINativeFileChooser() {
+ this(null);
+ }
+
+ @Override
+ public File getCurrentDirectory() {
+ return new File(fileDialog.getDirectory());
+ }
+
+ @Override
+ public FileFilter getFileFilter() {
+ return fileFilter;
+ }
+
+ @Override
+ public File getSelectedFile() {
+ return new File(fileDialog.getDirectory() + fileDialog.getFile());
+ }
+
+ @Override
+ public File[] getSelectedFiles() {
+ return fileDialog.getFiles();
+ }
+
+ @Override
+ public boolean isMultiSelectionEnabled() {
+ return fileDialog.isMultipleMode();
+ }
+
+ @Override
+ public void setCurrentDirectory(File f) {
+ fileDialog.setDirectory(f.toString());
+ }
+
+ @Override
+ public void setDialogTitle(String title) {
+ fileDialog.setTitle(title);
+ }
+
+ @Override
+ public void setFileFilter(final FileFilter cff) {
+ FilenameFilter filter = new FilenameFilter() {
+ @Override
+ public boolean accept(File Directory, String fileName) {
+ return cff.accept(new File(Directory.getAbsolutePath() + fileName));
+ }
+ };
+ fileDialog.setFilenameFilter(filter);
+ fileFilter = cff;
+ }
+
+ @Override
+ public void setFileSelectionMode(Integer selectionMode) {
+ this.selectionMode = selectionMode;
+ }
+
+ @Override
+ public void setMultiSelectionEnabled(boolean multiple) {
+ fileDialog.setMultipleMode(multiple);
+ }
+
+ @Override
+ public void setSelectedFile(File file) {
+ fileDialog.setDirectory(file.getAbsolutePath());
+ fileDialog.setFile(file.getName());
+ }
+
+ @Override
+ public int showOpenDialog(Component parent) {
+ boolean appleProperty = OperatingSystem.isMacos() && selectionMode == JFileChooser.DIRECTORIES_ONLY;
+ if (appleProperty) {
+ System.setProperty("apple.awt.fileDialogForDirectories", "true");
+ }
+ try {
+ fileDialog.setLocale(JComponent.getDefaultLocale());
+ fileDialog.setMode(FileDialog.LOAD);
+ fileDialog.setVisible(true);
+ return fileDialog.getFile() == null ? JFileChooser.CANCEL_OPTION : JFileChooser.APPROVE_OPTION;
+ } finally {
+ if (appleProperty) {
+ System.setProperty("apple.awt.fileDialogForDirectories", "false");
+ }
+ }
+ }
+
+ @Override
+ public int showSaveDialog(Component parent) {
+ fileDialog.setLocale(JComponent.getDefaultLocale());
+ fileDialog.setMode(FileDialog.SAVE);
+ fileDialog.setVisible(true);
+ return fileDialog.getFile() == null ? JFileChooser.CANCEL_OPTION : JFileChooser.APPROVE_OPTION;
+ }
+
+ @Override
+ public void setExtensionFilter(String file) {
+ fileDialog.setFile(file);
+ }
+
+ /**
+ * 确认本地文件选择器是否支持选择模式
+ * @param selectionMode 选择模式
+ * @return 是否支持选择模式
+ */
+ public static boolean supportsSelectionMode(int selectionMode) {
+ switch (selectionMode) {
+ case JFileChooser.FILES_AND_DIRECTORIES:
+ return false;
+ case JFileChooser.DIRECTORIES_ONLY:
+ return OperatingSystem.isMacos();
+ case JFileChooser.FILES_ONLY:
+ default:
+ return true;
+ }
+ }
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/gui/style/AbstractBorderPackerPane.java b/designer-base/src/main/java/com/fr/design/gui/style/AbstractBorderPackerPane.java
new file mode 100644
index 000000000..4356f133a
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/gui/style/AbstractBorderPackerPane.java
@@ -0,0 +1,20 @@
+package com.fr.design.gui.style;
+
+import com.fr.design.dialog.BasicPane;
+import com.fr.general.act.BorderPacker;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/11
+ */
+public abstract class AbstractBorderPackerPane extends BasicPane {
+
+ public abstract void populateBean(BorderPacker style);
+ public abstract void updateBean(BorderPacker style);
+
+ @Override
+ protected String title4PopupWindow() {
+ return null;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/gui/style/AbstractTranslucentBackgroundSpecialPane.java b/designer-base/src/main/java/com/fr/design/gui/style/AbstractTranslucentBackgroundSpecialPane.java
new file mode 100644
index 000000000..fe6318ad3
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/gui/style/AbstractTranslucentBackgroundSpecialPane.java
@@ -0,0 +1,99 @@
+package com.fr.design.gui.style;
+
+import com.fr.design.designer.IntervalConstants;
+import com.fr.design.dialog.BasicPane;
+import com.fr.design.dialog.BasicScrollPane;
+import com.fr.design.gui.frpane.UIPercentDragPane;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.layout.TableLayout;
+import com.fr.design.layout.TableLayoutHelper;
+import com.fr.design.mainframe.backgroundpane.GradientBackgroundQuickPane;
+import com.fr.general.Background;
+import com.fr.general.act.BackgroundPacker;
+
+import javax.swing.BorderFactory;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.BorderLayout;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/11
+ */
+public abstract class AbstractTranslucentBackgroundSpecialPane extends BasicPane {
+
+ private final int uiLabelWidth;
+ private final int uiSettingWidth;
+ // 背景名称:如主题背景 或 标题背景
+ private final String backgroundName;
+ // 背景
+ protected BackgroundSpecialPane backgroundPane = new LayoutBackgroundSpecialPane();
+ // 背景透明度
+ protected UIPercentDragPane opacityPane = new UIPercentDragPane();
+
+ public AbstractTranslucentBackgroundSpecialPane(int uiLabelWidth, int uiSettingWidth, String backgroundName) {
+ this.uiLabelWidth = uiLabelWidth;
+ this.uiSettingWidth = uiSettingWidth;
+ this.backgroundName = backgroundName;
+ this.initializePane();
+ }
+
+ private void initializePane() {
+ setLayout(new BorderLayout(0, 0));
+
+ double p = TableLayout.PREFERRED;
+ double f = TableLayout.FILL;
+ double[] columnSize = {this.uiLabelWidth, this.uiSettingWidth > 0 ? this.uiSettingWidth : f};
+
+ // 确保BackgroundSpecialPane高度变化时,Label依然保持与其顶部对齐
+ JPanel backgroundLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ backgroundLabelPane.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, 0, 0));
+ backgroundLabelPane.add(new UILabel(backgroundName), BorderLayout.NORTH);
+
+ JPanel backgroundComposedPane = TableLayoutHelper.createGapTableLayoutPane(
+ new JComponent[][]{
+ {backgroundLabelPane, backgroundPane}
+ },
+ new double[]{p}, columnSize, IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L1);
+
+ JPanel opacityComposedPane = TableLayoutHelper.createGapTableLayoutPane(
+ new JComponent[][]{
+ {new UILabel(""), new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget-Style_Alpha"))},
+ {new UILabel(""), opacityPane}
+ },
+ new double[]{p, p}, columnSize, IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L1);
+ opacityComposedPane.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, 0, 0));
+ opacityComposedPane.setVisible(false);
+
+ backgroundPane.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ Background background = backgroundPane.update();
+ opacityComposedPane.setVisible(background != null);
+ }
+ });
+
+ add(backgroundComposedPane, BorderLayout.NORTH, 0);
+ add(opacityComposedPane, BorderLayout.CENTER, 1);
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return null;
+ }
+
+ public abstract void populateBean(T style);
+
+ public abstract void updateBean(T style);
+
+ protected static class LayoutBackgroundSpecialPane extends BackgroundSpecialPane {
+ @Override
+ protected GradientBackgroundQuickPane createGradientBackgroundQuickPane() {
+ return new GradientBackgroundQuickPane(140);
+ }
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/gui/style/BorderPane.java b/designer-base/src/main/java/com/fr/design/gui/style/BorderPane.java
index 9f948e7a1..2e04b6ce5 100644
--- a/designer-base/src/main/java/com/fr/design/gui/style/BorderPane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/style/BorderPane.java
@@ -95,8 +95,14 @@ public class BorderPane extends AbstractBasicStylePane implements GlobalNameObse
borderPanel = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Border"), 280, 24, panel);
this.add(borderPanel, BorderLayout.NORTH);
+ UILabel backgroundFillLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Background_Fill"));
+ backgroundFillLabel.setPreferredSize(new Dimension(60, 20));
+
backgroundPane = new BackgroundPane();
- backgroundPanel = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Background"), 280, 24, backgroundPane);
+ JPanel backgroundContainPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{backgroundFillLabel, backgroundPane}},
+ TableLayoutHelper.FILL_LASTCOLUMN, LayoutConstants.VGAP_SMALL, LayoutConstants.VGAP_MEDIUM);
+
+ backgroundPanel = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Background"), 280, 24, backgroundContainPane);
this.add(backgroundPanel, BorderLayout.CENTER);
initAllNames();
outerToggleButton.addChangeListener(outerToggleButtonChangeListener);
diff --git a/designer-base/src/main/java/com/fr/design/gui/style/ComponentBodyStylePane.java b/designer-base/src/main/java/com/fr/design/gui/style/ComponentBodyStylePane.java
new file mode 100644
index 000000000..8463ed6f5
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/gui/style/ComponentBodyStylePane.java
@@ -0,0 +1,33 @@
+package com.fr.design.gui.style;
+
+import com.fr.general.act.BorderPacker;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/11
+ */
+public class ComponentBodyStylePane extends AbstractTranslucentBackgroundSpecialPane {
+
+ public ComponentBodyStylePane(int uiLabelWidth) {
+ this(uiLabelWidth, -1);
+ }
+
+ public ComponentBodyStylePane(int uiLabelWidth, int uiSettingWidth) {
+ super(uiLabelWidth, uiSettingWidth, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget-Style_Body_Fill"));
+ }
+
+ @Override
+ public void populateBean(BorderPacker style) {
+ this.backgroundPane.populateBean(style.getBackground());
+ if (this.opacityPane != null) {
+ this.opacityPane.populateBean(style.getAlpha());
+ }
+ }
+
+ @Override
+ public void updateBean(BorderPacker style) {
+ style.setBackground(backgroundPane.update());
+ style.setAlpha((float)opacityPane.updateBean());
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/gui/style/ComponentIntegralStylePane.java b/designer-base/src/main/java/com/fr/design/gui/style/ComponentIntegralStylePane.java
new file mode 100644
index 000000000..ef47a148b
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/gui/style/ComponentIntegralStylePane.java
@@ -0,0 +1,109 @@
+package com.fr.design.gui.style;
+
+import com.fr.design.designer.IntervalConstants;
+import com.fr.design.gui.icombobox.UIComboBox;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.gui.ispinner.UISpinner;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.layout.TableLayout;
+import com.fr.design.layout.TableLayoutHelper;
+import com.fr.general.act.BorderPacker;
+
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/11
+ */
+public class ComponentIntegralStylePane extends AbstractBorderPackerPane {
+ public static final String[] BORDER_STYLE = new String[]{
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Common"),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Shadow")
+ };
+
+ //渲染风格:有无阴影
+ protected UIComboBox borderStyleCombo;
+ // 含图片类型边框的边框配置面板(图片类型边框 + 阴影时存在默认的阴影颜色)
+ protected TranslucentBorderSpecialPane borderPane;
+ //边框圆角或圆角裁剪
+ protected UISpinner cornerSpinner;
+
+ private final int uiLabelWidth;
+ private final int uiSettingWidth;
+ private final boolean supportBorderImage;
+ private final boolean supportCornerRadius;
+
+ public ComponentIntegralStylePane(int uiLabelWidth,
+ boolean supportBorderImage, boolean supportCornerRadius) {
+ this(uiLabelWidth, -1, supportBorderImage, supportCornerRadius);
+ }
+
+ public ComponentIntegralStylePane(int uiLabelWidth, int uiSettingWidth) {
+ this(uiLabelWidth, uiSettingWidth, true, true);
+ }
+
+ public ComponentIntegralStylePane(
+ int uiLabelWidth, int uiSettingWidth,
+ boolean supportBorderImage, boolean supportCornerRadius) {
+ this.uiLabelWidth = uiLabelWidth;
+ this.uiSettingWidth = uiSettingWidth;
+ this.supportBorderImage = supportBorderImage;
+ this.supportCornerRadius = supportCornerRadius;
+
+ this.initializePane();
+ }
+
+ private void initializeComponents() {
+ borderStyleCombo = new UIComboBox(BORDER_STYLE);
+ borderPane = new TranslucentBorderSpecialPane(this.supportBorderImage);
+ cornerSpinner = new UISpinner(0,1000,1,0);
+ }
+
+ protected void initializePane() {
+ setLayout(FRGUIPaneFactory.createBorderLayout());
+ this.initializeComponents();
+
+ double p = TableLayout.PREFERRED;
+ double f = TableLayout.FILL;
+ double[] rowSize = supportCornerRadius ? new double[] {p, p, p} : new double[]{p, p};
+ double[] columnSize = {this.uiLabelWidth, this.uiSettingWidth > 0 ? this.uiSettingWidth : f};
+
+ JPanel content = TableLayoutHelper.createGapTableLayoutPane(new JComponent[][]{
+ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Render_Style")), borderStyleCombo},
+ {this.borderPane, null},
+ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Radius")), cornerSpinner},
+ },
+ rowSize, columnSize, IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L1);
+
+ this.add(content, BorderLayout.NORTH);
+ }
+
+ @Override
+ public void populateBean(BorderPacker style) {
+ if (this.borderStyleCombo != null) {
+ this.borderStyleCombo.setSelectedIndex(style.getBorderStyle());
+ }
+ if (cornerSpinner != null) {
+ this.cornerSpinner.setValue(style.getBorderRadius());
+ }
+ if (this.borderPane != null) {
+ this.borderPane.populateBean(style);
+ }
+ }
+
+ @Override
+ public void updateBean(BorderPacker style) {
+ if (borderStyleCombo != null) {
+ style.setBorderStyle(borderStyleCombo.getSelectedIndex());
+ }
+ if (cornerSpinner != null) {
+ style.setBorderRadius((int) cornerSpinner.getValue());
+ }
+ if (borderPane != null) {
+ borderPane.updateBean(style);
+ }
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/gui/style/ComponentTitleStylePane.java b/designer-base/src/main/java/com/fr/design/gui/style/ComponentTitleStylePane.java
new file mode 100644
index 000000000..33420ded7
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/gui/style/ComponentTitleStylePane.java
@@ -0,0 +1,348 @@
+package com.fr.design.gui.style;
+
+import com.fr.base.Utils;
+import com.fr.base.svg.IconUtils;
+import com.fr.design.designer.IntervalConstants;
+import com.fr.design.formula.TinyFormulaPane;
+import com.fr.design.gui.ibutton.UIButtonGroup;
+import com.fr.design.gui.ibutton.UIColorButton;
+import com.fr.design.gui.ibutton.UIToggleButton;
+import com.fr.design.gui.icheckbox.UICheckBox;
+import com.fr.design.gui.icombobox.UIComboBox;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.layout.TableLayout;
+import com.fr.design.layout.TableLayoutHelper;
+import com.fr.form.ui.LayoutBorderStyle;
+import com.fr.form.ui.WidgetTitle;
+import com.fr.general.FRFont;
+import com.fr.general.IOUtils;
+import com.fr.general.act.BorderPacker;
+import com.fr.general.act.TitlePacker;
+import com.fr.stable.Constants;
+
+import javax.swing.BorderFactory;
+import javax.swing.Icon;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Font;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/11
+ */
+public class ComponentTitleStylePane extends AbstractBorderPackerPane {
+ private static final Dimension BUTTON_SIZE = new Dimension(20, 20);
+ public static final TitlePacker DEFAULT_TITLE_PACKER = new WidgetTitle();
+
+ // 标题可见
+ protected UICheckBox visibleCheckbox;
+ //标题文字内容
+ protected TinyFormulaPane textContentPane;
+ //标题字体格式
+ protected UIComboBox fontFamilyComboBox;
+ //标题字体大小
+ protected UIComboBox fontSizeComboBox;
+ //标题字体颜色
+ protected UIColorButton fontColorSelectPane;
+ //标题字体特殊效果:粗体、斜体、下划线
+ private UIToggleButton fontBoldButton;
+ private UIToggleButton fontItalicButton;
+ private UIToggleButton fontUnderlineButton;
+ // 标题图文混排
+ protected TextInsetImageBackgroundSpecialPane insetImagePane;
+ //对齐方式
+ protected UIButtonGroup alignPane;
+ //标题整体背景
+ protected TitleTranslucentBackgroundSpecialPane backgroundPane;
+
+ // 是否支持用户编辑这些属性(不支持时: 设置面板总是不可见)
+ private boolean isSupportTitleVisible = true;
+ private boolean isSupportTitleContent = true;
+ private boolean isSupportTitleOtherSetting = true;
+
+ // 用于控制各部分设置的可见性
+ private JPanel titleVisiblePane;
+ private JPanel titleContentPane;
+ private JPanel titleOtherSettingPane;
+
+ private final int uiLabelWidth;
+ private final int uiSettingWidth;
+
+ public ComponentTitleStylePane(int uiLabelWidth) {
+ this(uiLabelWidth, -1);
+ }
+
+ public ComponentTitleStylePane(
+ int uiLabelWidth, int uiSettingWidth) {
+ this.uiLabelWidth = uiLabelWidth;
+ this.uiSettingWidth = uiSettingWidth;
+ this.initializePane();
+ }
+
+ private void initializeComponents() {
+ visibleCheckbox = new UICheckBox();
+
+ textContentPane = new TinyFormulaPane();
+
+ fontFamilyComboBox = new UIComboBox(Utils.getAvailableFontFamilyNames4Report());
+ FRFont frFont = DEFAULT_TITLE_PACKER.getFrFont();
+ if (frFont != null) {
+ String fontFamily = frFont.getFamily();
+ // 使用style中默认的字体初始化titleFontFamilyComboBox,保证UI和数据的一致性
+ this.fontFamilyComboBox.setSelectedItem(fontFamily);
+ }
+ fontFamilyComboBox.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Family"));
+
+ fontSizeComboBox = new UIComboBox(FRFontPane.FONT_SIZES);
+ fontSizeComboBox.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Size"));
+
+ fontColorSelectPane = new UIColorButton();
+ fontColorSelectPane.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Foreground"));
+ fontColorSelectPane.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Foreground"));
+
+ fontBoldButton = new UIToggleButton(IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold.png"));
+ fontBoldButton.setPreferredSize(BUTTON_SIZE);
+ fontBoldButton.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Bold"));
+ fontBoldButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Bold"));
+
+ fontItalicButton = new UIToggleButton(IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic.png"));
+ fontItalicButton.setPreferredSize(BUTTON_SIZE);
+ fontItalicButton.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Italic"));
+ fontItalicButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Italic"));
+
+ fontUnderlineButton = new UIToggleButton(IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/underline.png"));
+ fontUnderlineButton.setPreferredSize(BUTTON_SIZE);
+ fontUnderlineButton.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Underline"));
+ fontUnderlineButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Underline"));
+
+ insetImagePane = new TextInsetImageBackgroundSpecialPane();
+
+ alignPane = new UIButtonGroup<>(
+ new Icon[]{
+ IconUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"),
+ IconUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"),
+ IconUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png")
+ },
+ new Integer[]{Constants.LEFT, Constants.CENTER, Constants.RIGHT});
+ alignPane.setAllToolTips(
+ new String[] {
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_StyleAlignment_Left"),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_StyleAlignment_Center"),
+ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_StyleAlignment_Right")
+ });
+ alignPane.setSelectedItem(DEFAULT_TITLE_PACKER.getPosition());
+
+ backgroundPane = new TitleTranslucentBackgroundSpecialPane(this.uiLabelWidth, this.uiSettingWidth);
+ }
+
+ private void initializePane() {
+ this.setLayout(new BorderLayout(0, 0));
+ this.initializeComponents();
+
+ titleVisiblePane = this.createTitleVisiblePane();
+ titleContentPane = this.createTitleContentPane();
+ titleOtherSettingPane = this.createTitleOtherSettingPane();
+
+ if (isSupportTitleVisible) {
+ titleVisiblePane.setVisible(true);
+ }
+ if (isSupportTitleVisible) {
+ titleContentPane.setVisible(false);
+ }
+ if (isSupportTitleVisible) {
+ titleOtherSettingPane.setVisible(false);
+ }
+
+ addComponents(titleVisiblePane, titleContentPane, titleOtherSettingPane);
+ }
+
+ private JPanel createTitleVisiblePane() {
+ JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
+
+ visibleCheckbox.setSelected(false);
+
+ container.add(visibleCheckbox, BorderLayout.WEST);
+ container.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Title_Visible")), BorderLayout.CENTER);
+
+ visibleCheckbox.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ boolean visible = visibleCheckbox.isSelected();
+ if (titleContentPane != null) {
+ titleContentPane.setVisible(visible && isSupportTitleContent);
+ }
+ if (titleOtherSettingPane != null) {
+ titleOtherSettingPane.setVisible(visible && isSupportTitleOtherSetting);
+ }
+ }
+ });
+ return container;
+ }
+
+ private JPanel createTitleContentPane() {
+ double p = TableLayout.PREFERRED;
+ double f = TableLayout.FILL;
+ double[] rowSize = {p};
+ double[] columnSize = {this.uiLabelWidth, this.uiSettingWidth > 0 ? this.uiSettingWidth : f};
+
+ return TableLayoutHelper.createCommonTableLayoutPane(
+ new JComponent[][]{{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Title_Content")), textContentPane}},
+ rowSize, columnSize, IntervalConstants.INTERVAL_L1);
+ }
+
+ private JPanel createTitleOtherSettingPane() {
+ double p = TableLayout.PREFERRED;
+ double f = TableLayout.FILL;
+ double[] rowSize = {p, p, p, p, p};
+ double[] columnSize = {this.uiLabelWidth, this.uiSettingWidth > 0 ? this.uiSettingWidth : f};
+
+ JComponent[][] components = new JComponent[][]{
+ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Title_Format")), fontFamilyComboBox},
+ {null, createTitleFontButtonPane()},
+ {insetImagePane, null},
+ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Title_Text_Align")), alignPane},
+ {backgroundPane, null}
+ };
+
+ return TableLayoutHelper.createCommonTableLayoutPane(components, rowSize, columnSize, IntervalConstants.INTERVAL_L1);
+ }
+
+ protected JPanel createTitleFontButtonPane(){
+ double p = TableLayout.PREFERRED;
+ double f = TableLayout.FILL;
+ double[] rowSize = {p};
+ double[] columnSize = {f, p, p, p, p};
+
+ JPanel buttonPane = TableLayoutHelper.createCommonTableLayoutPane( new JComponent[][] {
+ {fontSizeComboBox, fontColorSelectPane, fontItalicButton, fontBoldButton, fontUnderlineButton},
+ }, rowSize, columnSize, IntervalConstants.INTERVAL_W0);
+
+ JPanel containerPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ containerPane.add(buttonPane, BorderLayout.NORTH);
+
+ return containerPane;
+ }
+
+ @Override
+ public void populateBean(BorderPacker style) {
+ TitlePacker widgetTitle = style == null ? new WidgetTitle() : style.getTitle();
+ widgetTitle = widgetTitle == null ? new WidgetTitle() : widgetTitle;
+ boolean titleVisible = style != null && style.getType() != LayoutBorderStyle.STANDARD;
+ visibleCheckbox.setSelected(isSupportTitleVisible && titleVisible);
+ titleContentPane.setVisible(isSupportTitleContent && titleVisible);
+ titleOtherSettingPane.setVisible(isSupportTitleOtherSetting && titleVisible);
+
+ this.textContentPane.populateBean(widgetTitle.getTextObject().toString());
+
+ FRFont frFont = widgetTitle.getFrFont();
+ this.fontSizeComboBox.setSelectedItem(frFont.getSize());
+ this.fontFamilyComboBox.setSelectedItem(frFont.getFamily());
+ this.fontColorSelectPane.setColor(frFont.getForeground());
+ this.fontColorSelectPane.repaint();
+ fontBoldButton.setSelected(frFont.isBold());
+ fontItalicButton.setSelected(frFont.isItalic());
+
+ int line = frFont.getUnderline();
+ if (line == Constants.LINE_NONE) {
+ fontUnderlineButton.setSelected(false);
+ } else {
+ fontUnderlineButton.setSelected(true);
+ }
+
+ alignPane.setSelectedItem(widgetTitle.getPosition());
+ insetImagePane.populateBean(widgetTitle);
+ backgroundPane.populateBean(widgetTitle);
+ }
+
+ @Override
+ public void updateBean(BorderPacker style) {
+ style.setType(visibleCheckbox != null && visibleCheckbox.isSelected() ? LayoutBorderStyle.TITLE : LayoutBorderStyle.STANDARD);
+ TitlePacker title = style.getTitle() == null ? new WidgetTitle() : style.getTitle();
+ title.setTextObject(textContentPane.updateBean());
+ FRFont frFont = title.getFrFont();
+ frFont = frFont.applySize((Integer) fontSizeComboBox.getSelectedItem());
+ frFont = frFont.applyName(fontFamilyComboBox.getSelectedItem().toString());
+ frFont = frFont.applyForeground(fontColorSelectPane.getColor());
+ frFont = updateTitleFontItalicBold(frFont);
+ int line = fontUnderlineButton.isSelected() ? Constants.LINE_THIN : Constants.LINE_NONE;
+ frFont = frFont.applyUnderline(line);
+ title.setFrFont(frFont);
+ title.setPosition((Integer) alignPane.getSelectedItem());
+ insetImagePane.updateBean(title);
+ backgroundPane.updateBean(title);
+ style.setTitle(title);
+ }
+
+ private FRFont updateTitleFontItalicBold(FRFont frFont) {
+ int italic_bold = frFont.getStyle();
+ boolean isItalic = italic_bold == Font.ITALIC || italic_bold == (Font.BOLD + Font.ITALIC);
+ boolean isBold = italic_bold == Font.BOLD || italic_bold == (Font.BOLD + Font.ITALIC);
+ if (fontItalicButton.isSelected() && !isItalic) {
+ italic_bold += Font.ITALIC;
+ } else if (!fontItalicButton.isSelected() && isItalic) {
+ italic_bold -= Font.ITALIC;
+ }
+ frFont = frFont.applyStyle(italic_bold);
+ if (fontBoldButton.isSelected() && !isBold) {
+ italic_bold += Font.BOLD;
+ } else if (!fontBoldButton.isSelected() && isBold) {
+ italic_bold -= Font.BOLD;
+ }
+ frFont = frFont.applyStyle(italic_bold);
+ return frFont;
+ }
+
+ private void addComponents(JComponent... components) {
+ if (components == null) {
+ return;
+ }
+ JPanel container = this;
+ for (JComponent component: components) {
+ if (component != null) {
+ container.add(component, BorderLayout.NORTH);
+ JPanel nextContainer = new JPanel(FRGUIPaneFactory.createBorderLayout());
+ component.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, 0, 0));
+ container.add(nextContainer, BorderLayout.CENTER);
+ container = nextContainer;
+ }
+ }
+ }
+
+
+ public void setSupportTitleVisible(boolean supporting) {
+ isSupportTitleVisible = supporting;
+ if (titleVisiblePane != null) {
+ titleVisiblePane.setVisible(supporting);
+ }
+ }
+
+ public void setSupportTitleContent(boolean supporting) {
+ isSupportTitleContent = supporting;
+ if (titleContentPane != null) {
+ boolean titleVisible = visibleCheckbox.isSelected();
+ if (isSupportTitleContent) {
+ titleContentPane.setVisible(titleVisible);
+ } else {
+ titleContentPane.setVisible(false);
+ }
+ }
+ }
+
+ public void setSupportOtherSetting(boolean supporting) {
+ isSupportTitleOtherSetting = supporting;
+ if (titleOtherSettingPane != null) {
+ boolean titleVisible = visibleCheckbox.isSelected();
+ if (isSupportTitleOtherSetting) {
+ titleOtherSettingPane.setVisible(titleVisible);
+ } else {
+ titleOtherSettingPane.setVisible(false);
+ }
+ }
+ }
+}
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
new file mode 100644
index 000000000..55f4612a2
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/gui/style/FollowingThemePane.java
@@ -0,0 +1,138 @@
+package com.fr.design.gui.style;
+
+import com.fr.base.theme.FormTheme;
+import com.fr.base.theme.TemplateTheme;
+import com.fr.design.dialog.BasicPane;
+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.file.HistoryTemplateListCache;
+import com.fr.design.gui.ibutton.UIButtonGroup;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.layout.TableLayout;
+import com.fr.design.layout.TableLayoutHelper;
+import com.fr.design.mainframe.JTemplate;
+
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/19
+ */
+public class FollowingThemePane extends BasicPane implements UIObserver {
+ public static final int SETTING_LABEL_WIDTH = 60;
+
+ public static final String[] FOLLOWING_THEME_STRING_ARRAYS = new String[]{
+ Toolkit.i18nText("Fine-Design_Style_Follow_Theme"),
+ Toolkit.i18nText("Fine-Design_Style_Not_Follow_Theme"),
+ };
+
+ private final UIButtonGroup followingThemeButtonGroup;
+ private final List changeListeners = new ArrayList<>();
+ private UIObserverListener uiObserverListener;
+
+ private JPanel container;
+
+ public FollowingThemePane(String name) {
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
+
+ followingThemeButtonGroup = new UIButtonGroup<>(FOLLOWING_THEME_STRING_ARRAYS);
+ followingThemeButtonGroup.setSelectedIndex(1);
+ followingThemeButtonGroup.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ for (FollowingThemeActionChangeListener changeListener : changeListeners) {
+ changeListener.onFollowingTheme(isFollowingTheme());
+ }
+ invalidate();
+
+ // 与主题相关的属性面板更新完毕后,再通知外层更新数据
+ if (uiObserverListener != null) {
+ uiObserverListener.doChange();
+ }
+ }
+ });
+
+ UILabel followingThemeLabel = new UILabel(name);
+
+ double p = TableLayout.PREFERRED;
+ double f = TableLayout.FILL;
+ JPanel followingThemePane =
+ TableLayoutHelper.createGapTableLayoutPane( new Component[][]{new Component[] { followingThemeLabel, followingThemeButtonGroup}},
+ new double[] { p }, new double[] { SETTING_LABEL_WIDTH, f }, 10, 0);
+ followingThemePane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
+ followingThemePane.setVisible(false);
+
+ add(followingThemePane, BorderLayout.NORTH);
+ container = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ add(container, BorderLayout.CENTER);
+ }
+
+ public void addFollowThemePane(JPanel content, FollowingThemeActionChangeListener changeListener) {
+ if (content != null) {
+ container.add(content, BorderLayout.NORTH);
+ changeListeners.add(changeListener);
+
+ JPanel nextContainer = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ container.add(nextContainer, BorderLayout.CENTER);
+ container = nextContainer;
+ }
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return null;
+ }
+
+ @Override
+ public void registerChangeListener(UIObserverListener uiObserverListener) {
+ this.uiObserverListener = uiObserverListener;
+ }
+
+ @Override
+ public boolean shouldResponseChangeListener() {
+ return true;
+ }
+
+ public interface FollowingThemeActionChangeListener {
+ void onFollowingTheme(boolean following);
+ }
+
+ public TemplateTheme getUsingTheme() {
+ JTemplate, ?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
+ if (template != null) {
+ return template.getTemplateTheme();
+ }
+ return null;
+ }
+
+ public void supportFollowingTheme(boolean supporting) {
+ getComponent(0).setVisible(supporting);
+ if (!supporting) {
+ setFollowingTheme(false);
+ }
+ }
+
+ public void setFollowingTheme(boolean following) {
+ followingThemeButtonGroup.setSelectedIndex(following ? 0 : 1);
+ for (FollowingThemeActionChangeListener changeListener : changeListeners) {
+ changeListener.onFollowingTheme(isFollowingTheme());
+ }
+ }
+ public boolean isFollowingTheme() {
+ return followingThemeButtonGroup.getSelectedIndex() == 0;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/gui/style/ReportBackgroundSpecialPane.java b/designer-base/src/main/java/com/fr/design/gui/style/ReportBackgroundSpecialPane.java
new file mode 100644
index 000000000..aeb2938a2
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/gui/style/ReportBackgroundSpecialPane.java
@@ -0,0 +1,102 @@
+package com.fr.design.gui.style;
+
+import com.fr.design.ExtraDesignClassManager;
+import com.fr.design.event.UIObserverListener;
+import com.fr.design.fun.BackgroundQuickUIProvider;
+import com.fr.design.mainframe.backgroundpane.BackgroundQuickPane;
+import com.fr.design.mainframe.backgroundpane.ColorBackgroundQuickPane;
+import com.fr.design.mainframe.backgroundpane.GradientBackgroundQuickPane;
+import com.fr.design.mainframe.backgroundpane.ImageBackgroundQuickPane;
+import com.fr.design.mainframe.backgroundpane.NullBackgroundQuickPane;
+import com.fr.design.mainframe.backgroundpane.PatternBackgroundQuickPane;
+import com.fr.design.mainframe.backgroundpane.TextureBackgroundQuickPane;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/19
+ */
+public class ReportBackgroundSpecialPane extends BackgroundPane {
+ public ReportBackgroundSpecialPane(){
+ super();
+ }
+
+ @Override
+ protected BackgroundQuickPane[] supportKindsOfBackgroundUI() {
+ NullBackgroundQuickPane nullBackgroundPane = new NullBackgroundQuickPane();
+
+ ColorBackgroundQuickPane colorBackgroundPane = new ColorBackgroundQuickPane();
+ colorBackgroundPane.registerChangeListener(new UIObserverListener() {
+ @Override
+ public void doChange() {
+ fireStateChanged();
+ }
+ });
+
+ ImageBackgroundQuickPane imageBackgroundPane = new ImageBackgroundQuickPane();
+ imageBackgroundPane.registerChangeListener(new UIObserverListener() {
+ @Override
+ public void doChange() {
+ fireStateChanged();
+ }
+ });
+
+ GradientBackgroundQuickPane gradientBackgroundPane = createGradientBackgroundQuickPane();
+ gradientBackgroundPane.registerChangeListener(new UIObserverListener() {
+ @Override
+ public void doChange() {
+ fireStateChanged();
+ }
+ });
+
+ TextureBackgroundQuickPane textureBackgroundPane = new TextureBackgroundQuickPane();
+ textureBackgroundPane.registerChangeListener(new UIObserverListener() {
+ @Override
+ public void doChange() {
+ fireStateChanged();
+ }
+ });
+
+ PatternBackgroundQuickPane patternBackgroundPane = new PatternBackgroundQuickPane();
+ patternBackgroundPane.registerChangeListener(new UIObserverListener() {
+ @Override
+ public void doChange() {
+ fireStateChanged();
+ }
+ });
+
+
+
+ List kinds = new ArrayList();
+
+ kinds.add(nullBackgroundPane);
+ kinds.add(colorBackgroundPane);
+ kinds.add(imageBackgroundPane);
+ kinds.add(gradientBackgroundPane);
+ kinds.add(textureBackgroundPane);
+ kinds.add(patternBackgroundPane);
+
+ Set providers = ExtraDesignClassManager.getInstance().getArray(BackgroundQuickUIProvider.MARK_STRING);
+ for (BackgroundQuickUIProvider provider : providers) {
+ BackgroundQuickPane newTypePane = provider.appearanceForBackground();
+ newTypePane.registerChangeListener(new UIObserverListener() {
+ @Override
+ public void doChange() {
+ fireStateChanged();
+ }
+ });
+ kinds.add(newTypePane);
+ }
+
+ return kinds.toArray(new BackgroundQuickPane[kinds.size()]);
+ }
+
+ protected GradientBackgroundQuickPane createGradientBackgroundQuickPane() {
+ // 使用默认的150宽度构建渐变条
+ return new GradientBackgroundQuickPane();
+ }
+}
diff --git a/designer-form/src/main/java/com/fr/design/gui/xpane/TitleInsetImagePane.java b/designer-base/src/main/java/com/fr/design/gui/style/TextInsetImageBackgroundSpecialPane.java
similarity index 95%
rename from designer-form/src/main/java/com/fr/design/gui/xpane/TitleInsetImagePane.java
rename to designer-base/src/main/java/com/fr/design/gui/style/TextInsetImageBackgroundSpecialPane.java
index 3671259a2..b3556dc6f 100644
--- a/designer-form/src/main/java/com/fr/design/gui/xpane/TitleInsetImagePane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/style/TextInsetImageBackgroundSpecialPane.java
@@ -1,4 +1,4 @@
-package com.fr.design.gui.xpane;
+package com.fr.design.gui.style;
import com.fr.base.Style;
import com.fr.base.background.ImageBackground;
@@ -18,7 +18,6 @@ import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.backgroundpane.ImagePreviewPane;
import com.fr.design.style.background.image.ImageFileChooser;
-import com.fr.design.widget.ui.designer.component.UIBoundSpinner;
import com.fr.form.ui.WidgetTitle;
import com.fr.general.Background;
import com.fr.general.IOUtils;
@@ -26,11 +25,20 @@ import com.fr.general.ImageWithSuffix;
import com.fr.general.act.TitlePacker;
import com.fr.stable.Constants;
-import javax.swing.*;
+import javax.swing.Icon;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.basic.BasicButtonUI;
-import java.awt.*;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Rectangle;
+import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
@@ -42,8 +50,8 @@ import java.awt.geom.RoundRectangle2D;
* @version 10.0.18
* Created by Starryi on 2021/7/3
*/
-public class TitleInsetImagePane extends JPanel implements UIObserver {
- private final int SETTING_LABEL_WIDTH = LayoutStylePane.SETTING_LABEL_WIDTH;
+public class TextInsetImageBackgroundSpecialPane extends JPanel implements UIObserver {
+ private final int SETTING_LABEL_WIDTH = 60;
private final int DELETE_BUTTON_SIZE = 24;
private final int IMAGE_PREVIEW_SIZE = 145;
private final Color IMAGE_PREVIEW_OVERLAY_COLOR = new Color(255, 255, 255, 51);
@@ -62,7 +70,7 @@ public class TitleInsetImagePane extends JPanel implements UIObserver {
private ImageFileChooser imageFileChooser;
- public TitleInsetImagePane() {
+ public TextInsetImageBackgroundSpecialPane() {
this.initComponents();
this.initLayout();
}
@@ -198,7 +206,7 @@ public class TitleInsetImagePane extends JPanel implements UIObserver {
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Title_Inset_Relative_Right_Tooltip"),
});
- imagePaddingPane = new UIBoundSpinner(0, Integer.MAX_VALUE, 1, WidgetTitle.DEFAULT_INSET_PADDING);
+ imagePaddingPane = new UISpinner(0, Integer.MAX_VALUE, 1, WidgetTitle.DEFAULT_INSET_PADDING);
imagePaddingPane.setValue(DEFAULT_INSET_PADDING);
}
diff --git a/designer-base/src/main/java/com/fr/design/gui/style/TitleTranslucentBackgroundSpecialPane.java b/designer-base/src/main/java/com/fr/design/gui/style/TitleTranslucentBackgroundSpecialPane.java
new file mode 100644
index 000000000..db8c64e19
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/gui/style/TitleTranslucentBackgroundSpecialPane.java
@@ -0,0 +1,27 @@
+package com.fr.design.gui.style;
+
+import com.fr.general.act.TitlePacker;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/11
+ */
+public class TitleTranslucentBackgroundSpecialPane extends AbstractTranslucentBackgroundSpecialPane {
+
+ public TitleTranslucentBackgroundSpecialPane(int uiLabelWidth, int uiSettingWidth) {
+ super(uiLabelWidth, uiSettingWidth, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Title_Background"));
+ }
+
+ @Override
+ public void populateBean(TitlePacker style) {
+ backgroundPane.populateBean(style.getBackground());
+ opacityPane.populateBean(style.getBackgroundOpacity());
+ }
+
+ @Override
+ public void updateBean(TitlePacker style) {
+ style.setBackground(backgroundPane.update());
+ style.setBackgroundOpacity((float)opacityPane.updateBean());
+ }
+}
diff --git a/designer-form/src/main/java/com/fr/design/gui/xpane/BorderLineAndImagePane.java b/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java
similarity index 96%
rename from designer-form/src/main/java/com/fr/design/gui/xpane/BorderLineAndImagePane.java
rename to designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java
index 0f2b853d1..237a5659a 100644
--- a/designer-form/src/main/java/com/fr/design/gui/xpane/BorderLineAndImagePane.java
+++ b/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java
@@ -1,8 +1,6 @@
-package com.fr.design.gui.xpane;
+package com.fr.design.gui.style;
-import com.fr.base.GraphHelper;
import com.fr.base.Style;
-import com.fr.base.Utils;
import com.fr.base.background.ImageBackground;
import com.fr.base.background.ImageFileBackground;
import com.fr.design.border.UIRoundedBorder;
@@ -16,8 +14,6 @@ import com.fr.design.event.UIObserverListener;
import com.fr.design.gui.frpane.ImgChooseWrapper;
import com.fr.design.gui.frpane.UIPercentDragPane;
import com.fr.design.gui.ibutton.UIButton;
-import com.fr.design.gui.ibutton.UIButtonUI;
-import com.fr.design.gui.ibutton.UIColorButton;
import com.fr.design.gui.icombobox.LineComboBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.layout.FRGUIPaneFactory;
@@ -28,9 +24,9 @@ import com.fr.design.mainframe.backgroundpane.ImagePreviewPane;
import com.fr.design.style.background.image.ImageFileChooser;
import com.fr.design.style.color.NewColorSelectBox;
import com.fr.env.utils.DesignerInteractionHistory;
-import com.fr.form.ui.LayoutBorderStyle;
import com.fr.general.Background;
import com.fr.general.IOUtils;
+import com.fr.general.act.BorderPacker;
import com.fr.stable.Constants;
import com.fr.stable.GraphDrawHelper;
import com.fr.stable.ProjectLibrary;
@@ -78,8 +74,8 @@ import java.util.Arrays;
*
* 可配置图片类型边框的样式设置面板
*/
-public class BorderLineAndImagePane extends JPanel implements UIObserver {
- private final int SETTING_LABEL_WIDTH = LayoutStylePane.SETTING_LABEL_WIDTH;
+public class TranslucentBorderSpecialPane extends AbstractBorderPackerPane implements UIObserver {
+ private final int SETTING_LABEL_WIDTH = 60;
private final Style DEFAULT_IMAGE_LAYOUT_STYLE = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_DEFAULT);
private final String TWEAK_NINE_POINT_HELP_URL = "https://help.fanruan.com/finereport/doc-view-4135.html";
@@ -98,7 +94,7 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
private int[] ninePoint = new int[] {-1, -1, -1, -1};
- public BorderLineAndImagePane(boolean supportBorderImage) {
+ public TranslucentBorderSpecialPane(boolean supportBorderImage) {
this.initComponents(supportBorderImage);
this.initLayout();
}
@@ -273,7 +269,7 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
if (imagePreviewPane.getImage() != null) {
tweakPane.previewPane.setNinePoint(ninePoint);
- BasicDialog dialog = tweakPane.showWindow(SwingUtilities.getWindowAncestor(BorderLineAndImagePane.this));
+ BasicDialog dialog = tweakPane.showWindow(SwingUtilities.getWindowAncestor(TranslucentBorderSpecialPane.this));
dialog.addDialogActionListener(new DialogActionAdapter() {
@Override
public void doOk() {
@@ -287,7 +283,13 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
});
}
- public void populateBean(LayoutBorderStyle style) {
+ @Override
+ protected String title4PopupWindow() {
+ return null;
+ }
+
+ @Override
+ public void populateBean(BorderPacker style) {
int borderLine = style.getBorder();
Color borderColor = style.getColor();
@@ -333,7 +335,8 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
this.borderColorPane.setSelectObject(style.getColor());
}
- public void updateBean(LayoutBorderStyle style) {
+ @Override
+ public void updateBean(BorderPacker style) {
style.setBorder(this.borderLineCombo.getSelectedLineStyle());
style.setColor(this.borderColorPane.getSelectObject());
@@ -366,24 +369,6 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
return true;
}
- protected UIButtonUI createButtonUI(final UIColorButton uiColorButton) {
- return new UIButtonUI() {
-
- public void paint(Graphics g, JComponent c) {
- UIButton b = (UIButton) c;
- g.setColor(Color.black);
- GraphHelper.draw(g, new RoundRectangle2D.Double(1, 1, b.getWidth() - 2, b.getHeight() - 2, 0, 0), 1);
-
- if (b.getModel().isEnabled()) {
- g.setColor(uiColorButton.getColor());
- } else {
- g.setColor(new Color(Utils.filterRGB(uiColorButton.getColor().getRGB(), 50)));
- }
- g.fillRect(2, 2, b.getWidth() - 3, b.getHeight() - 3);
- }
- };
- }
-
protected static class BorderLineAndImageComboBox extends LineComboBox {
public static final int LINE_PICTURE = -1;
public final static int[] BORDER_LINE_AND_IMAGE_STYLE_ARRAY = new int[] {
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 a1546025f..f3367206f 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
@@ -117,7 +117,9 @@ public class ExportJavaScriptPane extends AbstractHyperLinkPane list = parameterViewPane.update();
@@ -158,6 +160,7 @@ public class ExportJavaScriptPane extends AbstractHyperLinkPane> extends TargetComponent implements ToolBarMenuDockPlus, DesignerProxy, JTemplateSave, TabChangeListener {
+public abstract class JTemplate> extends TargetComponent implements ToolBarMenuDockPlus, DesignerProxy, JTemplateSave, TabChangeListener, ThemedTemplate {
// TODO ALEX_SEP editingFILE这个属性一定要吗?如果非要不可,有没有可能保证不为null
+ private static final int PREDEFINED_ICON_WIDTH = 27;
private static final int PREFIX_NUM = 3000;
protected FILE editingFILE = null;
// alex:初始状态为saved,这样不管是新建模板,还是打开模板,如果未做任何操作直接关闭,不提示保存
private boolean saved = true;
private boolean authoritySaved = true;
+ private UIButton templateThemeButton;
private UndoManager undoMananger;
private UndoManager authorityUndoManager;
protected U undoState;
@@ -134,9 +145,12 @@ public abstract class JTemplate>
private final String runtimeId = UUID.randomUUID().toString();
private PluginEventListener pluginListener;
+ // 监听全局主题数据更新
+ private TemplateThemeConfig.ThemeConfigChangeListener themeConfigChangeListener;
public JTemplate() {
initAndStartPlugin();
+ startListenThemeConfig();
}
public JTemplate(T t, String defaultFileName) {
@@ -178,6 +192,11 @@ public abstract class JTemplate>
this.undoState = createUndoState();
initAndStartPlugin();
+
+ if (isNewFile) {
+ setUpTheme4NewTemplate();
+ }
+ startListenThemeConfig();
}
private void initAndStartPlugin() {
@@ -207,6 +226,35 @@ public abstract class JTemplate>
PluginListenerRegistration.getInstance().listen(PluginEventType.AfterRun, this.pluginListener, filter);
}
+ private void startListenThemeConfig() {
+ if (themeConfigChangeListener == null) {
+ themeConfigChangeListener = new TemplateThemeConfig.ThemeConfigChangeListener() {
+ @Override
+ public void onThemeConfigChanged(TemplateThemeConfig.ThemeConfigEvent event) {
+ TemplateTheme usingTheme = getTemplateTheme();
+ boolean isUsingThemeChanged = StringUtils.equals(event.themName, usingTheme.getName());
+
+ if (isUsingThemeChanged && (event.action == TemplateThemeConfig.ThemeConfigAction.REMOVE ||
+ event.action == TemplateThemeConfig.ThemeConfigAction.UPDATE)) {
+ checkAndResetTheme();
+ }
+ }
+ };
+ TemplateThemeConfig extends TemplateTheme> config = getUsingTemplateThemeConfig();
+ if (config != null) {
+ config.addThemeConfigChangeListener(themeConfigChangeListener);
+ }
+ }
+ }
+ private void stopListenThemeConfig() {
+ if (themeConfigChangeListener != null) {
+ TemplateThemeConfig extends TemplateTheme> config = getUsingTemplateThemeConfig();
+ if (config != null) {
+ config.addThemeConfigChangeListener(themeConfigChangeListener);
+ }
+ }
+ }
+
private void initPluginPane() {
ExtraDesignClassManager classManager = PluginModule.getAgent(PluginModule.ExtraDesign);
@@ -370,6 +418,7 @@ public abstract class JTemplate>
public void whenClose() {
// stop的时候 pluginListener 和 PluginFilter 都会移除
PluginListenerRegistration.getInstance().stopListen(this.pluginListener);
+ stopListenThemeConfig();
}
@@ -565,6 +614,8 @@ public abstract class JTemplate>
*/
public void undo() {
this.getUndoManager().undo();
+ // 撤销前模版使用主题可能已经被删除或修改,需要重置模版样式
+ checkAndResetTheme();
fireSuperTargetModified();
}
@@ -573,7 +624,8 @@ public abstract class JTemplate>
*/
public void redo() {
this.getUndoManager().redo();
-
+ // 重做前模版使用主题可能已经被删除或修改,需要重置模版样式
+ checkAndResetTheme();
fireSuperTargetModified();
}
@@ -625,6 +677,14 @@ public abstract class JTemplate>
super.fireTargetModified();
}
+ public void fireTargetModified(boolean shouldCreateNewUndoState) {
+ if (shouldCreateNewUndoState) {
+ fireTargetModified();
+ } else {
+ super.fireTargetModified();
+ }
+ }
+
protected abstract U createUndoState();
protected abstract void applyUndoState(U u);
@@ -1352,6 +1412,8 @@ public abstract class JTemplate>
for (DesignerFrameUpButtonProvider provider : providers) {
uiButtons = ArrayUtils.addAll(uiButtons, provider.getUpButtons(getMenuState()));
}
+ templateThemeButton = createTemplateThemeButton();
+ uiButtons = ArrayUtils.addAll(uiButtons, templateThemeButton);
return uiButtons;
}
@@ -1360,6 +1422,23 @@ public abstract class JTemplate>
return new UIButton[]{new CheckButton()};
}
+ protected UIButton createTemplateThemeButton() {
+ UIButton button = new UIButton(IOUtils.readIcon("/com/fr/design/icon/icon_predefined_style.png")) {
+ @Override
+ public Dimension getPreferredSize() {
+ FontMetrics metrics = getFontMetrics(getFont());
+ int width = Math.min(metrics.stringWidth(getText()) + PREDEFINED_ICON_WIDTH, 100);
+ return new Dimension(width, 20);
+ }
+ };
+ button.setToolTipText(getTemplateTheme().getName());
+ button.setText(getTemplateTheme().getName());
+ button.setAlignmentX(SwingConstants.LEFT);
+ button.set4ToolbarButton();
+ button.setEnabled(true);
+ return button;
+ }
+
/**
* 由于老版本的模板没有模板ID,当勾选使用参数模板时候,就加一个模板ID attr
*
@@ -1643,4 +1722,23 @@ public abstract class JTemplate>
public String getRuntimeId() {
return runtimeId;
}
+
+ protected void setUpTheme4NewTemplate() {
+ TemplateTheme theme = getUsingTemplateThemeConfig().cachedFetchTheme4NewTemplate();
+ TemplateThemeAttrMark themeAttrMark = template.getAttrMark(TemplateThemeAttrMark.XML_TAG);
+ if (themeAttrMark == null) {
+ themeAttrMark = new TemplateThemeAttrMark();
+ template.addAttrMark(themeAttrMark);
+ }
+ themeAttrMark.setName(theme.getName());
+ themeAttrMark.setDark(theme.isDark());
+ }
+
+ @Override
+ public void setTemplateTheme(TemplateTheme newTheme, TemplateThemeCompatible compatible) {
+ ThemedTemplate.super.setTemplateTheme(newTheme, compatible);
+ String name = newTheme.getName();
+ templateThemeButton.setText(name);
+ templateThemeButton.setToolTipText(name);
+ }
}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplateNameHelper.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplateNameHelper.java
index 4e201a5ef..22d5985ba 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplateNameHelper.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplateNameHelper.java
@@ -53,6 +53,9 @@ public class JTemplateNameHelper {
* @Date 2021/4/9 11:13
**/
private static Integer getFileNameIndex(String prefix, String fileName) {
+ if (fileName.length() <= prefix.length()) {
+ return null;
+ }
char[] chars = new char[fileName.length()];
int i = 0;
for (; i < fileName.length(); i++) {
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/backgroundpane/ColorBackgroundQuickPane.java b/designer-base/src/main/java/com/fr/design/mainframe/backgroundpane/ColorBackgroundQuickPane.java
index f9b4c160e..2fbdb974e 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/backgroundpane/ColorBackgroundQuickPane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/backgroundpane/ColorBackgroundQuickPane.java
@@ -3,12 +3,8 @@ package com.fr.design.mainframe.backgroundpane;
import com.fr.base.background.ColorBackground;
import com.fr.design.event.UIObserverListener;
import com.fr.design.layout.FRGUIPaneFactory;
-import com.fr.design.style.color.NewColorSelectPane;
+import com.fr.design.style.color.NewColorSelectBox;
import com.fr.general.Background;
-
-
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
import java.awt.BorderLayout;
import java.awt.Color;
@@ -18,13 +14,13 @@ import java.awt.Color;
*/
public class ColorBackgroundQuickPane extends BackgroundQuickPane {
- private NewColorSelectPane detailColorSelectPane;
+ private NewColorSelectBox colorSelectBox;
+
public ColorBackgroundQuickPane() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
-
- detailColorSelectPane = new NewColorSelectPane();
- this.add(detailColorSelectPane, BorderLayout.NORTH);
+ colorSelectBox = new NewColorSelectBox(100);
+ this.add(colorSelectBox, BorderLayout.NORTH);
}
public void populateBean(Background background) {
@@ -37,12 +33,11 @@ public class ColorBackgroundQuickPane extends BackgroundQuickPane {
}
public void populateColor(Color color) {
- this.detailColorSelectPane.setColor(color);
+ this.colorSelectBox.setSelectObject(color);
}
public Color updateColor() {
- this.detailColorSelectPane.updateUsedColor();
- return this.detailColorSelectPane.getNotNoneColor();
+ return this.colorSelectBox.getSelectObject();
}
/**
@@ -52,7 +47,7 @@ public class ColorBackgroundQuickPane extends BackgroundQuickPane {
*/
@Override
public void registerChangeListener(final UIObserverListener listener) {
- detailColorSelectPane.addChangeListener(new ChangeListenerImpl(listener));
+ this.colorSelectBox.addSelectChangeListener(new ChangeListenerImpl(listener));
}
@Override
@@ -78,6 +73,6 @@ public class ColorBackgroundQuickPane extends BackgroundQuickPane {
@Override
public void reset() {
- this.detailColorSelectPane.setColor(null);
+ this.colorSelectBox.setSelectObject(null);
}
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java
index dc10d8883..fded31818 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java
@@ -48,6 +48,7 @@ public class LogMessageBar extends JPanel {
public void mouseClicked(MouseEvent e) {
if (dlg != null && dlg.isVisible()) {
dlg.setExtendedState(JFrame.NORMAL);
+ dlg.requestFocus();
return;
}
dlg = new LogDetailPane().showDialog();
@@ -87,4 +88,8 @@ public class LogMessageBar extends JPanel {
}
THIS = null;
}
+
+ public JFrame getLogFrame() {
+ return dlg;
+ }
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/predefined/ui/detail/ColorFillStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/predefined/ui/detail/ColorFillStylePane.java
index 9e2a0d5ef..823dd6ff3 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/predefined/ui/detail/ColorFillStylePane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/predefined/ui/detail/ColorFillStylePane.java
@@ -15,7 +15,7 @@ import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
-import com.fr.design.style.background.gradient.FixedGradientBar;
+import com.fr.design.style.background.gradient.FixedGradientBarNoTheme;
import com.fr.design.style.color.ColorAdjustPane;
import com.fr.stable.StringUtils;
@@ -40,7 +40,7 @@ public class ColorFillStylePane extends BasicBeanPane {
private ColorSchemeComboBox styleSelectBox;
private JPanel customPane;
private JPanel changeColorSetPane;
- private FixedGradientBar colorGradient;
+ private FixedGradientBarNoTheme colorGradient;
private CardLayout cardLayout;
@@ -69,8 +69,8 @@ public class ColorFillStylePane extends BasicBeanPane {
};
changeColorSetPane = new JPanel(cardLayout = new CardLayout());
- changeColorSetPane.add(colorGradient = new FixedGradientBar(4, 130), "gradient");
- gradientColors = new Color[]{Color.WHITE, FixedGradientBar.NEW_CHARACTER};
+ changeColorSetPane.add(colorGradient = new FixedGradientBarNoTheme(4, 130), "gradient");
+ gradientColors = new Color[]{Color.WHITE, FixedGradientBarNoTheme.NEW_CHARACTER};
changeColorSetPane.add(colorAdjustPane = new ColorAdjustPane(), "acc");
accColors = ColorAdjustPane.DEFAULT_COLORS;
cardLayout.show(changeColorSetPane, "acc");
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/predefined/ui/detail/background/ColorDetailPane.java b/designer-base/src/main/java/com/fr/design/mainframe/predefined/ui/detail/background/ColorDetailPane.java
index b7034fd66..43d20d1bd 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/predefined/ui/detail/background/ColorDetailPane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/predefined/ui/detail/background/ColorDetailPane.java
@@ -3,20 +3,10 @@ package com.fr.design.mainframe.predefined.ui.detail.background;
import com.fr.base.background.ColorBackground;
import com.fr.design.event.UIObserver;
import com.fr.design.event.UIObserverListener;
-import com.fr.design.gui.ibutton.UIButton;
-import com.fr.design.gui.ilable.UILabel;
import com.fr.design.layout.FRGUIPaneFactory;
-import com.fr.design.layout.TableLayoutHelper;
-import com.fr.design.style.color.ColorSelectPane;
+import com.fr.design.style.color.NewColorSelectPane;
import com.fr.general.Background;
-
-import javax.swing.BorderFactory;
-import javax.swing.JPanel;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Dimension;
/**
* Created by kerry on 2020-08-31
@@ -50,48 +40,9 @@ public class ColorDetailPane extends AbstractBackgroundDetailPane chartPreStyleProviders = vanChart.getChartPreStyleProvider();
- for (ChartPreStyleProvider chartPreStyleProvider : chartPreStyleProviders) {
- chartPreStyleProvider.updatePreDefinedStyle(style);
+ /*VanChart vanChart = chartCollection.getSelectedChartProvider(VanChart.class);
+ List chartThemeStyleProviders = vanChart.getChartPreStyleProvider();
+ for (ChartThemeStyleProvider chartThemeStyleProvider : chartThemeStyleProviders) {
+ chartThemeStyleProvider.updateThemeStyle(style);
}
componentBackground = style.getComponentStyle().getBorderStyle().getBackground();
- vanChart.attrChange();
+ vanChart.attrChange();*/
}
@Override
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/AsyncThemeFetcher.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/AsyncThemeFetcher.java
new file mode 100644
index 000000000..3df87ac65
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/AsyncThemeFetcher.java
@@ -0,0 +1,81 @@
+package com.fr.design.mainframe.theme;
+
+import com.fr.base.theme.TemplateTheme;
+import com.fr.base.theme.TemplateThemeConfig;
+import com.fr.concurrent.NamedThreadFactory;
+import com.fr.module.ModuleContext;
+
+import javax.swing.SwingUtilities;
+import java.util.concurrent.ExecutorService;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/24
+ */
+public class AsyncThemeFetcher {
+
+ private final ExecutorService executorService;
+ private final TemplateThemeConfig config;
+
+ public AsyncThemeFetcher(int threads, TemplateThemeConfig config) {
+ this.executorService = ModuleContext.getExecutor().newFixedThreadPool(
+ threads,
+ new NamedThreadFactory(this.getClass().getName())
+ );
+ this.config = config;
+ }
+
+ public void shutdown() {
+ executorService.shutdown();
+ }
+
+ public boolean isShutdown() {
+ return executorService.isShutdown();
+ }
+
+ public void submit(String themeName, AsyncThemeFetchCallback callback) {
+ if (callback != null) {
+ callback.beforeCachedFetch();
+ }
+ executorService.submit(new Runnable() {
+ @Override
+ public void run() {
+ if (executorService.isShutdown()) {
+ return;
+ }
+ T theme = config.cachedFetch(themeName);
+ if (executorService.isShutdown()) {
+ return;
+ }
+ if (callback != null) {
+ // 后续任务不要在工作线程中执行,从而确保只在EDT线程操作UI
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ callback.afterCachedFetch(theme);
+ }
+ });
+ }
+ }
+ });
+ }
+
+ public interface AsyncThemeFetchCallback {
+ void beforeCachedFetch();
+ void afterCachedFetch(T theme);
+ }
+
+ public static class AsyncThemeFetchCallbackAdapter implements AsyncThemeFetchCallback {
+
+ @Override
+ public void beforeCachedFetch() {
+
+ }
+
+ @Override
+ public void afterCachedFetch(T theme) {
+
+ }
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/FormThemeProfilePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/FormThemeProfilePane.java
new file mode 100644
index 000000000..83179edda
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/FormThemeProfilePane.java
@@ -0,0 +1,105 @@
+package com.fr.design.mainframe.theme;
+
+import com.fr.base.theme.FineColorManager;
+import com.fr.base.theme.FormTheme;
+import com.fr.base.theme.TemplateThemeConfig;
+import com.fr.base.theme.settings.ThemedComponentStyle;
+import com.fr.base.theme.settings.ThemedFormBodyStyle;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.mainframe.theme.edit.ChartStyleFormEditPane;
+import com.fr.design.mainframe.theme.edit.ComponentStyleEditPane;
+import com.fr.design.mainframe.theme.edit.FormBodyStyleEditPane;
+import com.fr.design.mainframe.theme.preview.FormThemePreviewPane;
+
+import javax.swing.JPanel;
+import java.util.List;
+import java.awt.Color;
+
+import static com.fr.design.i18n.Toolkit.i18nText;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public class FormThemeProfilePane extends TemplateThemeProfilePane {
+ public static final int LABEL_WIDTH = 60;
+
+ private FormBodyStyleEditPane formBodyStyleSettingPane;
+ private ComponentStyleEditPane componentStyleSettingPane;
+
+ public FormThemeProfilePane(TemplateThemeConfig config) {
+ super(config);
+ }
+
+ @Override
+ public FormThemePreviewPane createThemePreviewPane() {
+ return new FormThemePreviewPane();
+ }
+
+ @Override
+ protected JPanel createCustomEditorsPane() {
+ JPanel container = super.createCustomEditorsPane();
+ formBodyStyleSettingPane = new FormBodyStyleEditPane();
+ addCustomEditorPane(i18nText("Fine-Design_Predefined_Template_Background"), formBodyStyleSettingPane);
+
+ addCustomEditorPane(i18nText("Fine-Design_Predefined_Cell_Style"), createCellStyleSettingPane());
+ addCustomEditorPane(i18nText("Fine-Design_Predefined_Chart_Style"), createChartStyleSettingPane());
+
+
+ componentStyleSettingPane = new ComponentStyleEditPane();
+ addCustomEditorPane(i18nText("Fine-Design_Predefined_Component_Style"), componentStyleSettingPane);
+ return container;
+ }
+
+ @Override
+ protected JPanel createChartStyleSettingPane() {
+ JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ chartStyleSettingPane = new ChartStyleFormEditPane();
+ container.add(chartStyleSettingPane);
+ return container;
+ }
+
+ @Override
+ public void onColorSchemeChanged(List colors) {
+ super.onColorSchemeChanged(colors);
+ FineColorManager.FineColorReplaceByColorScheme replaceByColorScheme = new FineColorManager.FineColorReplaceByColorScheme(colors);
+
+ ThemedFormBodyStyle formBodyStyle = formBodyStyleSettingPane.updateBean();
+ FineColorManager.traverse(formBodyStyle, replaceByColorScheme);
+ formBodyStyleSettingPane.populateBean(formBodyStyle);
+
+ ThemedComponentStyle componentStyle = componentStyleSettingPane.updateBean();
+ FineColorManager.traverse(componentStyle, replaceByColorScheme);
+ componentStyleSettingPane.populateBean(componentStyle);
+ }
+
+ @Override
+ public void populateBean(FormTheme theme) {
+ super.populateBean(theme);
+
+ isPopulating = true;
+
+ formBodyStyleSettingPane.populateBean(theme.getBodyStyle());
+ componentStyleSettingPane.populateBean(theme.getComponentStyle());
+
+ themePreviewPane.refresh(theme);
+
+ isPopulating = false;
+ }
+
+ @Override
+ public void updateBean(FormTheme theme) {
+ ThemedFormBodyStyle formBodyStyle = formBodyStyleSettingPane.updateBean();
+ theme.setBodyStyle(formBodyStyle);
+
+ ThemedComponentStyle componentStyle = componentStyleSettingPane.updateBean();
+ theme.setComponentStyle(componentStyle);
+ }
+
+ @Override
+ public String title4PopupWindow() {
+ return Toolkit.i18nText("Fine-Design_Basic_Form_Theme_Profile_Dialog_Title");
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/ReportThemeProfilePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/ReportThemeProfilePane.java
new file mode 100644
index 000000000..091262b58
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/ReportThemeProfilePane.java
@@ -0,0 +1,74 @@
+package com.fr.design.mainframe.theme;
+
+import com.fr.base.theme.FineColorManager;
+import com.fr.base.theme.ReportTheme;
+import com.fr.base.theme.TemplateThemeConfig;
+import com.fr.base.theme.settings.ThemedReportBodyStyle;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.mainframe.theme.edit.ReportBodyStyleEditPane;
+import com.fr.design.mainframe.theme.preview.ReportThemePreviewPane;
+
+import javax.swing.JPanel;
+import java.awt.Color;
+import java.util.List;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public class ReportThemeProfilePane extends TemplateThemeProfilePane {
+ private ReportBodyStyleEditPane reportBodyStyleSettingPane;
+
+ public ReportThemeProfilePane(TemplateThemeConfig config) {
+ super(config);
+ }
+
+ @Override
+ public ReportThemePreviewPane createThemePreviewPane() {
+ return new ReportThemePreviewPane();
+ }
+
+ @Override
+ protected JPanel createCustomEditorsPane() {
+ JPanel container = super.createCustomEditorsPane();
+ this.reportBodyStyleSettingPane = new ReportBodyStyleEditPane();
+ addCustomEditorPane(Toolkit.i18nText("Fine-Design_Predefined_Template_Background"), reportBodyStyleSettingPane);
+ addCustomEditorPane(Toolkit.i18nText("Fine-Design_Predefined_Cell_Style"), createCellStyleSettingPane());
+ addCustomEditorPane(Toolkit.i18nText("Fine-Design_Predefined_Chart_Style"), createChartStyleSettingPane());
+ return container;
+ }
+
+ @Override
+ public void onColorSchemeChanged(List colors) {
+ super.onColorSchemeChanged(colors);
+
+ FineColorManager.FineColorReplaceByColorScheme replaceByColorScheme = new FineColorManager.FineColorReplaceByColorScheme(colors);
+
+ ThemedReportBodyStyle bodyStyle = reportBodyStyleSettingPane.updateBean();
+ FineColorManager.traverse(bodyStyle, replaceByColorScheme);
+ reportBodyStyleSettingPane.populateBean(bodyStyle);
+ }
+
+ @Override
+ public void populateBean(ReportTheme theme) {
+ super.populateBean(theme);
+
+ isPopulating = true;
+ reportBodyStyleSettingPane.populateBean(theme.getBodyStyle());
+
+ themePreviewPane.refresh(theme);
+
+ isPopulating = false;
+ }
+
+ @Override
+ public void updateBean(ReportTheme theme) {
+ theme.setBodyStyle(this.reportBodyStyleSettingPane.updateBean());
+ }
+
+ @Override
+ public String title4PopupWindow() {
+ return Toolkit.i18nText("Fine-Design_Basic_Report_Theme_Profile_Dialog_Title");
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeBlock.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeBlock.java
new file mode 100644
index 000000000..e00bc445c
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeBlock.java
@@ -0,0 +1,259 @@
+package com.fr.design.mainframe.theme;
+
+import com.fr.base.GraphHelper;
+import com.fr.base.theme.TemplateTheme;
+import com.fr.base.theme.TemplateThemeConfig;
+import com.fr.base.theme.settings.ThemeThumbnail;
+import com.fr.design.designer.IntervalConstants;
+import com.fr.design.file.HistoryTemplateListCache;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.mainframe.JTemplate;
+import com.fr.design.mainframe.theme.dialog.TemplateThemeProfileDialog;
+import com.fr.general.IOUtils;
+import com.fr.stable.Constants;
+import com.fr.stable.StringUtils;
+
+import javax.swing.BorderFactory;
+import javax.swing.Icon;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.Toolkit;
+import java.awt.Window;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public class TemplateThemeBlock extends JPanel {
+ public static final int HEIGHT = 150;
+ public static final int THUMBNAIL_HEIGHT = 125;
+ private static final Color HOVERING_BORDER_COLOR = new Color(65, 155, 249);
+
+ private final String name;
+ private final TemplateThemeConfig config;
+ private T theme;
+ private final TemplateThemeProfilePane profilePane;
+ private final Icon theme4currentTemplateMarkIcon = IOUtils.readIcon("/com/fr/design/form/images/theme4currentTemplate.png");
+ private final Icon theme4NewTemplateMarkIcon= IOUtils.readIcon("/com/fr/design/form/images/theme4newTemplate.png");
+ private final Icon profileIcon = IOUtils.readIcon("/com/fr/design/icon/icon_edit.png");
+ private final boolean displayTheme4NewTemplateMarker;
+
+ private final ThumbnailPane thumbnailPane;
+ // UIButton会影响Block的手势监听,这里使用UILabel代替,点击事件也有Block代为处理
+ private UILabel profileButton;
+ private boolean selected = false;
+ private boolean hovering = false;
+
+ private MouseAdapter clickListener;
+
+ public TemplateThemeBlock(String name,
+ boolean displayTheme4NewTemplateMarker,
+ TemplateThemeConfig config,
+ TemplateThemeProfilePane profilePane) {
+ this.name = name;
+ this.displayTheme4NewTemplateMarker = displayTheme4NewTemplateMarker;
+ this.config = config;
+ this.profilePane = profilePane;
+ this.thumbnailPane = new ThumbnailPane();
+
+ initializePane();
+ addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ if (clickListener != null) {
+ clickListener.mouseClicked(e);
+ }
+
+ if (profileButton != null && profilePane != null) {
+ delegateProfileButtonClick(e);
+ }
+ }
+
+ @Override
+ public void mouseEntered(MouseEvent e) {
+ hovering = true;
+ repaint();
+ }
+
+ @Override
+ public void mouseExited(MouseEvent e) {
+ hovering = false;
+ repaint();
+ }
+ });
+ }
+
+ private void initializePane() {
+ setLayout(FRGUIPaneFactory.createBorderLayout());
+ setPreferredSize(new Dimension(getPreferredSize().width, HEIGHT));
+ setBackground(Color.WHITE);
+
+ thumbnailPane.setBackground(Color.WHITE);
+ thumbnailPane.setPreferredSize(new Dimension(getPreferredSize().width, THUMBNAIL_HEIGHT));
+
+ JPanel infoPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ infoPane.setBackground(Color.WHITE);
+ infoPane.setBorder(BorderFactory.createEmptyBorder(0, IntervalConstants.INTERVAL_L7,0,IntervalConstants.INTERVAL_L7));
+
+ UILabel titleLabel = new UILabel(name);
+ titleLabel.setToolTipText(name);
+ infoPane.add(titleLabel, BorderLayout.CENTER);
+
+ if (profilePane != null) {
+ addProfileButton(infoPane);
+ }
+
+ add(thumbnailPane, BorderLayout.CENTER);
+ add(infoPane, BorderLayout.SOUTH);
+ }
+
+ public void setTheme(T theme) {
+ this.theme = theme;
+ Image image = null;
+ if (theme != null) {
+ ThemeThumbnail thumbnail = theme.getThumbnail();
+ if (thumbnail != null) {
+ image = thumbnail.getImage();
+ }
+ }
+ thumbnailPane.setThumbnail(image);
+ }
+
+ public T getTheme() {
+ return this.theme;
+ }
+
+ public void setSelected(boolean selected) {
+ this.selected = selected;
+ repaint();
+ }
+
+ public void addClickListener(MouseAdapter clickListener) {
+ this.clickListener = clickListener;
+ }
+
+ private void addProfileButton(JPanel panel) {
+ profileButton = new UILabel(profileIcon);
+ profileButton.setPreferredSize(new Dimension(24, 24));
+ panel.add(profileButton, BorderLayout.EAST);
+ }
+
+ private void delegateProfileButtonClick(MouseEvent e) {
+ int x = e.getX();
+ int y = e.getY();
+
+ int profileButtonX = profileButton.getX();
+ int profileButtonY = thumbnailPane.getHeight() + profileButton.getY();
+
+ boolean inX = profileButtonX <= x && x <= profileButtonX + profileButton.getWidth();
+ boolean inY = profileButtonY <= y && y <= profileButtonY + profileButton.getHeight();
+ if (inX && inY) {
+ openProfileDialog();
+ }
+ }
+
+ private void openProfileDialog() {
+ if (theme == null) {
+ return;
+ }
+ Window parent = SwingUtilities.getWindowAncestor(TemplateThemeBlock.this);
+ TemplateThemeProfileDialog profileDialog = new TemplateThemeProfileDialog<>(parent, profilePane);
+ try {
+ profilePane.populateBean((T) theme.clone());
+ } catch (CloneNotSupportedException ex) {
+ ex.printStackTrace();
+ }
+ profileDialog.setVisible(true);
+ }
+
+ @Override
+ public void paint(Graphics g) {
+ super.paint(g);
+ Graphics2D g2d = (Graphics2D) g;
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ JTemplate,?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
+ if (template != null) {
+ TemplateThemeConfig extends TemplateTheme> templateUsingConfig = template.getUsingTemplateThemeConfig();
+ TemplateTheme templateTheme = template.getTemplateTheme();
+ if (templateUsingConfig == this.config && StringUtils.equals(templateTheme.getName(), name)) {
+ theme4currentTemplateMarkIcon.paintIcon(this, g, getWidth() - 25, 0);
+ }
+ }
+
+ if (displayTheme4NewTemplateMarker && StringUtils.equals(config.getThemeName4NewTemplate(), name)) {
+ theme4NewTemplateMarkIcon.paintIcon(this, g, 0, 0);
+ }
+
+ if (selected || this.hovering) {
+ g.setColor(HOVERING_BORDER_COLOR);
+ Rectangle rectangle = new Rectangle(1, 1, this.getWidth() - 2, this.getHeight() - 2);
+ GraphHelper.draw(g, rectangle, Constants.LINE_MEDIUM);
+ }
+ }
+
+ private static class ThumbnailPane extends JPanel {
+ private static final Image LOADING_IMAGE = Toolkit.getDefaultToolkit().createImage(ThumbnailPane.class.getResource("/com/fr/design/images/mainframe/loading.gif"));
+ private Image thumbnail = null;
+
+ @Override
+ public void paint(Graphics g) {
+ super.paint(g);
+ Graphics2D g2d = (Graphics2D) g;
+ Color oldColor = g2d.getColor();
+ g2d.setColor(Color.WHITE);
+ g2d.fillRect(0, 0, getWidth(), getHeight());
+ g2d.setColor(oldColor);
+
+ paintCenterImage(g2d, thumbnail != null ? thumbnail : LOADING_IMAGE);
+ }
+
+ private void paintCenterImage(Graphics2D g2d, Image image) {
+ if (image == null) {
+ return;
+ }
+
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+ int width = getWidth();
+ int height = getHeight();
+ int imgWidth = image.getWidth(null);
+ int imgHeight = image.getHeight(null);
+
+ if (width <= 0 || height <= 0 || imgWidth <= 0 || imgHeight <= 0) {
+ return;
+ }
+
+ float imgAspect = 1.0F * imgWidth / imgHeight;
+
+ if (1.0F * width / height > 1.0F * imgWidth / imgHeight) {
+ imgHeight = height;
+ imgWidth = (int) (1.0F * imgHeight * imgAspect);
+ } else {
+ imgWidth = width;
+ imgHeight = (int) (1.0F * imgWidth / imgAspect);
+ }
+ int x = (width - imgWidth) / 2;
+ int y = (height - imgHeight) / 2;
+
+ g2d.drawImage(image, x, y, imgWidth, imgHeight, null);
+ }
+
+ public void setThumbnail(Image thumbnail) {
+ this.thumbnail = thumbnail;
+ invalidate();
+ repaint();
+ }
+ }
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeListPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeListPane.java
new file mode 100644
index 000000000..524c272ac
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeListPane.java
@@ -0,0 +1,242 @@
+package com.fr.design.mainframe.theme;
+
+import com.fr.base.theme.TemplateTheme;
+import com.fr.base.theme.TemplateThemeConfig;
+import com.fr.design.designer.IntervalConstants;
+import com.fr.design.dialog.BasicPane;
+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.stable.StringUtils;
+
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public class TemplateThemeListPane extends BasicPane {
+ public static final int BLOCK_COUNT_ROW_LINE = 3;
+ public static final int BLOCK_GAP = IntervalConstants.INTERVAL_L1;
+ public static final int CONTENT_WIDTH = 630;
+ public static final int ASYNC_FETCH_THEME_THREAD_COUNT = 10;
+
+ private final AsyncThemeFetcher asyncThemeFetcher;
+
+ private final boolean displayTheme4NewTemplateMarker;
+ protected final TemplateThemeConfig config;
+ private final TemplateThemeProfilePane profilePane;
+ private final JPanel contentListPane;
+
+ private final Map> blockCache = new HashMap<>();
+
+ private TemplateThemeBlock selectedBlock;
+ private TemplateThemeBlock block4newTemplate;
+
+ private TemplateThemeConfig.ThemeConfigChangeListener themeConfigChangeListener;
+
+ private ChangeListener changeListener;
+
+ public TemplateThemeListPane(boolean displayTheme4NewTemplateMarker, TemplateThemeConfig config, TemplateThemeProfilePane profilePane) {
+ this.displayTheme4NewTemplateMarker = displayTheme4NewTemplateMarker;
+ this.config = config;
+ this.profilePane = profilePane;
+ this.contentListPane = new JPanel();
+ this.asyncThemeFetcher = new AsyncThemeFetcher<>(ASYNC_FETCH_THEME_THREAD_COUNT, config);
+ initializePane();
+ }
+
+ private void initializePane() {
+ setLayout(FRGUIPaneFactory.createBorderLayout());
+ setPreferredSize(new Dimension(CONTENT_WIDTH, getPreferredSize().height));
+
+ contentListPane.setBorder(BorderFactory.createEmptyBorder(BLOCK_GAP, 0, BLOCK_GAP, 0));
+ contentListPane.setLayout(new GridLayout(0, BLOCK_COUNT_ROW_LINE, BLOCK_GAP, BLOCK_GAP));
+ fillContentListPane();
+
+ JPanel wrapper = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ wrapper.add(contentListPane, BorderLayout.NORTH);
+
+ UIScrollPane scrollPane = new UIScrollPane(wrapper);
+ scrollPane.setBorder(BorderFactory.createEmptyBorder());
+ add(scrollPane, BorderLayout.CENTER);
+
+ }
+
+ public void fillContentListPane() {
+ contentListPane.removeAll();
+ List names = config.getThemeNames();
+ for (String name: names) {
+ if (config.contains(name)) {
+ TemplateThemeBlock block = createCachedTemplateThemeBlock(name);
+ contentListPane.add(block);
+ if (StringUtils.equals(name, config.getThemeName4NewTemplate())) {
+ block4newTemplate = block;
+ }
+ }
+ }
+ }
+ private TemplateThemeBlock createCachedTemplateThemeBlock(String name) {
+ TemplateThemeBlock block = blockCache.get(name);
+ if (block == null) {
+ block = createNewTemplateThemeBlock(name);
+ blockCache.put(name, block);
+ }
+ return block;
+ }
+
+ private TemplateThemeBlock createNewTemplateThemeBlock(String name) {
+ final TemplateThemeBlock block = new TemplateThemeBlock<>(name, displayTheme4NewTemplateMarker, config, profilePane);
+ block.addClickListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ super.mouseClicked(e);
+ setSelectedBlock(block);
+ }
+ });
+ asyncThemeFetcher.submit(name, new AsyncThemeFetcher.AsyncThemeFetchCallbackAdapter() {
+ @Override
+ public void beforeCachedFetch() {
+ super.beforeCachedFetch();
+ block.setTheme(null);
+ }
+
+ @Override
+ public void afterCachedFetch(T theme) {
+ super.afterCachedFetch(theme);
+ block.setTheme(theme);
+ }
+ });
+ return block;
+ }
+
+ public void setSelectedChangeListener(ChangeListener changeListener) {
+ this.changeListener = changeListener;
+ }
+
+ private void setSelectedBlock(TemplateThemeBlock block) {
+ if (selectedBlock != null) {
+ selectedBlock.setSelected(false);
+ }
+ selectedBlock = block;
+ if (selectedBlock != null) {
+ selectedBlock.setSelected(true);
+ }
+ if (changeListener != null) {
+ changeListener.fireChanged(new ChangeEvent(this));
+ }
+ }
+
+ private void asyncFetchTheme(String themeName) {
+ asyncThemeFetcher.submit(themeName, new AsyncThemeListItemFetchCallback(themeName));
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return null;
+ }
+
+ public T getSelectedTheme() {
+ return selectedBlock != null ? selectedBlock.getTheme() : null;
+ }
+
+ public void startListenThemeConfig() {
+ if (themeConfigChangeListener == null) {
+ themeConfigChangeListener = new TemplateThemeConfig.ThemeConfigChangeListener() {
+ @Override
+ public void onThemeConfigChanged(TemplateThemeConfig.ThemeConfigEvent event) {
+ String themeName = event.themName;
+ TemplateThemeBlock existingBlock = blockCache.get(event.themName);
+ switch (event.action) {
+ case DEFAULT_THEME_4_NEW_TEMPLATE_UPDATE: {
+ if (block4newTemplate != null) {
+ block4newTemplate.repaint();
+ }
+ if (existingBlock != null) {
+ existingBlock.repaint();
+ }
+ block4newTemplate = existingBlock;
+ break;
+ }
+ case UPDATE: {
+ if (existingBlock != null) {
+ asyncFetchTheme(themeName);
+ }
+ break;
+ }
+ case REMOVE: {
+ if (existingBlock != null) {
+ contentListPane.remove(existingBlock);
+ if (existingBlock == selectedBlock) {
+ setSelectedBlock(null);
+ }
+ validate();
+ repaint();
+ blockCache.remove(event.themName);
+ }
+ break;
+ }
+ case ADD: {
+ if (existingBlock == null) {
+ // TODO 这里是否还能继续优化?
+ fillContentListPane();
+ asyncFetchTheme(themeName);
+ validate();
+ repaint();
+ }
+ break;
+ }
+ }
+ }
+ };
+ config.addThemeConfigChangeListener(themeConfigChangeListener);
+ }
+ }
+
+ public void stopListenThemeConfig() {
+ if (themeConfigChangeListener != null) {
+ config.removeThemeConfigChangeListener(themeConfigChangeListener);
+ themeConfigChangeListener = null;
+ }
+ }
+
+ public void stopAsyncFetchTheme() {
+ asyncThemeFetcher.shutdown();
+ }
+
+ private class AsyncThemeListItemFetchCallback extends AsyncThemeFetcher.AsyncThemeFetchCallbackAdapter {
+ private final String themeName;
+ public AsyncThemeListItemFetchCallback(String themeName) {
+ this.themeName = themeName;
+ }
+
+ @Override
+ public void beforeCachedFetch() {
+ super.beforeCachedFetch();
+ TemplateThemeBlock block = blockCache.get(themeName);
+ if (block != null) {
+ block.setTheme(null);
+ }
+ }
+
+ @Override
+ public void afterCachedFetch(T theme) {
+ super.afterCachedFetch(theme);
+ TemplateThemeBlock block = blockCache.get(themeName);
+ if (block != null) {
+ block.setTheme(theme);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeManagePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeManagePane.java
new file mode 100644
index 000000000..bf93c6345
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeManagePane.java
@@ -0,0 +1,325 @@
+package com.fr.design.mainframe.theme;
+
+import com.fr.base.theme.FormTheme;
+import com.fr.base.theme.FormThemeConfig;
+import com.fr.base.theme.ReportTheme;
+import com.fr.base.theme.ReportThemeConfig;
+import com.fr.base.theme.TemplateTheme;
+import com.fr.base.theme.TemplateThemeConfig;
+import com.fr.design.actions.UpdateAction;
+import com.fr.design.dialog.BasicPane;
+import com.fr.design.dialog.FineJOptionPane;
+import com.fr.design.event.ChangeEvent;
+import com.fr.design.event.ChangeListener;
+import com.fr.design.gui.ibutton.UIButton;
+import com.fr.design.gui.itoolbar.UIToolbar;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.icon.IconPathConstants;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.mainframe.theme.dialog.TemplateThemeProfileDialog;
+import com.fr.design.mainframe.theme.edit.CellStyleListEditPane;
+import com.fr.design.menu.MenuDef;
+import com.fr.design.menu.ToolBarDef;
+import com.fr.general.IOUtils;
+import com.fr.log.FineLoggerFactory;
+import com.fr.stable.StringUtils;
+import com.fr.transaction.CallBackAdaptor;
+import com.fr.transaction.Configurations;
+import com.fr.transaction.WorkerFacade;
+
+import javax.swing.BorderFactory;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JSeparator;
+import javax.swing.SwingUtilities;
+import javax.swing.border.LineBorder;
+import java.awt.BasicStroke;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.Stroke;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import static com.fr.design.i18n.Toolkit.i18nText;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public class TemplateThemeManagePane extends BasicPane {
+ private final RemoveThemeAction removeAction;
+ private final UIButton setTheme4NewTemplateButton;
+
+ private final TemplateThemeConfig config;
+ private final TemplateThemeListPane themeListPane;
+ private final TemplateThemeProfilePane profilePane;
+
+ private final AsyncThemeFetcher asyncThemeFetcher;
+
+ public static TemplateThemeManagePane createFormThemesManagerPane() {
+ FormThemeConfig config = FormThemeConfig.getInstance();
+ FormThemeProfilePane editPane = new FormThemeProfilePane(config);
+ return new TemplateThemeManagePane<>(config, editPane);
+ }
+
+ public static TemplateThemeManagePane createReportThemesManagerPane() {
+ ReportThemeConfig config = ReportThemeConfig.getInstance();
+ ReportThemeProfilePane editPane = new ReportThemeProfilePane(config);
+ return new TemplateThemeManagePane<>(config, editPane);
+ }
+
+ public TemplateThemeManagePane(TemplateThemeConfig config, TemplateThemeProfilePane profilePane) {
+ this.config = config;
+ this.profilePane = profilePane;
+ this.themeListPane = new TemplateThemeListPane<>(true, config, profilePane);
+ this.removeAction = new RemoveThemeAction(false);
+ this.setTheme4NewTemplateButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Pane_Default_Setting"));
+ this.asyncThemeFetcher = new AsyncThemeFetcher<>(1, config);
+
+ initializePane();
+ }
+
+ public TemplateThemeConfig getConfig() {
+ return config;
+ }
+
+ private void initializePane() {
+ setLayout(FRGUIPaneFactory.createBorderLayout());
+ setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5));
+
+ add(createActionsContainer(), BorderLayout.NORTH);
+
+ JPanel nextContainer = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ add(nextContainer, BorderLayout.CENTER);
+
+ nextContainer.add(new JSeparator(), BorderLayout.NORTH);
+
+ themeListPane.setPreferredSize(new Dimension(themeListPane.getPreferredSize().width, 490));
+ themeListPane.setSelectedChangeListener(new ChangeListener() {
+ @Override
+ public void fireChanged(ChangeEvent event) {
+ resetEnableRemoveAction(themeListPane.getSelectedTheme(), removeAction);
+ resetEnableSetTheme4NewTemplateButton(themeListPane.getSelectedTheme(), setTheme4NewTemplateButton);
+ }
+ });
+ nextContainer.add(themeListPane, BorderLayout.CENTER);
+
+ resetEnableRemoveAction(themeListPane.getSelectedTheme(), removeAction);
+ resetEnableSetTheme4NewTemplateButton(themeListPane.getSelectedTheme(), setTheme4NewTemplateButton);
+
+ repaint();
+ }
+
+ private void resetEnableRemoveAction(T selectedTheme, RemoveThemeAction removeAction) {
+ if (selectedTheme == null) {
+ removeAction.setEnabled(false);
+ return;
+ }
+ String selectedThemeName = selectedTheme.getName();
+ if (StringUtils.isEmpty(selectedThemeName)) {
+ removeAction.setEnabled(false);
+ return;
+ }
+
+ removeAction.setEnabled(selectedTheme.isRemovable());
+ }
+
+ private void resetEnableSetTheme4NewTemplateButton(T selectedTheme, UIButton setTheme4NewTemplateButton) {
+ if (selectedTheme == null) {
+ setTheme4NewTemplateButton.setEnabled(false);
+ return;
+ }
+ String selectedThemeName = selectedTheme.getName();
+ if (StringUtils.isEmpty(selectedThemeName)) {
+ setTheme4NewTemplateButton.setEnabled(false);
+ return;
+ }
+
+ T currentTheme4NewTemplate = config.cachedFetchTheme4NewTemplate();
+ if (currentTheme4NewTemplate == null) {
+ setTheme4NewTemplateButton.setEnabled(true);
+ return;
+ }
+ String currentThemeName4NewTemplate = currentTheme4NewTemplate.getName();
+ if (StringUtils.isEmpty(currentThemeName4NewTemplate)) {
+ setTheme4NewTemplateButton.setEnabled(true);
+ return;
+ }
+
+ setTheme4NewTemplateButton.setEnabled(!StringUtils.equals(currentThemeName4NewTemplate, selectedTheme.getName()));
+ }
+
+ private JPanel createActionsContainer() {
+ JPanel content = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ content.setPreferredSize(new Dimension(content.getPreferredSize().width, 20));
+
+ UIToolbar toolBar = ToolBarDef.createJToolBar();
+ toolBar.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
+ content.add(toolBar, BorderLayout.CENTER);
+
+ MenuDef addMenuDef = createAddMenuDef();
+
+ ToolBarDef toolbarDef = new ToolBarDef();
+ toolbarDef.addShortCut(addMenuDef, removeAction);
+ toolbarDef.updateToolBar(toolBar);
+
+ setTheme4NewTemplateButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ T theme = themeListPane.getSelectedTheme();
+ if (theme != null) {
+ config.setThemeName4NewTemplate(theme.getName(), new CallBackAdaptor() {
+ @Override
+ public void afterRollback() {
+ super.afterRollback();
+ FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TemplateThemeManagePane.this),
+ i18nText("Fine-Design_Basic_Template_Theme_Operation_Failed_Tip"),
+ i18nText("Fine-Design_Basic_Alert"),
+ JOptionPane.WARNING_MESSAGE);
+ }
+ });
+ }
+ }
+ });
+ content.add(setTheme4NewTemplateButton, BorderLayout.EAST);
+
+ JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ container.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0));
+ container.add(content, BorderLayout.CENTER);
+
+ container.setPreferredSize(new Dimension(container.getPreferredSize().width, 30));
+
+ return container;
+ }
+
+ private MenuDef createAddMenuDef() {
+ MenuDef menuDef = new MenuDef(Toolkit.i18nText("Fine-Design_Basic_Action_Add"));
+ menuDef.setIconPath(IconPathConstants.ADD_POPMENU_ICON_PATH);
+ menuDef.setRePaint(true);
+ menuDef.addShortCut(new AddThemeAction(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Pane_Create_Light_Theme"), config.getDefaultLightThemeName()));
+ menuDef.addShortCut(new AddThemeAction(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Pane_Create_Dark_Theme"), config.getDefaultDarkThemeName()));
+
+ return menuDef;
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Dialog_Title");
+ }
+
+ private class RemoveThemeAction extends UpdateAction {
+
+ public RemoveThemeAction(boolean initialEnabled) {
+ setEnabled(initialEnabled);
+ setName(Toolkit.i18nText("Fine-Design_Basic_Remove"));
+ setMnemonic('R');
+ setSmallIcon(IOUtils.readIcon(IconPathConstants.TD_REMOVE_ICON_PATH));
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ T theme = TemplateThemeManagePane.this.themeListPane.getSelectedTheme();
+ if (theme == null) {
+ return;
+ }
+ int result = FineJOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(TemplateThemeManagePane.this),
+ Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Pane_Delete_Tip", theme.getName()),
+ Toolkit.i18nText("Fine-Design_Basic_Delete"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
+ if (result == JOptionPane.YES_OPTION) {
+ config.removeTheme(theme.getName(), new CallBackAdaptor() {
+ @Override
+ public void afterRollback() {
+ super.afterRollback();
+ FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TemplateThemeManagePane.this),
+ i18nText("Fine-Design_Basic_Template_Theme_Operation_Failed_Tip"),
+ i18nText("Fine-Design_Basic_Alert"),
+ JOptionPane.WARNING_MESSAGE);
+ }
+ });
+ }
+ }
+ }
+
+ private class AddThemeAction extends UpdateAction {
+ private final String prototypeThemeName;
+
+ public AddThemeAction(String name, String prototypeThemeName) {
+ setName(name);
+ setMnemonic('R');
+ this.prototypeThemeName = prototypeThemeName;
+ asyncThemeFetcher.submit(prototypeThemeName, null);
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ asyncThemeFetcher.submit(prototypeThemeName, new AsyncThemeFetcher.AsyncThemeFetchCallbackAdapter() {
+ @Override
+ public void afterCachedFetch(T theme) {
+ super.afterCachedFetch(theme);
+ createNewTheme(theme);
+ }
+ });
+ }
+
+ private void createNewTheme(T prototypeTheme) {
+ Window parent = SwingUtilities.getWindowAncestor(TemplateThemeManagePane.this);
+ TemplateThemeProfileDialog profileDialog = new TemplateThemeProfileDialog<>(parent, profilePane);
+ try {
+ T theme = (T) prototypeTheme.clone();
+ theme.setName(StringUtils.EMPTY);
+ theme.setMutable(true);
+ theme.setRemovable(true);
+ profilePane.populateBean(theme);
+ profileDialog.setVisible(true);
+ } catch (CloneNotSupportedException ex) {
+ FineLoggerFactory.getLogger().error(ex.getMessage(), ex);
+ }
+ }
+ }
+
+ 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 + getThickness() * 2);
+
+ g2d.setStroke(oldStroke);
+ g2d.setColor(oldColor);
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
+ }
+ }
+
+ public void startListenThemeConfig() {
+ themeListPane.startListenThemeConfig();
+ }
+
+ public void stopListenThemeConfig() {
+ themeListPane.stopListenThemeConfig();
+ }
+
+ public void stopAsyncFetchTheme() {
+ asyncThemeFetcher.shutdown();
+ themeListPane.stopAsyncFetchTheme();
+ }
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemePreviewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemePreviewPane.java
new file mode 100644
index 000000000..fab425fbe
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemePreviewPane.java
@@ -0,0 +1,93 @@
+package com.fr.design.mainframe.theme;
+
+import com.fr.base.chart.chartdata.CallbackEvent;
+import com.fr.base.theme.TemplateTheme;
+import com.fr.base.theme.settings.ThemeThumbnail;
+import com.fr.design.mainframe.theme.preview.ThemePreviewed;
+import com.fr.log.FineLoggerFactory;
+
+import javax.swing.JPanel;
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.RenderingHints;
+import java.awt.Transparency;
+import java.awt.image.BufferedImage;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public abstract class TemplateThemePreviewPane extends JPanel implements CallbackEvent, ThemePreviewed {
+ private JPanel parent;
+
+ public void setParent(JPanel parent) {
+ this.parent = parent;
+ }
+
+ @Override
+ public void callback() {
+ if (parent != null) {
+ parent.repaint();
+ } else {
+ this.repaint();
+ }
+ }
+
+ protected Image createThumbnailImage() {
+ BufferedImage image = null;
+
+ int thumbnailWidth = ThemeThumbnail.WIDTH;
+ int thumbnailHeight = ThemeThumbnail.HEIGHT;
+ float thumbnailAspect = 1.0F * thumbnailWidth / thumbnailHeight;
+
+ int width = getWidth();
+ int height = getHeight();
+ float aspect = 1.0F * width / height;
+
+ if (thumbnailAspect > aspect) {
+ height = (int) (width / thumbnailAspect);
+ } else {
+ width = (int) (height * thumbnailAspect);
+ }
+
+ try {
+ // 使用TYPE_INT_RGB和new Color(255, 255, 255, 1)设置有透明背景buffer image,
+ // 使得创建出来的透明像素是(255, 255, 255, 1),而不是(0, 0, 0, 0)
+ // 这样不支持透明通道缩略图的旧设计器打开新设计器创建的模版时,就不会创建出拥有黑色背景的缩略图
+ image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+ Graphics2D g2d = image.createGraphics();
+ // 创建一个支持透明背景的buffer image
+ image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
+ g2d.dispose();
+ g2d = image.createGraphics();
+
+ g2d.fillRect(0, 0, width, height);
+
+ g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ g2d.clipRect(0, 0, width, height);
+
+ paint(g2d);
+
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+
+ if (image != null) {
+ return image.getScaledInstance(thumbnailWidth, thumbnailHeight, BufferedImage.SCALE_SMOOTH);
+ }
+
+ return null;
+ }
+
+ @Override
+ public void paintComponent(Graphics g) {
+ g.clearRect(0, 0, 517, 532);
+ paintBackground((Graphics2D) g);
+ }
+
+ protected abstract void paintBackground(Graphics2D g);
+}
\ No newline at end of file
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
new file mode 100644
index 000000000..0abd6a7bc
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeProfilePane.java
@@ -0,0 +1,609 @@
+package com.fr.design.mainframe.theme;
+
+import com.fr.base.theme.FineColorManager;
+import com.fr.base.theme.TemplateTheme;
+import com.fr.base.theme.TemplateThemeConfig;
+import com.fr.base.theme.settings.ThemeThumbnail;
+import com.fr.base.theme.settings.ThemedCellStyleList;
+import com.fr.base.theme.settings.ThemedChartStyle;
+import com.fr.base.theme.settings.ThemedColorScheme;
+import com.fr.design.dialog.FineJOptionPane;
+import com.fr.design.gui.frpane.AbstractAttrNoScrollPane;
+import com.fr.design.gui.frpane.AttributeChangeListener;
+import com.fr.design.gui.frpane.UITabbedPane;
+import com.fr.design.gui.ibutton.UIButton;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.gui.itextfield.UITextField;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.layout.TableLayout;
+import com.fr.design.layout.TableLayoutHelper;
+import com.fr.design.mainframe.theme.dialog.TemplateThemeProfileDialog;
+import com.fr.design.mainframe.theme.edit.CellStyleListEditPane;
+import com.fr.design.mainframe.theme.edit.ChartStyleEditPane;
+import com.fr.design.mainframe.theme.edit.ui.ColorListExtendedPane;
+import com.fr.design.mainframe.theme.edit.ui.ColorListPane;
+import com.fr.design.mainframe.theme.edit.ui.LabelUtils;
+import com.fr.design.mainframe.theme.ui.BorderUtils;
+import com.fr.design.utils.gui.GUICoreUtils;
+import com.fr.log.FineLoggerFactory;
+import com.fr.stable.StringUtils;
+import com.fr.transaction.CallBackAdaptor;
+import com.fr.transaction.Configurations;
+import com.fr.transaction.WorkerFacade;
+
+import javax.swing.BorderFactory;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Image;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.util.List;
+
+import static com.fr.design.i18n.Toolkit.i18nText;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public abstract class TemplateThemeProfilePane extends AbstractAttrNoScrollPane {
+ public static final int TITLE_BORDER_FONT = 12;
+ public static final int LEFT_TITLE_PANE_WIDTH = 397;
+ public static final int LEFT_TITLE_PANE_HEIGHT = 532 + TITLE_BORDER_FONT / 2 + 10;
+ public static final int PREVIEW_PANE_WIDTH = LEFT_TITLE_PANE_WIDTH - 10;
+ public static final int PREVIEW_PANE_HEIGHT = LEFT_TITLE_PANE_HEIGHT - TITLE_BORDER_FONT - 16;
+
+ public static final int RIGHT_PANE_WIDTH = 362;
+ public static final int RIGHT_PANE_HEIGHT = LEFT_TITLE_PANE_HEIGHT;
+ public static final int COLOR_SCHEME_TITLE_PANE_WIDTH = 298;
+ public static final int COLOR_SCHEME_TITLE_PANE_HEIGHT = 174 + TITLE_BORDER_FONT / 2;
+
+ protected TemplateThemePreviewPane themePreviewPane;
+
+ protected UITextField nameTextField;
+ private UILabel nameErrorLabel;
+ protected ColorListPane colorListPane;
+ private ColorListExtendedPane colorListExtendedPane;
+ protected CellStyleListEditPane cellStyleSettingPane;
+ protected ChartStyleEditPane chartStyleSettingPane;
+
+ protected boolean isPopulating = false;
+ protected UITabbedPane uiTabbedPane;
+
+ private final TemplateThemeConfig config;
+
+ private UIButton saveButton = new UIButton();
+ private UIButton saveAsButton = new UIButton();
+
+ private boolean currentIsNewTheme;
+ private T theme;
+
+ public TemplateThemeProfilePane(TemplateThemeConfig config) {
+ this.config = config;
+ theme = config.createNewTheme();
+ }
+ @Override
+ protected JPanel createContentPane() {
+ JPanel container = new JPanel(new BorderLayout(5, 0));
+ container.add(createLeftPane(), BorderLayout.CENTER);
+ container.add(createRightPane(), BorderLayout.EAST);
+ addAttributeChangeListener(new AttributeChangeListener() {
+ @Override
+ public void attributeChange() {
+ if (!isPopulating) {
+ valueChangeAction();
+ }
+ }
+ });
+ return container;
+ }
+
+ @Override
+ protected void initContentPane() {
+ super.initContentPane();
+ if (leftContentPane != null) {
+ // 修正 AbstractAttrNoScrollPane 的默认行为
+ leftContentPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 6));
+ }
+ }
+
+ public void valueChangeAction() {
+ themePreviewPane.refresh(updateBean());
+ }
+
+ @Override
+ public String title4PopupWindow() {
+ return Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Profile_Dialog_Title");
+ }
+
+ private JPanel createLeftPane() {
+ JPanel titleContainer = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ titleContainer.setPreferredSize(new Dimension(LEFT_TITLE_PANE_WIDTH, LEFT_TITLE_PANE_HEIGHT));
+ titleContainer.setBorder(BorderUtils.createTitleBorder(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Preview_Pane_Title"), TITLE_BORDER_FONT));
+
+ JPanel previewContainer = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ previewContainer.setBorder(BorderFactory.createEmptyBorder(5, 4, 10, 4));
+ titleContainer.add(previewContainer, BorderLayout.CENTER);
+
+ themePreviewPane = createThemePreviewPane();
+ themePreviewPane.setPreferredSize(new Dimension(PREVIEW_PANE_WIDTH, PREVIEW_PANE_HEIGHT));
+ themePreviewPane.setPreferredSize(new Dimension(PREVIEW_PANE_WIDTH, PREVIEW_PANE_HEIGHT));
+
+ previewContainer.add(themePreviewPane, BorderLayout.CENTER);
+
+ return titleContainer;
+ }
+ private JPanel createRightPane() {
+ JPanel container = new JPanel(new BorderLayout(0, 12));
+ container.setPreferredSize(new Dimension(RIGHT_PANE_WIDTH, RIGHT_PANE_HEIGHT));
+ JPanel nameEditPane = createNameEditPane();
+ container.add(nameEditPane, BorderLayout.NORTH);
+
+ JPanel settingPane = new JPanel(new BorderLayout(0, 10));
+ container.add(settingPane, BorderLayout.CENTER);
+ settingPane.add(createColorSchemeEditPane(), BorderLayout.NORTH);
+ settingPane.add(createCustomEditorsPane(), BorderLayout.CENTER);
+
+ uiTabbedPane.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ valueChangeAction();
+ }
+ });
+
+ return container;
+ }
+
+ private JPanel createNameEditPane() {
+ JPanel container = new JPanel(new BorderLayout(30, 0));
+ container.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0));
+ container.add(LabelUtils.createLabel(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Edit_Pane_Name")), BorderLayout.WEST);
+
+ JPanel settingContainer = new JPanel(new BorderLayout(10, 0));
+ container.add(settingContainer, BorderLayout.CENTER);
+
+ nameErrorLabel = LabelUtils.createLabel(StringUtils.EMPTY, Color.RED);
+ nameErrorLabel.setVisible(false);
+
+ nameTextField = new UITextField();
+ nameTextField.setEnabled(false);
+ nameTextField.setPreferredSize(new Dimension(165, 20));
+ nameTextField.getDocument().addDocumentListener(new DocumentListener() {
+ @Override
+ public void insertUpdate(DocumentEvent e) {
+ if (isEnabled()) {
+ checkThemeCanBeSavedAndUpdateUI(currentIsNewTheme, nameTextField, nameErrorLabel, saveButton);
+ }
+ }
+
+ @Override
+ public void removeUpdate(DocumentEvent e) {
+ if (isEnabled()) {
+ checkThemeCanBeSavedAndUpdateUI(currentIsNewTheme, nameTextField, nameErrorLabel, saveButton);
+ }
+ }
+
+ @Override
+ public void changedUpdate(DocumentEvent e) {
+
+ }
+ });
+ nameTextField.addFocusListener(new FocusAdapter() {
+ @Override
+ public void focusGained(FocusEvent e) {
+ if (isEnabled()) {
+ checkThemeCanBeSavedAndUpdateUI(currentIsNewTheme, nameTextField, nameErrorLabel, saveButton);
+ }
+ }
+
+ @Override
+ public void focusLost(FocusEvent e) {
+ if (isEnabled()) {
+ checkThemeCanBeSavedAndUpdateUI(currentIsNewTheme, nameTextField, nameErrorLabel, saveButton);
+ }
+ }
+ });
+
+ settingContainer.add(nameTextField, BorderLayout.WEST);
+
+ settingContainer.add(nameErrorLabel, BorderLayout.CENTER);
+
+ return container;
+ }
+ private JPanel createColorSchemeEditPane() {
+ colorListPane = new ColorListPane();
+ colorListExtendedPane = new ColorListExtendedPane();
+
+ JPanel extendedContainer = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ colorListExtendedPane.setBackground(null);
+ colorListExtendedPane.setOpaque(false);
+ extendedContainer.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
+ extendedContainer.setBackground(Color.WHITE);
+ extendedContainer.add(colorListExtendedPane);
+
+ double p = TableLayout.PREFERRED;
+ double[] rowSize = new double[]{p, p, p};
+ double[] columnSize = {p, p};
+
+ JPanel previewLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ previewLabelPane.add(LabelUtils.createLabel(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Edit_Pane_Color_Scheme_Preview_Label")), BorderLayout.NORTH);
+
+ UILabel tipLabel = LabelUtils.createLabel(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Edit_Pane_Color_Scheme_Edit_Tip"), new Color(153, 153, 153));
+ tipLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0));
+
+ JPanel content = TableLayoutHelper.createGapTableLayoutPane(new JComponent[][]{
+ {LabelUtils.createLabel(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Edit_Pane_Color_Scheme_Edit_Label")), colorListPane},
+ {null, tipLabel},
+ {previewLabelPane, extendedContainer},
+ },
+ rowSize, columnSize, 18, 7);
+ content.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
+
+ JPanel borderContainer = new JPanel(new BorderLayout());
+ borderContainer.setPreferredSize(new Dimension(COLOR_SCHEME_TITLE_PANE_WIDTH, COLOR_SCHEME_TITLE_PANE_HEIGHT));
+ borderContainer.setBorder(BorderUtils.createTitleBorder(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Edit_Pane_Color_Scheme_Title")));
+ borderContainer.add(content);
+
+ JPanel container = new JPanel(new BorderLayout());
+ container.add(borderContainer, BorderLayout.WEST);
+
+ colorListPane.addColorChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ List colors = colorListPane.update();
+ onColorSchemeChanged(colors);
+ }
+ });
+
+ return container;
+ }
+ protected JPanel createCustomEditorsPane() {
+ JPanel container = new JPanel(new BorderLayout());
+ container.setBorder(BorderUtils.createTitleBorder(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Edit_Pane_Custom_Settings_Title")));
+
+ uiTabbedPane = new UITabbedPane();
+ uiTabbedPane.setBorder(BorderFactory.createEmptyBorder(10, 5, 10, 1));
+ container.add(uiTabbedPane, BorderLayout.NORTH);
+
+ return container;
+ }
+ public void addCustomEditorPane(String title, JComponent component) {
+ component.setPreferredSize(new Dimension(360, 260));
+ uiTabbedPane.addTab(title, component);
+ }
+ protected JPanel createCellStyleSettingPane() {
+ JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ cellStyleSettingPane = new CellStyleListEditPane();
+ cellStyleSettingPane.registerAttrChangeListener(new AttributeChangeListener() {
+ @Override
+ public void attributeChange() {
+ valueChangeAction();
+ }
+ });
+ container.add(cellStyleSettingPane);
+ return container;
+ }
+ protected JPanel createChartStyleSettingPane() {
+ JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ chartStyleSettingPane = new ChartStyleEditPane();
+ container.add(chartStyleSettingPane);
+ return container;
+ }
+
+ public abstract TemplateThemePreviewPane createThemePreviewPane();
+
+ public void onColorSchemeChanged(List colors) {
+ colorListExtendedPane.populate(colors);
+ FineColorManager.FineColorReplaceByColorScheme replaceByColorScheme = new FineColorManager.FineColorReplaceByColorScheme(colors);
+ ThemedCellStyleList cellStyle = cellStyleSettingPane.updateBean();
+ FineColorManager.traverse(cellStyle, replaceByColorScheme);
+
+ ThemedChartStyle themedChartStyle = chartStyleSettingPane.updateBean();
+ FineColorManager.traverse(themedChartStyle, replaceByColorScheme);
+ chartStyleSettingPane.populateBean(themedChartStyle);
+ chartStyleSettingPane.populateGradientBar(colors);
+ }
+
+ public void populateBean(T theme) {
+ try {
+ this.theme = (T) theme.clone();
+ } catch (CloneNotSupportedException e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ isPopulating = true;
+
+ String name = theme.getName();
+
+ currentIsNewTheme = config.cachedFetch(name) == null;
+
+ nameTextField.setText(name);
+ nameTextField.setEnabled(StringUtils.isEmpty(name));
+ if (saveButton != null) {
+ saveButton.setEnabled(theme.isMutable() && !currentIsNewTheme);
+ }
+ if (saveAsButton != null) {
+ saveAsButton.setEnabled(!currentIsNewTheme);
+ }
+
+ cellStyleSettingPane.populateBean(theme.getCellStyleList());
+ colorListPane.populate(theme.getColorScheme().getColors());
+ colorListExtendedPane.populate(colorListPane.update());
+ chartStyleSettingPane.populateBean(theme.getChartStyle());
+ themePreviewPane.refresh(theme);
+ isPopulating = false;
+ }
+
+ public T updateBean() {
+ if (theme == null) {
+ theme = config.createNewTheme();
+ }
+
+ theme.setName(this.nameTextField.getText());
+
+ Image thumbnailImage = themePreviewPane.createThumbnailImage();
+ if (thumbnailImage != null) {
+ ThemeThumbnail thumbnail = new ThemeThumbnail();
+ thumbnail.setImage(thumbnailImage);
+ theme.setThumbnail(thumbnail);
+ }
+
+ ThemedCellStyleList cellStyleConfig = this.cellStyleSettingPane.updateBean();
+ theme.setCellStyleList(cellStyleConfig);
+
+ ThemedColorScheme colorScheme = theme.getColorScheme();
+ colorScheme.setColors(this.colorListPane.update());
+ theme.setColorScheme(colorScheme);
+
+ theme.setChartStyle(this.chartStyleSettingPane.updateBean());
+
+ updateBean(theme);
+ return theme;
+ }
+
+ public List getCurrentColorScheme() {
+ return colorListPane.update();
+ }
+
+ protected abstract void updateBean(T theme);
+
+ public UIButton createSaveButton() {
+ saveButton = new UIButton();
+ saveButton.setText(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Profile_Pane_Save"));
+ saveButton.setEnabled(false);
+ saveButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ T theme = updateBean();
+ boolean canBeSaved = checkThemeCanBeSavedAndUpdateUI(currentIsNewTheme, nameTextField, nameErrorLabel, saveButton);
+ if (canBeSaved && theme != null) {
+ theme.setName(nameTextField.getText());
+ config.addTheme(theme, true, new CallBackAdaptor() {
+ @Override
+ public void afterCommit() {
+ super.afterCommit();
+ currentIsNewTheme = false;
+ nameTextField.setEnabled(false);
+ saveAsButton.setEnabled(true);
+ }
+
+ @Override
+ public void afterRollback() {
+ super.afterRollback();
+ FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TemplateThemeProfilePane.this),
+ i18nText("Fine-Design_Basic_Template_Theme_Operation_Failed_Tip"),
+ i18nText("Fine-Design_Basic_Alert"),
+ JOptionPane.WARNING_MESSAGE);
+ }
+ });
+ }
+ }
+ });
+ return saveButton;
+ }
+ public UIButton createSaveAsButton(final TemplateThemeProfileDialog profileDialog) {
+ saveAsButton = new UIButton();
+ saveAsButton.removeAll();
+ saveAsButton.setText(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Profile_Pane_Save_As"));
+ saveAsButton.setEnabled(false);
+ saveAsButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ new SaveAsDialog(profileDialog).setVisible(true);
+ }
+ });
+ return saveAsButton;
+ }
+ private class SaveAsDialog extends JDialog {
+ private final TemplateThemeProfileDialog parent;
+
+ private UITextField nameTextField;
+ private UILabel nameErrorLabel;
+ private UIButton confirmButton;
+
+ public SaveAsDialog(TemplateThemeProfileDialog dialog) {
+ super(dialog, ModalityType.APPLICATION_MODAL);
+
+ setTitle(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Save_As_Dialog_Title"));
+ setResizable(false);
+ setSize(new Dimension(300, 140));
+ GUICoreUtils.centerWindow(this);
+
+ parent = dialog;
+
+ initializeComponents();
+ add(createContentPane(), BorderLayout.CENTER);
+ add(createActionsContainer(), BorderLayout.SOUTH);
+
+ addWindowListener(new WindowAdapter() {
+ public void windowClosing(WindowEvent e) {
+ exit();
+ }
+ });
+ }
+
+ private void initializeComponents() {
+ nameErrorLabel = LabelUtils.createLabel(StringUtils.EMPTY, Color.RED);
+ nameErrorLabel.setBorder(BorderFactory.createEmptyBorder(10, 20, 0, 0));
+
+ confirmButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Confirm"));
+ confirmButton.setEnabled(false);
+ confirmButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ saveAsNew(nameTextField.getText());
+ }
+ });
+
+ nameTextField = new UITextField();
+ nameTextField.getDocument().addDocumentListener(new DocumentListener() {
+ @Override
+ public void insertUpdate(DocumentEvent e) {
+ if (isEnabled()) {
+ checkThemeCanBeSavedAndUpdateUI(true, nameTextField, nameErrorLabel, confirmButton);
+ }
+ }
+
+ @Override
+ public void removeUpdate(DocumentEvent e) {
+ if (isEnabled()) {
+ checkThemeCanBeSavedAndUpdateUI(true, nameTextField, nameErrorLabel, confirmButton);
+ }
+ }
+
+ @Override
+ public void changedUpdate(DocumentEvent e) {
+
+ }
+ });
+ nameTextField.addFocusListener(new FocusAdapter() {
+ @Override
+ public void focusGained(FocusEvent e) {
+ if (isEnabled()) {
+ checkThemeCanBeSavedAndUpdateUI(true, nameTextField, nameErrorLabel, confirmButton);
+ }
+ }
+
+ @Override
+ public void focusLost(FocusEvent e) {
+ if (isEnabled()) {
+ checkThemeCanBeSavedAndUpdateUI(true, nameTextField, nameErrorLabel, confirmButton);
+ }
+ }
+ });
+ nameTextField.setPreferredSize(new Dimension(180, 20));
+ }
+
+ private JPanel createActionsContainer() {
+
+ UIButton cancelButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Cancel"));
+ cancelButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ exit();
+ }
+ });
+
+ JPanel container = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane();
+ container.add(confirmButton);
+ container.add(cancelButton);
+
+ return container;
+ }
+
+ private JPanel createContentPane() {
+ JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
+
+ JPanel nameTextPane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(20, 5);
+ nameTextPane.setBorder(BorderFactory.createEmptyBorder(20, 0, 0, 0));
+ nameTextPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Save_As_Pane_Name_Label")));
+ nameTextPane.add(nameTextField);
+
+ container.add(nameTextPane, BorderLayout.CENTER);
+ container.add(nameErrorLabel, BorderLayout.SOUTH);
+
+ return container;
+ }
+
+ private void saveAsNew(String name) {
+ T newThemeObject = null;
+ try {
+ newThemeObject = (T) updateBean().clone();
+ } catch (CloneNotSupportedException ex) {
+ FineLoggerFactory.getLogger().error(ex.getMessage(), ex);
+ return;
+ }
+ boolean canBeSaved = checkThemeCanBeSavedAndUpdateUI(true, nameTextField, nameErrorLabel, confirmButton);
+ if (canBeSaved && newThemeObject != null) {
+ newThemeObject.setName(name);
+ newThemeObject.setRemovable(true);
+ newThemeObject.setMutable(true);
+ config.addTheme(newThemeObject, true, new CallBackAdaptor() {
+ @Override
+ public void afterCommit() {
+ super.afterCommit();
+ exit();
+ parent.exit();
+ }
+
+ @Override
+ public void afterRollback() {
+ super.afterRollback();
+ FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TemplateThemeProfilePane.this),
+ i18nText("Fine-Design_Basic_Template_Theme_Operation_Failed_Tip"),
+ i18nText("Fine-Design_Basic_Alert"),
+ JOptionPane.WARNING_MESSAGE);
+ }
+ });
+ }
+ }
+
+ public void exit() {
+ this.dispose();
+ }
+ }
+
+ private boolean isThemeNameEmpty(String name) {
+ return StringUtils.isEmpty(name);
+ }
+ private boolean isThemeNameDuplicated(String name) {
+ return config.cachedFetch(name) != null;
+ }
+ private boolean checkThemeCanBeSavedAndUpdateUI(boolean checkDuplicated, UITextField textField, UILabel errorLabel, UIButton... actionButtons) {
+ String error = StringUtils.EMPTY;
+ String name = textField.getText();
+ if (isThemeNameEmpty(name)) {
+ error = Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Edit_Pane_Empty_Name_Error_Tip");
+ } else if (checkDuplicated && isThemeNameDuplicated(name)) {
+ error = Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Edit_Pane_Duplicated_Name_Error_Tip");
+ }
+ errorLabel.setText(error);
+
+ boolean valid = StringUtils.isEmpty(error);
+
+ errorLabel.setVisible(!valid);
+ if (actionButtons != null && actionButtons.length > 0) {
+ for (UIButton button : actionButtons) {
+ if (button != null) {
+ button.setEnabled(valid);
+ }
+ }
+ }
+
+ return valid;
+ }
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeDialog.java
new file mode 100644
index 000000000..69a057d65
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeDialog.java
@@ -0,0 +1,101 @@
+package com.fr.design.mainframe.theme.dialog;
+
+import com.fr.design.gui.ibutton.UIButton;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.utils.gui.GUICoreUtils;
+
+import javax.swing.BorderFactory;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Window;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/16
+ */
+public abstract class TemplateThemeDialog extends JDialog {
+ public static final int DIALOG_TITLE_HEIGHT = 28;
+
+ public static final int DIALOG_BOTTOM_ACTION_BAR_HEIGHT = 30;
+ public static final int DIALOG_BOTTOM_ACTION_BUTTON_GAP = 10;
+ public static final int DIALOG_BOTTOM_ACTION_BUTTON_HEIGHT = 20;
+
+ public TemplateThemeDialog(Window parent, String title, int contentWidth, int contentHeight) {
+ super(parent, ModalityType.APPLICATION_MODAL);
+
+ setTitle(title);
+ setResizable(false);
+ setLayout(FRGUIPaneFactory.createBorderLayout());
+
+ int dialogContentHeight = contentHeight + DIALOG_BOTTOM_ACTION_BAR_HEIGHT;
+ int dialogWindowHeight = dialogContentHeight + DIALOG_TITLE_HEIGHT;
+
+ setSize(new Dimension(contentWidth, dialogWindowHeight));
+
+ addWindowListener(new WindowAdapter() {
+ public void windowClosing(WindowEvent e) {
+ exit();
+ }
+ });
+ GUICoreUtils.centerWindow(this);
+ }
+
+ protected final JPanel createDialogContentPane(JPanel contentPane, UIButton[] rightButtons) {
+ JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ container.add(contentPane, BorderLayout.CENTER);
+ container.add(createActionsContainer(rightButtons), BorderLayout.SOUTH);
+ return container;
+ }
+
+ protected final JPanel createDialogContentPane(JPanel contentPane, UIButton[] leftButtons, UIButton[] rightButtons) {
+ JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ container.add(contentPane, BorderLayout.CENTER);
+ container.add(createActionsContainer(leftButtons, rightButtons), BorderLayout.SOUTH);
+ return container;
+ }
+
+
+ private JPanel createActionsContainer(UIButton... buttons) {
+ return this.createActionsContainer(FlowLayout.RIGHT, buttons);
+ }
+
+ private JPanel createActionsContainer(int align, UIButton... buttons) {
+ JPanel container = new JPanel(new FlowLayout(align, DIALOG_BOTTOM_ACTION_BUTTON_GAP, 0));
+ int paddingVertical = (DIALOG_BOTTOM_ACTION_BAR_HEIGHT - DIALOG_BOTTOM_ACTION_BUTTON_HEIGHT) / 2;
+ container.setBorder(BorderFactory.createEmptyBorder(paddingVertical, 0, paddingVertical, 0));
+
+ if (buttons == null || buttons.length == 0) {
+ return container;
+ }
+
+ for (UIButton button: buttons) {
+ if (button != null) {
+ button.setPreferredSize(new Dimension(button.getPreferredSize().width, DIALOG_BOTTOM_ACTION_BUTTON_HEIGHT));
+ container.add(button);
+ }
+ }
+
+ return container;
+ }
+
+ private JPanel createActionsContainer(UIButton[] leftButtons, UIButton[] rightButtons) {
+ JPanel leftPane = createActionsContainer(FlowLayout.LEFT, leftButtons);
+ JPanel rightPane = createActionsContainer(FlowLayout.RIGHT, rightButtons);
+
+ JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ container.add(leftPane, BorderLayout.WEST);
+ container.add(rightPane, BorderLayout.EAST);
+
+ return container;
+ }
+
+ public void exit() {
+ this.dispose();
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeManageDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeManageDialog.java
new file mode 100644
index 000000000..e7acb8d8a
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeManageDialog.java
@@ -0,0 +1,93 @@
+package com.fr.design.mainframe.theme.dialog;
+
+import com.fr.base.theme.FormTheme;
+import com.fr.base.theme.ReportTheme;
+import com.fr.base.theme.TemplateTheme;
+import com.fr.base.theme.TemplateThemeConfig;
+import com.fr.design.file.HistoryTemplateListCache;
+import com.fr.design.gui.frpane.UITabbedPane;
+import com.fr.design.gui.ibutton.UIButton;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.mainframe.JTemplate;
+import com.fr.design.mainframe.theme.TemplateThemeManagePane;
+
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public class TemplateThemeManageDialog extends TemplateThemeDialog {
+ public static final int CONTENT_WIDTH = 660;
+ public static final int CONTENT_HEIGHT = 570;
+
+ private final TemplateThemeManageDialogContentPane contentPane;
+
+ public TemplateThemeManageDialog(Window parent) {
+ super(parent, Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Dialog_Title"), CONTENT_WIDTH, CONTENT_HEIGHT);
+ contentPane = new TemplateThemeManageDialogContentPane();
+
+ setContentPane(createDialogContentPane(contentPane, new UIButton[]{ createCompleteButton() }));
+ }
+
+ private UIButton createCompleteButton() {
+ UIButton button = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Dialog_Complete"));
+ button.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ exit();
+ }
+ });
+ return button;
+ }
+
+ @Override
+ public void exit(){
+ contentPane.exit();
+ super.exit();
+ }
+
+ public static class TemplateThemeManageDialogContentPane extends JPanel {
+ private final TemplateThemeManagePane formThemesManagerPane;
+ private final TemplateThemeManagePane reportThemesManagerPane;
+
+ public TemplateThemeManageDialogContentPane() {
+ setLayout(FRGUIPaneFactory.createBorderLayout());
+ setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10));
+
+ UITabbedPane tabbedPane = new UITabbedPane();
+ add(tabbedPane, BorderLayout.NORTH);
+
+ formThemesManagerPane = TemplateThemeManagePane.createFormThemesManagerPane();
+ formThemesManagerPane.startListenThemeConfig();
+ reportThemesManagerPane = TemplateThemeManagePane.createReportThemesManagerPane();
+ reportThemesManagerPane.startListenThemeConfig();
+
+ tabbedPane.addTab(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Dialog_FORM_TAB"), formThemesManagerPane);
+ tabbedPane.addTab(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Dialog_REPORT_TAB"), reportThemesManagerPane);
+
+ tabbedPane.setSelectedIndex(0);
+ JTemplate,?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
+ if (template != null) {
+ TemplateThemeConfig extends TemplateTheme> config = template.getUsingTemplateThemeConfig();
+ if (config == reportThemesManagerPane.getConfig()) {
+ tabbedPane.setSelectedIndex(1);
+ }
+ }
+ }
+
+ public void exit() {
+ formThemesManagerPane.stopListenThemeConfig();
+ formThemesManagerPane.stopAsyncFetchTheme();
+ reportThemesManagerPane.stopListenThemeConfig();
+ reportThemesManagerPane.stopAsyncFetchTheme();
+ }
+ }
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeProfileDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeProfileDialog.java
new file mode 100644
index 000000000..f0eeb2f48
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeProfileDialog.java
@@ -0,0 +1,145 @@
+package com.fr.design.mainframe.theme.dialog;
+
+import com.fr.base.theme.TemplateTheme;
+import com.fr.design.gui.ibutton.UIButton;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.mainframe.DesignerContext;
+import com.fr.design.mainframe.theme.TemplateThemeProfilePane;
+import com.fr.file.FILE;
+import com.fr.file.FILEChooserPane;
+import com.fr.file.FileFILE;
+import com.fr.file.filter.ChooseFileFilter;
+import com.fr.log.FineLoggerFactory;
+import com.fr.stable.ListSet;
+import com.fr.stable.xml.XMLPrintWriter;
+
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public class TemplateThemeProfileDialog extends TemplateThemeDialog {
+
+ public static TemplateThemeProfilePane extends TemplateTheme> currentVisibleProfilePane;
+
+ public static final int CONTENT_WIDTH = 910;
+ public static final int CONTENT_HEIGHT = 570;
+
+ public TemplateThemeProfileDialog(Window parent, TemplateThemeProfilePane profilePane) {
+ super(parent, profilePane.getTitle(), CONTENT_WIDTH, CONTENT_HEIGHT);
+
+ JPanel content = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ content.setPreferredSize(new Dimension(CONTENT_WIDTH, CONTENT_HEIGHT));
+ content.add(profilePane, BorderLayout.CENTER);
+
+ setContentPane(createDialogContentPane(content, new UIButton[]{
+ // 用于视觉设计师导出内置主题文件,发布前关闭
+ // 后续由产品经理决定是否开启此功能
+ createExportButton(profilePane),
+ profilePane.createSaveButton(),
+ profilePane.createSaveAsButton(this),
+ createCancelButton()
+ }));
+
+ currentVisibleProfilePane = profilePane;
+ }
+
+ private void exportTheme(T theme) {
+ FILEChooserPane fileChooser = FILEChooserPane.getInstance(true, true, new ChooseFileFilter() {
+ @Override
+ public boolean accept(FILE f) {
+ return f.isDirectory();
+ }
+
+ @Override
+ public String getDescription() {
+ return "export theme to xml";
+ }
+
+ @Override
+ public boolean containsExtension(String extension) {
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return getDescription();
+ }
+ });
+ fileChooser.setCurrentDirectory(new FileFILE(new File("~/")));
+ fileChooser.setFileNameTextField(theme.getName(), ".xml");
+ FILE exportedFile = null;
+
+ int result = fileChooser.showSaveDialog(DesignerContext.getDesignerFrame(), ".xml");
+ if (result == FILEChooserPane.JOPTIONPANE_OK_OPTION || result == FILEChooserPane.OK_OPTION) {
+ exportedFile = fileChooser.getSelectedFILE();
+ }
+ if (exportedFile == null) {
+ return;
+ }
+
+ try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(exportedFile.getPath()))) {
+ XMLPrintWriter writer = XMLPrintWriter.create(bos);
+ theme.writeXML(writer);
+ writer.flush();
+ writer.close();
+ } catch (IOException e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ }
+ public UIButton createExportButton(TemplateThemeProfilePane profilePane) {
+ UIButton exportButton = new UIButton();
+ exportButton.setText(Toolkit.i18nText("Fine-Design_Basic_Export"));
+ exportButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ T theme = profilePane.updateBean();
+ theme.getImageIdList().setIdList(new ListSet<>());
+ exportTheme(theme);
+ }
+ });
+ return exportButton;
+ }
+
+ private UIButton createCancelButton() {
+ UIButton button = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Cancel"));
+ button.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ exit();
+ }
+ });
+ return button;
+ }
+
+ @Override
+ public void exit() {
+ currentVisibleProfilePane = null;
+ super.exit();
+ }
+
+ public static List getEditingColorScheme() {
+ if (currentVisibleProfilePane != null) {
+ return currentVisibleProfilePane.getCurrentColorScheme();
+ }
+ return null;
+ }
+
+ public static boolean isEditingTheme() {
+ return currentVisibleProfilePane != null;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeUsingDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeUsingDialog.java
new file mode 100644
index 000000000..1d17bb4eb
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeUsingDialog.java
@@ -0,0 +1,162 @@
+package com.fr.design.mainframe.theme.dialog;
+
+import com.fr.base.theme.ThemedTemplate;
+import com.fr.base.theme.TemplateTheme;
+import com.fr.base.theme.TemplateThemeConfig;
+import com.fr.design.base.mode.DesignModeContext;
+import com.fr.design.event.ChangeEvent;
+import com.fr.design.event.ChangeListener;
+import com.fr.design.gui.ibutton.UIButton;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.mainframe.theme.TemplateThemeListPane;
+import com.fr.design.mainframe.theme.ui.BorderUtils;
+import com.fr.stable.StringUtils;
+import com.fr.workspace.WorkContext;
+
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import javax.swing.border.CompoundBorder;
+import java.awt.BorderLayout;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public class
+TemplateThemeUsingDialog extends TemplateThemeDialog {
+ public static final int CONTENT_WIDTH = 660;
+ public static final int CONTENT_HEIGHT = 515;
+
+ private final TemplateThemeListPane themeListPane;
+ private final ThemedTemplate currentTemplate;
+
+ public TemplateThemeUsingDialog(Window parent, ThemedTemplate template, TemplateThemeConfig config) {
+ super(parent, Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Using_Dialog_Title"), CONTENT_WIDTH, CONTENT_HEIGHT);
+
+ this.currentTemplate = template;
+ this.themeListPane = new TemplateThemeListPane<>(false, config, null);
+
+ JPanel content = createContent();
+ UIButton openThemeManagerButton = createOpenThemeManagerButton();
+ UIButton usingCurrentThemeButton = createUsingCurrentThemeButton();
+ UIButton completeButton = createCompleteButton();
+
+ setContentPane(createDialogContentPane(content,
+ new UIButton[]{ openThemeManagerButton },
+ new UIButton[]{ usingCurrentThemeButton, completeButton }
+ ));
+
+ themeListPane.startListenThemeConfig();
+
+ resetEnableCurrentThemeButton(themeListPane.getSelectedTheme(), usingCurrentThemeButton);
+ themeListPane.setSelectedChangeListener(new ChangeListener() {
+ @Override
+ public void fireChanged(ChangeEvent event) {
+ resetEnableCurrentThemeButton(themeListPane.getSelectedTheme(), usingCurrentThemeButton);
+ }
+ });
+ }
+
+ private void resetEnableCurrentThemeButton(T selectedTheme, UIButton usingCurrentThemeButton) {
+ if (selectedTheme == null) {
+ usingCurrentThemeButton.setEnabled(false);
+ return;
+ }
+ String selectedThemeName = selectedTheme.getName();
+ if (StringUtils.isEmpty(selectedThemeName)) {
+ usingCurrentThemeButton.setEnabled(false);
+ return;
+ }
+
+ if (currentTemplate == null) {
+ usingCurrentThemeButton.setEnabled(false);
+ return;
+ }
+
+ TemplateTheme templateUsingTheme = currentTemplate.getTemplateTheme();
+ if (templateUsingTheme == null) {
+ usingCurrentThemeButton.setEnabled(true);
+ return;
+ }
+
+ String templateUsingThemeName = templateUsingTheme.getName();
+ if (StringUtils.isEmpty(templateUsingThemeName)) {
+ usingCurrentThemeButton.setEnabled(true);
+ return;
+ }
+
+ usingCurrentThemeButton.setEnabled(!StringUtils.equals(templateUsingThemeName, selectedTheme.getName()));
+ }
+
+ private JPanel createContent() {
+ JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ container.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10));
+
+ JPanel themeListPaneContainer = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ themeListPaneContainer.setBorder(new CompoundBorder(
+ BorderUtils.createTitleBorder(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Using_Dialog_Select"), 12),
+ BorderFactory.createEmptyBorder(0, 10, 0, 10)
+ ));
+ themeListPaneContainer.add(themeListPane, BorderLayout.CENTER);
+ container.add(themeListPaneContainer, BorderLayout.CENTER);
+
+ return container;
+ }
+
+ private UIButton createOpenThemeManagerButton() {
+ if (WorkContext.getCurrent().isRoot()) {
+ UIButton button = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Dialog_Title"));
+ button.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ TemplateThemeManageDialog dialog = new TemplateThemeManageDialog(TemplateThemeUsingDialog.this);
+ dialog.setVisible(true);
+ }
+ });
+ return button;
+ }
+ return null;
+ }
+
+ private UIButton createUsingCurrentThemeButton() {
+ UIButton button = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Using_Dialog_Use"));
+ button.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ apply2CurrentTemplate(button);
+ }
+ });
+ return button;
+ }
+
+ private UIButton createCompleteButton() {
+ UIButton button = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Using_Dialog_Complete"));
+ button.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ exit();
+ }
+ });
+ return button;
+ }
+
+ public void exit() {
+ themeListPane.stopListenThemeConfig();
+ themeListPane.stopAsyncFetchTheme();
+ super.exit();
+ }
+
+ private void apply2CurrentTemplate(UIButton usingCurrentThemeButton) {
+ TemplateTheme theme = themeListPane.getSelectedTheme();
+ if (theme != null) {
+ currentTemplate.setTemplateTheme(theme);
+ themeListPane.repaint();
+ usingCurrentThemeButton.setEnabled(false);
+ }
+ }
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/CellStyleListEditPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/CellStyleListEditPane.java
new file mode 100644
index 000000000..e0e42b8b4
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/CellStyleListEditPane.java
@@ -0,0 +1,294 @@
+package com.fr.design.mainframe.theme.edit;
+
+import com.fr.base.Style;
+import com.fr.base.theme.settings.ThemedCellStyle;
+import com.fr.base.theme.settings.ThemedCellStyleList;
+import com.fr.config.predefined.PredefinedCellStyle;
+import com.fr.design.actions.UpdateAction;
+import com.fr.design.beans.BasicBeanPane;
+import com.fr.design.dialog.FineJOptionPane;
+import com.fr.design.gui.NameInspector;
+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.controlpane.ShortCut4JControlPane;
+import com.fr.design.gui.controlpane.UnrepeatedNameHelper;
+import com.fr.design.gui.frpane.AttributeChangeListener;
+import com.fr.design.gui.ilist.DefaultListCellEditor;
+import com.fr.design.gui.ilist.JNameEdList;
+import com.fr.design.gui.ilist.ListModelElement;
+import com.fr.design.gui.ilist.ModNameActionListener;
+import com.fr.design.gui.itextfield.UITextField;
+import com.fr.design.gui.itoolbar.UIToolbar;
+import com.fr.design.icon.IconPathConstants;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.mainframe.theme.edit.cell.CellStyleEditPane;
+import com.fr.design.mainframe.theme.edit.cell.NoBorderPaneCellStyleEditPane;
+import com.fr.design.menu.ShortCut;
+import com.fr.general.ComparatorUtils;
+import com.fr.general.IOUtils;
+import com.fr.general.NameObject;
+import com.fr.stable.Nameable;
+import com.fr.stable.StringUtils;
+
+import javax.swing.BorderFactory;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static com.fr.design.i18n.Toolkit.i18nText;
+
+/**
+ * Created by kerry on 2020-09-27
+ */
+public class CellStyleListEditPane extends JListControlPane {
+ private boolean namePermitted = true;
+ private AttributeChangeListener attributeChangeListener;
+
+ public CellStyleListEditPane() {
+ super();
+ setBorder(BorderFactory.createEmptyBorder(10, 5, 10, 5));
+ addModNameActionListener(new ModNameActionListener() {
+ public void nameModed(int index, String oldName, String newName) {
+ if (ComparatorUtils.equals(oldName, newName) || ComparatorUtils.equals(newName, NameInspector.ILLEGAL_NAME_HOLDER)) {
+ return;
+ }
+ namePermitted = true;
+ String[] allNames = nameableList.getAllNames();
+ allNames[index] = StringUtils.EMPTY;
+ if (StringUtils.isEmpty(newName)) {
+ showTipDialogAndReset(i18nText("Fine-Design_Basic_Template_Theme_Edit_Pane_Cell_Style_Empty_Name_Tip"), index);
+ nameableList.setNameAt(oldName, index);
+ return;
+ }
+ if (isNameRepeated(new List[]{Arrays.asList(allNames)}, newName)) {
+ showTipDialogAndReset(i18nText("Fine-Design_Basic_Template_Theme_Edit_Pane_Cell_Style_Duplicated_Name_Tip", newName), index);
+ nameableList.setNameAt(oldName, index);
+ return;
+ }
+ populateSelectedValue();
+ }
+ });
+ }
+
+ public void registerAttrChangeListener(AttributeChangeListener listener){
+ this.attributeChangeListener = listener;
+ }
+
+
+ private void showTipDialogAndReset(String content, int index) {
+ nameableList.stopEditing();
+
+ FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(CellStyleListEditPane.this),
+ content,
+ i18nText("Fine-Design_Basic_Alert"),
+ JOptionPane.WARNING_MESSAGE);
+ setIllegalIndex(index);
+ namePermitted = false;
+ }
+
+ @Override
+ public NameableCreator[] createNameableCreators() {
+ return new NameableCreator[]{ new DefaultCellStyleNameObjectCreator(), new CellStyleNameObjectCreator() };
+ }
+
+ @Override
+ protected JNameEdList createJNameList() {
+ JNameEdList nameEdList = super.createJNameList();
+ nameEdList.setCellEditor(new DefaultListCellEditor(new UITextField()) {
+ @Override
+ public Component getListCellEditorComponent(JList list, Object value, boolean isSelected, int index) {
+ ListModelElement element = (ListModelElement) getModel().getElementAt(index);
+ if (element != null) {
+ NameObject selectNameObject = (NameObject) element.wrapper;
+ ThemedCellStyle cellStyle = (ThemedCellStyle) (selectNameObject.getObject());
+ if (!cellStyle.isRemovable()) {
+ return null;
+ }
+ }
+ return super.getListCellEditorComponent(list, value, isSelected, index);
+ }
+ });
+ return nameEdList;
+ }
+
+ @Override
+ public BasicBeanPane createPaneByCreators(NameableCreator creator) {
+ CellStyleEditPane stylePane = (CellStyleEditPane) super.createPaneByCreators(creator);
+ stylePane.registerAttrChangeListener(attributeChangeListener);
+ return stylePane;
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return StringUtils.EMPTY;
+ }
+
+ protected void initComponentPane() {
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ this.setCreators(this.createNameableCreators());
+ initCardPane();
+ JPanel leftPane = getLeftPane();
+ leftPane.setPreferredSize(new Dimension(90, 0));
+ cardPane.setPreferredSize(new Dimension(270, 0));
+ JPanel mainSplitPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ mainSplitPane.add(leftPane, BorderLayout.WEST);
+ mainSplitPane.add(cardPane, BorderLayout.CENTER);
+
+ this.add(mainSplitPane, BorderLayout.CENTER);
+ this.checkButtonEnabled();
+ }
+
+ @Override
+ protected void initToolBar() {
+ super.initToolBar();
+ UIToolbar toolbar = getToolBar();
+ toolbar.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
+ }
+
+ @Override
+ protected ShortCut4JControlPane[] createShortcuts() {
+ return new ShortCut4JControlPane[]{
+ createAddItemShortCut4JControlPane(),
+ new RemoveItemShortCut4JControlPane(new RemoveItemAction())
+ };
+ }
+
+ private ShortCut4JControlPane createAddItemShortCut4JControlPane (){
+ ShortCut shortCut = shortCutFactory.createAddItemUpdateAction(new NameableCreator[]{new CellStyleNameObjectCreator()});
+ return new AddItemShortCut4JControlPane(shortCut);
+ }
+
+ public void populateBean(ThemedCellStyleList ob) {
+ if (ob == null) {
+ return;
+ }
+
+ List nameObjectList = new ArrayList<>();
+
+ List cellStyleList = ob.getCellStyleList();
+ for (ThemedCellStyle cellStyle: cellStyleList) {
+ nameObjectList.add(new NameObject(cellStyle.getName(), cellStyle));
+ }
+
+ NameObject[] nameObjectArray = new NameObject[nameObjectList.size()];
+ nameObjectList.toArray(nameObjectArray);
+
+ populate(nameObjectArray);
+
+ }
+
+ public ThemedCellStyleList updateBean() {
+ Nameable[] nameables = this.update();
+ ThemedCellStyleList styleConfig = new ThemedCellStyleList();
+ for (Nameable nameable : nameables) {
+ ThemedCellStyle tmpStyle = (ThemedCellStyle) ((NameObject) nameable).getObject();
+ tmpStyle.setName(nameable.getName());
+ styleConfig.addThemedCellStyle(tmpStyle);
+ }
+ return styleConfig;
+ }
+
+ private static class AddItemShortCut4JControlPane extends ShortCut4JControlPane{
+ AddItemShortCut4JControlPane(ShortCut shortCut) {
+ this.shortCut = shortCut;
+ }
+
+ @Override
+ public void checkEnable() {
+ this.shortCut.setEnabled(true);
+ }
+ }
+
+ private class RemoveItemShortCut4JControlPane extends ShortCut4JControlPane {
+ RemoveItemShortCut4JControlPane(ShortCut shortCut) {
+ this.shortCut = shortCut;
+ }
+
+ @Override
+ public void checkEnable() {
+ ListModelElement selectModel = CellStyleListEditPane.this.getSelectedValue();
+ if (selectModel != null) {
+ NameObject selectNameObject = (NameObject) selectModel.wrapper;
+ ThemedCellStyle cellStyle = (ThemedCellStyle) (selectNameObject.getObject());
+ this.shortCut.setEnabled(cellStyle.isRemovable() && !cellStyle.isDefault4New());
+ } else {
+ this.shortCut.setEnabled(false);
+ }
+
+ }
+ }
+
+ private class RemoveItemAction extends UpdateAction {
+ RemoveItemAction() {
+ setName(i18nText(("Fine-Design_Basic_Action_Remove")));
+ setMnemonic('R');
+ setSmallIcon(IOUtils.readIcon(IconPathConstants.TD_REMOVE_ICON_PATH));
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent evt) {
+ CellStyleListEditPane.this.onRemoveItem();
+ }
+ }
+
+ private static class CellStyleNameObjectCreator extends NameObjectCreator {
+
+ public CellStyleNameObjectCreator() {
+ this(CellStyleEditPane.class);
+ }
+
+ public CellStyleNameObjectCreator(Class extends BasicBeanPane> updatePane) {
+ super(i18nText("Fine-Design_Predefined_Cell_New_Style"), ThemedCellStyle.class, updatePane);
+ }
+
+ @Override
+ public Nameable createNameable(UnrepeatedNameHelper helper) {
+ ThemedCellStyle cellStyle = new ThemedCellStyle();
+ cellStyle.setName(menuName);
+ cellStyle.setStyle(Style.getInstance());
+ cellStyle.setRemovable(true);
+ cellStyle.setImmutable(true);
+ cellStyle.setDefault4Absent(false);
+ cellStyle.setDefault4New(false);
+ return new NameObject(helper.createUnrepeatedName(this.menuName()), cellStyle);
+ }
+
+ @Override
+ public Object acceptObject2Populate(Object ob) {
+ if (ob instanceof NameObject) {
+ ob = ((NameObject) ob).getObject();
+ }
+ if (clazzOfObject != null && clazzOfObject.isInstance(ob) && acceptNameObject(ob)) {
+ doSthChanged4Icon(ob);
+ return ob;
+ }
+ return null;
+ }
+
+ public boolean acceptNameObject(Object ob) {
+ return !((ThemedCellStyle) ob).isDefault4New();
+ }
+ }
+
+ private static class DefaultCellStyleNameObjectCreator extends CellStyleNameObjectCreator {
+
+ public DefaultCellStyleNameObjectCreator() {
+ super(NoBorderPaneCellStyleEditPane.class);
+ }
+
+ @Override
+ public boolean acceptNameObject(Object ob) {
+ return ((ThemedCellStyle) ob).isDefault4New();
+ }
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ChartStyleEditPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ChartStyleEditPane.java
new file mode 100644
index 000000000..3830f02f1
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ChartStyleEditPane.java
@@ -0,0 +1,104 @@
+package com.fr.design.mainframe.theme.edit;
+
+import com.fr.base.theme.settings.ThemedChartStyle;
+import com.fr.design.dialog.BasicPane;
+import com.fr.design.dialog.MultiTabPane;
+import com.fr.design.mainframe.theme.edit.chart.ChartAxisStylePane;
+import com.fr.design.mainframe.theme.edit.chart.ChartDataSheetStylePane;
+import com.fr.design.mainframe.theme.edit.chart.ChartLabelStylePane;
+import com.fr.design.mainframe.theme.edit.chart.ChartLegendStylePane;
+import com.fr.design.mainframe.theme.edit.chart.ChartSeriesStylePane;
+import com.fr.design.mainframe.theme.edit.chart.ChartTitleAndBackgroundStylePane;
+
+import javax.swing.BorderFactory;
+import java.util.ArrayList;
+import java.util.List;
+import java.awt.Color;
+
+/**
+ * @author Bjorn
+ * @version 10.0
+ * Created by Bjorn on 2020-09-16
+ */
+public class ChartStyleEditPane extends MultiTabPane {
+
+ private ChartSeriesStylePane chartSeriesStylePane;
+ private ChartLegendStylePane chartLegendStylePane;
+ private ChartLabelStylePane chartLabelPane;
+ private ChartAxisStylePane chartAxisStylePane;
+ private ChartDataSheetStylePane chartDataSheetStylePane;
+ private ChartTitleAndBackgroundStylePane chartTitleAndBackgroundStylePane;
+
+ public ChartStyleEditPane() {
+ }
+
+ @Override
+ protected void initLayout() {
+ super.initLayout();
+ setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
+ }
+
+ @Override
+ protected List initPaneList() {
+ this.chartSeriesStylePane = new ChartSeriesStylePane();
+ this.chartLegendStylePane = new ChartLegendStylePane();
+ this.chartLabelPane = new ChartLabelStylePane();
+ this.chartAxisStylePane = new ChartAxisStylePane();
+ this.chartDataSheetStylePane = new ChartDataSheetStylePane();
+ this.chartTitleAndBackgroundStylePane = createChartTitleAndBackgroundStylePane();
+ paneList = new ArrayList<>();
+ paneList.add(this.chartSeriesStylePane);
+ paneList.add(this.chartLegendStylePane);
+ paneList.add(this.chartLabelPane);
+ paneList.add(this.chartAxisStylePane);
+ paneList.add(this.chartDataSheetStylePane);
+ paneList.add(this.chartTitleAndBackgroundStylePane);
+ return paneList;
+ }
+
+ protected ChartTitleAndBackgroundStylePane createChartTitleAndBackgroundStylePane() {
+ return new ChartTitleAndBackgroundStylePane();
+ }
+
+ @Override
+ public void populateBean(ThemedChartStyle ob) {
+ chartSeriesStylePane.populate(ob);
+ chartLegendStylePane.populate(ob);
+ chartLabelPane.populate(ob);
+ chartAxisStylePane.populate(ob);
+ chartDataSheetStylePane.populate(ob);
+ chartTitleAndBackgroundStylePane.populate(ob);
+ }
+
+ @Override
+ public void updateBean(ThemedChartStyle ob) {
+
+ }
+
+
+ @Override
+ public ThemedChartStyle updateBean() {
+ ThemedChartStyle chartStyle = new ThemedChartStyle();
+ chartSeriesStylePane.update(chartStyle);
+ chartLegendStylePane.update(chartStyle);
+ chartLabelPane.update(chartStyle);
+ chartAxisStylePane.update(chartStyle);
+ chartDataSheetStylePane.update(chartStyle);
+ chartTitleAndBackgroundStylePane.update(chartStyle);
+ return chartStyle;
+ }
+
+ public void populateGradientBar(List colors) {
+ chartSeriesStylePane.populateGradientBar(colors);
+ }
+
+ @Override
+ public boolean accept(Object ob) {
+ return false;
+ }
+
+ @Override
+ public void reset() {
+
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ChartStyleFormEditPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ChartStyleFormEditPane.java
new file mode 100644
index 000000000..f0886804d
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ChartStyleFormEditPane.java
@@ -0,0 +1,16 @@
+package com.fr.design.mainframe.theme.edit;
+
+import com.fr.design.mainframe.theme.edit.chart.ChartTitleAndBackgroundStyleFormPane;
+import com.fr.design.mainframe.theme.edit.chart.ChartTitleAndBackgroundStylePane;
+
+/**
+ * @author Bjorn
+ * @version 10.0
+ * Created by Bjorn on 2021-08-30
+ */
+public class ChartStyleFormEditPane extends ChartStyleEditPane {
+
+ protected ChartTitleAndBackgroundStylePane createChartTitleAndBackgroundStylePane() {
+ return new ChartTitleAndBackgroundStyleFormPane();
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ComponentStyleEditPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ComponentStyleEditPane.java
new file mode 100644
index 000000000..87a12a9dd
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ComponentStyleEditPane.java
@@ -0,0 +1,136 @@
+package com.fr.design.mainframe.theme.edit;
+
+import com.fr.base.theme.settings.ThemedComponentStyle;
+import com.fr.design.designer.IntervalConstants;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.gui.style.ComponentBodyStylePane;
+import com.fr.design.gui.style.ComponentIntegralStylePane;
+import com.fr.design.gui.style.ComponentTitleStylePane;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.mainframe.theme.edit.component.ComponentMarginStylePane;
+import com.fr.design.mainframe.theme.edit.ui.LabelUtils;
+import com.fr.design.mainframe.theme.edit.ui.TabbedPane;
+import com.fr.form.ui.LayoutBorderStyle;
+import com.fr.general.act.BorderPacker;
+
+import javax.swing.BorderFactory;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/12
+ */
+public class ComponentStyleEditPane extends JPanel {
+ public static final int LABEL_WIDTH = 60;
+ public static final int SETTING_WIDTH = 193;
+
+ private final ComponentTitleStylePane componentTitleStylePane;
+ private final ComponentBodyStylePane componentBodyStylePane;
+ private final ExtendedComponentIntegralStylePane componentIntegralStylePane;
+
+ public ComponentStyleEditPane() {
+ setLayout(FRGUIPaneFactory.createBorderLayout());
+ componentTitleStylePane = new ThemedComponentTitleStylePane(LABEL_WIDTH, SETTING_WIDTH);
+ componentBodyStylePane = new ComponentBodyStylePane(LABEL_WIDTH, SETTING_WIDTH);
+ componentIntegralStylePane = new ExtendedComponentIntegralStylePane();
+
+ JPanel content = new TabbedPane(
+ new String[] {
+ Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Edit_Pane_Component_Title"),
+ Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Edit_Pane_Component_Body"),
+ Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Edit_Pane_Component_Integral")
+ },
+ new JComponent[] { createTabContainer(componentTitleStylePane), createTabContainer(componentBodyStylePane), createTabContainer(componentIntegralStylePane) }
+ );
+ add(content, BorderLayout.NORTH);
+ }
+
+ public void populateBean(ThemedComponentStyle style) {
+ componentTitleStylePane.populateBean(style.getStyle());
+ componentBodyStylePane.populateBean(style.getStyle());
+ componentIntegralStylePane.populateBean(style);
+ }
+
+ public ThemedComponentStyle updateBean() {
+ ThemedComponentStyle style = new ThemedComponentStyle();
+
+ componentTitleStylePane.updateBean(style.getStyle());
+ componentBodyStylePane.updateBean(style.getStyle());
+ componentIntegralStylePane.updateBean(style);
+ return style;
+ }
+
+ private static class ExtendedComponentIntegralStylePane extends JPanel {
+ private final ComponentIntegralStylePane integralStylePane;
+ private final ComponentMarginStylePane marginStylePane;
+
+ public ExtendedComponentIntegralStylePane() {
+ setLayout(new BorderLayout(0, IntervalConstants.INTERVAL_L1));
+ integralStylePane = new ComponentIntegralStylePane(LABEL_WIDTH, SETTING_WIDTH);
+ marginStylePane = new ComponentMarginStylePane(LABEL_WIDTH, SETTING_WIDTH);
+
+ add(integralStylePane, BorderLayout.NORTH);
+ add(marginStylePane, BorderLayout.CENTER);
+ }
+
+ public void populateBean(ThemedComponentStyle style) {
+ integralStylePane.populateBean(style.getStyle());
+ marginStylePane.populate(style);
+ }
+
+ public void updateBean(ThemedComponentStyle style) {
+ integralStylePane.updateBean(style.getStyle());
+ marginStylePane.update(style);
+ }
+ }
+
+ private static class ThemedComponentTitleStylePane extends ComponentTitleStylePane {
+
+ public ThemedComponentTitleStylePane(int uiLabelWidth, int uiSettingWidth) {
+ super(uiLabelWidth, uiSettingWidth);
+ setSupportTitleVisible(false);
+ setSupportTitleContent(false);
+ setSupportOtherSetting(true);
+ }
+
+ @Override
+ public void populateBean(BorderPacker style) {
+ style.setType(LayoutBorderStyle.TITLE);
+ super.populateBean(style);
+ }
+
+ @Override
+ public void updateBean(BorderPacker style) {
+ super.updateBean(style);
+ style.setType(LayoutBorderStyle.TITLE);
+ }
+ }
+
+ private JComponent createTabContainer(final JComponent component) {
+ JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ container.setPreferredSize(new Dimension(container.getPreferredSize().width, 220));
+
+ JPanel tipLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ tipLabelPane.setBorder(BorderFactory.createEmptyBorder(3, 0, 0, 0));
+ UILabel tipLabel = LabelUtils.createLabel(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Edit_Pane_Component_Style_Tip"), new Color(153, 153, 153));
+ tipLabelPane.add(tipLabel);
+ container.add(tipLabelPane, BorderLayout.NORTH);
+
+ JScrollPane scrollPane = new JScrollPane(component);
+ scrollPane.setPreferredSize(new Dimension(container.getPreferredSize().width, 220));
+ scrollPane.setBorder(BorderFactory.createEmptyBorder());
+ scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
+
+ container.add(scrollPane, BorderLayout.CENTER);
+
+ return container;
+
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/FormBodyStyleEditPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/FormBodyStyleEditPane.java
new file mode 100644
index 000000000..1f2089e69
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/FormBodyStyleEditPane.java
@@ -0,0 +1,44 @@
+package com.fr.design.mainframe.theme.edit;
+
+import com.fr.base.theme.settings.ThemedFormBodyStyle;
+import com.fr.design.designer.IntervalConstants;
+import com.fr.design.gui.style.ComponentBodyStylePane;
+
+import javax.swing.BorderFactory;
+import javax.swing.JScrollPane;
+import javax.swing.ScrollPaneConstants;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/12
+ */
+public class FormBodyStyleEditPane extends JScrollPane {
+ public static final int LABEL_WIDTH = 60;
+ public static final int SETTING_WIDTH = 193;
+
+ private final ComponentBodyStylePane bodyStylePane;
+
+ public FormBodyStyleEditPane() {
+ bodyStylePane = new ComponentBodyStylePane(LABEL_WIDTH, SETTING_WIDTH);
+ bodyStylePane.setBorder(BorderFactory.createEmptyBorder(
+ IntervalConstants.INTERVAL_L1,
+ IntervalConstants.INTERVAL_L1,
+ IntervalConstants.INTERVAL_L1,
+ IntervalConstants.INTERVAL_L1
+ ));
+ setViewportView(bodyStylePane);
+ setBorder(BorderFactory.createEmptyBorder());
+ setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
+ }
+
+ public void populateBean(ThemedFormBodyStyle style) {
+ bodyStylePane.populateBean(style.getStyle());
+ }
+
+ public ThemedFormBodyStyle updateBean() {
+ ThemedFormBodyStyle formBodyStyle = new ThemedFormBodyStyle();
+ bodyStylePane.updateBean(formBodyStyle.getStyle());
+ return formBodyStyle;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ReportBodyStyleEditPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ReportBodyStyleEditPane.java
new file mode 100644
index 000000000..ec36c2970
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ReportBodyStyleEditPane.java
@@ -0,0 +1,65 @@
+package com.fr.design.mainframe.theme.edit;
+
+import com.fr.base.theme.settings.ThemedReportBodyStyle;
+import com.fr.design.designer.IntervalConstants;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.gui.style.ReportBackgroundSpecialPane;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.layout.TableLayout;
+import com.fr.design.layout.TableLayoutHelper;
+import com.fr.design.mainframe.predefined.ui.detail.background.BackgroundSettingPane;
+
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.SwingConstants;
+import java.awt.BorderLayout;
+import java.awt.Component;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/12
+ */
+public class ReportBodyStyleEditPane extends JScrollPane {
+ public static final int LABEL_WIDTH = 60;
+ public static final int SETTING_WIDTH = 193;
+
+ private final ReportBackgroundSpecialPane backgroundPane;
+
+ public ReportBodyStyleEditPane() {
+ backgroundPane = new ReportBackgroundSpecialPane();
+
+ double p = TableLayout.PREFERRED;
+
+ JPanel uiLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ uiLabelPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Report_Background_Fill")), BorderLayout.NORTH);
+ uiLabelPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
+ JPanel backgroundLabeledPane = TableLayoutHelper.createCommonTableLayoutPane(
+ new Component[][]{ new Component[] { uiLabelPane, backgroundPane } },
+ new double[] { p }, new double[] { LABEL_WIDTH, SETTING_WIDTH}, IntervalConstants.INTERVAL_L1
+ );
+ backgroundLabeledPane.setBorder(BorderFactory.createEmptyBorder(
+ IntervalConstants.INTERVAL_L1,
+ IntervalConstants.INTERVAL_L1,
+ IntervalConstants.INTERVAL_L1,
+ IntervalConstants.INTERVAL_L1
+ ));
+
+ setViewportView(backgroundLabeledPane);
+ setBorder(BorderFactory.createEmptyBorder());
+ setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
+ }
+
+ public void populateBean(ThemedReportBodyStyle style) {
+ backgroundPane.populateBean(style.getBackground());
+ }
+
+ public ThemedReportBodyStyle updateBean() {
+ ThemedReportBodyStyle style = new ThemedReportBodyStyle();
+ style.setBackground(backgroundPane.update());
+ return style;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/AbstractBackgroundDetailPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/AbstractBackgroundDetailPane.java
new file mode 100644
index 000000000..76f948ffd
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/AbstractBackgroundDetailPane.java
@@ -0,0 +1,51 @@
+package com.fr.design.mainframe.theme.edit.background;
+
+import com.fr.design.event.UIObserverListener;
+import com.fr.design.mainframe.backgroundpane.BackgroundQuickPane;
+import com.fr.general.Background;
+
+import javax.swing.event.ChangeListener;
+
+/**
+ * Created by kerry on 2020-09-14
+ */
+public abstract class AbstractBackgroundDetailPane extends BackgroundQuickPane {
+ @Override
+ public boolean accept(Background background) {
+ return false;
+ }
+
+ @Override
+ public void populateBean(Background background) {
+ this.populate((T) background);
+ }
+
+ @Override
+ public Background updateBean() {
+ return this.update();
+ }
+
+ @Override
+ public String title4PopupWindow() {
+ return null;
+ }
+
+ @Override
+ public void reset() {
+
+ }
+
+ @Override
+ public void registerChangeListener(UIObserverListener listener) {
+
+ }
+
+ public abstract void populate(T background);
+
+ public abstract T update();
+
+ public void addChangeListener(ChangeListener changeListener) {
+
+ }
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/BackgroundSettingPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/BackgroundSettingPane.java
new file mode 100644
index 000000000..667c60114
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/BackgroundSettingPane.java
@@ -0,0 +1,136 @@
+package com.fr.design.mainframe.theme.edit.background;
+
+import com.fr.design.beans.BasicBeanPane;
+import com.fr.design.event.UIObserverListener;
+import com.fr.design.gui.icombobox.UIComboBox;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.layout.TableLayoutHelper;
+import com.fr.design.mainframe.backgroundpane.BackgroundQuickPane;
+import com.fr.general.Background;
+import com.fr.log.FineLoggerFactory;
+
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import javax.swing.event.ChangeListener;
+import java.awt.BorderLayout;
+import java.awt.CardLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.util.ArrayList;
+
+/**
+ * Created by kerry on 2020-09-02
+ */
+public class BackgroundSettingPane extends BasicBeanPane {
+ private ChangeListener changeListener = null;
+ private UIComboBox headCombobox;
+ private BackgroundQuickPane[] paneList;
+
+ public BackgroundSettingPane() {
+ init();
+ }
+
+ private void init() {
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ this.add(createComboHeadPane(), BorderLayout.NORTH);
+ CardLayout cardlayout = new CardLayout();
+ paneList = supportKindsOfBackgroundUI();
+ final JPanel centerPane = new JPanel(cardlayout) {
+ @Override
+ public Dimension getPreferredSize() {// AUGUST:使用当前面板的的高度
+ int index = headCombobox.getSelectedIndex();
+ return new Dimension(super.getPreferredSize().width, paneList[index].getPreferredSize().height);
+ }
+ };
+ centerPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0));
+ for (BackgroundQuickPane pane : paneList) {
+ headCombobox.addItem(pane.title4PopupWindow());
+ centerPane.add(pane, pane.title4PopupWindow());
+ }
+ headCombobox.addItemListener(new ItemListener() {
+ @Override
+ public void itemStateChanged(ItemEvent e) {
+ cardlayout.show(centerPane, (String) headCombobox.getSelectedItem());
+ }
+ });
+ this.add(centerPane, BorderLayout.CENTER);
+ }
+
+ public void addChangeListener(ChangeListener changeListener) {
+ this.changeListener = changeListener;
+ }
+
+
+ private JPanel createComboHeadPane() {
+ headCombobox = new UIComboBox();
+
+ JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane(
+ new Component[][]{new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Report_Fill")), headCombobox}},
+ TableLayoutHelper.FILL_NONE, 33, 5);
+ headCombobox.setPreferredSize(new Dimension(160, 20));
+ jPanel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
+ return jPanel;
+ }
+
+ protected BackgroundQuickPane[] supportKindsOfBackgroundUI() {
+ java.util.List kinds = new ArrayList<>();
+ kinds.add(new EmptyBackgroundPane());
+ kinds.add(new ColorDetailPane());
+ kinds.add(new TextureDetailObservePane());
+ kinds.add(new PatternDetailPane());
+ kinds.add(createImageSelectPane());
+ kinds.add(new GradientDetailPane());
+ return kinds.toArray(new BackgroundQuickPane[kinds.size()]);
+ }
+
+ protected ImageDetailPane createImageSelectPane() {
+ ImageDetailPane imageDetailPane = new ImageDetailPane();
+ imageDetailPane.registerChangeListener(new UIObserverListener() {
+ @Override
+ public void doChange() {
+ fireChangeListener();
+ }
+ });
+ return imageDetailPane;
+ }
+
+ protected void fireChangeListener() {
+ if (changeListener != null) {
+ changeListener.stateChanged(null);
+ }
+ }
+
+
+ @Override
+ public void populateBean(Background background) {
+ for (int i = 0; i < paneList.length; i++) {
+ BackgroundQuickPane pane = paneList[i];
+ if (pane.accept(background)) {
+ pane.populateBean(background);
+ headCombobox.setSelectedIndex(i);
+ return;
+ }
+ }
+ }
+
+ @Override
+ public Background updateBean() {
+ int selectIndex = this.headCombobox.getSelectedIndex();
+ try {
+ return paneList[selectIndex].updateBean();
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ return null;
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return null;
+ }
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/ColorDetailPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/ColorDetailPane.java
new file mode 100644
index 000000000..12eea2c52
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/ColorDetailPane.java
@@ -0,0 +1,105 @@
+package com.fr.design.mainframe.theme.edit.background;
+
+import com.fr.base.background.ColorBackground;
+import com.fr.design.event.UIObserver;
+import com.fr.design.event.UIObserverListener;
+import com.fr.design.gui.ibutton.UIButton;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.layout.TableLayoutHelper;
+import com.fr.design.style.color.ColorSelectPane;
+import com.fr.general.Background;
+
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+
+/**
+ * Created by kerry on 2020-08-31
+ */
+public class ColorDetailPane extends AbstractBackgroundDetailPane {
+ public static final String SPACE_4 = " ";
+ private ColorBackgroundSelectPane selectPane;
+
+
+ public ColorDetailPane() {
+ this.selectPane = new ColorBackgroundSelectPane();
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ this.add(this.selectPane, BorderLayout.CENTER);
+ }
+
+ @Override
+ public void populate(ColorBackground background) {
+ this.selectPane.setColor(background.getColor());
+ }
+
+ @Override
+ public ColorBackground update() {
+ return ColorBackground.getInstance(selectPane.getColor());
+ }
+
+ public String title4PopupWindow() {
+ return Toolkit.i18nText("Fine-Design_Basic_Color");
+ }
+
+ @Override
+ public boolean accept(Background background) {
+ return background instanceof ColorBackground;
+ }
+
+ class ColorBackgroundSelectPane extends ColorSelectPane implements UIObserver {
+ protected UIObserverListener uiObserverListener;
+
+ protected void initialCompents(boolean isSupportTransparent) {
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ this.setBorder(BorderFactory.createEmptyBorder());
+ if (isSupportTransparent) {
+ this.add(createNorthPane(), BorderLayout.NORTH);
+ }
+ JPanel centerPane = createCenterPane();
+ this.add(centerPane, BorderLayout.CENTER);
+ this.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ if (uiObserverListener != null) {
+ uiObserverListener.doChange();
+ }
+ }
+ });
+ }
+
+ private JPanel createNorthPane() {
+ UIButton transpanrentBtn = new UIButton();
+ transpanrentBtn.setPreferredSize(new Dimension(160, 20));
+ JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane(
+ new Component[][]{new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Background_Color")),
+ transpanrentBtn}}, TableLayoutHelper.FILL_NONE, 33, 5);
+ jPanel.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 10));
+ return jPanel;
+ }
+
+ protected JPanel createCenterPane() {
+ JPanel centerPane = new JPanel();
+
+ JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane(
+ new Component[][]{new Component[]{new UILabel(SPACE_4), centerPane}}, TableLayoutHelper.FILL_NONE, 33, 5);
+ jPanel.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 10));
+ return jPanel;
+ }
+
+ @Override
+ public void registerChangeListener(UIObserverListener listener) {
+ this.uiObserverListener = listener;
+ }
+
+ @Override
+ public boolean shouldResponseChangeListener() {
+ return true;
+ }
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/EmptyBackgroundPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/EmptyBackgroundPane.java
new file mode 100644
index 000000000..b7b345c63
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/EmptyBackgroundPane.java
@@ -0,0 +1,35 @@
+package com.fr.design.mainframe.theme.edit.background;
+
+import com.fr.design.i18n.Toolkit;
+import com.fr.general.Background;
+
+/**
+ * Created by kerry on 2020-09-01
+ */
+public class EmptyBackgroundPane extends AbstractBackgroundDetailPane {
+
+ @Override
+ public void populate(Background background) {
+
+ }
+
+ @Override
+ public Background update() {
+ return null;
+ }
+
+ /**
+ * 名称
+ *
+ * @return 名称
+ */
+ public String title4PopupWindow() {
+ return Toolkit.i18nText("Fine-Design_Basic_Background_Null");
+ }
+
+ public boolean accept(Background background) {
+ return background == null;
+ }
+
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/GradientDetailPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/GradientDetailPane.java
new file mode 100644
index 000000000..042e8d4d3
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/GradientDetailPane.java
@@ -0,0 +1,160 @@
+package com.fr.design.mainframe.theme.edit.background;
+
+import com.fr.base.background.GradientBackground;
+import com.fr.design.designer.IntervalConstants;
+import com.fr.design.event.UIObserver;
+import com.fr.design.event.UIObserverListener;
+import com.fr.design.gui.ibutton.UIRadioButton;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.layout.TableLayoutHelper;
+import com.fr.design.style.background.gradient.GradientBar;
+import com.fr.general.Background;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JPanel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+/**
+ * 渐变色的面板,不是很pp,面板应用显得繁琐,有写可以写成控件类型,比如色彩选择的。。,可以做得花哨点
+ *
+ * @author ben
+ */
+public class GradientDetailPane extends AbstractBackgroundDetailPane implements UIObserver {
+ private static final long serialVersionUID = -6854603990673031897L;
+ private UIObserverListener listener;
+ private UIRadioButton left2right, top2bottom;
+ private GradientBar gradientBar;
+ private ChangeListener changeListener = null;
+
+ public GradientDetailPane() {
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+
+ JPanel gradientPanel = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ JPanel blankJp = new JPanel();
+ gradientBar = new GradientBar(4, 140);
+ blankJp.add(gradientBar);
+
+ gradientPanel.add(gradientBar, BorderLayout.SOUTH);
+
+ JPanel jp = new JPanel(new GridLayout(2, 1, 15, 10));
+
+
+ left2right = new UIRadioButton(Toolkit.i18nText("Fine-Design_Basic_Page_Setup_Horizontal"));
+ jp.add(left2right);
+ left2right.setSelected(true);
+ left2right.addActionListener(reviewListener);
+
+ top2bottom = new UIRadioButton(Toolkit.i18nText("Fine-Design_Basic_Page_Setup_Vertical"));
+ jp.add(top2bottom);
+ top2bottom.addActionListener(reviewListener);
+
+ ButtonGroup toggle = new ButtonGroup();
+ toggle.add(left2right);
+ toggle.add(top2bottom);
+
+ Component[][] components = new Component[][]{
+ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Background_Gradient_Setting")), gradientPanel},
+ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Background_Gradient_Color")), jp}
+ };
+ JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_LASTCOLUMN,
+ IntervalConstants.INTERVAL_W4, IntervalConstants.INTERVAL_L1);
+ this.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ if (listener != null) {
+ listener.doChange();
+ }
+ }
+ });
+
+
+ this.add(contentPane);
+ }
+
+ @Override
+ public boolean accept(Background background) {
+ return background instanceof GradientBackground;
+ }
+
+
+
+ public void populate(GradientBackground bg) {
+ this.gradientBar.getSelectColorPointBtnP1().setColorInner(bg.getStartColor());
+ this.gradientBar.getSelectColorPointBtnP2().setColorInner(bg.getEndColor());
+ if (bg.getDirection() == GradientBackground.LEFT2RIGHT) {
+ left2right.setSelected(true);
+ } else {
+ top2bottom.setSelected(true);
+ }
+ if (bg.isUseCell()) {
+ return;
+ }
+ double startValue = (double) bg.getBeginPlace();
+ double endValue = (double) bg.getFinishPlace();
+ gradientBar.setStartValue(startValue);
+ gradientBar.setEndValue(endValue);
+ this.gradientBar.repaint();
+ }
+
+ public GradientBackground update() {
+ GradientBackground gb = new GradientBackground(
+ gradientBar.getSelectColorPointBtnP1().getColorInner(),
+ gradientBar.getSelectColorPointBtnP2().getColorInner());
+ if (left2right.isSelected()) {
+ gb.setDirection(GradientBackground.LEFT2RIGHT);
+ } else {
+ gb.setDirection(GradientBackground.TOP2BOTTOM);
+ }
+ if (gradientBar.isOriginalPlace()) {
+ gb.setUseCell(true);
+ } else {
+ gb.setUseCell(false);
+ gb.setBeginPlace((float) gradientBar.getStartValue());
+ gb.setFinishPlace((float) gradientBar.getEndValue());
+ }
+ return gb;
+ }
+
+
+ ActionListener reviewListener = new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ fireChagneListener();
+ }
+ };
+
+ public void addChangeListener(ChangeListener changeListener) {
+ this.changeListener = changeListener;
+ gradientBar.addChangeListener(changeListener);
+ }
+
+ public void fireChagneListener() {
+ if (this.changeListener != null) {
+ ChangeEvent evt = new ChangeEvent(this);
+ this.changeListener.stateChanged(evt);
+ }
+ }
+
+ @Override
+ public void registerChangeListener(UIObserverListener listener) {
+ this.listener = listener;
+ }
+
+ @Override
+ public boolean shouldResponseChangeListener() {
+ return true;
+ }
+
+ @Override
+ public String title4PopupWindow() {
+ return Toolkit.i18nText("Fine-Design_Basic_Gradient_Color");
+ }
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/ImageDetailPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/ImageDetailPane.java
new file mode 100644
index 000000000..208c21045
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/ImageDetailPane.java
@@ -0,0 +1,216 @@
+package com.fr.design.mainframe.theme.edit.background;
+
+import com.fr.base.Style;
+import com.fr.base.background.ImageBackground;
+import com.fr.base.background.ImageFileBackground;
+import com.fr.design.designer.IntervalConstants;
+import com.fr.design.event.UIObserver;
+import com.fr.design.event.UIObserverListener;
+import com.fr.design.gui.frpane.ImgChooseWrapper;
+import com.fr.design.gui.ibutton.UIButton;
+import com.fr.design.gui.ibutton.UIRadioButton;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.layout.TableLayoutHelper;
+import com.fr.design.style.background.image.ImageFileChooser;
+import com.fr.design.style.background.image.ImagePreviewPane;
+import com.fr.general.Background;
+import com.fr.stable.Constants;
+
+import javax.swing.BorderFactory;
+import javax.swing.ButtonGroup;
+import javax.swing.JPanel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+/**
+ * Image background pane.
+ */
+public class ImageDetailPane extends AbstractBackgroundDetailPane implements UIObserver {
+ private UIObserverListener listener;
+ protected ImagePreviewPane previewPane = null;
+ private Style imageStyle = null;
+ private ChangeListener changeListener = null;
+ private ImageFileChooser imageFileChooser = null;
+
+ private UIRadioButton defaultRadioButton = null;
+ private UIRadioButton tiledRadioButton = null;
+ private UIRadioButton extendRadioButton = null;
+ private UIRadioButton adjustRadioButton = null;
+
+
+ public ImageDetailPane() {
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ this.add(initSelectFilePane(), BorderLayout.CENTER);
+ imageFileChooser = new ImageFileChooser();
+ imageFileChooser.setMultiSelectionEnabled(false);
+ previewPane = new ImagePreviewPane();
+ this.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ if (listener != null) {
+ listener.doChange();
+ }
+ }
+ });
+ }
+
+ public JPanel initSelectFilePane() {
+ JPanel selectFilePane = FRGUIPaneFactory.createBorderLayout_L_Pane();
+ selectFilePane.setBorder(BorderFactory.createEmptyBorder());
+ UIButton selectPictureButton = new UIButton(
+ Toolkit.i18nText("Fine-Design_Basic_Background_Image_Select"));
+ selectPictureButton.setMnemonic('S');
+ selectPictureButton.addActionListener(selectPictureActionListener);
+ selectPictureButton.setPreferredSize(new Dimension(160, 20));
+ //布局
+ defaultRadioButton = new UIRadioButton(Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Layout_Default"));
+ tiledRadioButton = new UIRadioButton(Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Layout_Image_Titled"));
+ extendRadioButton = new UIRadioButton(Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Layout_Image_Extend"));
+ adjustRadioButton = new UIRadioButton(Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Layout_Image_Adjust"));
+
+ defaultRadioButton.addActionListener(layoutActionListener);
+ tiledRadioButton.addActionListener(layoutActionListener);
+ extendRadioButton.addActionListener(layoutActionListener);
+ adjustRadioButton.addActionListener(layoutActionListener);
+
+ JPanel jp = new JPanel(new GridLayout(4, 1, 15, 10));
+ for (UIRadioButton button : imageLayoutButtons()) {
+ jp.add(button);
+ }
+
+ ButtonGroup layoutBG = new ButtonGroup();
+ layoutBG.add(defaultRadioButton);
+ layoutBG.add(tiledRadioButton);
+ layoutBG.add(extendRadioButton);
+ layoutBG.add(adjustRadioButton);
+
+ defaultRadioButton.setSelected(true);
+
+ Component[][] components = new Component[][]{
+ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Background_Image")), selectPictureButton},
+ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Background_Fill_Mode")), jp}
+ };
+ JPanel centerPane = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_NONE,
+ IntervalConstants.INTERVAL_L4, IntervalConstants.INTERVAL_L1);
+ selectFilePane.add(centerPane, BorderLayout.CENTER);
+ return selectFilePane;
+ }
+
+ protected UIRadioButton[] imageLayoutButtons() {
+ return new UIRadioButton[]{
+ defaultRadioButton,
+ tiledRadioButton,
+ extendRadioButton,
+ adjustRadioButton
+ };
+ }
+
+ @Override
+ public boolean accept(Background background) {
+ return background instanceof ImageBackground;
+ }
+
+
+ /**
+ * Select picture.
+ */
+ ActionListener selectPictureActionListener = new ActionListener() {
+
+ public void actionPerformed(ActionEvent evt) {
+ int returnVal = imageFileChooser.showOpenDialog(ImageDetailPane.this);
+ setImageStyle();
+ ImgChooseWrapper.getInstance(previewPane, imageFileChooser, imageStyle, changeListener).dealWithImageFile(returnVal);
+ }
+ };
+
+ protected void setImageStyle() {
+ if (tiledRadioButton.isSelected()) {
+ imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_TILED);
+ } else if (adjustRadioButton.isSelected()) {
+ imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_ADJUST);
+ } else if (extendRadioButton.isSelected()) {
+ imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_EXTEND);
+ } else {
+ imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_CENTER);
+ }
+ }
+
+ ActionListener layoutActionListener = new ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent evt) {
+ setImageStyle();
+ changeImageStyle();
+ }
+
+ private void changeImageStyle() {
+ previewPane.setImageStyle(ImageDetailPane.this.imageStyle);
+ previewPane.repaint();
+ }
+ };
+
+ @Override
+ public void populate(ImageBackground imageBackground) {
+ if (imageBackground.getLayout() == Constants.IMAGE_CENTER) {
+ defaultRadioButton.setSelected(true);
+ imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_CENTER);
+ } else if (imageBackground.getLayout() == Constants.IMAGE_EXTEND) {
+ extendRadioButton.setSelected(true);
+ imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_EXTEND);
+ } else if (imageBackground.getLayout() == Constants.IMAGE_ADJUST) {
+ adjustRadioButton.setSelected(true);
+ imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_ADJUST);
+ } else {
+ tiledRadioButton.setSelected(true);
+ imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_TILED);
+ }
+ previewPane.setImageStyle(ImageDetailPane.this.imageStyle);
+ if (imageBackground.getImage() != null) {
+ previewPane.setImageWithSuffix(imageBackground.getImageWithSuffix());
+ previewPane.setImage(imageBackground.getImage());
+ }
+
+ fireChagneListener();
+ }
+
+ @Override
+ public ImageBackground update() {
+ ImageBackground imageBackground = new ImageFileBackground(previewPane.getImageWithSuffix());
+ setImageStyle();
+ imageBackground.setLayout(imageStyle.getImageLayout());
+ return imageBackground;
+ }
+
+ @Override
+ public void addChangeListener(ChangeListener changeListener) {
+ this.changeListener = changeListener;
+ }
+
+ private void fireChagneListener() {
+ if (this.changeListener != null) {
+ ChangeEvent evt = new ChangeEvent(this);
+ this.changeListener.stateChanged(evt);
+ }
+ }
+
+ @Override
+ public void registerChangeListener(UIObserverListener listener) {
+ this.listener = listener;
+ }
+
+
+ @Override
+ public String title4PopupWindow() {
+ return Toolkit.i18nText("Fine-Design_Basic_Background_Image");
+ }
+
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/PatternDetailPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/PatternDetailPane.java
new file mode 100644
index 000000000..7d5ee66a7
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/PatternDetailPane.java
@@ -0,0 +1,120 @@
+package com.fr.design.mainframe.theme.edit.background;
+
+import com.fr.base.background.PatternBackground;
+import com.fr.design.designer.IntervalConstants;
+import com.fr.design.event.UIObserver;
+import com.fr.design.event.UIObserverListener;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.layout.TableLayoutHelper;
+import com.fr.design.style.background.impl.PatternBackgroundPane;
+import com.fr.design.style.color.ColorSelectBox;
+import com.fr.general.Background;
+import com.fr.log.FineLoggerFactory;
+
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import javax.swing.SwingConstants;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.GridLayout;
+import java.awt.LayoutManager;
+
+/**
+ * Created by kerry on 2020-08-31
+ */
+public class PatternDetailPane extends AbstractBackgroundDetailPane implements UIObserver {
+
+ private UIObserverListener listener;
+ private PatternNewBackgroundPane patternNewBackgroundPane;
+
+ public PatternDetailPane() {
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ patternNewBackgroundPane = new PatternNewBackgroundPane(6);
+ this.add(patternNewBackgroundPane, BorderLayout.CENTER);
+ }
+
+ @Override
+ public void registerChangeListener(UIObserverListener listener) {
+ this.listener = listener;
+ }
+
+ @Override
+ public void populate(PatternBackground background) {
+ this.patternNewBackgroundPane.populate(background);
+ }
+
+ @Override
+ public PatternBackground update() {
+ try {
+ return (PatternBackground) this.patternNewBackgroundPane.update();
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ return null;
+ }
+ @Override
+ public String title4PopupWindow() {
+ return Toolkit.i18nText("Fine-Design_Basic_Background_Pattern");
+ }
+
+
+ @Override
+ public boolean accept(Background background) {
+ return background instanceof PatternBackground;
+ }
+
+
+ @Override
+ public boolean shouldResponseChangeListener() {
+ return true;
+ }
+
+ class PatternNewBackgroundPane extends PatternBackgroundPane {
+ private PatternNewBackgroundPane(int nColumn) {
+ super(nColumn);
+ }
+
+ protected LayoutManager layoutOfTypePane(int nColumn) {
+ return new GridLayout(0, nColumn, 2, 2);
+ }
+
+ protected void initComponents(int nColumn) {
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ this.setBorder(BorderFactory.createEmptyBorder());
+ JPanel jPanel = new JPanel();
+ jPanel.setLayout(layoutOfTypePane(nColumn));
+ setChildrenOfTypePane(jPanel);
+
+ foregroundColorPane = new ColorSelectBox(80);
+ backgroundColorPane = new ColorSelectBox(80);
+ foregroundColorPane.setSelectObject(Color.lightGray);
+ backgroundColorPane.setSelectObject(Color.black);
+ UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Background_Pattern"));
+ label.setVerticalAlignment(SwingConstants.TOP);
+ Component[][] components = new Component[][]{
+ new Component[]{label, jPanel},
+ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Background_ForeBackground_Color")), foregroundColorPane},
+ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Background_Pattern_Color")), backgroundColorPane}
+ };
+ JPanel centerPane = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_LASTCOLUMN,
+ IntervalConstants.INTERVAL_W4, IntervalConstants.INTERVAL_L1);
+ JPanel jPanel1 = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane();
+ jPanel1.add(centerPane);
+ jPanel1.setBorder(BorderFactory.createEmptyBorder());
+ this.add(jPanel1, BorderLayout.NORTH);
+ this.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ if (listener != null) {
+ listener.doChange();
+ }
+ }
+ });
+ }
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/TextureDetailObservePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/TextureDetailObservePane.java
new file mode 100644
index 000000000..a1d0fcb2c
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/background/TextureDetailObservePane.java
@@ -0,0 +1,98 @@
+package com.fr.design.mainframe.theme.edit.background;
+
+import com.fr.base.background.TextureBackground;
+import com.fr.design.event.UIObserver;
+import com.fr.design.event.UIObserverListener;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.layout.TableLayoutHelper;
+import com.fr.design.style.background.texture.TextureDetailPane;
+import com.fr.general.Background;
+import com.fr.log.FineLoggerFactory;
+
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import javax.swing.SwingConstants;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+
+/**
+ * Created by kerry on 2020-09-02
+ */
+public class TextureDetailObservePane extends AbstractBackgroundDetailPane implements UIObserver {
+ private TextureDetailPane detailPane;
+
+ private UIObserverListener listener;
+
+ public TextureDetailObservePane() {
+
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ detailPane = TextureDetailPane.createMiniTextureDetailPane(6);
+
+ detailPane.setPreferredSize(new Dimension(160, 108));
+ UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Background_Texture"));
+ label.setPreferredSize(new Dimension(24, 108));
+ label.setVerticalAlignment(SwingConstants.TOP);
+ JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane(
+ new Component[][]{new Component[]{label, detailPane}}, TableLayoutHelper.FILL_LASTCOLUMN, 33, 5);
+ jPanel.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 10));
+
+
+ detailPane.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ if (listener != null) {
+ listener.doChange();
+ }
+ }
+ });
+ this.add(jPanel, BorderLayout.CENTER);
+ }
+
+ @Override
+ public void registerChangeListener(UIObserverListener listener) {
+ this.listener = listener;
+
+ }
+
+ @Override
+ public boolean shouldResponseChangeListener() {
+ return true;
+ }
+
+ @Override
+ public void populate(TextureBackground background) {
+ this.detailPane.populate(background);
+ }
+
+ @Override
+ public TextureBackground update() {
+ try {
+ return (TextureBackground) this.detailPane.update();
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ return null;
+ }
+
+
+ @Override
+ public String title4PopupWindow() {
+ return Toolkit.i18nText("Fine-Design_Basic_Background_Texture");
+ }
+
+ @Override
+ public boolean accept(Background background) {
+ return background instanceof TextureBackground;
+ }
+
+
+ @Override
+ public void addChangeListener(ChangeListener changeListener) {
+
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java
new file mode 100644
index 000000000..a2991a89f
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java
@@ -0,0 +1,198 @@
+package com.fr.design.mainframe.theme.edit.cell;
+
+import com.fr.base.ScreenResolution;
+import com.fr.base.Style;
+import com.fr.base.theme.settings.ThemedCellStyle;
+import com.fr.design.constants.UIConstants;
+import com.fr.design.dialog.AttrScrollPane;
+import com.fr.design.dialog.BasicPane;
+import com.fr.design.dialog.BasicScrollPane;
+import com.fr.design.dialog.MultiTabPane;
+import com.fr.design.gui.frpane.AbstractAttrNoScrollPane;
+import com.fr.design.gui.frpane.AttributeChangeListener;
+import com.fr.design.gui.style.AbstractBasicStylePane;
+import com.fr.design.gui.style.AlignmentPane;
+import com.fr.design.gui.style.BorderPane;
+import com.fr.design.gui.style.FormatPane;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.mainframe.theme.ui.BorderUtils;
+
+import javax.swing.BorderFactory;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.GridLayout;
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.fr.design.i18n.Toolkit.i18nText;
+
+
+/**
+ * 哎,复杂的原型图导致复杂的画法。非我所愿也
+ *
+ * @author zhou
+ * @since 2012-5-24上午10:36:10
+ */
+public class CellStyleEditPane extends MultiTabPane {
+ private ThemedCellStyle cellStyle;
+ private PreviewArea previewArea;
+ private boolean populating;
+ private AttributeChangeListener attributeChangeListener;
+
+ public CellStyleEditPane() {
+ super();
+ tabPane.setOneLineTab(true);
+ tabPane.setDrawLine(false);
+ tabPane.setBorder(BorderFactory.createLineBorder(UIConstants.SHADOW_GREY));
+ tabPane.setLayout(new GridLayout(1, 3, 0, 0));
+ }
+
+
+
+ public void registerAttrChangeListener(AttributeChangeListener listener){
+ this.attributeChangeListener = listener;
+ }
+
+ private void fireAttrChangeListener() {
+ if (this.attributeChangeListener != null) {
+ this.attributeChangeListener.attributeChange();
+ }
+ }
+
+ public String title4PopupWindow() {
+ return i18nText("Fine-Design_Report_Custom_Style");
+ }
+
+ public void reset() {
+ populateBean(null);
+ }
+
+ @Override
+ public void populateBean(ThemedCellStyle ob) {
+ this.populating = true;
+ this.cellStyle = ob;
+
+ for (BasicPane basicPane : paneList) {
+ ((AbstractBasicStylePane) basicPane).populateBean(ob.getStyle());
+ previewArea.preview(ob.getStyle());
+ }
+ this.populating = false;
+ }
+
+ @Override
+ public ThemedCellStyle updateBean() {
+ AbstractBasicStylePane basicStylePane = (AbstractBasicStylePane) paneList.get(tabPane.getSelectedIndex());
+ this.cellStyle.setStyle(basicStylePane.update(this.cellStyle.getStyle()));
+ return this.cellStyle;
+ }
+
+ @Override
+ public boolean accept(Object ob) {
+ return ob instanceof ThemedCellStyle;
+ }
+
+ @Override
+ protected List initPaneList() {
+ paneList = new ArrayList<>();
+ paneList.add(new FormatPane());
+ paneList.add(new BorderPane());
+ paneList.add(new AlignmentPane());
+ return paneList;
+ }
+
+ @Override
+ protected void initLayout() {
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+
+ JPanel jPanel = new JPanel();
+ jPanel.setLayout(new BorderLayout(0, 4));
+
+ JPanel previewPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ previewArea = new PreviewArea();
+ previewPane.setBorder(BorderUtils.createTitleBorder(i18nText("Fine-Design_Basic_Preview")));
+ previewPane.add(previewArea, BorderLayout.CENTER);
+
+ this.add(previewPane, BorderLayout.NORTH);
+
+ this.add(jPanel, BorderLayout.CENTER);
+ jPanel.add(tabPane, BorderLayout.NORTH);
+ JPanel attrListenerPane = new AbstractAttrNoScrollPane() {
+
+ @Override
+ protected void initContentPane() {
+ leftContentPane = createContentPane();
+ this.add(leftContentPane, BorderLayout.CENTER);
+ }
+
+ @Override
+ protected JPanel createContentPane() {
+ this.addAttributeChangeListener(new AttributeChangeListener() {
+ @Override
+ public void attributeChange() {
+ if (populating) {
+ return;
+ }
+ ThemedCellStyle cellStyle = updateBean();
+ if (cellStyle != null) {
+ previewArea.preview(cellStyle.getStyle());
+ }
+ fireAttrChangeListener();
+ }
+ });
+ BasicScrollPane basicScrollPane = new AttrScrollPane() {
+ @Override
+ protected JPanel createContentPane() {
+ return centerPane;
+ }
+ };
+ return basicScrollPane;
+ }
+ };
+ jPanel.add(attrListenerPane, BorderLayout.CENTER);
+ }
+
+ @Override
+ public void updateBean(ThemedCellStyle ob) {}
+
+ private static class PreviewArea extends JComponent {
+
+ private static final String paintText = "Report";
+ private Style style = Style.DEFAULT_STYLE;
+
+ public PreviewArea() {
+ setPreferredSize(new Dimension(223, 30));
+ }
+
+ public void preview(Style style) {
+ this.style = style;
+ repaint();
+ }
+
+ @Override
+ public void paintComponent(Graphics g) {
+ Graphics2D g2d = (Graphics2D) g;
+ int resolution = ScreenResolution.getScreenResolution();
+
+ if (style == Style.DEFAULT_STYLE) {
+ // 如果是默认的style,就只写"Report"上去
+ Style.paintContent(g2d, paintText, style, getWidth() - 3, getHeight() - 3, resolution);
+ return;
+ }
+
+ Style.paintBackground(g2d, style, getWidth() - 3, getHeight() - 3);
+
+ Style.paintContent(g2d, paintText, style, getWidth() - 3, getHeight() - 3, resolution);
+
+ Style.paintBorder(g2d, style, getWidth() - 3, getHeight() - 3);
+ }
+
+ @Override
+ public Dimension getMinimumSize() {
+ return getPreferredSize();
+ }
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/NoBorderPaneCellStyleEditPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/NoBorderPaneCellStyleEditPane.java
new file mode 100644
index 000000000..7104572da
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/NoBorderPaneCellStyleEditPane.java
@@ -0,0 +1,19 @@
+package com.fr.design.mainframe.theme.edit.cell;
+
+import com.fr.design.dialog.BasicPane;
+import com.fr.design.gui.style.AlignmentPane;
+import com.fr.design.gui.style.FormatPane;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class NoBorderPaneCellStyleEditPane extends CellStyleEditPane {
+
+ @Override
+ protected List initPaneList() {
+ paneList = new ArrayList<>();
+ paneList.add(new FormatPane());
+ paneList.add(new AlignmentPane());
+ return paneList;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/AbstractChartStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/AbstractChartStylePane.java
new file mode 100644
index 000000000..e96bcd7bb
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/AbstractChartStylePane.java
@@ -0,0 +1,50 @@
+package com.fr.design.mainframe.theme.edit.chart;
+
+import com.fr.base.theme.settings.ThemedChartStyle;
+import com.fr.design.constants.LayoutConstants;
+import com.fr.design.dialog.BasicPane;
+import com.fr.design.gui.icontainer.UIScrollPane;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.layout.TableLayout;
+import com.fr.design.layout.TableLayoutHelper;
+
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
+import java.awt.Component;
+
+/**
+ * @author Bjorn
+ * @version 10.0
+ * Created by Bjorn on 2020-09-17
+ */
+public abstract class AbstractChartStylePane extends BasicPane {
+
+ public AbstractChartStylePane() {
+ initComponents();
+ initPane();
+ }
+
+ protected abstract void initComponents();
+
+ protected void initPane() {
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ double e1 = 75;
+ double e = 155;
+ double p = TableLayout.PREFERRED;
+ double[] columnSize = {e1, e};
+ JPanel gapTableLayoutPane = TableLayoutHelper.createGapTableLayoutPane(getComponent(), getRows(p), columnSize, 20, LayoutConstants.VGAP_LARGE);
+ gapTableLayoutPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0));
+ UIScrollPane rightTopPane = new UIScrollPane(gapTableLayoutPane);
+ rightTopPane.setBorder(BorderFactory.createEmptyBorder());
+ this.add(rightTopPane, BorderLayout.CENTER);
+ }
+
+ protected abstract Component[][] getComponent();
+
+ protected abstract double[] getRows(double p);
+
+ public abstract void populate(ThemedChartStyle chartStyle);
+
+ public abstract void update(ThemedChartStyle chartStyle);
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartAxisStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartAxisStylePane.java
new file mode 100644
index 000000000..5a52bb28c
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartAxisStylePane.java
@@ -0,0 +1,69 @@
+package com.fr.design.mainframe.theme.edit.chart;
+
+import com.fr.base.theme.settings.ThemedChartStyle;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.style.color.ColorSelectBox;
+
+import java.awt.Component;
+
+/**
+ * @author Bjorn
+ * @version 10.0
+ * Created by Bjorn on 2020-09-16
+ */
+public class ChartAxisStylePane extends AbstractChartStylePane {
+
+ //轴标题字体样式
+ private ChartFontPane titleFontPane;
+
+ //轴标签字体样式
+ private ChartFontPane labelFontPane;
+
+ //轴线颜色
+ private ColorSelectBox axisLineColor;
+
+ protected void initComponents() {
+ titleFontPane = new ChartFontPane() {
+ public String getUILabelText() {
+ return Toolkit.i18nText("Fine-Design_Chart_Axis_Title_Character");
+ }
+ };
+ labelFontPane = new ChartFontPane() {
+ public String getUILabelText() {
+ return Toolkit.i18nText("Fine-Design_Chart_Axis_Label_Character");
+ }
+ };
+ axisLineColor = new ColorSelectBox(100);
+ }
+
+ protected Component[][] getComponent() {
+ return new Component[][]{
+ new Component[]{titleFontPane, null},
+ new Component[]{labelFontPane, null},
+ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Axis_Line_Color")), axisLineColor}
+ };
+ }
+
+ protected double[] getRows(double p) {
+ return new double[]{p, p, p};
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return Toolkit.i18nText("Fine-Design_Chart_Axis");
+ }
+
+ public void populate(ThemedChartStyle chartStyle) {
+ titleFontPane.populate(chartStyle.getAxisTitleFont());
+ labelFontPane.populate(chartStyle.getAxisLabelFont());
+ axisLineColor.setSelectObject(chartStyle.getAxisLineColor());
+ }
+
+
+ public void update(ThemedChartStyle chartStyle) {
+ chartStyle.setAxisTitleFont(titleFontPane.update());
+ chartStyle.setAxisLabelFont(labelFontPane.update());
+ chartStyle.setAxisLineColor(axisLineColor.getSelectObject());
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartDataSheetStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartDataSheetStylePane.java
new file mode 100644
index 000000000..07ec893f7
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartDataSheetStylePane.java
@@ -0,0 +1,58 @@
+package com.fr.design.mainframe.theme.edit.chart;
+
+import com.fr.base.theme.settings.ThemedChartStyle;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.style.color.ColorSelectBox;
+
+import java.awt.Component;
+
+/**
+ * @author Bjorn
+ * @version 10.0
+ * Created by Bjorn on 2020-09-17
+ */
+public class ChartDataSheetStylePane extends AbstractChartStylePane {
+
+ //字体样式
+ private ChartFontPane fontPane;
+
+ //边框颜色
+ private ColorSelectBox borderColor;
+
+ protected void initComponents() {
+ fontPane = new ChartFontPane() {
+ public String getUILabelText() {
+ return Toolkit.i18nText("Fine-Design_Chart_DataSheet_Character");
+ }
+ };
+ borderColor = new ColorSelectBox(100);
+ }
+
+ protected Component[][] getComponent() {
+ return new Component[][]{
+ new Component[]{fontPane, null},
+ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Border_Color")), borderColor}
+ };
+ }
+
+ protected double[] getRows(double p) {
+ return new double[]{p, p, p};
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return Toolkit.i18nText("Fine-Design_Chart_Data_Sheet");
+ }
+
+ public void populate(ThemedChartStyle chartStyle) {
+ fontPane.populate(chartStyle.getDataSheetFont());
+ borderColor.setSelectObject(chartStyle.getDataSheetBorderColor());
+ }
+
+
+ public void update(ThemedChartStyle chartStyle) {
+ chartStyle.setDataSheetFont(fontPane.update());
+ chartStyle.setDataSheetBorderColor(borderColor.getSelectObject());
+ }
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartFontPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartFontPane.java
new file mode 100644
index 000000000..ee04556c6
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartFontPane.java
@@ -0,0 +1,161 @@
+package com.fr.design.mainframe.theme.edit.chart;
+
+import com.fr.base.BaseUtils;
+import com.fr.base.FRContext;
+import com.fr.base.Utils;
+import com.fr.design.constants.LayoutConstants;
+import com.fr.design.dialog.BasicPane;
+import com.fr.design.event.UIObserverListener;
+import com.fr.design.gui.ibutton.UIColorButton;
+import com.fr.design.gui.ibutton.UIToggleButton;
+import com.fr.design.gui.icombobox.UIComboBox;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.TableLayout;
+import com.fr.design.layout.TableLayoutHelper;
+import com.fr.design.utils.gui.GUICoreUtils;
+import com.fr.general.FRFont;
+import com.fr.general.GeneralUtils;
+
+import javax.swing.JPanel;
+import javax.swing.SwingConstants;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.FlowLayout;
+import java.awt.Font;
+
+/**
+ * @author Bjorn
+ * @version 10.0
+ * Created by Bjorn on 2020-09-16
+ */
+public class ChartFontPane extends BasicPane {
+
+ public static final int FONT_START = 6;
+ public static final int FONT_END = 72;
+ private UIComboBox fontNameComboBox;
+ private UIComboBox fontSizeComboBox;
+ private UIToggleButton bold;
+ private UIToggleButton italic;
+ private UIColorButton fontColor;
+ private static Integer[] FONT_SIZES = new Integer[FONT_END - FONT_START + 1];
+
+ static {
+ for (int i = FONT_START; i <= FONT_END; i++) {
+ FONT_SIZES[i - FONT_START] = i;
+ }
+ }
+
+ public ChartFontPane() {
+ initState();
+ initComponents();
+ }
+
+ private void initState() {
+ fontNameComboBox = new UIComboBox(Utils.getAvailableFontFamilyNames4Report());
+ fontSizeComboBox = new UIComboBox(FONT_SIZES);
+ bold = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold.png"));
+ italic = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic.png"));
+ fontColor = new UIColorButton();
+ }
+
+ protected void initComponents() {
+ Component[] components = new Component[]{
+ fontColor, italic, bold
+ };
+ JPanel buttonPane = new JPanel(new BorderLayout());
+ buttonPane.add(fontSizeComboBox, BorderLayout.CENTER);
+ buttonPane.add(GUICoreUtils.createFlowPane(components, FlowLayout.LEFT, LayoutConstants.HGAP_LARGE), BorderLayout.EAST);
+
+ this.setLayout(new BorderLayout());
+ this.add(getContentPane(buttonPane), BorderLayout.CENTER);
+
+ populate(FRContext.getDefaultValues().getFRFont());
+ }
+
+ protected JPanel getContentPane(JPanel buttonPane) {
+ double e1 = 75;
+ double e = 155;
+ double p = TableLayout.PREFERRED;
+ double[] rows = {p, p, p};
+ double[] columnSize = {e1, e};
+ UILabel text = new UILabel(getUILabelText(), SwingConstants.LEFT);
+ Component[][] components = {
+ new Component[]{null, null},
+ new Component[]{text, fontNameComboBox},
+ new Component[]{null, buttonPane}
+ };
+
+ return TableLayoutHelper.createGapTableLayoutPane(components, rows, columnSize, 20, LayoutConstants.VGAP_LARGE);
+ }
+
+ public String getUILabelText() {
+ return Toolkit.i18nText("Fine-Design_Chart_Character");
+ }
+
+ public String title4PopupWindow() {
+ return null;
+ }
+
+ public void populate(FRFont frFont) {
+ UIObserverListener listener = fontNameComboBox == null ? null : fontNameComboBox.getUiObserverListener();
+ removeAllComboBoxListener();
+
+ if (frFont != null) {
+ fontNameComboBox.setSelectedItem(frFont.getFamily());
+ bold.setSelected(frFont.isBold());
+ italic.setSelected(frFont.isItalic());
+ populateFontSize(frFont);
+ if (fontColor != null) {
+ fontColor.setColor(frFont.getForeground());
+ }
+ }
+
+ //更新结束后,注册监听器
+ registerAllComboBoxListener(listener);
+ }
+
+ private void populateFontSize(FRFont frFont) {
+ if (fontSizeComboBox != null) {
+ fontSizeComboBox.setSelectedItem(frFont.getSize());
+ }
+ }
+
+ private void removeAllComboBoxListener() {
+ fontNameComboBox.removeChangeListener();
+ fontSizeComboBox.removeChangeListener();
+ }
+
+ private void registerAllComboBoxListener(UIObserverListener listener) {
+ fontNameComboBox.registerChangeListener(listener);
+ fontSizeComboBox.registerChangeListener(listener);
+ }
+
+ /**
+ * 更新字
+ *
+ * @return 更新字
+ */
+ public FRFont update() {
+ String name = GeneralUtils.objectToString(fontNameComboBox.getSelectedItem());
+
+ return FRFont.getInstance(name, updateFontStyle(), updateFontSize(), fontColor.getColor());
+ }
+
+ private int updateFontStyle() {
+ int style = Font.PLAIN;
+ if (bold.isSelected() && !italic.isSelected()) {
+ style = Font.BOLD;
+ } else if (!bold.isSelected() && italic.isSelected()) {
+ style = Font.ITALIC;
+ } else if (bold.isSelected() && italic.isSelected()) {
+ style = 3;
+ }
+
+ return style;
+ }
+
+ private float updateFontSize() {
+ return Float.parseFloat(GeneralUtils.objectToString(fontSizeComboBox.getSelectedItem()));
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartLabelStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartLabelStylePane.java
new file mode 100644
index 000000000..8eb736444
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartLabelStylePane.java
@@ -0,0 +1,78 @@
+package com.fr.design.mainframe.theme.edit.chart;
+
+import com.fr.base.theme.settings.ThemedChartStyle;
+import com.fr.design.gui.ibutton.UIButtonGroup;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.Toolkit;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+/**
+ * @author Bjorn
+ * @version 10.0
+ * Created by Bjorn on 2020-09-16
+ */
+public class ChartLabelStylePane extends AbstractChartStylePane {
+
+ private UIButtonGroup autoButton;
+ //字体样式
+ private ChartFontPane chartFontPane;
+
+ protected void initComponents() {
+ autoButton = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_Auto"),
+ Toolkit.i18nText("Fine-Design_Chart_Custom")});
+ chartFontPane = new ChartFontPane() {
+ public String getUILabelText() {
+ return Toolkit.i18nText("Fine-Design_Chart_Label_Character");
+ }
+ };
+ initListener();
+ }
+
+ protected Component[][] getComponent() {
+ return new Component[][]{
+ new Component[]{null, null},
+ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Style_Setting")), autoButton},
+ new Component[]{chartFontPane, null}
+ };
+ }
+
+ protected double[] getRows(double p) {
+ return new double[]{p, p, p};
+ }
+
+ private void initListener() {
+ autoButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ checkPreButton();
+ }
+ });
+ }
+
+ private void checkPreButton() {
+ chartFontPane.setVisible(autoButton.getSelectedIndex() == 1);
+ chartFontPane.setPreferredSize(autoButton.getSelectedIndex() == 1 ? new Dimension(0, 60) : new Dimension(0, 0));
+ }
+
+
+ @Override
+ protected String title4PopupWindow() {
+ return Toolkit.i18nText("Fine-Design_Chart_Label");
+ }
+
+ public void populate(ThemedChartStyle chartStyle) {
+ autoButton.setSelectedIndex(chartStyle.isAutoLabelFont() ? 0 : 1);
+ chartFontPane.populate(chartStyle.getLabelFont());
+ checkPreButton();
+ }
+
+
+ public void update(ThemedChartStyle chartStyle) {
+ chartStyle.setAutoLabelFont(autoButton.getSelectedIndex() == 0);
+ chartStyle.setLabelFont(chartFontPane.update());
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartLegendStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartLegendStylePane.java
new file mode 100644
index 000000000..40f4652a0
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartLegendStylePane.java
@@ -0,0 +1,49 @@
+package com.fr.design.mainframe.theme.edit.chart;
+
+import com.fr.base.theme.settings.ThemedChartStyle;
+import com.fr.design.i18n.Toolkit;
+
+import java.awt.Component;
+
+/**
+ * @author Bjorn
+ * @version 10.0
+ * Created by Bjorn on 2020-09-16
+ */
+public class ChartLegendStylePane extends AbstractChartStylePane {
+
+ //字体样式
+ private ChartFontPane chartFontPane;
+
+ protected void initComponents() {
+ chartFontPane = new ChartFontPane() {
+ public String getUILabelText() {
+ return Toolkit.i18nText("Fine-Design_Chart_Legend_Character");
+ }
+ };
+ }
+
+ protected Component[][] getComponent() {
+ return new Component[][]{
+ new Component[]{chartFontPane, null}
+ };
+ }
+
+ protected double[] getRows(double p) {
+ return new double[]{p};
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return Toolkit.i18nText("Fine-Design_Chart_Legend");
+ }
+
+ public void populate(ThemedChartStyle chartStyle) {
+ chartFontPane.populate(chartStyle.getLegendFont());
+ }
+
+
+ public void update(ThemedChartStyle chartStyle) {
+ chartStyle.setLegendFont(chartFontPane.update());
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartSeriesStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartSeriesStylePane.java
new file mode 100644
index 000000000..fbb8f6489
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartSeriesStylePane.java
@@ -0,0 +1,88 @@
+package com.fr.design.mainframe.theme.edit.chart;
+
+import com.fr.base.theme.settings.ThemedChartStyle;
+import com.fr.design.gui.ibutton.UIButtonGroup;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.mainframe.theme.dialog.TemplateThemeProfileDialog;
+import com.fr.design.style.background.gradient.FixedGradientBar;
+
+import java.util.List;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+/**
+ * @author Bjorn
+ * @version 10.0
+ * Created by Bjorn on 2020-09-17
+ */
+public class ChartSeriesStylePane extends AbstractChartStylePane {
+
+ private UIButtonGroup colorTypeButton;
+ private FixedGradientBar gradientBar;
+
+ protected void initComponents() {
+ colorTypeButton = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_Custom_Color"),
+ Toolkit.i18nText("Fine-Design_Chart_Legend_Gradual")});
+ gradientBar = new FixedGradientBar(4, 130);
+ initListener();
+ }
+
+ protected Component[][] getComponent() {
+ return new Component[][]{
+ new Component[]{null, null},
+ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Match_Color_Scheme")), colorTypeButton},
+ new Component[]{null, gradientBar}
+ };
+ }
+
+ protected double[] getRows(double p) {
+ return new double[]{p, p, p};
+ }
+
+ private void initListener() {
+ colorTypeButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ checkTypeButton();
+ }
+ });
+ }
+
+ private void checkTypeButton() {
+ gradientBar.setVisible(colorTypeButton.getSelectedIndex() == 1);
+ gradientBar.setPreferredSize(colorTypeButton.getSelectedIndex() == 1 ? new Dimension(0, 60) : new Dimension(0, 0));
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return Toolkit.i18nText("Fine-Design_Chart_Series");
+ }
+
+ public void populate(ThemedChartStyle chartStyle) {
+ if (chartStyle.getThemedChartSeriesColor().isCombineColor()) {
+ List editingColorScheme = TemplateThemeProfileDialog.getEditingColorScheme();
+ colorTypeButton.setSelectedIndex(0);
+ gradientBar.updateColor(editingColorScheme.get(0), editingColorScheme.get(1));
+ } else {
+ colorTypeButton.setSelectedIndex(1);
+ gradientBar.updateColor(chartStyle.getThemedChartSeriesColor().getBeginColor(), chartStyle.getThemedChartSeriesColor().getEndColor());
+ }
+ checkTypeButton();
+ }
+
+
+ public void populateGradientBar(List colors) {
+ gradientBar.updateColor(colors.get(0), colors.get(1));
+ this.repaint();
+ }
+
+ public void update(ThemedChartStyle chartStyle) {
+ chartStyle.getThemedChartSeriesColor().setCombineColor(colorTypeButton.getSelectedIndex() == 0);
+ chartStyle.getThemedChartSeriesColor().setBeginColor(gradientBar.getSelectColorPointBtnP1().getColorInner());
+ chartStyle.getThemedChartSeriesColor().setEndColor(gradientBar.getSelectColorPointBtnP2().getColorInner());
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartTitleAndBackgroundStyleFormPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartTitleAndBackgroundStyleFormPane.java
new file mode 100644
index 000000000..204bde076
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartTitleAndBackgroundStyleFormPane.java
@@ -0,0 +1,36 @@
+package com.fr.design.mainframe.theme.edit.chart;
+
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.Toolkit;
+
+import java.awt.Color;
+import java.awt.Component;
+
+/**
+ * @author Bjorn
+ * @version 10.0
+ * Created by Bjorn on 2021-08-30
+ */
+public class ChartTitleAndBackgroundStyleFormPane extends ChartTitleAndBackgroundStylePane {
+
+ private UILabel tooltipLabel;
+
+ protected void initComponents() {
+ super.initComponents();
+ tooltipLabel = new UILabel("" + Toolkit.i18nText("Fine-Design_Chart_Title_Background_Tooltip") + "");
+ tooltipLabel.setForeground(new Color(153, 153, 153));
+ }
+
+ protected Component[][] getComponent() {
+ Component[][] component = super.getComponent();
+ Component[][] newComponent = new Component[component.length + 2][];
+ System.arraycopy(component, 0, newComponent, 2, component.length);
+ newComponent[0] = new Component[]{null, null};
+ newComponent[1] = new Component[]{tooltipLabel, null};
+ return newComponent;
+ }
+
+ protected double[] getRows(double p) {
+ return new double[]{p, p, p, p, p, p, p};
+ }
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartTitleAndBackgroundStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartTitleAndBackgroundStylePane.java
new file mode 100644
index 000000000..6bac51876
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/chart/ChartTitleAndBackgroundStylePane.java
@@ -0,0 +1,127 @@
+package com.fr.design.mainframe.theme.edit.chart;
+
+import com.fr.base.background.ImageBackground;
+import com.fr.base.theme.settings.ThemedChartStyle;
+import com.fr.design.gui.icombobox.UIComboBox;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.mainframe.backgroundpane.BackgroundQuickPane;
+import com.fr.design.mainframe.backgroundpane.ColorBackgroundQuickPane;
+import com.fr.design.mainframe.backgroundpane.ImageBackgroundQuickPane;
+import com.fr.design.mainframe.backgroundpane.NullBackgroundQuickPane;
+import com.fr.design.mainframe.backgroundpane.VanChartGradientPane;
+import com.fr.design.style.color.ColorSelectBox;
+import com.fr.general.Background;
+import com.fr.stable.Constants;
+
+import javax.swing.JPanel;
+import java.util.ArrayList;
+import java.util.List;
+import java.awt.CardLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+/**
+ * @author Bjorn
+ * @version 10.0
+ * Created by Bjorn on 2020-09-16
+ */
+public class ChartTitleAndBackgroundStylePane extends AbstractChartStylePane {
+
+ //字体样式
+ private ChartFontPane chartFontPane;
+
+ private UIComboBox typeComboBox;
+ private List paneList;
+ private JPanel centerPane;
+
+ //网格线颜色
+ private ColorSelectBox mainGridColor;
+
+ protected void initComponents() {
+ chartFontPane = new ChartFontPane() {
+ public String getUILabelText() {
+ return Toolkit.i18nText("Fine-Design_Chart_Title_Character");
+ }
+ };
+
+ mainGridColor = new ColorSelectBox(100);
+
+ typeComboBox = new UIComboBox();
+ final CardLayout cardlayout = new CardLayout();
+ initList();
+
+ centerPane = new JPanel(cardlayout) {
+ @Override
+ public Dimension getPreferredSize() {// AUGUST:使用当前面板的的高度
+ int index = typeComboBox.getSelectedIndex();
+ return new Dimension(super.getPreferredSize().width, paneList.get(index).getPreferredSize().height);
+ }
+ };
+ for (int i = 0; i < paneList.size(); i++) {
+ BackgroundQuickPane pane = paneList.get(i);
+ typeComboBox.addItem(pane.title4PopupWindow());
+ centerPane.add(pane, pane.title4PopupWindow());
+ }
+
+ typeComboBox.addItemListener(new ItemListener() {
+ @Override
+ public void itemStateChanged(ItemEvent e) {
+ cardlayout.show(centerPane, (String) typeComboBox.getSelectedItem());
+ }
+ });
+ }
+
+ private void initList() {
+ paneList = new ArrayList<>();
+ paneList.add(new NullBackgroundQuickPane());
+ paneList.add(new ColorBackgroundQuickPane());
+ paneList.add(new ImageBackgroundQuickPane(false));
+ paneList.add(new VanChartGradientPane());
+ }
+
+ protected Component[][] getComponent() {
+ return new Component[][]{
+ new Component[]{chartFontPane, null},
+ new Component[]{null, null},
+ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Area_Background_Color")), typeComboBox},
+ new Component[]{null, centerPane},
+ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Grid_Line_Color")), mainGridColor}
+ };
+ }
+
+ protected double[] getRows(double p) {
+ return new double[]{p, p, p, p, p};
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return Toolkit.i18nText("Fine-Design_Chart_Title_Background");
+ }
+
+ public void populate(ThemedChartStyle chartStyle) {
+ chartFontPane.populate(chartStyle.getTitleFont());
+ Background background = chartStyle.getChartBackground();
+ for (int i = 0; i < paneList.size(); i++) {
+ BackgroundQuickPane pane = paneList.get(i);
+ if (pane.accept(background)) {
+ pane.populateBean(background);
+ typeComboBox.setSelectedIndex(i);
+ break;
+ }
+ }
+ mainGridColor.setSelectObject(chartStyle.getGridMainLineColor());
+ }
+
+
+ public void update(ThemedChartStyle chartStyle) {
+ chartStyle.setTitleFont(chartFontPane.update());
+ chartStyle.setChartBackground(paneList.get(typeComboBox.getSelectedIndex()).updateBean());
+ if (chartStyle.getChartBackground() instanceof ImageBackground) {
+ ((ImageBackground) chartStyle.getChartBackground()).setLayout(Constants.IMAGE_EXTEND);
+ }
+ chartStyle.setGridMainLineColor(mainGridColor.getSelectObject());
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/component/ComponentMarginStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/component/ComponentMarginStylePane.java
new file mode 100644
index 000000000..643c1e960
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/component/ComponentMarginStylePane.java
@@ -0,0 +1,101 @@
+package com.fr.design.mainframe.theme.edit.component;
+
+import com.fr.base.theme.settings.ThemedComponentStyle;
+import com.fr.design.designer.IntervalConstants;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.gui.ispinner.UISpinner;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.layout.TableLayout;
+import com.fr.design.layout.TableLayoutHelper;
+
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import javax.swing.SwingConstants;
+import java.awt.Component;
+
+import static com.fr.design.i18n.Toolkit.i18nText;
+
+/**
+ * Created by kerry on 2020-09-01
+ */
+public class ComponentMarginStylePane extends JPanel {
+ private final int uiLabelWidth;
+ private final int uiSettingWidth;
+
+ protected UISpinner top;
+ protected UISpinner bottom;
+ protected UISpinner left;
+ protected UISpinner right;
+
+ public ComponentMarginStylePane(int uiLabelWidth, int uiSettingWidth) {
+ this.uiLabelWidth = uiLabelWidth;
+ this.uiSettingWidth = uiSettingWidth;
+ initBoundPane(0, 0, 0, 0);
+ }
+
+ public void initBoundPane(int t, int b, int l, int r) {
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+
+ top = new UISpinner(0, Integer.MAX_VALUE, 1, t);
+ bottom = new UISpinner(0, Integer.MAX_VALUE, 1, b);
+ left = new UISpinner(0, Integer.MAX_VALUE, 1, l);
+ right = new UISpinner(0, Integer.MAX_VALUE, 1, r);
+
+ top.setGlobalName(i18nText("Fine-Design_Form_Layout_Padding_Duplicate"));
+ bottom.setGlobalName(i18nText("Fine-Design_Form_Layout_Padding_Duplicate"));
+ left.setGlobalName(i18nText("Fine-Design_Form_Layout_Padding_Duplicate"));
+ right.setGlobalName(i18nText("Fine-Design_Form_Layout_Padding_Duplicate"));
+
+ UILabel uiLabel = new UILabel(i18nText("Fine-Design_Form_Layout_Padding_Duplicate"));
+ uiLabel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, 0, 0));
+ uiLabel.setVerticalAlignment(SwingConstants.TOP);
+
+
+ double f = TableLayout.FILL;
+ double p = TableLayout.PREFERRED;
+ double[] rowSize = { p };
+ double[] columnSize = { this.uiLabelWidth, this.uiSettingWidth > 0 ? this.uiSettingWidth : f };
+
+ JPanel panel = TableLayoutHelper.createGapTableLayoutPane(
+ new Component[][]{new Component[]{uiLabel, createPaddingPane()}},
+ rowSize, columnSize,
+ IntervalConstants.INTERVAL_L1, 0
+ );
+ this.add(panel);
+ }
+
+
+ public JPanel createPaddingPane() {
+ double f = TableLayout.FILL;
+ double p = TableLayout.PREFERRED;
+ double[] rowSize = {p, p, p, p};
+ double[] columnSize = {f, f};
+
+ Component[][] paddingPane = new Component[][]{
+ new Component[]{top, bottom},
+ new Component[]{createLabelByKey("Fine-Design_Report_Top"), createLabelByKey("Fine-Design_Report_Bottom")},
+ new Component[]{left, right},
+ new Component[]{createLabelByKey("Fine-Design_Report_Left"), createLabelByKey("Fine-Design_Basic_Right")}
+ };
+
+ return TableLayoutHelper.createGapTableLayoutPane(paddingPane, rowSize, columnSize, IntervalConstants.INTERVAL_L6, IntervalConstants.INTERVAL_L6);
+ }
+
+ public void populate(ThemedComponentStyle componentStyle) {
+ this.top.setValue(componentStyle.getPaddingTop());
+ this.bottom.setValue(componentStyle.getPaddingBottom());
+ this.left.setValue(componentStyle.getPaddingLeft());
+ this.right.setValue(componentStyle.getPaddingRight());
+ }
+
+ public void update(ThemedComponentStyle componentStyle) {
+ componentStyle.setPaddingTop((int) this.top.getValue());
+ componentStyle.setPaddingBottom((int) this.bottom.getValue());
+ componentStyle.setPaddingLeft((int) this.left.getValue());
+ componentStyle.setPaddingRight((int) this.right.getValue());
+ }
+
+ private UILabel createLabelByKey(String key) {
+ return new UILabel(i18nText(key), SwingConstants.CENTER);
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ui/ColorListExtendedPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ui/ColorListExtendedPane.java
new file mode 100644
index 000000000..4aac8562d
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ui/ColorListExtendedPane.java
@@ -0,0 +1,147 @@
+package com.fr.design.mainframe.theme.edit.ui;
+
+import com.fr.base.theme.FineColorManager;
+import com.fr.design.layout.FRGUIPaneFactory;
+
+import javax.swing.JPanel;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/7
+ */
+public class ColorListExtendedPane extends JPanel implements MouseListener {
+ public static final int DEFAULT_COLOR_COUNT = 8;
+ public static final int DEFAULT_EXTENDED_COUNT = 5;
+ public static final int DEFAULT_COLOR_SIZE = 16;
+ public static final int DEFAULT_COLOR_GAP = 3;
+
+ public static final ExtendedColorComputer DEFAULT_EXTENDED_COMPUTER = new ExtendedColorComputer() {
+ @Override
+ public Color computeExtendedColor(Color color, int index, int count) {
+ return FineColorManager.computeExtendedColor(color, index, count);
+ }
+ };
+
+ private final boolean selectable;
+ private final int colorCount;
+ private final int extendedCount;
+ private final int boxSize;
+ private final int boxGap;
+
+ private final List colorList = new ArrayList<>();
+ private ExtendedColorComputer extendedColorComputer = DEFAULT_EXTENDED_COMPUTER;
+
+ private int selectedColorIndex = -1;
+ private int selectedExtendedIndex = -1;
+
+ public ColorListExtendedPane() {
+ this(false, DEFAULT_COLOR_COUNT, DEFAULT_EXTENDED_COUNT, DEFAULT_COLOR_SIZE, DEFAULT_COLOR_GAP);
+ }
+
+ public ColorListExtendedPane(boolean selectable, int colorCount, int extendedCount, int boxSize, int boxGap) {
+ setLayout(FRGUIPaneFactory.createBorderLayout());
+ this.selectable = selectable;
+ this.colorCount = Math.max(1, colorCount);
+ this.extendedCount = extendedCount;
+ this.boxSize = boxSize;
+ this.boxGap = boxGap;
+
+ for (int i = 0; i < colorCount; i++) {
+ colorList.add(Color.WHITE);
+ }
+
+ int width = colorCount * boxSize + (colorCount - 1) * boxGap;
+ int height = extendedCount * boxSize + (extendedCount - 1) * boxGap;
+ setPreferredSize(new Dimension(width, height));
+ }
+
+ public void populate(List colors) {
+ if (colors.size() > 0) {
+ colorList.clear();
+ for (int i = 0; i < colorCount; i++) {
+ Color color = colors.get(i % colorCount);
+ colorList.add(color);
+ }
+ repaint();
+ }
+ }
+
+ public List update() {
+ return new ArrayList<>(colorList);
+ }
+
+ public void setExtendedColorComputer(ExtendedColorComputer extendedColorComputer) {
+ this.extendedColorComputer = extendedColorComputer;
+ }
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ int x = e.getX();
+ int y = e.getY();
+
+ int colorIndex = x / (boxSize + boxGap);
+ int colorX = colorIndex * (boxSize + boxGap);
+
+ int extendedIndex = y / boxSize;
+ int extendedY = extendedIndex * boxSize;
+
+ if (colorX <= x && x <= colorX + boxSize && extendedY <= y && y <= extendedY + boxSize) {
+ selectedColorIndex = colorIndex;
+ selectedExtendedIndex = extendedIndex;
+ } else {
+ selectedColorIndex = -1;
+ selectedExtendedIndex = -1;
+ }
+ repaint();
+ }
+
+ @Override
+ public void mousePressed(MouseEvent e) {
+
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent e) {
+
+ }
+
+ @Override
+ public void mouseEntered(MouseEvent e) {
+
+ }
+
+ @Override
+ public void mouseExited(MouseEvent e) {
+
+ }
+
+ public interface ExtendedColorComputer {
+ Color computeExtendedColor(Color color, int index, int count);
+ }
+
+ @Override
+ public void paint(Graphics g) {
+ super.paint(g);
+ Color oldColor = g.getColor();
+
+ for (int i = 0; i < colorList.size(); i++) {
+ int x = i * (boxSize + boxGap);
+ for (int j = 0; j < extendedCount; j++) {
+ Color color = extendedColorComputer.computeExtendedColor(colorList.get(i), j, extendedCount);
+ g.setColor(color);
+ int y = j * (boxSize + boxGap);
+ g.fillRect(x, y, boxSize, boxSize);
+ }
+ }
+
+ g.setColor(oldColor);
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ui/ColorListPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ui/ColorListPane.java
new file mode 100644
index 000000000..2bf1931f1
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ui/ColorListPane.java
@@ -0,0 +1,203 @@
+package com.fr.design.mainframe.theme.edit.ui;
+
+import com.fr.base.FineColor;
+import com.fr.base.background.ColorBackground;
+import com.fr.design.event.UIObserver;
+import com.fr.design.event.UIObserverListener;
+import com.fr.design.style.AbstractSelectBox;
+import com.fr.design.style.color.NewColorSelectPane;
+
+import javax.swing.JPanel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.EventListenerList;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.GridLayout;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.geom.Rectangle2D;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/7
+ */
+public class ColorListPane extends JPanel implements UIObserver {
+ public static final int DEFAULT_COLOR_COUNT = 8;
+ public static final int DEFAULT_COLOR_SIZE = 16;
+ public static final int DEFAULT_COLOR_GAP = 3;
+
+ private final int colorCount;
+
+ private final List colorList = new ArrayList<>();
+ private final List colorButtons = new ArrayList<>();
+
+ private final EventListenerList colorChangeListenerList = new EventListenerList();
+ private UIObserverListener uiObserverListener;
+
+ public ColorListPane() {
+ this(DEFAULT_COLOR_COUNT, DEFAULT_COLOR_SIZE, DEFAULT_COLOR_GAP);
+ }
+
+ public ColorListPane(int colorCount, int boxSize, int boxGap) {
+ this.colorCount = Math.max(1, colorCount);
+
+ for (int i = 0; i < colorCount; i++) {
+ colorList.add(Color.WHITE);
+ }
+
+ setLayout(new GridLayout(1, 8, boxGap, 0));
+
+ for (int i = 0; i < colorCount; i++) {
+ ColorButton colorButton = new ColorButton(null);
+ colorButton.setPreferredSize(new Dimension(boxSize, boxSize));
+ add(colorButton);
+ int index = i;
+ colorButton.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ colorList.set(index, colorButton.getSelectObject());
+ fireColorStateChanged();
+ }
+ });
+
+ colorButtons.add(colorButton);
+ }
+
+ setPreferredSize(new Dimension(colorCount * boxSize + (colorCount - 1) * boxGap, boxSize));
+ iniListener();
+ }
+
+ private void iniListener() {
+ if (shouldResponseChangeListener()) {
+ this.addColorChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ if (uiObserverListener == null) {
+ return;
+ }
+ uiObserverListener.doChange();
+ }
+ });
+ }
+ }
+
+ public void populate(List colors) {
+ for (int i = 0; i < colors.size() && i < colorList.size(); i++) {
+ Color color = colors.get(i % colorCount);
+ colorList.set(i, color);
+ colorButtons.get(i).setSelectObject(color);
+ }
+ }
+
+ public List update() {
+ return new ArrayList<>(colorList);
+ }
+
+ public void addColorChangeListener(ChangeListener changeListener) {
+ colorChangeListenerList.add(ChangeListener.class, changeListener);
+ }
+
+ public void removeColorChangeListener(ChangeListener changeListener) {
+ colorChangeListenerList.remove(ChangeListener.class, changeListener);
+ }
+
+ public void fireColorStateChanged() {
+ Object[] listeners = colorChangeListenerList.getListenerList();
+ ChangeEvent e = null;
+
+ for (int i = listeners.length - 2; i >= 0; i -= 2) {
+ if (listeners[i] == ChangeListener.class) {
+ if (e == null) {
+ e = new ChangeEvent(this);
+ }
+ ((ChangeListener) listeners[i + 1]).stateChanged(e);
+ }
+ }
+ }
+
+ public void registerChangeListener(UIObserverListener listener) {
+ uiObserverListener = listener;
+ }
+
+ public boolean shouldResponseChangeListener() {
+ return true;
+ }
+
+ private static class ColorButton extends AbstractSelectBox {
+ private Color color;
+ private NewColorSelectPane colorPane;
+ private ChangeListener changeListener;
+
+ public ColorButton(Color color) {
+ this.color = color;
+ addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ showPopupMenu();
+ }
+ });
+ }
+
+ @Override
+ public JPanel initWindowPane(double preferredWidth) {
+ colorPane = new NewColorSelectPane(false) {
+ @Override
+ public void setVisible(boolean b) {
+ super.setVisible(b);
+ }
+
+ @Override
+ protected boolean selectRealTime() {
+ return false;
+ }
+ };
+ colorPane.setColor(this.getSelectObject());
+ colorPane.addChangeListener(new ChangeListener() {
+ public void stateChanged(ChangeEvent e) {
+ hidePopupMenu();
+ FineColor fineColor = ((NewColorSelectPane) e.getSource()).getColor();
+ // 不要直接使用原始的FineColor对象,它的值会变化,这里实际需要的内部的真实颜色
+ color = fineColor.getColor();
+ fireDisplayComponent(ColorBackground.getInstance(color));
+ ColorListPane.ColorButton.this.fireStateChanged();
+ }
+ });
+ return colorPane;
+ }
+
+ @Override
+ public void paint(Graphics g) {
+ Graphics2D g2d = (Graphics2D) g;
+ g2d.setPaint(color);
+ g2d.fill(new Rectangle2D.Double(0, 0, getWidth(), getHeight()));
+ }
+
+ public void fireStateChanged() {
+ if (changeListener != null) {
+ changeListener.stateChanged(null);
+ }
+ }
+
+ public void addChangeListener(ChangeListener changeListener) {
+ this.changeListener = changeListener;
+ }
+
+ public Color getSelectObject() {
+ return this.color;
+ }
+
+ public void setSelectObject(Color color) {
+ this.color = color;
+ if (this.colorPane != null) {
+ this.colorPane.setColor(color);
+ }
+ fireDisplayComponent(ColorBackground.getInstance(color));
+ }
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ui/LabelUtils.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ui/LabelUtils.java
new file mode 100644
index 000000000..2b099ed30
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ui/LabelUtils.java
@@ -0,0 +1,29 @@
+package com.fr.design.mainframe.theme.edit.ui;
+
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.general.FRFont;
+
+import java.awt.Color;
+import java.awt.Font;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/15
+ */
+public class LabelUtils {
+ public static UILabel createLabel(String title) {
+ return createLabel(title, new Color(51, 51, 52));
+ }
+
+ public static UILabel createLabel(String title, Color color) {
+ return createLabel(title, color, 12);
+ }
+ public static UILabel createLabel(String title, Color color, int size) {
+ UILabel uiLabel = new UILabel(title);
+ uiLabel.setForeground(color);
+ Font newFont = FRFont.getInstance(uiLabel.getFont().getFontName(), Font.PLAIN, size);
+ uiLabel.setFont(newFont);
+ return uiLabel;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ui/TabbedPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ui/TabbedPane.java
new file mode 100644
index 000000000..3f4667e11
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/ui/TabbedPane.java
@@ -0,0 +1,73 @@
+package com.fr.design.mainframe.theme.edit.ui;
+
+import com.fr.design.gui.ibutton.UITabGroup;
+import com.fr.design.layout.FRGUIPaneFactory;
+
+import javax.swing.BorderFactory;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
+import java.awt.CardLayout;
+import java.awt.Dimension;
+import java.util.Arrays;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/12
+ */
+public class TabbedPane extends JPanel {
+ protected UITabGroup buttonGroup;
+ public JPanel tabContentPane;
+ public CardLayout cardLayout;
+ private String[] names = new String[]{};
+ private JComponent[] panes = new JComponent[]{};
+
+ public TabbedPane(String[] names, JComponent[] panes) {
+ setLayout(FRGUIPaneFactory.createBorderLayout());
+ setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
+
+ for (JComponent pane :panes) {
+ pane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
+ }
+
+ int count = Math.min(names.length, panes.length);
+ if (count > 0) {
+ this.names = names.length > count ? Arrays.copyOf(names, count) : names;
+ this.panes = panes.length > count ? Arrays.copyOf(panes, count) : panes;
+ initializeTabPane();
+ }
+ }
+
+ private void initializeTabPane() {
+ buttonGroup = new UITabGroup(this.names) {
+ @Override
+ public void tabChanged(int index) {
+ super.tabChanged(index);
+ cardLayout.show(tabContentPane, names[buttonGroup.getSelectedIndex()]);
+ }
+ };
+ buttonGroup.setDrawLine(true);
+
+ cardLayout = new CardLayout();
+ tabContentPane = new JPanel(cardLayout) {
+ @Override
+ public Dimension getPreferredSize() {
+ int selectedIndex = buttonGroup.getSelectedIndex();
+ if (selectedIndex < 0) {
+ return super.getPreferredSize();
+ } else {
+ return panes[selectedIndex].getPreferredSize();
+ }
+ }
+ };
+ for (int i = 0; i < this.names.length; i++) {
+ tabContentPane.add(panes[i], names[i]);
+ }
+ buttonGroup.setSelectedIndex(0);
+ cardLayout.show(tabContentPane, names[0]);
+
+ add(buttonGroup, BorderLayout.NORTH);
+ add(tabContentPane, BorderLayout.CENTER);
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ChartComponentPreviewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ChartComponentPreviewPane.java
new file mode 100644
index 000000000..261804b4b
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ChartComponentPreviewPane.java
@@ -0,0 +1,34 @@
+package com.fr.design.mainframe.theme.preview;
+
+import com.fr.base.theme.FormTheme;
+
+import java.awt.Component;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public class ChartComponentPreviewPane extends ComponentPreviewPane implements ThemePreviewed {
+ private ChartPreviewPane contentPane;
+
+ public ChartComponentPreviewPane(boolean showTitle) {
+ super(showTitle);
+ }
+
+ @Override
+ protected Component createContentPane() {
+ contentPane = new ChartPreviewPane();
+ return contentPane;
+ }
+
+ @Override
+ public void refresh(FormTheme theme) {
+ super.refresh(theme);
+ contentPane.refresh(theme);
+ }
+
+ public ChartPreviewPane getContentPane() {
+ return contentPane;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ChartPreviewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ChartPreviewPane.java
new file mode 100644
index 000000000..2029539aa
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ChartPreviewPane.java
@@ -0,0 +1,80 @@
+package com.fr.design.mainframe.theme.preview;
+
+import com.fr.base.chart.BaseChartCollection;
+import com.fr.base.chart.BaseChartPainter;
+import com.fr.base.chart.chartdata.CallbackEvent;
+import com.fr.base.chart.result.WebChartIDInfo;
+import com.fr.base.theme.TemplateTheme;
+import com.fr.base.theme.TemplateThemeCompatible;
+import com.fr.chart.chartattr.ChartCollection;
+import com.fr.design.gui.chart.MiddleChartComponent;
+import com.fr.script.Calculator;
+import com.fr.stable.core.PropertyChangeListener;
+
+import javax.swing.BorderFactory;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public class ChartPreviewPane extends MiddleChartComponent implements ThemePreviewed {
+
+ private ChartCollection chartCollection;
+
+ private CallbackEvent callbackEvent;
+
+ public ChartPreviewPane() {
+ this.setBorder(BorderFactory.createEmptyBorder(0, 1, 2, 1));
+ }
+
+ public void setCallbackEvent(CallbackEvent callbackEvent) {
+ this.callbackEvent = callbackEvent;
+ }
+
+ public void paintComponent(Graphics g) {
+ Graphics2D g2d = (Graphics2D) g;
+ super.paintComponent(g);
+ if (chartCollection != null) {
+ drawChart(g2d);
+ }
+ drawChart(g2d);
+ }
+
+ private void drawChart(Graphics2D g2d) {
+ Dimension d = getBounds().getSize();
+ int chartWidth = d.width;
+ int chartHeight = d.height;
+ BaseChartPainter painter = chartCollection.createResultChartPainterWithOutDealFormula(Calculator.createCalculator(),
+ WebChartIDInfo.createEmptyDesignerInfo(), chartWidth, chartHeight);
+ painter.paint(g2d, chartWidth, chartHeight, 0, null, callbackEvent);
+ }
+
+ @Override
+ public void populate(BaseChartCollection cc) {
+ this.chartCollection = (ChartCollection) cc;
+ }
+
+ @Override
+ public BaseChartCollection update() {
+ return this.chartCollection;
+ }
+
+ @Override
+ public void reset() {
+
+ }
+
+ @Override
+ public void addStopEditingListener(PropertyChangeListener list) {
+
+ }
+
+ @Override
+ public void refresh(TemplateTheme style) {
+ chartCollection.onTemplateUsingThemeChange(style, TemplateThemeCompatible.NONE);
+ }
+}
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
new file mode 100644
index 000000000..da7f7bac5
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ComponentPreviewPane.java
@@ -0,0 +1,163 @@
+package com.fr.design.mainframe.theme.preview;
+
+import com.fr.base.BaseUtils;
+import com.fr.base.Style;
+import com.fr.base.background.ImageBackground;
+import com.fr.base.theme.FormTheme;
+import com.fr.base.theme.settings.ThemedComponentStyle;
+import com.fr.design.border.UIRoundedBorder;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.form.ui.Label;
+import com.fr.form.ui.LayoutBorderStyle;
+import com.fr.form.ui.WidgetValue;
+import com.fr.general.Background;
+import com.fr.general.act.BorderPacker;
+import com.fr.general.act.TitlePacker;
+import com.fr.stable.Constants;
+
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import javax.swing.SwingConstants;
+import javax.swing.border.Border;
+import java.awt.AlphaComposite;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Composite;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Shape;
+import java.awt.geom.Rectangle2D;
+import java.awt.geom.RoundRectangle2D;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public abstract class ComponentPreviewPane extends UINoOpaquePanel implements ThemePreviewed {
+ public static final int TITLE_HEIGHT = 35;
+
+ private final JPanel container;
+ private TitleDemoPane titlePane;
+ private BorderPacker style = new LayoutBorderStyle();
+
+ public ComponentPreviewPane(){
+ this(false);
+ }
+
+ public ComponentPreviewPane(boolean showTitle) {
+ container = FRGUIPaneFactory.createBorderLayout_NO_Opaque_Pane();
+ setLayout(new BorderLayout());
+ if (showTitle) {
+ titlePane = new TitleDemoPane();
+ titlePane.setPreferredSize(new Dimension(517, TITLE_HEIGHT));
+ container.add(titlePane, BorderLayout.NORTH);
+ }
+ container.add(createContentPane(), BorderLayout.CENTER);
+ add(container, BorderLayout.CENTER);
+ }
+
+ protected abstract Component createContentPane();
+
+ @Override
+ public void refresh(FormTheme theme) {
+ ThemedComponentStyle componentStyle = theme.getComponentStyle();
+
+ style = componentStyle.getStyle();
+ setBorder(new UIRoundedBorder(style.getBorder(), style.getColor(), style.getBorderRadius()));
+
+ int paddingTop = componentStyle.getPaddingTop();
+ int paddingBottom = componentStyle.getPaddingBottom();
+ int paddingLeft = componentStyle.getPaddingLeft();
+ int paddingRight = componentStyle.getPaddingRight();
+ container.setBorder(BorderFactory.createEmptyBorder(paddingTop, paddingLeft, paddingBottom, paddingRight));
+ if (titlePane != null) {
+ titlePane.refresh(componentStyle);
+ }
+
+ }
+
+ @Override
+ public void paint(Graphics g) {
+ Graphics2D g2d = (Graphics2D) g;
+
+ Border border = getBorder();
+ if (border instanceof UIRoundedBorder) {
+ UIRoundedBorder roundedBorder = (UIRoundedBorder) border;
+ Utils.clipByRoundBorder(g2d, getWidth(), getHeight(), roundedBorder.getRoundedCorner(), roundedBorder.getThickness());
+ }
+
+ int titleHeight = titlePane == null ? 0 : titlePane.getHeight();
+ Utils.paintBackground(g2d, style.getBackground(), new Rectangle2D.Double(0, titleHeight, getWidth(), getHeight() - titleHeight), style.getAlpha());
+
+ Utils.paintBackground(g2d, style.getBorderImage(), new Rectangle2D.Double(0, 0, getWidth(), getHeight()), style.getBorderImageOpacity());
+
+ super.paint(g);
+ }
+
+ private static class TitleDemoPane extends UINoOpaquePanel {
+ private final Label data = new Label();
+
+ public void refresh(ThemedComponentStyle componentStyle) {
+ BorderPacker borderPacker = componentStyle.getStyle();
+ TitlePacker titlePacker = componentStyle.getStyle().getTitle();
+
+ data.setColor(borderPacker.getColor());
+ data.setWidgetValue(new WidgetValue(String.valueOf(titlePacker.getTextObject())));
+ data.setFont(titlePacker.getFrFont());
+ data.setTextalign(titlePacker.getPosition());
+ data.setBackground(titlePacker.getBackground());
+ data.setBackgroundOpacity(titlePacker.getBackgroundOpacity());
+
+ data.setInsetImage(titlePacker.getInsetImage());
+ data.setInsetImagePadding(titlePacker.getInsetImagePadding());
+ data.setInsetRelativeTextLeft(titlePacker.isInsetRelativeTextLeft());
+ data.setInsetRelativeTextRight(titlePacker.isInsetRelativeTextRight());
+ }
+
+ @Override
+ public void paintComponent(Graphics g) {
+ super.paintComponent(g);
+ Dimension size = getSize();
+ Background background = data.getBackground();
+ float opacity = data.getBackgroundOpacity();
+ if (background != null) {
+ Utils.paintBackground((Graphics2D) g, background, new Rectangle2D.Double(0, 0, size.getWidth(), size.getHeight()), opacity);
+ }
+
+ Graphics2D g2d = (Graphics2D) g.create();
+ Background inset = data.getInsetImage();
+ Image insetImage = inset instanceof ImageBackground ? ((ImageBackground) inset).getImage() : null;
+
+ BaseUtils.drawStringStyleInRotation(g2d,
+ getWidth(), getHeight(),
+ data.getWidgetValue().toString(),
+ Style.getInstance(data.getFont())
+ .deriveHorizontalAlignment(data.getTextalign())
+ .deriveVerticalAlignment(data.isVerticalCenter() ? SwingConstants.CENTER : SwingConstants.TOP)
+ .deriveTextStyle(data.isWrap() ? Style.TEXTSTYLE_WRAPTEXT : Style.TEXTSTYLE_SINGLELINE),
+ insetImage, data.getInsetImagePadding(), data.isInsetRelativeTextLeft(), data.isInsetRelativeTextRight(),
+ Constants.FR_PAINT_RESOLUTION);
+ }
+
+ }
+
+ private static class Utils {
+ private static void paintBackground(Graphics2D g2d, Background background, Shape shape, float opacity) {
+ if (background != null) {
+ Composite oldComposite = g2d.getComposite();
+ g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, opacity));
+ background.paint(g2d, shape);
+ g2d.setComposite(oldComposite);
+ }
+ }
+
+ private static void clipByRoundBorder(Graphics2D g2d, int width, int height, int radius, int borderThickness) {
+ int currentClipRadius = Math.max(radius - borderThickness, 0);
+ g2d.clip(new RoundRectangle2D.Double(0, 0, width, height, currentClipRadius, currentClipRadius));
+ }
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/FormThemePreviewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/FormThemePreviewPane.java
new file mode 100644
index 000000000..1445dab35
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/FormThemePreviewPane.java
@@ -0,0 +1,198 @@
+package com.fr.design.mainframe.theme.preview;
+
+import com.fr.base.BaseFormula;
+import com.fr.base.background.ColorBackground;
+import com.fr.base.theme.FormTheme;
+import com.fr.chart.base.ChartConstants;
+import com.fr.chart.chartattr.ChartCollection;
+import com.fr.chart.chartattr.Title;
+import com.fr.chart.chartdata.NormalChartData;
+import com.fr.chart.charttypes.ChartTypeManager;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.mainframe.theme.TemplateThemePreviewPane;
+import com.fr.design.mainframe.theme.preview.ecpreview.ECComponentPreviewPane;
+import com.fr.general.Background;
+import com.fr.log.FineLoggerFactory;
+import com.fr.plugin.chart.PiePlot4VanChart;
+import com.fr.plugin.chart.attr.axis.VanChartAxis;
+import com.fr.plugin.chart.base.AttrLabel;
+import com.fr.plugin.chart.base.VanChartTools;
+import com.fr.plugin.chart.column.VanChartColumnPlot;
+import com.fr.plugin.chart.type.RadiusType;
+import com.fr.plugin.chart.vanchart.VanChart;
+import com.fr.stable.Constants;
+import com.fr.stable.StringUtils;
+import javax.swing.JPanel;
+import java.awt.AlphaComposite;
+import java.awt.Composite;
+import java.awt.Graphics2D;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.geom.Rectangle2D;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public class FormThemePreviewPane extends TemplateThemePreviewPane {
+ private ECComponentPreviewPane elementCasePane;
+ private Background background;
+ private ChartComponentPreviewPane columnChartPreviewPane;
+ private ChartComponentPreviewPane pieChartPreviewPane;
+ private float alpha = 1.0F;
+
+ public FormThemePreviewPane() {
+ setLayout(FRGUIPaneFactory.createBorderLayout());
+ JPanel content = new UINoOpaquePanel();
+ content.setLayout(new BorderLayout());
+ content.add(createChartContent(), BorderLayout.CENTER);
+ content.add(elementCasePane = new ECComponentPreviewPane(), BorderLayout.SOUTH);
+ add(content, BorderLayout.CENTER);
+ }
+
+ private JPanel createChartContent() {
+ JPanel chartContent = new UINoOpaquePanel();
+ chartContent.setLayout(new BorderLayout());
+ JPanel columnChartPanel = new UINoOpaquePanel() {
+ public Dimension getPreferredSize() {
+ return new Dimension(300, 368);
+ }
+ };
+ columnChartPanel.setLayout(new BorderLayout());
+ columnChartPreviewPane = createChartPreviewPane(initColumnChart(), 300, 368);
+ columnChartPanel.add(columnChartPreviewPane, BorderLayout.CENTER);
+
+ JPanel pieChartPanel = new UINoOpaquePanel() {
+ public Dimension getPreferredSize() {
+ return new Dimension(217, 368);
+ }
+ };
+ pieChartPanel.setLayout(new BorderLayout());
+ pieChartPreviewPane = createChartPreviewPane(initPieChart(), 217, 368);
+ pieChartPanel.add(pieChartPreviewPane, BorderLayout.CENTER);
+ chartContent.add(columnChartPanel, BorderLayout.CENTER);
+ chartContent.add(pieChartPanel, BorderLayout.EAST);
+ return chartContent;
+ }
+
+ private ChartComponentPreviewPane createChartPreviewPane(ChartCollection chartCollection, int width, int height) {
+ ChartComponentPreviewPane chartComponentPreviewPane = new ChartComponentPreviewPane(true);
+ chartComponentPreviewPane.getContentPane().populate(chartCollection);
+ chartComponentPreviewPane.getContentPane().setCallbackEvent(this);
+ return chartComponentPreviewPane;
+ }
+
+ @Override
+ public void refresh(FormTheme theme) {
+ background = theme.getBodyStyle().getStyle().getBackground();
+ alpha = theme.getBodyStyle().getStyle().getAlpha();
+ elementCasePane.refresh(theme);
+ columnChartPreviewPane.refresh(theme);
+ pieChartPreviewPane.refresh(theme);
+ repaint();
+ }
+
+
+ protected void paintBackground(Graphics2D g2d) {
+ if (background == null) {
+ background = ColorBackground.getInstance(Color.WHITE);
+ }
+ Composite oldComposite = g2d.getComposite();
+ g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
+ background.paint(g2d, new Rectangle2D.Double(0, 0, 517, 532));
+ g2d.setComposite(oldComposite);
+ }
+
+ //柱形图
+ private ChartCollection initColumnChart() {
+ try {
+ VanChart chart = (VanChart) ChartTypeManager.getInstance().getCharts(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID)[0].clone();
+ chart.getTitle().setTitleVisible(false);
+ VanChartTools vanChartTools = chart.getVanChartTools();
+ vanChartTools.setSort(false);
+ vanChartTools.setExport(false);
+ vanChartTools.setFullScreen(false);
+
+ VanChartColumnPlot plot = chart.getPlot();
+ AttrLabel defaultAttrLabel = plot.getDefaultAttrLabel();
+ defaultAttrLabel.setEnable(true);
+ defaultAttrLabel.getAttrLabelDetail().getBorder().setBorderStyle(0);
+ defaultAttrLabel.getAttrLabelDetail().getBackground().setBackground(null);
+ plot.getConditionCollection().getDefaultAttr().addDataSeriesCondition(defaultAttrLabel);
+
+ plot.getLegend().setPosition(Constants.TOP);
+ plot.setPlotStyle(ChartConstants.STYLE_NONE);
+ plot.setSeriesOverlapPercent(30);
+ plot.setCategoryIntervalPercent(30);
+
+ VanChartAxis defaultYAxis = plot.getDefaultYAxis();
+ Title title = new Title();
+ title.setTextObject(Toolkit.i18nText("Fine-Design_Chart_Axis_Title"));
+ title.getTextAttr().setRotation(-90);
+ title.getTextAttr().setThemed(true);
+ defaultYAxis.setTitle(title);
+ defaultYAxis.setShowAxisTitle(true);
+ defaultYAxis.setCustomMaxValue(true);
+ defaultYAxis.setCustomMinValue(true);
+ defaultYAxis.setCustomMainUnit(true);
+ defaultYAxis.setMaxValue(BaseFormula.createFormulaBuilder().build("=600"));
+ defaultYAxis.setMinValue(BaseFormula.createFormulaBuilder().build("=0"));
+ defaultYAxis.setMainUnit(BaseFormula.createFormulaBuilder().build("=200"));
+
+ Object[] category = {
+ Toolkit.i18nText("Fine-Design_Chart_Category") + "1",
+ Toolkit.i18nText("Fine-Design_Chart_Category") + "2",
+ Toolkit.i18nText("Fine-Design_Chart_Category") + "3",
+ Toolkit.i18nText("Fine-Design_Chart_Category") + "4"
+ };
+ Object[] series = {
+ Toolkit.i18nText("Fine-Design_Chart_Series") + "1",
+ Toolkit.i18nText("Fine-Design_Chart_Series") + "2"
+ };
+ Object[][] value = {
+ {"250", "540", "300", "410"},
+ {"180", "190", "170", "100"},
+ };
+ NormalChartData normalChartData = new NormalChartData(category, series, value);
+ chart.setPreViewChartData(normalChartData);
+ ChartCollection chartCollection = new ChartCollection(chart);
+ return chartCollection;
+ } catch (Exception ex) {
+ FineLoggerFactory.getLogger().error(ex.getMessage(), ex);
+ }
+ return null;
+ }
+
+ //饼图
+ private ChartCollection initPieChart() {
+ try {
+ VanChart chart = (VanChart) ChartTypeManager.getInstance().getCharts(PiePlot4VanChart.VAN_CHART_PIE_PLOT)[0].clone();
+ chart.getTitle().setTitleVisible(false);
+ VanChartTools vanChartTools = chart.getVanChartTools();
+ vanChartTools.setSort(false);
+ vanChartTools.setExport(false);
+ vanChartTools.setFullScreen(false);
+
+ PiePlot4VanChart plot = chart.getPlot();
+ plot.getLegend().setPosition(Constants.BOTTOM);
+ plot.setPlotStyle(ChartConstants.STYLE_NONE);
+ plot.setInnerRadiusPercent(75);
+ plot.getRadius().setRadiusType(RadiusType.FIXED);
+ plot.getRadius().setRadius(80);
+
+ Object[] category = {StringUtils.EMPTY};
+ Object[] series = {"A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"};
+ Object[][] value = {{45}, {24}, {12}, {8}, {5}, {3}, {2}, {1},};
+ NormalChartData normalChartData = new NormalChartData(category, series, value);
+ chart.setPreViewChartData(normalChartData);
+ ChartCollection chartCollection = new ChartCollection(chart);
+ return chartCollection;
+ } catch (Exception ex) {
+ FineLoggerFactory.getLogger().error(ex.getMessage(), ex);
+ }
+ return null;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ReportThemePreviewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ReportThemePreviewPane.java
new file mode 100644
index 000000000..02d3aa96c
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ReportThemePreviewPane.java
@@ -0,0 +1,126 @@
+package com.fr.design.mainframe.theme.preview;
+
+import com.fr.base.BaseFormula;
+import com.fr.base.background.ColorBackground;
+import com.fr.base.theme.ReportTheme;
+import com.fr.chart.base.ChartConstants;
+import com.fr.chart.chartattr.ChartCollection;
+import com.fr.chart.chartattr.Title;
+import com.fr.chart.chartdata.NormalChartData;
+import com.fr.chart.charttypes.ChartTypeManager;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.mainframe.theme.TemplateThemePreviewPane;
+import com.fr.design.mainframe.theme.preview.ecpreview.ECReportPreviewPane;
+import com.fr.general.Background;
+import com.fr.log.FineLoggerFactory;
+import com.fr.plugin.chart.attr.axis.VanChartAxis;
+import com.fr.plugin.chart.base.AttrLabel;
+import com.fr.plugin.chart.base.VanChartTools;
+import com.fr.plugin.chart.column.VanChartColumnPlot;
+import com.fr.plugin.chart.vanchart.VanChart;
+
+import java.awt.Graphics2D;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.geom.Rectangle2D;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public class ReportThemePreviewPane extends TemplateThemePreviewPane {
+ private Background background;
+
+ private final ECReportPreviewPane reportPreviewPane;
+
+ private final ChartPreviewPane chartPreviewPane;
+
+ public ReportThemePreviewPane(){
+ setLayout(FRGUIPaneFactory.createBorderLayout());
+ chartPreviewPane = new ChartPreviewPane();
+ chartPreviewPane.populate(initColumnChart());
+ chartPreviewPane.setCallbackEvent(this);
+ reportPreviewPane = new ECReportPreviewPane();
+ this.add(chartPreviewPane, BorderLayout.CENTER);
+ this.add(reportPreviewPane, BorderLayout.SOUTH);
+ }
+
+ @Override
+ public void refresh(ReportTheme theme) {
+ background = theme.getBodyStyle().getBackground();
+ reportPreviewPane.refresh(theme);
+ chartPreviewPane.refresh(theme);
+ repaint();
+ }
+
+
+ protected void paintBackground(Graphics2D g2d) {
+ if (background == null) {
+ background = ColorBackground.getInstance(Color.WHITE);
+ }
+ background.paint(g2d, new Rectangle2D.Double(0, 0, 517, 532));
+ }
+
+
+ //柱形图
+ private ChartCollection initColumnChart() {
+ try {
+ VanChart chart = (VanChart) ChartTypeManager.getInstance().getCharts(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID)[0].clone();
+ VanChartTools vanChartTools = chart.getVanChartTools();
+ vanChartTools.setSort(false);
+ vanChartTools.setExport(false);
+ vanChartTools.setFullScreen(false);
+
+ VanChartColumnPlot plot = chart.getPlot();
+ AttrLabel defaultAttrLabel = plot.getDefaultAttrLabel();
+ defaultAttrLabel.setEnable(true);
+ defaultAttrLabel.getAttrLabelDetail().getBorder().setBorderStyle(0);
+ defaultAttrLabel.getAttrLabelDetail().getBackground().setBackground(null);
+ plot.getConditionCollection().getDefaultAttr().addDataSeriesCondition(defaultAttrLabel);
+
+ plot.setPlotStyle(ChartConstants.STYLE_NONE);
+ plot.setSeriesOverlapPercent(30);
+ plot.setCategoryIntervalPercent(30);
+
+ VanChartAxis defaultYAxis = plot.getDefaultYAxis();
+ Title title = new Title();
+ title.setTextObject(Toolkit.i18nText("Fine-Design_Chart_Axis_Title"));
+ title.getTextAttr().setRotation(-90);
+ title.getTextAttr().setThemed(true);
+ defaultYAxis.setTitle(title);
+ defaultYAxis.setShowAxisTitle(true);
+ defaultYAxis.setCustomMaxValue(true);
+ defaultYAxis.setCustomMinValue(true);
+ defaultYAxis.setCustomMainUnit(true);
+ defaultYAxis.setMaxValue(BaseFormula.createFormulaBuilder().build("=600"));
+ defaultYAxis.setMinValue(BaseFormula.createFormulaBuilder().build("=0"));
+ defaultYAxis.setMainUnit(BaseFormula.createFormulaBuilder().build("=200"));
+
+ Object[] category = {
+ Toolkit.i18nText("Fine-Design_Chart_Category") + "1",
+ Toolkit.i18nText("Fine-Design_Chart_Category") + "2",
+ Toolkit.i18nText("Fine-Design_Chart_Category") + "3",
+ Toolkit.i18nText("Fine-Design_Chart_Category") + "4"
+ };
+ Object[] series = {
+ Toolkit.i18nText("Fine-Design_Chart_Series") + "1",
+ Toolkit.i18nText("Fine-Design_Chart_Series") + "2",
+ Toolkit.i18nText("Fine-Design_Chart_Series") + "3"
+ };
+ Object[][] value = {
+ {"340", "510", "300", "250"},
+ {"180", "360", "170", "100"},
+ {"210", "205", "405", "190"}
+ };
+ NormalChartData normalChartData = new NormalChartData(category, series, value);
+ chart.setPreViewChartData(normalChartData);
+ ChartCollection chartCollection = new ChartCollection(chart);
+ return chartCollection;
+ } catch (Exception ex) {
+ FineLoggerFactory.getLogger().error(ex.getMessage(), ex);
+ }
+ return null;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ThemePreviewed.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ThemePreviewed.java
new file mode 100644
index 000000000..bb2aa05c2
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ThemePreviewed.java
@@ -0,0 +1,10 @@
+package com.fr.design.mainframe.theme.preview;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public interface ThemePreviewed {
+ void refresh(T style);
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/UINoOpaquePanel.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/UINoOpaquePanel.java
new file mode 100644
index 000000000..16eb2d55e
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/UINoOpaquePanel.java
@@ -0,0 +1,19 @@
+package com.fr.design.mainframe.theme.preview;
+
+import javax.swing.JPanel;
+import java.awt.LayoutManager;
+
+public class UINoOpaquePanel extends JPanel {
+
+ public UINoOpaquePanel(){
+ super();
+ this.setOpaque(false);
+ this.setBackground(null);
+ }
+
+ public UINoOpaquePanel(LayoutManager layout) {
+ super(layout, true);
+ this.setOpaque(false);
+ this.setBackground(null);
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/AbstractECPreviewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/AbstractECPreviewPane.java
new file mode 100644
index 000000000..cf9822aba
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/AbstractECPreviewPane.java
@@ -0,0 +1,47 @@
+package com.fr.design.mainframe.theme.preview.ecpreview;
+
+import com.fr.base.Style;
+import com.fr.base.theme.TemplateTheme;
+import com.fr.base.theme.settings.ThemedCellStyle;
+import com.fr.base.theme.settings.ThemedCellStyleList;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.mainframe.theme.preview.ThemePreviewed;
+import com.fr.design.mainframe.theme.preview.UINoOpaquePanel;
+import com.fr.design.mainframe.theme.preview.ecpreview.cell.AbstractPreviewCell;
+import com.fr.design.mainframe.theme.preview.ecpreview.cell.PreviewCell;
+
+import javax.swing.JPanel;
+import java.util.List;
+
+public abstract class AbstractECPreviewPane extends UINoOpaquePanel implements ThemePreviewed {
+ protected Style getReportHeaderStyle(ThemedCellStyleList cellStyleList) {
+ return getCellStyle(cellStyleList, Toolkit.i18nText("Fine-Design_Basic_Predefined_Style_Header"));
+ }
+
+ protected Style getMainContentStyle(ThemedCellStyleList cellStyleList) {
+ return getCellStyle(cellStyleList, Toolkit.i18nText("Fine-Design_Basic_Predefined_Style_Main_Text"));
+ }
+
+ protected Style getHighLightStyle(ThemedCellStyleList cellStyleList) {
+ return getCellStyle(cellStyleList, Toolkit.i18nText("Fine-Design_Basic_Predefined_Style_Highlight_Text"));
+ }
+
+ protected Style getSmallTitleStyle(ThemedCellStyleList cellStyleList) {
+ return getCellStyle(cellStyleList, Toolkit.i18nText("Fine-Design_Basic_Predefined_Style_Small_Title"));
+ }
+
+ private Style getCellStyle(ThemedCellStyleList cellStyleList, String styleName) {
+ ThemedCellStyle cellStyle = cellStyleList.find(styleName);
+ if (cellStyle == null) {
+ return Style.DEFAULT_STYLE;
+ }
+ return cellStyle.getStyle();
+ }
+
+ protected void refresh(List list, Style style) {
+ for (AbstractPreviewCell cell : list) {
+ cell.refresh(style);
+ }
+ }
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/ECComponentPreviewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/ECComponentPreviewPane.java
new file mode 100644
index 000000000..ff88607d4
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/ECComponentPreviewPane.java
@@ -0,0 +1,27 @@
+package com.fr.design.mainframe.theme.preview.ecpreview;
+
+import com.fr.base.theme.FormTheme;
+import com.fr.design.mainframe.theme.preview.ComponentPreviewPane;
+
+import java.awt.Component;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public class ECComponentPreviewPane extends ComponentPreviewPane {
+ private ECPreviewPane contentPane;
+
+ @Override
+ protected Component createContentPane() {
+ contentPane = new ECPreviewPane();
+ return contentPane;
+ }
+
+ @Override
+ public void refresh(FormTheme theme) {
+ super.refresh(theme);
+ contentPane.refresh(theme);
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/ECPreviewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/ECPreviewPane.java
new file mode 100644
index 000000000..2497dadbe
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/ECPreviewPane.java
@@ -0,0 +1,104 @@
+package com.fr.design.mainframe.theme.preview.ecpreview;
+
+import com.fr.base.theme.TemplateTheme;
+import com.fr.base.theme.settings.ThemedCellStyleList;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.mainframe.theme.preview.UINoOpaquePanel;
+import com.fr.design.mainframe.theme.preview.ecpreview.cell.AbstractPreviewCell;
+import com.fr.design.mainframe.theme.preview.ecpreview.cell.PreviewCell;
+import com.fr.log.FineLoggerFactory;
+
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.io.BufferedReader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/13
+ */
+public class ECPreviewPane extends AbstractECPreviewPane {
+ private static String csv =
+ "城市 当月目标 当月实际完成 月度完成率 全年完成率\n" +
+ "南通市 324,646 324,646 100% 100%\n" +
+ "合肥市 248,938 348,938 140% 140%\n" +
+ "邵阳市 248,938 348,938 140% 140%\n" +
+ "合计 1,071,460 1,371,460 128% 128%";
+ private final List DATA_LIST = createDataList();
+ private static final String BLANK_CHAR = " ";
+ private List headerCellList = new ArrayList<>();
+ private List contentCellList = new ArrayList<>();
+ private List hightLightCellList = new ArrayList<>();
+
+ private List createDataList() {
+ List data = new ArrayList<>();
+ try (BufferedReader reader = new BufferedReader(new StringReader(csv))) {
+ String textLine;
+ while ((textLine = reader.readLine()) != null) {
+ String[] texts = textLine.split(BLANK_CHAR);
+ data.add(texts);
+ }
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ return data;
+ }
+
+
+ public ECPreviewPane() {
+ this.setPreferredSize(new Dimension(517, 170));
+ this.setBorder(BorderFactory.createEmptyBorder(0, 1, 2, 1));
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ String[] titleArr = DATA_LIST.get(0);
+ String[] endArr = DATA_LIST.get(DATA_LIST.size() - 1);
+ JPanel titlePane = new UINoOpaquePanel(new GridLayout());
+ this.add(titlePane, BorderLayout.NORTH);
+ for (String title : titleArr) {
+ PreviewCell cell = new PreviewCell(title);
+ cell.setPreferredSize(new Dimension(103, 36));
+ titlePane.add(cell);
+ headerCellList.add(cell);
+ }
+
+ JPanel contentPane = new UINoOpaquePanel(new GridLayout(3, 5, 0, 0));
+ this.add(contentPane, BorderLayout.CENTER);
+ for (int i = 1; i < DATA_LIST.size() - 1; i++) {
+ String[] textLine = DATA_LIST.get(i);
+ for (int j = 0; j < textLine.length; j++) {
+ String text = textLine[j];
+ PreviewCell cell = new PreviewCell(text);
+ cell.setPreferredSize(new Dimension(103, 33));
+ contentPane.add(cell);
+ contentCellList.add(cell);
+ }
+ }
+
+ JPanel endPane = new UINoOpaquePanel(new GridLayout());
+ this.add(endPane, BorderLayout.SOUTH);
+ for (String text : endArr) {
+ PreviewCell cell = new PreviewCell(text);
+ cell.setPreferredSize(new Dimension(103, 33));
+ endPane.add(cell);
+ hightLightCellList.add(cell);
+ }
+
+
+ }
+
+ @Override
+ public void refresh(TemplateTheme theme) {
+ ThemedCellStyleList cellStyleConfig = theme.getCellStyleList();
+ refresh(headerCellList, getReportHeaderStyle(cellStyleConfig));
+ refresh(contentCellList, getMainContentStyle(cellStyleConfig));
+ refresh(hightLightCellList, getHighLightStyle(cellStyleConfig));
+ }
+
+
+}
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
new file mode 100644
index 000000000..4274950cf
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/ECReportPreviewPane.java
@@ -0,0 +1,126 @@
+package com.fr.design.mainframe.theme.preview.ecpreview;
+
+import com.fr.base.theme.ReportTheme;
+import com.fr.base.theme.TemplateTheme;
+import com.fr.base.theme.settings.ThemedCellStyleList;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.mainframe.theme.preview.ThemePreviewed;
+import com.fr.design.mainframe.theme.preview.UINoOpaquePanel;
+import com.fr.design.mainframe.theme.preview.ecpreview.cell.AbstractPreviewCell;
+import com.fr.design.mainframe.theme.preview.ecpreview.cell.CornerPreviewCell;
+import com.fr.design.mainframe.theme.preview.ecpreview.cell.PreviewCell;
+
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.Point;
+import java.awt.geom.Point2D;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ECReportPreviewPane extends UINoOpaquePanel implements ThemePreviewed {
+ private List headerCellList = new ArrayList<>();
+ private List titleCellList = new ArrayList<>();
+ private List contentCellList = new ArrayList<>();
+ private List highLightCellList = new ArrayList<>();
+
+ private PreviewPane previewPane;
+
+ public ECReportPreviewPane() {
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ previewPane = new PreviewPane();
+ this.add(previewPane, BorderLayout.CENTER);
+ }
+
+ @Override
+ public void refresh(ReportTheme theme) {
+ previewPane.refresh(theme);
+ }
+
+
+ class PreviewPane extends AbstractECPreviewPane {
+
+
+ public PreviewPane() {
+ this.setPreferredSize(new Dimension(517, 270));
+ this.setBorder(BorderFactory.createEmptyBorder(7, 10, 5, 10));
+
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ JPanel northPane = createNorthPane();
+ JPanel centerPane = createCenterPane();
+ this.add(northPane, BorderLayout.NORTH);
+ this.add(centerPane, BorderLayout.CENTER);
+ }
+
+ private JPanel createNorthPane() {
+ JPanel northPane = FRGUIPaneFactory.createBorderLayout_NO_Opaque_Pane();
+ CornerPreviewCell cornerCell = new CornerPreviewCell(new String[]{"产品", "数据", "统计维度"}, new Point2D[]{new Point(132, 75), new Point(189, 53)});
+ cornerCell.setPreferredSize(new Dimension(189, 75));
+ headerCellList.add(cornerCell);
+ northPane.add(cornerCell, BorderLayout.WEST);
+ JPanel centerPane = FRGUIPaneFactory.createBorderLayout_NO_Opaque_Pane();
+ northPane.add(centerPane, BorderLayout.CENTER);
+ PreviewCell cell = new PreviewCell("按地区统计");
+ titleCellList.add(cell);
+ cell.setPreferredSize(new Dimension(308, 38));
+ centerPane.add(cell, BorderLayout.NORTH);
+ JPanel eastSouthPane = new UINoOpaquePanel(new GridLayout());
+ PreviewCell cell1 = new PreviewCell("华东");
+ PreviewCell cell2 = new PreviewCell("华南");
+ PreviewCell cell3 = new PreviewCell("小计");
+ headerCellList.add(cell1);
+ headerCellList.add(cell2);
+ headerCellList.add(cell3);
+ eastSouthPane.add(cell1);
+ eastSouthPane.add(cell2);
+ eastSouthPane.add(cell3);
+ centerPane.add(eastSouthPane, BorderLayout.CENTER);
+ return northPane;
+ }
+
+ private JPanel createCenterPane() {
+ JPanel centerPane = FRGUIPaneFactory.createBorderLayout_NO_Opaque_Pane();
+ JPanel westPane = FRGUIPaneFactory.createBorderLayout_NO_Opaque_Pane();
+ centerPane.add(westPane, BorderLayout.WEST);
+ PreviewCell cell1 = new PreviewCell("饮料");
+ titleCellList.add(cell1);
+ cell1.setPreferredSize(new Dimension(94, 183));
+ westPane.add(cell1, BorderLayout.WEST);
+ JPanel gridPane = new UINoOpaquePanel(new GridLayout(6, 1));
+ for (int i = 0; i < 6; i++) {
+ PreviewCell cell = new PreviewCell("苹果汁");
+ cell.setPreferredSize(new Dimension(95, 31));
+ headerCellList.add(cell);
+ gridPane.add(cell);
+ }
+ westPane.add(gridPane, BorderLayout.CENTER);
+
+ JPanel innerCenterPane = new UINoOpaquePanel(new GridLayout(6, 3));
+ centerPane.add(innerCenterPane, BorderLayout.CENTER);
+ for (int i = 0; i < 18; i++) {
+ PreviewCell cell = new PreviewCell("35600");
+ cell.setPreferredSize(new Dimension(102, 31));
+ if ((i + 1) % 3 == 0) {
+ highLightCellList.add(cell);
+ } else {
+ contentCellList.add(cell);
+ }
+ innerCenterPane.add(cell);
+ }
+
+
+ return centerPane;
+ }
+
+ @Override
+ public void refresh(TemplateTheme theme) {
+ ThemedCellStyleList cellStyleConfig = theme.getCellStyleList();
+ refresh(headerCellList, getReportHeaderStyle(cellStyleConfig));
+ refresh(contentCellList, getMainContentStyle(cellStyleConfig));
+ refresh(titleCellList, getSmallTitleStyle(cellStyleConfig));
+ refresh(highLightCellList, getHighLightStyle(cellStyleConfig));
+ }
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/cell/AbstractPreviewCell.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/cell/AbstractPreviewCell.java
new file mode 100644
index 000000000..9c7c335de
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/cell/AbstractPreviewCell.java
@@ -0,0 +1,32 @@
+package com.fr.design.mainframe.theme.preview.ecpreview.cell;
+
+import com.fr.base.ScreenResolution;
+import com.fr.base.Style;
+
+import javax.swing.JComponent;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+
+public abstract class AbstractPreviewCell extends JComponent {
+ protected Style style = Style.DEFAULT_STYLE;
+
+ public void refresh(Style style) {
+ this.style = style;
+ }
+
+ public void paint(Graphics g) {
+ Graphics2D g2d = (Graphics2D) g;
+ int resolution = ScreenResolution.getScreenResolution();
+ Style.paintBackground(g2d, style, getWidth(), getHeight());
+ paintContent(g2d, resolution);
+ Style.paintBorder(g2d, style, getWidth(), getHeight());
+ }
+
+ protected abstract void paintContent(Graphics2D g2d, int resolution);
+
+ @Override
+ public Dimension getMinimumSize() {
+ return new Dimension(125, 30);
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/cell/CornerPreviewCell.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/cell/CornerPreviewCell.java
new file mode 100644
index 000000000..00cb90774
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/cell/CornerPreviewCell.java
@@ -0,0 +1,33 @@
+package com.fr.design.mainframe.theme.preview.ecpreview.cell;
+
+import com.fr.general.FRFont;
+import com.fr.stable.GraphDrawHelper;
+
+import java.awt.Graphics2D;
+import java.awt.geom.Line2D;
+import java.awt.geom.Point2D;
+
+public class CornerPreviewCell extends AbstractPreviewCell {
+ private final String[] values;
+ private final Point2D[] point2DS;
+
+ public CornerPreviewCell(String[] values, Point2D[] point2DS) {
+ this.values = values;
+ this.point2DS = point2DS;
+ }
+
+ @Override
+ protected void paintContent(Graphics2D g2d, int resolution) {
+ FRFont frFont = style.getFRFont();
+ g2d.setPaint(frFont.getForeground());
+ g2d.drawString(values[0], 23, 53);
+ GraphDrawHelper.drawRotatedString(g2d, values[1], 104, 50, 30);
+ g2d.drawString(values[2], 128, 23);
+ //画分割线
+ for (int i = 0; i < point2DS.length; i++) {
+ g2d.draw(new Line2D.Double(0, 0, point2DS[i].getX(), point2DS[i].getY())); //画线
+ }
+ }
+
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/cell/PreviewCell.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/cell/PreviewCell.java
new file mode 100644
index 000000000..a6a5836db
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/preview/ecpreview/cell/PreviewCell.java
@@ -0,0 +1,25 @@
+package com.fr.design.mainframe.theme.preview.ecpreview.cell;
+
+import com.fr.base.Style;
+
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+
+public class PreviewCell extends AbstractPreviewCell {
+
+ private final String value;
+
+ public PreviewCell(String value) {
+ this.value = value;
+ }
+
+ @Override
+ protected void paintContent(Graphics2D g2d, int resolution) {
+ Style.paintContent(g2d, value, style, getWidth() - 3, getHeight() - 3, resolution);
+ }
+
+ @Override
+ public Dimension getMinimumSize() {
+ return new Dimension(125, 30);
+ }
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/ui/BorderUtils.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/ui/BorderUtils.java
new file mode 100644
index 000000000..3b7a8b6c0
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/ui/BorderUtils.java
@@ -0,0 +1,30 @@
+package com.fr.design.mainframe.theme.ui;
+
+import com.fr.design.border.UIRoundedBorder;
+import com.fr.general.FRFont;
+
+import javax.swing.border.Border;
+import javax.swing.border.TitledBorder;
+import java.awt.Color;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/15
+ */
+public class BorderUtils {
+ public static Border createTitleBorder(String title) {
+ return createTitleBorder(title, 12);
+ }
+ public static Border createTitleBorder(String title, int size) {
+ return new NoEdgeTitleBorder(
+ new UIRoundedBorder(new Color(0XE0E0E1), 1, 1),
+ title,
+ TitledBorder.LEADING,
+ TitledBorder.TOP,
+ FRFont.getInstance().applySize(size),
+ new Color(47, 142, 241)
+ );
+ }
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/ui/NoEdgeTitleBorder.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/ui/NoEdgeTitleBorder.java
new file mode 100644
index 000000000..bf532b00f
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/ui/NoEdgeTitleBorder.java
@@ -0,0 +1,320 @@
+package com.fr.design.mainframe.theme.ui;
+
+import javax.swing.JLabel;
+import javax.swing.UIManager;
+import javax.swing.border.AbstractBorder;
+import javax.swing.border.Border;
+import javax.swing.border.TitledBorder;
+import javax.swing.plaf.basic.BasicHTML;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Insets;
+import java.awt.Rectangle;
+import java.awt.geom.Path2D;
+
+/**
+ * @author Starryi
+ * @version 1.0
+ * Created by Starryi on 2021/8/16
+ * 修正TitleBorder默认的行为,使得组件有多大,边框就有多大
+ */
+public class NoEdgeTitleBorder extends TitledBorder {
+
+ private final JLabel label;
+
+ public NoEdgeTitleBorder(Border border, String title, int titleJustification, int titlePosition, Font titleFont, Color titleColor) {
+ super(border, title, titleJustification, titlePosition, titleFont, titleColor);
+
+ this.label = new JLabel();
+ this.label.setOpaque(false);
+ this.label.putClientProperty(BasicHTML.propertyKey, null);
+ }
+
+ public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
+ Border border = getBorder();
+ String title = getTitle();
+ if ((title != null) && !title.isEmpty()) {
+ int edge = 0; //(border instanceof TitledBorder) ? 0 : EDGE_SPACING;
+ JLabel label = getLabel(c);
+ Dimension size = label.getPreferredSize();
+ Insets insets = getBorderInsets(border, c, new Insets(0, 0, 0, 0));
+
+ int borderX = x + edge;
+ int borderY = y + edge;
+ int borderW = width - edge - edge;
+ int borderH = height - edge - edge;
+
+ int labelY = y;
+ int labelH = size.height;
+ int position = getPosition();
+ switch (position) {
+ case ABOVE_TOP:
+ insets.left = 0;
+ insets.right = 0;
+ borderY += labelH - edge;
+ borderH -= labelH - edge;
+ break;
+ case TOP:
+ insets.top = edge + insets.top/2 - labelH/2;
+ if (insets.top < edge) {
+ borderY -= insets.top;
+ borderH += insets.top;
+ }
+ else {
+ labelY += insets.top;
+ }
+ break;
+ case BELOW_TOP:
+ labelY += insets.top + edge;
+ break;
+ case ABOVE_BOTTOM:
+ labelY += height - labelH - insets.bottom - edge;
+ break;
+ case BOTTOM:
+ labelY += height - labelH;
+ insets.bottom = edge + (insets.bottom - labelH) / 2;
+ if (insets.bottom < edge) {
+ borderH += insets.bottom;
+ }
+ else {
+ labelY -= insets.bottom;
+ }
+ break;
+ case BELOW_BOTTOM:
+ insets.left = 0;
+ insets.right = 0;
+ labelY += height - labelH;
+ borderH -= labelH - edge;
+ break;
+ }
+ insets.left += edge + TEXT_INSET_H;
+ insets.right += edge + TEXT_INSET_H;
+
+ int labelX = x;
+ int labelW = width - insets.left - insets.right;
+ if (labelW > size.width) {
+ labelW = size.width;
+ }
+ switch (getJustification(c)) {
+ case LEFT:
+ labelX += insets.left;
+ break;
+ case RIGHT:
+ labelX += width - insets.right - labelW;
+ break;
+ case CENTER:
+ labelX += (width - labelW) / 2;
+ break;
+ }
+
+ if (border != null) {
+ if ((position != TOP) && (position != BOTTOM)) {
+ border.paintBorder(c, g, borderX, borderY, borderW, borderH);
+ }
+ else {
+ Graphics g2 = g.create();
+ if (g2 instanceof Graphics2D) {
+ Graphics2D g2d = (Graphics2D) g2;
+ Path2D path = new Path2D.Float();
+ path.append(new Rectangle(borderX, borderY, borderW, labelY - borderY), false);
+ path.append(new Rectangle(borderX, labelY, labelX - borderX - TEXT_SPACING, labelH), false);
+ path.append(new Rectangle(labelX + labelW + TEXT_SPACING, labelY, borderX - labelX + borderW - labelW - TEXT_SPACING, labelH), false);
+ path.append(new Rectangle(borderX, labelY + labelH, borderW, borderY - labelY + borderH - labelH), false);
+ g2d.clip(path);
+ }
+ border.paintBorder(c, g2, borderX, borderY, borderW, borderH);
+ g2.dispose();
+ }
+ }
+ g.translate(labelX, labelY);
+ label.setSize(labelW, labelH);
+ label.paint(g);
+ g.translate(-labelX, -labelY);
+ }
+ else if (border != null) {
+ border.paintBorder(c, g, x, y, width, height);
+ }
+ }
+
+ /**
+ * Reinitialize the insets parameter with this Border's current Insets.
+ * @param c the component for which this border insets value applies
+ * @param insets the object to be reinitialized
+ */
+ public Insets getBorderInsets(Component c, Insets insets) {
+ Border border = getBorder();
+ insets = getBorderInsets(border, c, insets);
+
+ String title = getTitle();
+ if ((title != null) && !title.isEmpty()) {
+ int edge = 0; //(border instanceof TitledBorder) ? 0 : EDGE_SPACING;
+ JLabel label = getLabel(c);
+ Dimension size = label.getPreferredSize();
+
+ switch (getPosition()) {
+ case ABOVE_TOP:
+ insets.top += size.height - edge;
+ break;
+ case TOP: {
+ if (insets.top < size.height) {
+ insets.top = size.height - edge;
+ }
+ break;
+ }
+ case BELOW_TOP:
+ insets.top += size.height;
+ break;
+ case ABOVE_BOTTOM:
+ insets.bottom += size.height;
+ break;
+ case BOTTOM: {
+ if (insets.bottom < size.height) {
+ insets.bottom = size.height - edge;
+ }
+ break;
+ }
+ case BELOW_BOTTOM:
+ insets.bottom += size.height - edge;
+ break;
+ }
+ insets.top += edge; //TEXT_SPACING;
+ insets.left += edge; //TEXT_SPACING;
+ insets.right += edge; //TEXT_SPACING;
+ insets.bottom += edge; //TEXT_SPACING;
+ }
+ return insets;
+ }
+
+ public int getBaseline(Component c, int width, int height) {
+ if (c == null) {
+ throw new NullPointerException("Must supply non-null component");
+ }
+ if (width < 0) {
+ throw new IllegalArgumentException("Width must be >= 0");
+ }
+ if (height < 0) {
+ throw new IllegalArgumentException("Height must be >= 0");
+ }
+ Border border = getBorder();
+ String title = getTitle();
+ if ((title != null) && !title.isEmpty()) {
+ int edge = 0; //(border instanceof TitledBorder) ? 0 : EDGE_SPACING;
+ JLabel label = getLabel(c);
+ Dimension size = label.getPreferredSize();
+ Insets insets = getBorderInsets(border, c, new Insets(0, 0, 0, 0));
+
+ int baseline = label.getBaseline(size.width, size.height);
+ switch (getPosition()) {
+ case ABOVE_TOP:
+ return baseline;
+ case TOP:
+ insets.top = edge + (insets.top - size.height) / 2;
+ return (insets.top < edge)
+ ? baseline
+ : baseline + insets.top;
+ case BELOW_TOP:
+ return baseline + insets.top + edge;
+ case ABOVE_BOTTOM:
+ return baseline + height - size.height - insets.bottom - edge;
+ case BOTTOM:
+ insets.bottom = edge + (insets.bottom - size.height) / 2;
+ return (insets.bottom < edge)
+ ? baseline + height - size.height
+ : baseline + height - size.height + insets.bottom;
+ case BELOW_BOTTOM:
+ return baseline + height - size.height;
+ }
+ }
+ return -1;
+ }
+
+ private int getPosition() {
+ int position = getTitlePosition();
+ if (position != DEFAULT_POSITION) {
+ return position;
+ }
+ Object value = UIManager.get("TitledBorder.position");
+ if (value instanceof Integer) {
+ int i = (Integer) value;
+ if ((0 < i) && (i <= 6)) {
+ return i;
+ }
+ }
+ else if (value instanceof String) {
+ String s = (String) value;
+ if (s.equalsIgnoreCase("ABOVE_TOP")) {
+ return ABOVE_TOP;
+ }
+ if (s.equalsIgnoreCase("TOP")) {
+ return TOP;
+ }
+ if (s.equalsIgnoreCase("BELOW_TOP")) {
+ return BELOW_TOP;
+ }
+ if (s.equalsIgnoreCase("ABOVE_BOTTOM")) {
+ return ABOVE_BOTTOM;
+ }
+ if (s.equalsIgnoreCase("BOTTOM")) {
+ return BOTTOM;
+ }
+ if (s.equalsIgnoreCase("BELOW_BOTTOM")) {
+ return BELOW_BOTTOM;
+ }
+ }
+ return TOP;
+ }
+
+ private int getJustification(Component c) {
+ int justification = getTitleJustification();
+ if ((justification == LEADING) || (justification == DEFAULT_JUSTIFICATION)) {
+ return c.getComponentOrientation().isLeftToRight() ? LEFT : RIGHT;
+ }
+ if (justification == TRAILING) {
+ return c.getComponentOrientation().isLeftToRight() ? RIGHT : LEFT;
+ }
+ return justification;
+ }
+
+ private Color getColor(Component c) {
+ Color color = getTitleColor();
+ if (color != null) {
+ return color;
+ }
+ return (c != null)
+ ? c.getForeground()
+ : null;
+ }
+
+ private JLabel getLabel(Component c) {
+ this.label.setText(getTitle());
+ Font font = getFont(c);
+ this.label.setFont(font);
+ this.label.setForeground(getColor(c));
+ this.label.setComponentOrientation(c.getComponentOrientation());
+ this.label.setEnabled(c.isEnabled());
+ Dimension dimension = this.label.getPreferredSize();
+ dimension.height = font.getSize();
+ this.label.setPreferredSize(dimension);
+ return this.label;
+ }
+
+ private static Insets getBorderInsets(Border border, Component c, Insets insets) {
+ if (border == null) {
+ insets.set(0, 0, 0, 0);
+ }
+ else if (border instanceof AbstractBorder) {
+ AbstractBorder ab = (AbstractBorder) border;
+ insets = ab.getBorderInsets(c, insets);
+ }
+ else {
+ Insets i = border.getBorderInsets(c);
+ insets.set(i.top, i.left, i.bottom, i.right);
+ }
+ return insets;
+ }
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/notification/SnapChatAllTypes.java b/designer-base/src/main/java/com/fr/design/notification/SnapChatAllTypes.java
index d94da0c88..ae83a0bb9 100644
--- a/designer-base/src/main/java/com/fr/design/notification/SnapChatAllTypes.java
+++ b/designer-base/src/main/java/com/fr/design/notification/SnapChatAllTypes.java
@@ -12,7 +12,13 @@ public abstract class SnapChatAllTypes {
/**
* 社区按钮
*/
- BBS("BBS");
+ BBS("BBS"),
+
+ /**
+ * 服务器按钮
+ */
+ SERVER("SERVER");
+
private static final String SIGN = "0001";
@@ -35,4 +41,32 @@ public abstract class SnapChatAllTypes {
}
}
+ public enum UpdateAction implements SnapChatKey {
+
+ /**
+ * 服务器模版主题管理
+ */
+ TEMPLATE_THEMES_MANAGER("TEMPLATE_THEMES_MANAGER");
+
+ private static final String SIGN = "0002";
+
+ private String key;
+
+ UpdateAction(String key) {
+ this.key = key;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ @Override
+ public String calc() {
+
+ return CommonUtils.join(
+ new String[]{SIGN, getKey()}, "-"
+ );
+ }
+ }
+
}
diff --git a/designer-base/src/main/java/com/fr/design/preview/NewWritePreview.java b/designer-base/src/main/java/com/fr/design/preview/NewWritePreview.java
deleted file mode 100644
index 8c7e408ff..000000000
--- a/designer-base/src/main/java/com/fr/design/preview/NewWritePreview.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.fr.design.preview;
-
-import com.fr.design.fun.impl.AbstractPreviewProvider;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * 新前端填报预览
- * by abel 2021/07/08
- */
-public class NewWritePreview extends AbstractPreviewProvider {
- @Override
- public String nameForPopupItem() {
- return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Write_New_Preview");
- }
-
- @Override
- public String iconPathForPopupItem() {
- return "com/fr/design/images/buttonicon/writes.png";
- }
-
- @Override
- public String iconPathForLarge() {
- return "com/fr/design/images/buttonicon/writeb24.png";
- }
-
- @Override
- public int previewTypeCode() {
- return 99;
- }
-
- @Override
- public Map parametersForPreview() {
- Map map = new HashMap();
- map.put("op", "write_new");
- return map;
- }
-}
diff --git a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java
index 588e4601d..48e988a82 100644
--- a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java
+++ b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java
@@ -163,7 +163,7 @@ public class WatermarkPane extends BasicPane {
tipsJp.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Direction_Vertical"), SwingConstants.CENTER));
watermarkGapTipsPane.add(tipsJp, BorderLayout.CENTER);
- colorPane = new NewColorSelectPane();
+ colorPane = new NewColorSelectPane(false);
JPanel colorLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
colorLabelPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Text_Color")), BorderLayout.NORTH);
diff --git a/designer-base/src/main/java/com/fr/design/style/CustomSelectBox.java b/designer-base/src/main/java/com/fr/design/style/CustomSelectBox.java
index cffe36373..3b8e1daa2 100644
--- a/designer-base/src/main/java/com/fr/design/style/CustomSelectBox.java
+++ b/designer-base/src/main/java/com/fr/design/style/CustomSelectBox.java
@@ -11,7 +11,7 @@ import javax.swing.event.ChangeListener;
import com.fr.base.background.ColorBackground;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.style.background.BackgroundCustomJComponent;
-import com.fr.design.style.color.ColorSelectPane;
+import com.fr.design.style.color.NewColorSelectPane;
/**
@@ -40,11 +40,11 @@ public class CustomSelectBox extends AbstractPopBox {
@Override
public JPanel initWindowPane(double preferredWidth) {
- ColorSelectPane colorPane = new ColorSelectPane();
+ NewColorSelectPane colorPane = new NewColorSelectPane();
colorPane.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
- ColorSelectPane source = (ColorSelectPane)e.getSource();
+ NewColorSelectPane source = (NewColorSelectPane)e.getSource();
setSelectObject(source.getColor());
hidePopupMenu();
}
diff --git a/designer-base/src/main/java/com/fr/design/style/background/BackgroundPane.java b/designer-base/src/main/java/com/fr/design/style/background/BackgroundPane.java
index 593250ca8..ebaf04e32 100644
--- a/designer-base/src/main/java/com/fr/design/style/background/BackgroundPane.java
+++ b/designer-base/src/main/java/com/fr/design/style/background/BackgroundPane.java
@@ -8,6 +8,7 @@ import java.awt.Dimension;
import java.util.HashMap;
import java.util.Map;
+import com.fr.base.background.ColorBackground;
import com.fr.design.gui.frpane.UITabbedPane;
import javax.swing.event.ChangeEvent;
@@ -16,6 +17,9 @@ import javax.swing.event.EventListenerList;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.dialog.BasicPane;
+import com.fr.design.mainframe.DesignerContext;
+import com.fr.design.style.background.impl.ColorBackgroundPane;
+import com.fr.design.style.background.impl.ColorNoThemeBackgroundPane;
import com.fr.general.Background;
import com.fr.log.FineLoggerFactory;
@@ -27,14 +31,15 @@ public class BackgroundPane extends BasicPane {
private EventListenerList eventChangeList = new EventListenerList();
protected Map cacheMap = new HashMap<>();
-
+
//需求说: 如果是浏览器背景, 隐藏掉几个button
public BackgroundPane() {
+ BackgroundFactory.getWrapper(ColorBackground.class).setType(
+ DesignerContext.getDesignerFrame().isServerConfig() ? ColorNoThemeBackgroundPane.class : ColorBackgroundPane.class);
this.initComponents();
this.setPreferredSize(new Dimension(400, 300));
}
-
protected void initComponents() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
diff --git a/designer-base/src/main/java/com/fr/design/style/background/gradient/AbstractComponentPopBox.java b/designer-base/src/main/java/com/fr/design/style/background/gradient/AbstractComponentPopBox.java
new file mode 100644
index 000000000..ef647f2bd
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/style/background/gradient/AbstractComponentPopBox.java
@@ -0,0 +1,243 @@
+package com.fr.design.style.background.gradient;
+
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.style.background.BackgroundJComponent;
+import com.fr.general.Background;
+
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JWindow;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.util.ArrayList;
+import java.util.List;
+import java.awt.AWTEvent;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Toolkit;
+import java.awt.Window;
+import java.awt.event.AWTEventListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+/**
+ * @author Bjorn
+ * @version 10.0
+ * Created by Bjorn on 2021-08-24
+ */
+public abstract class AbstractComponentPopBox extends JComponent {
+
+ protected BackgroundJComponent displayComponent;
+
+ private JWindow selectPopupWindow;
+ private boolean isWindowEventInit = false;
+ private static int GAP = 2;
+ private static int GAP2 = 20;
+
+ private List changeListenerList = new ArrayList();
+
+ MouseAdapter mouseListener = new MouseAdapter() {
+ public void mousePressed(MouseEvent evt) {
+ showPopupMenu();
+ }
+
+
+ };
+
+ AWTEventListener awt = new AWTEventListener() {
+ public void eventDispatched(AWTEvent event) {
+ if (event instanceof MouseEvent) {
+ MouseEvent evt = (MouseEvent) event;
+ if (evt.getClickCount() > 0) {
+ mouseClick(evt);
+ }
+ }
+ }
+ };
+
+ protected void showPopupMenu() {
+ if (selectPopupWindow != null && selectPopupWindow.isVisible()) {
+ hidePopupMenu();
+ return;
+ }
+
+ if (!this.isEnabled()) {
+ return;
+ }
+ Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK);
+
+ selectPopupWindow = this.getControlWindow();
+
+ Point convertPoint = new Point(0, 0);
+
+ // e: 将点(0,0)从ColorSelectionPane的坐标系统转换到屏幕坐标.
+ SwingUtilities.convertPointToScreen(convertPoint, this);
+ int y = convertPoint.y + this.getSize().height;
+ int x = convertPoint.x;
+ int h = y + selectPopupWindow.getHeight();
+ int width = x + selectPopupWindow.getWidth();
+ Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+ if (h > screenSize.height) {
+ y = y - selectPopupWindow.getHeight() - GAP2;// 超过屏幕高度了
+ }
+
+ if (width > screenSize.width) {
+ x = screenSize.width - selectPopupWindow.getWidth();
+ }
+ selectPopupWindow.setLocation(x, y);
+
+ selectPopupWindow.setVisible(true);
+
+ //wei : 为了点击别的地方下拉颜色窗口消失
+ MouseAdapter parentMouseListener = new MouseAdapter() {
+ public void mousePressed(MouseEvent evt) {
+ mouseClick(evt);
+ }
+ };
+ if (!this.isWindowEventInit && SwingUtilities.getAncestorOfClass(GradientBackgroundPane.class, this) != null) {
+ SwingUtilities.getAncestorOfClass(GradientBackgroundPane.class, this).addMouseListener(parentMouseListener);
+ this.isWindowEventInit = true;
+ }
+ }
+
+ private void mouseClick(MouseEvent evt) {
+ Point point = new Point((int) (evt.getLocationOnScreen().getX()), (int) evt.getLocationOnScreen().getY());
+ Dimension popBoxD = AbstractComponentPopBox.this.getSize();
+ try {
+ Point popBoxP = AbstractComponentPopBox.this.getLocationOnScreen();
+ Dimension popMenuD = this.getControlWindow().getSize();
+ Point popMenuP = this.getControlWindow().getLocation();
+ Rectangle popBoxRect = new Rectangle(popBoxP, popBoxD);
+ Rectangle popMenuRect = new Rectangle(popMenuP, popMenuD);
+ if (!popBoxRect.contains(point) && !popMenuRect.contains(point)) {
+ this.hidePopupMenu();
+ }
+ } catch (Exception ignore) {
+ this.hidePopupMenu();
+ }
+ }
+
+ protected void hidePopupMenu() {
+ if (selectPopupWindow != null) {
+ selectPopupWindow.setVisible(false);
+ }
+
+ selectPopupWindow = null;
+ Toolkit.getDefaultToolkit().removeAWTEventListener(awt);
+ }
+
+ protected JWindow getControlWindow() {
+ //find parent.
+ if (this.selectPopupWindow == null) {
+ Window parentWindow = SwingUtilities.windowForComponent(this);
+ if (parentWindow != null) {
+ this.selectPopupWindow = new AbstractComponentPopBox.SelectControlWindow(parentWindow);
+ }
+
+ selectPopupWindow.addMouseListener(new MouseAdapter() {
+ public void mouseExited(MouseEvent evt) {
+ int x = evt.getLocationOnScreen().x;
+ int y = evt.getLocationOnScreen().y;
+
+ if (selectPopupWindow != null) {
+ double desValue = 2;
+ Rectangle rectangle = selectPopupWindow.getBounds();
+ boolean b1 = x < rectangle.x + desValue || x >= rectangle.x + rectangle.width - desValue;
+ boolean b2 = y > rectangle.y + rectangle.height - desValue;//避免了鼠标下移刚进入selectPopupWindow的过程中弹出框隐藏,上移移出后由AbstractPopBox的mouseListener处理
+ if (b1 || b2) {
+ hidePopupMenu();
+ }
+ }
+ }
+ });
+ }
+
+ return selectPopupWindow;
+ }
+
+ /**
+ * 添加事件
+ *
+ * @param changeListener 事件
+ */
+ public void addSelectChangeListener(ChangeListener changeListener) {
+ this.changeListenerList.add(changeListener);
+ }
+
+ /**
+ * 删除事件
+ *
+ * @param changeListener 事件
+ */
+ public void removeSelectChangeListener(ChangeListener changeListener) {
+ this.changeListenerList.remove(changeListener);
+ }
+
+ /**
+ * 响应事件
+ */
+ public void fireChangeListener() {
+ if (!changeListenerList.isEmpty()) {
+ ChangeEvent evt = new ChangeEvent(this);
+ for (int i = 0; i < changeListenerList.size(); i++) {
+ this.changeListenerList.get(i).stateChanged(evt);
+ }
+ }
+ }
+
+ /**
+ * 待说明
+ *
+ * @param background 背景
+ */
+ public void fireDisplayComponent(Background background) {
+ if (displayComponent != null) {
+ displayComponent.setSelfBackground(background);
+ }
+ fireChangeListener();
+ this.repaint();
+ }
+
+ /**
+ * 初始化弹出框的面板
+ *
+ * @param preWidth 宽度
+ * @return 弹出面板
+ */
+ public abstract JPanel initWindowPane(double preWidth);
+
+ private class SelectControlWindow extends JWindow {
+ private static final long serialVersionUID = -5776589767069105911L;
+
+ public SelectControlWindow(Window paranet) {
+ super(paranet);
+ this.initComponents();
+ }
+
+ public void initComponents() {
+ JPanel defaultPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ this.setContentPane(defaultPane);
+
+// defaultPane.setBorder(UIManager.getBorder("PopupMenu.border"));
+
+ if (displayComponent != null) {
+ defaultPane.add(initWindowPane(displayComponent.getPreferredSize().getWidth()));
+ } else {
+ defaultPane.add(initWindowPane(20));
+ }
+ this.pack();
+ }
+
+ @Override
+ public void setVisible(boolean b) {
+ super.setVisible(b);
+ AbstractComponentPopBox.this.repaint();
+ }
+ }
+
+ protected boolean isPopupVisible() {
+ return selectPopupWindow == null ? false : selectPopupWindow.isVisible();
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/style/background/gradient/FixedGradientBarNoTheme.java b/designer-base/src/main/java/com/fr/design/style/background/gradient/FixedGradientBarNoTheme.java
new file mode 100644
index 000000000..f3393366d
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/style/background/gradient/FixedGradientBarNoTheme.java
@@ -0,0 +1,39 @@
+package com.fr.design.style.background.gradient;
+
+import com.fr.design.DesignerEnvManager;
+import com.fr.design.mainframe.DesignerContext;
+import com.fr.design.style.color.ColorSelectDetailPane;
+import com.fr.design.style.color.ColorSelectDialog;
+
+import javax.swing.JPanel;
+import java.awt.Color;
+
+/**
+ * @author Bjorn
+ * @version 10.0
+ * Created by Bjorn on 2021-08-19
+ */
+public class FixedGradientBarNoTheme extends FixedGradientBar {
+
+
+ public FixedGradientBarNoTheme(int minvalue, int maxvalue) {
+ super(minvalue, maxvalue);
+ }
+
+ protected void clickButton(int select) {
+ ColorSelectDetailPane pane = new ColorSelectDetailPane(Color.WHITE);
+ Color selectColor = getList().get(select).getColorInner() == null ? Color.WHITE : getList().get(select).getColorInner();
+ ColorSelectDialog.showDialog(DesignerContext.getDesignerFrame(), pane, selectColor, FixedGradientBarNoTheme.this);
+ Color color = FixedGradientBarNoTheme.this.getColor();
+ if (color != null) {
+ DesignerEnvManager.getEnvManager().getColorConfigManager().addToColorQueue(color);
+ getList().get(select).setColorInner(color);
+ stateChanged();
+ FixedGradientBarNoTheme.this.repaint();
+ }
+ }
+
+ public JPanel initWindowPane(double preWidth) {
+ return null;
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/style/background/gradient/GradientBar.java b/designer-base/src/main/java/com/fr/design/style/background/gradient/GradientBar.java
index b088864c0..aac5c837a 100644
--- a/designer-base/src/main/java/com/fr/design/style/background/gradient/GradientBar.java
+++ b/designer-base/src/main/java/com/fr/design/style/background/gradient/GradientBar.java
@@ -1,18 +1,16 @@
package com.fr.design.style.background.gradient;
-import com.fr.design.DesignerEnvManager;
+import com.fr.base.background.ColorBackground;
import com.fr.design.event.UIObserver;
import com.fr.design.event.UIObserverListener;
import com.fr.design.gui.itextfield.UINumberField;
-import com.fr.design.mainframe.DesignerContext;
import com.fr.design.style.color.ColorCell;
-import com.fr.design.style.color.ColorSelectDetailPane;
-import com.fr.design.style.color.ColorSelectDialog;
import com.fr.design.style.color.ColorSelectable;
+import com.fr.design.style.color.NewColorSelectPane;
import com.fr.stable.AssistUtils;
-
import com.fr.stable.os.OperatingSystem;
-import javax.swing.JComponent;
+
+import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
@@ -33,8 +31,8 @@ import java.awt.geom.Point2D;
/**
* TODO:面板缩放的功能没有考虑(就是尾值过大,导致超过界面显示的情况),原来的那个实现完全是个BUG。要缩放的情况也比较少,就干脆以后弄吧
*/
-public class GradientBar extends JComponent implements UIObserver, ColorSelectable {
-
+public class GradientBar extends AbstractComponentPopBox implements UIObserver, ColorSelectable {
+ private NewColorSelectPane colorPane;
/**
*
*/
@@ -88,6 +86,22 @@ public class GradientBar extends JComponent implements UIObserver, ColorSelectab
iniListener();
}
+ public List getList() {
+ return list;
+ }
+
+ public void setList(List list) {
+ this.list = list;
+ }
+
+ public int getIndex() {
+ return index;
+ }
+
+ public void setIndex(int index) {
+ this.index = index;
+ }
+
public void updateColor(Color begin, Color end) {
p1.setColorInner(begin);
p2.setColorInner(end);
@@ -106,15 +120,7 @@ public class GradientBar extends JComponent implements UIObserver, ColorSelectab
}
if (select >= 0) {
- ColorSelectDetailPane pane = new ColorSelectDetailPane(Color.WHITE);
- ColorSelectDialog.showDialog(DesignerContext.getDesignerFrame(), pane, Color.WHITE, GradientBar.this);
- Color color = GradientBar.this.getColor();
- if (color != null) {
- DesignerEnvManager.getEnvManager().getColorConfigManager().addToColorQueue(color);
- list.get(select).setColorInner(color);
- stateChanged();
- GradientBar.this.repaint();
- }
+ clickButton(select);
}
GradientBar.this.repaint();
}
@@ -122,6 +128,36 @@ public class GradientBar extends JComponent implements UIObserver, ColorSelectab
});
}
+ protected void clickButton(int select) {
+ setIndex(select);
+ showPopupMenu();
+ }
+
+ public JPanel initWindowPane(double preferredWidth) {
+ // 下拉的时候重新生成面板,刷新最近使用颜色
+ colorPane = new NewColorSelectPane(false) {
+ @Override
+ public void setVisible(boolean b) {
+ super.setVisible(b);
+ }
+
+ @Override
+ protected boolean selectRealTime() {
+ return false;
+ }
+ };
+ colorPane.addChangeListener(new ChangeListener() {
+ public void stateChanged(ChangeEvent e) {
+ hidePopupMenu();
+ setColor(((NewColorSelectPane) e.getSource()).getColor());
+ getList().get(getIndex()).setColorInner(getColor());
+ fireDisplayComponent(ColorBackground.getInstance(getColor()));
+ GradientBar.this.stateChanged();
+ }
+ });
+ return colorPane;
+ }
+
protected void addMouseDragListener() {
this.addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent e) {
@@ -132,10 +168,10 @@ public class GradientBar extends JComponent implements UIObserver, ColorSelectab
break;
}
}
- if(OperatingSystem.isLinux() && AssistUtils.equals(oldIndex,index)){
- if(Math.abs(p1.getX() - e.getX()) > Math.abs(p2.getX() - e.getX())){
+ if (OperatingSystem.isLinux() && AssistUtils.equals(oldIndex, index)) {
+ if (Math.abs(p1.getX() - e.getX()) > Math.abs(p2.getX() - e.getX())) {
index = 1;
- }else{
+ } else {
index = 0;
}
}
diff --git a/designer-base/src/main/java/com/fr/design/style/background/impl/ColorBackgroundPane.java b/designer-base/src/main/java/com/fr/design/style/background/impl/ColorBackgroundPane.java
index 62a08a948..37fef6e61 100644
--- a/designer-base/src/main/java/com/fr/design/style/background/impl/ColorBackgroundPane.java
+++ b/designer-base/src/main/java/com/fr/design/style/background/impl/ColorBackgroundPane.java
@@ -19,10 +19,14 @@ public class ColorBackgroundPane extends BackgroundDetailPane {
public ColorBackgroundPane() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
- detailColorSelectPane = new DetailColorSelectPane();
+ detailColorSelectPane = createColorSelectPane();
this.add(detailColorSelectPane, BorderLayout.CENTER);
}
+ protected DetailColorSelectPane createColorSelectPane(){
+ return new DetailColorSelectPane();
+ }
+
public void populate(Background background) {
if (background instanceof ColorBackground) {
ColorBackground colorBackgroud = (ColorBackground) background;
diff --git a/designer-base/src/main/java/com/fr/design/style/background/impl/ColorNoThemeBackgroundPane.java b/designer-base/src/main/java/com/fr/design/style/background/impl/ColorNoThemeBackgroundPane.java
new file mode 100644
index 000000000..01ee19a67
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/style/background/impl/ColorNoThemeBackgroundPane.java
@@ -0,0 +1,10 @@
+package com.fr.design.style.background.impl;
+
+import com.fr.design.style.color.DetailColorSelectPane;
+
+public class ColorNoThemeBackgroundPane extends ColorBackgroundPane{
+
+ protected DetailColorSelectPane createColorSelectPane(){
+ return new DetailColorSelectPane(false);
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorAdjustPane.java b/designer-base/src/main/java/com/fr/design/style/color/ColorAdjustPane.java
index fcdc594b5..ad99b9083 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/ColorAdjustPane.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/ColorAdjustPane.java
@@ -1,13 +1,14 @@
package com.fr.design.style.color;
import com.fr.base.BaseUtils;
-import com.fr.base.background.ColorBackground;
+import com.fr.design.DesignerEnvManager;
import com.fr.design.event.UIObserver;
import com.fr.design.event.UIObserverListener;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.VerticalFlowLayout;
-import com.fr.design.style.AbstractSelectBox;
+import com.fr.design.mainframe.DesignerContext;
+import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
@@ -75,7 +76,7 @@ public class ColorAdjustPane extends JPanel implements UIObserver {
int size = colorButtons.size();
Color[] colors = new Color[size];
for (int i = 0; i < size; i++) {
- colors[i] = colorButtons.get(i).getSelectObject();
+ colors[i] = colorButtons.get(i).getColor();
}
return colors;
}
@@ -169,7 +170,7 @@ public class ColorAdjustPane extends JPanel implements UIObserver {
}
- private class AddColorButton extends AbstractSelectBox {
+ private class AddColorButton extends JComponent implements ColorSelectable {
BufferedImage image = BaseUtils.readImageWithCache("/com/fr/design/images/buttonicon/add.png");
@@ -195,43 +196,38 @@ public class ColorAdjustPane extends JPanel implements UIObserver {
return new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
- showPopupMenu();
+ //打开颜色选择面板
+ showDialog();
}
};
}
- public JPanel initWindowPane(double preferredWidth) {
- // 下拉的时候重新生成面板,刷新最近使用颜色
- ColorSelectPane colorPane = new ColorSelectPane(false) {
- public void setVisible(boolean b) {
- super.setVisible(b);
- }
+ private void showDialog() {
+ ColorSelectDetailPane pane = new ColorSelectDetailPane(getColor());
+ ColorSelectDialog.showDialog(DesignerContext.getDesignerFrame(), pane, getColor(), this, true);
+ Color color = this.getColor();
+ if (color != null) {
+ DesignerEnvManager.getEnvManager().getColorConfigManager().addToColorQueue(color);
+ }
+ }
- protected boolean selectRealTime() {
- return false;
- }
- };
- colorPane.addChangeListener(new ChangeListener() {
- public void stateChanged(ChangeEvent e) {
- hidePopupMenu();
- Color color = ((ColorSelectPane) e.getSource()).getColor();
- fireDisplayComponent(ColorBackground.getInstance(color));
- if(colorButtons.size() < MAX_BUTTON) {
- colorButtons.add(createColorButton(color));
- }
- ColorAdjustPane.this.stateChanged();
- relayout();
- }
- });
- return colorPane;
+ @Override
+ public void setColor(Color color) {
+ if (colorButtons.size() < MAX_BUTTON) {
+ colorButtons.add(createColorButton(color));
+ }
+ ColorAdjustPane.this.stateChanged();
+ relayout();
}
- public Color getSelectObject() {
- return null;
+ @Override
+ public Color getColor() {
+ return Color.WHITE;
}
- public void setSelectObject(Color color) {
+ @Override
+ public void colorSetted(ColorCell colorCell) {
}
}
-}
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorButton.java b/designer-base/src/main/java/com/fr/design/style/color/ColorButton.java
index a052f99f1..5ad794c79 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/ColorButton.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/ColorButton.java
@@ -1,11 +1,10 @@
package com.fr.design.style.color;
import com.fr.base.BaseUtils;
-import com.fr.base.background.ColorBackground;
-import com.fr.design.style.AbstractSelectBox;
+import com.fr.design.DesignerEnvManager;
+import com.fr.design.mainframe.DesignerContext;
-import javax.swing.JPanel;
-import javax.swing.event.ChangeEvent;
+import javax.swing.JComponent;
import javax.swing.event.ChangeListener;
import java.awt.Color;
import java.awt.Dimension;
@@ -22,7 +21,7 @@ import java.awt.image.BufferedImage;
* @version 10.0
* Created by Bjorn on 2020-03-06
*/
-public class ColorButton extends AbstractSelectBox {
+public class ColorButton extends JComponent implements ColorSelectable {
private static final double DEL_WIDTH = 7;
@@ -34,8 +33,6 @@ public class ColorButton extends AbstractSelectBox {
private boolean isMoveOn = false;
- private ColorSelectPane colorPane;
-
private boolean lastButton;
private ChangeListener changeListener;
@@ -111,40 +108,24 @@ public class ColorButton extends AbstractSelectBox {
}
if (e.getX() >= bounds.getWidth() - DEL_WIDTH && e.getY() <= DEL_WIDTH) {
deleteButton();
- hidePopupMenu();
return;
}
}
//打开颜色选择面板
- showPopupMenu();
+ showDialog();
}
- public JPanel initWindowPane(double preferredWidth) {
- // 下拉的时候重新生成面板,刷新最近使用颜色
- colorPane = new ColorSelectPane(false) {
- @Override
- public void setVisible(boolean b) {
- super.setVisible(b);
- }
-
- @Override
- protected boolean selectRealTime() {
- return false;
- }
- };
- colorPane.addChangeListener(new ChangeListener() {
- public void stateChanged(ChangeEvent e) {
- hidePopupMenu();
- color = ((ColorSelectPane) e.getSource()).getColor();
- fireDisplayComponent(ColorBackground.getInstance(color));
- ColorButton.this.stateChanged();
- }
- });
- return colorPane;
+ private void showDialog() {
+ ColorSelectDetailPane pane = new ColorSelectDetailPane(getColor());
+ ColorSelectDialog.showDialog(DesignerContext.getDesignerFrame(), pane, getColor(), this, true);
+ Color color = this.getColor();
+ if (color != null) {
+ DesignerEnvManager.getEnvManager().getColorConfigManager().addToColorQueue(color);
+ }
}
public void stateChanged() {
- if (changeListener != null) {
+ if (changeListener != null) {
changeListener.stateChanged(null);
}
}
@@ -153,26 +134,18 @@ public class ColorButton extends AbstractSelectBox {
this.changeListener = changeListener;
}
+ @Override
+ public void setColor(Color color) {
+ this.color = color;
+ this.stateChanged();
+ }
- /**
- * 获取当前选中的颜色
- *
- * @return 当前选中的颜色
- */
- public Color getSelectObject() {
+ @Override
+ public Color getColor() {
return this.color;
}
- /**
- * 设置选中的颜色
- *
- * @param color 颜色
- */
- public void setSelectObject(Color color) {
- this.color = color;
- colorPane.setColor(color);
-
- fireDisplayComponent(ColorBackground.getInstance(color));
+ @Override
+ public void colorSetted(ColorCell colorCell) {
}
-
-}
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorCell.java b/designer-base/src/main/java/com/fr/design/style/color/ColorCell.java
index 06cca51d0..3e5636dc3 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/ColorCell.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/ColorCell.java
@@ -76,17 +76,21 @@ public class ColorCell extends JComponent implements ColorSelectable {
g.fillRect(b.left, b.top, right, bottom);
}
- if (colorSelectable.getColor() != null
- && ComparatorUtils.equals(colorSelectable.getColor(), this.getColor())) {
+ if (isColorSelected(colorSelectable)) {
g.setColor(UIConstants.LINE_COLOR);
g.drawRect(b.left, b.top, right - 1, bottom - 1);
}
}
+ protected boolean isColorSelected(ColorSelectable colorSelectable){
+ return colorSelectable.getColor() != null
+ && ComparatorUtils.equals(colorSelectable.getColor(), this.getColor());
+ }
+
/**
* 鼠标事件处理
- * @param 鼠标事件
+ * @param e 鼠标事件
*/
public void processMouseEvent(MouseEvent e) {
if (!isEnabled()) {
diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorControlWindow.java b/designer-base/src/main/java/com/fr/design/style/color/ColorControlWindow.java
index 4ee3a119e..43f994a65 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/ColorControlWindow.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/ColorControlWindow.java
@@ -58,15 +58,19 @@ public abstract class ColorControlWindow extends JPopupMenu {
}
protected void initSelectionPopupPane(boolean isSupportTransparent) {
- selectionPopupPane = new ColorSelectionPopupPane(isSupportTransparent);
+ selectionPopupPane = new ColorSelectionPopupPane(isSupportTransparent, supportThemeColor());
this.add(selectionPopupPane, BorderLayout.CENTER);
}
+ protected boolean supportThemeColor(){
+ return true;
+ }
+
class ColorSelectionPopupPane extends NewColorSelectPane {
private static final long serialVersionUID = 7822856562329146354L;
- public ColorSelectionPopupPane(boolean isSupportTransparent) {
- super(isSupportTransparent);
+ public ColorSelectionPopupPane(boolean isSupportTransparent, boolean isSupportThemeColor) {
+ super(isSupportTransparent, isSupportThemeColor);
this.addChangeListener(new ChangeListener() {
@Override
@@ -77,7 +81,7 @@ public abstract class ColorControlWindow extends JPopupMenu {
}
@Override
- protected void doTransparent() {
+ public void doTransparent() {
popupHider.hidePopupMenu();
super.doTransparent();
}
diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorControlWindowWithAuto.java b/designer-base/src/main/java/com/fr/design/style/color/ColorControlWindowWithAuto.java
index cbb0e97ea..dc4eb9571 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/ColorControlWindowWithAuto.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/ColorControlWindowWithAuto.java
@@ -61,7 +61,7 @@ public abstract class ColorControlWindowWithAuto extends ColorControlWindow {
});
}
- protected void doTransparent() {
+ public void doTransparent() {
getPopupHider().hidePopupMenu();
setColor(null);
}
@@ -114,11 +114,10 @@ public abstract class ColorControlWindowWithAuto extends ColorControlWindow {
}
}
+ @Override
public Dimension getPreferredSize() {
- if (isSupportTransparent()) {
- return new Dimension(super.getPreferredSize().width, TRANSPARENT_WINDOW_HEIGHT + BUTTON_HEIGHT);
- }
- return new Dimension(super.getPreferredSize().width, WINDOW_HEIGHT + BUTTON_HEIGHT);
+ Dimension dimension = super.getPreferredSize();
+ return new Dimension(dimension.width, dimension.height + BUTTON_HEIGHT);
}
}
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 b22104f28..b643752b3 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
@@ -71,5 +71,18 @@ public interface ColorFactory {
new Color(0, 0, 255)
};
+ 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)
+ };
+
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorSelectBox.java b/designer-base/src/main/java/com/fr/design/style/color/ColorSelectBox.java
index d2a824544..3ec124b13 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/ColorSelectBox.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/ColorSelectBox.java
@@ -17,7 +17,7 @@ public class ColorSelectBox extends AbstractSelectBox implements UIObserv
private static final long serialVersionUID = 2782150678943960557L;
private Color color;
- private ColorSelectPane colorPane;
+ private NewColorSelectPane colorPane;
private UIObserverListener uiObserverListener;
public ColorSelectBox(int preferredWidth) {
@@ -40,12 +40,8 @@ public class ColorSelectBox extends AbstractSelectBox implements UIObserv
}
}
- protected ColorSelectPane getColorSelectPane(){
- return new ColorSelectPane() {
- public void setVisible(boolean b) {
- super.setVisible(b);
- }
- };
+ protected NewColorSelectPane getColorSelectPane(){
+ return new NewColorSelectPane();
}
/**
@@ -56,14 +52,14 @@ public class ColorSelectBox extends AbstractSelectBox implements UIObserv
public JPanel initWindowPane(double preferredWidth) {
// 下拉的时候重新生成面板,刷新最近使用颜色
colorPane = getColorSelectPane();
+ colorPane.setColor(color);
colorPane.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
hidePopupMenu();
- color = ((ColorSelectPane) e.getSource()).getColor();
+ color = ((NewColorSelectPane) e.getSource()).getColor();
fireDisplayComponent(ColorBackground.getInstance(color));
}
});
- colorPane.setColor(color);
return colorPane;
}
diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDetailPane.java b/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDetailPane.java
index 13d899822..3756fc627 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDetailPane.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDetailPane.java
@@ -36,6 +36,10 @@ public class ColorSelectDetailPane extends BasicPane {
return selectedPanel;
}
+ private SwatchChooserPanel swatchChooserPanel;
+
+ private CustomChooserPanel customChooserPanel;
+
public void setSelectedPanel(JColorChooser selectedPanel) {
this.selectedPanel = selectedPanel;
}
@@ -69,9 +73,9 @@ public class ColorSelectDetailPane extends BasicPane {
selectedPanel.setPreferredSize(new Dimension(selectedPanel.getWidth(), SELECT_PANEL_HEIGHT));
selectedPanel.setPreviewPanel(new JPanel());
- AbstractColorChooserPanel swatchChooserPanel = new SwatchChooserPanel();
- AbstractColorChooserPanel customChooserPanel = new CustomChooserPanel();
- selectedPanel.setChooserPanels(new AbstractColorChooserPanel[]{swatchChooserPanel, customChooserPanel});
+ swatchChooserPanel = new SwatchChooserPanel();
+ customChooserPanel = new CustomChooserPanel();
+ selectedPanel.setChooserPanels(new AbstractColorChooserPanel[]{customChooserPanel, swatchChooserPanel});
this.add(selectedPanel, BorderLayout.NORTH);
// 最近使用面板
@@ -98,4 +102,8 @@ public class ColorSelectDetailPane extends BasicPane {
previewPanel.add(colorChooserPreview);
this.add(previewPanel, BorderLayout.SOUTH);
}
+
+ public void populate(Color color){
+ customChooserPanel.setColor(color);
+ }
}
diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDialog.java b/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDialog.java
index 33eb6dbf1..56bc9aa65 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDialog.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDialog.java
@@ -77,6 +77,7 @@ public class ColorSelectDialog extends MiddleChartDialog{
this.okListener = (ColorTracker) okListener;
this.seletePane = seletePane;
initComponent();
+ this.pane.populate(initialColor);
}
private void initComponent() {
diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorSelectPane.java b/designer-base/src/main/java/com/fr/design/style/color/ColorSelectPane.java
index 68c1b2b99..452c5fe30 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/ColorSelectPane.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/ColorSelectPane.java
@@ -30,6 +30,7 @@ import java.awt.event.MouseEvent;
/**
* The pane used to select color
*/
+@Deprecated
public class ColorSelectPane extends TransparentPane implements ColorSelectable {
private static final long serialVersionUID = -8634152305687249392L;
diff --git a/designer-base/src/main/java/com/fr/design/style/color/DetailColorSelectPane.java b/designer-base/src/main/java/com/fr/design/style/color/DetailColorSelectPane.java
index 4245c1293..5d7e81487 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/DetailColorSelectPane.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/DetailColorSelectPane.java
@@ -29,10 +29,14 @@ import com.fr.design.dialog.BasicPane;
* Often used for foreground selection.
*/
public class DetailColorSelectPane extends BasicPane {
- private ColorSelectPane colorSelectPane;
+ private NewColorSelectPane colorSelectPane;
private UILabel colorPreviewLabel;
- public DetailColorSelectPane() {
+ public DetailColorSelectPane(){
+ this(true);
+ }
+
+ public DetailColorSelectPane(boolean supportTheme) {
this.setBorder(BorderFactory.createEmptyBorder(4, 4, 0, 4));
this.setLayout(FRGUIPaneFactory.createBorderLayout());
@@ -44,7 +48,7 @@ public class DetailColorSelectPane extends BasicPane {
defaultPane.add(Box.createHorizontalStrut(4));
JPanel colorSelectContainPane =FRGUIPaneFactory.createBorderLayout_L_Pane();
defaultPane.add(colorSelectContainPane);
- colorSelectPane = new ColorSelectPane();
+ colorSelectPane = NewColorSelectPane.createColorSelectPaneWithTheme(supportTheme);
colorSelectContainPane.add(colorSelectPane, BorderLayout.NORTH);
defaultPane.add(Box.createHorizontalStrut(8));
diff --git a/designer-base/src/main/java/com/fr/design/style/color/FineColorCell.java b/designer-base/src/main/java/com/fr/design/style/color/FineColorCell.java
new file mode 100644
index 000000000..1007b3f84
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/style/color/FineColorCell.java
@@ -0,0 +1,38 @@
+package com.fr.design.style.color;
+
+import com.fr.base.FineColor;
+import com.fr.general.ComparatorUtils;
+
+import java.awt.Color;
+
+public class FineColorCell extends ColorCell {
+ private final int x;
+ private final int y;
+
+ public FineColorCell(Color color, ColorSelectable colorSelectable) {
+ this(color, colorSelectable, -1, -1);
+ }
+
+ public FineColorCell(Color color, ColorSelectable colorSelectable, int x, int y) {
+ super(color, colorSelectable);
+ this.x = x;
+ this.y = y;
+ }
+
+ public Color getColor() {
+ Color color = super.getColor();
+ FineColor fineColor = new FineColor(x, y, color);
+ return fineColor;
+ }
+
+
+ protected boolean isColorSelected(ColorSelectable colorSelectable) {
+ Color color = colorSelectable.getColor();
+ if (color instanceof FineColor) {
+ return super.isColorSelected(colorSelectable) && (x == ((FineColor) color).getHor()) && (y == ((FineColor) color).getVer());
+ }
+ return super.isColorSelected(colorSelectable);
+ }
+
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectBox.java b/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectBox.java
index 4f291c639..04d368e6b 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectBox.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectBox.java
@@ -20,7 +20,7 @@ public class NewColorSelectBox extends AbstractSelectBox implements UIObs
private static final long serialVersionUID = 2782150678943960557L;
private Color color;
- private NewColorSelectPane colorPane = new NewColorSelectPane();
+ private NewColorSelectPane colorPane = new NewColorSelectPane(false);
private UIObserverListener uiObserverListener;
private String newColorSelectBoxName = "";
private GlobalNameListener globalNameListener = null;
@@ -58,7 +58,8 @@ public class NewColorSelectBox extends AbstractSelectBox implements UIObs
*/
public JPanel initWindowPane(double preferredWidth) {
// 下拉的时候重新生成面板,以刷新最近使用颜色
- colorPane = new NewColorSelectPane();
+ colorPane = new NewColorSelectPane(false);
+ colorPane.setColor(this.getSelectObject());
colorPane.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
hidePopupMenu();
diff --git a/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectPane.java b/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectPane.java
index 6c21c10cb..8abab768a 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectPane.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectPane.java
@@ -1,16 +1,22 @@
package com.fr.design.style.color;
+import com.fr.base.FineColor;
+import com.fr.base.theme.TemplateTheme;
import com.fr.design.DesignerEnvManager;
import com.fr.design.border.UIRoundedBorder;
import com.fr.design.constants.UIConstants;
import com.fr.design.dialog.BasicPane;
+import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.gui.ibutton.UIButton;
+import com.fr.design.gui.ilable.UILabel;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
+import com.fr.design.mainframe.JTemplate;
+import com.fr.design.mainframe.theme.dialog.TemplateThemeProfileDialog;
import javax.swing.BorderFactory;
-import javax.swing.Box;
+import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
@@ -19,11 +25,10 @@ import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.GridLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
+import java.util.List;
/**
@@ -32,57 +37,75 @@ import java.util.ArrayList;
*/
public class NewColorSelectPane extends BasicPane implements ColorSelectable {
private static final long serialVersionUID = -8634152305687249392L;
+ private static final float BRIGHTNESS_VALUE = 0.15F;
+ private static final float PURITY_VALUE = 0.1F;
- private Color color = null; // color
+ private FineColor color = null; // color
// color setting action.
- private ArrayList colorChangeListenerList = new ArrayList();
+ private final ArrayList colorChangeListenerList = new ArrayList<>();
// 是否支持透明
private boolean isSupportTransparent;
+ private boolean isSupportThemeColor;
+
public final static int TRANSPARENT_WINDOW_HEIGHT = 165;
public final static int WINDOW_HEIGHT = 150;
// 最近使用颜色
- private UsedColorPane usedColorPane;
+ private final NewUsedColorPane usedColorPane;
+ private final JPanel menuColorPane;
+ private ColorCell[][] themeColorCellGrid;
+
+ public static NewColorSelectPane createColorSelectPaneWithTheme(boolean supportTheme){
+ return new NewColorSelectPane(true, supportTheme);
+ }
/**
* Constructor.
*/
public NewColorSelectPane() {
- this(false);
+ this(true);
+ }
+
+ public NewColorSelectPane(boolean isSupportTransparent) {
+ this(isSupportTransparent, true);
}
/**
* Constructor.
*/
- NewColorSelectPane(boolean isSupportTransparent) {
+ public NewColorSelectPane(boolean isSupportTransparent, boolean isSupportThemeColor) {
+ this.isSupportThemeColor = isSupportThemeColor;
initSelectButton(isSupportTransparent);
-
// center
JPanel centerPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane();
+ centerPane.setBorder(BorderFactory.createEmptyBorder(10, 4, 0 ,4));
this.add(centerPane, BorderLayout.CENTER);
- // 第一行
- JPanel row1Pane = new JPanel(FRGUIPaneFactory.createBorderLayout());
- row1Pane.setBorder(BorderFactory.createEmptyBorder(8, 8, 0, 0));
- row1Pane.setPreferredSize(new Dimension(135, 16)); // 宽度为 16 * 8 + 7
- centerPane.add(row1Pane);
- // 最近使用
- usedColorPane = new UsedColorPane(1, 8, 1, this, true, false);
- usedColorPane.getPane().setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 8));
- row1Pane.add(usedColorPane.getPane());
-
- JPanel menuColorPane1 = new JPanel();
- centerPane.add(menuColorPane1);
-
- menuColorPane1.setLayout(new GridLayout(5, 8, 1, 1));
- menuColorPane1.setBorder(BorderFactory.createEmptyBorder(8, 8, 0, 8));
- for (int i = 0; i < ColorFactory.MenuColors.length; i++) {
- menuColorPane1.add(new ColorCell(ColorFactory.MenuColors[i], this));
+ menuColorPane = getMenuColorPane();
+ centerPane.add(menuColorPane);
+ if(isSupportThemeColor){
+ initThemeColorPane();
+ }else {
+ initMenuColorPane();
}
- centerPane.add(Box.createVerticalStrut(1));
+ JPanel standardColorPane = new JPanel(new BorderLayout(0, 5));
+ standardColorPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
+ standardColorPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Standard_Color")), BorderLayout.CENTER);
+ centerPane.add(standardColorPane);
+ JPanel colorSelectPane = createStandardColorPane();
+ standardColorPane.add(colorSelectPane, BorderLayout.SOUTH);
+
+ // 增加最近使用 pane
+ JPanel row1Pane = new JPanel(new BorderLayout(0, 5));
+ row1Pane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
+ row1Pane.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Used")), BorderLayout.CENTER);
+ centerPane.add(row1Pane);
+ // 最近使用
+ usedColorPane = new NewUsedColorPane(9, this, selectRealTime());
+ row1Pane.add(usedColorPane.getPane(), BorderLayout.SOUTH);
// mod by anchore 16/11/16
final UIButton customButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_More_Color"));
@@ -99,12 +122,138 @@ public class NewColorSelectPane extends BasicPane implements ColorSelectable {
});
customButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
- JPanel centerPane1 = FRGUIPaneFactory.createBorderLayout_S_Pane();
- centerPane1.setBorder(BorderFactory.createEmptyBorder(2, 8, 0, 8));
- centerPane1.add(customButton, BorderLayout.NORTH);
+ JPanel centerPane1 = new JPanel(new BorderLayout(0, 0));
+ centerPane1.setBorder(BorderFactory.createEmptyBorder(9, 0, 11, 0));
+ centerPane1.add(customButton, BorderLayout.CENTER);
+ customButton.setPreferredSize(new Dimension(197, 20));
centerPane.add(centerPane1);
}
+ private JPanel createStandardColorPane(){
+ JPanel jPanel = new JPanel(new GridLayout(1, 10, 3, 0));
+ Color[] colorArray = ColorFactory.STANDARD_COLORS;
+ for (int i = 0; i < colorArray.length; i++) {
+ jPanel.add(new ColorCell(colorArray[i], this));
+ }
+ return jPanel;
+ }
+
+ private void initThemeColorPane(){
+ menuColorPane.removeAll();
+ menuColorPane.setLayout(new BorderLayout(0, 10));
+ JPanel northPane = new JPanel(new GridLayout(1, 8, 3, 0));
+ JPanel centerPane = new JPanel(new GridLayout(1, 8, 3, 0));
+ menuColorPane.add(northPane, BorderLayout.NORTH);
+ menuColorPane.add(centerPane, BorderLayout.CENTER);
+
+ Color[] colorArray = new Color[] {
+ // 2列灰度色
+ Color.decode("#B3B3B3"),
+ Color.decode("#808080"),
+
+ // 8列主题色
+ Color.decode("#FFFFFF"),
+ Color.decode("#CCCCCC"),
+ Color.decode("#FFFFFF"),
+ Color.decode("#CCCCCC"),
+ Color.decode("#FFFFFF"),
+ Color.decode("#CCCCCC"),
+ Color.decode("#FFFFFF"),
+ Color.decode("#CCCCCC"),
+ };
+
+ if (themeColorCellGrid == null) {
+ themeColorCellGrid = new ColorCell[colorArray.length][5];
+ for (int i = 0; i < colorArray.length; i++) {
+ ColorCell[] colorCellColumn = new ColorCell[5];
+ boolean isDefaultColor = (i == 0 || i == 1);
+ Color color = colorArray[i];
+ colorCellColumn[0] = createFineColorCell(color, isDefaultColor, i, 2);
+ colorCellColumn[2] = createFineColorCell(color = saturationDown(color, isDefaultColor, true), isDefaultColor, i, 1);
+ colorCellColumn[1] = createFineColorCell(saturationDown(color, isDefaultColor, true), isDefaultColor, i, 0);
+ color = colorArray[i];
+ colorCellColumn[3] = createFineColorCell(color = saturationDown(color, isDefaultColor, false), isDefaultColor, i, 3);
+ colorCellColumn[4] = createFineColorCell(saturationDown(color, isDefaultColor, false), isDefaultColor, i, 4);
+ themeColorCellGrid[i] = colorCellColumn;
+ }
+ }
+
+ for (int i = 0; i < colorArray.length; i++) {
+ northPane.add(themeColorCellGrid[i][0]);
+ }
+ for (int i = 0; i < colorArray.length; i++) {
+ JPanel columnPane = new JPanel(new GridLayout(4, 1, 0, 3));
+ columnPane.add(themeColorCellGrid[i][1]);
+ columnPane.add(themeColorCellGrid[i][2]);
+ columnPane.add(themeColorCellGrid[i][3]);
+ columnPane.add(themeColorCellGrid[i][4]);
+ centerPane.add(columnPane);
+ }
+
+ refreshThemeMenuColorPane();
+ }
+
+ private void refreshThemeMenuColorPane() {
+ List standardColors = null;
+ if (TemplateThemeProfileDialog.isEditingTheme()) {
+ standardColors = TemplateThemeProfileDialog.getEditingColorScheme();
+ } else {
+ JTemplate,?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
+ if (template != null) {
+ TemplateTheme theme = template.getTemplateTheme();
+ if (theme != null) {
+ standardColors = theme.getColorScheme().getColors();
+ }
+ }
+ }
+ if (standardColors == null || standardColors.size() != 8) {
+ return;
+ }
+
+ for (int i = 2; i < themeColorCellGrid.length; i++) {
+ Color color = standardColors.get(i - 2);
+
+ themeColorCellGrid[i][0].setColor(color);
+ themeColorCellGrid[i][2].setColor(color = saturationDown(color, false, true));
+ themeColorCellGrid[i][1].setColor(saturationDown(color, false, true));
+
+ color = standardColors.get(i - 2);
+ themeColorCellGrid[i][3].setColor(color = saturationDown(color, false, false));
+ themeColorCellGrid[i][4].setColor(saturationDown(color, false, false));
+ }
+ }
+
+
+ private FineColorCell createFineColorCell(Color color, boolean isDefaultColor, int x, int y) {
+ return isDefaultColor ? new FineColorCell(color, this) : new FineColorCell(color, this, x - 2, y);
+ }
+
+ /**
+ * 调整明度和纯度,默认色只调整明度
+ * @param color
+ * @param isDefaultColor
+ * @return
+ */
+ public static Color saturationDown(Color color, boolean isDefaultColor, boolean isLight) {
+ float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), new float[3]);
+ if (!isDefaultColor) {
+ hsb[1] = isLight ? Math.max(0, hsb[1] - PURITY_VALUE) : Math.min(1, hsb[1] + PURITY_VALUE);
+ }
+ hsb[2] = isLight ? Math.min(1, hsb[2] + BRIGHTNESS_VALUE) : Math.max(0, hsb[2] - BRIGHTNESS_VALUE);
+ Color color1 = Color.getHSBColor(hsb[0], hsb[1], hsb[2]);
+ return color1;
+ }
+
+ private void initMenuColorPane() {
+ menuColorPane.setLayout(new GridLayout(5, 8, 3, 3));
+ Color[] colorArray = this.getColorArray();
+ for (int i = 0; i < colorArray.length; i++) {
+ Color color = colorArray[i] == null ? UsedColorPane.DEFAULT_COLOR : colorArray[i];
+ menuColorPane.add(new ColorCell(color, this));
+ }
+
+ }
+
public boolean isSupportTransparent() {
return isSupportTransparent;
}
@@ -113,6 +262,10 @@ public class NewColorSelectPane extends BasicPane implements ColorSelectable {
isSupportTransparent = supportTransparent;
}
+ protected boolean selectRealTime() {
+ return true;
+ }
+
protected void initSelectButton(boolean isSupportTransparent){
this.isSupportTransparent = isSupportTransparent;
this.setLayout(FRGUIPaneFactory.createBorderLayout());
@@ -120,21 +273,14 @@ public class NewColorSelectPane extends BasicPane implements ColorSelectable {
if (isSupportTransparent) {
UIButton transparentButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_ChartF_Transparency"));
this.add(transparentButton, BorderLayout.NORTH);
- transparentButton.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- doTransparent();
- }
- });
+ transparentButton.addActionListener(e -> doTransparent());
}
}
/**
* 添加监听
- *
- * @param 监听列表 Add change listener.
+ * @param changeListener 监听
*/
public void addChangeListener(ChangeListener changeListener) {
this.colorChangeListenerList.add(changeListener);
@@ -151,7 +297,7 @@ public class NewColorSelectPane extends BasicPane implements ColorSelectable {
* @return 颜色
* Return the color.
*/
- public Color getColor() {
+ public FineColor getColor() {
return color;
}
@@ -163,7 +309,6 @@ public class NewColorSelectPane extends BasicPane implements ColorSelectable {
public Color getNotNoneColor() {
if (color == null) {
setColor(Color.WHITE);
- return Color.WHITE;
}
return color;
}
@@ -175,27 +320,36 @@ public class NewColorSelectPane extends BasicPane implements ColorSelectable {
*/
@Override
public void setColor(Color color) {
- this.color = color;
+ if (isSupportThemeColor) {
+ refreshThemeMenuColorPane();
+ }
+ FineColor fineColor;
+ if (color == null) {
+ fineColor = null;
+ } else {
+ fineColor = color instanceof FineColor ? (FineColor) color : new FineColor(color);
+ }
+ setFineColor(fineColor);
+ }
+
+ private void setFineColor(FineColor fineColor){
+ this.color = fineColor;
// fire color change.
if (!colorChangeListenerList.isEmpty()) {
ChangeEvent evt = new ChangeEvent(this);
- for (int i = 0; i < colorChangeListenerList.size(); i++) {
- this.colorChangeListenerList.get(i).stateChanged(evt);
+ for (ChangeListener changeListener : colorChangeListenerList) {
+ changeListener.stateChanged(evt);
}
}
DesignerEnvManager.getEnvManager().getColorConfigManager().addToColorQueue(color);
this.repaint();
}
- /**
- * 设置颜色
- *
- * @param 颜色位置
- */
@Override
public void colorSetted(ColorCell colorCell) {
+ this.updateUsedColor();
colorCell.repaint();
}
@@ -203,18 +357,28 @@ public class NewColorSelectPane extends BasicPane implements ColorSelectable {
setColor(null);
}
+ protected Color[] getColorArray() {
+ return ColorFactory.MenuColors;
+ }
+
+ protected JPanel getMenuColorPane() {
+ return new JPanel();
+ }
+
+
protected void customButtonPressed() {
// 颜色选择器
ColorSelectDetailPane pane = new ColorSelectDetailPane(Color.WHITE);
- ColorSelectDialog.showDialog(DesignerContext.getDesignerFrame(), pane, Color.WHITE, this);
+ Color color = getColor() == null ? Color.WHITE : getColor().getColor();
+ ColorSelectDialog.showDialog(DesignerContext.getDesignerFrame(), pane, color, this);
}
@Override
public Dimension getPreferredSize() {
if (isSupportTransparent) {
- return new Dimension(super.getPreferredSize().width, TRANSPARENT_WINDOW_HEIGHT);
+ return new Dimension(197, 265);
}
- return new Dimension(super.getPreferredSize().width, WINDOW_HEIGHT);
+ return new Dimension(197, 250);
}
/**
@@ -224,5 +388,68 @@ public class NewColorSelectPane extends BasicPane implements ColorSelectable {
usedColorPane.updateUsedColor();
}
+ class NewUsedColorPane extends BasicPane {
+
+ // 最近使用面板列数
+ private int columns;
+
+ // 最近使用面板
+ private JPanel pane;
+
+ private ColorSelectable selectable;
+
+ private boolean setColorRealTime;
+
+ public JPanel getPane(){
+ return this.pane;
+ }
+
+
+ public NewUsedColorPane(int columns, ColorSelectable selectable, boolean setColorRealTime){
+ this.columns = columns;
+ this.selectable = selectable;
+ this.setColorRealTime = setColorRealTime;
+ initialComponents();
+ }
+
+
+ private void initialComponents() {
+ int total = columns;
+ JPanel panel = new JPanel();
+ panel.setLayout(new GridLayout(1, columns + 1, 3, 3));
+ panel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ //最近使用颜色
+ Color[] colors = DesignerEnvManager.getEnvManager().getColorConfigManager().getColors();
+ int size = colors.length;
+ for (int i = 0; i < total; i++) {
+ Color color = i < size ? colors[size - i - 1] :
+ UsedColorPane.DEFAULT_COLOR;
+ panel.add(new ColorCell(color == null ? UsedColorPane.DEFAULT_COLOR : color, selectable));
+ }
+ // 取色按钮
+ JButton pickColorButton = PickColorButtonFactory.getPickColorButton(selectable, PickColorButtonFactory.IconType.ICON16, setColorRealTime);
+ panel.add(pickColorButton);
+ this.pane = panel;
+ }
+
+ /**
+ * 更新最近使用颜色
+ */
+ public void updateUsedColor() {
+ int total = columns ;
+ Color[] colors = DesignerEnvManager.getEnvManager().getColorConfigManager().getColors();
+ int size = colors.length;
+ for (int i = 0; i < total; i++) {
+ ColorCell cell = (ColorCell) this.pane.getComponent(i);
+ Color color = i < size ? colors[size - i - 1] : UsedColorPane.DEFAULT_COLOR;
+ cell.setColor(color == null ? UsedColorPane.DEFAULT_COLOR : color);
+ }
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return null;
+ }
+ }
}
diff --git a/designer-base/src/main/java/com/fr/env/CheckServiceDialog.java b/designer-base/src/main/java/com/fr/env/CheckServiceDialog.java
index a921a0322..032f16a76 100644
--- a/designer-base/src/main/java/com/fr/env/CheckServiceDialog.java
+++ b/designer-base/src/main/java/com/fr/env/CheckServiceDialog.java
@@ -5,6 +5,7 @@ import com.fr.design.RestartHelper;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.DesignSizeI18nManager;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayout;
@@ -113,10 +114,10 @@ public class CheckServiceDialog extends JDialog implements ActionListener {
font = font.applySize(15).applyStyle(1);
UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Sync_Branch_Inconsistency"));
label.setFont(font);
- label.setPreferredSize(new Dimension(650, 30));
+ label.setPreferredSize(DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.version.detail.label"));
UILabel label2 = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Sync_Inconsistency_Risk"));
- label2.setPreferredSize(new Dimension(600, 30));
+ label2.setPreferredSize(DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.version.detail.label"));
verticalPanel.add(label);
verticalPanel.add(label2);
@@ -201,7 +202,7 @@ public class CheckServiceDialog extends JDialog implements ActionListener {
this.add(topPanel, BorderLayout.NORTH);
this.add(centerPanel, BorderLayout.CENTER);
this.add(buttonPanel, BorderLayout.SOUTH);
- this.setSize(new Dimension(GeneralContext.getLocale().equals(Locale.US) ? 750 : 600, 500));
+ this.setSize(DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.version.detail.dialog"));
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
diff --git a/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java b/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java
index 17dc72dba..56f90e804 100644
--- a/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java
+++ b/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java
@@ -21,7 +21,7 @@ import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.scrollruler.ModLineBorder;
-import com.fr.env.handler.RemoteDesignExceptionHandler;
+import com.fr.env.handler.WorkspaceExceptionHandler;
import com.fr.stable.StringUtils;
import com.fr.third.guava.base.Strings;
import com.fr.workspace.WorkContext;
@@ -596,7 +596,7 @@ public class RemoteEnvPane extends BasicBeanPane {
}
} catch (Exception e) {
dialog.dispose();
- RemoteDesignExceptionHandler.getInstance().handleInTest(e, remoteEnv);
+ WorkspaceExceptionHandler.getInstance().handleInTest(e, remoteEnv);
}
dialogDownPane.remove(cancelButton);
dialogDownPane.revalidate();
diff --git a/designer-base/src/main/java/com/fr/env/handler/RemoteDesignExceptionHandler.java b/designer-base/src/main/java/com/fr/env/handler/WorkspaceExceptionHandler.java
similarity index 72%
rename from designer-base/src/main/java/com/fr/env/handler/RemoteDesignExceptionHandler.java
rename to designer-base/src/main/java/com/fr/env/handler/WorkspaceExceptionHandler.java
index 7e6154eee..367cd6bbb 100644
--- a/designer-base/src/main/java/com/fr/env/handler/RemoteDesignExceptionHandler.java
+++ b/designer-base/src/main/java/com/fr/env/handler/WorkspaceExceptionHandler.java
@@ -1,5 +1,6 @@
package com.fr.env.handler;
+import com.fr.base.exception.ExceptionDescriptor;
import com.fr.design.EnvChangeEntrance;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.env.DesignerWorkspaceInfo;
@@ -11,6 +12,7 @@ import com.fr.env.handler.impl.CommonHandler;
import com.fr.env.handler.impl.ExecutionHandler;
import com.fr.env.handler.impl.UnexpectedHandler;
import com.fr.log.FineLoggerFactory;
+import com.fr.stable.StringUtils;
import java.util.ArrayList;
import java.util.List;
import javax.swing.UIManager;
@@ -23,11 +25,11 @@ import static javax.swing.JOptionPane.ERROR_MESSAGE;
* @version 10.0
* Created by hades on 2021/8/5
*/
-public class RemoteDesignExceptionHandler {
+public class WorkspaceExceptionHandler {
- private static final RemoteDesignExceptionHandler INSTANCE = new RemoteDesignExceptionHandler();
+ private static final WorkspaceExceptionHandler INSTANCE = new WorkspaceExceptionHandler();
- public static RemoteDesignExceptionHandler getInstance() {
+ public static WorkspaceExceptionHandler getInstance() {
return INSTANCE;
}
@@ -35,7 +37,7 @@ public class RemoteDesignExceptionHandler {
private final List> switchList = new ArrayList<>();
- private RemoteDesignExceptionHandler() {
+ private WorkspaceExceptionHandler() {
// 要保证顺序
testList.add(new CancelHandler());
testList.add(new ExecutionHandler());
@@ -65,11 +67,15 @@ public class RemoteDesignExceptionHandler {
public void handleInSwitch(Throwable e, DesignerWorkspaceInfo workspaceInfo) {
if (workspaceInfo == null || workspaceInfo.getType() == DesignerWorkspaceType.Local) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
- FineJOptionPane.showMessageDialog(EnvChangeEntrance.getInstance().getDialog(),
- Toolkit.i18nText("Fine-Design_Basic_Switch_Workspace_Failed"),
- Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"),
- ERROR_MESSAGE,
- UIManager.getIcon("OptionPane.errorIcon"));
+ if (e instanceof ExceptionDescriptor) {
+ new CommonHandler(true).handle(new RefWrapper(e, StringUtils.EMPTY));
+ } else {
+ FineJOptionPane.showMessageDialog(EnvChangeEntrance.getInstance().getDialog(),
+ Toolkit.i18nText("Fine-Design_Basic_Switch_Workspace_Failed"),
+ Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"),
+ ERROR_MESSAGE,
+ UIManager.getIcon("OptionPane.errorIcon"));
+ }
return;
}
handle(e, switchList, workspaceInfo);
@@ -78,6 +84,7 @@ public class RemoteDesignExceptionHandler {
public void handleInStart(Throwable e, DesignerWorkspaceInfo workspaceInfo) {
if (workspaceInfo == null || workspaceInfo.getType() == DesignerWorkspaceType.Local) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ new CommonHandler(false).handle(new RefWrapper(e, StringUtils.EMPTY));
return;
}
handle(e, testList, workspaceInfo);
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 bd26abb1b..dd33c6a6a 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
@@ -4,4 +4,6 @@ com.fr.design.mainframe.check.CheckFontInfoDialog.messageWithLink=630*31
com.fr.design.mainframe.check.CheckFontInfoDialog.unfold=630*280
com.fr.design.report.ReportColumnsPane=800*600
com.fr.env.RemoteEnvPane.dialog=458*132
-com.fr.design.version.check.dialog=490*95
\ No newline at end of file
+com.fr.design.version.check.dialog=490*95
+com.fr.design.version.detail.label=750*30
+com.fr.design.version.detail.dialog=900*500
\ 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 5a0cb009e..b67a913e7 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
@@ -3,4 +3,6 @@ com.fr.design.mainframe.check.CheckFontInfoDialog.collapse=610*185
com.fr.design.mainframe.check.CheckFontInfoDialog.messageWithLink=610*31
com.fr.design.mainframe.check.CheckFontInfoDialog.unfold=610*280
com.fr.env.RemoteEnvPane.dialog=458*132
-com.fr.design.version.check.dialog=430*95
\ No newline at end of file
+com.fr.design.version.check.dialog=430*95
+com.fr.design.version.detail.label=650*30
+com.fr.design.version.detail.dialog=800*500
\ 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 17a8209db..862580eed 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
@@ -3,4 +3,6 @@ com.fr.design.mainframe.check.CheckFontInfoDialog.collapse=490*185
com.fr.design.mainframe.check.CheckFontInfoDialog.messageWithLink=490*35
com.fr.design.mainframe.check.CheckFontInfoDialog.unfold=490*280
com.fr.env.RemoteEnvPane.dialog=458*132
-com.fr.design.version.check.dialog=450*95
\ No newline at end of file
+com.fr.design.version.check.dialog=450*95
+com.fr.design.version.detail.label=700*30
+com.fr.design.version.detail.dialog=850*500
\ 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 1c5f50cca..5a325b16b 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
@@ -4,4 +4,6 @@ com.fr.design.mainframe.check.CheckFontInfoDialog.collapse=385*185
com.fr.design.mainframe.check.CheckFontInfoDialog.messageWithLink=385*31
com.fr.design.mainframe.check.CheckFontInfoDialog.unfold=385*280
com.fr.env.RemoteEnvPane.dialog=308*132
-com.fr.design.version.check.dialog=230*95
\ No newline at end of file
+com.fr.design.version.check.dialog=230*95
+com.fr.design.version.detail.label=450*30
+com.fr.design.version.detail.dialog=600*500
\ 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 fcbcb8c52..1be37f9c7 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
@@ -3,4 +3,6 @@ com.fr.design.mainframe.check.CheckFontInfoDialog.collapse=385*185
com.fr.design.mainframe.check.CheckFontInfoDialog.messageWithLink=385*31
com.fr.design.mainframe.check.CheckFontInfoDialog.unfold=385*280
com.fr.env.RemoteEnvPane.dialog=308*132
-com.fr.design.version.check.dialog=230*95
\ No newline at end of file
+com.fr.design.version.check.dialog=230*95
+com.fr.design.version.detail.label=450*30
+com.fr.design.version.detail.dialog=600*500
\ No newline at end of file
diff --git a/designer-base/src/main/resources/com/fr/env/jarVersion.properties b/designer-base/src/main/resources/com/fr/env/jarVersion.properties
new file mode 100644
index 000000000..7eff54deb
--- /dev/null
+++ b/designer-base/src/main/resources/com/fr/env/jarVersion.properties
@@ -0,0 +1 @@
+report-engine-key=fine-report-engine-11.0.jar
\ No newline at end of file
diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java b/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java
index 4cd00e577..bce90aaae 100644
--- a/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java
+++ b/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java
@@ -3,6 +3,7 @@ package com.fr.design.chart;
import com.fr.base.chart.BaseChartCollection;
import com.fr.chart.chartattr.ChartCollection;
import com.fr.design.dialog.BasicDialog;
+import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.gui.chart.MiddleChartDialog;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.i18n.Toolkit;
@@ -110,6 +111,7 @@ public class ChartDialog extends MiddleChartDialog {
if (cc == null) {
return;
}
+ cc.setThemeStyle(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getTemplateTheme());
this.cc = cc;
}
diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartComponent.java b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartComponent.java
index 1ce2fbffd..b251abc6a 100644
--- a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartComponent.java
+++ b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartComponent.java
@@ -146,7 +146,6 @@ public class ChartComponent extends MiddleChartComponent implements MouseListene
return;
}
- chartCollection4Design.setPredefinedStyleName(getGlobalPredefinedStyleName(), false);
Graphics2D g2d = (Graphics2D) g;
if (this.isOpaque()) {
diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java
index 7e64f3d20..30d01cb55 100644
--- a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java
+++ b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java
@@ -2,6 +2,7 @@ package com.fr.design.chart.gui;
import com.fr.base.chart.BaseChartGetter;
import com.fr.chart.chartattr.ChartCollection;
+import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.gui.core.WidgetOption;
import com.fr.form.ui.ChartEditor;
import com.fr.form.ui.Widget;
@@ -40,6 +41,7 @@ public class ChartWidgetOption extends WidgetOption {
try {
ChartEditor widget = clz.newInstance();
ChartCollection chartCollection = (ChartCollection) BaseChartGetter.createChartCollection(this.chartID);
+ chartCollection.setThemeStyle(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getTemplateTheme());
VanChart vanChart = chartCollection.getSelectedChartProvider(VanChart.class);
if (vanChart !=null) {
vanChart.resetAttrInForm();
diff --git a/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java b/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java
index ae3867220..3372880dd 100644
--- a/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java
+++ b/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java
@@ -7,6 +7,7 @@ import com.fr.chart.charttypes.ChartTypeManager;
import com.fr.chart.web.ChartHyperPoplink;
import com.fr.chartx.attr.ChartProvider;
import com.fr.design.chart.gui.ChartComponent;
+import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.hyperlink.AbstractHyperLinkPane;
import com.fr.design.layout.FRGUIPaneFactory;
@@ -14,9 +15,9 @@ import com.fr.design.mainframe.chart.ChartHyperEditPane;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.log.FineLoggerFactory;
+import java.util.HashMap;
import java.awt.BorderLayout;
import java.awt.Dimension;
-import java.util.HashMap;
/**
* 类说明: 图表超链 -- 弹出 悬浮窗.
@@ -64,6 +65,7 @@ public class ChartHyperPoplinkPane extends AbstractHyperLinkPane preButton;
private JPanel textFontPane;
- public ChartTextAttrPaneWithPreStyle() {
+ public ChartTextAttrPaneWithThemeStyle() {
initListener();
}
protected JPanel getContentPane(JPanel buttonPane) {
- preButton = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_Predefined"),
+ JPanel panel = new JPanel(new BorderLayout(0, 10));
+
+ preButton = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_Follow_Theme"),
Toolkit.i18nText("Fine-Design_Chart_Custom")});
double f = TableLayout.FILL;
double e = getEdithAreaWidth();
- double[] columnSize = {f, e};
double p = TableLayout.PREFERRED;
- textFontPane = TableLayout4VanChartHelper.createGapTableLayoutPane(getComponents(buttonPane), getRowSize(), columnSize);
-
- double[] rowSize = {p, p, p};
+ double[] columnSize = {f, e};
UILabel text = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Character"), SwingConstants.LEFT);
- Component[][] components = {
- new Component[]{null, null},
- new Component[]{text, preButton},
- new Component[]{textFontPane, null},
- };
- return TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize);
+ JPanel preButtonPane = TableLayout4VanChartHelper.createGapTableLayoutPane(new Component[][]{new Component[]{text, preButton}}, new double[]{p}, columnSize);
+ textFontPane = TableLayout4VanChartHelper.createGapTableLayoutPane(getComponents(buttonPane), getRowSize(), columnSize);
+ panel.add(preButtonPane, BorderLayout.CENTER);
+ panel.add(textFontPane, BorderLayout.SOUTH);
+ panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
+ return panel;
}
protected double getEdithAreaWidth() {
@@ -72,11 +72,19 @@ public class ChartTextAttrPaneWithPreStyle extends ChartTextAttrPane {
private void checkPreButton() {
textFontPane.setVisible(preButton.getSelectedIndex() == CUSTOM);
- textFontPane.setPreferredSize(preButton.getSelectedIndex() == CUSTOM ? new Dimension(0, 60) : new Dimension(0, 0));
+ }
+
+ protected double[] getRowSize() {
+ double p = TableLayout.PREFERRED;
+ return new double[]{p, p};
}
public void populate(TextAttr textAttr) {
- if (textAttr.isPredefinedStyle()) {
+ populate(textAttr, false);
+ }
+
+ public void populate(TextAttr textAttr, boolean autoFont) {
+ if (textAttr.isThemed() || autoFont) {
preButton.setSelectedIndex(PREDEFINED_STYLE);
} else {
preButton.setSelectedIndex(CUSTOM);
@@ -88,9 +96,9 @@ public class ChartTextAttrPaneWithPreStyle extends ChartTextAttrPane {
public void update(TextAttr textAttr) {
int selectedIndex = preButton.getSelectedIndex();
if (selectedIndex == PREDEFINED_STYLE) {
- textAttr.setPredefinedStyle(true);
+ textAttr.setThemed(true);
} else {
- textAttr.setPredefinedStyle(false);
+ textAttr.setThemed(false);
}
super.update(textAttr);
}
diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ColorSelectBoxWithPreStyle.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ColorSelectBoxWithThemeStyle.java
similarity index 81%
rename from designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ColorSelectBoxWithPreStyle.java
rename to designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ColorSelectBoxWithThemeStyle.java
index a4a0344fa..bee92e04c 100644
--- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ColorSelectBoxWithPreStyle.java
+++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/ColorSelectBoxWithThemeStyle.java
@@ -1,6 +1,6 @@
package com.fr.design.mainframe.chart.gui.style;
-import com.fr.chart.base.ColorWithPreStyle;
+import com.fr.chart.base.ColorWithThemeStyle;
import com.fr.design.dialog.BasicPane;
import com.fr.design.gui.ibutton.UIButtonGroup;
import com.fr.design.gui.ilable.UILabel;
@@ -22,7 +22,7 @@ import java.awt.event.ActionListener;
* @version 10.0
* Created by Bjorn on 2020-09-07
*/
-public class ColorSelectBoxWithPreStyle extends BasicPane {
+public class ColorSelectBoxWithThemeStyle extends BasicPane {
private static final int PREDEFINED_STYLE = 0;
private static final int CUSTOM = 1;
@@ -30,8 +30,8 @@ public class ColorSelectBoxWithPreStyle extends BasicPane {
private UIButtonGroup preButton;
private ColorSelectBox colorSelectBox;
- public ColorSelectBoxWithPreStyle(int preferredWidth) {
- preButton = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_Predefined"),
+ public ColorSelectBoxWithThemeStyle(int preferredWidth) {
+ preButton = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_Follow_Theme"),
Toolkit.i18nText("Fine-Design_Chart_Custom")});
colorSelectBox = new ColorSelectBox(preferredWidth);
initContent();
@@ -73,15 +73,15 @@ public class ColorSelectBoxWithPreStyle extends BasicPane {
return null;
}
- public void populate(ColorWithPreStyle colorWithPreStyle) {
- preButton.setSelectedIndex(colorWithPreStyle.isPredefinedStyle() ? PREDEFINED_STYLE : CUSTOM);
+ public void populate(ColorWithThemeStyle colorWithPreStyle) {
+ preButton.setSelectedIndex(colorWithPreStyle.isThemed() ? PREDEFINED_STYLE : CUSTOM);
colorSelectBox.setSelectObject(colorWithPreStyle.getColor());
checkPreButton();
}
- public ColorWithPreStyle update() {
- ColorWithPreStyle colorWithPreStyle = new ColorWithPreStyle();
- colorWithPreStyle.setPredefinedStyle(preButton.getSelectedIndex() == PREDEFINED_STYLE);
+ public ColorWithThemeStyle update() {
+ ColorWithThemeStyle colorWithPreStyle = new ColorWithThemeStyle();
+ colorWithPreStyle.setThemed(preButton.getSelectedIndex() == PREDEFINED_STYLE);
colorWithPreStyle.setColor(colorSelectBox.getSelectObject());
return colorWithPreStyle;
}
diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/UIColorPickerPane4Map.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/UIColorPickerPane4Map.java
index 8606ffab9..217b01d8b 100644
--- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/UIColorPickerPane4Map.java
+++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/UIColorPickerPane4Map.java
@@ -2,15 +2,10 @@ package com.fr.design.mainframe.chart.gui.style.series;
import com.fr.chart.base.ChartConstants;
import com.fr.design.gui.frpane.AbstractAttrNoScrollPane;
-import com.fr.design.style.color.ColorCell;
import com.fr.design.style.color.ColorSelectBox;
-import com.fr.design.style.color.ColorSelectPane;
+import com.fr.design.style.color.NewColorSelectPane;
-import javax.swing.Box;
-import javax.swing.JPanel;
-import javax.swing.JSeparator;
import java.awt.Color;
-import java.awt.GridLayout;
/**
* Created by IntelliJ IDEA.
@@ -27,23 +22,12 @@ public class UIColorPickerPane4Map extends UIColorPickerPane {
return new ColorSelectBox4Map(100);
}
- private class ColorSelectPane4Map extends ColorSelectPane {
+ private class ColorSelectPane4Map extends NewColorSelectPane {
public ColorSelectPane4Map(){
super(false);
}
- public void initCenterPaneChildren(JPanel centerPane) {
- JPanel menuColorPane1 = new JPanel();
- centerPane.add(menuColorPane1);
- menuColorPane1.setLayout(new GridLayout(5, 8, 5, 5));
- for (int i = 0; i < ChartConstants.MAP_COLOR_ARRAY.length; i++) {
- menuColorPane1.add(new ColorCell(ChartConstants.MAP_COLOR_ARRAY[i], this));
- }
- centerPane.add(Box.createVerticalStrut(5));
- centerPane.add(new JSeparator());
- }
-
protected Color[] getColorArray(){
return ChartConstants.MAP_COLOR_ARRAY;
}
@@ -54,7 +38,7 @@ public class UIColorPickerPane4Map extends UIColorPickerPane {
super(preferredWidth);
}
- protected ColorSelectPane getColorSelectPane(){
+ protected NewColorSelectPane getColorSelectPane(){
return new ColorSelectPane4Map();
}
}
diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java
index 584d7fd1d..e8ef8714d 100644
--- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java
+++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java
@@ -72,6 +72,7 @@ public class ChartImagePane extends ChartSelectDemoPane {
}else{
this.isDoubleClicked = false;
}
+ this.requestFocus();
super.mouseClicked(e);
}
diff --git a/designer-chart/src/main/java/com/fr/design/module/ChartHyperlinkGroup.java b/designer-chart/src/main/java/com/fr/design/module/ChartHyperlinkGroup.java
index 7611f3300..378e6a0d7 100644
--- a/designer-chart/src/main/java/com/fr/design/module/ChartHyperlinkGroup.java
+++ b/designer-chart/src/main/java/com/fr/design/module/ChartHyperlinkGroup.java
@@ -58,21 +58,26 @@ public class ChartHyperlinkGroup extends BaseHyperlinkGroup {
if (template == null) {
return false;
}
+
if (template.isJWorkBook() || DesignModeContext.isDuchampMode()) {
// 如果是普通报表单元格,那么没有 FormHyperlink 选项
FormHyperlinkProvider formHyperlink = StableFactory.getMarkedInstanceObjectFromClass(FormHyperlinkProvider.XML_TAG, FormHyperlinkProvider.class);
//返回true表示可用,返回false表示不可用
return !ComparatorUtils.equals(clazz, formHyperlink.getClass());
+
} else {
// 如果是决策报表
- if (template.getEditingReportIndex() == BaseJForm.FORM_TAB) {
- // 编辑的是决策报表中的图表,那么没有ChartHyperRelateFloatLink 和 ChartHyperRelateCellLink 选项,有FormHyperlink 选项
- Class[] classes = new Class[]{ChartHyperRelateCellLink.class, ChartHyperRelateFloatLink.class};
- return !ArrayUtils.contains(classes, clazz);
- } else if (template.getEditingReportIndex() == BaseJForm.ELEMENTCASE_TAB) {
- // 编辑的是决策报表中的报表块,那么没有 ChartHyperPoplink 和 ChartHyperRelateFloatLink
- Class[] classes = new Class[]{ChartHyperPoplink.class, ChartHyperRelateFloatLink.class};
- return !ArrayUtils.contains(classes, clazz);
+ Class[] classes = new Class[]{ChartHyperRelateCellLink.class, ChartHyperRelateFloatLink.class};
+ for (Class aClass : classes) {
+ if (template.getEditingReportIndex() == BaseJForm.FORM_TAB) {
+ // 编辑的是决策报表中的图表,那么没有ChartHyperRelateFloatLink 和 ChartHyperRelateCellLink 选项,有FormHyperlink 选项
+ if (ComparatorUtils.equals(aClass, clazz)) {
+ return false;
+ }
+ } else if (template.getEditingReportIndex() == BaseJForm.ELEMENTCASE_TAB) {
+ // 编辑的是决策报表中的报表块,那么没有 ChartHyperRelateFloatLink,有ChartHyperRelateCellLink 和 FormHyperlink 选项
+ return !ComparatorUtils.equals(clazz, ChartHyperRelateFloatLink.class);
+ }
}
}
return true;
@@ -96,18 +101,21 @@ public class ChartHyperlinkGroup extends BaseHyperlinkGroup {
return !ComparatorUtils.equals(object.getClass(), formHyperlink.getClass());
} else {
// 如果是决策报表
- if (template.getEditingReportIndex() == BaseJForm.FORM_TAB) {
- // 编辑的是决策报表中的图表,那么没有ChartHyperRelateFloatLink 和 ChartHyperRelateCellLink 选项,有FormHyperlink 选项
- Class[] classes = new Class[]{ChartHyperRelateCellLink.class, ChartHyperRelateFloatLink.class};
- return !ArrayUtils.contains(classes, object.getClass());
- } else if (template.getEditingReportIndex() == BaseJForm.ELEMENTCASE_TAB) {
- // 编辑的是决策报表中的报表块,那么没有 ChartHyperPoplink 和 ChartHyperRelateFloatLink
- Class[] classes = new Class[]{ChartHyperPoplink.class, ChartHyperRelateFloatLink.class};
- return !ArrayUtils.contains(classes, object.getClass());
+ Class[] classes = new Class[]{ChartHyperRelateCellLink.class, ChartHyperRelateFloatLink.class};
+ for (Class aClass : classes) {
+ if (template.getEditingReportIndex() == BaseJForm.FORM_TAB) {
+ // 编辑的是决策报表中的图表,那么没有ChartHyperRelateFloatLink 和 ChartHyperRelateCellLink 选项,有FormHyperlink 选项
+ if (ComparatorUtils.equals(aClass, object.getClass())) {
+ return false;
+ }
+ } else if (template.getEditingReportIndex() == BaseJForm.ELEMENTCASE_TAB) {
+ // 编辑的是决策报表中的报表块,那么没有 ChartHyperRelateFloatLink,有ChartHyperRelateCellLink 和 FormHyperlink 选项
+ return !ComparatorUtils.equals(object.getClass(), ChartHyperRelateFloatLink.class);
+ }
}
}
return true;
}
};
}
-}
+}
\ No newline at end of file
diff --git a/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleAction.java b/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleAction.java
index 61b9a8c4f..e989e1a36 100644
--- a/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleAction.java
+++ b/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleAction.java
@@ -16,6 +16,8 @@ import com.fr.transaction.WorkerFacade;
import com.fr.van.chart.designer.component.VanChartFillStylePane;
import javax.swing.KeyStroke;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
import java.util.concurrent.ExecutorService;
import java.awt.event.ActionEvent;
@@ -43,6 +45,7 @@ public class ChartPreStyleAction extends UpdateAction {
*/
public void actionPerformed(ActionEvent e) {
DesignerFrame designerFrame = DesignerContext.getDesignerFrame();
+ DesignerContext.getDesignerFrame().setServerConfig(true);
final ChartPreStyleManagerPane pane = new ChartPreStyleManagerPane();
BasicDialog dialog = pane.showWindow(designerFrame);
dialog.addDialogActionListener(new DialogActionAdapter() {
@@ -79,7 +82,13 @@ public class ChartPreStyleAction extends UpdateAction {
}));
}
});
-
+ dialog.addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosed(WindowEvent e) {
+ super.windowClosed(e);
+ DesignerContext.getDesignerFrame().setServerConfig(false);
+ }
+ });
pane.populateBean();
dialog.setVisible(true);
diff --git a/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleListPane.java b/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleListPane.java
index f2f5c3cf6..433c7dfd0 100644
--- a/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleListPane.java
+++ b/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleListPane.java
@@ -8,13 +8,10 @@ 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.controlpane.ShortCut4JControlPane;
-import com.fr.design.gui.ilist.ModNameActionListener;
import com.fr.design.menu.ShortCut;
import com.fr.general.NameObject;
import com.fr.stable.Nameable;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
import java.util.ArrayList;
import java.util.Iterator;
@@ -25,14 +22,6 @@ import java.util.Iterator;
*/
public class ChartPreStyleListPane extends JListControlPane {
- ChartPreStyleManagerPane chartPreStyleManagerPane;
-
- public ChartPreStyleListPane(ChartPreStyleManagerPane chartPreStyleManagerPane) {
- super();
- this.chartPreStyleManagerPane = chartPreStyleManagerPane;
- initListener();
- }
-
/**
* 创建有名字的creator
*
@@ -53,13 +42,7 @@ public class ChartPreStyleListPane extends JListControlPane {
@Override
public BasicBeanPane createPaneByCreators(NameableCreator creator) {
- return new ChartPreStylePane() {
- @Override
- protected void refreshWhenStyleChange(ChartColorMatching preStyle) {
- super.refreshWhenStyleChange(preStyle);
- chartPreStyleManagerPane.refreshDefaultColorBox();
- }
- };
+ return new ChartPreStylePane();
}
@@ -82,21 +65,6 @@ public class ChartPreStyleListPane extends JListControlPane {
return shortCut4JControlPane;
}
- public void initListener() {
- nameableList.addListSelectionListener(new ListSelectionListener() {
- @Override
- public void valueChanged(ListSelectionEvent e) {
- chartPreStyleManagerPane.refreshDefaultColorBox();
- }
- });
- nameableList.addModNameActionListener(new ModNameActionListener() {
- @Override
- public void nameModed(int index, String oldName, String newName) {
- chartPreStyleManagerPane.refreshDefaultColorBox(oldName, newName);
- }
- });
- }
-
public void populateBean() {
ChartPreStyleConfig config = ChartPreStyleConfig.getInstance().mirror();
ArrayList list = new ArrayList();
@@ -111,15 +79,10 @@ public class ChartPreStyleListPane extends JListControlPane {
Nameable[] values = (Nameable[]) list.toArray(new Nameable[list.size()]);
populate(values);
-
- if (config.containsName(config.getCurrentStyle())) {
- this.setSelectedName(config.getCurrentStyle());
- }
}
public void updateBean() {
ChartPreStyleConfig config = ChartPreStyleConfig.getInstance();
-
Nameable[] values = update();
config.clearAllPreStyle();
diff --git a/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleManagerPane.java b/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleManagerPane.java
index 98f3862dc..26ee8f20e 100644
--- a/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleManagerPane.java
+++ b/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleManagerPane.java
@@ -1,24 +1,10 @@
package com.fr.design.module;
-import com.fr.base.ChartColorMatching;
-import com.fr.base.ChartPreStyleConfig;
-import com.fr.design.gui.icombobox.ColorSchemeComboBox;
import com.fr.design.dialog.BasicPane;
-import com.fr.design.gui.ilable.UILabel;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
-import com.fr.general.ComparatorUtils;
-import com.fr.general.GeneralUtils;
-import com.fr.general.NameObject;
-import com.fr.stable.Nameable;
-import com.fr.van.chart.designer.TableLayout4VanChartHelper;
-import javax.swing.JPanel;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
import java.awt.BorderLayout;
-import java.awt.Dimension;
/**
* 图表预定义管理 界面, 在工具栏-服务器管理中.
@@ -28,8 +14,6 @@ import java.awt.Dimension;
*/
public class ChartPreStyleManagerPane extends BasicPane {
- private ColorSchemeComboBox defaultColorBox;
-
private ChartPreStyleListPane chartPreStyleListPane;
public ChartPreStyleManagerPane() {
@@ -38,78 +22,20 @@ public class ChartPreStyleManagerPane extends BasicPane {
private void initComponent() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
- JPanel colorBoxPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane();
-
- chartPreStyleListPane = new ChartPreStyleListPane(this);
-
- initDefaultColorBox();
- colorBoxPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Chart_Match_Default_Color_Scheme") + ":"));
- colorBoxPane.add(defaultColorBox);
-
- this.add(colorBoxPane, BorderLayout.NORTH);
+ chartPreStyleListPane = new ChartPreStyleListPane();
this.add(chartPreStyleListPane, BorderLayout.CENTER);
}
- private void initDefaultColorBox() {
- Map colorSchemes = new LinkedHashMap<>();
- ChartPreStyleConfig config = ChartPreStyleConfig.getInstance();
- Iterator names = config.names();
- while (names.hasNext()) {
- Object key = names.next();
- ColorSchemeComboBox.ColorInfo colorInfo = new ColorSchemeComboBox.ColorInfo();
- ChartColorMatching colorMatching = (ChartColorMatching) config.getPreStyle(key);
- colorInfo.setGradient(colorMatching.getGradient());
- colorInfo.setColors(colorMatching.getColorList());
- colorSchemes.put(colorMatching.getId(), colorInfo);
- }
- defaultColorBox = new ColorSchemeComboBox(colorSchemes);
- defaultColorBox.setPreferredSize(new Dimension(TableLayout4VanChartHelper.EDIT_AREA_WIDTH, 20));
- }
-
- private void refreshColorSchemes() {
- Nameable[] nameables = chartPreStyleListPane.update();
- Map colorSchemes = new LinkedHashMap<>();
- for (Nameable value : nameables) {
- String name = value.getName();
- ChartColorMatching colorMatching = (ChartColorMatching) ((NameObject) value).getObject();
- ColorSchemeComboBox.ColorInfo colorInfo = new ColorSchemeComboBox.ColorInfo();
- colorInfo.setGradient(colorMatching.getGradient());
- colorInfo.setColors(colorMatching.getColorList());
- colorSchemes.put(name, colorInfo);
- }
- defaultColorBox.refresh(colorSchemes);
- }
-
- public void refreshDefaultColorBox() {
- Object selectedItem = defaultColorBox.getSelectedItem();
- refreshColorSchemes();
- defaultColorBox.setSelectedItem(selectedItem);
- }
-
- public void refreshDefaultColorBox(String oldName, String newName) {
- Object selectedItem = defaultColorBox.getSelectedItem();
- if (ComparatorUtils.equals(selectedItem, oldName)) {
- selectedItem = newName;
- }
- refreshColorSchemes();
- defaultColorBox.setSelectedItem(selectedItem);
- }
-
@Override
protected String title4PopupWindow() {
return Toolkit.i18nText("Fine-Design_Report_ServerM_Predefined_Styles");
}
public void populateBean() {
- ChartPreStyleConfig config = ChartPreStyleConfig.getInstance();
- String currentStyle = config.getCurrentStyle();
- defaultColorBox.setSelectedItem(currentStyle);
chartPreStyleListPane.populateBean();
}
public void updateBean() {
- ChartPreStyleConfig config = ChartPreStyleConfig.getInstance();
- config.setCurrentStyle(GeneralUtils.objectToString(defaultColorBox.getSelectedItem()));
chartPreStyleListPane.updateBean();
}
}
diff --git a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnSeriesPane.java
index b83a20f61..27c588222 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnSeriesPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnSeriesPane.java
@@ -71,9 +71,7 @@ public class VanChartColumnSeriesPane extends VanChartAbstractPlotSeriesPane {
//边框(有圆角)
protected VanChartBorderPane createDiffBorderPane() {
- return new VanChartBorderWithRadiusPane();
- //TODO Bjorn 边框自动回退
- //return new VanChartBorderWithRadiusPane(true);
+ return new VanChartBorderWithRadiusPane(true);
}
private JPanel createSeriesStylePane(double[] row, double[] col) {
diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartFillStylePane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartFillStylePane.java
index 057675a0a..42e33b89c 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartFillStylePane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartFillStylePane.java
@@ -26,16 +26,8 @@ public class VanChartFillStylePane extends ColorFillStylePane implements Designe
DesignerContext.setDesignerBean(name, this);
}
- protected void styleSelectBoxChange() {
- //TODO Bjorn 配色预定义回退
- //getCustomPane().setVisible(getStyleSelectBox().getSelectedIndex() != 0);
- super.styleSelectBoxChange();
- }
-
protected ColorSchemeComboBox createColorSchemeComboBox() {
- return new ColorSchemeComboBox();
- //TODO Bjorn 配色预定义回退
- //return new ColorSchemeComboBox(null, true);
+ return new ColorSchemeComboBox(null, true);
}
protected void initLayout() {
@@ -63,21 +55,19 @@ public class VanChartFillStylePane extends ColorFillStylePane implements Designe
}
public void populateBean(AttrFillStyle condition) {
- /* if (condition.isPredefinedStyle()) {
+ if (condition.isThemed()) {
getStyleSelectBox().setSelectType(ColorSchemeComboBox.SelectType.DEFAULT);
return;
- }*/
- //TODO Bjorn 配色预定义回退
+ }
populateBean(condition.getColorFillStyle());
}
public void updateBean(AttrFillStyle attrFillStyle) {
- /* if (getStyleSelectBox().getSelectedIndex() == 0) {
- attrFillStyle.setPredefinedStyle(true);
+ if (getStyleSelectBox().getSelectedIndex() == 0) {
+ attrFillStyle.setThemed(true);
return;
}
- attrFillStyle.setPredefinedStyle(false);*/
- //TODO Bjorn 配色预定义回退
+ attrFillStyle.setThemed(false);
attrFillStyle.setColorFillStyle(updateBean());
}
diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartLabelContentPane.java
index e3bd8248f..8133771f9 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartLabelContentPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartLabelContentPane.java
@@ -1,10 +1,12 @@
package com.fr.van.chart.designer.component;
+import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPaneWithThemeStyle;
import com.fr.plugin.chart.base.AttrTooltipContent;
import com.fr.plugin.chart.type.TextAlign;
import com.fr.van.chart.designer.style.VanChartStylePane;
import javax.swing.JPanel;
+import java.awt.BorderLayout;
public class VanChartLabelContentPane extends VanChartTooltipContentPane {
@@ -22,12 +24,11 @@ public class VanChartLabelContentPane extends VanChartTooltipContentPane {
return new AttrTooltipContent(TextAlign.CENTER);
}
- //TODO Bjorn 标签面板回退
- /* public JPanel createCommonStylePane() {
+ public JPanel createCommonStylePane() {
if (isInCondition()) {
return super.createCommonStylePane();
}
- setTextAttrPane(new ChartTextAttrPaneWithPreStyle());
+ setTextAttrPane(new ChartTextAttrPaneWithThemeStyle());
JPanel stylePanel = new JPanel(new BorderLayout());
stylePanel.add(getTextAttrPane(), BorderLayout.CENTER);
@@ -42,9 +43,9 @@ public class VanChartLabelContentPane extends VanChartTooltipContentPane {
}
if (hasTextStylePane()) {
this.getTextAttrPane().update(attrTooltipContent.getTextAttr());
- if (!attrTooltipContent.getTextAttr().isPredefinedStyle()) {
+ if (!attrTooltipContent.getTextAttr().isThemed()) {
attrTooltipContent.setCustom(true);
}
}
- }*/
+ }
}
diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java
index d7c590e64..12e242b73 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java
@@ -632,7 +632,7 @@ public class VanChartTooltipContentPane extends BasicBeanPane {
private JPanel titlePane;
private TinyFormulaPane titleContent;
- private ChartTextAttrPane textAttrPane;
+ private ChartTextAttrPaneWithThemeStyle textAttrPane;
private UIButtonGroup alignmentPane;
private VanChartBackgroundWithOutShadowWithRadiusPane backgroundPane;
private UIToggleButton useHtml;
@@ -188,9 +188,7 @@ public class VanChartTitlePane extends AbstractVanChartScrollPane {
}
private JPanel createTitleStylePane() {
- //TODO Bjorn 标题预定义逻辑
- //textAttrPane = new ChartTextAttrPaneWithPreStyle();
- textAttrPane = new ChartTextAttrPane();
+ textAttrPane = new ChartTextAttrPaneWithThemeStyle();
return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), textAttrPane);
}
diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/VanChartTitleWithAutoBackground.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/VanChartTitleWithAutoBackground.java
index e126c5359..eb87f4363 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/VanChartTitleWithAutoBackground.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/VanChartTitleWithAutoBackground.java
@@ -14,8 +14,6 @@ public class VanChartTitleWithAutoBackground extends VanChartTitlePane {
}
protected VanChartBackgroundWithOutShadowWithRadiusPane createBackgroundPane() {
- //TODO Bjorn 地图标题背景自动逻辑
- //return new VanChartBackgroundWithOutShadowWithRadiusPane(true);
- return new VanChartBackgroundWithOutShadowWithRadiusPane();
+ return new VanChartBackgroundWithOutShadowWithRadiusPane(true);
}
}
diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java
index 9fb0c7e31..f945a1969 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java
@@ -20,7 +20,8 @@ import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.chart.PaneTitleConstants;
import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane;
-import com.fr.design.style.color.ColorSelectBox;
+import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPaneWithThemeStyle;
+import com.fr.design.mainframe.chart.gui.style.ColorSelectBoxWithThemeStyle;
import com.fr.design.utils.gui.UIComponentUtils;
import com.fr.design.widget.FRWidgetFactory;
import com.fr.plugin.chart.attr.axis.VanChartAxis;
@@ -85,9 +86,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane {
protected LineComboBox axisLineStyle;
- //TODO Bjorn 坐标轴面板回退
- protected ColorSelectBox axisLineColor;
- //protected ColorSelectBoxWithPreStyle axisLineColor;
+ protected ColorSelectBoxWithThemeStyle axisLineColor;
protected UIButtonGroup mainTick;
protected UIButtonGroup secondTick;
@@ -381,31 +380,16 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane {
}
protected ChartTextAttrPane getChartTextAttrPane() {
- //TODO Bjorn 坐标轴面板回退
- /* return new ChartTextAttrPaneWithPreStyle() {
+ return new ChartTextAttrPaneWithThemeStyle() {
protected double getEdithAreaWidth() {
return TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH;
}
- };*/
- return new ChartTextAttrPane() {
- @Override
- protected JPanel getContentPane(JPanel buttonPane) {
- double p = TableLayout.PREFERRED;
- double f = TableLayout.FILL;
- double e = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH;
- double[] columnSize = {f, e};
- double[] rowSize = {p, p, p};
-
- return TableLayout4VanChartHelper.createGapTableLayoutPane(getComponents(buttonPane), rowSize, columnSize);
- }
};
}
protected JPanel createLineStylePane(double[] row, double[] col) {
axisLineStyle = createLineComboBox();
- //TODO Bjorn 坐标轴面板回退
- //axisLineColor = new ColorSelectBoxWithPreStyle(100);
- axisLineColor = new ColorSelectBox(100);
+ axisLineColor = new ColorSelectBoxWithThemeStyle(100);
String[] strings = new String[]{Toolkit.i18nText("Fine-Design_Chart_Open"), Toolkit.i18nText("Fine-Design_Chart_Close")};
AxisTickLineType[] values = new AxisTickLineType[]{AxisTickLineType.TICK_LINE_OUTSIDE, AxisTickLineType.TICK_LINE_NONE};
mainTick = new UIButtonGroup(strings, values);
@@ -423,9 +407,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane {
return new Component[][]{
new Component[]{null, null},
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Type")), axisLineStyle},
- //TODO Bjorn 坐标轴面板回退
- //new Component[]{axisLineColor, null},
- new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Color")), axisLineColor},
+ new Component[]{axisLineColor, null},
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Main_Graduation_Line")), mainTick},
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Second_Graduation_Line")), secondTick},
};
@@ -735,9 +717,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane {
axisLineStyle.setSelectedLineStyle(axis.getAxisStyle());
}
if (axisLineColor != null) {
- axisLineColor.setSelectObject(axis.getAxisColor());
- //TODO Bjorn 坐标轴面板回退
- //axisLineColor.populate(axis.getLineColorWithPreStyle());
+ axisLineColor.populate(axis.getLineColorWithPreStyle());
}
if (mainTick != null) {
mainTick.setSelectedItem(axis.getMainTickLine());
@@ -880,9 +860,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane {
axis.setAxisStyle(axisLineStyle.getSelectedLineStyle());
}
if (axisLineColor != null) {
- axis.setAxisColor(axisLineColor.getSelectObject());
- //TODO Bjorn 坐标轴面板回退
- //axis.setLineColorWithPreStyle(axisLineColor.update());
+ axis.setLineColorWithPreStyle(axisLineColor.update());
}
if (mainTick != null) {
axis.setMainTickLine(mainTick.getSelectedItem());
diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/gauge/VanChartGaugeDetailAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/gauge/VanChartGaugeDetailAxisPane.java
index cd6c4fcf6..18fadeb98 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/gauge/VanChartGaugeDetailAxisPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/gauge/VanChartGaugeDetailAxisPane.java
@@ -8,6 +8,7 @@ import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.chart.PaneTitleConstants;
import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane;
import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPaneWithAuto;
+import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPaneWithThemeStyle;
import com.fr.design.style.color.ColorSelectBox;
import com.fr.plugin.chart.attr.axis.VanChartAxis;
import com.fr.plugin.chart.attr.axis.VanChartGaugeAxis;
@@ -102,9 +103,7 @@ public class VanChartGaugeDetailAxisPane extends VanChartValueAxisPane {
if (isMulti(gaugeStyle)) {
return new ChartTextAttrPaneWithAuto(FontAutoType.SIZE_AND_COLOR);
} else {
- return new ChartTextAttrPane();
- //TODO Bjorn 坐标轴面板回退
- //return new ChartTextAttrPaneWithPreStyle();
+ return new ChartTextAttrPaneWithThemeStyle();
}
}
diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/radar/VanChartRadarXAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/radar/VanChartRadarXAxisPane.java
index 309a7daa6..3558443c4 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/radar/VanChartRadarXAxisPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/radar/VanChartRadarXAxisPane.java
@@ -46,9 +46,7 @@ public class VanChartRadarXAxisPane extends VanChartBaseAxisPane {
return new Component[][]{
new Component[]{null,null} ,
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Type")), axisLineStyle},
- //TODO Bjorn 坐标轴面板回退
- //new Component[]{axisLineColor, null},
- new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Color")), axisLineColor},
+ new Component[]{axisLineColor, null},
};
}
diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/radar/VanChartRadarYAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/radar/VanChartRadarYAxisPane.java
index cf4ffb386..001567688 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/radar/VanChartRadarYAxisPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/radar/VanChartRadarYAxisPane.java
@@ -90,9 +90,7 @@ public class VanChartRadarYAxisPane extends VanChartValueAxisPane {
return new Component[][]{
new Component[]{null, null},
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Type")), axisLineStyle},
- //TODO Bjorn 坐标轴面板回退
- //new Component[]{axisLineColor, null},
- new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Color")), axisLineColor},
+ new Component[]{axisLineColor, null},
};
}
diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaBackgroundPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaBackgroundPane.java
index 19f5d4051..6f65af6e1 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaBackgroundPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaBackgroundPane.java
@@ -11,6 +11,7 @@ import com.fr.design.mainframe.chart.PaneTitleConstants;
import com.fr.van.chart.designer.AbstractVanChartScrollPane;
import com.fr.van.chart.designer.TableLayout4VanChartHelper;
import com.fr.van.chart.designer.component.background.VanChartBackgroundPane;
+import com.fr.van.chart.designer.component.background.VanChartBackgroundPaneWithThemeStyle;
import com.fr.van.chart.designer.component.border.VanChartBorderWithRadiusPane;
import com.fr.van.chart.designer.style.background.radar.VanChartRadarAxisAreaPane;
@@ -45,13 +46,11 @@ public class VanChartAreaBackgroundPane extends AbstractVanChartScrollPane {
private LineTypeComboBox horizonLineType;
private LineTypeComboBox verticalLineType;
- private ColorSelectBox horizontalColorBox;
- private ColorSelectBox verticalColorBox;
- //TODO Bjorn 背景坐标轴面板回退
- /* private ColorSelectBoxWithPreStyle horizontalColorBox;
- private ColorSelectBoxWithPreStyle verticalColorBox;*/
+ private ColorSelectBoxWithThemeStyle horizontalColorBox;
+ private ColorSelectBoxWithThemeStyle verticalColorBox;
private JPanel horizontalColorPane;
private JPanel verticalColorPane;
@@ -56,11 +54,8 @@ public class VanChartAxisAreaPane extends BasicBeanPane {
}
private void initComponents() {
- horizontalColorBox = new ColorSelectBox(PREFERRED_WIDTH);
- verticalColorBox = new ColorSelectBox(PREFERRED_WIDTH);
- //TODO Bjorn 背景坐标轴面板回退
- /* horizontalColorBox = new ColorSelectBoxWithPreStyle(PREFERRED_WIDTH);
- verticalColorBox = new ColorSelectBoxWithPreStyle(PREFERRED_WIDTH);*/
+ horizontalColorBox = new ColorSelectBoxWithThemeStyle(PREFERRED_WIDTH);
+ verticalColorBox = new ColorSelectBoxWithThemeStyle(PREFERRED_WIDTH);
horizonLineType = new LineTypeComboBox(new LineType[]{LineType.NONE, LineType.SOLID, LineType.DASHED});
verticalLineType = new LineTypeComboBox(new LineType[]{LineType.NONE, LineType.SOLID, LineType.DASHED});
@@ -93,18 +88,15 @@ public class VanChartAxisAreaPane extends BasicBeanPane {
}
protected void initGridLineComponents() {
- //TODO Bjorn 背景坐标轴面板回退
Component[][] upComponent = new Component[][]{
new Component[]{null, null},
- new Component[]{null, horizontalColorBox}
- //new Component[]{horizontalColorBox, null}
+ new Component[]{horizontalColorBox, null}
};
horizontalColorPane = TableLayout4VanChartHelper.createGapTableLayoutPane(upComponent);
Component[][] downComponent = new Component[][]{
new Component[]{null, null},
- new Component[]{null, verticalColorBox}
- //new Component[]{verticalColorBox, null}
+ new Component[]{verticalColorBox, null}
};
verticalColorPane = TableLayout4VanChartHelper.createGapTableLayoutPane(downComponent);
@@ -228,16 +220,13 @@ public class VanChartAxisAreaPane extends BasicBeanPane {
VanChartAxis defaultXAxis = rectanglePlot.getDefaultXAxis();
VanChartAxis defaultYAxis = rectanglePlot.getDefaultYAxis();
- //TODO Bjorn 背景坐标轴面板回退
if (defaultXAxis != null) {
- //verticalColorBox.populate(defaultXAxis.getMainGridColorWithPreStyle());
- verticalColorBox.setSelectObject(defaultXAxis.getMainGridColor());
+ verticalColorBox.populate(defaultXAxis.getMainGridColorWithPreStyle());
verticalLineType.setSelectedItem(defaultXAxis.getGridLineType());
}
if (defaultYAxis != null) {
- //horizontalColorBox.populate(defaultYAxis.getMainGridColorWithPreStyle());
- horizontalColorBox.setSelectObject(defaultYAxis.getMainGridColor());
+ horizontalColorBox.populate(defaultYAxis.getMainGridColorWithPreStyle());
horizonLineType.setSelectedItem(defaultYAxis.getGridLineType());
}
}
@@ -264,16 +253,13 @@ public class VanChartAxisAreaPane extends BasicBeanPane {
VanChartAxis defaultXAxis = rectanglePlot.getDefaultXAxis();
VanChartAxis defaultYAxis = rectanglePlot.getDefaultYAxis();
- //TODO Bjorn 背景坐标轴面板回退
if (defaultXAxis != null) {
- //defaultXAxis.setMainGridColorWithPreStyle(verticalColorBox.update());
- defaultXAxis.setMainGridColor(verticalColorBox.getSelectObject());
+ defaultXAxis.setMainGridColorWithPreStyle(verticalColorBox.update());
defaultXAxis.setGridLineType((LineType) verticalLineType.getSelectedItem());
}
if (defaultYAxis != null) {
- //defaultYAxis.setMainGridColorWithPreStyle(horizontalColorBox.update());
- defaultYAxis.setMainGridColor(horizontalColorBox.getSelectObject());
+ defaultYAxis.setMainGridColorWithPreStyle(horizontalColorBox.update());
defaultYAxis.setGridLineType((LineType) horizonLineType.getSelectedItem());
}
}
diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/datasheet/VanChartDataSheetPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/datasheet/VanChartDataSheetPane.java
index d6fa66bfb..83b65d01e 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/datasheet/VanChartDataSheetPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/datasheet/VanChartDataSheetPane.java
@@ -10,6 +10,7 @@ import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.chart.PaneTitleConstants;
import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane;
+import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPaneWithThemeStyle;
import com.fr.design.mainframe.chart.info.ChartInfoCollector;
import com.fr.general.ComparatorUtils;
import com.fr.plugin.chart.VanChartAttrHelper;
@@ -19,6 +20,7 @@ import com.fr.plugin.chart.type.AxisType;
import com.fr.van.chart.designer.AbstractVanChartScrollPane;
import com.fr.van.chart.designer.TableLayout4VanChartHelper;
import com.fr.van.chart.designer.component.border.VanChartBorderPane;
+import com.fr.van.chart.designer.component.border.VanChartBorderPaneWithPreStyle;
import com.fr.van.chart.designer.component.format.FormatPaneWithNormalType;
import javax.swing.JPanel;
@@ -103,15 +105,12 @@ public class VanChartDataSheetPane extends AbstractVanChartScrollPane {
return TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize);
}
- //TODO Bjorn 数据表面板回退
protected VanChartBorderPane createBorderPanePane() {
- return new VanChartBorderPane();
- //return new VanChartBorderPaneWithPreStyle();
+ return new VanChartBorderPaneWithPreStyle();
}
protected ChartTextAttrPane createChartTextAttrPane() {
- return new ChartTextAttrPane();
- //return new ChartTextAttrPaneWithPreStyle();
+ return new ChartTextAttrPaneWithThemeStyle();
}
@Override
diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeCateOrPercentLabelDetailPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeCateOrPercentLabelDetailPane.java
index 3d6ad86e8..d8c321738 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeCateOrPercentLabelDetailPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeCateOrPercentLabelDetailPane.java
@@ -49,11 +49,6 @@ public class VanChartGaugeCateOrPercentLabelDetailPane extends VanChartGaugeLabe
return getGaugeStyle() == GaugeStyle.RING || getGaugeStyle() == GaugeStyle.SLOT;
}
- //TODO Bjorn 仪表盘自动逻辑
- protected boolean isFontColorAuto() {
- return getGaugeStyle() == GaugeStyle.RING || getGaugeStyle() == GaugeStyle.SLOT;
- }
-
protected boolean hasLabelPosition(Plot plot) {
switch (getGaugeStyle()) {
case RING:
diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeLabelDetailPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeLabelDetailPane.java
index 8c672bab6..0f9e84729 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeLabelDetailPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeLabelDetailPane.java
@@ -79,10 +79,8 @@ public class VanChartGaugeLabelDetailPane extends VanChartPlotLabelDetailPane {
return false;
}
- //TODO Bjorn 仪表盘自动逻辑
protected boolean isFontColorAuto() {
- return false;
- //return true;
+ return true;
}
private FontAutoType getFontAutoType() {
diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java
index 849507e05..0a5f7b8fe 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java
@@ -271,9 +271,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP
}
protected VanChartBorderPane createDiffBorderPane() {
- return new VanChartBorderPane();
- //TODO Bjorn 边框自动回退
- //return new VanChartBorderPane(true);
+ return new VanChartBorderPane(true);
}
diff --git a/designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/other/VanChartDrillMapInteractivePane.java b/designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/other/VanChartDrillMapInteractivePane.java
index c439c4d4d..80962fd86 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/other/VanChartDrillMapInteractivePane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/other/VanChartDrillMapInteractivePane.java
@@ -6,6 +6,7 @@ import com.fr.design.gui.ibutton.UIButtonGroup;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
+import com.fr.design.mainframe.backgroundpane.ColorBackgroundQuickPane;
import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane;
import com.fr.design.mainframe.chart.mode.ChartEditContext;
import com.fr.plugin.chart.attr.plot.VanChartPlot;
@@ -81,15 +82,13 @@ public class VanChartDrillMapInteractivePane extends VanChartInteractivePaneWith
}
};
- //TODO Bjorn 钻取地图钻取目录背景自动逻辑
- /*backgroundPane = new VanChartBackgroundPaneWithOutImageAndShadow(true) {
+ backgroundPane = new VanChartBackgroundPaneWithOutImageAndShadow(true) {
@Override
protected void initList() {
paneList.add(new ColorBackgroundQuickPane());
}
- };*/
+ };
- backgroundPane = new VanChartBackgroundPaneWithOutImageAndShadow();
selectBackgroundPane = new VanChartBackgroundPaneWithOutImageAndShadow() {
protected String labelName() {
return Toolkit.i18nText("Fine-Design_Chart_Select_Color");
diff --git a/designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugeSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugeSeriesPane.java
index d3f997295..49e4391b5 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugeSeriesPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugeSeriesPane.java
@@ -78,8 +78,7 @@ public class VanChartGaugeSeriesPane extends VanChartMultiColorSeriesPane {
double f = TableLayout.FILL;
double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH;
double[] columnSize = {f};
- //TODO Bjorn
- double[] rowSize = {p, p, p, p, p, p, p};
+ double[] rowSize = {p, p, p, p, p, p, p, p, p, p};
Component[][] components = new Component[][]{
new Component[]{createGaugeLayoutPane()},
new Component[]{createGaugeStylePane(rowSize, new double[]{f, e})},
@@ -225,14 +224,12 @@ public class VanChartGaugeSeriesPane extends VanChartMultiColorSeriesPane {
private Component[][] getDiffComponentsWithGaugeStyle() {
GaugeStyle style = getGaugeStyle();
switch (style) {
- //TODO Bjorn 仪表盘样式自动逻辑
case RING:
initRotate();
return new Component[][]{
new Component[]{null, null},
- getPaneBackgroundColor(),
- /* getPaneBackgroundColorAuto(),
- new Component[]{null, paneBackgroundColor},*/
+ getPaneBackgroundColorAuto(),
+ new Component[]{null, paneBackgroundColor},
getInnerPaneBackgroundColor(),
new Component[]{createRadiusPane(Toolkit.i18nText("Fine-Design_Chart_Radius_Set")), null},
getChutePercent()
@@ -241,9 +238,8 @@ public class VanChartGaugeSeriesPane extends VanChartMultiColorSeriesPane {
return new Component[][]{
new Component[]{null, null},
getNeedleColor(),
- getSlotBackgroundColor(),
- /* getSlotBackgroundColorAuto(),
- new Component[]{null, slotBackgroundColor},*/
+ getSlotBackgroundColorAuto(),
+ new Component[]{null, slotBackgroundColor},
new Component[]{createRadiusPane(Toolkit.i18nText("Fine-Design_Chart_Radius_Set")), null},
getChutePercent()
};
@@ -251,33 +247,25 @@ public class VanChartGaugeSeriesPane extends VanChartMultiColorSeriesPane {
return new Component[][]{
new Component[]{null, null},
getNeedleColor(),
- getSlotBackgroundColor(),
- /*getSlotBackgroundColorAuto(),
- new Component[]{null, slotBackgroundColor},*/
+ getSlotBackgroundColorAuto(),
+ new Component[]{null, slotBackgroundColor},
new Component[]{createRadiusPane(Toolkit.i18nText("Fine-Design_Chart_Length_Set")), null},
getThermometerWidth()
};
default:
return new Component[][]{
new Component[]{null, null},
- getHingeColor(),
- /* getHingeColorAuto(),
- new Component[]{null, hingeColor},*/
+ getHingeColorAuto(),
+ new Component[]{null, hingeColor},
getHingeBackgroundColor(),
getNeedleColor(),
- getPaneBackgroundColor(),
- /* getPaneBackgroundColorAuto(),
- new Component[]{null, paneBackgroundColor},*/
+ getPaneBackgroundColorAuto(),
+ new Component[]{null, paneBackgroundColor},
new Component[]{createRadiusPane(Toolkit.i18nText("Fine-Design_Chart_Radius_Set")), null}
};
}
}
- private Component[] getHingeColor() {
- hingeColor = new ColorSelectBox(120);
- return new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Hinge")), hingeColor};
- }
-
private Component[] getHingeColorAuto() {
hingeColor = new ColorSelectBox(120);
hingeColorAuto = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_Auto"),
diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/VanChartMapSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/VanChartMapSeriesPane.java
index a2adff77a..073002642 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/map/VanChartMapSeriesPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/map/VanChartMapSeriesPane.java
@@ -337,9 +337,7 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
}
protected JPanel createAreaPane() {
- //TODO Bjorn 地图背景自动
- //borderWithAlphaPane = new VanChartBorderWithAlphaPane(true);
- borderWithAlphaPane = new VanChartBorderWithAlphaPane();
+ borderWithAlphaPane = new VanChartBorderWithAlphaPane(true);
double p = TableLayout.PREFERRED;
double f = TableLayout.FILL;
@@ -355,8 +353,7 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
}
protected JPanel createNullValueColorPane() {
- //TODO Bjorn 地图空值背景自动
- /* nullValueAuto = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_Auto"),
+ nullValueAuto = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_Auto"),
Toolkit.i18nText("Fine-Design_Chart_Custom")});
initNullValueListener();
nullValueColorBox = new ColorSelectBox(80);
@@ -373,10 +370,7 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
new Component[]{text, nullValueAuto},
new Component[]{null, nullValueColorBox},
};
- return TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize);*/
-
- nullValueColorBox = new ColorSelectBox(80);
- return TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_NULL_Value_Color"), nullValueColorBox);
+ return TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize);
}
@@ -593,15 +587,13 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
markerTypeCom.setSelectedItem(mapPlot.getMapMarkerType().toLocalString());
}
if (nullValueColorBox != null) {
- //TODO Bjorn 地图空值背景自动
- /* if (((VanChartMapPlot) plot).isAutoNullValue()) {
+ if (((VanChartMapPlot) plot).isAutoNullValue()) {
nullValueAuto.setSelectedIndex(0);
} else {
nullValueAuto.setSelectedIndex(1);
}
nullValueColorBox.setSelectObject(((VanChartMapPlot) plot).getNullValueColor());
- checkNullValueButton();*/
- nullValueColorBox.setSelectObject(mapPlot.getNullValueColor());
+ checkNullValueButton();
}
//大数据模式 恢复用注释。下面3行删除。
if (lineMapLargeDataModelGroup != null) {
@@ -623,8 +615,7 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane {
}
}
if (nullValueColorBox != null) {
- //TODO Bjorn 地图空值背景自动
- //((VanChartMapPlot) plot).setAutoNullValue(nullValueAuto.getSelectedIndex() == 0);
+ ((VanChartMapPlot) plot).setAutoNullValue(nullValueAuto.getSelectedIndex() == 0);
mapPlot.setNullValueColor(nullValueColorBox.getSelectObject());
}
//大数据模式 恢复用注释。下面3行删除。
diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/GisLayerPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/GisLayerPane.java
index 4a43d7619..580144ce5 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/GisLayerPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/GisLayerPane.java
@@ -73,12 +73,17 @@ public class GisLayerPane extends JPanel implements UIObserver {
}
private boolean isStandardGis() {
+ return gisButton.getSelectedIndex() == 1;
+ }
+
+ private boolean isAuto() {
return gisButton.getSelectedIndex() == 0;
}
private JPanel createGISLayerPane() {
- gisButton = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Form_Widget_Style_Standard"), Toolkit.i18nText("Fine-Design_Chart_Custom")});
+ gisButton = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Mode_Auto"),
+ Toolkit.i18nText("Fine-Design_Form_Widget_Style_Standard"), Toolkit.i18nText("Fine-Design_Chart_Custom")});
gisButton.setSelectedIndex(0);
gisGaoDeLayer = new UIComboBox(MapLayerConfigManager.getGaoDeLayerItems());
gisButton.addActionListener(event -> {
@@ -94,6 +99,9 @@ public class GisLayerPane extends JPanel implements UIObserver {
layerPaneCheckPane = new JPanel(new CardLayout()) {
@Override
public Dimension getPreferredSize() {
+ if (isAuto()) {
+ return new Dimension(0, 0);
+ }
if (isStandardGis()) {
return gisGaoDeLayer.getPreferredSize();
} else {
@@ -101,6 +109,7 @@ public class GisLayerPane extends JPanel implements UIObserver {
}
}
};
+ layerPaneCheckPane.add(new JPanel(), "auto");
layerPaneCheckPane.add(gisGaoDeLayer, "standard");
layerPaneCheckPane.add(gisLayer, "custom");
@@ -129,7 +138,7 @@ public class GisLayerPane extends JPanel implements UIObserver {
layerCardPane = new JPanel(new CardLayout()) {
@Override
public Dimension getPreferredSize() {
- if (isStandardGis()) {
+ if (isStandardGis() || isAuto()) {
return new Dimension(0, 0);
}
String itemName = Utils.objectToString(gisLayer.getSelectedItem());
@@ -188,7 +197,9 @@ public class GisLayerPane extends JPanel implements UIObserver {
private void refreshZoomLevel() {
//gis图层不同,对应的缩放等级不同。
ZoomLevel[] levels;
- if (isStandardGis()) {
+ if (isAuto()) {
+ levels = MapStatusPane.ZOOM_LEVELS;
+ } else if (isStandardGis()) {
if (gisGaoDeLayer.getSelectedIndex() == gisGaoDeLayer.getItemCount() - 1) {
levels = MapStatusPane.ZOOM_LEVELS;
} else {
@@ -209,7 +220,14 @@ public class GisLayerPane extends JPanel implements UIObserver {
private void checkLayerCardPane() {
CardLayout cardLayout = (CardLayout) layerPaneCheckPane.getLayout();
- cardLayout.show(layerPaneCheckPane, isStandardGis() ? "standard" : "custom");
+ if (isAuto()) {
+ cardLayout.show(layerPaneCheckPane, "auto");
+ } else if (isStandardGis()) {
+ cardLayout.show(layerPaneCheckPane, "standard");
+ } else {
+ cardLayout.show(layerPaneCheckPane, "custom");
+ }
+
}
private void checkCustomLayerCardPane() {
@@ -218,10 +236,6 @@ public class GisLayerPane extends JPanel implements UIObserver {
}
public void resetGisLayer(VanChartMapPlot mapPlot) {
- //TODO Bjorn 地图gis图层自动逻辑
- /* mapPlot.getGisLayer().setGisLayerType(GISLayerType.AUTO);
- mapPlot.getGisLayer().setLayerName(GISLayerType.getLocString(GISLayerType.AUTO));*/
-
GisLayer defaultGisLayer = mapPlot.getDefaultGisLayer();
mapPlot.setGisLayer(defaultGisLayer);
populate(defaultGisLayer);
@@ -229,6 +243,9 @@ public class GisLayerPane extends JPanel implements UIObserver {
public void populate(GisLayer layer) {
switch (layer.getGisLayerType()) {
+ case AUTO:
+ gisButton.setSelectedIndex(0);
+ break;
case GAO_DE_API:
case LAYER_NULL:
populateStandardGis(layer);
@@ -243,7 +260,7 @@ public class GisLayerPane extends JPanel implements UIObserver {
}
private void populateStandardGis(GisLayer layer) {
- gisButton.setSelectedIndex(0);
+ gisButton.setSelectedIndex(1);
if (layer.getGisLayerType() == GISLayerType.LAYER_NULL) {
gisGaoDeLayer.setSelectedIndex(gisGaoDeLayer.getItemCount() - 1);
} else {
@@ -252,7 +269,7 @@ public class GisLayerPane extends JPanel implements UIObserver {
}
private void populateCustomGis(GisLayer layer) {
- gisButton.setSelectedIndex(1);
+ gisButton.setSelectedIndex(2);
gisLayer.setSelectedItem(layer.getShowItemName());
switch (layer.getGisLayerType()) {
@@ -266,7 +283,10 @@ public class GisLayerPane extends JPanel implements UIObserver {
}
public void update(GisLayer layer) {
- if (isStandardGis()) {
+ if (isAuto()) {
+ layer.setGisLayerType(GISLayerType.AUTO);
+ layer.setLayerName(GISLayerType.getLocString(GISLayerType.AUTO));
+ } else if (isStandardGis()) {
updateStandardGis(layer);
} else {
updateCustomGis(layer);
diff --git a/designer-chart/src/main/java/com/fr/van/chart/range/component/LegendGradientBar.java b/designer-chart/src/main/java/com/fr/van/chart/range/component/LegendGradientBar.java
index 8401f86a9..6096056a4 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/range/component/LegendGradientBar.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/range/component/LegendGradientBar.java
@@ -274,7 +274,8 @@ public class LegendGradientBar extends JComponent implements ColorSelectable, UI
private void dealClick(SelectColorPointBtn selectColorPointBtn) {
ColorSelectDetailPane pane = new ColorSelectDetailPane(Color.WHITE);
this.setColor(selectColorPointBtn.getColorInner());
- ColorSelectDialog.showDialog(DesignerContext.getDesignerFrame(), pane, Color.WHITE, LegendGradientBar.this);
+ Color selectColor = selectColorPointBtn.getColorInner() == null ? Color.WHITE : selectColorPointBtn.getColorInner();
+ ColorSelectDialog.showDialog(DesignerContext.getDesignerFrame(), pane, selectColor, LegendGradientBar.this);
Color color = this.getColor();
if (color != null) {
DesignerEnvManager.getEnvManager().getColorConfigManager().addToColorQueue(color);
diff --git a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterLabelContentPane.java
index 9c79f9b8c..364b3d1fe 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterLabelContentPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterLabelContentPane.java
@@ -1,10 +1,13 @@
package com.fr.van.chart.scatter;
+import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPaneWithThemeStyle;
+import com.fr.plugin.chart.base.AttrTooltipContent;
import com.fr.van.chart.designer.component.VanChartHtmlLabelPane;
import com.fr.van.chart.designer.component.VanChartHtmlLabelPaneWithBackGroundLabel;
import com.fr.van.chart.designer.style.VanChartStylePane;
import javax.swing.JPanel;
+import java.awt.BorderLayout;
/**
* 散点图标签界面
@@ -21,12 +24,11 @@ public class VanChartScatterLabelContentPane extends VanChartScatterTooltipCont
return new VanChartHtmlLabelPaneWithBackGroundLabel();
}
- //TODO Bjorn 散点图标签预定义样式
- /* public JPanel createCommonStylePane() {
+ public JPanel createCommonStylePane() {
if (isInCondition()) {
return super.createCommonStylePane();
}
- setTextAttrPane(new ChartTextAttrPaneWithPreStyle());
+ setTextAttrPane(new ChartTextAttrPaneWithThemeStyle());
JPanel stylePanel = new JPanel(new BorderLayout());
stylePanel.add(getTextAttrPane(), BorderLayout.CENTER);
@@ -41,9 +43,9 @@ public class VanChartScatterLabelContentPane extends VanChartScatterTooltipCont
}
if (hasTextStylePane()) {
this.getTextAttrPane().update(attrTooltipContent.getTextAttr());
- if (!attrTooltipContent.getTextAttr().isPredefinedStyle()) {
+ if (!attrTooltipContent.getTextAttr().isThemed()) {
attrTooltipContent.setCustom(true);
}
}
- }*/
+ }
}
diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/actions/CopyAction.java b/designer-form/src/main/java/com/fr/design/designer/beans/actions/CopyAction.java
index c577a8693..b71def807 100644
--- a/designer-form/src/main/java/com/fr/design/designer/beans/actions/CopyAction.java
+++ b/designer-form/src/main/java/com/fr/design/designer/beans/actions/CopyAction.java
@@ -1,8 +1,7 @@
package com.fr.design.designer.beans.actions;
-
import com.fr.design.base.mode.DesignModeContext;
-import com.fr.design.designer.beans.actions.behavior.ComponentEnable;
+import com.fr.design.designer.beans.actions.behavior.CopyableEnable;
import com.fr.design.mainframe.FormDesigner;
import javax.swing.KeyStroke;
@@ -18,7 +17,7 @@ public class CopyAction extends FormWidgetEditAction {
this.setMnemonic('C');
this.setSmallIcon("/com/fr/design/images/m_edit/copy");
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, DEFAULT_MODIFIER));
- setUpdateBehavior(new ComponentEnable());
+ setUpdateBehavior(new CopyableEnable());
this.setEnabled(!DesignModeContext.isBanCopyAndCut());
}
diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/actions/CutAction.java b/designer-form/src/main/java/com/fr/design/designer/beans/actions/CutAction.java
index e93eebd72..94c84a87d 100644
--- a/designer-form/src/main/java/com/fr/design/designer/beans/actions/CutAction.java
+++ b/designer-form/src/main/java/com/fr/design/designer/beans/actions/CutAction.java
@@ -3,6 +3,7 @@ package com.fr.design.designer.beans.actions;
import com.fr.design.base.mode.DesignModeContext;
import com.fr.design.designer.beans.actions.behavior.ComponentEnable;
+import com.fr.design.designer.beans.actions.behavior.CutableEnable;
import com.fr.design.mainframe.FormDesigner;
import javax.swing.KeyStroke;
@@ -18,7 +19,7 @@ public class CutAction extends FormWidgetEditAction {
this.setMnemonic('T');
this.setSmallIcon("/com/fr/design/images/m_edit/cut");
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, DEFAULT_MODIFIER));
- this.setUpdateBehavior(new ComponentEnable());
+ this.setUpdateBehavior(new CutableEnable());
this.setEnabled(!DesignModeContext.isBanCopyAndCut());
}
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 5f9a59de5..c2fec8f39 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
@@ -7,9 +7,7 @@ import java.awt.event.KeyEvent;
import javax.swing.*;
-
-import com.fr.design.designer.beans.actions.behavior.ComponentEnable;
-
+import com.fr.design.designer.beans.actions.behavior.DeletableEnable;
import com.fr.design.mainframe.FormDesigner;
/**
@@ -26,7 +24,7 @@ public class FormDeleteAction extends FormWidgetEditAction {
// Richie:删除菜单图标
this.setSmallIcon("/com/fr/design/images/m_report/delete");
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0));
- this.setUpdateBehavior(new ComponentEnable());
+ this.setUpdateBehavior(new DeletableEnable());
}
@Override
diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/actions/behavior/CopyableEnable.java b/designer-form/src/main/java/com/fr/design/designer/beans/actions/behavior/CopyableEnable.java
new file mode 100644
index 000000000..ce3254ea8
--- /dev/null
+++ b/designer-form/src/main/java/com/fr/design/designer/beans/actions/behavior/CopyableEnable.java
@@ -0,0 +1,16 @@
+package com.fr.design.designer.beans.actions.behavior;
+
+import com.fr.design.designer.beans.actions.FormWidgetEditAction;
+import com.fr.design.mainframe.FormDesigner;
+
+public class CopyableEnable implements UpdateBehavior {
+ @Override
+ public void doUpdate(FormWidgetEditAction action) {
+ FormDesigner designer = action.getEditingComponent();
+ if (designer == null) {
+ action.setEnabled(false);
+ return;
+ }
+ action.setEnabled(designer.isCurrentComponentCopyable());
+ }
+}
diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/actions/behavior/CutableEnable.java b/designer-form/src/main/java/com/fr/design/designer/beans/actions/behavior/CutableEnable.java
new file mode 100644
index 000000000..7a6320227
--- /dev/null
+++ b/designer-form/src/main/java/com/fr/design/designer/beans/actions/behavior/CutableEnable.java
@@ -0,0 +1,16 @@
+package com.fr.design.designer.beans.actions.behavior;
+
+import com.fr.design.designer.beans.actions.FormWidgetEditAction;
+import com.fr.design.mainframe.FormDesigner;
+
+public class CutableEnable implements UpdateBehavior {
+ @Override
+ public void doUpdate(FormWidgetEditAction action) {
+ FormDesigner designer = action.getEditingComponent();
+ if (designer == null) {
+ action.setEnabled(false);
+ return;
+ }
+ action.setEnabled(designer.isCurrentComponentCutable());
+ }
+}
diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/actions/behavior/DeletableEnable.java b/designer-form/src/main/java/com/fr/design/designer/beans/actions/behavior/DeletableEnable.java
new file mode 100644
index 000000000..669582676
--- /dev/null
+++ b/designer-form/src/main/java/com/fr/design/designer/beans/actions/behavior/DeletableEnable.java
@@ -0,0 +1,16 @@
+package com.fr.design.designer.beans.actions.behavior;
+
+import com.fr.design.designer.beans.actions.FormWidgetEditAction;
+import com.fr.design.mainframe.FormDesigner;
+
+public class DeletableEnable implements UpdateBehavior {
+ @Override
+ public void doUpdate(FormWidgetEditAction action) {
+ FormDesigner designer = action.getEditingComponent();
+ if (designer == null) {
+ action.setEnabled(false);
+ return;
+ }
+ action.setEnabled(designer.isCurrentComponentDeletable());
+ }
+}
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 485c73b16..395647db3 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
@@ -42,6 +42,9 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{
public XBorderStyleWidgetCreator(Widget widget, Dimension initSize) {
super(widget, initSize);
+ setOpaque(false);
+ setBackupBound(null);
+
ExtendSharableAttrMark sharableAttrMark = this.toData().getWidgetAttrMark(ExtendSharableAttrMark.XML_TAG);
if (sharableAttrMark != null) {
this.setShareId(sharableAttrMark.getShareId());
@@ -263,6 +266,11 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{
}
+ @Override
+ public void setBackground(Color bg) {
+ super.setBackground(bg);
+ }
+
// 根据当前组件边框裁剪内容,如果当前组件存在圆角,则应当按圆角裁剪内容
private void clipByRoundedBorder(Graphics2D g2d) {
Border currentBorder = getBorder();
diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java b/designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java
index ed90a1c54..c3e29e123 100644
--- a/designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java
+++ b/designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java
@@ -23,6 +23,7 @@ import com.fr.design.mainframe.EditingMouseListener;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.NoSupportAuthorityEdit;
import com.fr.design.mainframe.WidgetPropertyPane;
+import com.fr.design.mainframe.loghandler.LogMessageBar;
import com.fr.design.plugin.DesignerPluginContext;
import com.fr.design.utils.gui.LayoutUtils;
import com.fr.form.ui.Widget;
@@ -33,6 +34,7 @@ import com.fr.stable.StringUtils;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
+import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
@@ -776,6 +778,10 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
if (popup == null) {
popup = new SelectedPopupDialog(this, designer);
}
+ JFrame frame = LogMessageBar.getInstance().getLogFrame();
+ if (frame!= null && frame.isActive()) {
+ return;
+ }
int creatorRightX = (int) ((bounds.x + bounds.width + SelectedPopupDialog.OFFSET_X) * designer.getScale());
int creatorRightY = (int) (bounds.y * designer.getScale());
int formDesignerWidth = designer.getWidth();
@@ -783,6 +789,12 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
// 不超过可绘制区域
int extraX = Math.min(creatorRightX, formDesignerWidth);
int extraY = creatorRightY < 0 ? 0 : Math.min(creatorRightY, formDesignerHeight);
+
+ if (designer.isFormParaDesigner() && extraY + this.getHeight() >= formDesignerHeight) {
+ popup.setVisible(false);
+ return;
+ }
+
// 放到事件尾部执行
SwingUtilities.invokeLater(new Runnable() {
@Override
diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWParameterLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWParameterLayout.java
index 1d37024d9..fc01aefaa 100644
--- a/designer-form/src/main/java/com/fr/design/designer/creator/XWParameterLayout.java
+++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWParameterLayout.java
@@ -103,6 +103,11 @@ public class XWParameterLayout extends XWAbsoluteLayout {
return false;
}
+ @Override
+ public boolean canEnterIntoAbsolutePane() {
+ return false;
+ }
+
/**
* 该组件是否可以拖拽(表单中参数面板和自适应布局不可以拖拽)
* @return 是则返回true
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 71129bed4..1628b6cdd 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
@@ -76,7 +76,7 @@ public class XWTitleLayout extends DedicateLayoutContainer {
// 初始化后(如打开旧模版),需要重新调整组件/标题/边框的显示效果
XCreator xCreator = getBodyCreator();
if (xCreator instanceof XBorderStyleWidgetCreator) {
- ((XBorderStyleWidgetCreator) xCreator).reshuffleBorderAndBackgroundPaintingEffectIfTitleExists();
+ ((XBorderStyleWidgetCreator) xCreator).initStyle();
}
}
@@ -219,17 +219,26 @@ public class XWTitleLayout extends DedicateLayoutContainer {
public void convert() {
isRefreshing = true;
WTitleLayout layout = this.toData();
+ XBorderStyleWidgetCreator bodyCreator = null;
this.removeAll();
for (int i = 0, num = layout.getWidgetCount(); i < num; i++) {
BoundsWidget bw = (BoundsWidget) layout.getWidget(i);
if (bw != null) {
Rectangle bounds = bw.getBounds();
XWidgetCreator comp = (XWidgetCreator) XCreatorUtils.createXCreator(bw.getWidget());
- String constraint = bw.getWidget().acceptType(Label.class) ? WTitleLayout.TITLE : WTitleLayout.BODY;
+ boolean isTitleWidget = bw.getWidget().acceptType(Label.class);
+ String constraint = isTitleWidget ? WTitleLayout.TITLE : WTitleLayout.BODY;
this.add(comp, constraint);
comp.setBounds(bounds);
+ if (!isTitleWidget && comp instanceof XBorderStyleWidgetCreator) {
+ bodyCreator = (XBorderStyleWidgetCreator) comp;
+ }
}
}
+ // 刷新时重置下样式
+ if (bodyCreator != null) {
+ bodyCreator.initStyle();
+ }
isRefreshing = false;
}
diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java
index 4fb422c0a..1d564ec6c 100644
--- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java
+++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java
@@ -406,15 +406,10 @@ public class XWCardLayout extends XLayoutContainer {
private void initBorderTitleStyle(BorderPacker style) {
//初始化默认标题样式
- if (!initFlag) {
- return;
- }
-
style.setType(LayoutBorderStyle.TITLE);
style.setBorder(Constants.LINE_THIN);
TitlePacker widgetTitle = style.getTitle();
widgetTitle.setBackground(ColorBackground.getInstance(TITLE_COLOR));
- initFlag = false;
}
//隐藏或显示标题部分
diff --git a/designer-form/src/main/java/com/fr/design/fit/JFormType.java b/designer-form/src/main/java/com/fr/design/fit/JFormType.java
index 7fe795c6f..f2d1c4ad9 100644
--- a/designer-form/src/main/java/com/fr/design/fit/JFormType.java
+++ b/designer-form/src/main/java/com/fr/design/fit/JFormType.java
@@ -69,12 +69,12 @@ public enum JFormType {
};
private int type;
private boolean newType;
- private PreviewProvider previewType;
+ private PreviewProvider defaultPreviewType;
- JFormType(int type, PreviewProvider previewType) {
+ JFormType(int type, PreviewProvider defaultPreviewType) {
this.type = type;
this.newType = (type == 1);
- this.previewType = previewType;
+ this.defaultPreviewType = defaultPreviewType;
}
public int getType() {
@@ -85,8 +85,8 @@ public enum JFormType {
return newType;
}
- public PreviewProvider getPreviewType() {
- return previewType;
+ public PreviewProvider getDefaultPreviewType() {
+ return defaultPreviewType;
}
public abstract void switchUI();
@@ -128,6 +128,14 @@ public enum JFormType {
* @date: 2020/12/17 16:17
*/
public void updatePreviewType(JTemplate jTemplate) {
- jTemplate.setPreviewType(this.getPreviewType());
+ if (jTemplate.getPreviewType() != null) {
+ PreviewProvider[] previewProviders = jTemplate.supportPreview();
+ for (PreviewProvider previewProvider : previewProviders) {
+ if (previewProvider.getClass() == jTemplate.getPreviewType().getClass()) {
+ return;
+ }
+ }
+ }
+ jTemplate.setPreviewType(this.getDefaultPreviewType());
}
}
diff --git a/designer-form/src/main/java/com/fr/design/fit/attrpane/ElementEditorExtendDefinePane.java b/designer-form/src/main/java/com/fr/design/fit/attrpane/ElementEditorExtendDefinePane.java
index 3d25590f4..20351165e 100644
--- a/designer-form/src/main/java/com/fr/design/fit/attrpane/ElementEditorExtendDefinePane.java
+++ b/designer-form/src/main/java/com/fr/design/fit/attrpane/ElementEditorExtendDefinePane.java
@@ -1,17 +1,23 @@
package com.fr.design.fit.attrpane;
+import com.fr.base.theme.FormTheme;
+import com.fr.base.theme.TemplateTheme;
+import com.fr.base.theme.settings.ThemedComponentStyle;
import com.fr.design.designer.IntervalConstants;
import com.fr.design.designer.creator.CRPropertyDescriptor;
import com.fr.design.designer.creator.PropertyGroupPane;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XElementCase;
import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.gui.style.FollowingThemePane;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.widget.accessibles.AccessibleElementCaseToolBarEditor;
import com.fr.design.widget.ui.designer.component.PaddingBoundPane;
import com.fr.design.widget.ui.designer.layout.WTitleLayoutDefinePane;
+import com.fr.form.main.Form;
import com.fr.form.ui.ElementCaseEditor;
+import com.fr.form.ui.PaddingMargin;
import com.fr.form.web.FormToolBarManager;
import com.fr.general.ComparatorUtils;
import com.fr.report.fit.ReportFitAttr;
@@ -27,7 +33,7 @@ import java.util.List;
* Created by kerry on 2020-04-09
*/
public class ElementEditorExtendDefinePane extends WTitleLayoutDefinePane {
- private PaddingBoundPane paddingBoundPane;
+ private final PaddingBoundPane paddingBoundPane;
private AccessibleElementCaseToolBarEditor elementCaseToolBarEditor;
private PropertyGroupPane extraPropertyGroupPane;
private PcFitExpandablePane pcFitExpandablePane;
@@ -36,14 +42,31 @@ public class ElementEditorExtendDefinePane extends WTitleLayoutDefinePane {
- public static final String[] BORDER_STYLE = new String[]{
- com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Common"),
- com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Shadow")
- };
- private static final Dimension BUTTON_SIZE = new Dimension(20, 20);
public static final int SETTING_LABEL_WIDTH = 60;
protected LayoutBorderStyle style = new LayoutBorderStyle();
- //渲染风格:有无阴影
- protected UIComboBox borderStyleCombo;
- // 含图片类型边框的边框配置面板(图片类型边框 + 阴影时存在默认的阴影颜色)
- protected BorderLineAndImagePane borderLineAndImagePane;
- //边框圆角或圆角裁剪
- protected UISpinner cornerSpinner;
- //主体背景
- protected BackgroundSpecialPane backgroundPane;
- //主体背景透明度
- protected UIPercentDragPane backgroundOpacityPane;
-
- // 标题可见
- protected UICheckBox titleVisibleCheckbox;
- //标题文字内容
- protected TinyFormulaPane titleTextPane;
- //标题字体格式
- protected UIComboBox titleFontFamilyComboBox;
- //标题字体大小
- protected UIComboBox titleFontSizeComboBox;
- //标题字体颜色
- protected UIColorButton titleFontColorSelectPane;
- //标题字体特殊效果:粗体、斜体、下划线
- private UIToggleButton titleFontBoldButton;
- private UIToggleButton titleFontItalicButton;
- private UIToggleButton titleFontUnderlineButton;
-// private LineComboBox titleFontUnderlineCombo; // 目前前端仅支持短横线类型的下划线,因此设计器端暂时就不展示线型选择框了,待后续优化
- // 标题图文混排
- protected TitleInsetImagePane titleInsetImagePane;
- //对齐方式
- protected UIButtonGroup titleAlignPane;
- //标题整体背景
- protected BackgroundSpecialPane titleBackgroundPane;
- //标题背景透明度
- protected UIPercentDragPane titleBackgroundOpacityPane;
-
- private boolean supportBorderImage = false;
+ public JPanel namedTitleStylePane;
+ public JPanel namedBodyStylePane;
+ public JPanel namedIntegralStylePane;
+
+ protected ComponentTitleStylePane titleStylePane;
+ protected ComponentBodyStylePane bodyStylePane;
+ protected ComponentIntegralStylePane integralStylePane;
+
+ private final boolean supportBorderImage;
public LayoutStylePane() {
this(false);
@@ -96,344 +59,92 @@ public class LayoutStylePane extends BasicBeanPane {
public LayoutStylePane(boolean supportBorderImage) {
this.supportBorderImage = supportBorderImage;
- this.initLayout();
+ this.initializePane();
}
- protected void initLayout() {
+ protected void initializePane() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
- JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
-
JTemplate currentEditingTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
- boolean currentIsRootLayout = currentEditingTemplate != null && !currentEditingTemplate.isJWorkBook() && ((JForm)currentEditingTemplate).isSelectRootPane();
+ boolean isRootLayout = currentEditingTemplate != null && !currentEditingTemplate.isJWorkBook() && ((JForm)currentEditingTemplate).isSelectRootPane();
- JPanel titlePane = createTitleStylePane();
- JPanel bodyContentPane = currentIsRootLayout ? createBodyContentPane4RootLayout() : createBodyContentPane();
- JPanel backgroundPane = createBackgroundStylePane(true);
+ namedTitleStylePane = createNamedTitleStylePane(isRootLayout);
+ namedBodyStylePane = createNamedBodyStylePane(isRootLayout);
+ namedIntegralStylePane = createNamedIntegralStylePane(isRootLayout, true);
- if (titlePane != null) {
- container.add(titlePane, BorderLayout.NORTH);
- if (currentIsRootLayout) {
- titlePane.setVisible(false);
- }
- }
- JPanel nextContainerPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
- container.add(nextContainerPane, BorderLayout.CENTER);
+ addComponents(new JComponent[] { namedTitleStylePane, namedBodyStylePane, namedIntegralStylePane });
+ }
- if (bodyContentPane != null) {
- //界面上表单主体只有背景和透明度可以设置
- nextContainerPane.add(bodyContentPane, BorderLayout.NORTH);
+ protected JPanel createNamedTitleStylePane(boolean isRootLayout) {
+ if (isRootLayout) {
+ return null;
}
- if (backgroundPane != null) {
- nextContainerPane.add(backgroundPane, BorderLayout.CENTER);
- if (currentIsRootLayout) {
- backgroundPane.setVisible(false);
- }
- }
-
- this.add(container, BorderLayout.CENTER);
+ this.titleStylePane = new ComponentTitleStylePane(SETTING_LABEL_WIDTH);
+ return this.createNamedSubStylePane(i18nText("Fine-Design_Form_Widget_Style_Title"), this.titleStylePane);
}
- protected JPanel createBackgroundStylePane(boolean supportCornerRadius) {
- borderStyleCombo = new UIComboBox(BORDER_STYLE);
- borderLineAndImagePane = new BorderLineAndImagePane(this.supportBorderImage);
- cornerSpinner = new UISpinner(0,1000,1,0);
-
- double p = TableLayout.PREFERRED;
- double f = TableLayout.FILL;
- double[] rowSize = supportCornerRadius ? new double[] {p, p, p, p} : new double[]{p, p, p};
- double[] columnSize = {SETTING_LABEL_WIDTH, f};
-
- UILabel uiLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget-Style_Background_Style"));
- Font font = uiLabel.getFont().deriveFont(Font.BOLD);
- uiLabel.setFont(font);
- uiLabel.setForeground(new Color(143, 143, 146));
-
- JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane(new JComponent[][]{
- {uiLabel, null},
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Render_Style")), borderStyleCombo},
- {this.borderLineAndImagePane, null},
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Radius")), cornerSpinner},
- },
- rowSize, columnSize, IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L1);
- contentPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
-
- JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
- container.setBorder(new BottomLineBorder());
- container.add(contentPane, BorderLayout.NORTH);
-
- return container;
+ protected JPanel createNamedBodyStylePane(boolean isRootLayout) {
+ this.bodyStylePane = new ComponentBodyStylePane(SETTING_LABEL_WIDTH);
+ if (isRootLayout) {
+ return this.bodyStylePane;
+ }
+ return this.createNamedSubStylePane(i18nText("Fine-Design_Form_Widget-Style_Body_Content"), this.bodyStylePane);
}
- protected JPanel createBodyContentPane() {
- backgroundPane = new LayoutBackgroundSpecialPane();
- backgroundOpacityPane = new UIPercentDragPane();
-
- double p = TableLayout.PREFERRED;
- double f = TableLayout.FILL;
- double[] rowSize = {p, p};
- double[] columnSize = {SETTING_LABEL_WIDTH, f};
-
- JPanel bodyBackground = createBackgroundAndOpacityPane(
- com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget-Style_Body_Fill"),
- this.backgroundPane,
- this.backgroundOpacityPane);
+ protected JPanel createNamedIntegralStylePane(boolean isRootLayout, boolean supportCornerRadius) {
+ if (isRootLayout) {
+ return null;
+ }
+ this.integralStylePane = new ComponentIntegralStylePane(SETTING_LABEL_WIDTH, supportBorderImage, supportCornerRadius);
+ return this.createNamedSubStylePane(i18nText("Fine-Design_Form_Widget-Style_Integral_Style"), this.integralStylePane);
+ }
- UILabel uiLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget-Style_Body_Content"));
+ protected JPanel createNamedSubStylePane(String name, JPanel stylePane) {
+ UILabel uiLabel = new UILabel(name);
Font font = uiLabel.getFont().deriveFont(Font.BOLD);
uiLabel.setFont(font);
uiLabel.setForeground(new Color(143, 143, 146));
- JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane(new JComponent[][]{
- {uiLabel, null},
- {bodyBackground, null},
- },
- rowSize, columnSize, IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L1);
- contentPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
-
- JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
- container.setBorder(new BottomLineBorder());
- container.add(contentPane, BorderLayout.NORTH);
-
- return container;
- }
- protected JPanel createBodyContentPane4RootLayout() {
- backgroundPane = new LayoutBackgroundSpecialPane();
- backgroundOpacityPane = new UIPercentDragPane();
-
- double p = TableLayout.PREFERRED;
- double f = TableLayout.FILL;
- double[] rowSize = {p};
- double[] columnSize = {SETTING_LABEL_WIDTH, f};
-
- JPanel bodyBackground = createBackgroundAndOpacityPane(
- com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget-Style_Body_Fill"),
- this.backgroundPane,
- this.backgroundOpacityPane);
-
- JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane(new JComponent[][]{
- {bodyBackground, null},
- },
- rowSize, columnSize, IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L1);
- contentPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
+ JPanel content = TableLayoutHelper.createGapTableLayoutPane( new JComponent[][] {
+ {uiLabel},
+ {stylePane}
+ }, TableLayoutHelper.FILL_LASTCOLUMN, 0, IntervalConstants.INTERVAL_L1);
+ content.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, IntervalConstants.INTERVAL_L1, 0));
JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ container.add(content, BorderLayout.NORTH);
container.setBorder(new BottomLineBorder());
- container.add(contentPane, BorderLayout.NORTH);
return container;
}
- protected void initTitleComponents() {
- titleVisibleCheckbox = new UICheckBox();
-
- titleTextPane = new TinyFormulaPane();
-
- titleFontFamilyComboBox = new UIComboBox(Utils.getAvailableFontFamilyNames4Report());
- TitlePacker title = style.getTitle();
- if (title != null) {
- FRFont frFont = title.getFrFont();
- if (frFont != null) {
- String fontFamily = frFont.getFamily();
- // 使用style中默认的字体初始化titleFontFamilyComboBox,保证UI和数据的一致性
- this.titleFontFamilyComboBox.setSelectedItem(fontFamily);
+ private void addComponents(JComponent[] components) {
+ JPanel container = this;
+ for (JComponent component: components) {
+ if (component != null) {
+ container.add(component, BorderLayout.NORTH);
+ JPanel nextContainer = new JPanel(FRGUIPaneFactory.createBorderLayout());
+ container.add(nextContainer, BorderLayout.CENTER);
+ container = nextContainer;
}
}
- titleFontFamilyComboBox.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Family"));
-
- titleFontSizeComboBox = new UIComboBox(FRFontPane.FONT_SIZES);
- titleFontSizeComboBox.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Size"));
-
- titleFontColorSelectPane = new UIColorButton();
- titleFontColorSelectPane.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Foreground"));
- titleFontColorSelectPane.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Foreground"));
-
- titleFontBoldButton = new UIToggleButton(IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold.png"));
- titleFontBoldButton.setPreferredSize(BUTTON_SIZE);
- titleFontBoldButton.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Bold"));
- titleFontBoldButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Bold"));
-
- titleFontItalicButton = new UIToggleButton(IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic.png"));
- titleFontItalicButton.setPreferredSize(BUTTON_SIZE);
- titleFontItalicButton.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Italic"));
- titleFontItalicButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Italic"));
-
- titleFontUnderlineButton = new UIToggleButton(IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/underline.png"));
- titleFontUnderlineButton.setPreferredSize(BUTTON_SIZE);
- titleFontUnderlineButton.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Underline"));
- titleFontUnderlineButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Underline"));
-
-// titleFontUnderlineCombo = new LineComboBox(UIConstants.BORDER_LINE_STYLE_ARRAY);
-// titleFontUnderlineCombo.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Line_Style"));
-
- titleInsetImagePane = new TitleInsetImagePane();
-
- titleAlignPane = new UIButtonGroup(
- new Icon[] {
- IconUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"),
- IconUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"),
- IconUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png")
- },
- new Integer[]{Constants.LEFT, Constants.CENTER, Constants.RIGHT});
- titleAlignPane.setAllToolTips(
- new String[] {
- com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_StyleAlignment_Left"),
- com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_StyleAlignment_Center"),
- com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_StyleAlignment_Right")
- });
-
- titleBackgroundPane = new LayoutBackgroundSpecialPane();
-
- titleBackgroundOpacityPane = new UIPercentDragPane();
- }
-
- protected JPanel createTitleStylePane() {
- initTitleComponents();
-
- double p = TableLayout.PREFERRED;
- double f = TableLayout.FILL;
- double[] rowSize = {p,p,p,p,p,p};
- double[] columnSize = {SETTING_LABEL_WIDTH, f};
-
- final JPanel bottomPane = TableLayoutHelper.createCommonTableLayoutPane( new JComponent[][]{
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Title_Content")), titleTextPane},
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Title_Format")), titleFontFamilyComboBox},
- {null, createTitleFontButtonPane()},
- {titleInsetImagePane, null},
- {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Title_Text_Align")), titleAlignPane},
- {this.createTitleBackgroundAndOpacityPane(), null},
- },
- rowSize, columnSize, IntervalConstants.INTERVAL_L1);
- bottomPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
- bottomPane.setVisible(false);
-
- JPanel visibleComposedPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
-
- titleVisibleCheckbox.setSelected(false);
- visibleComposedPane.add(titleVisibleCheckbox, BorderLayout.WEST);
- visibleComposedPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Title_Visible")), BorderLayout.CENTER);
-
- UILabel uiLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Title"));
- Font font = uiLabel.getFont().deriveFont(Font.BOLD);
- uiLabel.setFont(font);
- uiLabel.setForeground(new Color(143, 143, 146));
- JPanel topPane = TableLayoutHelper.createCommonTableLayoutPane( new JComponent[][] {
- {uiLabel, null},
- {visibleComposedPane, null}
- }, new double[]{p, p}, new double[]{SETTING_LABEL_WIDTH, p}, IntervalConstants.INTERVAL_L1);
- topPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
-
- JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
- container.setBorder(new BottomLineBorder());
- container.add(topPane, BorderLayout.NORTH);
- container.add(bottomPane, BorderLayout.CENTER);
-
- titleVisibleCheckbox.addChangeListener(new ChangeListener() {
- @Override
- public void stateChanged(ChangeEvent e) {
- bottomPane.setVisible(titleVisibleCheckbox.isSelected());
- }
- });
-
- return container;
- }
-
- protected JPanel createTitleFontButtonPane(){
- double p = TableLayout.PREFERRED;
- double f = TableLayout.FILL;
- double[] rowSize = {p};
- double[] columnSize = {f, p, p, p, p};
-
- JPanel buttonPane = TableLayoutHelper.createCommonTableLayoutPane( new JComponent[][] {
- {titleFontSizeComboBox, titleFontColorSelectPane, titleFontItalicButton, titleFontBoldButton, titleFontUnderlineButton},
- }, rowSize, columnSize, IntervalConstants.INTERVAL_W0);
-
- JPanel containerPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
- containerPane.add(buttonPane, BorderLayout.NORTH);
-// containerPane.add(titleFontUnderlineCombo, BorderLayout.CENTER);
-
-// titleFontUnderlineCombo.setVisible(false);
-// titleFontUnderlineButton.addChangeListener(new ChangeListener() {
-// @Override
-// public void stateChanged(ChangeEvent e) {
-// titleFontUnderlineCombo.setVisible(titleFontUnderlineButton.isSelected());
-// }
-// });
-
- return containerPane;
- }
-
- protected JPanel createTitleBackgroundAndOpacityPane() {
- return createBackgroundAndOpacityPane(
- com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Title_Background"),
- titleBackgroundPane,
- titleBackgroundOpacityPane);
}
@Override
public LayoutBorderStyle updateBean() {
LayoutBorderStyle style = new LayoutBorderStyle();
- updateMain(style);
- updateTitle(style);
- return style;
- }
- protected void updateMain(LayoutBorderStyle style) {
- if (borderStyleCombo != null) {
- style.setBorderStyle(borderStyleCombo.getSelectedIndex());
- }
- if (cornerSpinner != null) {
- style.setBorderRadius((int) cornerSpinner.getValue());
+ if (this.titleStylePane != null) {
+ this.titleStylePane.updateBean(style);
}
- if (borderLineAndImagePane != null) {
- borderLineAndImagePane.updateBean(style);
+ if (this.bodyStylePane != null) {
+ this.bodyStylePane.updateBean(style);
}
- if (backgroundPane != null) {
- style.setBackground(backgroundPane.update());
+ if (this.integralStylePane != null) {
+ this.integralStylePane.updateBean(style);
}
- if (backgroundOpacityPane != null) {
- style.setAlpha((float)backgroundOpacityPane.updateBean());
- }
- }
-
- protected void updateTitle(LayoutBorderStyle style) {
- style.setType(titleVisibleCheckbox != null && titleVisibleCheckbox.isSelected() ? LayoutBorderStyle.TITLE : LayoutBorderStyle.STANDARD);
- TitlePacker title = style.getTitle() == null ? new WidgetTitle() : style.getTitle();
- title.setTextObject(titleTextPane.updateBean());
- FRFont frFont = title.getFrFont();
- frFont = frFont.applySize((Integer) titleFontSizeComboBox.getSelectedItem());
- frFont = frFont.applyName(titleFontFamilyComboBox.getSelectedItem().toString());
- frFont = frFont.applyForeground(titleFontColorSelectPane.getColor());
- frFont = updateTitleFontItalicBold(frFont);
-// int line = titleFontUnderlineButton.isSelected() ? this.titleFontUnderlineCombo.getSelectedLineStyle() : Constants.LINE_NONE;
- int line = titleFontUnderlineButton.isSelected() ? Constants.LINE_THIN : Constants.LINE_NONE;
- frFont = frFont.applyUnderline(line);
- title.setFrFont(frFont);
- title.setPosition((Integer) titleAlignPane.getSelectedItem());
- titleInsetImagePane.updateBean(title);
- title.setBackground(titleBackgroundPane.update());
- title.setBackgroundOpacity((float)titleBackgroundOpacityPane.updateBean());
- style.setTitle(title);
- }
-
- private FRFont updateTitleFontItalicBold(FRFont frFont) {
- int italic_bold = frFont.getStyle();
- boolean isItalic = italic_bold == Font.ITALIC || italic_bold == (Font.BOLD + Font.ITALIC);
- boolean isBold = italic_bold == Font.BOLD || italic_bold == (Font.BOLD + Font.ITALIC);
- if (titleFontItalicButton.isSelected() && !isItalic) {
- italic_bold += Font.ITALIC;
- } else if (!titleFontItalicButton.isSelected() && isItalic) {
- italic_bold -= Font.ITALIC;
- }
- frFont = frFont.applyStyle(italic_bold);
- if (titleFontBoldButton.isSelected() && !isBold) {
- italic_bold += Font.BOLD;
- } else if (!titleFontBoldButton.isSelected() && isBold) {
- italic_bold -= Font.BOLD;
- }
- frFont = frFont.applyStyle(italic_bold);
- return frFont;
+ return style;
}
@Override
@@ -443,104 +154,20 @@ public class LayoutStylePane extends BasicBeanPane {
}
this.style.setStyle(style);
- populateMain();
- populateTitle();
- }
-
- protected void populateMain() {
- if (this.borderStyleCombo != null) {
- this.borderStyleCombo.setSelectedIndex(style.getBorderStyle());
- }
- if (this.borderLineAndImagePane != null) {
- this.borderLineAndImagePane.populateBean(style);
+ if (this.titleStylePane != null) {
+ this.titleStylePane.populateBean(this.style);
}
- if (this.backgroundPane != null) {
- this.backgroundPane.populateBean(style.getBackground());
- if (this.backgroundOpacityPane != null) {
- this.backgroundOpacityPane.populateBean(style.getAlpha());
- }
+ if (this.bodyStylePane != null) {
+ this.bodyStylePane.populateBean(this.style);
}
- if (this.cornerSpinner != null) {
- this.cornerSpinner.setValue(style.getBorderRadius());
+ if (this.integralStylePane != null) {
+ this.integralStylePane.populateBean(this.style);
}
}
- protected void populateTitle() {
- TitlePacker widgetTitle = style == null ? new WidgetTitle() : style.getTitle();
- widgetTitle = widgetTitle == null ? new WidgetTitle() : widgetTitle;
- titleVisibleCheckbox.setSelected(style.getType() != LayoutBorderStyle.STANDARD);
-
- this.titleTextPane.populateBean(widgetTitle.getTextObject().toString());
-
- FRFont frFont = widgetTitle.getFrFont();
- this.titleFontSizeComboBox.setSelectedItem(frFont.getSize());
- this.titleFontFamilyComboBox.setSelectedItem(frFont.getFamily());
- this.titleFontColorSelectPane.setColor(frFont.getForeground());
- this.titleFontColorSelectPane.repaint();
- titleFontBoldButton.setSelected(frFont.isBold());
- titleFontItalicButton.setSelected(frFont.isItalic());
-
- int line = frFont.getUnderline();
- if (line == Constants.LINE_NONE) {
- titleFontUnderlineButton.setSelected(false);
-// titleFontUnderlineCombo.setVisible(false);
- } else {
- titleFontUnderlineButton.setSelected(true);
-// titleFontUnderlineCombo.setVisible(true);
-// this.titleFontUnderlineCombo.setSelectedLineStyle(line);
- }
-
- titleAlignPane.setSelectedItem(widgetTitle.getPosition());
- titleInsetImagePane.populateBean(widgetTitle);
- titleBackgroundPane.populateBean(widgetTitle.getBackground());
- titleBackgroundOpacityPane.populateBean(widgetTitle.getBackgroundOpacity());
- }
-
@Override
protected String title4PopupWindow() {
- return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style");
- }
-
- private static JPanel createBackgroundAndOpacityPane(String name, BackgroundSpecialPane backgroundPane, UIPercentDragPane opacityPane) {
- JPanel container = new JPanel();
- container.setLayout(new BorderLayout(0, 6));
-
- double p = TableLayout.PREFERRED;
- double f = TableLayout.FILL;
- double[] columnSize = {SETTING_LABEL_WIDTH, f};
-
- // 确保BackgroundSpecialPane高度变化时,Label依然保持与其顶部对齐
- JPanel backgroundLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
- backgroundLabelPane.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, 0, 0));
- backgroundLabelPane.add(new UILabel(name), BorderLayout.NORTH);
-
- JPanel backgroundComposedPane = TableLayoutHelper.createGapTableLayoutPane(
- new JComponent[][]{
- {backgroundLabelPane, backgroundPane}
- },
- new double[]{p}, columnSize, IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L1);
-
- JPanel opacityComposedPane = TableLayoutHelper.createGapTableLayoutPane(
- new JComponent[][]{
- {new UILabel(""), new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget-Style_Alpha"))},
- {new UILabel(""), opacityPane}
- },
- new double[]{p, p}, columnSize, IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L1);
-
- container.add(backgroundComposedPane, BorderLayout.NORTH, 0);
- container.add(opacityComposedPane, BorderLayout.CENTER, 1);
-
- opacityComposedPane.setVisible(false);
-
- backgroundPane.addChangeListener(new ChangeListener() {
- @Override
- public void stateChanged(ChangeEvent e) {
- Background background = backgroundPane.update();
- opacityComposedPane.setVisible(background != null);
- }
- });
-
- return container;
+ return i18nText("Fine-Design_Form_Widget_Style");
}
protected static class BottomLineBorder extends LineBorder {
@@ -574,4 +201,23 @@ public class LayoutStylePane extends BasicBeanPane {
return new GradientBackgroundQuickPane(140);
}
}
+
+ public void supportTitleStyle(boolean supportTitleVisible, boolean supportTitleContent, boolean supportOtherSetting) {
+ if (titleStylePane != null) {
+ titleStylePane.setSupportTitleVisible(supportTitleVisible);
+ titleStylePane.setSupportTitleContent(supportTitleContent);
+ titleStylePane.setSupportOtherSetting(supportOtherSetting);
+ }
+ }
+
+ public void supportBodyStyle(boolean supporting) {
+ if (namedBodyStylePane != null) {
+ namedBodyStylePane.setVisible(supporting);
+ }
+ }
+ public void supportIntegralStyle(boolean supporting) {
+ if (namedIntegralStylePane != null) {
+ namedIntegralStylePane.setVisible(supporting);
+ }
+ }
}
diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java b/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java
index 05cc34dfb..16dc8593e 100644
--- a/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java
+++ b/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java
@@ -175,14 +175,12 @@ public class FormArea extends JComponent implements ScrollRulerComponent {
double[] rowSize = {f};
double[] columnSize = {p, f, p, p, p, p, p, f, p};
UILabel tipsPane = new UILabel("form");
- tipsPane.setPreferredSize(new Dimension(265, 0));
widthPane = new UINumberField();
widthPane.setPreferredSize(new Dimension(60, 0));
heightPane = new UINumberField();
heightPane.setPreferredSize(new Dimension(60, 0));
slidePane = JFormSliderPane.getInstance();
- slidePane.setPreferredSize(new Dimension(326, 20));
JPanel resizePane = TableLayoutHelper.createCommonTableLayoutPane(
new JComponent[][]{{tipsPane, new UILabel(), widthPane,
diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java b/designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java
index 7a6a73f4b..9731dd508 100644
--- a/designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java
+++ b/designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java
@@ -2,8 +2,12 @@ package com.fr.design.mainframe;
import com.fr.base.BaseUtils;
import com.fr.base.chart.BaseChartCollection;
+import com.fr.base.theme.TemplateThemeAware;
+import com.fr.base.theme.TemplateThemeCompatible;
import com.fr.chart.chartattr.ChartCollection;
import com.fr.chartx.attr.ChartProvider;
+import com.fr.base.theme.FormTheme;
+import com.fr.base.theme.TemplateTheme;
import com.fr.design.DesignModelAdapter;
import com.fr.design.data.DesignTableDataManager;
import com.fr.design.data.datapane.TableDataTreePane;
@@ -18,6 +22,7 @@ import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.designer.creator.XWParameterLayout;
+import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.form.util.XCreatorConstants;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.icon.IconPathConstants;
@@ -27,9 +32,14 @@ import com.fr.design.mod.bean.ContentChangeItem;
import com.fr.design.mod.event.TableDataModifyEvent;
import com.fr.design.utils.ComponentUtils;
import com.fr.event.EventDispatcher;
+import com.fr.form.main.Form;
+import com.fr.form.main.WidgetGather;
import com.fr.form.share.editor.SharableEditorProvider;
import com.fr.form.share.SharableWidgetProvider;
import com.fr.form.share.ShareLoader;
+import com.fr.form.ui.AbstractBorderStyleWidget;
+import com.fr.form.ui.ChartEditor;
+import com.fr.form.ui.ElementCaseEditor;
import com.fr.form.ui.Widget;
import com.fr.stable.Constants;
import com.fr.stable.StringUtils;
@@ -139,6 +149,10 @@ public class FormCreatorDropTarget extends DropTarget {
}
EventDispatcher.fire(TableDataModifyEvent.INSTANCE, new ContentChangeItem(tdNameMap, widget, ChangeItem.TABLE_DATA_NAME));
}
+
+ // 新疆的图表块和报表块默认主题化
+ addThemeToNewWidget(addingXCreator);
+
designer.getSelectionModel().setSelectedCreators(
FormSelectionUtils.rebuildSelection(xCreator, new Widget[]{widget}));
designer.getEditListenerTable().fireCreatorModified(addingModel.getXCreator(), DesignerEvent.CREATOR_ADDED);
@@ -349,4 +363,37 @@ public class FormCreatorDropTarget extends DropTarget {
public TabDragInner getTabDragInner() {
return this.tabDragInner;
}
+
+ private void addThemeToNewWidget(XCreator addingXCreator) {
+ JTemplate,?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
+ if (template == null) {
+ return;
+ }
+ TemplateTheme theme = template.getTemplateTheme();
+ if (!(theme instanceof FormTheme)) {
+ return;
+ }
+ FormTheme formTheme = (FormTheme) theme;
+
+ Form.traversalWidget(addingXCreator.toData(), new WidgetGather() {
+ @Override
+ public void dealWith(Widget widget) {
+ if (widget instanceof AbstractBorderStyleWidget) {
+ AbstractBorderStyleWidget styleWidget = (AbstractBorderStyleWidget) widget;
+ if (!styleWidget.supportThemed()) {
+ return;
+ }
+
+ boolean followingTheme = (!addingXCreator.isShared()) || styleWidget.isBorderStyleFollowingTheme();
+ styleWidget.setBorderStyleFollowingTheme(followingTheme);
+ if (followingTheme) {
+ styleWidget.onTemplateUsingThemeChange(formTheme, TemplateThemeCompatible.NONE);
+ }
+ }
+ }
+ @Override
+ public boolean dealWithAllCards() { return true; }
+ }, AbstractBorderStyleWidget.class);
+ addingXCreator.rebuid();
+ }
}
diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java b/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java
index 4b7fc8eb9..92127c5a8 100644
--- a/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java
+++ b/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java
@@ -110,6 +110,10 @@ public class FormDesigner extends TargetComponent