diff --git a/designer-base/src/main/java/com/fr/design/actions/TableDataSourceAction.java b/designer-base/src/main/java/com/fr/design/actions/TableDataSourceAction.java index 600f9721ed..a0ca4d9558 100644 --- a/designer-base/src/main/java/com/fr/design/actions/TableDataSourceAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/TableDataSourceAction.java @@ -15,6 +15,7 @@ import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; /* @@ -51,6 +52,10 @@ public class TableDataSourceAction extends TemplateComponentAction iterator = tds.getTableDataNameIterator(); + while (iterator.hasNext()) { + DesignTableDataManager.removeSelectedColumnNames(iterator.next()); + } DesignModelAdapter.getCurrentModelAdapter().renameTableData(tableDataPane.getDsNameChangedMap()); tableDataPane.update(tds); TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()); diff --git a/designer-base/src/main/java/com/fr/design/actions/UpdateAction.java b/designer-base/src/main/java/com/fr/design/actions/UpdateAction.java index b0803635c9..4fd7e6c42b 100644 --- a/designer-base/src/main/java/com/fr/design/actions/UpdateAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/UpdateAction.java @@ -17,6 +17,7 @@ import com.fr.design.mainframe.toolbar.UpdateActionManager; import com.fr.design.menu.ShortCut; import com.fr.design.selection.SelectionListener; import com.fr.general.ComparatorUtils; +import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; import com.fr.stable.pinyin.PinyinFormat; import com.fr.stable.pinyin.PinyinHelper; @@ -562,7 +563,12 @@ public abstract class UpdateAction extends ShortCut implements Action { for (int i = 0; i < component.getTabCount(); i++) { String title = component.getTitleAt(i); handleSearchText(separator, text, pinyin, shortPinyin, title); - Component tabComponent = component.getComponentAt(i); + Component tabComponent = null; + try { + tabComponent = component.getComponentAt(i); + } catch (Exception ignore) { + FineLoggerFactory.getLogger().info("AlphaFine index tabPane end"); + } if (tabComponent instanceof JPanel) { getComponentTexts((JPanel) tabComponent, separator, text, pinyin, shortPinyin); } else if (tabComponent instanceof JTabbedPane) { diff --git a/designer-base/src/main/java/com/fr/design/actions/file/OpenRecentReportMenuDef.java b/designer-base/src/main/java/com/fr/design/actions/file/OpenRecentReportMenuDef.java index 2bb026159f..7533cb133a 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/OpenRecentReportMenuDef.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/OpenRecentReportMenuDef.java @@ -1,6 +1,7 @@ package com.fr.design.actions.file; import java.awt.event.ActionEvent; +import java.io.File; import java.util.List; import com.fr.base.BaseUtils; @@ -11,6 +12,7 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.MenuDef; import com.fr.file.FILEFactory; +import com.fr.file.FileFILE; /** * Open Resent MenuDef. @@ -68,7 +70,12 @@ public class OpenRecentReportMenuDef extends MenuDef { * @param e 事件 */ public void actionPerformed(ActionEvent e) { - DesignerContext.getDesignerFrame().openTemplate(FILEFactory.createFILE(this.getPath())); + File file = new File(this.getPath()); + if (file.exists()) { + DesignerContext.getDesignerFrame().openTemplate(new FileFILE(file)); + } else { + DesignerContext.getDesignerFrame().openTemplate(FILEFactory.createFILE(this.getPath())); + } } public String getPath() { diff --git a/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java b/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java index b4b6d53c6f..d94e8ea5c3 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java @@ -76,7 +76,7 @@ public class AboutDialog extends JDialog implements ActionListener { this.getRootPane().setDefaultButton(okButton); - this.setSize(new Dimension(660, 600)); + this.setSize(defaultPane.getPreferredSize().width, 600); GUICoreUtils.centerWindow(this); } diff --git a/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java b/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java index 3ede159504..a7aac03913 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java @@ -4,6 +4,7 @@ package com.fr.design.actions.help; import com.fr.base.FRContext; +import com.fr.base.GraphHelper; import com.fr.design.DesignerEnvManager; import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.BoldFontTextLabel; @@ -36,9 +37,13 @@ public class AboutPane extends JPanel { private static final String COMPANY_TELEPHONE = CloudCenter.getInstance().acquireUrlByKind("help.compNo"); private static final String PRESIDENT_PHONE = CloudCenter.getInstance().acquireUrlByKind("help.PNo"); + private int maxWidth; + public AboutPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - + this.maxWidth = GraphHelper.getWidth(getBuildTitle() + GeneralUtils.readFullBuildNO() + + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Copy_Build_NO") + + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Copy_Build_NO_OK")); //center panel JPanel centerPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); this.add(centerPane, BorderLayout.CENTER); @@ -90,6 +95,11 @@ public class AboutPane extends JPanel { } } + @Override + public Dimension getPreferredSize() { + return new Dimension(this.maxWidth, super.getPreferredSize().height); + } + private void addPhoneAndQQPane(JPanel contentPane) { BoxCenterAligmentPane boxCenterAlignmentPane; // 英文版不显示服务电话和QQ diff --git a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java index d261de57c3..5bf0214e02 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java @@ -189,34 +189,34 @@ public class AlphaFineConfigPane extends BasicPane { } public void populate(AlphaFineConfigManager alphaFineConfigManager) { - + this.enabledCheckbox.setSelected(alphaFineConfigManager.isEnabled()); - - boolean enabled4Locale = FRContext.isChineseEnv(); - - this.searchOnlineCheckbox.setEnabled(enabled4Locale); - this.searchOnlineCheckbox.setSelected(alphaFineConfigManager.isSearchOnLine()); - + + boolean enabled4Locale = FRContext.isChineseEnv() && alphaFineConfigManager.isSearchOnLine(); + + this.searchOnlineCheckbox.setEnabled(FRContext.isChineseEnv()); + this.searchOnlineCheckbox.setSelected(enabled4Locale); + this.containActionCheckbox.setSelected(alphaFineConfigManager.isContainAction()); this.containTemplateCheckbox.setSelected(alphaFineConfigManager.isContainTemplate()); this.containFileContentCheckbox.setSelected(alphaFineConfigManager.isContainFileContent()); - - this.containDocumentCheckbox.setSelected(alphaFineConfigManager.isContainDocument() && alphaFineConfigManager.isSearchOnLine()); + + this.containDocumentCheckbox.setSelected(alphaFineConfigManager.isContainDocument() && enabled4Locale); this.containDocumentCheckbox.setEnabled(enabled4Locale); - - this.containPluginCheckbox.setSelected(alphaFineConfigManager.isContainPlugin() && alphaFineConfigManager.isSearchOnLine()); + + this.containPluginCheckbox.setSelected(alphaFineConfigManager.isContainPlugin() && enabled4Locale); this.containPluginCheckbox.setEnabled(enabled4Locale); - - this.containRecommendCheckbox.setSelected(alphaFineConfigManager.isContainRecommend() && alphaFineConfigManager.isSearchOnLine()); + + this.containRecommendCheckbox.setSelected(alphaFineConfigManager.isContainRecommend() && enabled4Locale); this.containRecommendCheckbox.setEnabled(enabled4Locale); - + this.shortcutsField.setText(getDisplayShortCut(alphaFineConfigManager.getShortcuts())); this.needSegmentationCheckbox.setSelected(alphaFineConfigManager.isNeedSegmentationCheckbox()); - - this.needIntelligentCustomerService.setSelected(alphaFineConfigManager.isNeedIntelligentCustomerService() && alphaFineConfigManager.isSearchOnLine()); + + this.needIntelligentCustomerService.setSelected(alphaFineConfigManager.isNeedIntelligentCustomerService() && enabled4Locale); this.needIntelligentCustomerService.setEnabled(enabled4Locale); - + shortCutKeyStore = convert2KeyStroke(alphaFineConfigManager.getShortcuts()); } diff --git a/designer-base/src/main/java/com/fr/design/cell/AbstractCellElementPropertyPane.java b/designer-base/src/main/java/com/fr/design/cell/AbstractCellElementPropertyPane.java new file mode 100644 index 0000000000..3e4e001a8f --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/cell/AbstractCellElementPropertyPane.java @@ -0,0 +1,23 @@ +package com.fr.design.cell; + +import com.fr.design.designer.TargetComponent; +import com.fr.design.dialog.BasicPane; + +import javax.swing.JPanel; + +/** + * @author zack + * @version 10.0 + * Created by zack on 2020/7/14 + */ +public abstract class AbstractCellElementPropertyPane extends BasicPane implements CellElementPropertyComponent { + @Override + public JPanel toPanel() { + return this; + } + + @Override + public boolean accept(TargetComponent tc) { + return true; + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/cell/CellElementPropertyComponent.java b/designer-base/src/main/java/com/fr/design/cell/CellElementPropertyComponent.java new file mode 100644 index 0000000000..b3e6f41674 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/cell/CellElementPropertyComponent.java @@ -0,0 +1,34 @@ +package com.fr.design.cell; + +import com.fr.design.designer.TargetComponent; + +import javax.swing.JPanel; + +/** + * 单元格属性配置面板接口 + * @author zack + * @version 10.0 + * Created by zack on 2020/7/14 + */ +public interface CellElementPropertyComponent { + + /** + * 判断当前编辑的对象是否显示当前实现 + * @param tc + * @return + */ + boolean accept(TargetComponent tc); + + /** + * 加载数据 + * @param tc + */ + void populate(TargetComponent tc); + + /** + * 返回当前属性面板,默认返回this + * @return + */ + JPanel toPanel(); + +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java index e8bc8e39ab..5ba801ca89 100644 --- a/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java @@ -446,7 +446,16 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp * @param srcName 数据集来源(比如报表块,就是报表块的名称) * @param tableDataSource 数据集 */ + public Map addTableData(String srcName, TableDataSource tableDataSource, boolean isCover) { + return new HashMap<>(0); + } + public Map addTableData(String srcName, TableDataSource tableDataSource) { - return new HashMap<>(0); + return addTableData(srcName, tableDataSource, false); + } + + public void removeTableData(String sourceName) { + } + } diff --git a/designer-base/src/main/java/com/fr/design/data/BasicTableDataUtils.java b/designer-base/src/main/java/com/fr/design/data/BasicTableDataUtils.java index 27724450bb..57c7e23a13 100644 --- a/designer-base/src/main/java/com/fr/design/data/BasicTableDataUtils.java +++ b/designer-base/src/main/java/com/fr/design/data/BasicTableDataUtils.java @@ -1,5 +1,6 @@ package com.fr.design.data; +import com.fr.data.TableDataSource; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.i18n.Toolkit; import com.fr.stable.StringUtils; @@ -10,6 +11,7 @@ import com.fr.stable.StringUtils; * Created by hades on 2020/4/27 */ public abstract class BasicTableDataUtils { + private static final String SEPARATOR = "-"; private static final int LEN = 2; @@ -33,4 +35,19 @@ public abstract class BasicTableDataUtils { } return false; } + + public static String getTableDataName(boolean isCover, TableDataSource tds, String tdName, String srcName, boolean isDsNameRepeaded) { + if (isCover) { + return srcName + SEPARATOR + tdName; + } + if (tds.getTableData(tdName) != null || isDsNameRepeaded) {//如果有同名的就拼上来源名称 + tdName = srcName + SEPARATOR + tdName; + } + int i = 0; + while (tds.getTableData(tdName) != null) { + i++;//如果拼上名字后依然已经存在就加编号 + tdName += i; + } + return tdName; + } } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java index 1dd1f00aa0..8c09eb3035 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java @@ -60,7 +60,10 @@ public class TableDataPaneListPane extends JListControlPane implements TableData if (StringUtils.isEmpty(tempName)) { isNamePermitted = false; nameableList.stopEditing(); - FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TableDataPaneListPane.this), Toolkit.i18nText("Fine-Design_Basic_Table_Data_Empty_Name_Tips")); + FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TableDataPaneListPane.this), + Toolkit.i18nText("Fine-Design_Basic_Table_Data_Empty_Name_Tips"), + Toolkit.i18nText("Fine-Design_Report_Alert"), + JOptionPane.WARNING_MESSAGE); setIllegalIndex(editingIndex); return; } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index 531e128484..a2cc5b7d28 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -9,6 +9,7 @@ import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.UpdateAction; import com.fr.design.constants.UIConstants; import com.fr.design.data.BasicTableDataTreePane; +import com.fr.design.data.BasicTableDataUtils; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.tabledata.StoreProcedureWorkerListener; import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; @@ -59,7 +60,7 @@ import java.util.Map; public class TableDataTreePane extends BasicTableDataTreePane { private static TableDataTreePane singleton = new TableDataTreePane(); - + public static final int PLUGIN_LISTENER_PRIORITY = 1; public synchronized static BasicTableDataTreePane getInstance(DesignModelAdapter tc) { @@ -96,10 +97,10 @@ public class TableDataTreePane extends BasicTableDataTreePane { addMenuDef.setIconPath(IconPathConstants.ADD_POPMENU_ICON_PATH); createAddMenuDef(); - + // 创建插件监听 createPluginListener(); - + editAction = new EditAction(); removeAction = new RemoveAction(); previewTableDataAction = new PreviewTableDataAction(dataTree); @@ -139,27 +140,27 @@ public class TableDataTreePane extends BasicTableDataTreePane { new TableDataTreeDragSource(dataTree, DnDConstants.ACTION_COPY); checkButtonEnabled(); } - + private void createPluginListener() { - + //菜单栏监听 GeneralContext.listenPluginRunningChanged(new PluginEventListener(PLUGIN_LISTENER_PRIORITY) { - + @Override public void on(PluginEvent event) { - + addMenuDef.clearShortCuts(); createAddMenuDef(); } }, new PluginFilter() { - + @Override public boolean accept(PluginContext context) { - + return context.contain(PluginModule.ExtraDesign); } }); - + //监听数据集插件 GeneralContext.listenPluginRunningChanged(new PluginEventListener() { @Override @@ -188,8 +189,8 @@ public class TableDataTreePane extends BasicTableDataTreePane { } }); } - - + + protected void checkButtonEnabled() { super.checkButtonEnabled(editAction, previewTableDataAction, removeAction, op, dataTree); } @@ -339,10 +340,11 @@ public class TableDataTreePane extends BasicTableDataTreePane { /** * 合并数据集 - * @param srcName 数据集来源(比如报表块,就是报表块的名称) + * + * @param srcName 数据集来源(比如报表块,就是报表块的名称) * @param tableDataSource 数据集 */ - public Map addTableData(String srcName, TableDataSource tableDataSource) { + public Map addTableData(String srcName, TableDataSource tableDataSource, boolean isCover) { Map tdNameMap = new HashMap<>(); allDSNames = DesignTableDataManager.getAllDSNames(tc.getBook()); DesignTableDataManager.setThreadLocal(DesignTableDataManager.NO_PARAMETER); @@ -352,14 +354,8 @@ public class TableDataTreePane extends BasicTableDataTreePane { String tdName = (String) tdIterator.next(); String oldName = tdName; TableData td = tableDataSource.getTableData(tdName); - if (tds.getTableData(tdName) != null || isDsNameRepeaded(tdName)) {//如果有同名的就拼上来源名称 - tdName = srcName + tdName; - } - int i = 0; - while (tds.getTableData(tdName) != null) { - i++;//如果拼上名字后依然已经存在就加编号 - tdName += i; - } + boolean isDsNameRepeaded = isDsNameRepeaded(tdName); + tdName = BasicTableDataUtils.getTableDataName(isCover, tds, tdName, srcName, isDsNameRepeaded); tds.putTableData(tdName, td); if (!ComparatorUtils.equals(oldName, tdName)) { tdNameMap.put(oldName, tdName); @@ -367,8 +363,19 @@ public class TableDataTreePane extends BasicTableDataTreePane { } tc.parameterChanged(); dataTree.refresh(); - return Collections.unmodifiableMap(tdNameMap); + return Collections.unmodifiableMap(tdNameMap); } + + @Override + public void removeTableData(String sourceName) { + TableDataSource tds = tc.getBook(); + tds.removeTableData(sourceName); + dataTree.refresh(); + } + + + + public void addDataPane(final AbstractTableDataPane uPanel, String paneName) { final NamePane nPanel = uPanel.asNamePane(); nPanel.setObjectName(paneName); diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java index 7bbcda825f..5e8199d953 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java @@ -1,5 +1,6 @@ package com.fr.design.data.datapane.connect; +import com.fr.base.GraphHelper; import com.fr.design.constants.UIConstants; import com.fr.data.impl.JDBCDatabaseConnection; import com.fr.data.pool.DBCPConnectionPoolAttr; @@ -16,7 +17,9 @@ import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; import com.fr.design.dialog.BasicPane; import com.fr.design.editor.editor.IntegerEditor; +import com.fr.design.utils.BrowseUtils; import com.fr.file.filter.ChooseFileFilter; +import com.fr.general.CloudCenter; import com.fr.general.ComparatorUtils; import com.fr.stable.StringUtils; @@ -32,351 +35,375 @@ import java.util.Map; import java.util.Map.Entry; public class JDBCDefPane extends JPanel { - public static final String DRIVER_TYPE = "driver_type"; - public static final String USER_NAME = "user_name"; + public static final String DRIVER_TYPE = "driver_type"; + public static final String USER_NAME = "user_name"; public static final int TIME_MULTIPLE = 1000; - private static final String OTHER_DB = "Others"; - - private static Map jdbcMap = new HashMap(); - - static { - jdbcMap.put(OTHER_DB, new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:"), - new DriverURLName("org.hsqldb.jdbcDriver", "jdbc:hsqldb:file:[PATH_TO_DB_FILES]"), new DriverURLName("com.inet.tds.TdsDriver", "jdbc:inetdae7:localhost:1433/"), - new DriverURLName("COM.cloudscape.JDBCDriver", "jdbc:cloudscape:/cloudscape/"), - new DriverURLName("com.internetcds.jdbc.tds.Driver", "jdbc:freetds:sqlserver://localhost/"), - new DriverURLName("com.fr.swift.jdbc.Driver", "jdbc:swift:emb://default")}); - jdbcMap.put("Inceptor",new DriverURLName[]{new DriverURLName("org.apache.hive.jdbc.HiveDriver","jdbc:inceptor2://localhost:10000/default"), - new DriverURLName("org.apache.hadoop.hive.jdbc.HiveDriver","jdbc:inceptor://localhost:10000/default")}); - jdbcMap.put("Oracle", new DriverURLName[]{new DriverURLName("oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@localhost:1521:databaseName")}); - jdbcMap.put("DB2", new DriverURLName[]{new DriverURLName("com.ibm.db2.jcc.DB2Driver", "jdbc:db2://localhost:50000/")}); - jdbcMap.put("SQL Server", new DriverURLName[]{new DriverURLName("com.microsoft.sqlserver.jdbc.SQLServerDriver", "jdbc:sqlserver://localhost:1433;" + "databaseName=")}); - jdbcMap.put("MySQL", new DriverURLName[]{new DriverURLName("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/"), - new DriverURLName("org.gjt.mm.mysql.Driver", "jdbc:mysql://localhost/")}); - jdbcMap.put("Sybase", new DriverURLName[]{new DriverURLName("com.sybase.jdbc2.jdbc.SybDriver", "jdbc:sybase:Tds:localhost:5000/")}); - jdbcMap.put("Access", new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=")}); - jdbcMap.put("Derby", new DriverURLName[]{new DriverURLName("org.apache.derby.jdbc.ClientDriver", "jdbc:derby://localhost:1527/")}); - jdbcMap.put("Postgre", new DriverURLName[]{new DriverURLName("org.postgresql.Driver", "jdbc:postgresql://localhost:5432/")}); - jdbcMap.put("SQLite", new DriverURLName[]{new DriverURLName("org.sqlite.JDBC", "jdbc:sqlite://${ENV_HOME}/../help/FRDemo.db")}); - } - - private UIButton dbtypeButton; - private UIComboBox dbtypeComboBox; - private UIComboBox driverComboBox; - private UITextField urlTextField; - private UITextField userNameTextField; - private JPasswordField passwordTextField; - // 请不要改动dbtype,只应该最后添加 - private final String[] dbtype = {"Oracle", "DB2", "SQL Server", "MySQL", "Sybase", "Access", "Derby", "Postgre","SQLite","Inceptor", OTHER_DB}; - - // carl:DBCP的一些属性 - private IntegerEditor DBCP_INITIAL_SIZE = new IntegerEditor(); - private IntegerEditor DBCP_MAX_ACTIVE = new IntegerEditor(); - private IntegerEditor DBCP_MAX_IDLE = new IntegerEditor(); - private IntegerEditor DBCP_MIN_IDLE = new IntegerEditor(); - private IntegerEditor DBCP_MAX_WAIT = new IntegerEditor(); - private UITextField DBCP_VALIDATION_QUERY = new UITextField(); - - private UIComboBox DBCP_TESTONBORROW = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")}); - private UIComboBox DBCP_TESTONRETURN = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")}); - private UIComboBox DBCP_TESTWHILEIDLE = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")}); - - private IntegerEditor DBCP_TIMEBETWEENEVICTIONRUNSMILLS = new IntegerEditor(); - private IntegerEditor DBCP_NUMTESTSPEREVICTIONRUN = new IntegerEditor(); - private IntegerEditor DBCP_MINEVICTABLEIDLETIMEMILLIS = new IntegerEditor(); - - public JDBCDefPane() { - this.setBorder(UITitledBorder.createBorderWithTitle("JDBC" + ":")); - this.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); - JPanel innerthis = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - innerthis.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - this.add(innerthis); - dbtypeComboBox = new UIComboBox(); - dbtypeComboBox.setName(DRIVER_TYPE); - for (int i = 0; i < dbtype.length; i++) { - dbtypeComboBox.addItem(dbtype[i]); - } - dbtypeComboBox.addActionListener(dbtypeActionListener); - dbtypeComboBox.setMaximumRowCount(10); - - driverComboBox = new UIComboBox(); - driverComboBox.setEditable(true); - driverComboBox.addActionListener(driverListener); - urlTextField = new UITextField(15); - userNameTextField = new UITextField(15); - userNameTextField.setName(USER_NAME); - passwordTextField = new UIPassWordField(15); - dbtypeButton = new UIButton("."); - dbtypeButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Click_Get_Default_URL")); - dbtypeButton.addActionListener(dbtypeButtonActionListener); - - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - JPanel dbtypePane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - dbtypePane.add(new UILabel((com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database") + ":"))); - JPanel dbtypeComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - Component[][] dbtypeComComponents = {{dbtypeComboBox}}; - double[] dbtypeRowSize = {p}; - double[] dbtypeColumnSize = {p}; - dbtypeComPane = TableLayoutHelper.createTableLayoutPane(dbtypeComComponents, dbtypeRowSize, dbtypeColumnSize); - - JPanel driverPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - driverPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Driver") + ":")); - - JPanel urlPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - urlPane.add(new UILabel("URL:")); - JPanel urlComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - Component[][] urlComComponents = {{urlTextField, dbtypeButton}}; - double[] urlRowSize = {p}; - double[] urlColumnSize = {f, 21}; - urlComPane = TableLayoutHelper.createCommonTableLayoutPane(urlComComponents, urlRowSize, urlColumnSize, 4); - - JPanel userPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - userPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_UserName") + ":")); - JPanel userComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - Component[][] userComComponents = {{userNameTextField, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Password") + ":"), passwordTextField}}; - double[] userRowSize = {p}; - double[] userColumnSize = {f, p, f}; - userComPane = TableLayoutHelper.createCommonTableLayoutPane(userComComponents, userRowSize, userColumnSize, 4); - - JPanel passwordPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - passwordPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Password") + ":")); - - Component[][] components = {{dbtypePane, dbtypeComPane}, {driverPane, driverComboBox}, {urlPane, urlComPane}, {userPane, userComPane},}; - - double[] rowSize = {p, p, p, p}; - double[] columnSize = {p, f, 22}; - JPanel centerPanel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 6); - innerthis.add(centerPanel); - JPanel southPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - innerthis.add(southPanel); - southPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 4, 20)); - ActionLabel actionLabel = new ActionLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr")); - southPanel.add(actionLabel, BorderLayout.EAST); - actionLabel.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - JDialog wDialog = createJDialog(); - wDialog.setVisible(true); - } - }); - } - - public void populate(JDBCDatabaseConnection jdbcDatabase) { - if (jdbcDatabase == null) { - jdbcDatabase = new JDBCDatabaseConnection(); - } - if (ComparatorUtils.equals(jdbcDatabase.getDriver(), "sun.jdbc.odbc.JdbcOdbcDriver") - && jdbcDatabase.getURL().startsWith("jdbc:odbc:Driver={Microsoft")) { - this.dbtypeComboBox.setSelectedItem("Access"); - } else { - Iterator> jdbc = jdbcMap.entrySet().iterator(); - boolean out = false; - while (jdbc.hasNext()) { - Entry entry = jdbc.next(); - DriverURLName[] dus = entry.getValue(); - for (int i = 0, len = dus.length; i < len; i++) { - if (ComparatorUtils.equals(dus[i].getDriver(), jdbcDatabase.getDriver())) { - this.dbtypeComboBox.setSelectedItem(entry.getKey()); - out = true; - break; - } - } - if (out) { - break; - } - } - if (!out) { - this.dbtypeComboBox.setSelectedItem(OTHER_DB); - } - } - this.driverComboBox.setSelectedItem(jdbcDatabase.getDriver()); - this.urlTextField.setText(jdbcDatabase.getURL()); - this.userNameTextField.setText(jdbcDatabase.getUser()); - this.passwordTextField.setText(jdbcDatabase.getPassword()); - - DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr(); - if (dbcpAttr == null) { - dbcpAttr = new DBCPConnectionPoolAttr(); - jdbcDatabase.setDbcpAttr(dbcpAttr); - } - this.DBCP_INITIAL_SIZE.setValue(dbcpAttr.getInitialSize()); - this.DBCP_MAX_ACTIVE.setValue(dbcpAttr.getMaxActive()); - this.DBCP_MAX_IDLE.setValue(dbcpAttr.getMaxIdle()); - this.DBCP_MAX_WAIT.setValue(dbcpAttr.getMaxWait()); - this.DBCP_MIN_IDLE.setValue(dbcpAttr.getMinIdle()); - this.DBCP_VALIDATION_QUERY.setText(dbcpAttr.getValidationQuery()); - this.DBCP_TESTONBORROW.setSelectedIndex(dbcpAttr.isTestOnBorrow() ? 1 : 0); - this.DBCP_TESTONRETURN.setSelectedIndex(dbcpAttr.isTestOnReturn() ? 1 : 0); - this.DBCP_TESTWHILEIDLE.setSelectedIndex(dbcpAttr.isTestWhileIdle() ? 1 : 0); - this.DBCP_MINEVICTABLEIDLETIMEMILLIS.setValue(dbcpAttr.getMinEvictableIdleTimeMillis() / TIME_MULTIPLE); - this.DBCP_NUMTESTSPEREVICTIONRUN.setValue(dbcpAttr.getNumTestsPerEvictionRun()); - this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.setValue(dbcpAttr.getTimeBetweenEvictionRunsMillis()); - } - - public JDBCDatabaseConnection update() { - JDBCDatabaseConnection jdbcDatabase = new JDBCDatabaseConnection(); - Object driveItem = this.driverComboBox.getSelectedItem(); - jdbcDatabase.setDriver(driveItem == null ? null : driveItem.toString()); - jdbcDatabase.setURL(this.urlTextField.getText().trim()); - jdbcDatabase.setUser(this.userNameTextField.getText().trim()); - jdbcDatabase.setPassword(new String(this.passwordTextField.getPassword()).trim()); - - DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr(); - if (dbcpAttr == null) { - dbcpAttr = new DBCPConnectionPoolAttr(); - jdbcDatabase.setDbcpAttr(dbcpAttr); - } - dbcpAttr.setInitialSize(this.DBCP_INITIAL_SIZE.getValue().intValue()); - dbcpAttr.setMaxActive(this.DBCP_MAX_ACTIVE.getValue().intValue()); - dbcpAttr.setMaxIdle(this.DBCP_MAX_IDLE.getValue().intValue()); - dbcpAttr.setMaxWait(this.DBCP_MAX_WAIT.getValue().intValue()); - dbcpAttr.setMinIdle(this.DBCP_MIN_IDLE.getValue().intValue()); - dbcpAttr.setValidationQuery(this.DBCP_VALIDATION_QUERY.getText()); - dbcpAttr.setTestOnBorrow(this.DBCP_TESTONBORROW.getSelectedIndex() == 0 ? false : true); - dbcpAttr.setTestOnReturn(this.DBCP_TESTONRETURN.getSelectedIndex() == 0 ? false : true); - dbcpAttr.setTestWhileIdle(this.DBCP_TESTWHILEIDLE.getSelectedIndex() == 0 ? false : true); - dbcpAttr.setMinEvictableIdleTimeMillis(((Number) this.DBCP_MINEVICTABLEIDLETIMEMILLIS.getValue()).intValue() * TIME_MULTIPLE); - dbcpAttr.setNumTestsPerEvictionRun(((Number) this.DBCP_NUMTESTSPEREVICTIONRUN.getValue()).intValue()); - dbcpAttr.setTimeBetweenEvictionRunsMillis(((Number) this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.getValue()).intValue()); - - return jdbcDatabase; - } - - ActionListener dbtypeActionListener = new ActionListener() { - public void actionPerformed(ActionEvent evt) { - - urlTextField.setText(StringUtils.EMPTY); - driverComboBox.removeAllItems(); - if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) { - driverComboBox.setSelectedItem(StringUtils.EMPTY); - return; - } - - DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem()); - for (int i = 0, len = dus.length; i < len; i++) { - driverComboBox.addItem(dus[i].getDriver()); - if (i == 0) { - driverComboBox.setSelectedItem(dus[i].getDriver()); - urlTextField.setText(dus[i].getURL()); - } - } - } - }; - - ActionListener driverListener = new ActionListener() { - public void actionPerformed(ActionEvent e) { - if (driverComboBox.getSelectedItem() == null ||ComparatorUtils.equals(driverComboBox.getSelectedItem(), StringUtils.EMPTY)) { - return; - } - Iterator> jdbc = jdbcMap.entrySet().iterator(); - while (jdbc.hasNext()) { - Entry entry = jdbc.next(); - DriverURLName[] dus = entry.getValue(); - for (int i = 0, len = dus.length; i < len; i++) { - if (ComparatorUtils.equals(dus[i].getDriver(), (driverComboBox.getSelectedItem()))) { - urlTextField.setText(dus[i].getURL()); - return; - } - } - } - } - - }; - - ActionListener dbtypeButtonActionListener = new ActionListener() { - public void actionPerformed(ActionEvent evt) { - if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) { - return; - } - DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem()); - for (int i = 0, len = dus.length; i < len; i++) { - if (ComparatorUtils.equals(driverComboBox.getSelectedItem(), (dus[i].getDriver()))) { - urlTextField.setText(dus[i].getURL()); - if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), ("Access"))) { - // ben:这个能不能换种处理方案- - - JFileChooser filechooser = new JFileChooser(); - filechooser.setDialogTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Open")); - filechooser.setMultiSelectionEnabled(false); - filechooser.addChoosableFileFilter(new ChooseFileFilter(new String[]{"accdb", "mdb"}, "Microsoft Office Access")); - int result = filechooser.showOpenDialog(DesignerContext.getDesignerFrame()); - File selectedfile = null; - - if (result == JFileChooser.APPROVE_OPTION) { - selectedfile = filechooser.getSelectedFile(); - if (selectedfile != null) { - String selectedName = selectedfile.getPath().substring(selectedfile.getPath().lastIndexOf('.') + 1); - if (selectedName.equalsIgnoreCase("mdb") || selectedName.equalsIgnoreCase("accdb")) { - urlTextField.setText(urlTextField.getText() + selectedfile.getPath()); - } - } - } - } - break; - } - } - } - }; - - private JDialog createJDialog() { - return new DBCPAttrPane().showWindow(SwingUtilities.getWindowAncestor(JDBCDefPane.this)); - } - - class DBCPAttrPane extends BasicPane { - public DBCPAttrPane() { - JPanel defaultPane = this; - - // JPanel northFlowPane - JPanel northFlowPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - defaultPane.add(northFlowPane, BorderLayout.NORTH); - - DBCP_VALIDATION_QUERY.setColumns(15); - // ContextPane - - double f = TableLayout.FILL; - // double p = TableLayout.PREFERRED; - double[] rowSize = {f, f, f, f, f, f, f, f, f, f, f, f}; - double[] columnSize = {f, f}; - Component[][] comps = { - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Initial_Size") + ":", SwingConstants.RIGHT), DBCP_INITIAL_SIZE}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Active") + ":", SwingConstants.RIGHT), DBCP_MAX_ACTIVE}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Idle") + ":", SwingConstants.RIGHT), DBCP_MAX_IDLE}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Min_Idle") + ":", SwingConstants.RIGHT), DBCP_MIN_IDLE}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Max_Wait_Time") + ":" , SwingConstants.RIGHT), DBCP_MAX_WAIT}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Validation_Query") + ":", SwingConstants.RIGHT), DBCP_VALIDATION_QUERY}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Borrow") + ":", SwingConstants.RIGHT), DBCP_TESTONBORROW}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Return") + ":", SwingConstants.RIGHT), DBCP_TESTONRETURN}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_While_Idle") + ":", SwingConstants.RIGHT), DBCP_TESTWHILEIDLE}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Evictionruns_millis") + ":", SwingConstants.RIGHT), - DBCP_TIMEBETWEENEVICTIONRUNSMILLS}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Num_Test_Per_Evction_Run") + ":", SwingConstants.RIGHT), DBCP_NUMTESTSPEREVICTIONRUN}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Mix_Evictable_Idle_Time_Millis") + ":" , SwingConstants.RIGHT), - DBCP_MINEVICTABLEIDLETIMEMILLIS}}; - - JPanel contextPane = TableLayoutHelper.createGapTableLayoutPane(comps, rowSize, columnSize, 10, 4); - contextPane.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, UIConstants.LINE_COLOR)); - northFlowPane.add(contextPane); - } - - @Override - protected String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr"); - } - } - - private static class DriverURLName { - public DriverURLName(String driver, String url) { - this.driver = driver; - this.url = url; - } - - public String getDriver() { - return this.driver; - } - - public String getURL() { - return this.url; - } - - private String driver; - private String url; - } + private static final String OTHER_DB = "Others"; + + private static Map jdbcMap = new HashMap(); + + static { + jdbcMap.put(OTHER_DB, new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:"), + new DriverURLName("org.hsqldb.jdbcDriver", "jdbc:hsqldb:file:[PATH_TO_DB_FILES]"), new DriverURLName("com.inet.tds.TdsDriver", "jdbc:inetdae7:localhost:1433/"), + new DriverURLName("COM.cloudscape.JDBCDriver", "jdbc:cloudscape:/cloudscape/"), + new DriverURLName("com.internetcds.jdbc.tds.Driver", "jdbc:freetds:sqlserver://localhost/"), + new DriverURLName("com.fr.swift.jdbc.Driver", "jdbc:swift:emb://default")}); + jdbcMap.put("Inceptor", new DriverURLName[]{new DriverURLName("org.apache.hive.jdbc.HiveDriver", "jdbc:inceptor2://localhost:10000/default"), + new DriverURLName("org.apache.hadoop.hive.jdbc.HiveDriver", "jdbc:inceptor://localhost:10000/default")}); + jdbcMap.put("Oracle", new DriverURLName[]{new DriverURLName("oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@localhost:1521:databaseName")}); + jdbcMap.put("DB2", new DriverURLName[]{new DriverURLName("com.ibm.db2.jcc.DB2Driver", "jdbc:db2://localhost:50000/")}); + jdbcMap.put("SQL Server", new DriverURLName[]{new DriverURLName("com.microsoft.sqlserver.jdbc.SQLServerDriver", "jdbc:sqlserver://localhost:1433;" + "databaseName=")}); + jdbcMap.put("MySQL", new DriverURLName[]{new DriverURLName("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/"), + new DriverURLName("org.gjt.mm.mysql.Driver", "jdbc:mysql://localhost/")}); + jdbcMap.put("Sybase", new DriverURLName[]{new DriverURLName("com.sybase.jdbc2.jdbc.SybDriver", "jdbc:sybase:Tds:localhost:5000/")}); + jdbcMap.put("Access", new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=")}); + jdbcMap.put("Derby", new DriverURLName[]{new DriverURLName("org.apache.derby.jdbc.ClientDriver", "jdbc:derby://localhost:1527/")}); + jdbcMap.put("Postgre", new DriverURLName[]{new DriverURLName("org.postgresql.Driver", "jdbc:postgresql://localhost:5432/")}); + jdbcMap.put("SQLite", new DriverURLName[]{new DriverURLName("org.sqlite.JDBC", "jdbc:sqlite://${ENV_HOME}/../help/FRDemo.db")}); + } + + private UIButton dbtypeButton; + private UIComboBox dbtypeComboBox; + private UIComboBox driverComboBox; + private UITextField urlTextField; + private UITextField userNameTextField; + private JPasswordField passwordTextField; + private ActionLabel odbcTipsLink; + // 请不要改动dbtype,只应该最后添加 + private final String[] dbtype = {"Oracle", "DB2", "SQL Server", "MySQL", "Sybase", "Access", "Derby", "Postgre", "SQLite", "Inceptor", OTHER_DB}; + + // carl:DBCP的一些属性 + private IntegerEditor DBCP_INITIAL_SIZE = new IntegerEditor(); + private IntegerEditor DBCP_MAX_ACTIVE = new IntegerEditor(); + private IntegerEditor DBCP_MAX_IDLE = new IntegerEditor(); + private IntegerEditor DBCP_MIN_IDLE = new IntegerEditor(); + private IntegerEditor DBCP_MAX_WAIT = new IntegerEditor(); + private UITextField DBCP_VALIDATION_QUERY = new UITextField(); + + private UIComboBox DBCP_TESTONBORROW = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")}); + private UIComboBox DBCP_TESTONRETURN = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")}); + private UIComboBox DBCP_TESTWHILEIDLE = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")}); + + private IntegerEditor DBCP_TIMEBETWEENEVICTIONRUNSMILLS = new IntegerEditor(); + private IntegerEditor DBCP_NUMTESTSPEREVICTIONRUN = new IntegerEditor(); + private IntegerEditor DBCP_MINEVICTABLEIDLETIMEMILLIS = new IntegerEditor(); + + public JDBCDefPane() { + this.setBorder(UITitledBorder.createBorderWithTitle("JDBC" + ":")); + this.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); + JPanel innerthis = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + innerthis.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + this.add(innerthis); + dbtypeComboBox = new UIComboBox(); + dbtypeComboBox.setName(DRIVER_TYPE); + for (int i = 0; i < dbtype.length; i++) { + dbtypeComboBox.addItem(dbtype[i]); + } + dbtypeComboBox.addActionListener(dbtypeActionListener); + dbtypeComboBox.setMaximumRowCount(10); + + driverComboBox = new UIComboBox(); + driverComboBox.setEditable(true); + driverComboBox.addActionListener(driverListener); + urlTextField = new UITextField(15); + userNameTextField = new UITextField(15); + userNameTextField.setName(USER_NAME); + passwordTextField = new UIPassWordField(15); + dbtypeButton = new UIButton("."); + dbtypeButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Click_Get_Default_URL")); + dbtypeButton.addActionListener(dbtypeButtonActionListener); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + JPanel dbtypePane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + dbtypePane.add(new UILabel((com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database") + ":"))); + JPanel dbtypeComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + Component[][] dbtypeComComponents = {{dbtypeComboBox}}; + double[] dbtypeRowSize = {p}; + double[] dbtypeColumnSize = {p}; + dbtypeComPane = TableLayoutHelper.createTableLayoutPane(dbtypeComComponents, dbtypeRowSize, dbtypeColumnSize); + + JPanel driverPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + driverPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Driver") + ":")); + // 选择ODBC数据源的时候的提示链接 + JPanel odbcTipsPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + odbcTipsLink = new ActionLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Odbc_Tips")) { + @Override + public void paintComponent(Graphics _gfx) { + super.paintComponent(_gfx); + _gfx.setColor(Color.blue); + _gfx.drawLine(0, this.getHeight() - 1, GraphHelper.getWidth(this.getText()), this.getHeight() - 1); + } + }; + odbcTipsPane.add(odbcTipsLink); + odbcTipsLink.setPreferredSize(new Dimension(GraphHelper.getWidth(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Odbc_Tips")), odbcTipsLink.getPreferredSize().height)); + odbcTipsLink.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + String url = CloudCenter.getInstance().acquireUrlByKind("odbc.help"); + BrowseUtils.browser(url); + } + }); + + JPanel driverComboBoxAndTips = new JPanel(new BorderLayout()); + driverComboBoxAndTips.add(driverComboBox, BorderLayout.WEST); + driverComboBoxAndTips.add(odbcTipsPane, BorderLayout.CENTER); + + JPanel urlPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + urlPane.add(new UILabel("URL:")); + JPanel urlComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + Component[][] urlComComponents = {{urlTextField, dbtypeButton}}; + double[] urlRowSize = {p}; + double[] urlColumnSize = {f, 21}; + urlComPane = TableLayoutHelper.createCommonTableLayoutPane(urlComComponents, urlRowSize, urlColumnSize, 4); + + JPanel userPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + userPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_UserName") + ":")); + JPanel userComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + Component[][] userComComponents = {{userNameTextField, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Password") + ":"), passwordTextField}}; + double[] userRowSize = {p}; + double[] userColumnSize = {f, p, f}; + userComPane = TableLayoutHelper.createCommonTableLayoutPane(userComComponents, userRowSize, userColumnSize, 4); + + JPanel passwordPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + passwordPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Password") + ":")); + + Component[][] components = {{dbtypePane, dbtypeComPane}, {driverPane, driverComboBoxAndTips}, {urlPane, urlComPane}, {userPane, userComPane},}; + + double[] rowSize = {p, p, p, p}; + double[] columnSize = {p, f, 22}; + JPanel centerPanel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 6); + innerthis.add(centerPanel); + JPanel southPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + innerthis.add(southPanel); + southPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 4, 20)); + ActionLabel actionLabel = new ActionLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr")); + southPanel.add(actionLabel, BorderLayout.EAST); + actionLabel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + JDialog wDialog = createJDialog(); + wDialog.setVisible(true); + } + }); + } + + public void populate(JDBCDatabaseConnection jdbcDatabase) { + if (jdbcDatabase == null) { + jdbcDatabase = new JDBCDatabaseConnection(); + } + if (ComparatorUtils.equals(jdbcDatabase.getDriver(), "sun.jdbc.odbc.JdbcOdbcDriver") + && jdbcDatabase.getURL().startsWith("jdbc:odbc:Driver={Microsoft")) { + this.dbtypeComboBox.setSelectedItem("Access"); + } else { + Iterator> jdbc = jdbcMap.entrySet().iterator(); + boolean out = false; + while (jdbc.hasNext()) { + Entry entry = jdbc.next(); + DriverURLName[] dus = entry.getValue(); + for (int i = 0, len = dus.length; i < len; i++) { + if (ComparatorUtils.equals(dus[i].getDriver(), jdbcDatabase.getDriver())) { + this.dbtypeComboBox.setSelectedItem(entry.getKey()); + out = true; + break; + } + } + if (out) { + break; + } + } + if (!out) { + this.dbtypeComboBox.setSelectedItem(OTHER_DB); + } + } + this.driverComboBox.setSelectedItem(jdbcDatabase.getDriver()); + this.urlTextField.setText(jdbcDatabase.getURL()); + this.userNameTextField.setText(jdbcDatabase.getUser()); + this.passwordTextField.setText(jdbcDatabase.getPassword()); + + DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr(); + if (dbcpAttr == null) { + dbcpAttr = new DBCPConnectionPoolAttr(); + jdbcDatabase.setDbcpAttr(dbcpAttr); + } + this.DBCP_INITIAL_SIZE.setValue(dbcpAttr.getInitialSize()); + this.DBCP_MAX_ACTIVE.setValue(dbcpAttr.getMaxActive()); + this.DBCP_MAX_IDLE.setValue(dbcpAttr.getMaxIdle()); + this.DBCP_MAX_WAIT.setValue(dbcpAttr.getMaxWait()); + this.DBCP_MIN_IDLE.setValue(dbcpAttr.getMinIdle()); + this.DBCP_VALIDATION_QUERY.setText(dbcpAttr.getValidationQuery()); + this.DBCP_TESTONBORROW.setSelectedIndex(dbcpAttr.isTestOnBorrow() ? 1 : 0); + this.DBCP_TESTONRETURN.setSelectedIndex(dbcpAttr.isTestOnReturn() ? 1 : 0); + this.DBCP_TESTWHILEIDLE.setSelectedIndex(dbcpAttr.isTestWhileIdle() ? 1 : 0); + this.DBCP_MINEVICTABLEIDLETIMEMILLIS.setValue(dbcpAttr.getMinEvictableIdleTimeMillis() / TIME_MULTIPLE); + this.DBCP_NUMTESTSPEREVICTIONRUN.setValue(dbcpAttr.getNumTestsPerEvictionRun()); + this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.setValue(dbcpAttr.getTimeBetweenEvictionRunsMillis()); + } + + public JDBCDatabaseConnection update() { + JDBCDatabaseConnection jdbcDatabase = new JDBCDatabaseConnection(); + Object driveItem = this.driverComboBox.getSelectedItem(); + jdbcDatabase.setDriver(driveItem == null ? null : driveItem.toString()); + jdbcDatabase.setURL(this.urlTextField.getText().trim()); + jdbcDatabase.setUser(this.userNameTextField.getText().trim()); + jdbcDatabase.setPassword(new String(this.passwordTextField.getPassword()).trim()); + + DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr(); + if (dbcpAttr == null) { + dbcpAttr = new DBCPConnectionPoolAttr(); + jdbcDatabase.setDbcpAttr(dbcpAttr); + } + dbcpAttr.setInitialSize(this.DBCP_INITIAL_SIZE.getValue().intValue()); + dbcpAttr.setMaxActive(this.DBCP_MAX_ACTIVE.getValue().intValue()); + dbcpAttr.setMaxIdle(this.DBCP_MAX_IDLE.getValue().intValue()); + dbcpAttr.setMaxWait(this.DBCP_MAX_WAIT.getValue().intValue()); + dbcpAttr.setMinIdle(this.DBCP_MIN_IDLE.getValue().intValue()); + dbcpAttr.setValidationQuery(this.DBCP_VALIDATION_QUERY.getText()); + dbcpAttr.setTestOnBorrow(this.DBCP_TESTONBORROW.getSelectedIndex() == 0 ? false : true); + dbcpAttr.setTestOnReturn(this.DBCP_TESTONRETURN.getSelectedIndex() == 0 ? false : true); + dbcpAttr.setTestWhileIdle(this.DBCP_TESTWHILEIDLE.getSelectedIndex() == 0 ? false : true); + dbcpAttr.setMinEvictableIdleTimeMillis(((Number) this.DBCP_MINEVICTABLEIDLETIMEMILLIS.getValue()).intValue() * TIME_MULTIPLE); + dbcpAttr.setNumTestsPerEvictionRun(((Number) this.DBCP_NUMTESTSPEREVICTIONRUN.getValue()).intValue()); + dbcpAttr.setTimeBetweenEvictionRunsMillis(((Number) this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.getValue()).intValue()); + + return jdbcDatabase; + } + + ActionListener dbtypeActionListener = new ActionListener() { + public void actionPerformed(ActionEvent evt) { + + urlTextField.setText(StringUtils.EMPTY); + driverComboBox.removeAllItems(); + if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) { + driverComboBox.setSelectedItem(StringUtils.EMPTY); + return; + } + + DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem()); + for (int i = 0, len = dus.length; i < len; i++) { + driverComboBox.addItem(dus[i].getDriver()); + if (i == 0) { + driverComboBox.setSelectedItem(dus[i].getDriver()); + urlTextField.setText(dus[i].getURL()); + } + } + } + }; + + ActionListener driverListener = new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (driverComboBox.getSelectedItem() == null || ComparatorUtils.equals(driverComboBox.getSelectedItem(), StringUtils.EMPTY)) { + return; + } + odbcTipsLink.setVisible(ComparatorUtils.equals("sun.jdbc.odbc.JdbcOdbcDriver", driverComboBox.getSelectedItem())); // 选择的如果是ODBC就显示提示 + Iterator> jdbc = jdbcMap.entrySet().iterator(); + while (jdbc.hasNext()) { + Entry entry = jdbc.next(); + DriverURLName[] dus = entry.getValue(); + for (int i = 0, len = dus.length; i < len; i++) { + if (ComparatorUtils.equals(dus[i].getDriver(), (driverComboBox.getSelectedItem()))) { + urlTextField.setText(dus[i].getURL()); + return; + } + } + } + } + + }; + + ActionListener dbtypeButtonActionListener = new ActionListener() { + public void actionPerformed(ActionEvent evt) { + if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) { + return; + } + DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem()); + for (int i = 0, len = dus.length; i < len; i++) { + if (ComparatorUtils.equals(driverComboBox.getSelectedItem(), (dus[i].getDriver()))) { + urlTextField.setText(dus[i].getURL()); + if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), ("Access"))) { + // ben:这个能不能换种处理方案- - + JFileChooser filechooser = new JFileChooser(); + filechooser.setDialogTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Open")); + filechooser.setMultiSelectionEnabled(false); + filechooser.addChoosableFileFilter(new ChooseFileFilter(new String[]{"accdb", "mdb"}, "Microsoft Office Access")); + int result = filechooser.showOpenDialog(DesignerContext.getDesignerFrame()); + File selectedfile = null; + + if (result == JFileChooser.APPROVE_OPTION) { + selectedfile = filechooser.getSelectedFile(); + if (selectedfile != null) { + String selectedName = selectedfile.getPath().substring(selectedfile.getPath().lastIndexOf('.') + 1); + if (selectedName.equalsIgnoreCase("mdb") || selectedName.equalsIgnoreCase("accdb")) { + urlTextField.setText(urlTextField.getText() + selectedfile.getPath()); + } + } + } + } + break; + } + } + } + }; + + private JDialog createJDialog() { + return new DBCPAttrPane().showWindow(SwingUtilities.getWindowAncestor(JDBCDefPane.this)); + } + + class DBCPAttrPane extends BasicPane { + public DBCPAttrPane() { + JPanel defaultPane = this; + + // JPanel northFlowPane + JPanel northFlowPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + defaultPane.add(northFlowPane, BorderLayout.NORTH); + + DBCP_VALIDATION_QUERY.setColumns(15); + // ContextPane + + double f = TableLayout.FILL; + // double p = TableLayout.PREFERRED; + double[] rowSize = {f, f, f, f, f, f, f, f, f, f, f, f}; + double[] columnSize = {f, f}; + Component[][] comps = { + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Initial_Size") + ":", SwingConstants.RIGHT), DBCP_INITIAL_SIZE}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Active") + ":", SwingConstants.RIGHT), DBCP_MAX_ACTIVE}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Idle") + ":", SwingConstants.RIGHT), DBCP_MAX_IDLE}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Min_Idle") + ":", SwingConstants.RIGHT), DBCP_MIN_IDLE}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Max_Wait_Time") + ":", SwingConstants.RIGHT), DBCP_MAX_WAIT}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Validation_Query") + ":", SwingConstants.RIGHT), DBCP_VALIDATION_QUERY}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Borrow") + ":", SwingConstants.RIGHT), DBCP_TESTONBORROW}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Return") + ":", SwingConstants.RIGHT), DBCP_TESTONRETURN}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_While_Idle") + ":", SwingConstants.RIGHT), DBCP_TESTWHILEIDLE}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Evictionruns_millis") + ":", SwingConstants.RIGHT), + DBCP_TIMEBETWEENEVICTIONRUNSMILLS}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Num_Test_Per_Evction_Run") + ":", SwingConstants.RIGHT), DBCP_NUMTESTSPEREVICTIONRUN}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Mix_Evictable_Idle_Time_Millis") + ":", SwingConstants.RIGHT), + DBCP_MINEVICTABLEIDLETIMEMILLIS}}; + + JPanel contextPane = TableLayoutHelper.createGapTableLayoutPane(comps, rowSize, columnSize, 10, 4); + contextPane.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, UIConstants.LINE_COLOR)); + northFlowPane.add(contextPane); + } + + @Override + protected String title4PopupWindow() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr"); + } + } + + private static class DriverURLName { + public DriverURLName(String driver, String url) { + this.driver = driver; + this.url = url; + } + + public String getDriver() { + return this.driver; + } + + public String getURL() { + return this.url; + } + + private String driver; + private String url; + } } diff --git a/designer-base/src/main/java/com/fr/design/dialog/FineJOptionPane.java b/designer-base/src/main/java/com/fr/design/dialog/FineJOptionPane.java index 4a4424d9f5..c644550795 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/FineJOptionPane.java +++ b/designer-base/src/main/java/com/fr/design/dialog/FineJOptionPane.java @@ -1,6 +1,7 @@ package com.fr.design.dialog; import com.fr.invoke.Reflect; +import com.fr.stable.StringUtils; import javax.swing.Icon; import javax.swing.JDialog; @@ -279,8 +280,11 @@ public class FineJOptionPane extends JOptionPane { dialog.show(); dialog.dispose(); - Object value = pane.getInputValue(); + //点击取消按钮,返回null + if (StringUtils.equals((String) pane.getValue(), OPTION_OK_CANCEL[1])) + return null; + Object value = pane.getInputValue(); if (value == UNINITIALIZED_VALUE) { return null; } diff --git a/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java b/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java index 0e3f688970..2f30f70b97 100644 --- a/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java +++ b/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java @@ -1,16 +1,39 @@ package com.fr.design.env; +import com.fr.design.DesignerEnvManager; +import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; import com.fr.security.SecurityToolbox; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; +import com.fr.stable.project.ProjectConstants; import com.fr.stable.xml.XMLPrintWriter; import com.fr.stable.xml.XMLableReader; import com.fr.workspace.WorkContext; import com.fr.workspace.connect.WorkspaceConnectionInfo; +import java.util.HashSet; +import java.util.Set; + public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo { + private static final Set FILTER_SET = new HashSet<>(); + private static final String HTTPS = "https://"; + private static final String HTTP = "http://"; + private static final String DEFAULT_SERVLET_NAME = "decision"; + private static final String PATH = ProjectConstants.FORWARD_SLASH + ProjectConstants.WEBAPP_NAME + ProjectConstants.FORWARD_SLASH + DEFAULT_SERVLET_NAME; + private static final String HOST_NAME = "127.0.0.1"; + private static final String LOCAL_HOTS_NAME = "localhost"; + private static final String QUOTATION = ":"; + private static final String PORT = Integer.toString(DesignerEnvManager.getEnvManager().getEmbedServerPort()); + + static { + FILTER_SET.add(HTTP + HOST_NAME + QUOTATION + PORT + PATH); + FILTER_SET.add(HTTPS + HOST_NAME + QUOTATION + PORT + PATH); + FILTER_SET.add(HTTP + LOCAL_HOTS_NAME + QUOTATION + PORT + PATH); + FILTER_SET.add(HTTPS + LOCAL_HOTS_NAME + QUOTATION + PORT + PATH); + } + private String name; private String remindTime; @@ -109,6 +132,10 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo { @Override public boolean checkValid() { boolean result = false; + if (FILTER_SET.contains(connection.getUrl())) { + FineLoggerFactory.getLogger().error("url is same with local designer"); + return result; + } try { result = WorkContext.getConnector().testConnection(connection); } catch (Exception e) { diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java b/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java index 1d6e8c4836..1f8db99a00 100644 --- a/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java +++ b/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java @@ -1,10 +1,13 @@ package com.fr.design.extra.exe; +import com.fr.design.DesignerEnvManager; import com.fr.design.extra.PluginConstants; import com.fr.design.extra.Process; import com.fr.general.CloudCenter; -import com.fr.general.http.HttpClient; +import com.fr.general.http.HttpToolbox; +import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; +import java.util.Locale; /** * Created by vito on 16/5/16. @@ -28,14 +31,17 @@ public class GetPluginCategoriesExecutor implements Executor { @Override public void run(Process process) { - String url = CloudCenter.getInstance().acquireUrlByKind("shop.plugin.category"); + Locale locale = DesignerEnvManager.getEnvManager().getLanguage(); + String url = CloudCenter.getInstance().acquireUrlByKind("shop.plugin.category") + "&locale=" + locale.toString(); if (StringUtils.isNotEmpty(url)) { - HttpClient httpClient = new HttpClient(url); - result = httpClient.getResponseText(); - } else { - result = PluginConstants.CONNECTION_404; + try { + result = HttpToolbox.get(url); + return; + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } } - + result = PluginConstants.CONNECTION_404; } } }; diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java index 9259248ac6..96a82d228f 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java @@ -246,44 +246,69 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { } public class DoubleClick extends MouseAdapter { + String singlePressContent; + + String doublePressContent; + + @Override + public void mousePressed(MouseEvent e) { + int index = tipsList.getSelectedIndex(); + if (index != -1) { + if (e.getClickCount() == 1) { + singlePressContent = (String) listModel.getElementAt(index); + } else if (e.getClickCount() == 2) { + doublePressContent = (String) listModel.getElementAt(index); + } + } + } @Override - public void mouseClicked(MouseEvent e) { + public void mouseReleased(MouseEvent e) { int index = tipsList.getSelectedIndex(); if (index != -1) { - String currentLineContent = (String) listModel.getElementAt(index); - if (e.getClickCount() == 2) { - if (ifHasBeenWriten == 0) { - formulaTextArea.setForeground(Color.black); - formulaTextArea.setText(""); + if (e.getClickCount() == 1) { + if (ComparatorUtils.equals((String) listModel.getElementAt(index), singlePressContent)) { + singleClickActuator(singlePressContent); } - formulaTextArea.setForeground(Color.black); - currentPosition = formulaTextArea.getCaretPosition(); - String output = currentLineContent + "()"; - String textAll = formulaTextArea.getText(); - String textReplaced; - int position = 0; - if (insertPosition <= currentPosition) { - textReplaced = textAll.substring(0, insertPosition) + output + textAll.substring(currentPosition); - position = insertPosition + output.length() - 1; - } else { - textReplaced = textAll.substring(0, currentPosition) + output + textAll.substring(insertPosition); - position = currentPosition + output.length() - 1; + } else if (e.getClickCount() == 2) { + if (ComparatorUtils.equals((String) listModel.getElementAt(index), doublePressContent)) { + doubleClickActuator(doublePressContent); } - formulaTextArea.setText(textReplaced); - formulaTextArea.requestFocusInWindow(); - formulaTextArea.setCaretPosition(position); - insertPosition = position; - ifHasBeenWriten = 1; - listModel.removeAllElements(); - } else if (e.getClickCount() == 1) { - refreshDescriptionTextArea(currentLineContent); - - formulaTextArea.requestFocusInWindow(); - fixFunctionNameList(); } } } + + private void singleClickActuator(String currentLineContent) { + refreshDescriptionTextArea(currentLineContent); + formulaTextArea.requestFocusInWindow(); + fixFunctionNameList(); + } + + private void doubleClickActuator(String currentLineContent) { + if (ifHasBeenWriten == 0) { + formulaTextArea.setForeground(Color.black); + formulaTextArea.setText(""); + } + formulaTextArea.setForeground(Color.black); + currentPosition = formulaTextArea.getCaretPosition(); + String output = currentLineContent + "()"; + String textAll = formulaTextArea.getText(); + String textReplaced; + int position = 0; + if (insertPosition <= currentPosition) { + textReplaced = textAll.substring(0, insertPosition) + output + textAll.substring(currentPosition); + position = insertPosition + output.length() - 1; + } else { + textReplaced = textAll.substring(0, currentPosition) + output + textAll.substring(insertPosition); + position = currentPosition + output.length() - 1; + } + formulaTextArea.setText(textReplaced); + formulaTextArea.requestFocusInWindow(); + formulaTextArea.setCaretPosition(position); + insertPosition = position; + ifHasBeenWriten = 1; + listModel.removeAllElements(); + } } @Override diff --git a/designer-base/src/main/java/com/fr/design/fun/CellAttributeProvider.java b/designer-base/src/main/java/com/fr/design/fun/CellAttributeProvider.java index 227333cd08..82f7a81445 100644 --- a/designer-base/src/main/java/com/fr/design/fun/CellAttributeProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/CellAttributeProvider.java @@ -4,8 +4,10 @@ import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; import com.fr.stable.fun.mark.Immutable; /** + * 单元格属性面板扩展接口,接口基本逻辑不通且不符合接口设计规范,单元格属性扩展可以使用CellPropertyPaneProvider * Created by zhouping on 2015/11/11. */ +@Deprecated public interface CellAttributeProvider extends Immutable{ String MARK_STRING = "CellAttributeProvider"; diff --git a/designer-base/src/main/java/com/fr/design/fun/CellPropertyPaneProvider.java b/designer-base/src/main/java/com/fr/design/fun/CellPropertyPaneProvider.java new file mode 100644 index 0000000000..0100f4b2cf --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/CellPropertyPaneProvider.java @@ -0,0 +1,18 @@ +package com.fr.design.fun; + +import com.fr.design.cell.CellElementPropertyComponent; + +/** + * 单元格设置(属性)扩展接口 + * @author zack + * @version 10.0 + * Created by zack on 2020/7/14 + */ +public interface CellPropertyPaneProvider extends PropertyItemPaneProvider { + + /** + * 构造单元格属性面板,面板实现需要使用单例模式实现 + * @return 面板类 + */ + CellElementPropertyComponent getSingletonCelPropertyPane(); +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractCellPropertyPaneProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractCellPropertyPaneProvider.java new file mode 100644 index 0000000000..ba1c71d5f3 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractCellPropertyPaneProvider.java @@ -0,0 +1,15 @@ +package com.fr.design.fun.impl; + +import com.fr.design.fun.CellPropertyPaneProvider; +import com.fr.stable.fun.mark.API; + +/** + * Created by zhouping on 2015/11/11. + */ +@API(level = CellPropertyPaneProvider.CURRENT_LEVEL) +public abstract class AbstractCellPropertyPaneProvider extends AbstractPropertyItemPaneProvider implements CellPropertyPaneProvider { + + public int currentAPILevel() { + return CellPropertyPaneProvider.CURRENT_LEVEL; + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java index 747dbe32f0..04427b3378 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java @@ -9,12 +9,14 @@ import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; import com.fr.design.menu.ShortCut; +import com.fr.design.os.impl.PopupDialogSaveAction; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.widget.FRWidgetFactory; import com.fr.invoke.Reflect; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; import com.fr.stable.os.OperatingSystem; +import com.fr.stable.os.support.OSSupportCenter; import javax.swing.BorderFactory; import javax.swing.JComponent; @@ -273,6 +275,8 @@ abstract class UIControlPane extends JControlPane { } saveSettings(); setVisible(false); + PopupDialogSaveAction saveAction = OSSupportCenter.getAction(PopupDialogSaveAction.class); + saveAction.unregister(); } private void initListener() { diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java index 0dec124219..100daf511b 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java @@ -7,9 +7,11 @@ import com.fr.design.gui.ilist.JNameEdList; import com.fr.design.gui.ilist.ListModelElement; import com.fr.design.gui.ilist.UINameEdList; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.os.impl.PopupDialogSaveAction; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.ArrayUtils; import com.fr.stable.Nameable; +import com.fr.stable.os.support.OSSupportCenter; import javax.swing.DefaultListModel; import javax.swing.JList; @@ -216,6 +218,8 @@ public abstract class UIListControlPane extends UIControlPane implements ListCon ((PopupEditDialog)popupEditDialog).setTitle(getSelectedName()); } popupEditDialog.setVisible(true); + PopupDialogSaveAction osBasedAction = OSSupportCenter.getAction(PopupDialogSaveAction.class); + osBasedAction.register(this, popupEditDialog); } } diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java index 2a5c29d8c8..df07acf1ab 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java @@ -18,6 +18,10 @@ import java.awt.event.MouseMotionListener; */ public class UIEastResizableContainer extends JPanel { private static final long serialVersionUID = 1854340560790476907L; + + public static final int MAX_CONTAINER_WIDTH = 500; + public static final int MIN_CONTAINER_WIDTH = 286; + private int containerWidth = 240; private int preferredWidth = 240; private int topToolPaneHeight = 25; @@ -262,7 +266,13 @@ public class UIEastResizableContainer extends JPanel { @Override public void mouseDragged(MouseEvent e) { - // do nothing + containerWidth = UIEastResizableContainer.this.getWidth() + (UIEastResizableContainer.this.getLocationOnScreen().x - e.getXOnScreen()); + containerWidth = Math.min(containerWidth, MAX_CONTAINER_WIDTH); + containerWidth = Math.max(containerWidth, MIN_CONTAINER_WIDTH); + refreshContainer(); + if ( DesignModeContext.isAuthorityEditing()) { + DesignerContext.getDesignerFrame().doResize(); + } } }); addMouseListener(new MouseAdapter() { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 394dfca1e2..35ab552f51 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe; import com.fr.base.BaseUtils; +import com.fr.base.FRContext; import com.fr.base.vcs.DesignerMode; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; @@ -66,7 +67,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { private JPanel leftPane; private JPanel rightPane; private FixedPopupPane currentPopupPane; - private static final int CONTAINER_WIDTH = 286; + private static final int CONTAINER_WIDTH = containerWidth(); private static final int TAB_WIDTH = 38; private static final int TAB_BUTTON_WIDTH = 32; private static final int TAB_BUTTON_HEIGHT = 28; @@ -107,6 +108,13 @@ public class EastRegionContainerPane extends UIEastResizableContainer { private PropertyMode currentMode; // 当前模式(根据不同模式,显示不同的可用面板) + private static int containerWidth() { + if (FRContext.isChineseEnv()) { + return UIEastResizableContainer.MIN_CONTAINER_WIDTH; + } + return UIEastResizableContainer.MAX_CONTAINER_WIDTH; + } + /** * 得到实例 * @@ -219,8 +227,10 @@ public class EastRegionContainerPane extends UIEastResizableContainer { itemBean.getEnableModes()); UIButton button = propertyItem.getButton(); List buttonListeners = itemBean.getButtonListeners(); - for (ActionListener buttonListener : buttonListeners) { - button.addActionListener(buttonListener); + if (buttonListeners != null) { + for (ActionListener buttonListener : buttonListeners) { + button.addActionListener(buttonListener); + } } propertyItemMap.put(key, propertyItem); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfo.java b/designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfo.java index 4c546c4cd9..9025b98064 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfo.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfo.java @@ -54,6 +54,8 @@ public class ChartInfo extends AbstractPointInfo { private static final String ATTR_OVER_CHART_TYPE_COUNT = "overChartTypeCount"; private static final String ATTR_IS_NEW = "isNew"; private static final String ATTR_IS_REUSE = "isReuse"; + private static final String ATTR_AUTO_CHART_CREATE_TIME = "autoChartCreateTime"; + private static final String ATTR_AUTO_CHART_ENSURE_TIME = "autoChartEnsureTime"; private static final int COMPLETE_DAY_COUNT = 3; // 判断图表是否可以上传的天数 @@ -122,10 +124,10 @@ public class ChartInfo extends AbstractPointInfo { } public static ChartInfo newInstance(ChartProvider chartProvider) { - return newInstance(chartProvider, null, false, false); + return newInstance(chartProvider, null, false, false, false); } - public static ChartInfo newInstance(ChartProvider chartProvider, String createTime, boolean isNew, boolean isReuse) { + public static ChartInfo newInstance(ChartProvider chartProvider, String createTime, boolean isNew, boolean isReuse, boolean isAutoChart) { HashMap chartConsumingMap = new HashMap<>(); String username = MarketConfig.getInstance().getBbsUsername(); @@ -163,6 +165,13 @@ public class ChartInfo extends AbstractPointInfo { chartConsumingMap.put(ATTR_OVER_CHART_TYPE_COUNT, "0"); chartConsumingMap.put(ATTR_IS_NEW, String.valueOf(isNew)); chartConsumingMap.put(ATTR_IS_REUSE, String.valueOf(isReuse)); + if (isAutoChart) { + chartConsumingMap.put(ATTR_AUTO_CHART_CREATE_TIME, createTime); + chartConsumingMap.put(ATTR_AUTO_CHART_ENSURE_TIME, typeTime); + } else { + chartConsumingMap.put(ATTR_AUTO_CHART_CREATE_TIME, StringUtils.EMPTY); + chartConsumingMap.put(ATTR_AUTO_CHART_ENSURE_TIME, StringUtils.EMPTY); + } ChartInfo chartInfo = new ChartInfo(chartId, templateId, book); chartInfo.chartConsumingMap = chartConsumingMap; @@ -202,6 +211,9 @@ public class ChartInfo extends AbstractPointInfo { writer.attr(ATTR_OVER_CHART_TYPE_COUNT, chartConsumingMap.get(ATTR_OVER_CHART_TYPE_COUNT)); writer.attr(ATTR_IS_NEW, chartConsumingMap.get(ATTR_IS_NEW)); writer.attr(ATTR_IS_REUSE, chartConsumingMap.get(ATTR_IS_REUSE)); + writer.attr(ATTR_AUTO_CHART_CREATE_TIME, chartConsumingMap.get(ATTR_AUTO_CHART_CREATE_TIME)); + writer.attr(ATTR_AUTO_CHART_ENSURE_TIME, chartConsumingMap.get(ATTR_AUTO_CHART_ENSURE_TIME)); + writer.end(); chartConfigInfo.writeXML(writer); @@ -238,6 +250,8 @@ public class ChartInfo extends AbstractPointInfo { chartConsumingMap.put(ATTR_OVER_CHART_TYPE_COUNT, reader.getAttrAsString(ATTR_OVER_CHART_TYPE_COUNT, "0")); chartConsumingMap.put(ATTR_IS_NEW, reader.getAttrAsString(ATTR_IS_NEW, StringUtils.EMPTY)); chartConsumingMap.put(ATTR_IS_REUSE, reader.getAttrAsString(ATTR_IS_REUSE, StringUtils.EMPTY)); + chartConsumingMap.put(ATTR_AUTO_CHART_CREATE_TIME, reader.getAttrAsString(ATTR_AUTO_CHART_CREATE_TIME, StringUtils.EMPTY)); + chartConsumingMap.put(ATTR_AUTO_CHART_ENSURE_TIME, reader.getAttrAsString(ATTR_AUTO_CHART_ENSURE_TIME, StringUtils.EMPTY)); } if (ChartConfigInfo.XML_TAG.equals(name)) { this.chartConfigInfo = (ChartConfigInfo) reader.readXMLObject(new ChartConfigInfo()); @@ -276,6 +290,10 @@ public class ChartInfo extends AbstractPointInfo { } public void updateChartType(ChartProvider chartProvider) { + updateChartType(chartProvider, false); + } + + public void updateChartType(ChartProvider chartProvider, boolean isAutoChart) { String typeTime = DateTime.now().toString("yyyy-MM-dd HH:mm:ss"); chartConsumingMap.put(ATTR_CHART_TYPE_TIME, typeTime); @@ -285,6 +303,9 @@ public class ChartInfo extends AbstractPointInfo { String count = chartConsumingMap.get(ATTR_OVER_CHART_TYPE_COUNT); count = StringUtils.isEmpty(count) ? "1" : String.valueOf(Integer.parseInt(count) + 1); chartConsumingMap.put(ATTR_OVER_CHART_TYPE_COUNT, count); + if (isAutoChart) { + chartConsumingMap.put(ATTR_AUTO_CHART_ENSURE_TIME, typeTime); + } resetChartConfigInfo(chartProvider); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfoCollector.java b/designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfoCollector.java index 87dc8ca40f..cd651fc6b3 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfoCollector.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfoCollector.java @@ -12,6 +12,7 @@ import com.fr.stable.StringUtils; import com.fr.stable.xml.XMLPrintWriter; import com.fr.stable.xml.XMLableReader; import com.fr.third.joda.time.DateTime; + import java.util.HashMap; import java.util.Map; @@ -49,18 +50,22 @@ public class ChartInfoCollector extends AbstractPointCollector { } public void collection(ChartProvider chartProvider, String createTime) { - collection(chartProvider, createTime, false); + collection(chartProvider, createTime, false, false); + } + + public void collection(ChartProvider chartProvider, String createTime, boolean isReuse) { + collection(chartProvider, createTime, isReuse, false); } /** * 新建图表,保存状态 */ - public void collection(ChartProvider chartProvider, String createTime, boolean isReuse) { + public void collection(ChartProvider chartProvider, String createTime, boolean isReuse, boolean isAutoChart) { String chartId = chartProvider.getChartUuid(); if (!shouldCollectInfo() || StringUtils.isEmpty(chartId)) { return; } - ChartInfo chartInfo = ChartInfo.newInstance(chartProvider, createTime, true, isReuse); + ChartInfo chartInfo = ChartInfo.newInstance(chartProvider, createTime, true, isReuse, isAutoChart); chartInfoCacheMap.put(chartId, chartInfo); } @@ -116,6 +121,10 @@ public class ChartInfoCollector extends AbstractPointCollector { * 图表类型变化,更新类型和类型确认时间 */ public void updateChartTypeTime(ChartProvider chartProvider, String oldType) { + updateChartTypeTime(chartProvider, oldType, false); + } + + public void updateChartTypeTime(ChartProvider chartProvider, String oldType, boolean isAutoChart) { if (!shouldCollectInfo() || StringUtils.isEmpty(chartProvider.getChartUuid())) { return; } @@ -123,7 +132,7 @@ public class ChartInfoCollector extends AbstractPointCollector { ChartInfo chartInfo = getOrCreateChartInfo(chartProvider, oldType); //更新类型确认时间和类型 - chartInfo.updateChartType(chartProvider); + chartInfo.updateChartType(chartProvider, isAutoChart); //重置计数 chartInfo.resetIdleDayCount(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogHandlerBar.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogHandlerBar.java index 433d601c0c..eb9ba74c2e 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogHandlerBar.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogHandlerBar.java @@ -93,6 +93,7 @@ public class LogHandlerBar extends JPanel implements ItemSelectable { public void clearMessage() { INFONUM = ERRORNUM = SERVERNUM = 0; + LogMessageBar.getInstance().clear(); changeLabel(); } 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 8b3cedeef6..dc10d8883c 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 @@ -2,6 +2,7 @@ package com.fr.design.mainframe.loghandler; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ilable.UILabel; +import com.fr.stable.StringUtils; import javax.swing.JFrame; @@ -63,6 +64,11 @@ public class LogMessageBar extends JPanel { repaint(); } + public void clear() { + messageLabel.setText(StringUtils.EMPTY); + repaint(); + } + public void setLoggerBarWidth(int width) { this.width = width; } diff --git a/designer-base/src/main/java/com/fr/design/os/impl/PopupDialogSaveAction.java b/designer-base/src/main/java/com/fr/design/os/impl/PopupDialogSaveAction.java new file mode 100644 index 0000000000..019ee3d97e --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/os/impl/PopupDialogSaveAction.java @@ -0,0 +1,39 @@ +package com.fr.design.os.impl; + +import com.fr.design.gui.controlpane.UIListControlPane; +import com.fr.stable.os.OperatingSystem; +import com.fr.stable.os.support.OSBasedAction; + +import java.awt.*; + +/** + * linux下超链弹窗等保存问题 + * + * @author hades + * @version 10.0 + * Created by hades on 2020/7/21 + */ +public class PopupDialogSaveAction implements OSBasedAction { + + private UIListControlPane currentControlPane; + private Window popupDialog; + + @Override + public void execute(Object... objects) { + boolean canSave = OperatingSystem.isLinux() && popupDialog != null && popupDialog.isVisible() && currentControlPane != null; + if (canSave) { + currentControlPane.saveSettings(); + } + } + + public void register(UIListControlPane currentControlPane, Window popupDialog) { + this.currentControlPane = currentControlPane; + this.popupDialog = popupDialog; + } + + public void unregister() { + this.currentControlPane = null; + this.popupDialog = null; + } + +} diff --git a/designer-base/src/main/java/com/fr/design/os/impl/UpdateDialogAction.java b/designer-base/src/main/java/com/fr/design/os/impl/UpdateDialogAction.java index 64f8f21120..f71493cd6b 100644 --- a/designer-base/src/main/java/com/fr/design/os/impl/UpdateDialogAction.java +++ b/designer-base/src/main/java/com/fr/design/os/impl/UpdateDialogAction.java @@ -2,8 +2,6 @@ package com.fr.design.os.impl; import com.fr.design.mainframe.DesignerContext; import com.fr.design.update.ui.dialog.UpdateMainDialog; -import com.fr.design.utils.DesignUtils; -import com.fr.stable.os.OperatingSystem; import com.fr.stable.os.support.OSBasedAction; /** @@ -12,14 +10,10 @@ import com.fr.stable.os.support.OSBasedAction; * @date 2019/10/9 */ public class UpdateDialogAction implements OSBasedAction { - private static String UPDATE_ROUTE = "#management/backup"; + @Override public void execute(Object... objects) { - if(!OperatingSystem.isLinux()) { - UpdateMainDialog dialog = new UpdateMainDialog(DesignerContext.getDesignerFrame()); - dialog.showDialog(); - }else{ - DesignUtils.visitEnvServerByParameters( UPDATE_ROUTE,null,null); - } + UpdateMainDialog dialog = new UpdateMainDialog(DesignerContext.getDesignerFrame()); + dialog.showDialog(); } } 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 efeffa4e49..46d1b9165b 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 @@ -11,6 +11,7 @@ import com.fr.design.style.color.ColorSelectDialog; import com.fr.design.style.color.ColorSelectable; import com.fr.stable.AssistUtils; +import com.fr.stable.os.OperatingSystem; import javax.swing.JComponent; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -124,14 +125,20 @@ public class GradientBar extends JComponent implements UIObserver, ColorSelectab protected void addMouseDragListener() { this.addMouseMotionListener(new MouseAdapter() { public void mouseDragged(MouseEvent e) { - + int oldIndex = index; for (int i = 0; i < list.size(); i++) { if (list.get(i).contains(e.getX(), e.getY())) { index = i; break; } } - + if(OperatingSystem.isLinux() && AssistUtils.equals(oldIndex,index)){ + if(Math.abs(p1.getX() - e.getX()) > Math.abs(p2.getX() - e.getX())){ + index = 1; + }else{ + index = 0; + } + } boolean x = e.getX() <= max && e.getX() >= min; if (x && e.getY() < MAX_VERTICAL) { list.get(index).setX(e.getX()); diff --git a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java index 5a9396da64..9f5c7fbaa9 100644 --- a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java @@ -27,6 +27,7 @@ import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.DesignerContext; import com.fr.design.style.color.ColorCell; import com.fr.design.style.color.ColorFactory; import com.fr.design.style.color.ColorSelectBox; @@ -387,29 +388,35 @@ public final class GUICoreUtils { * @param y y坐标 */ public static void showPopupMenu(JPopupMenu popup, Component parentComponent, int x, int y) { - if (popup == null) {// check null. - return; - } - - Point point = new Point(x, y); - SwingUtilities.convertPointToScreen(point, parentComponent); - - Dimension size = popup.getPreferredSize(); - Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); - screen.setSize(screen.getSize().width, screen.height - HEIGHT_GAP); - - // peter:调整X的高度. - if (point.x + size.width > screen.width && size.width < screen.width) { - x += (screen.width - point.x - size.width); - } - - // peter:调整y高度. - if (point.y + size.height > screen.height && size.height < screen.height) { - y -= size.height; - } - - popup.show(parentComponent, x, y); - } + if (popup == null) {// check null. + return; + } + + Point point = new Point(x, y); + SwingUtilities.convertPointToScreen(point, parentComponent); + + Dimension size = popup.getPreferredSize(); + Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); + screen.setSize(screen.getSize().width, screen.height - HEIGHT_GAP); + //父元素右边界的坐标 + int parentComponentRightBorderPosition = parentComponent.getLocationOnScreen().x + parentComponent.getWidth(); + //设计器右边界的坐标 + Rectangle rectangle = DesignerContext.getDesignerFrame().getBounds(); + int designerRightBorderPosition = rectangle.x + rectangle.width; + rectangle = SwingUtilities.getWindowAncestor(parentComponent).getBounds(); + designerRightBorderPosition = Math.max(designerRightBorderPosition, rectangle.x + rectangle.width); + // peter:调整X的高度. + if (point.x + size.width > designerRightBorderPosition && size.width < designerRightBorderPosition) { + x += (parentComponentRightBorderPosition - point.x - size.width); + } + + // peter:调整y高度. + if (point.y + size.height > screen.height && size.height < screen.height) { + y -= size.height; + } + + popup.show(parentComponent, x, y); + } /** * Set enabled.
diff --git a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java index 96e722d116..43c3f43ad8 100644 --- a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java +++ b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java @@ -12,6 +12,7 @@ import com.fr.design.dialog.UIDialog; import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.design.env.DesignerWorkspaceType; import com.fr.design.file.HistoryTemplateListPane; +import com.fr.design.file.NodeAuthProcessor; import com.fr.design.fun.ReportSupportedFileUIProvider; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButtonUI; @@ -916,7 +917,8 @@ public class FILEChooserPane extends BasicPane { try { access = FRContext.getOrganizationOperator().canAccess(selectedFile.getPath()); if (selectedFile.isEnvFile() && selectedFile instanceof FileNodeFILE) { - access = access && ((FileNodeFILE) selectedFile).hasFullAuth(); + FileNodeFILE fileNodeFILE = ((FileNodeFILE) selectedFile); + access = access && fileNodeFILE.hasFullAuth() && NodeAuthProcessor.getInstance().checkFileNodeAuth(new FileNode(fileNodeFILE.getPath(), fileNodeFILE.isDirectory())); } } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); diff --git a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java index 33232c6601..e07daf93b4 100644 --- a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java +++ b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java @@ -73,6 +73,7 @@ public class FineEmbedServerActivator extends Activator { //覆盖tomcat的WebAppClassLoader context.setLoader(new FRTomcatLoader()); + //直接指定initializer,tomcat就不用再扫描一遍了 SpringServletContainerInitializer initializer = new SpringServletContainerInitializer(); Set> classes = new HashSet>(); diff --git a/designer-base/src/test/java/com/fr/design/data/BasicTableDataUtilsTest.java b/designer-base/src/test/java/com/fr/design/data/BasicTableDataUtilsTest.java index acd47a3c11..7391924ac2 100644 --- a/designer-base/src/test/java/com/fr/design/data/BasicTableDataUtilsTest.java +++ b/designer-base/src/test/java/com/fr/design/data/BasicTableDataUtilsTest.java @@ -1,6 +1,9 @@ package com.fr.design.data; +import com.fr.base.TableData; +import com.fr.data.TableDataSource; import junit.framework.TestCase; +import org.easymock.EasyMock; import org.junit.Assert; import org.junit.Test; @@ -41,4 +44,26 @@ public class BasicTableDataUtilsTest extends TestCase { Assert.assertFalse(result12); } -} \ No newline at end of file + + @Test + public void testGetTableDataName() { + TableDataSource source = EasyMock.mock(TableDataSource.class); + TableData tableData = EasyMock.mock(TableData.class); + EasyMock.expect(source.getTableData("ds1")).andReturn(tableData).anyTimes(); + EasyMock.expect(source.getTableData("test-ds1")).andReturn(tableData).anyTimes(); + EasyMock.expect(source.getTableData("test-ds11")).andReturn(null).anyTimes(); + EasyMock.replay(source, tableData); + Assert.assertEquals("test-ds1", BasicTableDataUtils.getTableDataName(true, source, "ds1", "test", false)); + Assert.assertEquals("test-ds11", BasicTableDataUtils.getTableDataName(false, source, "ds1", "test", false)); + + source = EasyMock.mock(TableDataSource.class); + EasyMock.expect(source.getTableData("ds1")).andReturn(null).anyTimes(); + EasyMock.expect(source.getTableData("test-ds1")).andReturn(null).anyTimes(); + EasyMock.replay(source); + Assert.assertEquals("test-ds1", BasicTableDataUtils.getTableDataName(true, source, "ds1", "test", false)); + Assert.assertEquals("ds1", BasicTableDataUtils.getTableDataName(false, source, "ds1", "test", false)); + Assert.assertEquals("test-ds1", BasicTableDataUtils.getTableDataName(false, source, "ds1", "test", true)); + + } + +} diff --git a/designer-base/src/test/java/com/fr/design/env/RemoteDesignerWorkspaceInfoTest.java b/designer-base/src/test/java/com/fr/design/env/RemoteDesignerWorkspaceInfoTest.java new file mode 100644 index 0000000000..54dbae3b02 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/env/RemoteDesignerWorkspaceInfoTest.java @@ -0,0 +1,25 @@ +package com.fr.design.env; + +import com.fr.workspace.connect.WorkspaceConnectionInfo; +import junit.framework.TestCase; +import org.junit.Assert; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2020/7/15 + */ +public class RemoteDesignerWorkspaceInfoTest extends TestCase { + + public void testCheckValid() { + RemoteDesignerWorkspaceInfo workspaceInfo0 = RemoteDesignerWorkspaceInfo.create(new WorkspaceConnectionInfo("http://localhost:8075/webroot/decision", "admin", "123", "", "", true)); + RemoteDesignerWorkspaceInfo workspaceInfo1 = RemoteDesignerWorkspaceInfo.create(new WorkspaceConnectionInfo("http://127.0.0.1:8075/webroot/decision", "admin", "123", "", "", true)); + RemoteDesignerWorkspaceInfo workspaceInfo2 = RemoteDesignerWorkspaceInfo.create(new WorkspaceConnectionInfo("https://127.0.0.1:8075/webroot/decision", "admin", "123", "", "", true)); + RemoteDesignerWorkspaceInfo workspaceInfo3 = RemoteDesignerWorkspaceInfo.create(new WorkspaceConnectionInfo("https://localhost:8075/webroot/decision", "admin", "123", "", "", true)); + Assert.assertFalse(workspaceInfo0.checkValid()); + Assert.assertFalse(workspaceInfo1.checkValid()); + Assert.assertFalse(workspaceInfo2.checkValid()); + Assert.assertFalse(workspaceInfo3.checkValid()); + } + +} diff --git a/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java b/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java index 8480d24647..b50c740a32 100644 --- a/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java +++ b/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java @@ -49,6 +49,7 @@ import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.PiePlot4VanChart; import com.fr.plugin.chart.area.VanChartAreaPlot; +import com.fr.plugin.chart.box.VanChartBoxPlot; import com.fr.plugin.chart.bubble.VanChartBubblePlot; import com.fr.plugin.chart.column.VanChartColumnPlot; import com.fr.plugin.chart.custom.VanChartCustomPlot; @@ -79,6 +80,7 @@ import com.fr.stable.StringUtils; import com.fr.stable.plugin.ExtraChartDesignClassManagerProvider; import com.fr.van.chart.area.AreaIndependentVanChartInterface; import com.fr.van.chart.bar.BarIndependentVanChartInterface; +import com.fr.van.chart.box.BoxIndependentVanChartInterface; import com.fr.van.chart.bubble.BubbleIndependentVanChartInterface; import com.fr.van.chart.column.VanColumnChartTypeUI; import com.fr.van.chart.custom.CustomIndependentVanChartInterface; @@ -202,6 +204,7 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr addChartTypeInterface(VAN_CHART_PRIORITY, VanChartWordCloudPlot.WORD_CLOUD_PLOT_ID, new WordCloudIndependentVanChartInterface()); addChartTypeInterface(VAN_CHART_PRIORITY, VanChartGanttPlot.VAN_CHART_GANTT_PLOT_ID, new GanttIndependentVanChartInterface()); addChartTypeInterface(VAN_CHART_PRIORITY, VanChartStructurePlot.STRUCTURE_PLOT_ID, new VanStructureChartTypeUI()); + addChartTypeInterface(VAN_CHART_PRIORITY, VanChartBoxPlot.VAN_CHART_BOX_PLOT_ID, new BoxIndependentVanChartInterface()); } diff --git a/designer-chart/src/main/java/com/fr/design/chart/AutoChartDialog.java b/designer-chart/src/main/java/com/fr/design/chart/AutoChartDialog.java index ddf4a0b407..34dacfa902 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/AutoChartDialog.java +++ b/designer-chart/src/main/java/com/fr/design/chart/AutoChartDialog.java @@ -7,6 +7,9 @@ import com.fr.chartx.TwoTuple; import com.fr.design.i18n.Toolkit; import com.fr.plugin.chart.vanchart.VanChart; +import javax.swing.JList; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; import java.awt.Component; import java.awt.Dialog; import java.awt.Frame; @@ -33,14 +36,22 @@ public class AutoChartDialog extends ChartDialog { protected Component initCenterPane() { autoChartTypePane = new AutoChartTypePane(); + getOk().setEnabled(false); + + autoChartTypePane.registsListAction(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + getOk().setEnabled(((JList) e.getSource()).getSelectedIndex() >= 0); + } + }); return autoChartTypePane; } - protected ActionListener getActionListener() { + protected ActionListener getActionListener(final String createTime) { return new ActionListener() { public void actionPerformed(ActionEvent e) { ChartCollection chartCollection = (ChartCollection) getChartCollection(); - autoChartTypePane.update(chartCollection); + autoChartTypePane.update(chartCollection, createTime); if (chartCollection.getChartCount() > 0) { doOK(); } else { diff --git a/designer-chart/src/main/java/com/fr/design/chart/AutoChartIcon.java b/designer-chart/src/main/java/com/fr/design/chart/AutoChartIcon.java index b85e2194c1..6e347d34b0 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/AutoChartIcon.java +++ b/designer-chart/src/main/java/com/fr/design/chart/AutoChartIcon.java @@ -66,7 +66,7 @@ public class AutoChartIcon implements Icon { public void paintIcon(Component c, Graphics g, int x, int y) { BaseChartPainter painter = chartCollection.createResultChartPainterWithOutDealFormula(Calculator.createCalculator(), - WebChartIDInfo.createEmptyDesignerInfo(), getIconWidth(), getIconHeight()); + WebChartIDInfo.createAutoTypeInfo(), getIconWidth(), getIconHeight()); int resolution = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getJTemplateResolution(); diff --git a/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java b/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java index b546a330b5..b7974fb6e9 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java @@ -2,28 +2,42 @@ package com.fr.design.chart; import com.fr.base.chart.chartdata.CallbackEvent; import com.fr.chart.chartattr.ChartCollection; -import com.fr.chartx.attr.ChartProvider; +import com.fr.design.chart.auto.AutoTypeCalculate; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.TableDataComboBox; import com.fr.design.data.tabledata.wrapper.TableDataWrapper; +import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombocheckbox.UIComboCheckBox; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.iprogressbar.AutoProgressBar; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.chart.info.ChartInfoCollector; import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.GeneralUtils; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.chart.vanchart.VanChart; import javax.swing.BorderFactory; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JList; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.ListCellRenderer; +import javax.swing.SwingWorker; +import javax.swing.UIManager; +import javax.swing.event.ListSelectionListener; +import javax.swing.plaf.SplitPaneUI; +import javax.swing.plaf.basic.BasicSplitPaneUI; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CancellationException; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; @@ -46,6 +60,9 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent private TableDataComboBox tableNameComboBox; private UIComboCheckBox dataFieldBox; + private AutoProgressBar connectionBar; + private SwingWorker worker; + public AutoChartTypePane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); initButtonGroup(); @@ -62,10 +79,15 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent chartViewList.setCellRenderer(iconCellRenderer); JScrollPane subListPane = new JScrollPane(chartViewList); + subListPane.setBorder(BorderFactory.createTitledBorder(Toolkit.i18nText("Fine-Design_Chart_Recommended_Chart"))); + + JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, false, contentPane, subListPane); - JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, true, contentPane, subListPane); + SplitPaneUI ui = splitPane.getUI(); + if (ui instanceof BasicSplitPaneUI) { + ((BasicSplitPaneUI) ui).getDivider().setBorder(null); + } splitPane.setDividerLocation(60); - splitPane.setBorder(BorderFactory.createTitledBorder(Toolkit.i18nText("Fine-Design_Chart_M_Popup_Auto_Chart_Type"))); this.add(splitPane); } @@ -94,7 +116,7 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent JPanel tableDataPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); panel.add(tableDataPane); tableDataPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Chart_Table_Data") + ":")); - tableNameComboBox.setPreferredSize(new Dimension(96, 20)); + tableNameComboBox.setPreferredSize(new Dimension(126, 20)); tableDataPane.add(tableNameComboBox); JPanel areaNamePane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); @@ -102,6 +124,7 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent areaNamePane.add(new UILabel(Toolkit.i18nText("Fine-Design_Chart_Data_Field") + ":")); areaNamePane.add(dataFieldBox); panel.add(refreshButton); + panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); return panel; } @@ -136,6 +159,10 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent } } + public void registsListAction(ListSelectionListener listSelectionListener) { + chartViewList.addListSelectionListener(listSelectionListener); + } + private void refreshBox() { TableDataWrapper dataWrap = tableNameComboBox.getSelectedItem(); @@ -154,6 +181,7 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent refreshButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { + refreshButton.setEnabled(false); calculateAutoChart(); } }); @@ -161,7 +189,56 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent } private void calculateAutoChart() { - chartResultModel.clear(); + connectionBar = new AutoProgressBar(this, Toolkit.i18nText("Fine-Design_Chart_Generate_Recommended_Chart"), "", 0, 100) { + public void doMonitorCanceled() { + refreshButton.setEnabled(true); + worker.cancel(true); + } + }; + setWorker(); + worker.execute(); + } + + private void setWorker() { + + worker = new SwingWorker, Void>() { + protected List doInBackground() { + connectionBar.start(); + chartResultModel.clear(); + List columnList = new ArrayList<>(); + Object[] selectedValues = dataFieldBox.getSelectedValues(); + for (Object value : selectedValues) { + columnList.add(GeneralUtils.objectToString(value)); + } + List vanChartList = AutoTypeCalculate.calculateType(tableNameComboBox.getSelectedItem().getTableDataName(), columnList); + connectionBar.close(); + return vanChartList; + } + + public void done() { + try { + List vanChartList = get(); + if (vanChartList != null && !vanChartList.isEmpty()) { + for (VanChart vanChart : vanChartList) { + ChartCollection chartCollection = new ChartCollection(vanChart); + AutoChartIcon autoChartIcon = new AutoChartIcon(chartCollection); + autoChartIcon.registerCallBackEvent(AutoChartTypePane.this); + chartResultModel.addElement(autoChartIcon); + } + chartViewList.setSelectedIndex(0); + } + } catch (Exception e) { + if (!(e instanceof CancellationException)) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + FineJOptionPane.showMessageDialog(AutoChartTypePane.this, e.getMessage(), + Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon")); + } + } finally { + connectionBar.close(); + refreshButton.setEnabled(true); + } + } + }; } @Override @@ -171,16 +248,7 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent @Override public void update(ChartCollection cc) { - if (chartViewList.getSelectedIndex() < 0) { - return; - } - AutoChartIcon chartIcon = (AutoChartIcon) chartViewList.getSelectedValue(); - ChartProvider chartProvider = chartIcon.getChartCollection().getSelectedChartProvider(ChartProvider.class); - if (cc.getChartCount() > 0) { - cc.setSelectChart(chartProvider); - } else { - cc.addChart(chartProvider); - } + update(cc, null); } public void populate(String tableName, String[] dataFields) { @@ -190,6 +258,30 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent map.put(dataField, true); } dataFieldBox.setSelectedValues(map); + if (refreshButton.isEnabled()) { + refreshButton.setEnabled(false); + calculateAutoChart(); + } + } + + public void update(ChartCollection cc, String createTime) { + if (chartViewList.getSelectedIndex() < 0) { + return; + } + AutoChartIcon chartIcon = (AutoChartIcon) chartViewList.getSelectedValue(); + VanChart vanChart = chartIcon.getChartCollection().getSelectedChartProvider(VanChart.class); + if (cc.getChartCount() > 0) { + VanChart selectedChartProvider = cc.getSelectedChartProvider(VanChart.class); + if (selectedChartProvider.getChartUuid() != null) { + vanChart.setUuid(selectedChartProvider.getChartUuid()); + } + cc.setSelectChart(vanChart); + ChartInfoCollector.getInstance().updateChartTypeTime(vanChart, null, true); + } else { + cc.addChart(vanChart); + //记录埋点 + ChartInfoCollector.getInstance().collection(vanChart, createTime, false, true); + } } @Override 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 9251bdbc88..4cd00e5772 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 @@ -31,7 +31,6 @@ public class ChartDialog extends MiddleChartDialog { private UIButton ok; private UIButton cancel; private ChartTypePane chartTypePane; - private String createTime; public ChartDialog(Frame owner) { super(owner); @@ -44,11 +43,14 @@ public class ChartDialog extends MiddleChartDialog { } private void initComponent() { - createTime = DateTime.now().toString("yyyy-MM-dd HH:mm:ss"); + String createTime = DateTime.now().toString("yyyy-MM-dd HH:mm:ss"); this.setModal(true); this.setLayout(new BorderLayout()); setTitle(getDialogTitle()); + ok = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_OK")); + cancel = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Cancel")); + this.applyClosingAction(); this.applyEscapeAction(); this.setBasicDialogSize(BasicDialog.DEFAULT); @@ -58,10 +60,7 @@ public class ChartDialog extends MiddleChartDialog { buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); this.add(buttonPane, BorderLayout.SOUTH); - ok = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_OK")); - cancel = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Cancel")); - - ok.addActionListener(getActionListener()); + ok.addActionListener(getActionListener(createTime)); cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doCancel(); @@ -83,7 +82,7 @@ public class ChartDialog extends MiddleChartDialog { return chartTypePane; } - protected ActionListener getActionListener() { + protected ActionListener getActionListener(final String createTime) { return new ActionListener() { public void actionPerformed(ActionEvent e) { chartTypePane.update((ChartCollection) cc, createTime); @@ -92,6 +91,11 @@ public class ChartDialog extends MiddleChartDialog { }; } + + public UIButton getOk() { + return ok; + } + /** * 不处理 */ diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/AutoTypeCalculate.java b/designer-chart/src/main/java/com/fr/design/chart/auto/AutoTypeCalculate.java new file mode 100644 index 0000000000..db20af8cfb --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chart/auto/AutoTypeCalculate.java @@ -0,0 +1,143 @@ +package com.fr.design.chart.auto; + +import com.fr.chart.auto.ColumnInfo; +import com.fr.chart.auto.strategy.AutoTypeStrategy; +import com.fr.chart.auto.strategy.imp.AvaStrategy; +import com.fr.chart.auto.strategy.imp.BubbleChartStrategy; +import com.fr.chart.auto.strategy.imp.SingleDimensionStrategy; +import com.fr.chart.auto.strategy.imp.SingleTargetStrategy; +import com.fr.data.TableDataSource; +import com.fr.data.TableDataSourceTailor; +import com.fr.data.impl.EmbeddedTableData; +import com.fr.data.impl.NameTableData; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.general.ComparatorUtils; +import com.fr.general.GeneralUtils; +import com.fr.general.data.DataModel; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.chart.vanchart.VanChart; +import com.fr.script.Calculator; +import com.fr.stable.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2020-05-08 + */ +public class AutoTypeCalculate { + + public static List calculateType(String tableName, List columns) { + List columnValue = calculateField(tableName, columns); + if (columnValue.isEmpty()) { + return new ArrayList<>(); + } + + List dimensions = new ArrayList<>(); + List targets = new ArrayList<>(); + for (ColumnInfo field : columnValue) { + if (isTarget(field.getValues())) { + targets.add(field); + } else { + dimensions.add(field); + } + } + AutoTypeStrategy autoTypeStrategy = chooseStrategy(dimensions.size(), targets.size()); + return autoTypeStrategy.rankChart(tableName, dimensions, targets); + } + + private static AutoTypeStrategy chooseStrategy(int dimensionSize, int targetSize) { + if (dimensionSize == 0) { + //没有维度,并且只有一个指标,使用单指标匹配逻辑,大于1个指标,使用气泡图(散点图)匹配逻辑 + if (targetSize == 1) { + return new SingleTargetStrategy(); + } else { + return new BubbleChartStrategy(); + } + } else if (dimensionSize == 1) { + //1个维度,并且没有指标,使用单维度匹配,2~3个指标,使用气泡图(散点图)匹配逻辑,其余使用ava匹配 + if (targetSize == 0) { + return new SingleDimensionStrategy(); + } else if (targetSize == 2 || targetSize == 3) { + return new BubbleChartStrategy(); + } else { + return new AvaStrategy(); + } + } else { + //大与1个维度,并且没有指标,使用单维度匹配(循环),否则使用ava匹配 + if (targetSize == 0) { + return new SingleDimensionStrategy(); + } else { + return new AvaStrategy(); + } + } + } + + private static boolean isTarget(List values) { + for (String value : values) { + if (StringUtils.isEmpty(value)) { + continue; + } + Number number = GeneralUtils.string2Number(value); + if (number == null) { + return false; + } + } + return true; + } + + private static List calculateField(String tableName, List columns) { + NameTableData nameTableData = new NameTableData(tableName); + TableDataSource dataSource = TableDataSourceTailor.extractTableData(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getTarget()); + Calculator calculator = Calculator.createCalculator(); + calculator.setAttribute(TableDataSource.KEY, dataSource); + nameTableData.createTableData(calculator); + + EmbeddedTableData tableData; + try { + tableData = DesignTableDataManager.previewTableDataNeedInputParameters(dataSource, nameTableData, Integer.MAX_VALUE, false); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + return new ArrayList<>(); + } + + List originalData = new ArrayList<>(); + for (String column : columns) { + List columnData = getColumnData(tableData, column); + if (columnData != null && !columnData.isEmpty()) { + originalData.add(new ColumnInfo(column, columnData)); + } + } + return originalData; + } + + private static List getColumnData(EmbeddedTableData tableData, String columnName) { + List columnData = new ArrayList<>(); + + int colIndex = getColIndex(tableData, columnName); + if (colIndex == DataModel.COLUMN_NAME_NOT_FOUND) { + return columnData; + } + + int size = tableData.getRowCount(); + for (int i = 0; i < size; i++) { + Object valueAt = tableData.getValueAt(i, colIndex); + columnData.add(GeneralUtils.objectToString(valueAt)); + } + return columnData; + } + + private static int getColIndex(EmbeddedTableData tableData, String columnName) { + int colIndex = 0; + + for (int count = tableData.getColumnCount(); colIndex < count; ++colIndex) { + if (ComparatorUtils.tableDataColumnNameEquals(tableData.getColumnName(colIndex), columnName)) { + return colIndex; + } + } + return DataModel.COLUMN_NAME_NOT_FOUND; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/combobox/ColorSchemeComboBox.java b/designer-chart/src/main/java/com/fr/design/chartx/component/combobox/ColorSchemeComboBox.java index e7a7ab929b..e09362cb64 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/combobox/ColorSchemeComboBox.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/combobox/ColorSchemeComboBox.java @@ -52,7 +52,7 @@ public class ColorSchemeComboBox extends UIComboBox { this.setRenderer(new ColorSchemeCellRenderer()); } - private Map getColorSchemesFromConfig() { + protected Map getColorSchemesFromConfig() { Map colorSchemes = new LinkedHashMap<>(); ChartPreStyleConfig config = ChartPreStyleConfig.getInstance(); @@ -92,7 +92,14 @@ public class ColorSchemeComboBox extends UIComboBox { } public void refresh() { - this.colorSchemes = getColorSchemesFromConfig(); + refresh(null); + } + + public void refresh(Map colorSchemes) { + if (colorSchemes == null) { + colorSchemes = getColorSchemesFromConfig(); + } + this.colorSchemes = colorSchemes; this.setModel(new DefaultComboBoxModel(colorSchemes.keySet().toArray())); } @@ -149,7 +156,7 @@ public class ColorSchemeComboBox extends UIComboBox { return colorSchemes.keySet(); } - public class ColorInfo { + public static class ColorInfo { private List colors; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java index b363dc5f6b..1fa61298a5 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java @@ -111,12 +111,15 @@ public class ChartTypePane extends AbstractChartAttrPane { autoButtonListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { + final String lastId = editingCollection.getSelectedChartProvider(ChartProvider.class).getID(); final MiddleChartDialog autoChartDialog = DesignModuleFactory.getAutoChartDialog(DesignerContext.getDesignerFrame()); autoChartDialog.populate(editingCollection); autoChartDialog.addDialogActionListener(new DialogActionAdapter() { @Override public void doOk() { populate(editingCollection); + ChartProvider chart = editingCollection.getSelectedChartProvider(ChartProvider.class); + reLayoutEditPane(chart, lastId); } }); autoChartDialog.setVisible(true); @@ -124,6 +127,17 @@ public class ChartTypePane extends AbstractChartAttrPane { }; } + private void reLayoutEditPane(ChartProvider chart, String lastChartId) { + String chartId = chart.getID(); + //chartID改变的话图表类型就算改变了 + if (StringUtils.isNotEmpty(chartId)) { + boolean isUseDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(chartId); + if (editPane.isDefaultPane() != isUseDefault || (!isUseDefault && !ComparatorUtils.equals(lastChartId, chartId))) { + editPane.reLayout(chart); + } + } + } + class ComboBoxPane extends UIComboBoxPane { private Map>> allChartTypePane; @@ -167,17 +181,7 @@ public class ChartTypePane extends AbstractChartAttrPane { //这一步会替换plot ((AbstractChartTypePane) getSelectedPane()).updateBean(chart); - String chartID = chart.getID(); - - //chartID改变的话图表类型就算改变了 - if (StringUtils.isNotEmpty(chartID)) { - - boolean isUseDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(chartID); - - if (editPane.isDefaultPane() != isUseDefault || (!isUseDefault && !ComparatorUtils.equals(lastPlotID, chartID))) { - editPane.reLayout(chart); - } - } + reLayoutEditPane(chart,lastPlotID); } protected UIComboBox createComboBox() { diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/ChartDataFilterPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/ChartDataFilterPane.java index 9db2fe7b21..fcd101fb15 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/ChartDataFilterPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/ChartDataFilterPane.java @@ -7,13 +7,13 @@ import com.fr.chart.chartattr.Plot; import com.fr.chart.chartdata.TopDefinition; import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.i18n.Toolkit; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.TableLayout; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.style.AbstractChartTabPane; import com.fr.design.mainframe.chart.gui.style.ThirdTabPane; - import com.fr.stable.StringUtils; import com.fr.van.chart.designer.TableLayout4VanChartHelper; @@ -50,6 +50,11 @@ public class ChartDataFilterPane extends ThirdTabPane { this.isNeedPresent = true; } + public ChartDataFilterPane(Plot plot, ChartDataPane parent, boolean isNeedPresent) { + super(plot, parent); + this.isNeedPresent = isNeedPresent; + } + protected void initTabPane() { super.initTabPane(); tabPane.setPreferredSize(new Dimension(221, 25)); @@ -109,7 +114,7 @@ public class ChartDataFilterPane extends ThirdTabPane { * @return 返回标题. */ public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_Filter"); + return Toolkit.i18nText("Fine-Design_Chart_Data_Filter"); } /** @@ -144,12 +149,17 @@ public class ChartDataFilterPane extends ThirdTabPane { } public void populateBean(ChartCollection collection, boolean isNeedPresent) { - relayoutPane(isNeedPresent); + TopDefinitionProvider topDefinition = collection.getSelectedChart().getFilterDefinition(); + populateDefinition(topDefinition, isNeedPresent); + } + + public void populateDefinition(TopDefinitionProvider topDefinition, boolean isNeedSummary) { + relayoutPane(isNeedSummary); if (categoryPane != null) { - categoryPane.populateBean(collection.getSelectedChart().getFilterDefinition()); + categoryPane.populateBean(topDefinition); } if (seriesPane != null) { - seriesPane.populateBean(collection.getSelectedChart().getFilterDefinition()); + seriesPane.populateBean(topDefinition); } checkBoxUse(); } @@ -165,11 +175,16 @@ public class ChartDataFilterPane extends ThirdTabPane { * 保存界面数据筛选. */ public void updateBean(ChartCollection collection) { + TopDefinitionProvider topDefinition = collection.getSelectedChart().getFilterDefinition(); + updateDefinition(topDefinition); + } + + public void updateDefinition(TopDefinitionProvider topDefinition) { if (categoryPane != null) { - categoryPane.updateBean(collection.getSelectedChart().getFilterDefinition()); + categoryPane.updateBean(topDefinition); } if (seriesPane != null) { - seriesPane.updateBean(collection.getSelectedChart().getFilterDefinition()); + seriesPane.updateBean(topDefinition); } } @@ -222,13 +237,13 @@ public class ChartDataFilterPane extends ThirdTabPane { } protected JPanel initOtherPane() { - onlyPreData = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Only_Use_Before_Records")); + onlyPreData = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Only_Use_Before_Records")); JPanel panel1 = new JPanel(new BorderLayout()); JPanel panel2 = new JPanel(new BorderLayout()); panel1.add(onlyPreData, BorderLayout.NORTH); preDataNum = new UITextField(); - UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Records_Num")); - combineOther = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_CombineOther")); + UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Records_Num")); + combineOther = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Data_CombineOther")); combineOther.setSelected(true); double p = TableLayout.PREFERRED; double f = TableLayout.FILL; @@ -244,7 +259,7 @@ public class ChartDataFilterPane extends ThirdTabPane { //默认不显示 preDataNumPane.setVisible(false); panel1.add(preDataNumPane, BorderLayout.CENTER); - notShowNull = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_Not_Show_Cate")); + notShowNull = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Data_Not_Show_Cate")); panel2.add(notShowNull, BorderLayout.NORTH); onlyPreData.addChangeListener(new ChangeListener() { @@ -258,7 +273,7 @@ public class ChartDataFilterPane extends ThirdTabPane { fire(); } }; - presentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Present") ,present); + presentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Style_Present") ,present); panel2.add(presentPane, BorderLayout.SOUTH); double[] column = {f}; @@ -281,7 +296,7 @@ public class ChartDataFilterPane extends ThirdTabPane { * 界面标题 "分类" */ public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Category"); + return Toolkit.i18nText("Fine-Design_Chart_Style_Category"); } /** @@ -397,13 +412,13 @@ public class ChartDataFilterPane extends ThirdTabPane { protected JPanel initOtherPane() { - onlyPreData = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Only_Use_Before_Records")); + onlyPreData = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Only_Use_Before_Records")); JPanel panel1 = new JPanel(new BorderLayout()); JPanel panel2 = new JPanel(new BorderLayout()); panel1.add(onlyPreData, BorderLayout.NORTH); preDataNum = new UITextField(); - UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Records_Num")); - combineOther = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_CombineOther")); + UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Records_Num")); + combineOther = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Data_CombineOther")); combineOther.setSelected(true); double p = TableLayout.PREFERRED; double f = TableLayout.FILL; @@ -419,7 +434,7 @@ public class ChartDataFilterPane extends ThirdTabPane { //默认不显示 preDataNumPane.setVisible(false); panel1.add(preDataNumPane, BorderLayout.CENTER); - notShowNull = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_Not_Show_Series")); + notShowNull = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Data_Not_Show_Series")); panel2.add(notShowNull, BorderLayout.NORTH); onlyPreData.addChangeListener(new ChangeListener() { @@ -433,7 +448,7 @@ public class ChartDataFilterPane extends ThirdTabPane { fire(); } }; - presentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Present") ,present); + presentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Style_Present") ,present); panel2.add(presentPane, BorderLayout.SOUTH); double[] column = {f}; @@ -457,7 +472,7 @@ public class ChartDataFilterPane extends ThirdTabPane { * 界面标题 */ public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Series"); + return Toolkit.i18nText("Fine-Design_Chart_Series"); } /** diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotTableDataContentPane.java index 8c988ce294..7d12e3e52d 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotTableDataContentPane.java @@ -11,6 +11,7 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; +import com.fr.design.i18n.Toolkit; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; @@ -28,24 +29,24 @@ import java.util.List; */ public class CategoryPlotTableDataContentPane extends AbstractTableDataContentPane{ private static final long serialVersionUID = 7284078589672079657L; - + protected UIComboBox categoryCombox; protected SeriesTypeUseComboxPane seriesTypeComboxPane; - + public CategoryPlotTableDataContentPane() { - + } - + public CategoryPlotTableDataContentPane(ChartDataPane parent) { - + categoryCombox = new UIComboBox(); JPanel categoryPane = new JPanel(new BorderLayout(4,0)); categoryPane.setBorder(BorderFactory.createMatteBorder(0, 0, 6, 1, getBackground())); - UILabel label1 = new BoldFontTextLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Category")) ; + UILabel label1 = new BoldFontTextLabel(Toolkit.i18nText("Fine-Design_Chart_Style_Category")) ; label1.setPreferredSize(new Dimension(ChartDataPane.LABEL_WIDTH,ChartDataPane.LABEL_HEIGHT)); categoryCombox.setPreferredSize(new Dimension(100,20)); - categoryCombox.addItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_None")); + categoryCombox.addItem(Toolkit.i18nText("Fine-Design_Chart_Use_None")); categoryPane.add(GUICoreUtils.createBorderLayoutPane(new Component[]{categoryCombox,null,null,label1,null})); categoryPane.setPreferredSize(new Dimension(246,30)); categoryPane.setBorder(BorderFactory.createEmptyBorder(0,24,10,15)); @@ -56,7 +57,7 @@ public class CategoryPlotTableDataContentPane extends AbstractTableDataContentPa this.add(getJSeparator()); seriesTypeComboxPane = new SeriesTypeUseComboxPane(parent, new Bar2DPlot()); this.add(seriesTypeComboxPane, BorderLayout.SOUTH); - + categoryCombox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { checkSeriseUse(categoryCombox.getSelectedItem() != null); @@ -64,7 +65,7 @@ public class CategoryPlotTableDataContentPane extends AbstractTableDataContentPa } }); } - + protected void makeToolTipUse(UIComboBox comBox) { if(comBox.getSelectedItem() != null) { comBox.setToolTipText(comBox.getSelectedItem().toString()); @@ -72,7 +73,7 @@ public class CategoryPlotTableDataContentPane extends AbstractTableDataContentPa comBox.setToolTipText(null); } } - + /** * 检查 某些Box是否可用 * @param hasUse 是否使用. @@ -81,16 +82,16 @@ public class CategoryPlotTableDataContentPane extends AbstractTableDataContentPa categoryCombox.setEnabled(hasUse); checkSeriseUse(hasUse); } - + protected void checkSeriseUse(boolean hasUse) { if(seriesTypeComboxPane != null) { seriesTypeComboxPane.checkUseBox(hasUse && categoryCombox.getSelectedItem() != null); } } - + protected void refreshBoxListWithSelectTableData(List list) { refreshBoxItems(categoryCombox, list); - categoryCombox.addItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_None")); + categoryCombox.addItem(Toolkit.i18nText("Fine-Design_Chart_Use_None")); seriesTypeComboxPane.refreshBoxListWithSelectTableData(list); } @@ -100,10 +101,10 @@ public class CategoryPlotTableDataContentPane extends AbstractTableDataContentPa */ public void clearAllBoxList(){ clearBoxItems(categoryCombox); - categoryCombox.addItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_None")); + categoryCombox.addItem(Toolkit.i18nText("Fine-Design_Chart_Use_None")); seriesTypeComboxPane.clearAllBoxList(); } - + /** * 保存界面内容到ChartCollection */ @@ -129,15 +130,15 @@ public class CategoryPlotTableDataContentPane extends AbstractTableDataContentPa public void populateBean(ChartCollection collection) { super.populateBean(collection); TopDefinition top = (TopDefinition)collection.getSelectedChart().getFilterDefinition(); - + if(!(top instanceof NormalTableDataDefinition)) { return; } NormalTableDataDefinition data = (NormalTableDataDefinition)top; - if(data == null || ComparatorUtils.equals(data.getCategoryName(), StringUtils.EMPTY)) { - categoryCombox.setSelectedItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_None")); - } else if(data!= null && !this.boxItemsContainsObject(categoryCombox,data.getCategoryName())){ + if(ComparatorUtils.equals(data.getCategoryName(), StringUtils.EMPTY)) { + categoryCombox.setSelectedItem(Toolkit.i18nText("Fine-Design_Chart_Use_None")); + } else if(!DataPaneHelper.boxItemsContainsObject(categoryCombox,data.getCategoryName())){ categoryCombox.setSelectedItem(null); }else { combineCustomEditValue(categoryCombox, data.getCategoryName()); @@ -146,20 +147,6 @@ public class CategoryPlotTableDataContentPane extends AbstractTableDataContentPa seriesTypeComboxPane.populateBean(collection,this.isNeedSummaryCaculateMethod()); } - private boolean boxItemsContainsObject(UIComboBox box,Object item){ - if(box == null){ - return false; - } - - ComboBoxModel dataModel = box.getModel(); - for (int i = 0; i < dataModel.getSize(); i++) { - if(ComparatorUtils.equals(dataModel.getElementAt(i),item)){ - return true; - } - } - return false; - } - /** * 重新布局整个面板 */ diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/DataPaneHelper.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/DataPaneHelper.java index 69cf88286f..7f5373c665 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/DataPaneHelper.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/DataPaneHelper.java @@ -7,6 +7,7 @@ import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; +import javax.swing.ComboBoxModel; import java.util.List; /** @@ -24,6 +25,30 @@ public class DataPaneHelper { box.refreshBoxItems(list); } + public static boolean boxItemsContainsObject(UIComboBox box, Object item) { + if (box == null) { + return false; + } + + ComboBoxModel dataModel = box.getModel(); + + for (int i = 0; i < dataModel.getSize(); i++) { + if (ComparatorUtils.equals(dataModel.getElementAt(i), item)) { + return true; + } + } + + return false; + } + + public static void combineCustomEditValue(UIComboBox comBox, String value) { + if(comBox != null) { + comBox.setEditable(true); + comBox.setSelectedItem(value); + comBox.setEditable(false); + } + } + /** * 清空box里所有东西 * diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldNamePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldNamePane.java index 0c643cf8c1..c6f4ac2041 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldNamePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldNamePane.java @@ -14,6 +14,7 @@ import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.itable.UITable; import com.fr.design.gui.itable.UITableEditor; import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.Toolkit; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; @@ -40,8 +41,15 @@ import java.util.List; * @version 创建时间:2012-12-26 下午04:39:46 */ public class SeriesNameUseFieldNamePane extends FurtherBasicBeanPane { - private static final String[] HEADS = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Field_Name"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Series_Name"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Summary_Method")}; - private static final String[] HEADS_NO_SUMMARY = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Field_Name"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Series_Name")}; + private static final String[] HEADS = { + Toolkit.i18nText("Fine-Design_Chart_Field_Name"), + Toolkit.i18nText("Fine-Design_Chart_Series_Name"), + Toolkit.i18nText("Fine-Design_Chart_Summary_Method")}; + + private static final String[] HEADS_NO_SUMMARY = { + Toolkit.i18nText("Fine-Design_Chart_Field_Name"), + Toolkit.i18nText("Fine-Design_Chart_Series_Name")}; + private UICorrelationPane seriesDataPane; private List field = new ArrayList(); private JPanel centerPane; @@ -62,7 +70,7 @@ public class SeriesNameUseFieldNamePane extends FurtherBasicBeanPane { private JPanel changeColorSetPane; private CardLayout cardLayout; - private UIButton accButton; - private UIButton gradientButton; + private UIButtonGroup groupButton; private ChartColorAdjustPane colorAdjustPane; private FixedGradientBar colorGradient; @@ -52,25 +52,22 @@ public class ChartPreFillStylePane extends BasicBeanPane { JPanel customPane = new JPanel(FRGUIPaneFactory.createBorderLayout()); - JPanel buttonPane = new JPanel(); - buttonPane.setLayout(new FlowLayout(FlowLayout.LEFT)); - buttonPane.add(accButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom_Color"))); - buttonPane.add(gradientButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Gradient_Color"))); - customPane.add(buttonPane, BorderLayout.NORTH); + groupButton = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_Custom_Color"), Toolkit.i18nText("Fine-Design_Chart_Gradient_Color")}); + groupButton.setSelectedIndex(0); + customPane.add(groupButton, BorderLayout.NORTH); changeColorSetPane = new JPanel(cardLayout = new CardLayout()); - changeColorSetPane.add(colorGradient = new FixedGradientBar(4, 130), "gradient"); + changeColorSetPane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); + changeColorSetPane.add(colorGradient = new FixedGradientBar(4, 150), "gradient"); changeColorSetPane.add(colorAdjustPane = new ChartColorAdjustPane(), "acc"); cardLayout.show(changeColorSetPane, "acc"); customPane.add(changeColorSetPane, BorderLayout.CENTER); - accButton.setSelected(true); - - customPane.setPreferredSize(new Dimension(200, 200)); - colorGradient.setPreferredSize(new Dimension(120, 30)); + customPane.setPreferredSize(new Dimension(155, 300)); + colorGradient.setPreferredSize(new Dimension(155, 30)); colorGradient.getSelectColorPointBtnP1().setColorInner(Color.WHITE); colorGradient.getSelectColorPointBtnP2().setColorInner(FixedGradientBar.NEW_CHARACTER); - + double p = TableLayout.PREFERRED; double[] columnSize = {p, p}; double[] rowSize = {p, p, p}; @@ -84,24 +81,20 @@ public class ChartPreFillStylePane extends BasicBeanPane { } private void initListener() { - - accButton.addActionListener(new ActionListener() { + groupButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - accButton.setSelected(true); - gradientButton.setSelected(false); - cardLayout.show(changeColorSetPane, "acc"); + checkCardPane(); } }); + } - gradientButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - gradientButton.setSelected(true); - accButton.setSelected(false); - cardLayout.show(changeColorSetPane, "gradient"); - } - }); + private void checkCardPane() { + if (groupButton.getSelectedIndex() == 0) { + cardLayout.show(changeColorSetPane, "acc"); + } else { + cardLayout.show(changeColorSetPane, "gradient"); + } } @Override @@ -117,8 +110,7 @@ public class ChartPreFillStylePane extends BasicBeanPane { boolean isGradient = condition.getGradient(); List colorList = condition.getColorList(); if (isGradient) { - gradientButton.setSelected(true); - accButton.setSelected(false); + groupButton.setSelectedIndex(1); cardLayout.show(changeColorSetPane, "gradient"); if (colorList.size() == 2) { @@ -127,8 +119,7 @@ public class ChartPreFillStylePane extends BasicBeanPane { colorGradient.repaint(); } } else { - accButton.setSelected(true); - gradientButton.setSelected(false); + groupButton.setSelectedIndex(0); cardLayout.show(changeColorSetPane, "acc"); if (colorList.isEmpty()) { @@ -148,7 +139,7 @@ public class ChartPreFillStylePane extends BasicBeanPane { List colorList = new ArrayList(); - if (gradientButton.isSelected()) { + if (groupButton.getSelectedIndex() == 1) { chartColorMatching.setGradient(true); Color start = colorGradient.getSelectColorPointBtnP1().getColorInner(); 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 new file mode 100644 index 0000000000..f2f5c3cf6f --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/module/ChartPreStyleListPane.java @@ -0,0 +1,142 @@ +package com.fr.design.module; + +import com.fr.base.ChartColorMatching; +import com.fr.base.ChartPreStyleConfig; +import com.fr.base.Utils; +import com.fr.design.beans.BasicBeanPane; +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; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2020-07-08 + */ +public class ChartPreStyleListPane extends JListControlPane { + + ChartPreStyleManagerPane chartPreStyleManagerPane; + + public ChartPreStyleListPane(ChartPreStyleManagerPane chartPreStyleManagerPane) { + super(); + this.chartPreStyleManagerPane = chartPreStyleManagerPane; + initListener(); + } + + /** + * 创建有名字的creator + * + * @return 有名字的creator数组 + */ + @Override + public NameableCreator[] createNameableCreators() { + return new NameableCreator[]{ + new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_PreStyle_Duplicate"), + ChartColorMatching.class, ChartPreStylePane.class) + }; + } + + @Override + protected String title4PopupWindow() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_PreStyle"); + } + + @Override + public BasicBeanPane createPaneByCreators(NameableCreator creator) { + return new ChartPreStylePane() { + @Override + protected void refreshWhenStyleChange(ChartColorMatching preStyle) { + super.refreshWhenStyleChange(preStyle); + chartPreStyleManagerPane.refreshDefaultColorBox(); + } + }; + } + + + protected ShortCut4JControlPane[] createShortcuts() { + return new ShortCut4JControlPane[]{ + shortCutFactory.addItemShortCut(), + createRemoveItemShortCut(), + shortCutFactory.copyItemShortCut(), + shortCutFactory.moveUpItemShortCut(), + shortCutFactory.moveDownItemShortCut(), + shortCutFactory.sortItemShortCut() + }; + } + + private ShortCut4JControlPane createRemoveItemShortCut() { + ShortCut4JControlPane shortCut4JControlPane = shortCutFactory.removeItemShortCut(); + //替换删除按钮的check事件。 + ShortCut shortCut = shortCut4JControlPane.getShortCut(); + shortCut4JControlPane = new MoreThanOneShortCut(shortCut); + 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(); + + Iterator keys = config.names(); + while (keys.hasNext()) { + Object key = keys.next(); + ChartColorMatching value = (ChartColorMatching) config.getPreStyle(key); + + list.add(new NameObject(Utils.objectToString(key), value)); + } + + 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(); + + for (Nameable value : values) { + config.putPreStyle(value.getName(), ((NameObject) value).getObject()); + } + } + + private class MoreThanOneShortCut extends ShortCut4JControlPane { + public MoreThanOneShortCut(ShortCut shortCut) { + this.shortCut = shortCut; + } + + + @Override + public void checkEnable() { + this.shortCut.setEnabled(nameableList.getModel().getSize() > 1); + } + } +} 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 abae5118b3..44b504ef3f 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 @@ -2,72 +2,114 @@ package com.fr.design.module; import com.fr.base.ChartColorMatching; import com.fr.base.ChartPreStyleConfig; -import com.fr.base.Utils; -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.chartx.component.combobox.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 java.util.ArrayList; +import javax.swing.JPanel; import java.util.Iterator; - +import java.util.LinkedHashMap; +import java.util.Map; +import java.awt.BorderLayout; +import java.awt.Dimension; /** * 图表预定义管理 界面, 在工具栏-服务器管理中. + * * @author kunsnat E-mail:kunsnat@gmail.com * @version 创建时间:2013-8-21 下午02:33:48 */ -public class ChartPreStyleManagerPane extends JListControlPane { - - @Override - /** - * 创建有名字的creator - * @return 有名字的creator数组 - */ - public NameableCreator[] createNameableCreators() { - return new NameableCreator[]{ - new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_PreStyle_Duplicate"), - ChartColorMatching.class, ChartPreStylePane.class) - }; - } - - @Override - protected String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_PreStyle"); - } - - public void populateBean() { - ChartPreStyleConfig config = ChartPreStyleConfig.getInstance().mirror(); - ArrayList list = new ArrayList(); - - Iterator keys = config.names(); - while(keys.hasNext()) { - Object key = keys.next(); - ChartColorMatching value = (ChartColorMatching) config.getPreStyle(key); - - list.add(new NameObject(Utils.objectToString(key), value)); - } - - 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(); - - config.setCurrentStyle(getSelectedName()); - - Nameable[] values = update(); - config.clearAllPreStyle(); - - for (Nameable value : values) { - config.putPreStyle(value.getName(), ((NameObject) value).getObject()); - } - } +public class ChartPreStyleManagerPane extends BasicPane { + + private ColorSchemeComboBox defaultColorBox; + + private ChartPreStyleListPane chartPreStyleListPane; + + public ChartPreStyleManagerPane() { + initComponent(); + } + + 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); + 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/design/module/ChartPreStylePane.java b/designer-chart/src/main/java/com/fr/design/module/ChartPreStylePane.java index 5bd4c38978..9cce2be7c3 100644 --- a/designer-chart/src/main/java/com/fr/design/module/ChartPreStylePane.java +++ b/designer-chart/src/main/java/com/fr/design/module/ChartPreStylePane.java @@ -80,7 +80,7 @@ public class ChartPreStylePane extends BasicBeanPane { } } - private void refreshWhenStyleChange(ChartColorMatching preStyle) { + protected void refreshWhenStyleChange(ChartColorMatching preStyle) { if(chartComponent != null) { demoPlot.setPlotFillStyle(ChartUtils.chartColorMatching2AttrFillStyle(preStyle)); chartComponent.reset(); diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/BoxIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/box/BoxIndependentVanChartInterface.java new file mode 100644 index 0000000000..cb08abcbd1 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/box/BoxIndependentVanChartInterface.java @@ -0,0 +1,97 @@ +package com.fr.van.chart.box; + +import com.fr.chart.chartattr.Chart; +import com.fr.chart.chartattr.Plot; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.TableLayout; +import com.fr.design.mainframe.chart.AbstractChartAttrPane; +import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.design.mainframe.chart.gui.ChartStylePane; +import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; +import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; +import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; +import com.fr.van.chart.box.data.BoxPlotReportDataContentPane; +import com.fr.van.chart.box.data.table.BoxPlotTableDataContentPane; +import com.fr.van.chart.designer.other.VanChartInteractivePane; +import com.fr.van.chart.designer.other.VanChartOtherPane; +import com.fr.van.chart.designer.other.zoom.ZoomPane; +import com.fr.van.chart.designer.style.VanChartStylePane; +import com.fr.van.chart.vanchart.AbstractIndependentVanChartUI; + +import java.awt.Component; + +public class BoxIndependentVanChartInterface extends AbstractIndependentVanChartUI { + + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_New_Box"); + } + + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_New_Box") + }; + } + + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/box.png" + }; + } + + public String getIconPath() { + return "com/fr/design/images/form/toolbar/box.png"; + } + + public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent) { + return new BoxPlotTableDataContentPane(plot, parent); + } + + public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent) { + return new BoxPlotReportDataContentPane(parent); + } + + public AbstractChartTypePane getPlotTypePane() { + return new VanChartBoxPlotPane(); + } + + public ConditionAttributesPane getPlotConditionPane(Plot plot) { + return new VanChartBoxConditionPane(plot); + } + + public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot) { + return new VanChartBoxSeriesPane(parent, plot); + } + + public AbstractChartAttrPane[] getAttrPaneArray(AttributeChangeListener listener) { + VanChartStylePane stylePane = new VanChartBoxStylePane(listener); + VanChartOtherPane otherPane = new VanChartOtherPane() { + + protected BasicBeanPane createInteractivePane() { + return new VanChartInteractivePane() { + + protected Component[][] createToolBarComponents() { + return new Component[][]{ + new Component[]{null, exportImages}, + new Component[]{null, fullScreenDisplay} + }; + } + + protected double[] getToolBarRowSize() { + double p = TableLayout.PREFERRED; + return new double[]{p, p}; + } + + protected ZoomPane createZoomPane() { + return new ZoomPane(); + } + }; + } + }; + + return new AbstractChartAttrPane[]{stylePane, otherPane}; + } + +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxConditionPane.java b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxConditionPane.java new file mode 100644 index 0000000000..c0412a9f38 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxConditionPane.java @@ -0,0 +1,53 @@ +package com.fr.van.chart.box; + +import com.fr.chart.base.AttrAlpha; +import com.fr.chart.base.AttrBackground; +import com.fr.chart.base.AttrBorder; +import com.fr.chart.chartattr.Plot; +import com.fr.design.chart.series.SeriesCondition.ChartConditionPane; +import com.fr.design.chart.series.SeriesCondition.DataSeriesConditionPane; +import com.fr.design.chart.series.SeriesCondition.LabelAlphaPane; +import com.fr.plugin.chart.box.VanChartBoxPlot; +import com.fr.plugin.chart.type.ConditionKeyType; +import com.fr.van.chart.column.VanChartColumnLabelBorderPane; +import com.fr.van.chart.designer.other.condition.item.VanChartColumnSeriesColorConditionPane; + +import java.awt.Dimension; + +public class VanChartBoxConditionPane extends DataSeriesConditionPane { + + public VanChartBoxConditionPane(Plot plot) { + super(plot); + } + + protected void initComponents() { + super.initComponents(); + + liteConditionPane.setPreferredSize(new Dimension(300, 400)); + } + + protected void addBasicAction() { + classPaneMap.put(AttrBackground.class, new VanChartColumnSeriesColorConditionPane(this)); + classPaneMap.put(AttrAlpha.class, new LabelAlphaPane(this)); + classPaneMap.put(AttrBorder.class, new VanChartColumnLabelBorderPane(this)); + } + + protected void addStyleAction() { + } + + protected ChartConditionPane createListConditionPane() { + + return new ChartConditionPane() { + + @Override + protected ConditionKeyType[] conditionKeyTypes() { + return ConditionKeyType.BOX_CONDITION_KEY_TYPES; + } + }; + } + + + public Class class4Correspond() { + return VanChartBoxPlot.class; + } +} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxPlotPane.java new file mode 100644 index 0000000000..2679f7eba4 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxPlotPane.java @@ -0,0 +1,45 @@ +package com.fr.van.chart.box; + +import com.fr.chart.chartattr.Chart; +import com.fr.chart.chartattr.Plot; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.chart.box.BoxIndependentVanChart; +import com.fr.plugin.chart.box.VanChartBoxPlot; +import com.fr.van.chart.designer.type.AbstractVanChartTypePane; + +public class VanChartBoxPlotPane extends AbstractVanChartTypePane { + + protected String[] getTypeIconPath() { + return new String[]{"/com/fr/van/chart/box.images/box.png" + }; + } + + protected Plot getSelectedClonedPlot() { + VanChartBoxPlot newPlot = null; + + Chart[] boxChartGroup = BoxIndependentVanChart.BoxVanChartTypes; + + for (int i = 0, len = boxChartGroup.length; i < len; i++) { + if (typeDemo.get(i).isPressing) { + newPlot = boxChartGroup[i].getPlot(); + } + } + + Plot cloned = null; + + try { + if (newPlot != null) { + cloned = (Plot) newPlot.clone(); + } + } catch (CloneNotSupportedException e) { + FineLoggerFactory.getLogger().error("Error In ColumnChart"); + } + + return cloned; + } + + public Chart getDefaultChart() { + return BoxIndependentVanChart.BoxVanChartTypes[0]; + } + +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxPlotTooltipPane.java b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxPlotTooltipPane.java new file mode 100644 index 0000000000..e976d05e6c --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxPlotTooltipPane.java @@ -0,0 +1,20 @@ +package com.fr.van.chart.box; + +import com.fr.chart.chartattr.Plot; +import com.fr.van.chart.designer.style.VanChartStylePane; +import com.fr.van.chart.designer.style.tooltip.VanChartPlotTooltipPane; + +public class VanChartBoxPlotTooltipPane extends VanChartPlotTooltipPane { + + public VanChartBoxPlotTooltipPane(Plot plot, VanChartStylePane parent) { + super(plot, parent); + } + + protected void initTooltipContentPane(Plot plot) { + tooltipContentPane = new VanChartBoxTooltipContentPane(parent, VanChartBoxPlotTooltipPane.this); + } + + protected boolean hasTooltipSeriesType() { + return false; + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxSeriesPane.java new file mode 100644 index 0000000000..867f7ec9e3 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxSeriesPane.java @@ -0,0 +1,12 @@ +package com.fr.van.chart.box; + +import com.fr.chart.chartattr.Plot; +import com.fr.design.mainframe.chart.gui.ChartStylePane; +import com.fr.van.chart.column.VanChartColumnSeriesPane; + +public class VanChartBoxSeriesPane extends VanChartColumnSeriesPane { + + public VanChartBoxSeriesPane(ChartStylePane parent, Plot plot) { + super(parent, plot); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxStylePane.java b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxStylePane.java new file mode 100644 index 0000000000..b9e60c68e7 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxStylePane.java @@ -0,0 +1,21 @@ +package com.fr.van.chart.box; + +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.van.chart.bar.VanChartBarStylePane; + +import java.util.List; + +public class VanChartBoxStylePane extends VanChartBarStylePane { + + public VanChartBoxStylePane(AttributeChangeListener listener) { + super(listener); + } + + protected void createVanChartLabelPane(List paneList) { + } + + protected void addVanChartTooltipPane(List paneList) { + paneList.add(new VanChartBoxTooltipPane(VanChartBoxStylePane.this)); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxTooltipContentPane.java new file mode 100644 index 0000000000..9fc9988f0a --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxTooltipContentPane.java @@ -0,0 +1,28 @@ +package com.fr.van.chart.box; + +import com.fr.van.chart.designer.component.VanChartTooltipContentPane; +import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; +import java.awt.Component; + +public class VanChartBoxTooltipContentPane extends VanChartTooltipContentPane { + + public VanChartBoxTooltipContentPane(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { + categoryNameFormatPane = new CategoryNameFormatPaneWithCheckBox(parent, showOnPane); + seriesNameFormatPane = new SeriesNameFormatPaneWithCheckBox(parent, showOnPane); + } + + protected Component[][] getPaneComponents() { + return new Component[][]{ + new Component[]{categoryNameFormatPane, null}, + new Component[]{seriesNameFormatPane, null} + }; + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxTooltipPane.java b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxTooltipPane.java new file mode 100644 index 0000000000..5d485c31d2 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxTooltipPane.java @@ -0,0 +1,17 @@ +package com.fr.van.chart.box; + +import com.fr.chart.chartattr.Plot; +import com.fr.van.chart.designer.style.VanChartStylePane; +import com.fr.van.chart.designer.style.tooltip.VanChartPlotTooltipPane; +import com.fr.van.chart.designer.style.tooltip.VanChartTooltipPane; + +public class VanChartBoxTooltipPane extends VanChartTooltipPane { + + public VanChartBoxTooltipPane(VanChartStylePane parent) { + super(parent); + } + + protected VanChartPlotTooltipPane getTooltipPane(Plot plot) { + return new VanChartBoxPlotTooltipPane(plot, parent); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/data/BoxPlotReportDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/box/data/BoxPlotReportDataContentPane.java new file mode 100644 index 0000000000..cce6bf9649 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/box/data/BoxPlotReportDataContentPane.java @@ -0,0 +1,11 @@ +package com.fr.van.chart.box.data; + +import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.design.mainframe.chart.gui.data.report.CategoryPlotReportDataContentPane; + +public class BoxPlotReportDataContentPane extends CategoryPlotReportDataContentPane { + + public BoxPlotReportDataContentPane(ChartDataPane parent) { + super(parent); + } +} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/data/BoxPlotReportResultDataSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/box/data/BoxPlotReportResultDataSeriesPane.java new file mode 100644 index 0000000000..629c67a5f5 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/box/data/BoxPlotReportResultDataSeriesPane.java @@ -0,0 +1,4 @@ +package com.fr.van.chart.box.data; + +public class BoxPlotReportResultDataSeriesPane { +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableDataContentPane.java new file mode 100644 index 0000000000..6ea7e126e4 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableDataContentPane.java @@ -0,0 +1,213 @@ +package com.fr.van.chart.box.data.table; + +import com.fr.chart.chartattr.ChartCollection; +import com.fr.chart.chartattr.Plot; +import com.fr.chart.chartdata.NormalTableDataDefinition; +import com.fr.design.foldablepane.UIExpandablePane; +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.chart.gui.ChartDataPane; +import com.fr.design.mainframe.chart.gui.data.ChartDataFilterPane; +import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.plugin.chart.box.data.VanBoxTableDefinition; +import com.fr.plugin.chart.box.data.VanBoxTableDefinitionHelper; +import com.fr.plugin.chart.box.data.VanBoxTableResultDefinition; + +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.List; + +public class BoxPlotTableDataContentPane extends AbstractTableDataContentPane { + + private UIButtonGroup dataType; + + private BoxPlotTableSeriesTypeUsePane seriesTypeComboxPane; + private BoxPlotTableResultDataSeriesPane resultDataSeriesPane; + + private ChartDataFilterPane dataScreeningPane; + + private ChartDataPane parent; + private Plot initplot; + + public BoxPlotTableDataContentPane(Plot plot, ChartDataPane parent) { + this.initplot = plot; + this.parent = parent; + + this.setLayout(new BorderLayout()); + + this.add(createDataTypePane(), BorderLayout.NORTH); + this.add(createSeriesPane(), BorderLayout.CENTER); + this.add(createFilterPane(), BorderLayout.SOUTH); + + initDataTypeListener(); + checkDataPaneVisible(); + } + + private JPanel createDataTypePane() { + JPanel pane = new JPanel(new BorderLayout(4, 0)); + pane.setBorder(BorderFactory.createMatteBorder(0, 0, 6, 1, getBackground())); + + UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Data_Type")); + label.setPreferredSize(new Dimension(ChartDataPane.LABEL_WIDTH, ChartDataPane.LABEL_HEIGHT)); + + String[] names = new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Detailed_Data"), + Toolkit.i18nText("Fine-Design_Chart_Result_Data") + }; + + dataType = new UIButtonGroup(names); + dataType.setPreferredSize(new Dimension(100, 20)); + + pane.add(GUICoreUtils.createBorderLayoutPane(new Component[]{dataType, null, null, label, null})); + pane.setPreferredSize(new Dimension(246, 30)); + pane.setBorder(BorderFactory.createEmptyBorder(0, 24, 10, 15)); + + return pane; + } + + private JPanel createSeriesPane() { + seriesTypeComboxPane = new BoxPlotTableSeriesTypeUsePane(); + resultDataSeriesPane = new BoxPlotTableResultDataSeriesPane(); + + JPanel pane = new JPanel(new BorderLayout(4, 0)); + + pane.add(seriesTypeComboxPane, BorderLayout.CENTER); + pane.add(resultDataSeriesPane, BorderLayout.SOUTH); + + return pane; + } + + private JPanel createFilterPane() { + dataScreeningPane = new ChartDataFilterPane(initplot, parent, false); + dataScreeningPane.setBorder(BorderFactory.createEmptyBorder(10, 24, 10, 15)); + + JPanel panel = new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Data_Filter"), 290, 24, dataScreeningPane); + panel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); + + return panel; + } + + private void initDataTypeListener() { + dataType.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + checkDataPaneVisible(); + } + }); + } + + private void checkDataPaneVisible() { + if (seriesTypeComboxPane != null) { + seriesTypeComboxPane.setVisible(dataType.getSelectedIndex() == 0); + } + if (resultDataSeriesPane != null) { + resultDataSeriesPane.setVisible(dataType.getSelectedIndex() == 1); + } + } + + public void checkBoxUse(boolean hasUse) { + if (dataType.getSelectedIndex() == 0 && seriesTypeComboxPane != null) { + seriesTypeComboxPane.checkBoxUse(hasUse); + } + + if (dataType.getSelectedIndex() == 1 && resultDataSeriesPane != null) { + resultDataSeriesPane.checkBoxUse(hasUse); + } + + dataScreeningPane.checkBoxUse(); + } + + protected void refreshBoxListWithSelectTableData(List list) { + if (seriesTypeComboxPane != null) { + seriesTypeComboxPane.refreshBoxListWithSelectTableData(list); + } + if (resultDataSeriesPane != null) { + resultDataSeriesPane.refreshBoxListWithSelectTableData(list); + } + } + + public void clearAllBoxList() { + if (seriesTypeComboxPane != null) { + seriesTypeComboxPane.clearAllBoxList(); + } + if (resultDataSeriesPane != null) { + resultDataSeriesPane.clearAllBoxList(); + } + } + + public void updateBean(ChartCollection collection) { + checkChartCollection(collection); + + VanBoxTableDefinition table = VanBoxTableDefinitionHelper.getBoxTableDefinition(collection); + + if (table != null) { + table.setDetailed(dataType.getSelectedIndex() == 0); + } + if (seriesTypeComboxPane != null) { + seriesTypeComboxPane.updateBean(collection); + } + if (resultDataSeriesPane != null) { + resultDataSeriesPane.updateBean(collection); + } + if (dataScreeningPane != null) { + updateDataScreeningPane(dataScreeningPane, collection); + } + } + + public void populateBean(ChartCollection collection) { + checkChartCollection(collection); + + if (dataType != null) { + dataType.setSelectedIndex(VanBoxTableDefinitionHelper.isDetailedTableDataType(collection) ? 0 : 1); + } + if (seriesTypeComboxPane != null) { + seriesTypeComboxPane.populateBean(collection); + } + if (resultDataSeriesPane != null) { + resultDataSeriesPane.populateBean(collection); + } + if (dataScreeningPane != null) { + populateDataScreeningPane(dataScreeningPane, collection); + } + + checkDataPaneVisible(); + } + + private void checkChartCollection(ChartCollection collection) { + VanBoxTableDefinition table = VanBoxTableDefinitionHelper.getBoxTableDefinition(collection); + + if (table == null) { + collection.getSelectedChart().setFilterDefinition(new VanBoxTableDefinition()); + } + } + + private void populateDataScreeningPane(ChartDataFilterPane dataScreeningPane, ChartCollection collection) { + NormalTableDataDefinition detailedDefinition = VanBoxTableDefinitionHelper.getBoxTableDetailedDefinition(collection); + VanBoxTableResultDefinition resultDefinition = VanBoxTableDefinitionHelper.getBoxTableResultDefinition(collection); + + if (detailedDefinition != null) { + dataScreeningPane.populateDefinition(detailedDefinition, false); + } else if (resultDefinition != null) { + dataScreeningPane.populateDefinition(resultDefinition, false); + } + } + + private void updateDataScreeningPane(ChartDataFilterPane dataScreeningPane, ChartCollection collection) { + NormalTableDataDefinition detailedDefinition = VanBoxTableDefinitionHelper.getBoxTableDetailedDefinition(collection); + VanBoxTableResultDefinition resultDefinition = VanBoxTableDefinitionHelper.getBoxTableResultDefinition(collection); + + if (detailedDefinition != null) { + dataScreeningPane.updateDefinition(detailedDefinition); + } + + if (resultDefinition != null) { + dataScreeningPane.updateDefinition(resultDefinition); + } + } +} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableResultDataSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableResultDataSeriesPane.java new file mode 100644 index 0000000000..04dd3cda96 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableResultDataSeriesPane.java @@ -0,0 +1,179 @@ +package com.fr.van.chart.box.data.table; + +import com.fr.chart.base.ChartConstants; +import com.fr.chart.chartattr.ChartCollection; +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.mainframe.chart.gui.data.table.AbstractTableDataContentPane; +import com.fr.plugin.chart.box.data.VanBoxTableDefinition; +import com.fr.plugin.chart.box.data.VanBoxTableDefinitionHelper; +import com.fr.plugin.chart.box.data.VanBoxTableResultDefinition; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StringUtils; +import com.fr.van.chart.designer.TableLayout4VanChartHelper; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.util.List; + +public class BoxPlotTableResultDataSeriesPane extends AbstractTableDataContentPane { + + private UIComboBox category; + private UIComboBox seriesName; + private UIComboBox max; + private UIComboBox q3; + private UIComboBox median; + private UIComboBox q1; + private UIComboBox min; + + public BoxPlotTableResultDataSeriesPane() { + + initComboxSize(); + + this.setLayout(new BorderLayout()); + this.add(createDataSeriesPane(), BorderLayout.CENTER); + + addItemListener(); + } + + private void initComboxSize() { + Dimension preferredSize = new Dimension(100, 20); + + category = new UIComboBox(); + seriesName = new UIComboBox(); + max = new UIComboBox(); + q3 = new UIComboBox(); + median = new UIComboBox(); + q1 = new UIComboBox(); + min = new UIComboBox(); + + category.setPreferredSize(preferredSize); + seriesName.setPreferredSize(preferredSize); + max.setPreferredSize(preferredSize); + q3.setPreferredSize(preferredSize); + median.setPreferredSize(preferredSize); + q1.setPreferredSize(preferredSize); + min.setPreferredSize(preferredSize); + } + + private void addItemListener() { + category.addItemListener(tooltipListener); + seriesName.addItemListener(tooltipListener); + max.addItemListener(tooltipListener); + q3.addItemListener(tooltipListener); + median.addItemListener(tooltipListener); + q1.addItemListener(tooltipListener); + min.addItemListener(tooltipListener); + } + + private JPanel createDataSeriesPane() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + + double[] column = {f, COMPONENT_WIDTH}; + double[] row = {p, p, p, p, p, p, p}; + + Component[][] components_north = new Component[][]{ + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Category")), category}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Series_Name")), seriesName}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Data_Max")), max}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Data_Q3")), q3}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Data_Median")), median}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Data_Q1")), q1}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Data_Min")), min}, + }; + + JPanel center = TableLayout4VanChartHelper.createGapTableLayoutPane(components_north, row, column); + center.setBorder(BorderFactory.createEmptyBorder(10, 24, 10, 15)); + + return center; + } + + public void checkBoxUse(boolean hasUse) { + } + + protected void refreshBoxListWithSelectTableData(List list) { + refreshBoxItems(category, list); + refreshBoxItems(seriesName, list); + refreshBoxItems(max, list); + refreshBoxItems(q3, list); + refreshBoxItems(median, list); + refreshBoxItems(q1, list); + refreshBoxItems(min, list); + } + + public void clearAllBoxList() { + clearBoxItems(category); + clearBoxItems(seriesName); + clearBoxItems(max); + clearBoxItems(q3); + clearBoxItems(median); + clearBoxItems(q1); + clearBoxItems(min); + } + + public void populateBean(ChartCollection collection) { + super.populateBean(collection); + + VanBoxTableResultDefinition definition = VanBoxTableDefinitionHelper.getBoxTableResultDefinition(collection); + + if (definition == null) { + return; + } + + combineCustomEditValue(category, definition.getCategoryName()); + combineCustomEditValue(seriesName, definition.getSeriesName()); + combineCustomEditValue(max, definition.getMax()); + combineCustomEditValue(q3, definition.getQ3()); + combineCustomEditValue(median, definition.getMedian()); + combineCustomEditValue(q1, definition.getQ1()); + combineCustomEditValue(min, definition.getMin()); + } + + public void updateBean(ChartCollection collection) { + VanBoxTableDefinition table = VanBoxTableDefinitionHelper.getBoxTableDefinition(collection); + + VanBoxTableResultDefinition definition = new VanBoxTableResultDefinition(); + + Object resultCategory = category.getSelectedItem(); + Object resultSeries = seriesName.getSelectedItem(); + Object resultMax = max.getSelectedItem(); + Object resultQ3 = q3.getSelectedItem(); + Object resultMedian = median.getSelectedItem(); + Object resultQ1 = q1.getSelectedItem(); + Object resultMin = min.getSelectedItem(); + + if (resultCategory == null || ArrayUtils.contains(ChartConstants.getNoneKeys(), resultCategory)) { + definition.setCategoryName(StringUtils.EMPTY); + } else { + definition.setCategoryName(resultCategory.toString()); + } + if (resultSeries == null || ArrayUtils.contains(ChartConstants.getNoneKeys(), resultSeries)) { + definition.setSeriesName(StringUtils.EMPTY); + } else { + definition.setSeriesName(resultSeries.toString()); + } + if (resultMax != null) { + definition.setMax(resultMax.toString()); + } + if (resultQ3 != null) { + definition.setQ3(resultQ3.toString()); + } + if (resultMedian != null) { + definition.setMedian(resultMedian.toString()); + } + if (resultQ1 != null) { + definition.setQ1(resultQ1.toString()); + } + if (resultMin != null) { + definition.setMin(resultMin.toString()); + } + + table.setResultDefinition(definition); + } +} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableSeriesNameUseFieldNamePane.java b/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableSeriesNameUseFieldNamePane.java new file mode 100644 index 0000000000..8fc7d7e684 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableSeriesNameUseFieldNamePane.java @@ -0,0 +1,12 @@ +package com.fr.van.chart.box.data.table; + +import com.fr.chart.chartdata.MoreNameCDDefinition; +import com.fr.design.mainframe.chart.gui.data.table.SeriesNameUseFieldNamePane; +import com.fr.plugin.chart.box.data.VanBoxMoreNameCDDefinition; + +public class BoxPlotTableSeriesNameUseFieldNamePane extends SeriesNameUseFieldNamePane { + + protected MoreNameCDDefinition createMoreNameCDDefinition() { + return new VanBoxMoreNameCDDefinition(); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableSeriesNameUseFieldValuePane.java b/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableSeriesNameUseFieldValuePane.java new file mode 100644 index 0000000000..93319f5c3e --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableSeriesNameUseFieldValuePane.java @@ -0,0 +1,12 @@ +package com.fr.van.chart.box.data.table; + +import com.fr.chart.chartdata.OneValueCDDefinition; +import com.fr.design.mainframe.chart.gui.data.table.SeriesNameUseFieldValuePane; +import com.fr.plugin.chart.box.data.VanBoxOneValueCDDefinition; + +public class BoxPlotTableSeriesNameUseFieldValuePane extends SeriesNameUseFieldValuePane { + + protected OneValueCDDefinition createOneValueCDDefinition() { + return new VanBoxOneValueCDDefinition(); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableSeriesTypeUsePane.java b/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableSeriesTypeUsePane.java new file mode 100644 index 0000000000..1fd9186b18 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableSeriesTypeUsePane.java @@ -0,0 +1,225 @@ +package com.fr.van.chart.box.data.table; + +import com.fr.chart.base.ChartConstants; +import com.fr.chart.chartattr.ChartCollection; +import com.fr.chart.chartdata.MoreNameCDDefinition; +import com.fr.chart.chartdata.NormalTableDataDefinition; +import com.fr.chart.chartdata.OneValueCDDefinition; +import com.fr.design.beans.FurtherBasicBeanPane; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.gui.frpane.UIComboBoxPane; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.ilable.BoldFontTextLabel; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.design.mainframe.chart.gui.data.table.DataPaneHelper; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.design.utils.gui.UIComponentUtils; +import com.fr.general.ComparatorUtils; +import com.fr.plugin.chart.box.data.VanBoxTableDefinition; +import com.fr.plugin.chart.box.data.VanBoxTableDefinitionHelper; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StringUtils; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +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.ArrayList; +import java.util.List; + +public class BoxPlotTableSeriesTypeUsePane extends UIComboBoxPane { + + private static boolean NEED_SUMMERY = false; + + private UIComboBox categoryCombox; + + private BoxPlotTableSeriesNameUseFieldValuePane nameFieldValuePane; + private BoxPlotTableSeriesNameUseFieldNamePane nameFieldNamePane; + + public BoxPlotTableSeriesTypeUsePane() { + cards = initPaneList(); + initComponents(); + initListener(); + } + + protected void initLayout() { + this.setLayout(new BorderLayout(4, LayoutConstants.VGAP_MEDIUM)); + + cardPane.setBorder(BorderFactory.createEmptyBorder(0, 24, 0, 15)); + + this.add(createNorthPane(), BorderLayout.NORTH); + this.add(createCenterPane(), BorderLayout.CENTER); + this.add(cardPane, BorderLayout.SOUTH); + } + + protected UIComboBox createComboBox() { + UIComboBox uiComboBox = new UIComboBox(); + UIComponentUtils.setPreferedWidth(uiComboBox, 100); + return uiComboBox; + } + + private JPanel createNorthPane() { + JPanel north = new JPanel(new BorderLayout(4, 0)); + north.setBorder(BorderFactory.createMatteBorder(0, 0, 6, 1, getBackground())); + UILabel label = new BoldFontTextLabel(Toolkit.i18nText("Fine-Design_Chart_Style_Category")); + label.setPreferredSize(new Dimension(ChartDataPane.LABEL_WIDTH, ChartDataPane.LABEL_HEIGHT)); + + categoryCombox = new UIComboBox(); + categoryCombox.setPreferredSize(new Dimension(100, 20)); + categoryCombox.addItem(Toolkit.i18nText("Fine-Design_Chart_Use_None")); + + north.add(GUICoreUtils.createBorderLayoutPane(new Component[]{categoryCombox, null, null, label, null})); + north.setPreferredSize(new Dimension(246, 30)); + north.setBorder(BorderFactory.createEmptyBorder(0, 24, 10, 15)); + + return north; + } + + private JPanel createCenterPane() { + JPanel center = new JPanel(new BorderLayout(4, 0)); + + UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Series_Name_From")); + label.setPreferredSize(new Dimension(ChartDataPane.LABEL_WIDTH, ChartDataPane.LABEL_HEIGHT)); + center.add(GUICoreUtils.createBorderLayoutPane(new Component[]{jcb, null, null, label, null})); + center.setBorder(BorderFactory.createEmptyBorder(0, 24, 0, 15)); + + return center; + } + + private void initListener() { + categoryCombox.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + checkBoxUse(categoryCombox.getSelectedItem() != null); + makeToolTipUse(categoryCombox); + } + }); + } + + public void checkBoxUse(boolean hasUse) { + categoryCombox.setEnabled(hasUse); + jcb.setEnabled(hasUse); + nameFieldValuePane.checkUse(hasUse); + } + + private void makeToolTipUse(UIComboBox comBox) { + if (comBox.getSelectedItem() != null) { + comBox.setToolTipText(comBox.getSelectedItem().toString()); + } else { + comBox.setToolTipText(null); + } + } + + public void refreshBoxListWithSelectTableData(List list) { + DataPaneHelper.refreshBoxItems(categoryCombox, list); + + categoryCombox.addItem(Toolkit.i18nText("Fine-Design_Chart_Use_None")); + + nameFieldValuePane.refreshBoxListWithSelectTableData(list); + nameFieldNamePane.refreshBoxListWithSelectTableData(list); + } + + public void clearAllBoxList() { + DataPaneHelper.clearBoxItems(categoryCombox); + + categoryCombox.addItem(Toolkit.i18nText("Fine-Design_Chart_Use_None")); + + nameFieldValuePane.clearAllBoxList(); + nameFieldNamePane.clearAllBoxList(); + } + + protected String title4PopupWindow() { + return Toolkit.i18nText("Fine-Design_Chart_Series_Name_From"); + } + + protected List> initPaneList() { + nameFieldValuePane = new BoxPlotTableSeriesNameUseFieldValuePane(); + nameFieldNamePane = new BoxPlotTableSeriesNameUseFieldNamePane(); + + nameFieldValuePane.relayoutPane(NEED_SUMMERY); + nameFieldNamePane.relayoutPane(NEED_SUMMERY); + + List> paneList = new ArrayList>(); + + paneList.add(nameFieldValuePane); + paneList.add(nameFieldNamePane); + + return paneList; + } + + public void relayoutPane() { + if (jcb.getSelectedIndex() == 0) { + nameFieldValuePane.relayoutPane(NEED_SUMMERY); + } else { + nameFieldNamePane.relayoutPane(NEED_SUMMERY); + } + } + + protected void comboBoxItemStateChanged() { + if (jcb.getSelectedIndex() == 0) { + nameFieldValuePane.relayoutPane(NEED_SUMMERY); + } else { + nameFieldNamePane.relayoutPane(NEED_SUMMERY); + } + } + + public void populateBean(ChartCollection collection) { + NormalTableDataDefinition definition = VanBoxTableDefinitionHelper.getBoxTableDetailedDefinition(collection); + + if (definition == null) { + categoryCombox.setSelectedItem(Toolkit.i18nText("Fine-Design_Chart_Use_None")); + return; + } + + if (definition instanceof OneValueCDDefinition) { + this.setSelectedIndex(0); + nameFieldValuePane.populateDefinition(definition, NEED_SUMMERY); + } else if (definition instanceof MoreNameCDDefinition) { + this.setSelectedIndex(1); + nameFieldNamePane.populateDefinition(definition, NEED_SUMMERY); + } + + populateCategoryItem(categoryCombox, definition.getCategoryName()); + } + + public void updateBean(ChartCollection collection) { + VanBoxTableDefinition table = VanBoxTableDefinitionHelper.getBoxTableDefinition(collection); + + if (table == null) { + return; + } + + NormalTableDataDefinition definition; + + if (this.getSelectedIndex() == 0) { + definition = nameFieldValuePane.updateDefinition(); + } else { + definition = nameFieldNamePane.updateDefinition(table.getDetailedDefinition()); + } + + Object categoryName = categoryCombox.getSelectedItem(); + + if (ArrayUtils.contains(ChartConstants.getNoneKeys(), categoryName)) { + definition.setCategoryName(StringUtils.EMPTY); + } else { + definition.setCategoryName(categoryName == null ? null : categoryName.toString()); + } + + table.setDetailedDefinition(definition); + } + + private void populateCategoryItem(UIComboBox categoryCombox, String item) { + if (ComparatorUtils.equals(item, StringUtils.EMPTY)) { + categoryCombox.setSelectedItem(Toolkit.i18nText("Fine-Design_Chart_Use_None")); + } else if (!DataPaneHelper.boxItemsContainsObject(categoryCombox, item)) { + categoryCombox.setSelectedItem(null); + } else { + DataPaneHelper.combineCustomEditValue(categoryCombox, item); + } + } + +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomDataPane.java b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomDataPane.java index 6c5f714bf8..ec15e4cf98 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomDataPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomDataPane.java @@ -27,6 +27,7 @@ public class VanChartCustomDataPane extends ChartDataPane { } contentsTabPane = new VanChartCustomPlotDataContentsTabPane((VanChartCustomPlot)chart.getPlot(), VanChartCustomDataPane.this, listener); + contentsTabPane.setSupportCellData(isSupportCellData()); content.add(contentsTabPane, BorderLayout.CENTER); return content; diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java index e8f6f3a0a7..6d7d24bf96 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java @@ -22,14 +22,25 @@ import java.util.Map; * Created by Fangjie on 2016/4/29. */ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTabPane { + + private boolean supportCellData; + public VanChartCustomPlotDataContentsTabPane(VanChartCustomPlot plot, VanChartCustomDataPane parent, AttributeChangeListener listener) { super(plot, parent, listener); } + public boolean isSupportCellData() { + return supportCellData; + } + + public void setSupportCellData(boolean supportCellData) { + this.supportCellData = supportCellData; + } + @Override protected void initTabTitle() { - if (plot == null){ + if (plot == null) { return; } @@ -49,7 +60,7 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab @Override protected List initPaneList() { - if (plot == null){ + if (plot == null) { return null; } @@ -57,9 +68,10 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab List customPlotList = plot.getCustomPlotList(); - for (int i = 0; i < customPlotList.size(); i++){ + for (int i = 0; i < customPlotList.size(); i++) { //根据不同的plot创建不同的数据配置界面 ChartDataPane contentPane = new VanChartDataPane(listener); + contentPane.setSupportCellData(supportCellData); paneList.add(contentPane); } @@ -67,42 +79,38 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab } @Override - public void populateBean(ChartCollection chartCollection){ + public void populateBean(ChartCollection chartCollection) { plot = (VanChartCustomPlot) chartCollection.getSelectedChart().getPlot(); - if (paneList == null){ - paneList = initPaneList(); - } - - if (paneList != null){ - - try { + paneList = initPaneList(); - List customPlotList = plot.getCustomPlotList(); + relayoutWhenListChange(); + try { + List customPlotList = plot.getCustomPlotList(); - for (int i = 0; i < paneList.size() && i < customPlotList.size(); i++) { - //將plot包裝起来,主要是为了获取dataDefinition - ChartCollection cloneCollection = (ChartCollection) chartCollection.clone(); - //设置collection的plot - cloneCollection.getSelectedChart().setPlot(customPlotList.get(i)); + for (int i = 0; i < paneList.size() && i < customPlotList.size(); i++) { + //將plot包裝起来,主要是为了获取dataDefinition + ChartCollection cloneCollection = (ChartCollection) chartCollection.clone(); - //获取definitionMap中的dataDefinition - TopDefinitionProvider definition = chartCollection.getSelectedChart().getFilterDefinition(); - TopDefinitionProvider dataDefinition = null; - if (definition != null && definition instanceof CustomDefinition) { - Map definitionProviderMap = ((CustomDefinition)definition).getDefinitionProviderMap(); - dataDefinition = definitionProviderMap.get(CustomPlotFactory.getCustomType(customPlotList.get(i))); - } - cloneCollection.getSelectedChart().setFilterDefinition(dataDefinition); + //设置collection的plot + cloneCollection.getSelectedChart().setPlot(customPlotList.get(i)); - ((ChartDataPane) paneList.get(i)).populate(cloneCollection); + //获取definitionMap中的dataDefinition + TopDefinitionProvider definition = chartCollection.getSelectedChart().getFilterDefinition(); + TopDefinitionProvider dataDefinition = null; + if (definition != null && definition instanceof CustomDefinition) { + Map definitionProviderMap = ((CustomDefinition) definition).getDefinitionProviderMap(); + dataDefinition = definitionProviderMap.get(CustomPlotFactory.getCustomType(customPlotList.get(i))); } - }catch (Exception e){ - return; + cloneCollection.getSelectedChart().setFilterDefinition(dataDefinition); + + ((ChartDataPane) paneList.get(i)).populate(cloneCollection); } + } catch (Exception e) { + return; } } @@ -112,8 +120,8 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab } @Override - public void updateBean(ChartCollection collection){ - if (paneList == null || plot == null){ + public void updateBean(ChartCollection collection) { + if (paneList == null || plot == null) { return; } try { @@ -146,7 +154,7 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab customDefinition.setDefinitionProviderMap(definitionMap); collection.getSelectedChart().setFilterDefinition(customDefinition); - }catch (Exception e){ + } catch (Exception e) { return; } } @@ -168,10 +176,11 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab /** * 返回绑定的属性事件. - * @param listener 增加监听 + * + * @param listener 增加监听 */ public void addAttributeChangeListener(AttributeChangeListener listener) { - for (int i = 0; i < paneList.size(); i++){ + for (int i = 0; i < paneList.size(); i++) { ((ChartDataPane) paneList.get(i)).addAttributeChangeListener(listener); } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/other/condition/item/VanChartAreaFillColorConditionPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/other/condition/item/VanChartAreaFillColorConditionPane.java index c8be9aa7a9..aeb72f07d8 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/other/condition/item/VanChartAreaFillColorConditionPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/other/condition/item/VanChartAreaFillColorConditionPane.java @@ -1,11 +1,11 @@ package com.fr.van.chart.designer.other.condition.item; -import com.fr.chart.base.ChartConstants; import com.fr.chart.base.DataSeriesCondition; import com.fr.chart.chartattr.Plot; import com.fr.design.condition.ConditionAttributesPane; - +import com.fr.plugin.chart.attr.plot.VanChartPlot; import com.fr.plugin.chart.base.AttrAreaSeriesFillColorBackground; +import com.fr.plugin.chart.type.GradientType; import com.fr.van.chart.designer.component.VanChartAreaSeriesFillColorPane; import javax.swing.JPanel; @@ -13,7 +13,7 @@ import javax.swing.JPanel; /** * 面积图,填充色 */ -public class VanChartAreaFillColorConditionPane extends AbstractNormalMultiLineConditionPane { +public class VanChartAreaFillColorConditionPane extends AbstractNormalMultiLineConditionPane { private Plot plot; private static final long serialVersionUID = -4148284851967140012L; private VanChartAreaSeriesFillColorPane fillColorBackground; @@ -40,6 +40,7 @@ public class VanChartAreaFillColorConditionPane extends AbstractNormalMultiLine /** * 条件属性item的名称 + * * @return item的名称 */ public String nameForPopupMenuItem() { @@ -54,13 +55,13 @@ public class VanChartAreaFillColorConditionPane extends AbstractNormalMultiLine public void setDefault() { //下面这句话是给各组件一个默认值 fillColorBackground.populate(new AttrAreaSeriesFillColorBackground()); - fillColorBackground.checkoutAlpha(!(plot != null && plot.getPlotStyle() == ChartConstants.STYLE_SHADE)); + fillColorBackground.checkoutAlpha(plot != null && ((VanChartPlot) plot).getGradientStyle().getGradientType() == GradientType.NONE); } public void populate(DataSeriesCondition condition) { if (condition instanceof AttrAreaSeriesFillColorBackground) { fillColorBackground.populate((AttrAreaSeriesFillColorBackground) condition); - fillColorBackground.checkoutAlpha(!(plot != null && plot.getPlotStyle() == ChartConstants.STYLE_SHADE)); + fillColorBackground.checkoutAlpha(plot != null && ((VanChartPlot) plot).getGradientStyle().getGradientType() == GradientType.NONE); } } 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 064a7156bd..be2c7d8a5f 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 @@ -54,11 +54,13 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { private static final long serialVersionUID = -5717246802333308973L; private static final double ROTATION_MAX = 90.0; + protected UIButtonGroup showTitle; protected TinyFormulaPane titleContent; protected UIButtonGroup titleAlignPane; protected UIToggleButton titleUseHtml; protected ChartTextAttrPane titleTextAttrPane; protected UINumberDragPane titleTextRotation; + protected JPanel titlePane; protected UIButtonGroup showLabel; protected ChartTextAttrPane labelTextAttrPane; @@ -96,11 +98,11 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { protected JPanel centerPane; private VanChartHtmlLabelPane htmlLabelPane; - public VanChartBaseAxisPane(){ + public VanChartBaseAxisPane() { this(true); } - public VanChartBaseAxisPane(boolean isXAxis){ + public VanChartBaseAxisPane(boolean isXAxis) { this.setLayout(new BorderLayout()); this.add(createContentPane(isXAxis), BorderLayout.CENTER); } @@ -108,12 +110,13 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { public void setParentPane(VanChartStylePane parent) { htmlLabelPane.setParent(parent); } - protected void reLayoutPane(boolean isXAxis){ + + protected void reLayoutPane(boolean isXAxis) { this.removeAll(); this.add(createContentPane(isXAxis), BorderLayout.CENTER); } - protected JPanel createContentPane(boolean isXAxis){ + protected JPanel createContentPane(boolean isXAxis) { double p = TableLayout.PREFERRED; double f = TableLayout.FILL; @@ -121,9 +124,9 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { double s = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; double[] columnSize = {f, e}; double[] column = {f, s}; - double[] rowSize = {p, p, p, p, p, p, p,p}; + double[] rowSize = {p, p, p, p, p, p, p, p}; Component[][] components = new Component[][]{ - new Component[]{createTitlePane(new double[]{p, p, p, p, p, p}, columnSize, isXAxis), null}, + new Component[]{createTitlePane(new double[]{p, p, p, p, p, p}, column, isXAxis), null}, new Component[]{createLabelPane(new double[]{p, p}, column), null}, new Component[]{createLineStylePane(new double[]{p, p, p, p, p}, columnSize), null}, new Component[]{createAxisPositionPane(new double[]{p, p, p}, columnSize, isXAxis), null}, @@ -131,39 +134,53 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { new Component[]{createValueStylePane(), null}, }; - return TableLayoutHelper.createTableLayoutPane(components,rowSize,columnSize); + return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); } - protected JPanel createTitlePane(double[] row, double[] col, boolean isXAxis){ + protected JPanel createTitlePane(double[] row, double[] col, boolean isXAxis) { + showTitle = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Use_Show"), Toolkit.i18nText("Fine-Design_Chart_Hidden")}); titleAlignPane = isXAxis ? getXAxisTitleAlignPane() : getYAxisTitleAlignPane(); titleAlignPane.setSelectedItem(Constants.CENTER); titleContent = new TinyFormulaPane(); titleUseHtml = new UIToggleButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Html")); UIComponentUtils.setLineWrap(titleUseHtml); - titleTextAttrPane = new ChartTextAttrPane(); - titleTextRotation = new UINumberDragPane(-ROTATION_MAX,ROTATION_MAX); - if(isXAxis){ + titleTextAttrPane = getChartTextAttrPane(); + titleTextRotation = new UINumberDragPane(-ROTATION_MAX, ROTATION_MAX); + if (isXAxis) { titleTextRotation.populateBean(0.0); } else { titleTextRotation.populateBean(-ROTATION_MAX); } Component[][] components = new Component[][]{ - new Component[]{null,null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Content")),titleContent}, - new Component[]{null,titleUseHtml}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Layout_Position")),titleAlignPane}, - new Component[]{titleTextAttrPane,null}, + new Component[]{null, null}, + new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Content")), titleContent}, + new Component[]{null, titleUseHtml}, + new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Layout_Position")), titleAlignPane}, + new Component[]{titleTextAttrPane, null}, new Component[]{ FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_TextRotation")), UIComponentUtils.wrapWithBorderLayoutPane(titleTextRotation) }, }; + titlePane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); + titlePane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(PaneTitleConstants.CHART_STYLE_TITLE_TITLE, panel); + JPanel showTitlePane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Axis_Title"), showTitle); + showTitle.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + checkTitlePane(); + } + }); + + JPanel jPanel = new JPanel(new BorderLayout()); + jPanel.add(showTitlePane, BorderLayout.NORTH); + jPanel.add(titlePane, BorderLayout.CENTER); + + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(PaneTitleConstants.CHART_STYLE_TITLE_TITLE, jPanel); } - private UIButtonGroup getXAxisTitleAlignPane(){ + private UIButtonGroup getXAxisTitleAlignPane() { Icon[] alignmentIconArray = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png")}; @@ -171,7 +188,8 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { return new UIButtonGroup(alignmentIconArray, alignment); } - private UIButtonGroup getYAxisTitleAlignPane(){ + + private UIButtonGroup getYAxisTitleAlignPane() { Icon[] alignmentIconArray = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_top_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_center_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_down_normal.png")}; @@ -180,7 +198,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { return new UIButtonGroup(alignmentIconArray, alignment); } - protected JPanel createLabelPane(double[] row, double[] col){ + protected JPanel createLabelPane(double[] row, double[] col) { showLabel = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Show"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Hidden")}); labelTextAttrPane = getChartTextAttrPane(); @@ -205,9 +223,9 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { new Component[]{gapPanel, null}, }; - JPanel showLabelPane = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis_Label"),showLabel); + JPanel showLabelPane = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis_Label"), showLabel); labelPanel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); - labelPanel.setBorder(BorderFactory.createEmptyBorder(0,10,0,0)); + labelPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); showLabel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -308,11 +326,11 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } - protected ChartTextAttrPane getChartTextAttrPane(){ - return new ChartTextAttrPane(){ + protected ChartTextAttrPane getChartTextAttrPane() { + return new ChartTextAttrPane() { @Override - protected JPanel getContentPane (JPanel buttonPane) { + protected JPanel getContentPane(JPanel buttonPane) { double p = TableLayout.PREFERRED; double f = TableLayout.FILL; double e = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; @@ -324,10 +342,10 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { }; } - protected JPanel createLineStylePane(double[] row, double[] col){ + protected JPanel createLineStylePane(double[] row, double[] col) { axisLineStyle = createLineComboBox(); axisLineColor = new ColorSelectBox(100); - String[] strings = new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Open"),com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Close")}; + String[] strings = new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Open"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Close")}; AxisTickLineType[] values = new AxisTickLineType[]{AxisTickLineType.TICK_LINE_OUTSIDE, AxisTickLineType.TICK_LINE_NONE}; mainTick = new UIButtonGroup(strings, values); secondTick = new UIButtonGroup(strings, values); @@ -342,15 +360,15 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { protected Component[][] getLineStylePaneComponents() { return new Component[][]{ - new Component[]{null,null} , - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Type")),axisLineStyle} , - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Color")),axisLineColor}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Main_Graduation_Line")),mainTick}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Second_Graduation_Line")),secondTick}, + new Component[]{null, null}, + new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Type")), axisLineStyle}, + new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Color")), axisLineColor}, + new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Main_Graduation_Line")), mainTick}, + new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Second_Graduation_Line")), secondTick}, }; } - protected JPanel createAxisPositionPane(double[] row, double[] col, boolean isXAxis){ + protected JPanel createAxisPositionPane(double[] row, double[] col, boolean isXAxis) { position = new UIButtonGroup(getAxisPositionNameArray(isXAxis), getAxisPositionValueArray(isXAxis)); reversed = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_On"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Off")}, new Boolean[]{true, false}); Component[][] components = new Component[][]{ @@ -359,30 +377,30 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis_Label_Position")), UIComponentUtils.wrapWithBorderLayoutPane(position) }, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_AxisReversed")),reversed}, - } ; + new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_AxisReversed")), reversed}, + }; JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Layout_Position"), panel); } - private String[] getAxisPositionNameArray(boolean isXAxis){ - if(isXAxis){ + private String[] getAxisPositionNameArray(boolean isXAxis) { + if (isXAxis) { return new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis_Top"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis_Bottom"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis_Vertical_Zero")}; } else { return new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Layout_Left"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Layout_Right"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis_Vertical_Zero")}; } } - private Integer[] getAxisPositionValueArray(boolean isXAxis){ - if(isXAxis){ + private Integer[] getAxisPositionValueArray(boolean isXAxis) { + if (isXAxis) { return new Integer[]{VanChartConstants.AXIS_TOP, VanChartConstants.AXIS_BOTTOM, VanChartConstants.AXIS_VERTICAL_ZERO}; } else { return new Integer[]{VanChartConstants.AXIS_LEFT, VanChartConstants.AXIS_RIGHT, VanChartConstants.AXIS_VERTICAL_ZERO}; } } - protected JPanel createDisplayStrategy(){ + protected JPanel createDisplayStrategy() { //区域显示策略 恢复用注释。删除到return,即除了注释的代码都删除。 maxProportion = new UISpinner(0, 100, 1, 30); axisLimitSize = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Limit"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Not_Limit")}); @@ -408,7 +426,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { // return limitPane; } - protected JPanel createValueStylePane(){ + protected JPanel createValueStylePane() { valueFormatStyle = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Common"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom")}); @@ -418,19 +436,19 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { htmlLabelPane = new VanChartHtmlLabelPane(); centerPane = new JPanel(new CardLayout()); - centerPane.add(valueFormat,com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Common")); + centerPane.add(valueFormat, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Common")); centerPane.add(htmlLabelPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom")); double p = TableLayout.PREFERRED; double f = TableLayout.FILL; - double[] columnSize = {p,f}; - double[] rowSize = {p,p,p}; + double[] columnSize = {p, f}; + double[] rowSize = {p, p, p}; Component[][] components = new Component[][]{ - new Component[]{null,null}, + new Component[]{null, null}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis_Label_Format"), SwingConstants.LEFT), valueFormatStyle}, new Component[]{null, centerPane}, }; - JPanel contentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components,rowSize,columnSize); + JPanel contentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); valueFormatStyle.addActionListener(new ActionListener() { @@ -443,12 +461,12 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Format"), contentPane); } - protected FormatPane createFormatPane(){ - return new FormatPane(){ - protected Component[][] getComponent (JPanel fontPane, JPanel centerPane, JPanel typePane) { + protected FormatPane createFormatPane() { + return new FormatPane() { + protected Component[][] getComponent(JPanel fontPane, JPanel centerPane, JPanel typePane) { typePane.setBorder(BorderFactory.createEmptyBorder()); return new Component[][]{ - new Component[]{typePane,null}, + new Component[]{typePane, null}, new Component[]{centerPane, null}, }; } @@ -462,6 +480,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { protected void checkAllUse() { checkCardPane(); checkLabelPane(); + checkTitlePane(); //区域显示策略 恢复用注释。删除下面一行。 checkMaxProPortionUse(); @@ -480,10 +499,10 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } protected void checkCardPane() { - if(centerPane != null && valueFormatStyle != null){ + if (centerPane != null && valueFormatStyle != null) { CardLayout cardLayout = (CardLayout) centerPane.getLayout(); if (valueFormatStyle.getSelectedIndex() == 1) { - cardLayout.show(centerPane,com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom")); + cardLayout.show(centerPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom")); } else { cardLayout.show(centerPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Common")); } @@ -491,12 +510,12 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } protected void checkLabelPane() { - if(showLabel != null){ + if (showLabel != null) { boolean enabled = showLabel.getSelectedIndex() == 0; - if(labelPanel != null){ + if (labelPanel != null) { labelPanel.setVisible(enabled); } - if(enabled){ + if (enabled) { //轴标签缩略间隔显示 恢复用注释。下面1行删除。 checkLabelGapValuePane(); //轴标签缩略间隔显示 恢复用注释。取消注释。 @@ -505,6 +524,12 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } } + protected void checkTitlePane() { + if (showTitle != null && titlePane != null) { + titlePane.setVisible(showTitle.getSelectedIndex() == 0); + } + } + private void checkLabelGapAndStylePane() { if (overlapHandleTypeGroup != null && labelGapStylePane != null) { boolean visible = overlapHandleTypeGroup.getSelectedItem() == OverlapHandleType.INTERVAL; @@ -528,28 +553,31 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { /** * 是否是指定类型 + * * @param ob 对象 * @return 是否是指定类型 */ - public boolean accept(Object ob){ + public boolean accept(Object ob) { return false; } /** * title应该是一个属性,不只是对话框的标题时用到,与其他组件结合时,也会用得到 + * * @return 绥化狂标题 */ @Override - public String title4PopupWindow(){ + public String title4PopupWindow() { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Category_Axis"); } /** * 重置 */ - public void reset(){ + public void reset() { } + @Override public void populateBean(VanChartAxis axis) { populateTitle(axis); @@ -568,50 +596,53 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } //标题 - private void populateTitle(VanChartAxis axis){ + private void populateTitle(VanChartAxis axis) { + if (showTitle != null) { + showTitle.setSelectedIndex(axis.isShowAxisTitle() ? 0 : 1); + } Title axisTitle = axis.getTitle(); - if(axisTitle != null){ + if (axisTitle != null) { if (axisTitle.getTextObject() instanceof BaseFormula && titleContent != null) { titleContent.populateBean(((BaseFormula) axisTitle.getTextObject()).getContent()); - } else if(titleContent != null){ + } else if (titleContent != null) { titleContent.populateBean(Utils.objectToString(axisTitle.getTextObject())); } - if(titleAlignPane != null){ + if (titleAlignPane != null) { titleAlignPane.setSelectedItem(axisTitle.getPosition()); } - if(titleTextAttrPane != null){ + if (titleTextAttrPane != null) { titleTextAttrPane.populate(axisTitle.getTextAttr()); } - if(titleUseHtml != null){ + if (titleUseHtml != null) { titleUseHtml.setSelected(axis.isTitleUseHtml()); } - if(titleTextRotation != null){ - titleTextRotation.populateBean((double)axisTitle.getTextAttr().getRotation()); + if (titleTextRotation != null) { + titleTextRotation.populateBean((double) axisTitle.getTextAttr().getRotation()); } } } //标签 - private void populateLabel(VanChartAxis axis){ - if(showLabel != null){ + private void populateLabel(VanChartAxis axis) { + if (showLabel != null) { showLabel.setSelectedIndex(axis.isShowAxisLabel() ? 0 : 1); } TextAttr labelTextAttr = axis.getTextAttr(); - if(labelTextAttrPane != null){ + if (labelTextAttrPane != null) { labelTextAttrPane.populate(labelTextAttr); } - if(labelTextRotation != null){ - labelTextRotation.populateBean((double)labelTextAttr.getRotation()); + if (labelTextRotation != null) { + labelTextRotation.populateBean((double) labelTextAttr.getRotation()); } //轴标签缩略间隔显示 恢复用注释。取消注释。 // if (overlapHandleTypeGroup != null) { // overlapHandleTypeGroup.setSelectedItem(axis.getOverlapHandleType()); // } - if(labelGapStyle != null){ + if (labelGapStyle != null) { labelGapStyle.setSelectedIndex(axis.isAutoLabelGap() ? 0 : 1); } - if(labelGapValue != null){ + if (labelGapValue != null) { //轴标签缩略间隔显示 恢复用注释。下面1行删除。 labelGapValue.setText(axis.getLabelNumber().getContent()); //轴标签缩略间隔显示 恢复用注释。取消注释。 @@ -620,30 +651,30 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } //轴线样式 - private void populateLineStyle(VanChartAxis axis){ - if(axisLineStyle != null){ + private void populateLineStyle(VanChartAxis axis) { + if (axisLineStyle != null) { axisLineStyle.setSelectedLineStyle(axis.getAxisStyle()); } - if(axisLineColor != null){ + if (axisLineColor != null) { axisLineColor.setSelectObject(axis.getAxisColor()); } - if(mainTick != null){ + if (mainTick != null) { mainTick.setSelectedItem(axis.getMainTickLine()); } - if(secondTick != null){ + if (secondTick != null) { secondTick.setSelectedItem(axis.getSecTickLine()); } } //位置 - private void populatePosition(VanChartAxis axis){ - if(position != null){ + private void populatePosition(VanChartAxis axis) { + if (position != null) { position.setSelectedItem(axis.getPosition()); - if(position.getSelectedItem() == null){ + if (position.getSelectedItem() == null) { position.setSelectedIndex(1); } } - if(reversed != null){ + if (reversed != null) { reversed.setSelectedIndex(axis.hasAxisReversed() == true ? 0 : 1); } } @@ -666,13 +697,13 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { //格式 protected void populateFormat(VanChartAxis axis) { - if(valueFormatStyle != null){ + if (valueFormatStyle != null) { valueFormatStyle.setSelectedIndex(axis.isCommonValueFormat() ? 0 : 1); } - if(valueFormat != null){ + if (valueFormat != null) { valueFormat.populateBean(axis.getFormat()); } - if(htmlLabelPane != null){ + if (htmlLabelPane != null) { htmlLabelPane.populate(axis.getHtmlLabel()); } } @@ -690,15 +721,19 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { updateFormat(axis); } + //标题 - private void updateTitle(VanChartAxis axis){ + private void updateTitle(VanChartAxis axis) { + if (showTitle != null) { + axis.setShowAxisTitle(showTitle.getSelectedIndex() == 0); + } Title axisTitle = axis.getTitle(); - if(axisTitle == null){ + if (axisTitle == null) { axisTitle = new Title(); axis.setTitle(axisTitle); } - if(titleContent != null){ + if (titleContent != null) { String titleString = titleContent.updateBean(); Object titleObj; if (StableUtils.maybeFormula(titleString)) { @@ -708,42 +743,42 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } axisTitle.setTextObject(titleObj); } - if(titleAlignPane != null){ + if (titleAlignPane != null) { axisTitle.setPosition(titleAlignPane.getSelectedItem()); } TextAttr textAttr = axisTitle.getTextAttr(); - if(titleTextAttrPane != null){ + if (titleTextAttrPane != null) { titleTextAttrPane.update(textAttr); } - if(titleUseHtml != null){ + if (titleUseHtml != null) { axis.setTitleUseHtml(titleUseHtml.isSelected()); } - if(titleTextRotation != null){ + if (titleTextRotation != null) { textAttr.setRotation(titleTextRotation.updateBean().intValue()); } } //标签 - private void updateLabel(VanChartAxis axis){ - if(showLabel != null){ + private void updateLabel(VanChartAxis axis) { + if (showLabel != null) { axis.setShowAxisLabel(showLabel.getSelectedIndex() == 0); } TextAttr labelTextAttr = axis.getTextAttr(); - if(labelTextAttrPane != null){ + if (labelTextAttrPane != null) { labelTextAttrPane.update(labelTextAttr); } - if(labelTextRotation != null){ + if (labelTextRotation != null) { labelTextAttr.setRotation(labelTextRotation.updateBean().intValue()); } //轴标签缩略间隔显示 恢复用注释。取消注释。 // if (overlapHandleTypeGroup != null) { // axis.setOverlapHandleType(overlapHandleTypeGroup.getSelectedItem()); // } - if(labelGapStyle != null){ + if (labelGapStyle != null) { axis.setAutoLabelGap(labelGapStyle.getSelectedIndex() == 0); } - if(labelGapValue != null){ + if (labelGapValue != null) { //轴标签缩略间隔显示 恢复用注释。下面5行删除。 if (axis.isAutoLabelGap()) { axis.setLabelIntervalNumber(BaseFormula.createFormulaBuilder().build("1")); @@ -756,33 +791,33 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } //轴线样式 - private void updateLineStyle(VanChartAxis axis){ - if(axisLineStyle != null){ + private void updateLineStyle(VanChartAxis axis) { + if (axisLineStyle != null) { axis.setAxisStyle(axisLineStyle.getSelectedLineStyle()); } - if(axisLineColor != null){ + if (axisLineColor != null) { axis.setAxisColor(axisLineColor.getSelectObject()); } - if(mainTick != null){ + if (mainTick != null) { axis.setMainTickLine(mainTick.getSelectedItem()); } - if(secondTick != null){ + if (secondTick != null) { axis.setSecTickLine(secondTick.getSelectedItem()); } } //位置 - private void updatePosition(VanChartAxis axis){ - if(position != null){ + private void updatePosition(VanChartAxis axis) { + if (position != null) { axis.setPosition(position.getSelectedItem()); } - if(reversed != null){ + if (reversed != null) { axis.setAxisReversed(reversed.getSelectedItem()); } } //显示策略 - private void updateDisplayStrategy(VanChartAxis axis){ + private void updateDisplayStrategy(VanChartAxis axis) { //区域显示策略 恢复用注释。下面6行删除。 if (axisLimitSize != null) { axis.setLimitSize(axisLimitSize.getSelectedIndex() == 0); @@ -797,29 +832,30 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } protected void updateFormat(VanChartAxis axis) { - if(valueFormatStyle != null){ + if (valueFormatStyle != null) { axis.setCommonValueFormat(valueFormatStyle.getSelectedIndex() == 0); } - if(valueFormat != null){ + if (valueFormat != null) { axis.setFormat(valueFormat.update()); } - if(htmlLabelPane != null){ + if (htmlLabelPane != null) { htmlLabelPane.update(axis.getHtmlLabel()); } } /** * X坐标轴不同类型切换,new一个新的 + * * @param axisName 坐标轴名称 * @return 新的axis */ - public VanChartAxis updateBean(String axisName, int position){ + public VanChartAxis updateBean(String axisName, int position) { VanChartAxis axis = new VanChartAxis(axisName, position); this.updateBean(axis); return axis; } - public VanChartAxis updateBean(){ + public VanChartAxis updateBean() { return null; } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartTimeAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartTimeAxisPane.java index 2d408c9050..b57f0fc2f3 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartTimeAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartTimeAxisPane.java @@ -27,15 +27,15 @@ import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.BorderFactory; import javax.swing.JPanel; +import java.text.ParseException; +import java.util.Date; +import java.util.regex.Pattern; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.text.ParseException; -import java.util.Date; -import java.util.regex.Pattern; /** * 时间坐标轴 @@ -68,7 +68,7 @@ public class VanChartTimeAxisPane extends VanChartBaseAxisPane { double[] column = {f, s}; double[] rowSize = {p,p,p,p,p,p,p,p,p,p,p,p,p,p}; Component[][] components = new Component[][]{ - new Component[]{createTitlePane(new double[]{p, p, p, p, p,p}, columnSize, isXAxis),null}, + new Component[]{createTitlePane(new double[]{p, p, p, p, p,p}, column, isXAxis),null}, new Component[]{createLabelPane(new double[]{p, p}, column),null}, new Component[]{createValueDefinition(),null}, new Component[]{createLineStylePane(new double[]{p, p,p,p,p}, columnSize),null}, diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java index 2b90633e67..934185b38e 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java @@ -49,7 +49,7 @@ public class VanChartValueAxisPane extends VanChartBaseAxisPane { double[] column = {f, s}; double[] rowSize = {p,p,p,p,p,p,p,p,p,p,p,p,p,p}; Component[][] components = new Component[][]{ - new Component[]{createTitlePane(new double[]{p, p, p, p, p, p}, columnSize, isXAxis), null}, + new Component[]{createTitlePane(new double[]{p, p, p, p, p, p}, column, isXAxis), null}, new Component[]{createLabelPane(new double[]{p, p}, column), null}, new Component[]{createMinMaxValuePane(new double[]{p, p}, columnSize), null}, new Component[]{createLineStylePane(new double[]{p, p, p, p, p}, columnSize), null}, diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAlertValuePane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAlertValuePane.java index 85aff83629..b239583418 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAlertValuePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAlertValuePane.java @@ -50,10 +50,10 @@ public class VanChartAlertValuePane extends BasicBeanPane { private static final double LINE_WIDTH_DEFAULT_VALUE = 1; private UIButtonGroup alertAxis; - protected TinyFormulaPane alertValue; - protected LineTypeComboBox alertLineStyle;//线型 + private TinyFormulaPane alertValue; + private LineTypeComboBox alertLineStyle;//线型 private UISpinner lineWidthSpinner;//线宽 - protected ColorSelectBox alertLineColor; + private ColorSelectBox alertLineColor; private UIButtonGroup alertTextPosition; private TinyFormulaPane alertText; @@ -67,6 +67,22 @@ public class VanChartAlertValuePane extends BasicBeanPane { initComponents(); } + public TinyFormulaPane getAlertValue() { + return alertValue; + } + + public LineTypeComboBox getAlertLineStyle() { + return alertLineStyle; + } + + public UISpinner getLineWidthSpinner() { + return lineWidthSpinner; + } + + public ColorSelectBox getAlertLineColor() { + return alertLineColor; + } + private void initComponents() { alertValue = new TinyFormulaPane(); diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/radar/VanChartRadarAlertValuePane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/radar/VanChartRadarAlertValuePane.java index 4459d96816..80e836834d 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/radar/VanChartRadarAlertValuePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/radar/VanChartRadarAlertValuePane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.designer.style.background.radar; import com.fr.design.gui.ilable.UILabel; - +import com.fr.design.i18n.Toolkit; import com.fr.van.chart.designer.style.background.VanChartAlertValuePane; import java.awt.Component; @@ -14,9 +14,10 @@ public class VanChartRadarAlertValuePane extends VanChartAlertValuePane { protected Component[][] getTopPaneComponents() { return new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Value")),alertValue}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Line_Style")),alertLineStyle}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Color")),alertLineColor}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Use_Value")), getAlertValue()}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Line_Style")), getAlertLineStyle()}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Line_Width")), getLineWidthSpinner()}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Color")), getAlertLineColor()}, }; } 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 4c914b0cd2..e8f9def4b3 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 @@ -5,7 +5,6 @@ import com.fr.base.chart.chartdata.model.LargeDataModel; import com.fr.base.chart.chartdata.model.NormalDataModel; import com.fr.chart.base.AttrAlpha; import com.fr.chart.base.AttrBorder; -import com.fr.chart.base.ChartConstants; import com.fr.chart.base.GradientStyle; import com.fr.chart.chartattr.Plot; import com.fr.chart.chartglyph.ConditionAttr; @@ -90,7 +89,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP } JPanel panel = new JPanel(new BorderLayout()); JPanel colorPane = getColorPane(); - if(colorPane != null) { + if (colorPane != null) { panel.add(colorPane, BorderLayout.NORTH); } panel.add(getContentInPlotType(), BorderLayout.CENTER); @@ -279,7 +278,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP checkoutMapType(plot); - if(vanChartFillStylePane != null) { //配色 + if (vanChartFillStylePane != null) { //配色 vanChartFillStylePane.populateBean(plot.getPlotFillStyle()); } @@ -310,7 +309,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP populateCondition(plot.getConditionCollection().getDefaultAttr()); - checkAreaSeriesFillColorPane(plot.getPlotStyle()); + checkAreaSeriesFillColorPane(((VanChartPlot) plot).getGradientStyle()); checkCompsEnabledWithLarge(plot); } @@ -340,7 +339,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP //更新之前先更新界面的map类型属性 checkoutMapType(plot); - if(vanChartFillStylePane != null) {//配色 + if (vanChartFillStylePane != null) {//配色 plot.setPlotFillStyle(vanChartFillStylePane.updateBean()); } @@ -369,16 +368,16 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP updateCondition(plot.getConditionCollection().getDefaultAttr()); - checkAreaSeriesFillColorPane(plot.getPlotStyle()); + checkAreaSeriesFillColorPane(((VanChartPlot) plot).getGradientStyle()); } protected void checkoutMapType(Plot plot) { } - protected void checkAreaSeriesFillColorPane(int plotStyle) { + protected void checkAreaSeriesFillColorPane(GradientStyle gradientStyle) { if (areaSeriesFillColorPane != null) { - areaSeriesFillColorPane.checkoutAlpha(plotStyle == ChartConstants.STYLE_NONE); + areaSeriesFillColorPane.checkoutAlpha(gradientStyle.getGradientType() == GradientType.NONE); } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanPointMapPlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanPointMapPlotTableDataContentPane.java index 2e25e1bc20..39110caf12 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanPointMapPlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanPointMapPlotTableDataContentPane.java @@ -4,9 +4,11 @@ import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.BoldFontTextLabel; 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.mainframe.chart.gui.ChartDataPane; +import com.fr.design.widget.FRWidgetFactory; import com.fr.plugin.chart.map.data.VanMapTableDefinitionProvider; import com.fr.van.chart.map.designer.data.component.table.AbstractLongLatAreaPane; import com.fr.van.chart.map.designer.data.component.table.AreaPane; @@ -91,6 +93,7 @@ public class VanPointMapPlotTableDataContentPane extends VanAreaMapPlotTableData double p = TableLayout.PREFERRED; double f = TableLayout.FILL; + double labelWidth = 65; this.setLayout(new BorderLayout(0, 5)); centerPane = new JPanel(new CardLayout()) { @@ -122,13 +125,14 @@ public class VanPointMapPlotTableDataContentPane extends VanAreaMapPlotTableData locationType.setSelectedIndex(0); - double[] columnSize = {p, f}; + double[] columnSize = {labelWidth, f}; double[] rowSize = {p}; + UILabel label = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Chart_Geographic")); Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Geographic")), locationType}, + new Component[]{label, locationType}, }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 30, 6); + JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 5, 6); this.add(panel, BorderLayout.NORTH); this.add(centerPane, BorderLayout.CENTER); @@ -219,7 +223,7 @@ public class VanPointMapPlotTableDataContentPane extends VanAreaMapPlotTableData return new PointMapAreaPane(longLatAreaTableComboPane) { protected void initAreaPane(VanPointMapPlotTableDataContentPane.LongLatAreaTableComboPane parentPane) { areaPane = new AreaPane(parentPane) { - protected Component[][] getComponent () { + protected Component[][] getComponent() { return new Component[][]{ new Component[]{new BoldFontTextLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Area_Name")), VanPointMapPlotTableDataContentPane.this.createAreaPanel(areaNameCom)} }; diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java index 580b1e91af..bfea7e1dc7 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java @@ -14,16 +14,16 @@ import com.fr.design.layout.TableLayout; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; +import com.fr.design.mainframe.chart.gui.data.table.DataPaneHelper; import com.fr.general.ComparatorUtils; - import com.fr.plugin.chart.multilayer.data.MultiPieValueDefinition; +import com.fr.design.i18n.Toolkit; import com.fr.stable.ArrayUtils; import com.fr.stable.AssistUtils; import com.fr.stable.StringUtils; import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.BorderFactory; -import javax.swing.ComboBoxModel; import javax.swing.JPanel; import javax.swing.JSeparator; import java.awt.BorderLayout; @@ -72,7 +72,7 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa for (int i = 0; i < levelNum; i++){ levelNameList.add(new UIComboBox()); levelNameList.get(i).setPreferredSize(new Dimension(WD, HT)); - levelNameList.get(i).addItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_None")); + levelNameList.get(i).addItem(Toolkit.i18nText("Fine-Design_Chart_Use_None")); } } @@ -103,7 +103,7 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa Component[][] components_center = new Component[levelNum + 3][]; for (int i = 0; i < levelNum; i++){ - components_center[i] = new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Level") + String.valueOf(i+1)), levelNameList.get(i)}; + components_center[i] = new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Level") + String.valueOf(i+1)), levelNameList.get(i)}; } value = new UIComboBox(); @@ -113,8 +113,8 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa calculateCombox.setPreferredSize(new Dimension(WD, HT)); components_center[levelNum] = new Component[]{getJSeparator(), null}; - components_center[levelNum+1] = new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Value")), value}; - components_center[levelNum+2] = new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Summary_Method")), calculateCombox}; + components_center[levelNum+1] = new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Use_Value")), value}; + components_center[levelNum+2] = new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Summary_Method")), calculateCombox}; initCenterItemListener(); @@ -181,9 +181,9 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa nameField = new UITextField(); Component[][] components_north = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name")), nameField}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name")), nameField}, new Component[]{getJSeparator(),null }, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Level_Number")), levelNumEdit}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Level_Number")), levelNumEdit}, }; JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components_north, rowSize_north, columnSize_north); @@ -243,7 +243,7 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa columnNameList = list; for (int i = 0; i < levelNum; i++) { refreshBoxItems(levelNameList.get(i), list); - levelNameList.get(i).addItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_None")); + levelNameList.get(i).addItem(Toolkit.i18nText("Fine-Design_Chart_Use_None")); } refreshBoxItems(value, list); } @@ -282,7 +282,7 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa //值 value.setEditable(true); - value.setSelectedItem(this.boxItemsContainsObject(value,data.getValueColumnName()) + value.setSelectedItem(DataPaneHelper.boxItemsContainsObject(value,data.getValueColumnName()) ? data.getValueColumnName() : null); value.setEditable(false); //汇总方式 @@ -327,8 +327,8 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa for (int i = 0; i < levelNameList.size(); i++){ if(!definition.hasLevelIndex(i) || ComparatorUtils.equals(levelColumnNameList.get(i), StringUtils.EMPTY)) { - levelNameList.get(i).setSelectedItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_None")); - } else if(definition.hasLevelIndex(i) && !this.boxItemsContainsObject(levelNameList.get(i),levelColumnNameList.get(i))){ + levelNameList.get(i).setSelectedItem(Toolkit.i18nText("Fine-Design_Chart_Use_None")); + } else if(definition.hasLevelIndex(i) && !DataPaneHelper.boxItemsContainsObject(levelNameList.get(i),levelColumnNameList.get(i))){ levelNameList.get(i).setSelectedItem(null); }else { combineCustomEditValue(levelNameList.get(i), definition.hasLevelIndex(i) ? levelColumnNameList.get(i) : null); @@ -353,20 +353,6 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa } } - private boolean boxItemsContainsObject(UIComboBox box,Object item){ - if(box == null){ - return false; - } - - ComboBoxModel dataModel = box.getModel(); - for (int i = 0; i < dataModel.getSize(); i++) { - if(ComparatorUtils.equals(dataModel.getElementAt(i),item)){ - return true; - } - } - return false; - } - protected JSeparator getJSeparator() { JSeparator jSeparator = new JSeparator(); jSeparator.setPreferredSize(new Dimension(220, 2)); diff --git a/designer-chart/src/main/resources/com/fr/design/images/form/toolbar/box.png b/designer-chart/src/main/resources/com/fr/design/images/form/toolbar/box.png new file mode 100755 index 0000000000..ba9101b2d8 Binary files /dev/null and b/designer-chart/src/main/resources/com/fr/design/images/form/toolbar/box.png differ diff --git a/designer-chart/src/main/resources/com/fr/van/chart/box.images/box.png b/designer-chart/src/main/resources/com/fr/van/chart/box.images/box.png new file mode 100755 index 0000000000..c0ad22d3cf Binary files /dev/null and b/designer-chart/src/main/resources/com/fr/van/chart/box.images/box.png differ diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java index 4bc0f22e49..0c6adeb090 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java @@ -310,14 +310,15 @@ public class FRAbsoluteLayoutAdapter extends FRBodyLayoutAdapter { public void fix(XCreator creator ,int x, int y) { int height = creator.getHeight(); int width = creator.getWidth(); + //坐标小于0时让它还在容器内 if (x < 0) { - x = container.getX(); + x = 0; } else if (x + creator.getWidth() > container.getWidth()) { x = container.getWidth() - width; } if (y < 0) { - y = container.getY(); + y = 0; } else if (y + creator.getHeight() > container.getHeight()) { y = container.getHeight() - height; } diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java b/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java index 9f5f36f660..a930deb231 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java @@ -262,7 +262,7 @@ public class SelectionModel { Rectangle rec = selection.getSelctionBounds(); FormSelectionUtils.paste2Container(designer, container, clipboard, rec.x + DELTA_X_Y, rec.y + DELTA_X_Y); } else if (isExtraContainer(container)) { - provider.paste2Container(selection); + provider.paste2Container(clipboard); } } @@ -306,12 +306,12 @@ public class SelectionModel { // 清除被选中的组件 selection.reset(); } + designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_DELETED); + setSelectedCreator(isInPara ? designer.getParaComponent() : designer.getRootComponent()); - setSelectedCreator(isInPara ? designer.getParaComponent() : designer.getRootComponent()); // 触发事件 - designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_DELETED); designer.repaint(); } } 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 f4554069e3..dcb6938836 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 @@ -298,7 +298,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo @Override public JComponent createToolPane(BaseJForm jform, FormDesigner formEditor) { if (!DesignerMode.isAuthorityEditing()) { - if (isDedicateContainer()) { + if (isDedicateContainer() && this.getComponentCount() > 0) { // 图表块和报表块由于控件树处不显示,但对应的属性表要显示,此处处理下 XCreator child = ((XLayoutContainer) this).getXCreator(0); return child.createToolPane(jform, formEditor); @@ -408,7 +408,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo public Component getParentShow(){ return this.getParent(); } - + /** * 重置组件的名称 * @@ -418,18 +418,18 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo public void resetCreatorName(String name) { toData().setWidgetName(name); } - + /** * 遍历所有命名相关的组件到集合中 * * @param xCreators 集合 */ public void traversalNameRelatedXCreators(Set xCreators) { - + xCreators.add(this); int componentCount = getComponentCount(); for (int i = 0; i < componentCount; i++) { - + Component component = getComponent(i); if (component instanceof XCreator) { XCreator xCreator = (XCreator) component; @@ -439,7 +439,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo } } } - + /** * 重置组件的可见性 * @@ -448,7 +448,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo public void resetVisible(boolean visible) { toData().setVisible(visible); } - + /** * 返回编辑的子组件,scale为其内部组件 * @return 组件 @@ -804,4 +804,4 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo return false; } -} \ No newline at end of file +} diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java b/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java index 36d2d44a57..42069e4d8a 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java @@ -11,6 +11,7 @@ import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; import com.fr.design.designer.creator.cardlayout.XWCardTagLayout; import com.fr.design.designer.creator.cardlayout.XWCardTitleLayout; import com.fr.design.designer.creator.cardlayout.XWTabFitLayout; +import com.fr.design.fun.ChartWidgetOptionProvider; import com.fr.design.fun.FormWidgetOptionProvider; import com.fr.design.fun.ParameterWidgetOptionProvider; import com.fr.design.module.DesignModuleFactory; @@ -102,7 +103,8 @@ public class XCreatorUtils { public boolean accept(PluginContext context) { return context.contain(PluginModule.ExtraDesign, ParameterWidgetOptionProvider.XML_TAG) - || context.contain(PluginModule.ExtraDesign, FormWidgetOptionProvider.XML_TAG); + || context.contain(PluginModule.ExtraDesign, FormWidgetOptionProvider.XML_TAG) + || context.contain(PluginModule.ExtraDesign, ChartWidgetOptionProvider.XML_TAG); } }); } diff --git a/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java b/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java index c72aa45128..a91342d4af 100644 --- a/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java +++ b/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java @@ -83,6 +83,7 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP private static final int SUBMIT_BUTTON_H_LOCATION = 270; private static final int PARA_IMAGE_SHIFT_X = -4; private static final int FORM_AREA_PADDING_LEFT = 13; + private int addableRegionY; private static Image paraImage = BaseUtils.readImage("/com/fr/design/images/form/parameter.png"); @@ -412,10 +413,30 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP if (layoutContainer == null) { layoutContainer = new XWParameterLayout(); } + refreshAddableRegion(layoutContainer); layoutContainer.setSize(LARGE_PREFERRED_SIZE); setRootComponent(layoutContainer); } + /** + * @param layoutContainer + * @Description: 为了不覆盖以前的组件,所以要计算可以添加组件的区域 + * @return: + * @Author: Henry.Wang + * @date: 2020/7/15 15:12 + */ + public void refreshAddableRegion(XLayoutContainer layoutContainer) { + addableRegionY = 0; + for (int i = 0; i < layoutContainer.getComponentCount(); i++) { + Rectangle rectangle = layoutContainer.getComponent(i).getBounds(); + if (addableRegionY < rectangle.y + rectangle.height) { + addableRegionY = rectangle.y + rectangle.height; + } + } + int vGap = V_COMPONENT_GAP - (int) XCreator.SMALL_PREFERRED_SIZE.getHeight(); + addableRegionY = Math.max(0, addableRegionY - FIRST_V_LOCATION + (int) (XCreator.SMALL_PREFERRED_SIZE.getHeight() / 2) + vGap); + } + /** * 是否是报表的参数面板 * @@ -583,14 +604,15 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP label.setWidgetName("Label" + name); label.setWidgetValue(new WidgetValue(name + ":")); XCreator xCreator = XCreatorUtils.createXCreator(label); - if (!(this.autoAddComponent(xCreator, H_COMPONENT_GAP * (currentIndex % NUM_IN_A_LINE) - + FIRST_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE)))) { + int x = H_COMPONENT_GAP * (currentIndex % NUM_IN_A_LINE) + FIRST_H_LOCATION; + int y = addableRegionY + FIRST_V_LOCATION + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE); + if (!(this.autoAddComponent(xCreator, x, y))) { return false; } EditorHolder editor = new EditorHolder(parameter); xCreator = XCreatorUtils.createXCreator(editor); - if (!(this.autoAddComponent(xCreator, H_COMPONENT_GAP * (currentIndex % NUM_IN_A_LINE) - + SECOND_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE)))) { + x = H_COMPONENT_GAP * (currentIndex % NUM_IN_A_LINE) + SECOND_H_LOCATION; + if (!(this.autoAddComponent(xCreator, x, y))) { return false; } return true; @@ -646,16 +668,17 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP label.setWidgetValue(new WidgetValue(parameterArray[i].getName() + ":")); XCreator xCreator = XCreatorUtils.createXCreator(label); - if (!(this.autoAddComponent(xCreator, H_COMPONENT_GAP * (currentIndex % NUM_IN_A_LINE) - + FIRST_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE)))) { + int x = H_COMPONENT_GAP * (currentIndex % NUM_IN_A_LINE) + FIRST_H_LOCATION; + int y = addableRegionY + FIRST_V_LOCATION + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE); + if (!(this.autoAddComponent(xCreator, x, y))) { break; } // 每行显示5组 EditorHolder editor = new EditorHolder(parameterArray[i]); editor.setWidgetName(parameterArray[i].getName()); xCreator = XCreatorUtils.createXCreator(editor); - if (!(this.autoAddComponent(xCreator, H_COMPONENT_GAP * (currentIndex % NUM_IN_A_LINE) - + SECOND_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE)))) { + x = H_COMPONENT_GAP * (currentIndex % NUM_IN_A_LINE) + SECOND_H_LOCATION; + if (!(this.autoAddComponent(xCreator, x, y))) { break; } currentIndex++; 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 06cb19d0ae..e13748719b 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 @@ -105,7 +105,7 @@ public class FormCreatorDropTarget extends DropTarget { SharableEditorProvider sharableEditor = ShareLoader.getLoader().getSharedElCaseEditorById(shareId); SharableWidgetProvider bindInfo = ShareLoader.getLoader().getElCaseBindInfoById(shareId); if (sharableEditor != null && bindInfo != null) { - Map tdNameMap = TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()).addTableData(bindInfo.getName(), sharableEditor.getTableDataSource()); + Map tdNameMap = TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()).addTableData(bindInfo.getName(), sharableEditor.getTableDataSource(), true); //合并数据集之后,可能会有数据集名称变化,做一下联动 //共享的组件拿的时候都是克隆的,这边改拖拽中克隆的对象而非新克隆对象,上面这个新克隆的对象只是为了拿数据集 for (Map.Entry entry : tdNameMap.entrySet()) { diff --git a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java index 2fbccb1cd3..7cdd7fd600 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java @@ -371,6 +371,7 @@ public class JForm extends JTemplate implements BaseJForm { + public static final Dimension WINDOW_CUSTOM_SIZE = new Dimension(720, 600); + public ReportWriteAttrAction(WorkSheetDesigner t) { super(t); this.setMenuKeySet(KeySetUtils.REPORT_WRITE); @@ -49,7 +55,7 @@ public class ReportWriteAttrAction extends ReportComponentAction itemPaneProviders = ExtraDesignClassManager.getInstance().getArray(PropertyItemPaneProvider.XML_TAG); + if (itemPaneProviders != null) { + for (PropertyItemPaneProvider itemPaneProvider : itemPaneProviders) { + if(itemPaneProvider instanceof CellPropertyPaneProvider){ + CellPropertyPaneProvider cellPropertyPaneProvider = (CellPropertyPaneProvider) itemPaneProvider; + CellElementPropertyComponent cellElementPropertyPane = cellPropertyPaneProvider.getSingletonCelPropertyPane(); + if (cellElementPropertyPane != null && cellElementPropertyPane.accept(ePane)) { + cellElementPropertyPane.populate(ePane); + } + } + } + } + } + } + } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePaneDelegate.java b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePaneDelegate.java index 22ab323443..83a1c08501 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePaneDelegate.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePaneDelegate.java @@ -28,7 +28,6 @@ import com.fr.design.present.ConditionAttributesGroupPane; import com.fr.design.roleAuthority.RolesAlreadyEditedPane; import com.fr.design.selection.SelectionEvent; import com.fr.design.selection.SelectionListener; - import com.fr.grid.selection.FloatSelection; import com.fr.grid.selection.Selection; import com.fr.page.ReportSettingsProvider; @@ -82,6 +81,7 @@ public class ElementCasePaneDelegate extends ElementCasePane { } CellWidgetPropertyPane.getInstance().populate(ElementCasePaneDelegate.this); CellElementPropertyPane.getInstance().populate(ElementCasePaneDelegate.this); + QuickEditorRegion.getInstance().populate(getCurrentEditor()); JTemplate editingTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); // 模板初始化完成后,才能初始化超级链接面板 diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java index 74443e831c..52f1fe1f0c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java @@ -945,7 +945,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse // marks:判断是否重名 boolean isExisted = false; for (int i = 0; i < reportComposite.getEditingWorkBook().getReportCount(); i++) { - if (newName.equalsIgnoreCase(reportComposite.getEditingWorkBook().getReportName(i))) { + if (newName.equalsIgnoreCase(reportComposite.getEditingWorkBook().getReportName(i)) && i != selectedIndex) { isExisted = true; break; } diff --git a/designer-realize/src/main/java/com/fr/design/report/UnitFieldPane.java b/designer-realize/src/main/java/com/fr/design/report/UnitFieldPane.java index 6da8957b26..6af6852d47 100644 --- a/designer-realize/src/main/java/com/fr/design/report/UnitFieldPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/UnitFieldPane.java @@ -8,6 +8,7 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UIBasicSpinner; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.stable.Constants; +import com.fr.stable.GraphDrawHelper; import com.fr.stable.OperatingSystem; import com.fr.stable.unit.CM; import com.fr.stable.unit.INCH; @@ -52,9 +53,9 @@ public class UnitFieldPane extends JPanel { this.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unit_MM")); } - //ajust the heigt of unitLabel. - Dimension unitDimension = new Dimension(this.getPreferredSize().width, - preferredHeight); + //自适应label宽度 + int width = GraphDrawHelper.getWidth(this.getText(), this.getFont()); + Dimension unitDimension = new Dimension(width, preferredHeight); this.setMinimumSize(unitDimension); this.setMinimumSize(unitDimension); this.setSize(unitDimension); diff --git a/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java b/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java index 37d6a639f3..a430faeec1 100644 --- a/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java +++ b/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java @@ -238,6 +238,7 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { dlg.setModal(false); dlg.setVisible(true); + dlg.setAlwaysOnTop(true); } private void showDialogAfterAddCellAction() { diff --git a/designer-realize/src/main/java/com/fr/grid/GridMouseAdapter.java b/designer-realize/src/main/java/com/fr/grid/GridMouseAdapter.java index ae230a5319..86ed09161b 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridMouseAdapter.java +++ b/designer-realize/src/main/java/com/fr/grid/GridMouseAdapter.java @@ -10,7 +10,7 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.mainframe.JSliderPane; -import com.fr.design.present.CellWriteAttrPane; +import com.fr.design.os.impl.PopupDialogSaveAction; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.grid.selection.CellSelection; import com.fr.grid.selection.FloatSelection; @@ -26,6 +26,7 @@ import com.fr.report.elementcase.TemplateElementCase; import com.fr.stable.ArrayUtils; import com.fr.stable.ColumnRow; import com.fr.stable.StringUtils; +import com.fr.stable.os.support.OSSupportCenter; import com.fr.stable.unit.FU; import javax.swing.*; @@ -93,7 +94,9 @@ public class GridMouseAdapter implements MouseListener, MouseWheelListener, Mous if (!grid.hasFocus() && grid.isRequestFocusEnabled()) { grid.requestFocus(); } - + // linux下 点击单元格时 失焦之前立即触发保存 + PopupDialogSaveAction saveAction = OSSupportCenter.getAction(PopupDialogSaveAction.class); + saveAction.execute(); if (SwingUtilities.isRightMouseButton(evt)) { doWithRightButtonPressed(); } else { diff --git a/designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java index 088026ba70..019b4cdeea 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java @@ -1,5 +1,6 @@ package com.fr.quickeditor; +import com.fr.base.GraphHelper; import com.fr.design.actions.UpdateAction; import com.fr.design.actions.core.ActionFactory; import com.fr.design.file.HistoryTemplateListPane; @@ -49,7 +50,6 @@ public abstract class CellQuickEditor extends QuickEditor { protected static final Dimension LABEL_DIMENSION = new Dimension(60, 20); protected static final int VGAP = 10, HGAP = 8, VGAP_INNER = 3; - private static final int INSERT_CONTENT_LABEL_WIDTH = 60; /** * 滚动条相关配置 @@ -208,7 +208,7 @@ public abstract class CellQuickEditor extends QuickEditor { private JPanel initTopContent() { double p = TableLayout.PREFERRED; double f = TableLayout.FILL; - double[] columnSize = {INSERT_CONTENT_LABEL_WIDTH, f}; + double[] columnSize = {GraphHelper.getWidth(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Insert_Cell_Element")), f}; double[] rowSize = {p, p}; UILabel cellLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Cell")); UILabel insertContentLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Insert_Cell_Element")); diff --git a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java index ff8a74e57e..3abd0f3aa0 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java @@ -9,7 +9,6 @@ import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.formula.FormulaFactory; import com.fr.design.formula.UIFormula; import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; @@ -20,6 +19,7 @@ import com.fr.grid.selection.CellSelection; import com.fr.quickeditor.CellQuickEditor; import com.fr.report.ReportHelper; import com.fr.report.cell.DefaultTemplateCellElement; +import com.fr.report.cell.TemplateCellElement; import com.fr.stable.ColumnRow; import com.fr.stable.StringUtils; @@ -56,6 +56,9 @@ public class CellFormulaQuickEditor extends CellQuickEditor { //默认值 private static final String DEFAULT_FORMULA = "="; + //正在编辑的单元格 + private TemplateCellElement editingCellElement; + private DocumentListener documentListener = new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { @@ -102,19 +105,27 @@ public class CellFormulaQuickEditor extends CellQuickEditor { formulaButton.setPreferredSize(new Dimension(20, formulaTextField.getPreferredSize().height)); formulaButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { - String text = formulaTextField.getText(); final UIFormula formulaPane = FormulaFactory.createFormulaPaneWhenReserveFormula(); - formulaPane.populate(BaseFormula.createFormulaBuilder().build(text)); + CellSelection cellSelection = (CellSelection) tc.getSelection(); + editingCellElement = tc.getEditingElementCase().getTemplateCellElement(cellSelection.getColumn(), cellSelection.getRow()); + Object object = editingCellElement.getValue(); + if (object instanceof BaseFormula) { + formulaPane.populate((BaseFormula) object); + } else { + String text = formulaTextField.getText(); + formulaPane.populate(BaseFormula.createFormulaBuilder().build(text)); + } formulaPane.showLargeWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { @Override public void doOk() { BaseFormula fm = formulaPane.update(); if (fm.getContent().length() <= 1) { + fm.setContent(DEFAULT_FORMULA); formulaTextField.setText(DEFAULT_FORMULA); } else { formulaTextField.setText(fm.getContent()); } - + editingCellElement.setValue(fm); } }).setVisible(true); }